четверг, 28 декабря 2006 г.

Впечатление о Motorola Pebl U6

+ цена 120$
+ bluetooth
+ gprs / edge
+ маленький
+ приятный
+ оригинальный
+ miniusb
- интерфейс не логичен
- как отправлять с телефона фалы я не нашел
- эксплорера фс на самом телефоне тоже не нашел
- бедный набор bluetooth сервисов
- куда после пробывания новой симки и установки старой пррпали смс и телефонные номера набранные ранее - я не понимаю... и по этой причине вообще сижу без единого контакта...

Цену телефон свою оправдывает. Если удастся синхронизировать телефон с кпк - будет вообще здорово.

четверг, 14 декабря 2006 г.

Восстановление после чистки

Если вы обладатель КПК, то наверняка слышали про утилиты MemMaid или SKTools, а значит этот пост для вас. Если вы к тому-же не только слышали, но еще и пользуетесь, то это 100% для вас. Если вы не только пользуетесь одной из этих программ, но еще и по глупости полностью почистили Notification Queue и не знаете как заставить КПК работать - как раз об этом и пойдет речь.
1. Почему это проблема? Notification queue (очередь уведомления, NQ) говорит КПК какое действие необходимо выполнить когда какое-то событие произошло. Например, если вы включаете КПК, то это событие AppRunAtWakeup (или типа того). КПК не будет ничего делать по событиям, если вы почистили NQ. Самое главное, что вы не сможете даже приконнектится своим КПК к ПК с помощью обычных USB, IR, RS232. Это означает, что вы не сможете синхронизировать ваш КПК с ПК, а также не сможете его поэксплорить с вашего большого компьютера.

2. Как я могу это вылечить? Простой путь - это восстановить состояние КПК из резервной копии. Очень хорошо иметь такую свежую копию :)))).

3. У меня нет резервной копии... не совсем так... есть, но она древняя, что я могу сделать в этом случае? Вы можете сделать аппаратный сброс (Hard Reset, XР). Но все же лучше восстановится из бэкапа, даже если он у вас древний.

4. Я не хочу делать ХР или восстанавливаться из резервной копии! Да, я тоже. Тогда мы должны добавить события в NQ вручную.

5. Какие события я должен добавить? Чтобы узнать список событий вы можете: сделать бэкап, сделать ХР, установить SKTools и записать список событий из очереди уведомления, затем восстановится из бэкапа. Или вы можете найти список для вашего КПК в интернете. В моем случае, я посмотрел на КПК моей жены. У нее КПК почти такой же как у меня (у нее C550, у меня N560).

6. Как добавить события в NQ? SKTools - лучшее что я видел для этих целей.

7. Мне нужно добавить "\windows\repllog.exe AppRunAfterRndisFnDetected", но SKTools не имеет события "AppRunAfterRndisFnDetected"! Да! Это сейчас основная проблема.
Я потратил четыре дня, чтобы найти такую программу, которая бы позволяла мне добавить это событие. Но я не нашел. Не было такой программы. Поэтому я написал свою. Вот она: http://toril.ru/soft/akrndisadd.exe. Просто запустите ее на КПК. Она должна показать "True", если событие было успешно добавлено.

8. Как я могу поместить эту программу на КПК, если я не могу посмотреть содержимое моего КПК с ПК, пока это событие не добавлю? Вы можете переместить программу с помощью Bluetooth, WIFI, MMC/SD/CF карты, инфракрасного порта или RS232 :).

Исходники akrndisadd
#include "stdafx.h"
#include <windows.h>
#include <commctrl.h>
#include <notify.h>

int _tmain(int argc, _TCHAR* argv[])
{
TCHAR *r = TEXT ("False");

// This API is deprecated. I know.
if (CeRunAppAtEvent (TEXT("\\windows\\repllog.exe"), 14L)) {
r = TEXT ("True");
};

MessageBox (NULL, r, r, MB_OKCANCEL | MB_ICONEXCLAMATION);
return 0;
}

четверг, 19 октября 2006 г.

Устали ждать обновление Debian пакета?

Оказывается в debian'е пакеты можно не только собирать из исходников, а еще эти исходники можно обновлять до upstream версии с сайта автора, а потом собирать deb пакет.

akshaal@akshaal:/tmp% apt-get source libtorrent9
Чтение списков пакетов... Готово
Построение дерева зависимостей... Готово
Нужно загрузить 472kB архивов с исходными текстами.
Получено:1 http://debian.org.ua unstable/main libtorrent 0.10.2-1 (dsc) [634B]
Получено:2 http://debian.org.ua unstable/main libtorrent 0.10.2-1 (tar) [453kB]
Получено:3 http://debian.org.ua unstable/main libtorrent 0.10.2-1 (diff) [18,2kB]
Получено 472kB за 3s (143kB/c)
gpg: Подпись создана Чтв 21 Сен 2006 07:41:55 EEST ключом DSA с ID 1880283C
gpg: Не могу проверить подпись: открытый ключ не найден
dpkg-source: extracting libtorrent in libtorrent-0.10.2
dpkg-source: unpacking libtorrent_0.10.2.orig.tar.gz
dpkg-source: applying ./libtorrent_0.10.2-1.diff.gz

akshaal@akshaal:/tmp% cd libtorrent-0.10.2

akshaal@akshaal:/tmp/libtorrent-0.10.2% uscan
libtorrent: Newer version (0.10.3) available on remote site:
http://libtorrent.rakshasa.no/downloads/libtorrent-0.10.3.tar.gz
(local version is 0.10.2)
libtorrent: Successfully downloaded updated package libtorrent-0.10.3.tar.gz
and symlinked libtorrent_0.10.3.orig.tar.gz to it

akshaal@akshaal:/tmp/libtorrent-0.10.2% uupdate ../libtorrent-0.10.3.tar.gz
New Release will be 0.10.3-1.
-- Untarring the new sourcecode archive ../libtorrent-0.10.3.tar.gz
Success! The diffs from version 0.10.2-1 worked fine.
Remember: Your current directory is the OLD sourcearchive!
Do a "cd ../libtorrent-0.10.3" to see the new package

akshaal@akshaal:/tmp/libtorrent-0.10.2% cd ../libtorrent-0.10.3/

akshaal@akshaal:/tmp/libtorrent-0.10.3% dpkg-buildpackage -rfakeroot -us -uc

вторник, 17 октября 2006 г.

JCA

Допустим мы пишем JCA RA который поддерживает исходящие соединения к EIS. Все написали. Верифицировали. Продеплоили в GlassFish. Все OK. Теперь продеплоили какое-то приложение, чтобы протестировать соединение к EIS. Запускаем. А оно нам @#%!: "Exception in NamingManagerImpl copyMutableObject() ... java.io.NotSerializableException".
Покопавшись мы выясняем, что падение происходит при копировании нашей имплементации java.resource.cci.ConnectionFactory интерфейса. А имеено в нашем классе ConnectionFactoryImpl есть не Serealizable поле, например ManagedConnectionFactory (содержащая сокет например). Убив N часов времени на поиски в гугле, выясняем, что GlassFish в JNDI помещает копии объектов! Наматерившись и решив, что разработчикам JNDI реализации виднее, мы делаем неугодное в ConnectionFactoryImpl поле transient'ым. А вдруг этот объект будет использоваться, только чтобы getReference вызвать? Хрен там. Повозившись еще, оказывается, что dependency injection отдает нам именно копию из JNDI у которой наше transient поле установленно в NULL!

Даём GlassFish'у последний шанс. Читаем его исходники и оказывается, что не все объекты помещаются в JNDI в сереализованном виде. Так например Connector'ы должны помещаться не сереализованными! Хм, а как же оно определяет, что этот объект коннектор? А вот как:

private boolean isConnector(String logicalJndiName){
return (logicalJndiName.indexOf(EIS_STRING)!=-1);
}
где EIS_STRING = "/eis/".

Короче, чтобы не иметь лишний геморрой: ConnectionFactory экземпляры должны помещаться в субконтексте /eis/ ! Если теперь поискать в гугле по словам "eis subcontext" то находятся рекомендации, а не требования!.

Вообще, это частая ошибка, проявляется в виде NPE (null pointer exception) при вызове transient полей (activemq этим страдает). Мне кажется, в ConnectionFactoryImpl разумно вставить:

/**
* Ensure that managedConnectionFactory is not null.
* @throws ResourceException if managedConnectionFactory is null.
*/
protected void ensureManagedConnectionFactory () throws ResourceException {
if (this.managedConnectionFactory == null) {
throw new ResourceException (
"No reference to managed connection factory exists."
+ " Either it is a bug of the RA or your JNDI resource"
+ " is not in the /eis/ subcontext");
}

и вызывать этот метод перед использованием this.managedConnectionFactory внутри ConnectionFactoryImpl.

среда, 11 октября 2006 г.

Из спецификации по JNI

"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."

понедельник, 9 октября 2006 г.

Смысл javax.resource.cci.*

Я наконец-то понял зачем нужен CCI. Все время казалось, что из-за него в простых RA много ненужного кода. А теперь ощутил зачем этот CCI нужен.

Если реализовывать RA без CCI, то наш MCF возвращает CF который не CCI-compliant, а тот уже в свою очередь по запросу RA клиента делегирует обращение в RM и получает соединение к RA отдавая его клиенту. Все просто и хорошо, но:
- в этом случае мы не может использовать DI, оказывается @Resource работает только для набора предопределенных интерфейсов (типа тогоа же CCI CF), поэтому CF придется ручками из JNDI доставать.
- если RA не продеплоена как EAR, а задеплоена в виде одельного RAR файла и клиент RA задеплоен соответственно как отдельный JAR, то, чтобы клиент мог использовать наш собственный CF, у него должен быть на руках интерфейс этого CF. В случае CCI CF этого не требуется, так как CCI CF определен в java.resource.cci.
- наверное есть еще что-то, но мне хватило этого

Доздравствует CCI!

четверг, 5 октября 2006 г.

SUNWappserver uninstall

Если кто-то пытается переустановить Sun Application Server 9.0 Platform Edition и у него не получается это в течении часа (то already installed, то unexpected exception), то стоит грохнуть нахрен (или аккуратно почистить) /var/tmp/productregistry или /tmp/productregistry.

Навеяно вот этим советом в котором неправильно указан путь.