суббота, 31 декабря 2011 г.

Итоги года

Прочитал подобные посты (подведение итогов уходящего года), и неожиданно захотелось тоже что-то подобное написать. Поехали.

Год для меня в целом был напряженный, и событий в нем был много всяких разных, но в целом  через весь год красной нитью прошло одно важное событие - мой переезд в  США. Это потребовало неожиданно много времени (в общей сложности от начала переговоров до собственно пересечения границы прошло больше года), много усилий с моей стороны и со стороны компании, пригласившей меня, и много нервов и тревог, что все это сорвется из-за какой нибудь ерунды. С другой стороны, теперь я в этой теме поднаторел и могу, наверное, давать полезные советы на эту тему желающим просветиться :)

Я помню, что на Хабре меня многие спрашивали на эту тему и просили написать статью - как нибудь или я напишу статью, или запишу подкаст. Знания должны распространяться.

В профессиональном плане у меня тоже произошел некоторый сдвиг - теперь я официально TPM (Technical Product Manager), что на практике означает, что кроме написания кода/проектирования архитектуры я теперь я трачу часть времени время на всевозможные митинги, участвую в обсуждениях требований к продукту, отвечаю на множество писем и раздаю задачи разработчикам в команде (коих пока мягко говоря немного, но надеюсь в наступающем году будет больше).

Два этих момента съели львиную долю моей энергии, и некоторые вещи, которые я начинал в этом году, я начал и оставил на полдороги. Начал например, учить Git (и выучил до некоторой степени), прежде всего чтобы форкнуть один интересный мне проект на Гитхабе и развить его. Проект этот - Antro (разработан Женей Кирпичевым, за что его огромный респект!).  Проект форкнул, пофиксил пару багов в нем, чуть допилил под нужные для себя задачи и оставил.

Начал учить некоторые редкие языки - Erlang, Lisp, Scala (не такой уж редкий, но все же не мейнстрим). Начать начал, а продвинуться в них существенно времени (а может, мотивации...) не хватило.

Довольно о былом. Чего бы я хотел в новом, наступившем уже году?

В карьерно-профессиональном плане - найти наиболее подходящий лично для меня баланс между ролью ведущего программиста/архитектора и роль PM-а. Чтобы и компания получала максимальный профит от моего вклада, и мне это приносило удовлетворение. Хотелось бы увидеть, как тот увлекательный R&D, которым я занимался тут последнее время, приносит свои плоды в реальных проектах для реальных заказчиках.

В лично-профессиональном плане хотелось бы найти время и постоянную мотивацию, чтобы добить те технические навыки и знания, которые я упомянул выше. Просто взять и добить. И взять на щит еще некоторые интересные знания/языки программирования/подходы/технологии. И использовать эти знания в каком-нибудь open source проекте.

Хотел бы наконец прочитать следующие книжки (кое-какие уже начал, их дочитать):

 -  dragon book, эпичный труд по компиляторам.
 -  Джонатана Льюса, по Oracle - Introduction to cost-based optimization или как она там точно называется. Изумительная книжка по ораклу. Дает понимания, просто сакральное знания, что же все таки такое COST запроса.  Вопрос, на который вам внятно на собеседовании не ответит 9 из 10 человек, пишущих в резюме "владею Oracle". Кстати, а как вообще можно писать в резюме "владею Oracle" (я именно такую формулировку видел, и не раз), если вы не Ларри Эллисон? Оставлю вопрос за совесте резюмеписателей.
 - Groovy in Action, 2 издание. Чтобы, так сказать, catch up все те вкусности, которые появились в последних релизах.
 - SICP. Без комментариев. Стыдно признаться, но - не читал.

Ну и еще кое-что по мелочи.

Что еще? Завести себе мотоцикл, и начать рассекать по техасским хайвеям.

Сдать на лицензию на оружие, и постреливать в тирах из разнообразного короткоствола. Хорошее развлечение, хорошо заряжает энергией.

Через год посмотрим, что из всего этого удастся осуществить. А заодно - что осуществиться из пока еще незапланированного.

Все. С новым годом всех! Желаю прежде всего, чтобы ваши цели были кристалльно ясными для вас самих, ведь это - первый шаг к их осуществлению. А когда цели ясны - пожелаю силы воли, мотивации, здоровья и удачи. Это то, чего должно хватить для достижения всего намеченного.

Cheers!


среда, 28 декабря 2011 г.

Установка Oracle под Ubuntu

Установка Oracle Enterprise Edition под Ubuntu это задача не для каждого разработкика.

Полная и точная (по словам автора - я сам пробовал многочисленные похожие инструкции, все равно полностью без ошибок поставить ни разу не удавалось) инструкция находится здесь - http://www.excession.org.uk/blog/installing-oracle-on-ubuntu-karmic-64-bit.html.

Сравните, насколько это геморройнее и сложнее, чем установка того же Oracle EE под Windows - там запустил инсталлер и следуешь его указанием. Короче, отличный пример протекающей абстракции Джоэля Спольски.

Но для Express (XE) версии есть все-же человеческое решение - оригинал по английки тут - http://www.varyonic.com/2010/01/installing-oracle-xe-on-ubuntu/.

Мой вольный перевод на русский:


Oracle XE официально доступен только под x86 системы, хотя, возможно, его можно с помощью бубна, удачи и чьей-то матери поставить и на X64. Требует это чудо природы 512Мб памяти и 1Гб свопа. Добавьте в файл /etc/apt/sources.list следующую строчку:
deb http://oss.oracle.com/debian unstable main non-free
и потом запустите под рутом (т.е. sudo ..<your command>, он спросит пароль текущего юзера и исполнит команду под рутом):
wget http://oss.oracle.com/el4/RPM-GPG-KEY-oracle -O- | sudo apt-key add - apt-get update apt-get install oracle-xe
Библиотеки libaio и bc доступны в самом репозитории, и будут подтянуты автоматически по зависимостям, ставить их вручную больше не нужно.



четверг, 22 декабря 2011 г.

Загрузка двух нативных библиотек через JNI под линуксом


Недавно по работе появилась редкая для меня задача, излагаю. Скажу сразу, решения в лоб пока не нашел, а workaround-ы мне известны, но для них требуется помощь от поставщика одной из сторонних библиотек, а потому задача более чем актуальна. 
Знатоки JVM И юникса - VERY welcome..
Итак, задача. Есть две нативные либы, А  и Б, или, в нейминга линукса, это libA.so и libB.so. А зависит от Б (должна вызывать функции из нее). А - написана мной, Б - предоставлена сторонними разработчиками в виде одного жалкого .so файла, доступа к исходникам нет.
Мне нужно загрузить эти две либы в JVM через JNI и вызвать функцию из библиотеки А, которая, в свою очередь, использует функцию из Б.
Следующий код:
static {
    System.loadLibrary(B);
    System.loadLibrary(A);
}
Отлично работает в Windows (для .dll файлов, соотетственно), при условии, что обе библиотеки лежат в java.library.path (я тут кстати раньше в блоге писал, как можно менять java.library.path в рантайме).
Как это работает в Windows - загружается B.dll, дальше A.dll пробует загрузиться, видит, что надо бы загрузить B.dll, от которой она зависит, видит, что B.dll в память процесса уже загружена, и не пытается найти и загрузить B самостоятельно, ища ее в PATH.
Теперь, что, по видимому, происходит в линуксе.
Дополнительный логгинг показывает, что libB.so корректно находится в java.library.path и загружается. Затем, рантайм-линкер пытается загрузить libA.so, и замечает, что ВНЕЗАПНО, libB.so в LD_LIBRARY_PATH нет! А менять LD_LIBRARY_PATH я не хочу, не то что неспортивно, но хочется локально решать проблемы. Чтобы уточнить - обе библиотеки находятся в директории, которая входит в java.library.path, но НЕ входит в LD_LIBRARY_PATH).
У кого-нибудь есть какие-нибудь идеи?
Перепробовал немало хаков уже, включая линковку libA.so с уничтожением таблицы символов, загрузку libB.so динамически из libA.so, получение указателя на нужную функцию (манглированную) и вызов ее - не работает ничего из этого так, как мне надо.
Еще раз уточню условия - я не хочу модифицировать LD_LIBRARY_PATH, я не хочу класть свои либы в "общеизвестные" места типа /usr/lib.
Вариант добыть вместо libB.so статически либу (libB.a) и влинковать ее жестко в libA.so мне вариант кажется хорошим, но исходников нет.
Сконвертировать libB.so -> libB.a? Теоритически наверное, можно.