аўторак, 22 верасня 2009 г.

чацвер, 5 сакавіка 2009 г.

If anybody look for fix for http://bugs.sun.com/view_bug.do?bug_id=4947220
(process) Runtime.exec() cannot invoke applications with unicode parameters (win)
You can try mi fixes:
it`s a wrapper around CreateProcessW with a little bit of process control.


// must match constants at Win32Process class
#define SUCCESS 0
#define CREATE_ERROR 0
#define WAIT_ERROR 1
#define TERMINATE_ERROR 2
#define GET_EXIT_CODE_ERROR 3
#define EXIT_VALUE 4
#define ARRAY_SIZE 5
#define INVALID_VALUE -31

#include
#include "utils_os_windows_SystemUtils.h"
/*
* Class: utils_os_windows_SystemUtils
* Method: createProcess
* Signature: (Ljava/lang/String;Ljava/lang/String;)I
*/
JNIEXPORT jintArray JNICALL Java_utils_os_windows_SystemUtils_createProcessAndWaitInternal
(JNIEnv * env, jobject obj, jstring processCommandLine, jlong millis, jboolean needTerminate) {
    // hold all info about proces state
    jint returnCodesArray[ARRAY_SIZE] = {INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE, INVALID_VALUE};
    jboolean isCopy;
    const jchar *pCommandLine = env->GetStringChars(processCommandLine, &isCopy);

    // make a copy of pCommandLine - CreateProcessW modified it...
    size_t commandLineLength = wcslen((wchar_t *)pCommandLine) + 1;
    wchar_t * muttableCommandLine = new wchar_t[commandLineLength];
    wcscpy_s(muttableCommandLine, commandLineLength, (wchar_t*)pCommandLine);

    // free unused chars
    env->ReleaseStringChars(processCommandLine, pCommandLine);
    // addionalional structures for CreateProcessW
    STARTUPINFOW startupInfo;
    PROCESS_INFORMATION processInfo;
    // fill memory with 0
    ZeroMemory( &startupInfo, sizeof(startupInfo) );
    startupInfo.cb = sizeof(startupInfo);
    ZeroMemory( &processInfo, sizeof(processInfo) );

    // Start the child process.
    if (CreateProcessW( NULL, // No module name (use command line)
                muttableCommandLine, // Command line
                NULL, // Process security attribues
                NULL, // Thread security attribues
                FALSE, // Set handle inheritance to FALSE
                CREATE_NO_WINDOW, // if console program - without console window, else if non-console prog - ignored
                NULL, // Use parent's environment block
                NULL, // Use parent's starting directory
                &startupInfo, // Pointer to STARTUPINFO structure
                &processInfo ) // Pointer to PROCESS_INFORMATION structure
            ) {
        // if successfull
        returnCodesArray[CREATE_ERROR] = SUCCESS;
        // start wait for time
        if (millis > 0) {
            returnCodesArray[WAIT_ERROR] = SUCCESS;
            DWORD waitRetCode = WaitForSingleObject(processInfo.hProcess, (long)millis);
            if ( waitRetCode == WAIT_FAILED) {
                // we have an error
                returnCodesArray[WAIT_ERROR] = GetLastError();
            } else if ( needTerminate ) {

                // do it atomic
                CRITICAL_SECTION criticalSection;
                InitializeCriticalSection(&criticalSection);
                EnterCriticalSection(&criticalSection);
                // first check, if process still alive
                DWORD exitCode;
                if (GetExitCodeProcess(processInfo.hProcess, &exitCode)) {
                    if (exitCode == STILL_ACTIVE) {
                        // if true - terminate it
                        // kill process
                        returnCodesArray[TERMINATE_ERROR] = SUCCESS;
                        if (!TerminateProcess(processInfo.hProcess, 1)) { // 1 - because of origin sources has this value
                            returnCodesArray[TERMINATE_ERROR] = GetLastError();
                            returnCodesArray[EXIT_VALUE] = 1; // value from TerminateProcess
                        }
                    } else {
                        returnCodesArray[EXIT_VALUE] = exitCode;
                    }
                } else {
                    returnCodesArray[GET_EXIT_CODE_ERROR] = GetLastError();
                }
                // leave criticaval section
                LeaveCriticalSection(&criticalSection);
                DeleteCriticalSection(&criticalSection);
            }
        }
        CloseHandle(processInfo.hProcess);
        CloseHandle(processInfo.hThread);
    } else {
        // if unsuccessfull
        returnCodesArray[CREATE_ERROR] = GetLastError();
    }
    // clear up...
    delete[] muttableCommandLine;
    muttableCommandLine = 0;
    // obtain new java int array
    jintArray returnArray = env->NewIntArray(ARRAY_SIZE);
    env->SetIntArrayRegion(returnArray, 0, ARRAY_SIZE, returnCodesArray);
    return returnArray;

}

серада, 18 лютага 2009 г.

Java, Struts, Hibernate and so on...

Усім добрага вечара!

Кароткія звесткі аб тым, што вам магчыма патрабуецца ў напісанні праектаў у Вейніка.

Па-першае, гэта Struts ("стратс" (падпоркі))
-- Генерал: фрэймворк для напісання вебаплікух. Калі хочаце, можаце лічыць гэта нейчым накштал asp.net, але, на мой погляд, Struts значна больш
гібкі і зручны для гэтай справы.
-- Што сабой уяўляе: набор бібліятэк (тыя, што *.jar). Раю юзаць Struts 2 ( але можна і Struts 1).
-- Дзе што шукаць:
сайт праекту http://struts.apache.org/ , http://struts.ru - там нават нешта па-расейску ёсць.
кнігі, якія ёсць у мяне:
Struts in action 2003, Manning - нічо так, але пра Struts 1
Apress - Beginning Apache Struts - From Novice to Professional - што за яна, ужо ня памятаю :(
Apress - Practical Apache Struts2 Web 2.0 Projects - па назве - мабыць пра Struts 2
O_Reilly_-_Jakarta_Struts_
Cookbook_-_2005_-_Bill_Siggelkow - хаця і 2005, але яшчэ Struts 1.х
O'Reilly - Programming Jakarta Struts - 2002 - таксама Struts 1.1
WILEY_Mastering_Jakarta_Struts - вось тут менш літар ;)
Wiley - Jakarta Struts For Dummies - а тут ёсць малюнкі.

Як відно, па Struts 2 амаль нічога. Ёсць нядрэнны бук Struts 2 in action , Manning, але гэта праз Віталега, бо з маёй сеткі
гэтая бібліятэка не даступна.

Па-другое, Tiles
-- Генерал: плюшка для Стратс, каб працаваць з шаблонамі (зноў жа, нешта накшталт masterpages, але больш гібкае і моцнае)
-- Што сабой уяўляе: здэцца, адна бібліятэка, ды мо якіх пару таглібаў
-- Дзе што шукаць
сайт праекту: http://tiles.apache.org/
кнігі, якія ёсць у мяне:
tilesAdvancedFeatures
таксама апісваецца амаль ва усіх кнігах са Struts

Па-трэцяе, Hibernate
-- Генерал: фрэймворк для працы з базамі дадзеных. Яшчэ такія фрэймворкі клікаюць ORM здэцца - нешта накшталт LNQ у рашотцы. Але LNQ у параўнанні
з Hibernate - кітайская грамата, ды яшчэ у кнізе на японскім ;)
-- Што сабой уяўляе: набор бібліятэк. Раю юзаць трэцюю версію - сьвежачок зпампаваў на днях - можаце брать.
-- Дзе што шукаць:
сайт праекту http://www.hibernate.org/
кнігі, якія ёсць у мяне:
Hibernate in action, Manning - нядрэнны бук

Па-чацвёртае, Spring
-- Генерал: ммм... нават ня ведаю, як яго назваць... Нешта накшталт кантэйнеру аплікацыі. Але тут лепш паспрабаваць, чым размаўляць.
Можа выкарыстоўвацца ня толькі для вебу, але і для дэсктопу ці яшчэ чаго. Аналагу з шарпу нават не магу прыдумаць. Spring дазваляе легка
сабраць у адну кучу Struts, Hibernate і іншае. Рэч здораўская, але і трохі мутнаватая. Ня раю яе тым, хто піша просценькую вебаплікуху, але
тым, хто мае трохі часу - раю - разбярэціся адзін раз - зможаце потым лёгка яе юзаць.
-- Што сабой уяўляе: тое ж самае :)
-- Дзе што шукаць
сайт праекту http://www.springsource.org/
кнігі, якія ёсць у мяне
Spring in action, Manning
Spring Live - добра апісана, як юзаць Spring+Hibernate+Srtuts


Па-пятае, JUnit (special for you, Sveta & Ira :) )
-- Генерал: фрэймворк для тэсту чаго заўгодна. Ня здзіўлюся, калі ім можна і com-порт з падрубленым "уцюгом" патэсціць. Лёгкі ў разуменні -
нам прыперла - за два дні разабраліся :)
-- Што сабой уяўляе: ага, набор *.jar. У модных IDE накштал NetBeans, Eclipse J2EE Suite, IDEA ёсць звычайна у камплекце.
-- Дзе шукаць:
сайт праекту http://www.junit.org/
добрая кніга Junit in action, Manning, на жаль, у мяне няма :(

У якасці плюшкі, калі патрэбуюцца мок-аб'екты - юзайте easymock - тут google вам у дапамогу.

Па-шостае, JavaFX
-- Калi ведаеце, што такое AdobeFlex or MS SilverLight, то гэта падобна на іх.
-- Дзе шукаць:
тут адпраўная кропка - java.sun.com, потым google.com http://javafx.com/
Здэцца, нешта было ў бібліятэцы па JavaFX, але тут ужо Віталега прасіце ;)

І апошняе: тут некаторыя (ня будзем паказваць пальцам на Парфеяўца) пыталі, ці ёсць Struts/Hibernate/String etc у Eclipse ці яшчэ ў якой IDE. Адкажу адразу так:
а ці ёсць у віндзе фільм "Перавозчык 3"? Адказ просты - калі запішаце - будзе, калі не - не будзе :) Eclipse у мінімальнай пастауцы займае добра калі 30 метраў, і канешне, там нічога няма,
ну а калі паставіть Eclipse WTP ды яшчэ панавей, то там ня толькі Struts/Hibernate/String... будзе, а і яшчэ шмат чаго. А калі ня будзе - усё проста - пампуем з сайту праекту бібліятэкі і юзаем.
Так нават лепш - больш зразумела, што ды куды.