Thursday, March 5, 2009

Розбираємо результат Yahoo geocodes

Є у Yahoo такий сервіс, як по адресі визначити географічні координати місця. Причому задавати можна досить загальну адресу. Наприклад при пошуку за адресою Kiev вертаються координати приблизно Бессарабського ринку. Детальніше про сам сервіс можна прочитати тут.
Результат цей сервіс повертає в XML форматі.
<?xml version="1.0"?>
<ResultSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:yahoo:maps"
xsi:schemaLocation="urn:yahoo:maps http://api.local.yahoo.com/MapsService/V1/GeocodeResponse.xsd">
<Result precision="zip">
<Latitude>50.441380</Latitude>
<Longitude>30.522495</Longitude>
<Address></Address>
<City>Kiev</City>
<State>Ukraine</State>
<Zip></Zip>
<Country>UA</Country>
</Result>
</ResultSet>
Щоб дістати значення Latitude і Longitude використаємо XPath. Так як в xml вказаний namespace, то потрібно врахувати це при створені документу
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true); //вмикаємо підтримку namespace
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse(inputStream);
а також при написанні xpath запиту - хоч в самому xml документі перфікс дефолтового namespace не вказується для тегів, при написанні xpath запитів їх потрібно вкзувати. В нашому випадку превіксом являється urn:yahoo:maps. Таким чином запит для отримання значення Latitude буде мати вигляд
//urn:yahoo:maps:Result/urn:yahoo:maps:Latitude
Часом в результаті може бути кілька записів, наприклад в різних країнах можуть бути міста з однаковою назвою. В такому випадку до запиту можна добавити фільтр який буде вибирати тільки результати з України
//urn:yahoo:maps:Result/urn:yahoo:maps:Latitude[following-sibling::urn:yahoo:maps:State='Ukraine']

Thursday, January 22, 2009

Налаштування прінтера HP 1018 в MacOSX 10.4

Не знаю чим керувалася HP, але якщо з прінтерами LaserJet 1010, 1012 на диску були драйвера для мака, то з новими прінтерами LaserJet 1018, 1020 драйверів крім як для вінді більше ніяких немає. Тому щоб заставити ці прінтери все таки працювати на маках потрібно встановити відкриті драйвера з пакету foo2zjs. Але цей пакет залежить ще від пакетів foomatic-rip та ghostscript. Актуальні лінки на пакети можна отримати тут. Але встановити пакети і вибрати відповідний драйвер це ще не все. Потрібно ще підправити firmware для прінтера. Для цього зкачуємо архів sihp1018.tar.gzв якому знаходиться файл sihp1018.img. В складі пакету foo2zjs є команда arm2hpdl яка зконвертує файл sihp1018.img в потрібний для прінтеру формат. Для цього виконуємо в терміналі команду:
arm2hpdl sihp1018.img > sihp1018.dl
Тепер тільки залишилося відправити цей файл на прінтер, для цього виконуємо команду
lp -oraw sihp1018.dl
Єдиний мінус - останню команду потрібно буде виконувати кожен раз коли включаєте прінтер.

Sunday, November 16, 2008

Підключаємося до транзакції

Часом в проекті з CMT бінами потірібно працювати з ресурсами які немають підтримки JTA, але мають підтримку двофазних транзакцій (Наприклад з бінів потрібно робити запити до CORBA ресурсів). В таких випадках трохи не зрозуміло де для таких ресурсів потрібно починати і закінчувати транзакцію. І тут на допомогу приходить інтерфейс javax.transaction.Synchronization. Його реалізацію можна зареєструвати в поточній транзакції і відслідковувати коли визвати першу і другу фазу коміту. Отже реалізація має бути типу
public class MyResourceSynchronization implements Synchronization{
public void beforeCompletion() {
    myResource.validate();
}
public void afterCompletion(int status) {
    if(status==Status.STATUS_ROLLEDBACK)
        myResource.rollback();
    else
        myResource.commit();
}}
і чіпляємо його до транзакції наспуним чином
TransactionManager manager=(TransactionManager)sessionContext.getUserTransaction();
manager.getTransaction().registerSynchronization(new MyResourceSynchronization());

Wednesday, November 5, 2008

Toplink Essentials в Resin 2 і не тільки

В продовження теми Toplink Essentials on Caucho Resin.

Як відомо Toplink Essentials являється Reference Implementation специфікації JPA і тому підтримує буквально два сервери - це SunAS9 i OC4J_10_1_3. Щоб пересвітчитись достатньо заглянути в клас oracle.toplink.essentials.config.TargetServer. З рештою серверів Toplink працює як в середовищі без підтримки JTA (при коміті ejb транзакції Toplink зміни в базу не синхронізує). 

Щоб добавити підтримку JTA для свого сервера потрібно створити два класи - перший це клас, що серверну платформу і повинен реалізовувати інтерфейс oracle.toplink.essentials.platform.server.ServerPlatform, як початковуреалізацію можна взяти клас oracle.toplink.essentials.platform.server.ServerPlatformBase. Головним методом в цьому класі є getExternalTransactionControllerClass, який повертає клас що вміє для конкретного сервера шукати референс на javax.transaction.TransactionManager. В нашому випадку це другий клас який потрібно сворити і наслідує він oracle.toplink.essentials.transaction.JTATransactionController. 

Назвемо перший клас ResinServerPlatform, а другий ResinTransactionController. ResinTransactionController повинен переопреділити метод acquireTransactionManager наступним чином

protected TransactionManager acquireTransactionManager() throws Exception {
  return (TransactionManager)jndiLookup("java:comp/UserTransaction");
 }

Тепер залишилося в persistence.xml прописати для властивості toplink.target-server значення ResinServerPlatform.

Я не наводжу повних кодів для класів, так як достатньо в сорцах подивитися на реалізацю oracle.toplink.essentials.platform.server.sunas.SunAS9ServerPlatform та oracle.toplink.essentials.transaction.sunas.SunAS9TransactionController і все стане зрозуміло.

Monday, November 3, 2008

Javahl в SVN плагіні для eclipse

В tigris є хороший плагін для екліпси, який може працювати як на явовському клієнті так і на натівному. Щоб активувати натівний клієнт, потрібно встановити пакет libsvn-java, а в eclipse.ini прописати -Djava.library.path=/usr/lib/jni.

Saturday, October 25, 2008

Встановлюємо Plone для дівелопінгу

Звичайно можна просто скачати уже готовий пакет з сайту плона і встановити його чи з репозиторія лінукса. Але якщо хочеться не просто поклацати лінки в порталі, а й щось під нього написати, то потрібно мати правильно налаштоване середовище для розробки.
Plone працює поверх Zope2 який ще не підтримує python2.5, а тому у вашій системі повинен бути встановлений python2.4. Для роботи з картинками потрібно щоб була встановлена бібліотека Python Image Library, а для роботи з XML - elementtree. Обидві бібліотеки як правило є в репозиторії дистрибутиву. Тепер скачаємо і виконаємо крипт який створить структуру директорій і згенерує файл конфігурація на основі якого можна буде збирати ізапускати плон зі своїми власнописаними плагінами(продуктами).
$ wget http://peak.telecommunity.com/dist/ez_setup.py
$ python ez_setup.py
$ easy_install ZopeSkel
Скрипт скачаний і встановлений в систему, тепер генеруємо структуру директорій
$ paster create -t plone3_buildout myproject
Щоб запустити проект його потрібно зібрати, для цього виконуємо
$ cd myproject
$ python bootstrap.py
$ ./bin/buildout
Всі заптання можна залишити з дефолтовими значеннями. Так як ми не вказували шлях до Zope i Plone, то вони будуть скачані і зібрані автоматично.
Тепер просто запускаємо Plone
$ ./bin/instance fg
а в браузері відкриваємо http://localhost:8080

Wednesday, October 22, 2008

Портал

Передивився недавно кучу портальних движків, шукав щось таке, що має вже більш чи меньш закінчений вигляд, і щоб можна було налаштувати під свої потреби. Серед всього того розмаїття особливо хотілось би відмітити два портали - це LifeRay написаний на яві та Plone написаний на пітоні. Якщо LifeRay - це портал в повному розумінні цього слова з підтримкою організай та комуніті, то Plone - це крім портала ще й cms.

Особисто для себе я вибрав Plone, так як дівелоперської доки під нього більше, тай ще існує така чудова книга Мартіна Аспелі як "Professional Plone Development", в якій крок за кроком описані всі стадії розробки під Plone і після її прочитання стає дуже легко і зрозуміло орієнтуватися в документації, що є на сайті. Рекомендую починати вивчення плона саме з цієї книги.