среда, 17 марта 2010 г.

Свободное солнце и суслик

-ты суслика видишь?
-нет
-и я нет.. но он есть.
(ДМБ)

В ролях:
свободное солнце - OpenSolaris
суслик - SUNWinst

Суть произошедшего в следующем. Надумалось мне овладеть искусством управления контейнерами Solaris. За сим на VirtualBox был водружен OpenSolaris. Водрузился он, что забавно, с третьего раза. Первые разы уверенно скисал при установке.

Итак солярис на месте, талмуд по управлению зонами прочитан. Зона создана. Только вот установка зоны не проходит. Дай грит мне образ системы.

И тут понеслось. Все талмуды утверждают что образ системы для подобной установке совершенно замечательно делается с помощью flarcreate а вот его в системе то и нетуть. Через пару часов гуглежки я таки выяснил что этот самый flarcreate входит в состав пакета SUNWinst. Пакета тоже не сыскал. Что замечательно все вокруг о нем говорят и показывают как пользоваться
flarcreate но откуда взяли SUNWinst - там его нет. Вобщем убился я его искать так и не нашел. Да и не нужен он как оказалось

Все оказалось значительно проще. т.е. этот чудо архиватор пригодится если захотите сделать клон системы а вот если это не критично то достаточно создать нативную зону и иметь подключение к интернету и все заработает. Все нужные пакеты вытянутся из сети, у меня получилось примерно 70Мб.

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

Вообще с солярными контейнерами оказалось все красиво и нарядно!

Ток вот VirtualBox огорчил, почемуто только 1о ядро отдал на растерзание дитю солнца. Маловато будет.

пятница, 5 марта 2010 г.

Лунный кофе. часть 3я.

И снова заноза.

Со сложными возвращаемыми значениями из java тоже не все так просто как хотелось бы. Например метод возвращает HashMap. Т.е. вернуть то он его вернет.. но вот работать с ним придется как в java.

Ниже пример трансформации в Lua таблицу. jMap соответственно HashMap возвращенный из java модуля.


lMap = {}
kSet = jMap:keySet()
iSet = kSet:iterator()

while iSet:hasNext() do
tmp = iSet:next()
lMap[tmp] = jMap:get(tmp)
end

вот как то так.

четверг, 4 марта 2010 г.

Лунный кофе. часть 2ая.

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

Собсно гря суть проблемы.
Из java модуля прокидывается в Lua инстанс класса имеющий функцию принимающую в качестве параметров массив чего либо. Проблема заключается в том что модель построения коллекций Lua такова что массивы там - такиеже ассоциативные массивы(очень похоже на gawk).

получившееся решение не блещет красотой но работает

uArray = luajava.bindClass("java.lang.reflect.Array")
uObject = luajava.newInstance("java.lang.Object"):getClass()
ux = uArray:newInstance(uObject, #lst)

for k,v in pairs(lst) do
uArray:set(ux, k - 1, v)
end

где lst и есть Lua массив.
После этого ux передается в метод java класса и все работает.

вторник, 2 марта 2010 г.

Лунный кофе

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

Итак это будет Lua. Потому что очень маленький и просто встраивается.
Поскольку проект написан на java то и потребуется luajava.
но в репах его нет. и рпмки я не нашел.
Тут я решил тряхнуть слакварным прошлым и собрать все что надо
ручками.

сам luajava лежит здесь http://www.keplerproject.org/luajava/
там же есть мануалы по встраиванию в джава и как все это собрать. Но у меня х86_64 и потому будут небольшие отличия.

В системе уже установлен lib64lua5.1 и помечен как неудаляемый(удивлен).

В дополнение к тем пакетам что указаны в офф доке необходимы
lib64lua-static-devel
lib64lua-devel

Cобирать надо так.
make LIB_LUA=/usr/lib64/liblua.a

В противном случе make пытается привинтить 32х разрядную библиотеку
которая отсутствует, естественно.

Путь тот куда поставился пакет lib64lua-static-devel

у меня получилось примерно следующее
luajava-1.1/# make LIB_LUA=/usr/lib64/liblua.a
/opt/bea/jdk150_12/bin/javadoc -public -classpath src/java/ -quiet -d "doc/us/API" src/java/org/keplerproject/luajava/JavaFunction.java src/java/org/keplerproject/luajava/LuaException.java src/java/org/keplerproject/luajava/LuaInvocationHandler.java src/java/org/keplerproject/luajava/LuaObject.java src/java/org/keplerproject/luajava/LuaState.java src/java/org/keplerproject/luajava/LuaStateFactory.java src/java/org/keplerproject/luajava/Console.java
export MACOSX_DEPLOYMENT_TARGET=10.3; gcc -shared -o libluajava-1.1.so src/c/luajava.o /usr/lib64/liblua.a
------------------
Build Complete
------------------

После чего как и обещает офф дока джарник и библиотека появились

Поскольку я пользуюсь для сборки мавеном то прописываю в pom.xml
следующую зависимость

...
<dependency>
<groupId>luajava</groupId>
<artifactId>luajava-local</artifactId>
<version>local</version>
</dependency>
...

И импортирую получившийся ранее джарник в локальный репозитарий мавена.
mvn install:install-file -DgroupId=luajava -DartifactId=luajava-local
-Dversion=local -Dpackaging=jar -Dfile=./luajava-1.1.jar

После всех этих манипуляций проект начинает нормально компилятся

Дальнейшие действия по встраиванию описаны в документации

Дополнив проект небольшим количеством кода запускаю результат.

LD_LIBRARY_PATH=./ ~/bin/jdk1.6.0_17/bin/java -jar
target/func-test.jar test.lua

библиотека соответственно лежит тутже

все работает.. красота!
Осталость собрать библиотеку для Solaris.