• Нужна ли статья "налоги в США"

    Zorkus
    @Zorkus Автор вопроса
    Начал писать, понял, что материала много, разбил на три части.

    Первая часть — тут. habrahabr.ru/post/144820/
    Ответ написан
    Комментировать
  • Нужна ли статья "налоги в США"

    Zorkus
    @Zorkus Автор вопроса
    Обаму половина штатов не любят не из-за структуры налогов как таковых, это отдельная тема, политическая, а я чисто про налоги хочу рассказать.
    Ответ написан
    Комментировать
  • Git или SVN, что?

    Zorkus
    @Zorkus
    Если смотрите на решения, которые локально ничего лишнего вообще не хранят (все конфигурации воркспейсов сохраняются на сервере), смотрите на Perforce.
    Ответ написан
    Комментировать
  • Загрузка двух нативных библиотек через JNI под линуксом?

    Zorkus
    @Zorkus Автор вопроса
    В итоге я решил эту проблему следующим образом: оказалось, что обе библиотеки надо линковать с флагом -Wl,soname. Поскольку у меня не было доступа к исходником сторонней библиотеки, я уговорил ее создателя прислать мне объектные файлы, и слинковал ее сам :)

    Всем спасибо за помощь! :)
    Ответ написан
    Комментировать
  • Функционал vs Функциональность?

    Zorkus
    @Zorkus
    Имхо, зам директора решил выпендрится тем, кто в универе проходил чуть более глубокий курс математики, чем преподают на всяких АСУ, проектировании сетей и прочих популярных специальностей (говорю как математик).

    Упрощенно говоря говоря, в функциональном анализе, а не в чистом вариационном исчислении, функционал это просто частный случай оператора, отображающие множество (линийное пространство) в (действительное) число. Точное определелие можно найти в учебнике Смирнова, но имхо, определение которое вам дали под номером 1 — неграмотное.

    Мне не режет слух употребление слова функционал в нематематическом смысле.
    Ответ написан
    1 комментарий
  • Загрузка двух нативных библиотек через JNI под линуксом?

    Zorkus
    @Zorkus Автор вопроса
    По какой-то гнусной причине, в манах на kernel.org не написано, пытается ли dlopen() с флагом RTLD_NOLOAD найти .so файл в файловой системе в процессе проверки, загружена ли такая библиотека, или нет.

    Все, что написано:

    RTLD_NOLOAD (since glibc 2.2)
    Don't load the library. This can be used to test if the library is
    already resident (dlopen() returns NULL if it is not, or the library's
    handle if it is resident). This flag can also be used to promote the
    flags on a library that is already loaded. For example, a library that
    was previously loaded with RTLD_LOCAL can be reopened with
    RTLD_NOLOAD | RTLD_GLOBAL. This flag is not specified in POSIX.1-2001.
    Ответ написан
    Комментировать
  • Загрузка двух нативных библиотек через JNI под линуксом?

    Zorkus
    @Zorkus Автор вопроса
    Покопался немного в коде, интересуют комменты от разработчиков JVM. Надо может быть отдельный пост написать про это.

    Итак, все знают что загружаются нативные библиотеки через класс java.lang.ClassLoader, и и точка перехода в нативный код — java.lang.ClassLoader.NativeLibrary.load.

    Смотрим jdk/j2se/src/share/native/java/lang/ClassLoader.c, видим:

    ....
    JNIEXPORT void JNICALL
    Java_java_lang_ClassLoader_00024NativeLibrary_load
    (JNIEnv *env, jobject this, jstring name)
    {
    const char *cname;
    jint jniVersion;
    jthrowable cause;
    void * handle;

    if (!initIDs(env))
    return;

    cname = JNU_GetStringPlatformChars(env, name, 0);
    if (cname == 0)
    return;
    handle = JVM_LoadLibrary(cname);
    if (handle) {
    // разнообразные проверки и обрабока исключений
    }
    ...


    Смотрим где определена функция JVM_LoadLibrary, пролистав хедеры jvm.h, находим что-то похожее на то, что нам нужно в файле jdk/hotspot/src/share/vm/prims/jvm.cpp:

    JVM_ENTRY_NO_ENV(void*, JVM_LoadLibrary(const char* name))
    //%note jvm_ct
    JVMWrapper2("JVM_LoadLibrary (%s)", name);
    char ebuf[1024];
    void *load_result;
    {
    ThreadToNativeFromVM ttnfvm(thread);
    load_result = hpi::dll_load(name, ebuf, sizeof ebuf);
    }
    if (load_result == NULL) {
    char msg[1024];
    jio_snprintf(msg, sizeof msg, "%s: %s", name, ebuf);
    ...
    Handle h_exception =
    Exceptions::new_exception(thread,
    vmSymbols::java_lang_UnsatisfiedLinkError(),
    msg, Exceptions::unsafe_to_utf8);

    THROW_HANDLE_0(h_exception);
    }


    Т.е. функция dll_load уже похожа на ту, где должен идти натуральный вызов системных функций для загрузки (POSIX/WINAPI), иначе это уже слишком много уровней получается. Смотрим файл jdk/hotspot/src/os/os/linux/vm/os_linux.cpp: видим:

    // Loads .dll/.so and
    // in case of error it checks if .dll/.so was built for the
    // same architecture as Hotspot is running on

    void * os::dll_load(const char *filename, char *ebuf, int ebuflen)
    {
    void * result= ::dlopen(filename, RTLD_LAZY);
    if (result != NULL) {
    // Successful loading
    return result;
    }


    Ха! Т.е. shared object-ы таки загружаются без добавочного флага RTLD_NOLOAD! Т.е. JVM не проверяет, перед загрузкой, загружена соотв. либа или еще нет?

    Для сравнения посмотрим аналогичный код Windows, смотрим файл os_windows.cpp:

    // Loads .dll/.so and
    // in case of error it checks if .dll/.so was built for the
    // same architecture as Hotspot is running on
    void * os::dll_load(const char *name, char *ebuf, int ebuflen)
    {
    void * result = LoadLibrary(name);
    if (result != NULL)
    {
    return result;
    }


    А теперь смотрим на документация в LoadLibrary здесь: msdn.microsoft.com/en-us/library/windows/desktop/ms682586.aspx

    If a DLL with the same module name is already loaded in memory, the system checks only for redirection and a manifest before resolving to the loaded DLL, no matter which directory it is in. The system does not search for the DLL.

    Т.е. поведение для линукса и виндовса будет различное в данном случае.

    Читаем:
    Ответ написан
    Комментировать
  • Загрузка двух нативных библиотек через JNI под линуксом?

    Zorkus
    @Zorkus Автор вопроса
    Еще небольшое пояснение. В коде все было верно и так, это в пост на хабре закралась ошибка.

    libA.so — моя библиотека, libB.so — чужая библиотека, А слинкована с параметров -L /path-to-lib-B -lB, из явы сначала грузится B, потом А. И это не работает под линуксом (под Windows аналогичный трюк работает!), логгинг показывает следующее — System.loadLibrary(B); — работает и загружает libB.so, затем вызов System.loadLibrary(A) падает c сообщением что невозможно найти файла libB.so (хотя, эта библиотека уже загружена в память процесса).

    Я сам был уверен, что это должно работать, потом так и удивился.

    Пока моя гипотеза (надо посмотреть нативный код в JDK который собственно грузит библиотеки, как я понимаю это dlopen() под линуксом), при загрузке библиотеки libA.so dlopen не проверяет перед тем, как попытаться выполнить динамическую линковку библиотеки A «а загружена ли B в память процесса или нет», проверять это можно передавая в dlopen flag RTLD_NOLOAD. Возможно, еще, что это внутреннее поведение рантайм-линкера под юниксом, на который JVM никак повлиять не может.

    Так или иначе — я тоже был уверен, что это должно работать, но почему-то не работает.
    Ответ написан
    Комментировать
  • Загрузка двух нативных библиотек через JNI под линуксом?

    Zorkus
    @Zorkus Автор вопроса
    Да, кстати, очень извиняюсь, но у меня там была опечатка (опечатка именно в посте, в коде все было правильно! :)

    В посте вместо:

    На самом деле, конечно, обратный порядок:
    Вместо
    static {
    System.loadLibrary(A);
    System.loadLibrary(B);
    }

    должно быть:

    static {
    System.loadLibrary(B);
    System.loadLibrary(A);
    }

    И соотв, порядок загрузки в объяснения ниже тоже другой. Попровил пост.
    Ответ написан
    Комментировать
  • Загрузка двух нативных библиотек через JNI под линуксом?

    Zorkus
    @Zorkus Автор вопроса
    Это понятно, вопрос в том, почему под виндой нативный линкер не пытается ее взять вовсе (так как она загружена уже в память процесса JVM), а под юниксом пытается :)

    Судя по коду в ClassLoader.java, на по крайней мере на уровне java код JDK и под виндой и под линуксом ссылки на кешированные библиотеки (private static Stack nativeLibraryContext = new Stack();) хранятся в любом случае одинаково.
    Ответ написан
    Комментировать
  • Куда дальше развиваться?

    Zorkus
    @Zorkus
    В очередной раз дам совет по поводу ВУЗа. Вопрос с армией для вас, может, не очень актуален, но есть другой момент, а именно — без высшего профильного образования весьма и весьма трудно поехать работать программистом за границу — в США, Канаду, западную Европу, Новую Зеландию и прочее — трудно в первую очередь с точки зрения бюрократических требований к иностранным специалистам. Сейчас вам может быть это кажется фигней, но кто знает как жизнь сложится. Потом может быть очень обидно упустить редкую opportunity в жизни из-за того, что несколько лет назад не сдюжили и бросили ВУЗ, недоучившись.
    Ответ написан
    Комментировать
  • Как быстро и безопасно передать номер кредитки?

    Zorkus
    @Zorkus
    А зачем вам передавать номер кредитки? Для этого есть PayPal.
    Ответ написан
    Комментировать
  • На каких объемах данных реляционные БД перестают работать?

    Zorkus
    @Zorkus
    Вообще я бы сказал, если не говорить о ценах, а просто об объемах данных, вы еще далеко от того предела, когда реляционные базы не будут выдерживать вашей нагрузке, если конечно ваша модель данных именно реляционая. В полной стойке Exadata V2-8, например, почти 5 терабайт только Flash Cache Memory (и 100/330 теребайт основного хранилища, смотря по тому, поставите вы SCSI или SATA для него.)
    Ответ написан
    Комментировать
  • На каких объемах данных реляционные БД перестают работать?

    Zorkus
    @Zorkus
    Ну вообще говоря, 2.7 Тб само по себе не так много (телекомы используют гораздо большего объема базы). Мы использовали базы около 3 терабайт на оракле, сначала два обычных среднего уровня сервера в RAC, потом пробовали Exadata DB Machine Quarter Rack (http://www.oracle.com/us/products/database/exadata-database-machine/overview/index.html — прочитайте, зверь-машина), все нормально работала.

    Ключевые проблемы:

    — partitioning и разделение это таблицы на отдельные секции, которые лежат на разных жестких дисках в рейде (критичные партиции, где лежат наиоболее горячие данные, можно положить на SSD)
    — будет ли идти большое количество «живых» запросов агрегирующих данных на высоком уровне? Запросы к таблице в несколько миллиардов записей выполняются вполне быстро, если они строго идут по partition keys, если таблица грамотно разбита на партиции, и если они лежат на разных дисках. Запросы типа — посчитать мне среднюю цену по 5 миллиардам заказов, конечно, вас быстро положат на лопатки, просто из-за сумасшедшего IO.
    — Диски. Оцените стоимость нормального SAN, посмотрите какие в MS SQL есть средства типа оракловского ASM (automatic storage manager).
    Ответ написан
    Комментировать
  • Почему в Java нет памяти типа stack?

    Zorkus
    @Zorkus
    Тут основной момент такой- стек, это же вещь локальная для конкретного потока, потому в сложных приложениях выделять много памяти на стеке из одного потока вряд ли имеет смысла.

    Тем более, дефолтный размер стека для одного потока в Java небольшой, 512кб по умолчанию.
    Ответ написан
    Комментировать
  • Почему в Java нет памяти типа stack?

    Zorkus
    @Zorkus
    По моему, все примитивные типы и их врапперы, по крайней мере локальные в пределах методов, в яве выделяются в стеке текущего потока.

    Но совершенно точно, JVM активно использует внутри стек для размещения объектов.
    Ответ написан
    Комментировать
  • Запуск большого количества параллельных задач в отдельных песочницах?

    Zorkus
    @Zorkus Автор вопроса
    Использование JVM мне тут нравится всем, кроме одного — память. В моем понимании, при запуске для таких целей, оверхед под памяти у JVM будет много больше, чем у Питона.
    Ответ написан
    Комментировать
  • Java - "Отрицательный" возврат

    Zorkus
    @Zorkus
    Поддерживаю, используйте либо return null, либо определите специальный тип NullObject, и возвращайте его в этом случае.

    en.wikipedia.org/wiki/Null_Object_pattern
    Ответ написан
    Комментировать
  • Бюрократическая "писанина" в других странах

    Zorkus
    @Zorkus
    В большинстве случаев достаточно подписи/даты.

    От руки писал сравнительно много когда:

    — Подавал заявление на SSN (я сказал, что мне трудно писать, у меня тогда болела рука, и мне дали «упрощенную форму» с 8 полями типа имя, фамилия, дата рождения, фамилии родителей и т.п., остальное заполнили за меня основании моего паспорта, визы и прочих документов).
    — Заключал leasing agreement с лендлордом об аренде апартмента (там вообше, анкета бумажная страницы на полторы :))

    — США
    Ответ написан
    Комментировать
  • J2EE и высокие нагрузки?

    Zorkus
    @Zorkus
    Сказанное про стек J2EE тоже верно, для веб-хайлоада часто применяются только сервлет контейнеры (Tomcat / Jetty), с лоадбалансингом, + часто выделенный апач/nginx как фронтэнд для статики.

    Если же это не-веб хайлоад (банки, биржи), так там часто стек J2EE и ну нужен вовсе, зачем? Там нужна J2SE, multithreading, Spring для каркаса приложения, и какой нибудь hadoop (или что-то самописное) для распределения вычислений по нодам.
    Ответ написан
    Комментировать