суббота, 22 ноября 2008 г.

.ля

6 месяцев назад, сделал в VirtualBox'е snapshot виртуальной машины в которой запускаю виндовые проги. Сегодня решил этот снапшот убить. И убил актуальное состояние. В результате у меня больше нет вещей спроектированных и созданных собственными руками -- схемы и разведенные печатные платы. Особенно жалко:
1. 1-wire датчик влажности и температуры + 1-wire интерфейс к датчику движения.
2. 1-wire датчик PH (ph-метр) на двух ОУ.
3. Библиотека использованных компонент для Altium Designer'а...

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

Принимаю соболезнования.

вторник, 12 августа 2008 г.

N560

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

Открывать КПК как-то стремно стало. Боюсь, что обратно я его соберу с еще большими повреждениями. Решил забить на встроенный динамик. При желании можно и наушники для громкой связи использовать задрав громкость до предела. Не выход конечно... А вот с клавиатурой все печальнее. Сначало я думал, что на каждое нажатие кнопки приходит два скан кода один за другим. И думал, что смогу отрезать второй, который приходит слишком рано. Благо перехват скан кодов уже реализован в LooxLight'е. А тут оказалось все куда печальнее. Там не два скан кода приходит. А один "одновременный". Как бы это описать. Ну вот PC клавиатуре там настоящие скан коды. А в клавиатуре КПК, там просто значение у которого каждый бит занчит нажатую кнопку. Значение состоит из двух слов, старшее для стрелочек, а младьшее для всех остальных кнопок. И вот я по логам LooxLight'а наблюдаю следующую картину:
2003.01.02 17:33:38.0000: 6f7dacca: 8f7ddf4c: Char 00040004, cur=00000004, next=00000005, 8f7ddf4c, 8f7ddc64
И так на каждое нажатие. На любое нажатие левое слово = правое. В результате нажимаем стрелочку влево, а получаем и влево и еще какое-то нажатие. И наоборот. Короче хрен обьяснишь. Думаю это как-то завязано на то, что такие клавиатуры обычно реализуются через "матрицу" контактов или хз как и какие-то две ветки там замыкает. А может я и не прав. Сейчас сделаю временное решение, чтобы дисплей хоть разблокировать можно было, а потом буду думать...

Временное решение:
Сравнивать коды клавиш таким образом, что fix(нажатой кнопки) == fix (образца):

UINT fix (UINT x) {
UINT y = (x & 0xFFFF) | (x >> 16);
return y | (y << 16);
}

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

Зедаржки в Java

Так как для задач управление домашней автоматикой я сделал не совсем очивидный выбор - Java, то, естественно, мне было необходимо настраивать работу Java приложения под требование иметь минимальные задержки на события. В результате, для того, чтобы получить имеющийся результат, пришлось предпринять следующие действия:

1. Пускать приложение с schedtool -n -20 -R -p 1 -e /opt/mywire/bin/mywire
Данная команда позволяет запустить приложение в realtime группе с приоритетом 1. Все приложение linux имеют приоритет 0 независимо от nice level'а. Таким образом работа нашего mywire всегда приоритетнее любой задачи.

2. В некоторых критичных нитях, с помощью обращения к native методу происходит установка приоритета в значение 40. Таким образом внутри самого приложения нити имеют разные приоритеты. Это опасно и может привести к блокировкам!

3. Для того, чтобы ни в коем случае mywire не оказался в свопе, память лочится с помощью обращения к native методу mlockall.

4. Сам java процесс пускается со следующими опциями:

-Xms30m -Xmx64m -XX:PermSize=15m -XX:MaxPermSize=30m
-XX:+UseTLAB -jvm server
-XX:MaxGCPauseMillis=20 -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode
-XX:+CMSClassUnloadingEnabled
-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses
-XX:+BackgroundCompilation

Количество памяти, которое я отдаю под heap выбранно таким образом, чтобы сразу после сборки мусора (full gc), свободной памяти было где-то 60%.

Надеюсь ничего не забыл. Как результат мы имеем задержки порядки 10-16мс. При том, что библиотека quartz сама работает с дискретеностью в 10мс. Тоесть если ей сказать, что таску нужно запустить через 5мс, она ее все равно запустить через 10.

К сожалению раз в час происходит full gc или что-то типа того и это влечет за собой неожиданные задержки. Величина зависит от того, как совпадут время срабатывания и начало сборки мусора. В среднем это 200мс. Бывает и 500мс и 700мс. Будем думать как это побороть.

Вот графики:
Latency:


Память.


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

Предугадывая вопросы:
Java - чтобы писать быстрее.

Latency - в данном случае, это разница времени момента срабатывания таймера и времени, в которое данный таймер должен был сработать. Тоесть, например, если было сказано спать 100мс, а таймер проспал 120мс, то задержка 20мс.

Важность Latency заключается в том, что опрашивать некоторые датчики необходимо весьма часто, скажем датчик движения 2 раза в секунду. В моем варианте датчик движения замыкает размыкает контакты конденсатора давая ему зарядится, таким образом датчик напряжения 1-wire успеет заметить какой-нибудь заряд, даже если он пропустит сам импульс. Так вот если Latency будет слишком высокой (скажем 2-3 секунды), то срабатывания датчик может просто остаться незамеченным.

Кто озадачился вопросом, почему датчик движения не может сам сообщить о срабатывании, отвечу: 1-wire сеть может иметь только одного master'а, все остальные slave'ы.

Home Portal

Домашний портал. Эта та страничка, что стоит в браузере как home page. Отсюда я/жена читаю новости, смотрю погоду за окном (графики влажности, температуры), наблюдаю за работой сервера и т.д. Предназначен он для home automation (ну там энергосберегающий умный дом (smarthouse) и т.д.). Работа в свободное время. Сбор информации и управление 1-wire, в будущем будет еще X-10 (управление светом), камеры и т.д.. Много всего написано, но на сервере на production сервере еще не выложено. Сам портал напроч AJAX'ный, перегрузок страниц не требует. В качестве платформы Jboss Portal + DOJO (следующие портлеты будут без dojo, но на GWT). В качестве ядра, standalone java process со стеком spring + termware + quartz и т.д.

Но вообще пост не об этом, а о двух подряд идущих анонсах в ленте torrent.net.ua (см. скриншоты).

Картинка 1
Картинка 2
Картинка 3

четверг, 10 июля 2008 г.

Выбор domain языка

Предположим нужно контроллировать некоторую автоматику. Для этих целей необходимо выбрать способ формализации алгоритмов управления. Короче и проще говоря, нужен язык со следующими, как мне кажется, требованиями:
1. Имеющий реализацию интерпретатора на Java.
2. Парсинг исходного кода в runtime'е, а не предварительно.
3. Локоничный.
4. Расширяемый словарь.
5. Возможность захватывать состояние выполнения... мммм.. как это по-русски.. continuationы.

Это может быть что угодно, функциональный, императивный, декларативный, rewriting engine, macro и.д.

Пример псевдокода, который должен писаться на целевом языке не намного более длиннее чем это:

Loop:
T = GetCurrentTemperature
State = AccordingToMode ( If (T < REQUIRED_T, On, Off) )
SetDeviceState ("HeaterDevice", State)
WaitEvent (Polled("TemperatureDevice"), ModeChange)
При этом, в момент вызова WaitEvent выполнение скрипта должно прерваться с сохранением состояния, чтобы я дальше мог продолжить выполнение после WaitEvent. Как это предполагается использовать из Java (типа того):
Script script = Script.prepare (scriptSource);
ScriptYield yield = script.run ();
eventManager.addPendingScript (yield.getScriptState(), yield.getResult());

а где-то позже, может быть очередное:
ScriptYield yield = scriptState.continue ();

Я не много хочу? :)

Update: Groovy не поддерживает cont-ions, jpython из-за отступов не получится никуда встроить толком, jruby не поддерживает (fiber в виде нитей не канает)... ищем дальше

Update: По результатам подошел TermWare.

четверг, 26 июня 2008 г.

Linux 2

Ну вроде разобрался с проблемой зависания. Это определенно не дрова видюхи - без них в консоли все равно висло. Это не перегрев - в винде все ok. Четыре зависших попыток компиляции ядра 2.6.25.9 под ядром 2.6.25.8 показали, что проблема воспроизводима легко. Под 2.6.24 удалось собрать 2.6.25.9. Но собрать под 2.6.25.9 ради теста саму 2.6.25.9 не получилось - висла. Скачал 2.6.26-rc8. Тестовая сборка под этим ядром прошла нормально. Проблемы с протоколом Samba исчезли (интересно, что scp как работала нормально, так и работает). Вроде жизнь наладилась. Всем спасибо за советы.

Итого. 2.6.25.6, 2.6.25.7, 2.6.25.8, 2.6.25.9 - на моей машине (64 бита, AMD) оказались не рабочими.

вторник, 24 июня 2008 г.

Linux

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

Эпизодически, несколько раз в день система фризится напроч. Тоесть мышиный курсор не двигается, музыка не играет и т.д.
Если я в это время залогинен по VNC на зафризенную машину, то в момент этот, я могу максимум что сделать - запустить zsh и все. И то наверное потому, что он в кэш памяти сидит. Изображение прорисовывается по нажатию на кнопку. Например набрал su , но ничего не произошло. Нужно любую кнопку нажать, чтобы увидеть запрос на логин. Странное поведение. В логах ничего подозрительного нет. shutdown -r now не отрабатывает (программа вообще не похоже, что запускается).

Если копирую что-то по smb протоколу, то в файле только первые несколько кил нормальные, а дальше нули идут. Тоесть mp3 музыка играет пару сек и затыкается, если играть smb share'ы. При этом с другого компа доступ к томуже smb ресурсу работает без проблем и глюков. Если копируют mp3'ки мне на шару, то играет все нормально.
Даже не знаю что думать. Куллеры крутятся.. все как обычно. Винда на компе работает нормально, в т.ч. и Crysis. Ядро 2.6.25.(от 6 до 8). Никому ничего не напоминает?

пятница, 20 июня 2008 г.

Документация AspectJ

Если кто-то как и я документацию читает только по-необходимости, то так же как и я может попасть в ловушку при чтении доки на AspectJ. Например глядя на пример:

<include within="javax.*"/>
<include within="org.aspectj.*"/>

может показаться, что аспекты будут применены ко всему, что внутри javax.*, на самом деле это не так ибо, аспекты будут примены только к тем классам, что в javax ни больше ни меньше. Т.е. к классам внутри javax.security это не относится. А если учесть, что непосредственно в javax пакете вообще нет ни одного класса (или есть, но я по памяти не помню), то пример явно идиотский. Короче, должно там быть на самом деле "javax..*"...

вторник, 3 июня 2008 г.

GWT (1.5)

Очень странные ощущения. После возни с AJAX'овыми вещами с помощью JavaScript'а, писать клиентский код на Java просто сказка. Если скомпилировалось - значит заработает. Но компилируется не всегда - к этому надо просто привынуть. Например GWT.create принимает в качестве аргумента Class, но не тут-то было. Например код:
Class c = MyService.class; // или получено из аргумента
MyServiceAsync svc = GWT.create (c);
Прервет компиляцию с сообщением "Only class literals may be used as arguments to GWT.create()".

Подход к package structure, который вроде как strongly recomended, весьма странен с моей точки зрения. Ну сабпакаджи client и server весьма логичны, но вот сабпакадж public - сомнителен (в него предполагается ложить ресурсы как я понял(?)). Более того, client классы не могут зависить от server классов. Т.е. нельзя ложить интерфейс сервиса в package server - его нужно ложить в пакадж client, а в server'е должна лежать только имплементация этого сервиса. Получается по сути таже tier based архитектура, но только наоборот. В классической (ну той к которой я привык), клиентская часть знает о серверной, но не наоборот. А в GWT'ной модели, как раз наоборот получается: серверная часть пользуется классами из клиентской (наследует интефрейсы которые хочет видеть клиент). Собственно это при желании можно обойти сделав отдельный GWT-Module для какого-то отдельно пакаджа с общими классами.. но это ж делать надо и против recomended structure. Впрочем я с первого же дня забил на эту структуру и разложил все по своему - главное понимать, что делаешь и тогда все работает.

Сервисы-сервлеты в Module.gwt.xml не прописываю. Заюзал spring-mvc: прописал в web.xml его диспатчер, а в app context'е прописываю сами сервисы-контроллеры (для spring-mvc они контроллеры, а для gwt они сервлеты, а для клиента они сервисы). Получилось красиво весьма. Пока нравится.

По уровню boilerplate'ности напоминает EJB 2.1.

среда, 28 мая 2008 г.

Hibernate vs JDBC

JDBC изначально содержит совсем небольшое количество кубиков-понятий для работы с базами данных, что делает его простым в использовании инструментом и в тоже время достаточно гибким оставаясь понятным. Hibernate и прочие ORM (включая JPA) - это в некотором роде макро-абстракция над JDBC. Изначально кажется, что ORM позволяет абстрагироваться от синтаксиса конкретной базы данных и упростить запросы, сократить процесс переноса данных из запроса в домэйн обьекты. Но чем больше я работаю с ORM тем больше понимаю, что абстракция от базы данных на практике мало нужна, разве в простых приложениях. А простота маппинга достигается за счет оверхеадов при работе, сложности с маханизмами каскадирования, дэтачмента обьектов, майнтененсом сессии и в конце-концов выясняется, что временя потраченное на поиск причины сообщения о проблемы с транзиентными записями, попытке приаттачить обьект внутри сессии, с валидацией полей, проблемами ленивой подгрузки обьектов и прочих проблем.. это время равносильно, а то и больше времени которое было бы потрачено на разработку с JDBC + портирование приложения на новую базу (с учетом, что изначально в коде используется шаблон проектирования DAO). ORM привносит обилие новых понятий, сущностей и рычагов, добавляет mutual состояния (а мы знаем, что чем меньше в приложении мутирующих перменных/состояний, тем более стабильно приложении (именно по этому фнкц-языки рулят)), что очевидным образом вытекает во все что я описал в предыдущем предложении. Есть ли смысл?
Есть такой фреймворк iBatis. Судя по названию сначала кажется, что делали его славяни (особенно с учетом н овости на главной странице "Abator Renamed to iBATOR"). Но вот заяление "iBATIS couples objects with stored procedures or SQL statements using a XML descriptor. Simplicity is the biggest advantage of the iBATIS Data Mapper over object relational mapping tools." притягивает. И вообще как оказалось замечательный фрэймворк!

Flash, JavaFX, Silverlight, Flex

В эпоху достаточной конкуренции среди одинаковых веб услуг, появление модного слова AJAX показало, что пользователи хотят видеть веб сайты не просто информативными, но с красивым гуевым интерфейсом. Осознав это, компании, практически одновременно, принялись "первыми" выкидывать на рынок или просто разрабатывать новую технологию которая непременно же должна заменить HTML и сделать internet application'ы не просто Rich, а как я услышал в одном докладе на SUN'вской конференции прямо таки Filthy Rich! И все это под open source. Ну прям таки не жизнь, а мед грядет. За что я люблю веб over обыкновенное приложение (пусть оно хоть трижды filthy like a whore):
1. Любую вэб страницу я могу отмасштабировать (увеличить или уменьшить шрифт).
2. Выключить стили мега дизайнера нахрен.
3. Сохранить отдельную страницу.
4. Поставить ссылку на отдельную страницу.
5. Вернуться на пару страниц назад.
6. Окно можно растянуть или сжать не в ущерб содержимому. При этом браузер все красиво переформатирует.
7. И т.д.

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

Что я точно не понимаю, так это стратегию компании SUN. Ну ладно, хрен с ними с апплетами. Проипали они это поле битвы. Но почему бы в джава плагин не встроить нативно API для интеграции с DOM и Javascript? Модифицировать DOM дерево страницы браузера вроде бы можно, но я так и не нашел, читая javadoc, способа, как например из java повесить свой java handler для onclick или другого event'а какого-то узла этого DOM дерева. Сдается мне, что все на что хватает интеграции из коробки - удалять/добавлять узлы DOM дерева. Есть сбоку LiveConnect, но во первых он сбоку. А во-вторых что с event'ами сходу не понятно, но вроде как есть надежда. Ну чтож, хрен с ними с евентами, может что-то и получилось бы. НО!! Компания САН уже несколько лет не в состоянии выпустить плагин под 64 битные платформы (с 2004го кажется)... и обещают они выпустить java plugin к 2009г. Какие нахрен апплеты, какие RIA..?

А всего-то. Была бы в джаве вместо всей этой мега-графической мега-херни для создания мега-никому-не-нужных-грязных-апплетов возможность работать с деревом DOM и событиями - небыло бы необходимости в виде костылей GWT (компиляция из ограниченного сабсета Java в Javascript), потому как это java код напрямую бы работал и делал все, что сейчас делается на JS. Те же GWT виджеты и т.д. все бы было, но с отладкой прям в браузере, мониторинг по JMX и прочие прелести разработки и отладки java standlone, но в вебе. Такое чувство, что в сан только и могут языком трепать и евангелистов разбрасывающих дюков по миру катать.

А пока пойду попробую GWT 1.5rc1...

понедельник, 19 мая 2008 г.

OWFS 2.7p4

Нашел багу в OWFS 2.7p4. Немного криво написанная блокировка приводила к обращению к уже освобожденному участку памяти. Проявлялось через 1сек-5мин (как повезет) при паралелльном обращении к датчикам: owfs выключалась либо молча либо с сообщением функции tsearch из glibc о поврежденном списке. GDB помог не сильно. Valgrind помог весьма - отличная тулзень, давно ей пользуюсь.
==16965== Thread 9:
==16965== Invalid read of size 4
==16965== at 0x405F7A5: LockGet (ow_locks.c:142)
==16965== by 0x4066195: FS_r_given_bus (ow_read.c:229)
==16965== by 0x40663B2: FS_read_distribute (ow_read.c:191)
==16965== by 0x40668AD: FS_read_postparse (ow_read.c:106)
==16965== by 0x4066AEA: FS_read (ow_read.c:58)
==16965== by 0x409E26D: fuse_fs_read (in /usr/lib/libfuse.so.2.7.3)
==16965== by 0x40A2A12: (within /usr/lib/libfuse.so.2.7.3)
==16965== by 0x40A5F48: (within /usr/lib/libfuse.so.2.7.3)
==16965== by 0x40A6EAF: (within /usr/lib/libfuse.so.2.7.3)
==16965== by 0x40A86D5: fuse_session_process (in /usr/lib/libfuse.so.2.7.3)
==16965== by 0x40A4AD4: (within /usr/lib/libfuse.so.2.7.3)
==16965== by 0x40C8382: start_thread (in /lib/libpthread-2.7.so)
==16965== Address 0x43b8dc8 is 0 bytes inside a block of size 16 free'd
==16965== at 0x402465C: free (vg_replace_malloc.c:323)
==16965== by 0x41B281A: tdelete (in /lib/libc-2.7.so)
==16965== by 0x405F62B: LockRelease (ow_locks.c:164)
==16965== by 0x40662AD: FS_r_given_bus (ow_read.c:236)
==16965== by 0x40663B2: FS_read_distribute (ow_read.c:191)
==16965== by 0x40668AD: FS_read_postparse (ow_read.c:106)
==16965== by 0x4066AEA: FS_read (ow_read.c:58)
==16965== by 0x409E26D: fuse_fs_read (in /usr/lib/libfuse.so.2.7.3)
==16965== by 0x40A2A12: (within /usr/lib/libfuse.so.2.7.3)
==16965== by 0x40A5F48: (within /usr/lib/libfuse.so.2.7.3)
==16965== by 0x40A6EAF: (within /usr/lib/libfuse.so.2.7.3)
==16965== by 0x40A86D5: fuse_session_process (in /usr/lib/libfuse.so.2.7.3)

Пропатченная версия работает уже 2 часа без проблем. Если до вечера доработает без ошибок напишу в mailing list owfs.

Патч.

P.S. Valgrind показал мемори ликов на 4кб. Надо будет глянуть.. это конечно не 4мб, но если там не дебри, то почему бы не пофиксить...

суббота, 17 мая 2008 г.

!@#@#$@#$

3 часа строить АЧХ на тупой RC фильтр в Altium Desginer пытаясь понять, почему расчетное f=1/RC не работает для R=4.7M и C=2.2uF.. Чтобы потом выяснить, что в нем приставка мега пишется как Meg, а не M. А M на самом деле означает мили... Дошел до этой мысли подставив 4_700_000 вместо 4.7M на третьем часу ударов головой о стену..

воскресенье, 27 апреля 2008 г.

Linux: Thread Priorities in Java

Грустно мне. Приоритеты нитей в linux джава игнорирует.
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4813310

Update: Решение кажется нашел. Разберусь до конца опишу подробнее.

пятница, 18 апреля 2008 г.

1-Wire

В понедельник пришли датчики и адаптеры для организации 1-wire сети. Сегодня протестил датчик температуры - работает :). Правда я вначале протупил и подключил у DS18S20 только две ноги - землю и данные, а оно мне сообщает температуру 85 градусов и не грама больше или меньше. Проипался минут 30, пока случайно в спецификации не заметил, что если дополнительное питание на DS18S20 не подается, то ногу питания надо на землю кидать, а не оставлять болтаться в воздухе. OWFS завелся с пол пинка, приятная софтина и продуманная.

На правах рекламы. Термодатчики покупал на радиорынке - это единственное, что там было. А потом USB адаптер и прочие датчики заказал на http://www.hobby-boards.com очень рад. Хороший магазин, занимающийся продажей элеметнов для умного дома: цены НИЖЕ чем если брать у местных поставщиков (мне вообще только один отозвался), достаточно оперативный и приятный магазин.

воскресенье, 6 апреля 2008 г.

Ускорение JRobin 1.5.8

Уже наверное месяц назад написал патч для JRobin и сегодня вот запостил его в sourceforge для этого проекта. Патч увеличивает производительность раз наверное в 10 при интенсивном использовании CDef'ов и как минимум раза в 1.5 для графиков без CDef'ов. Не знаю включат этот патч в проект или нет - мне пофигу. Также патч расширяет возможности класса Plottable позволяя реалзиовывать графики аналогичнее CDEF'овым, но значительно мощнее и быстрее. Помимо всего этого, имеется возможность рисовать поверх графика все что угодно.

Патч

Sun Tech Days 2008

Сьздил в Питер на сабж. В очередной раз убедился, что на таких конференциях мне делать нечего. Мне нужно на net ехать - я там ничего не знаю. А конференции по Java...? Похоже в области java я и так достаточно осведомлет о всяких там фрэймфорках типа GWT, DOJO, WICKET, JPA, о новинках в Java 5, Java 6, Java 7 на том уровне на котором об этом рассказывают на конференциях. Практически ничего нового я нигде не узнал. Хорошое снотворное - прям какбудто всю ночь учил экзамены.

Из интересных докладов для себя: java hotspot. bpel (хоть я мало че понял), G1.

Пару слов про организацию мероприятия. Жесть. Прям как на концерт Moonspell или Cradle Of Filth. В здание пускали по 10 человек а потом 10 минут перерыва. Перед входом толпа и давка. Внутри очереди на регистрацию и девочки с формами (и в фирменной сановской форме). Везде непрерывно раздавали бланки для участия в викторинах или просто опросники за которые давали призы или сувениры. Мне было вломы заполнять всю эти простыни поэтому я уехал из Питера без: нового рюкзака с логотипом Сан, кружки с логотипом Сан, плюшевого Дюка, футболки и дисков с солярисом.

А вообще хорошо отдохнул. Прям отпуск непредвиденный :). Питер и вправду весь серый. Но только он серый не потому, что старый или построен из строительных материалов такого оттенка. НЕТ. Просто он весь в пыли. Пыль кругом: на стенах, на поручнях, на асфальте, в воздухе...

среда, 13 февраля 2008 г.

YourKit Java Profiler vs JProfiler

Это первое впечатление по вторичным половым признакам. Никакого глубокого анализа :).

1. Лицензия. И тот и тот продукт необходимо покупать. У обоих есть возможность получить eval лицензию, которая дает полную функциональность, но с ограничением по времени. YJP к томуже имеет community лицению, которая выдается по заявке группе разработчиков известного открытого софта.

2. "Тонкости лицензирования". JProfiler проверяет пригодность лицензии как на клиенте так и на агенте (сервере). Поэтому время на сервере в случае использования eval лицензии должно быть актуальным. YJP только на клиентской части.

3. Юзабилити. YJP позволяет настраивать шрифты. Для меня это важно.

В остальном по функциональности они мне показались похожими. На основе этих трех пунктов я уже сделал выбор в пользу YJP :)

воскресенье, 10 февраля 2008 г.

Java 6 & AMD64

JIT в Java 6 update 4 на amd64 ужасно глючная вещь все время где-то падает (например eclipse падает на компиляции класса). Поэтому если нужно юзать java 6 на amd64, а оно падает, то можно заюзать ключик -Djava.compiler=none - это отключает JIT. Если цели использовать именно Java 6 нет, то можно поставить Java 5 update 14 оно вроде бы работает стабильно.

Current thread (0x00002aab2d10e800): JavaThread "CompilerThread1" daemon [_thread_in_native, id=20462, stack(0x00000000406b2000,0x00000000407b3000)]

siginfo:si_signo=SIGSEGV: si_errno=0, si_code=1 (SEGV_MAPERR), si_addr=0x0000000000000000

Registers:
RAX=0x0000000000000000, RBX=0x00002aab311cc4d8, RCX=0x00002aab3137e9b0, RDX=0x0000000000000046
RSP=0x00000000407aee70, RBP=0x00000000407aeee0, RSI=0x00002aab3137e9b0, RDI=0x00002aab311cc4d8
R8 =0x00002aab3137ea08, R9 =0x00002aab3137e9b0, R10=0x00002aab3137e9b0, R11=0x0000000000000000
R12=0x00002aab311cc4a0, R13=0x0000000000000000, R14=0x00002aab2cd3b870, R15=0x0000000000000001
RIP=0x00002b5f70ae122a, EFL=0x0000000000010246, CSGSFS=0x0000000000000033, ERR=0x0000000000000004
TRAPNO=0x000000000000000e

Top of Stack: (sp=0x00000000407aee70)
0x00000000407aee70: 00002aab30548b88 00000001ffffffff
0x00000000407aee80: 00002aab3137e9b0 0000000270a85331
0x00000000407aee90: 00002aab30548b80 00000007407afaa0
0x00000000407aeea0: 00000000407afb68 01000000000004a7
0x00000000407aeeb0: 00000000407afaa0 00002b5f7112a4f0
0x00000000407aeec0: 00000000407afaa0 00000000407af030
0x00000000407aeed0: 00000000407aeff0 00000000407aefc0
0x00000000407aeee0: 00000000407af100 00002b5f70ae076c
0x00000000407aeef0: 00000000407afb68 00000000407af0b0
0x00000000407aef00: 00002aab330b0fb0 00002aab30000020
0x00000000407aef10: 00000000407aef80 00002b5f711438d0
0x00000000407aef20: 00002aab307d8a20 0000000000000151
0x00000000407aef30: 00000000407afbc0 00002b5f70608bbc
0x00000000407aef40: 00000000407b2950 00000000407aef80
0x00000000407aef50: 00002b5f71146040 00002aab3100b990
0x00000000407aef60: 0000000000000151 00002b5f70f1a9d2
0x00000000407aef70: 0000000040110b90 00002b5f70f1aaa1
0x00000000407aef80: 00000000407b2950 00000000407aefc0
0x00000000407aef90: 00002b5f71146040 0000000000007fe8
0x00000000407aefa0: 00002aab307f5d10 00002b5f70f1a9d2
0x00000000407aefb0: 0000000040110b90 00002b5f70f1aaa1
0x00000000407aefc0: 00002b5f7112a4f0 00002b5f0000000e
0x00000000407aefd0: 00000000407b1450 00000000407afaa0
0x00000000407aefe0: 00000000000008c8 00002aab2d10ec70
0x00000000407aeff0: 000000000000000d 00000000407b1450
0x00000000407af000: 00002aab32c78490 00002b5f70a84d00
0x00000000407af010: 00002aab311bd4b0 00000000000004a8
0x00000000407af020: 00000000407af0b0 00002aab332443e0
0x00000000407af030: 000000000000000c 00000000407b1450
0x00000000407af040: 00002aab3178f090 00002aab31ce1aa0
0x00000000407af050: 00002aab3184eb70 00002aab3184f6b0
0x00000000407af060: 00002aab330c8c60 00000000407afbc0

Instructions: (pc=0x00002b5f70ae122a)
0x00002b5f70ae121a: 48 89 cf 41 ff 95 80 00 00 00 48 89 df 49 89 c5
0x00002b5f70ae122a: 8b 00 41 21 44 24 38 41 8b 45 04 21 43 04 41 8b
Stack: [0x00000000406b2000,0x00000000407b3000], sp=0x00000000407aee70, free space=1011k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V [libjvm.so+0x1f122a]
V [libjvm.so+0x1f076c]
V [libjvm.so+0x244525]
V [libjvm.so+0x241035]
V [libjvm.so+0x1e05c7]
V [libjvm.so+0x248ec8]
V [libjvm.so+0x248866]
V [libjvm.so+0x62a3f9]
V [libjvm.so+0x6246a1]
V [libjvm.so+0x505eea]


Current CompileTask:
C2:581 org.eclipse.core.internal.dtree.DataTreeNode.forwardDeltaWith([Lorg/eclipse/core/internal/dtree/AbstractDataTreeNode;[Lorg/eclipse/core/internal/dtree/AbstractDataTreeNode;Lorg/eclipse/core/internal/dtree/IComparator;)[Lorg/eclipse/core/internal/dtree/AbstractDataTreeNode; (469 bytes)

пятница, 8 февраля 2008 г.

VNC

Посвящается тем, кто как я (до того как составил таблицу) мучается со вводом русских букв из виндового vncclient'а при работе на юниксовом vncserver'е.

Самое простое решение, что я нашел, без всяких извратов и прочего - это:
1-х. Нужно составить таблицу соответствия виндовых keysym'ов к keysym'ам linux'a и запускать vnc4 с аргументом -RemapKeys, так у меня получилось вот что:
0xb8->0x6a3,0xe9->0x6ca,0xf6->0x6c3,0xf3->0x6d5,
0xea->0x6cb,0xe5->0x6c5,0xed->0x6ce,0xe3->0x6c7,0xf8->0x6db,
0xf9->0x6dd,0xe7->0x6da,0xf5->0x6c8,0xfa->0x6df,
0xf4->0x6c6,0xfb->0x6d9,0xe2->0x6d7,0xe0->0x6c1,
0xef->0x6d0,0xf0->0x6d2,0xee->0x6cf,0xeb->0x6cc,
0xe4->0x6c4,0xe6->0x6d6,0xfd->0x6dc,0xff->0x6d1,
0xf7->0x6de,0xf1->0x6d3,0xec->0x6cd,0xe8->0x6c9,
0xf2->0x6d4,0xfc->0x6d8,0xe1->0x6c2,0xfe->0x6c0,
0xa8->0x6b3,0xc9->0x6ea,0xd6->0x6e3,0xd3->0x6f5,
0xca->0x6eb,0xc5->0x6e5,0xcd->0x6ee,0xc3->0x6e7,
0xd8->0x6fb,0xd9->0x6fd,0xc7->0x6fa,0xd5->0x6e8,
0xda->0x6ff,0xd4->0x6e6,0xdb->0x6f9,0xc2->0x6f7,
0xc0->0x6e1,0xcf->0x6f0,0xd0->0x6f2,0xce->0x6ef,
0xcb->0x6ec,0xc4->0x6e4,0xc6->0x6f6,0xdd->0x6fc,
0xdf->0x6f1,0xd7->0x6fe,0xd1->0x6f3,0xcc->0x6ed,
0xc8->0x6e9,0xd2->0x6f4,0xdc->0x6f8,0xc1->0x6e2,
0xde->0x6e0


2-х. Нужно сообщить xmodmap'у о том, какие символы он должен знать аутофбокс так сказать. vncserver конечно и сам их добавить может, но он сопровождает это сообщениями да и заглавные литеры при этом себя ведут не очень хорошо. Так что лучше все-таки заранее добавить. Я поместил в ~/.vnc/xstartup вот такие строки:
xmodmap -e "keycode 252 = Cyrillic_shorti Cyrillic_SHORTI"
xmodmap -e "keycode 251 = Cyrillic_tse Cyrillic_TSE"
xmodmap -e "keycode 250 = Cyrillic_u Cyrillic_U"
xmodmap -e "keycode 249 = Cyrillic_ka Cyrillic_KA"
xmodmap -e "keycode 248 = Cyrillic_ie Cyrillic_IE"
xmodmap -e "keycode 247 = Cyrillic_en Cyrillic_EN"
xmodmap -e "keycode 246 = Cyrillic_ghe Cyrillic_GHE"
xmodmap -e "keycode 245 = Cyrillic_sha Cyrillic_SHA"
xmodmap -e "keycode 244 = Cyrillic_shcha Cyrillic_SHCHA"
xmodmap -e "keycode 243 = Cyrillic_ze Cyrillic_ZE"
xmodmap -e "keycode 242 = Cyrillic_ha Cyrillic_HA"
xmodmap -e "keycode 241 = Cyrillic_hardsign Cyrillic_HARDSIGN"
xmodmap -e "keycode 240 = Cyrillic_ef Cyrillic_EF"
xmodmap -e "keycode 239 = Cyrillic_yeru Cyrillic_YERU"
xmodmap -e "keycode 238 = Cyrillic_ve Cyrillic_VE"
xmodmap -e "keycode 237 = Cyrillic_a Cyrillic_A"
xmodmap -e "keycode 236 = Cyrillic_pe Cyrillic_PE"
xmodmap -e "keycode 235 = Cyrillic_er Cyrillic_ER"
xmodmap -e "keycode 234 = Cyrillic_o Cyrillic_O"
xmodmap -e "keycode 233 = Cyrillic_el Cyrillic_EL"
xmodmap -e "keycode 232 = Cyrillic_de Cyrillic_DE"
xmodmap -e "keycode 231 = Cyrillic_zhe Cyrillic_ZHE"
xmodmap -e "keycode 230 = Cyrillic_e Cyrillic_E"
xmodmap -e "keycode 229 = Cyrillic_io Cyrillic_IO"
xmodmap -e "keycode 228 = Cyrillic_ya Cyrillic_YA"
xmodmap -e "keycode 227 = Cyrillic_che Cyrillic_CHE"
xmodmap -e "keycode 226 = Cyrillic_es Cyrillic_ES"
xmodmap -e "keycode 225 = Cyrillic_em Cyrillic_EM"
xmodmap -e "keycode 224 = Cyrillic_i Cyrillic_I"
xmodmap -e "keycode 223 = Cyrillic_te Cyrillic_TE"
xmodmap -e "keycode 222 = Cyrillic_softsign Cyrillic_SOFTSIGN"
xmodmap -e "keycode 221 = Cyrillic_be Cyrillic_BE"
xmodmap -e "keycode 220 = Cyrillic_yu Cyrillic_YU"

понедельник, 21 января 2008 г.

WayBack

Иногда возникает необходимость запустить приложение не в настоящем времени, а в прошлом или будущем. Обычно это нужно для тестирования приложения или для обхода устаревания evaluation license. Достигается это переводом системных часов, либо запуском приложения в vmware - оба этих метода имеют свои очевидные недостатки. К счастью в linux есть такая замечательная вещь как LD_PRELOAD, позволяющяя "переопределить" импортируемые функции приложения. Так, например, если подменить time, gettimeofday и clock_gettime - то программа с большой долей вероятности будет жить в том времени который нам нужен, в то время как вся остальная система будет жить в обычном временном русле. Для этих целей я написал небольшую C'ную библиотеку. Устанавливается библиотека как обычно make install.

Для примера, небольшое тестовое приложение на C:

void main () {
printf ("%lu\n", time(0));
}

Запускаем:

akshaal@...:/tmp% ./test
1200947571

akshaal@...:/tmp% WAYBACK_TODAY=1970.01.01 LD_PRELOAD=libwayback.so.0 /tmp/test
63225

akshaal@...:/tmp% WAYBACK_LOG_LEVEL=3 WAYBACK_TODAY=1970.01.01 LD_PRELOAD=libwayback.so.0 /tmp/test
Delta time: 3094082896
time modified
63257


Библиотека libwayback не возвращает константу. После запуска, она определяет разницу между текущим временем и желаемым и запоминает ее как delta. В дальнейшем все вызовы к функция возвращающим время перехватываются и delta прибваляется к результату. Таким образом время не стоит на месте и в то же время она очень близко к желаемому.

Например приложение на Java и стандартная утилита date:

import java.util.Date;

public class test {
public static void main (String[] args) {
System.out.println (new Date());
}
}

akshaal@...:/tmp% java test
Mon Jan 21 22:39:26 EET 2008

akshaal@...:/tmp% WAYBACK_TODAY=2010.11.27 LD_PRELOAD=libwayback.so.0 java test
Sat Nov 27 20:40:39 EET 2010

akshaal@...:/tmp% date
Mon Jan 21 22:41:20 EET 2008

akshaal@...:/tmp% WAYBACK_TODAY=2010.11.27 LD_PRELOAD=libwayback.so.0 date
Sat Nov 27 20:41:50 EET 2010


К сожалению данный способ может быть использован для обхода устаревания лицензии :) у программ к которым есть evaluation license ограниченная на определенный срок (например JProfiler 5, YourKit Profiler 7, InteliJ Idea и еще много). Я не проверял работает ли (но уверен, что да :) ) ибо предпочитаю опенсоурс софт и вообще это плохо и я против использования библиотеки для этих целей :).

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

Библиотека написана за час и не является Абсолютным Решением. Кому надо - юзают на свой страх и риск, а с меня никакого спросу.

P.S. Больше всего напарился с одной вещью. Запускаю свинговое приложение, а оно виснет. Думаю че за нахрен. Копался-копался... оказывается java юзает pthread_condwait и ей в качестве параметра передается не относительное время (время когда ожидание прекращается), а абсолютное! Пришлось и эту функцию переопределить и вычитать дельту. Но как я искал.. strace говорит, что нить висит на futex каком-то.. и только чудом догадался, что futex может быть более нижним лаером под pthread'ом, а там уже полез смотреть как работа с X'ами идет в libawt.

четверг, 17 января 2008 г.

Scala - первое впечатление

Technology stack: java, spring framework, maven, eclipse, jboss

Все состыковалось нормально, но разочарований пока больше:
1. Поддержка Scala в eclipse'е просто никакая. Подсвечивает двумя цветами, комплишенов нет, рефакторинга нет, навигации нет. Может я что-то не правильно сделал с плагином, но для первого впечатления я бы сказал, что поддержки вообще нет.

2. Maven2 нормально собирает Scala, но нужно обязательно Maven 2.0.7 или выше. Сначало собираются все Java классы, а потом Scala. Поэтому врятли получится из Java сослаться на Scala класс. Это в пределах одного проекта. Если нужно наоборот, то надо делать два разных под модуля. А если в перемешку охото - вообще не знаю как (правда и желание левое).

3. Spring'у вобще-то пофиг инстансы какого класса делать. Главное, чтобы геттеры были. Какой-то особенной поддержки для scala в спринге нет (в отличии от BSH, Groovy и еще чего-то (jruby или jpython)).

4. Каким-то странным образом Scala делает getter'еры и setter'ы для переменных класса. То делает, то нет. Например для java.lang.Map не сделала. А для scala.collection.jcl.Map - сделала что-то типа setVar... Я сначало губу расскатал, думаю вот, наконец то не надо геттеры и сеттеры руками делать. А хрен. По умолчанию не делает само. Если в еклипсе это хотя бы для джавы двумя кликами делается, то тут это еще и руками писать вида: def getVar () = var.

5. Про override не понял. В примере override нарисован - у меня он говорит мол не ожидаю я тут override увидеть....

6. Интеграция с Java. Думаю да, клево, есть imlicit методы - значит наверное все круто и просто. Нефига. Все равно врапперы надо делать, чтобы из java Map получить scala Map. И trait scala Map не совместим с interface java Map.

7. Пишу val pending : List[(=>Unit)] = Nil; Определил. А вот pending = (println "") :: pending -- ругается, что (println "") - это Unit, а ему нужен =>Unit. lazy val v = println "" и последующий pending = v :: pending; тоже самое. v видетели Unit. Забил, сделал val pending : List[() => Unit] = Nil ... но осадок остался.

Понятно, что часть этой фигни - по моей неопытности и незнанию и наверняка решается. Но всеже.. )
Из приятного: type inference это хорошо, замыкания это хорошо, карринг это хорошо. Экономия кода не большая по сравнению с джавой, но она есть. Код чище, если на врапперы не втыкать. А если использовать приемущественно одну Scala, то вообще красота по чистоте будет.

P.S. Тут на работе постоянно бухтят о коллбэках в моем API и пытаются от них избавится... :) А буть скала, было бы это scala:
helper.runInScope (scope) {
println ("Hello world");
}


вместо:
helper.runInScope (scope, new Callback0 () {
public void run () {
println ("hello world");
}
});


Но scala там не быть :))

вторник, 8 января 2008 г.

CAL & Scala

Решил заюзать что-то отличное от Java для своего очередного домашнего хобби проекта (ну и изучить новую технологию как обычно...). Впечатление после чтения документация во время прибывания в Омске.

CAL (Quark Framework) - прикольно все-таки, что это Haskell для Java, но вот что-то интеграция с Java меня не впечатлила - чисто на урове FFI как в Haskell. Как домэйн язык оно может и удобно, но как полная замена Java не катит. Правда сильно не вчитывался - может и не прав.

Scala - весмьа красиво и многообщеюще. Почему-то постоянно слышал про этот язык несколько лет назад, когда читал рассылку O'Caml, но ни разу Scala не удосужился попробовать. А зря, весьма элегантно. Немного расстроило отсутствие поддержи Scripting for Java (не помню номер JSR).

суббота, 5 января 2008 г.

CollectD

Грубо говоря - ни дня без патчей (хотя бы так, чем ничего). Провозившись с collectd нашел ошибку. Исправил. Патч (аж из трех новых строк) отослал. Может кто-то тоже возится, пытаясь понять, почему unixsock plugin для collectd не проставляет права на socket.
diff -urN old/src/unixsock.c new/src/unixsock.c
--- old/src/unixsock.c 2007-11-10 17:15:39.000000000 +0200
+++ new/src/unixsock.c 2008-01-05 20:45:17.000000000 +0200
@@ -29,6 +29,7 @@
#include <pthread.h>

#include <sys/socket.h>
+#include <sys/stat.h>
#include <sys/un.h>

#include <grp.h>
@@ -365,6 +366,8 @@
return (-1);
}

+ chmod (sa.sun_path, sock_perms);
+
status = listen (sock_fd, 8);
if (status != 0)
{