суббота, 10 марта 2012 г.

переменные среды в MacOSX

пересенные окружения можно задать из консольки. А можно и с помощью текстового редактора. делается это так:
вводим команду open ~/.bash_profile и нам открывается файл.
Если файл не открылся - нужно его создать: touch ~/.bash_profile

теперь можем смело прописывать все необходимые переменные, и добавлять что либо в переменную $PATH


Например, вот так:

export SDK_ROOT=/Developer/Android/android-sdk-macosx
export NDK_ROOT=/Developer/Android/android-ndk-r7b
export PATH=$PATH:$SDK_ROOT/tools
export PATH=$PATH:$NDK_ROOT

среда, 18 января 2012 г.

@SuppressWarnings

Частенько забываю значения @SuppressWarnings. вот, стащил отсюда: http://www.thebuzzmedia.com/supported-values-for-suppresswarnings/

  • all to suppress all warnings
  • boxing to suppress warnings relative to boxing/unboxing operations
  • cast to suppress warnings relative to cast operations
  • dep-ann to suppress warnings relative to deprecated annotation
  • deprecation to suppress warnings relative to deprecation
  • fallthrough to suppress warnings relative to missing breaks in switch statements
  • finally to suppress warnings relative to finally block that don’t return
  • hiding to suppress warnings relative to locals that hide variable
  • incomplete-switch to suppress warnings relative to missing entries in a switch statement (enum case)
  • nls to suppress warnings relative to non-nls string literals
  • null to suppress warnings relative to null analysis
  • rawtypes to suppress warnings relative to un-specific types when using generics on class params
  • restriction to suppress warnings relative to usage of discouraged or forbidden references
  • serial to suppress warnings relative to missing serialVersionUID field for a serializable class
  • static-access to suppress warnings relative to incorrect static access
  • synthetic-access to suppress warnings relative to unoptimized access from inner classes
  • unchecked to suppress warnings relative to unchecked operations
  • unqualified-field-access to suppress warnings relative to field access unqualified
  • unused to suppress warnings relative to unused code

вторник, 9 августа 2011 г.

Check windows user credentials

C++ realisation

#include "stdafx.h"
#include <Windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#define ERROR_CODE 1;

int main(int argc, char* argv[])
{
if(argc != 3){
return ERROR_CODE;
}

char acUserName[100];
DWORD nUserName = sizeof(acUserName);
GetUserName(acUserName, &nUserName);

if(strcmp(argv[1], acUserName)){
return ERROR_CODE;
}

LPCSTR lpszUsername = argv[1];
LPCSTR lpszPassword = argv[2];
LPCSTR lpszDomain = NULL;

HANDLE phToken;

if (!LogonUser(lpszUsername, lpszDomain, lpszPassword,
LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &phToken)) {
return ERROR_CODE;
}

return 0;
}

понедельник, 8 августа 2011 г.

How to validate user credentials in windows?

Validating with user name and password:

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Security.Principal;

namespace ConsoleApplication1
{
class Program
{
[DllImport("ADVAPI32.DLL")]
public static extern bool LogonUser(String lpszUsername,
String lpszDomain, String lpszPassword,
int dwLogonType, int dwLogonProvider, out int phToken);

const int LOGON32_LOGON_INTERACTIVE = 2;
const int LOGON32_LOGON_NETWORK = 3;
const int LOGON32_PROVIDER_DEFAULT = 0;
const int LOGON32_PROVIDER_WINNT50 = 3;
const int LOGON32_PROVIDER_WINNT40 = 2;
const int LOGON32_PROVIDER_WINNT35 = 1;

private static bool isValidUser(string userName, string domainName, string passsWord) {
bool Validateuser; int token1;
Validateuser = LogonUser(userName, domainName,
passsWord, LOGON32_LOGON_NETWORK, 0, out token1);

if (Validateuser) {
return true;
} else {
return false;
}
}

static void Main(string[] args) {
if (args.Length != 2) {
Environment.Exit(1);
return;
}

String fullName = WindowsIdentity.GetCurrent().Name;
String un = fullName.Split('\\')[1]; //getting user name
String dom = fullName.Split('\\')[0];//getting domain name
String userName = args[0];

if (!userName.Equals(un)) {
Environment.Exit(1);
return;
}

bool isValid = isValidUser(userName, dom, args[1]);
if (!isValid) {
Environment.Exit(1);
return;
}
}
}
}

суббота, 6 августа 2011 г.

How to check user credentials?

linux version:
/**============================================================================

File......: linux_user_validator.c
Author....: Vyacheslav Kovalyov
Created...: 8/6/11

Description: Linux user validator.
How to make: g++ linux_user_validator.c -lpam -lpam_misc
Dependence : libpam-dev

============================================================================*/

#include <security/pam_appl.h>
#include <security/pam_misc.h>
#include <stdio.h>
#include <dlfcn.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>

#define ERR_CODE 1;
#define COPY_STRING(s) (s) ? strdup(s) : NULL;

static char* user;
static char* pwd;
static int PAM_conv (int, const struct pam_message**,
struct pam_response**, void*);
static struct pam_conv PAM_converse = {
PAM_conv,
NULL
};

static int PAM_conv (int num_msg, const struct pam_message **msg,
struct pam_response **resp, void *appdata_ptr) {
int replies = 0;
struct pam_response *reply = NULL;

reply = (struct pam_response *) malloc(sizeof(struct pam_response) * num_msg);
if (!reply) return PAM_CONV_ERR;

for (replies = 0; replies < num_msg; replies++) {

//SecurId requires this syntax.
if (! strcmp(msg[replies]->msg,"Enter PASSCODE: ")) {
reply[replies].resp = COPY_STRING(pwd);
}

if (! strcmp(msg[replies]->msg,"Password: ")) {
reply[replies].resp = COPY_STRING(pwd);
}

//Mac OS X
if (! strcmp(msg[replies]->msg,"Password:")) {
reply[replies].resp = COPY_STRING(pwd);
}

// HP-UX
if (! strcmp(msg[replies]->msg,"System Password:")) {
reply[replies].resp = COPY_STRING(pwd);
}
}
*resp = reply;
return PAM_SUCCESS;
}

int main(int argc, char** argv)
{
if (argc < 3) {
return ERR_CODE;
}

user = argv[1];
pwd = argv[2];

static struct pam_conv pam_conversation = { misc_conv, NULL };
pam_handle_t* pamh;

int res = pam_start(argv[0], user, &PAM_converse, &pamh);

if (res == PAM_SUCCESS) {
res = pam_authenticate(pamh, 0);
}

if (res == PAM_SUCCESS) {
res = pam_acct_mgmt(pamh, 0);
}

pam_end(pamh, res);

return res == PAM_SUCCESS ? 0 : ERR_CODE;
}

суббота, 25 декабря 2010 г.

К слову, о спринге

С AJAX в том виде как оно есть я не работал, и думал, что все окажется куда страшнее. На самом деле все просто как никогда. Создал контроллер, замапил, и вуаля!


package org.springframework.samples.mvc.ajax.tree;

import org.springframework.samples.mvc.ajax.tree.tree.DataLoader;
import org.springframework.samples.mvc.ajax.tree.tree.IDataLoader;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import static org.springframework.samples.mvc.ajax.tree.utils.Constants.NESTING_LEVEL;

/**
* @author Vyacheslav Kovalyov
* @version 1.0
*/

@Controller
public class AjaxTreeController {

public AjaxTreeController() {
this.dao= new TreeXMLDao();
}

@RequestMapping(value = "getChildren", method = RequestMethod.GET)
public
@ResponseBody
Object getChildren(@RequestParam String parentNodeId) {

return dao.getSubTree(parentNodeId, NESTING_LEVEL).asJSON();
}

private final ITreeXMLDao dao;
}



И вытаскиваем значение со страницы


$.ajax({
url:controllerName,
data:{parentNodeId: nodeId},
dataType: 'json',
success: function(data) {
//actions
}
});

пятница, 24 декабря 2010 г.

Лес

В дебрях интернета была найдена библиотечка для рисования деревьев и графов (а также других приблуд) на JS - JIT (http://thejit.org). JavaScript я не знаю, попробовал, не понравилось. Совсем.
Мне понадобилось данное дерево использовать с большим количеством нодов. При этом, подгружая нужные ноды через AJAX, и удаляя из HTML collapsed ноды.
Если подгрузка нодов - занятие тривиальное - достаточно написать метод request (в данном случае я использую библиотеку jQuery, а на серверной части сидит обычный Spring 3):


request: function(nodeId, level, onComplete) {

$.ajax({
url:controllerName,
data:{parentNodeId: nodeId},
dataType: 'json',
success: function(data) {
$jit.json.prune(data, level);
if (level == 0) addNodeOnTree(data, nodeId);
onComplete.onComplete(nodeId, data);
}
});
}

function addNodeOnTree(node, parentId) {

node.id = parentId;
st.addSubtree(node, 'animate', {
hideLabels: false,
onAfterCompute: function() {
st.compute();
}
});
}



А вот с удалением нодов - дела обстоят не так радужно. Конечно, есть метод removeSubtree, который удаляет поддерево, есть метод removeNode. Но с этим связано несколько проблем:
removeSubtree жует чрезмерно много ресурсов;
remobeNode удаляет только нод из нашего графа, но не удаляет из html. и работает как то не особо красиво.
Стоит обратить внимание на метод hide, в описании которого ясно сказано, что хрен нам, а не удаление:


hide: function(nodes, controller) {
var viz = this.viz;
for(var i=0; i<nodes.length; i++) {
// TODO nodes are requested on demand, but not
// deleted when hidden. Would that be a good feature?
// Currently that feature is buggy, so I'll turn it off
// Actually this feature is buggy because trimming should take
// place onAfterCompute and not right after collapsing nodes.
if (true || !controller || !controller.request) {
///////


*для шибко умных хочу добавить, что это true - не индийский код, а "посмотрите на реализацию, можете поменять, но это дело забаговано, все на свой страх и риск"

Помучившись с этим какое то время, я решил, что хай же с ним, и просто сделаем по клику на нод фильтр, который будет удалять скрытые ноды из графа, и их же из html. все довольно просто. Но все равно, мне это не очень нравится.


function onNodeClick(id) {
for (var i in st.graph.nodes) {

if (i != undefined && !st.graph.getNode(i).drawn) {

st.graph.removeNode(i);

var div = document.getElementById(i);
if (div != null)
div.parentNode.removeChild(div)
}
}
}



суть проста: чтобы не удалить по неосторожности другие элементы страницы, мы отсеиваем только скрытые (не html display none, а которые collapsed в дереве) !st.graph.getNode(i).drawn ноды, удаляем их из дерева
st.graph.removeNode(i);
и из html
div.parentNode.removeChild(div).

Стоит обратить внимание на то, что если дерево вылазит за границы экрана, то в html эти ноды показываются как display none, а дерево их видит как st.graph.getNode(i).drawn == true

Вот такие первые впечатления. Само дерево настраивается под ваши нужды, достаточно открыть документацию.