<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DkUAQnk8fyp7ImA9WhRQFk8.&quot;"><id>tag:blogger.com,1999:blog-30809594</id><updated>2011-12-11T21:24:03.777+04:00</updated><category term="параллельное программирование" /><category term="бэкап" /><category term="linux" /><category term="баги браузеров" /><category term="GWT" /><category term="заметки на полях" /><category term="javascript" /><category term="java" /><category term="mysql" /><category term="ajax" /><category term="perl" /><category term="sqlite" /><category term="GAE" /><category term="tomcat" /><category term="защита от seo-спама" /><category term="тестирование" /><category term="логирование" /><category term="ООП" /><category term="отладка" /><category term="C++" /><category term="seo" /><category term="perl тусовки" /><category term="lwp" /><category term="captcha" /><category term="guice" /><category term="perl полезняшки" /><category term="gcc" /><category term="vim" /><category term="языки программирования" /><category term="SOCKS" /><title>Псевдоэкспертные заметки технаря</title><subtitle type="html">Заметки о программировании, стандартах, методиках и т.п.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://pseudo-tech-notes.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://pseudo-tech-notes.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Лаврентий Палыч</name><uri>http://www.blogger.com/profile/12257889673961252182</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_cR10U53OBxA/R8Xau9PAqjI/AAAAAAAAANg/0ZwZ5RO3MZY/S220/pic1.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>57</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/pseudo-tech-notes" /><feedburner:info uri="pseudo-tech-notes" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>55.75</geo:lat><geo:long>37.5833</geo:long><feedburner:emailServiceId>pseudo-tech-notes</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;DUEBQXo-eCp7ImA9WhdVF0U.&quot;"><id>tag:blogger.com,1999:blog-30809594.post-6047836011769265902</id><published>2011-09-23T18:01:00.000+04:00</published><updated>2011-09-23T18:20:50.450+04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-23T18:20:50.450+04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="логирование" /><category scheme="http://www.blogger.com/atom/ns#" term="C++" /><title>Логирование в С++. Сравнительный мини-обзор</title><content type="html">Вполне стандартная задача(логирование)&amp;nbsp;имеет слишком много инструментов для решения в C++. В том плане что ярко выраженного лидера нет(ну если не считать за лидера "свой велосипед"). Пришлось мне ковыряться. Дело усугубилось тем что среди c++ девелоперов очень много людей считающих что подробная документация не нужна (кому надо - в исходник заглянут).&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
После поверхностного поиска я выделил следующее:&lt;/div&gt;
&lt;div&gt;
log4j клоны для c++ -&amp;nbsp;&lt;a href="http://logging.apache.org/log4cxx/"&gt;log4cxx&lt;/a&gt;&amp;nbsp;, &lt;a href="http://log4cpp.sourceforge.net/"&gt;log4cpp&lt;/a&gt;&amp;nbsp;, &lt;a href="http://log4cplus.sourceforge.net/"&gt;log4cplus&lt;/a&gt;;&lt;/div&gt;
&lt;div&gt;
&lt;a href="http://www.pantheios.org/"&gt;Pantheios&lt;/a&gt;;&lt;br /&gt;
&lt;a href="http://boost-log.sourceforge.net/"&gt;boost-log&lt;/a&gt;;&lt;br /&gt;
&lt;a href="http://code.google.com/p/google-glog/"&gt;google-glog&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Попробовав log4cxx &amp;nbsp;я заподозрил плохое увидев что по сути в проекте не было изменений с 2004 года. Увидев незакрытые баги связанные с многопоточностью(что для меня критично), я на него забил и решил пока не трогать другие log4j клоны (судя по датам релизов живой только log4cplus и если вам хочется во чтобы-то ни стало использовать клон log4j то наверное стоит обратить внимание именно на него).&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Далее идут не клоны log4j, так что стандартная схема log4j включая все плюсы и минусы в них отсутствует. Это не значит что они слабее функционально (хотя некоторые объективно нацелены на простоту), они просто другие.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Pantheios выглядит отлично в плане документации/описаний, по отзывам вроде у всех работает без проблем. Я почти остановился на нём, но решил уж посмотреть оставшиеся альтернативы.&lt;br /&gt;
&lt;br /&gt;
Boost-log также неплохо документирован, но не включен официально в boost и есть сообщения о странностях в многопоточных приложениях. Вобщем для использования нужны дополнительные аргументы в его пользу после дополнительных исследований.&lt;br /&gt;
&lt;br /&gt;
Наконец очередь дошла до google-glog. И тут я понял что это то что мне нужно. Очень мощный и одновременно простой функционал. DLOG (ну и DCHECK и тд) например позволяет выкинуть мысли о том во что выльется слишком подробное логирование в плане производительности - как только вы скомпиляете релиз-версию все DLOG вызовы&amp;nbsp;&lt;strike&gt;превратятся в тыкву&lt;/strike&gt;&amp;nbsp;просто исчезнут. Но у glog есть и минусы. Например встроенной ротации логов нет. Документация очень куцая, часто приходится заглядывать в исходники (особенно в&amp;nbsp;&lt;a href="http://code.google.com/p/google-glog/source/browse/trunk/src/logging.cc"&gt;http://code.google.com/p/google-glog/source/browse/trunk/src/logging.cc&lt;/a&gt;&amp;nbsp;) для поиска настроек (например для максимального размера логфайла).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Вывод:&lt;/b&gt;&lt;br /&gt;
Несмотря на недостатки пока считаю &lt;a href="http://code.google.com/p/google-glog/"&gt;glog&lt;/a&gt; победителем в плане простоты и эффективности. Надо конечно посмотреть как он в продакшне под большой нагрузкой себя покажет, но учитывая его простоту не думаю что будут проблемы.&lt;br /&gt;
&lt;br /&gt;
Достоен внимания и &lt;a href="http://www.pantheios.org/"&gt;Pantheios&lt;/a&gt; особенно если вам импонирует его архитектура.&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30809594-6047836011769265902?l=pseudo-tech-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=Mwu609hbAb0:LS1AyORDEe8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=Mwu609hbAb0:LS1AyORDEe8:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=Mwu609hbAb0:LS1AyORDEe8:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=Mwu609hbAb0:LS1AyORDEe8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=Mwu609hbAb0:LS1AyORDEe8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=Mwu609hbAb0:LS1AyORDEe8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=Mwu609hbAb0:LS1AyORDEe8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=Mwu609hbAb0:LS1AyORDEe8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pseudo-tech-notes/~4/Mwu609hbAb0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pseudo-tech-notes.blogspot.com/feeds/6047836011769265902/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=30809594&amp;postID=6047836011769265902" title="Комментарии: 5" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/6047836011769265902?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/6047836011769265902?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/pseudo-tech-notes/~3/Mwu609hbAb0/blog-post.html" title="Логирование в С++. Сравнительный мини-обзор" /><author><name>Лаврентий Палыч</name><uri>http://www.blogger.com/profile/12257889673961252182</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_cR10U53OBxA/R8Xau9PAqjI/AAAAAAAAANg/0ZwZ5RO3MZY/S220/pic1.jpg" /></author><thr:total>5</thr:total><feedburner:origLink>http://pseudo-tech-notes.blogspot.com/2011/09/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IMQ3k4fSp7ImA9WhdWEkw.&quot;"><id>tag:blogger.com,1999:blog-30809594.post-6891986395784954586</id><published>2011-09-05T14:46:00.000+04:00</published><updated>2011-09-05T14:46:22.735+04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-05T14:46:22.735+04:00</app:edited><title>Ubuntu One vs Dropbox на ubuntu server</title><content type="html">Есть у убунты &lt;a href="https://one.ubuntu.com/"&gt;Ubuntu One&lt;/a&gt; - очередная sync/share тулза на облаке. Имея несколько безголовых(для тех кто не в курсе - сервер без монитора,клавы и мыши) убунту серверов и необходимость синхронизировать некоторые некритичные несекретные(достаточно несекретные чтобы использовать сторонний сервис для синхронизации) данные не только между ними но и наружу(в том числе на не *nix системы) решил я попробовать Ubuntu One. Но оказалось что из консоли это можно сделать только с помощью жутких хаков (&lt;a href="http://per.liedman.net/2011/01/22/using-ubuntu-one-for-backup-on-a-headless-server/"&gt;например&lt;/a&gt;,&amp;nbsp;да и то там в комментах пишут что уже не работает). Вобщем удивительное рядом - продукт компании не работающий на другом продукте компании.&lt;br /&gt;
&lt;br /&gt;
В итоге пришлось использовать dropbox. Вот тут например написано как это сделать:&amp;nbsp;&lt;a href="http://ubuntuservergui.com/ubuntu-server-guide/install-dropbox-ubuntu-server"&gt;http://ubuntuservergui.com/ubuntu-server-guide/install-dropbox-ubuntu-server&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
P.S. Впрочем если погуглить то становится понятно что и на десктопе убунты большинство выбирают dropbox.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30809594-6891986395784954586?l=pseudo-tech-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=zoW6zWeZMT4:k3haGHmr5_4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=zoW6zWeZMT4:k3haGHmr5_4:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=zoW6zWeZMT4:k3haGHmr5_4:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=zoW6zWeZMT4:k3haGHmr5_4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=zoW6zWeZMT4:k3haGHmr5_4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=zoW6zWeZMT4:k3haGHmr5_4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=zoW6zWeZMT4:k3haGHmr5_4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=zoW6zWeZMT4:k3haGHmr5_4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pseudo-tech-notes/~4/zoW6zWeZMT4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pseudo-tech-notes.blogspot.com/feeds/6891986395784954586/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=30809594&amp;postID=6891986395784954586" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/6891986395784954586?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/6891986395784954586?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/pseudo-tech-notes/~3/zoW6zWeZMT4/ubuntu-one-vs-dropbox-ubuntu-server.html" title="Ubuntu One vs Dropbox на ubuntu server" /><author><name>Лаврентий Палыч</name><uri>http://www.blogger.com/profile/12257889673961252182</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_cR10U53OBxA/R8Xau9PAqjI/AAAAAAAAANg/0ZwZ5RO3MZY/S220/pic1.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://pseudo-tech-notes.blogspot.com/2011/09/ubuntu-one-vs-dropbox-ubuntu-server.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IMRHY5fyp7ImA9WhdXEUg.&quot;"><id>tag:blogger.com,1999:blog-30809594.post-3850857281626745746</id><published>2011-08-24T07:13:00.000+04:00</published><updated>2011-08-24T07:13:05.827+04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-24T07:13:05.827+04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="параллельное программирование" /><category scheme="http://www.blogger.com/atom/ns#" term="C++" /><title>Параллелим на многоядерный кластер. C/C++ или Java.</title><content type="html">Этот пост не даст ответа на чём лучше писать программы работающие на кластере многоядерных машин, но даст немного информации к размышлению.&lt;br /&gt;
&lt;br /&gt;
Любой кто начнет искать "как бы написать что-нибудь для кластера" наткнётся на аббревиатуру &lt;a href="http://ru.wikipedia.org/wiki/Message_Passing_Interface"&gt;MPI&lt;/a&gt;. И наверняка наткнется на аббревиатуру &lt;a href="http://ru.wikipedia.org/wiki/OpenMP"&gt;OpenMP&lt;/a&gt; когда речь зайдёт о программировании для многоядерных систем.&lt;br /&gt;
&lt;br /&gt;
Когда заходит речь о таких сложных системах желание снизить влияние программистких ошибок на систему(ну или снизить порог уровня годных для этой задачи программистов) вполне имеет право на жизнь. Понятно что если вы сражаетесь за каждый такт процессора на каждом ядре - то у вас нет альтернативы C/C++ библиотекам MPI/OpenMP и команде сильных программистов с крепкой нервной системой. Если же копейки процессорного времени вас не очень волнуют и сильной команды C/C++ спецов нет, то можете взглянуть на Java с её библиотеками-аналогами (&lt;a href="http://mpj-express.org"&gt;MPJ Express&lt;/a&gt; и какой-то субъективно сомнительный на вид &lt;a href="http://www2.epcc.ed.ac.uk/computing/research_activities/jomp/index_1.html"&gt;JOMP&lt;/a&gt;). Но будьте готовы что для совсем простых задач "копейки" выльются в двукратное отставание как например &lt;a href="http://habrahabr.ru/blogs/java/105408/"&gt;тут&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Что лучше "в среднем по больнице" сложно сказать. Явовские либы определённо имеют некоторые баги со стабильностью на некоторых системах (можете погуглить - вроде на солярке точно были проблемы у mpj), но в целом есть примеры работающие в продакшне, так что ничего критичного нет. На плюсах же наверняка у малоопытных несильных программистов будут большие проблемы одной из которой будет нахождение собственно проблемного кода. Но это мое субъективное мнение.&lt;br /&gt;
&lt;br /&gt;
Да, если у вас нету кластера, но есть относительно мощный компьютер вы можете запустить пару виртуалок и сделать кластер из них. Например если соберетесь под виндой запустить пару(ну или больше если система и здравый смысл позволяют) линуксов, то вот это поможет вам настроить сеть между двумя виртуалками: &lt;a href="http://open-source-experiments.blogspot.com/2008/04/case-study-making-internal-networking.html"&gt;много букоф на английском&lt;/a&gt;. Лично у меня этот вариант с парой убунту серверов и небольшой MPI программой на C++ сработал на ура.&lt;br /&gt;
&lt;br /&gt;
P.S. На всякий случай: если вы пишете что-то распределённое это вовсе не значит что вам необходим MPI. Но если у вас получается велосипед который повторяет функционал MPI - это повод задуматься.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30809594-3850857281626745746?l=pseudo-tech-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=zKQrphWfAqc:_63h1C-7a2Q:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=zKQrphWfAqc:_63h1C-7a2Q:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=zKQrphWfAqc:_63h1C-7a2Q:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=zKQrphWfAqc:_63h1C-7a2Q:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=zKQrphWfAqc:_63h1C-7a2Q:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=zKQrphWfAqc:_63h1C-7a2Q:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=zKQrphWfAqc:_63h1C-7a2Q:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=zKQrphWfAqc:_63h1C-7a2Q:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pseudo-tech-notes/~4/zKQrphWfAqc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pseudo-tech-notes.blogspot.com/feeds/3850857281626745746/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=30809594&amp;postID=3850857281626745746" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/3850857281626745746?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/3850857281626745746?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/pseudo-tech-notes/~3/zKQrphWfAqc/cc-java.html" title="Параллелим на многоядерный кластер. C/C++ или Java." /><author><name>Лаврентий Палыч</name><uri>http://www.blogger.com/profile/12257889673961252182</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_cR10U53OBxA/R8Xau9PAqjI/AAAAAAAAANg/0ZwZ5RO3MZY/S220/pic1.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://pseudo-tech-notes.blogspot.com/2011/08/cc-java.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QHSXk_fip7ImA9Wx9aEE8.&quot;"><id>tag:blogger.com,1999:blog-30809594.post-662096283341867586</id><published>2011-03-02T02:15:00.000+03:00</published><updated>2011-03-02T02:15:38.746+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-02T02:15:38.746+03:00</app:edited><title>Всё меняется</title><content type="html">Помнится давным-давно, году так в 2000-2001 читал я предсказания Билла Гейтса(если память не изменяет то в компьютерре) о том как всё будет с компьютерами очень скоро. Говорил он о том что почти весь десктопный софт будет скоро(вроде бы он говорил о 10-15 годах) переориентирован на тонких клиентов. И ведь многие смеялись тогда...&lt;br /&gt;
&lt;br /&gt;
Так о чём я. Если бы мне в 2000 году сказали бы что когда мне понадобится быстренько визуализировать некоторые сложные данные для внутреннего редкого использования, то в 2011 я возьму js-библиотеку и быстренько напишу на java генератор html для отрисовки нужных графиков с использованием этой js библиотеки - я бы повертел пальцем у виска. &lt;br /&gt;
&lt;br /&gt;
С одной стороны я конечно давно уже далёк от десктопных приложений и такое решение мне показалось оптимальным в том плане, что на совсем уж незнакомые грабли наступать не придётся. Ну и js либа уж больно красиво рисует. Года 4 назад я бы наверное налабал скрипт на perl с графической либой какой-нибудь (правда вышло бы уродливо, но наверняка ещё быстрее). В 2000 году мне даже мысль об использовании js для отрисовки не пришла бы в голову.&lt;br /&gt;
&lt;br /&gt;
Библиотека для рисования графиков выбралась сама по себе - я вспомнил что недавно Сироткин искал такую, и тупо позаимствовал у него первую попавшуюся ссылку: &lt;a href="http://highcharts.com/"&gt;http://highcharts.com/&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
На всё про всё у меня ушло несколько часов (там порядочно данных надо было обработать хитро прежде чем рисовать, ну и всё guice'фицировать и минимум unit-тестов сделать на случай если вдруг придётся потом в этом что-то менять) и в итоге нарисовалось всё очень наглядно и так красиво что аж жалко стало что это для внутреннего использования.&lt;br /&gt;
&lt;br /&gt;
Что будет через 10 лет сложно представить. Наверняка появится ещё пара концептуально других опций для решения этой задачи.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30809594-662096283341867586?l=pseudo-tech-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=UsX5LEoYSG0:v0i2NMbOER8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=UsX5LEoYSG0:v0i2NMbOER8:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=UsX5LEoYSG0:v0i2NMbOER8:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=UsX5LEoYSG0:v0i2NMbOER8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=UsX5LEoYSG0:v0i2NMbOER8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=UsX5LEoYSG0:v0i2NMbOER8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=UsX5LEoYSG0:v0i2NMbOER8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=UsX5LEoYSG0:v0i2NMbOER8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pseudo-tech-notes/~4/UsX5LEoYSG0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pseudo-tech-notes.blogspot.com/feeds/662096283341867586/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=30809594&amp;postID=662096283341867586" title="Комментарии: 1" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/662096283341867586?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/662096283341867586?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/pseudo-tech-notes/~3/UsX5LEoYSG0/blog-post.html" title="Всё меняется" /><author><name>Лаврентий Палыч</name><uri>http://www.blogger.com/profile/12257889673961252182</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_cR10U53OBxA/R8Xau9PAqjI/AAAAAAAAANg/0ZwZ5RO3MZY/S220/pic1.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://pseudo-tech-notes.blogspot.com/2011/03/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4AR3w9eSp7ImA9WxFaFkw.&quot;"><id>tag:blogger.com,1999:blog-30809594.post-1500219870772540478</id><published>2010-07-20T07:57:00.005+04:00</published><updated>2010-07-20T13:42:26.261+04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-20T13:42:26.261+04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="тестирование" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="GAE" /><category scheme="http://www.blogger.com/atom/ns#" term="guice" /><title>Тестирование сервлетов и Task Queue в GAE (с guice ServletModule).</title><content type="html">Я всегда считал что многие весьма опрометчиво думают что покрытие тестами всего и вся - это лучшее решение. Нет оно конечно лучшее в некоторых случаях, спору нет. Но когда проект небольшой, пишется для себя или проект создают 2-3 человека в очень короткий срок, то упор на тесты не всегда будет правильным решением (я не говорю что они не нужны совсем - просто надо знать меру и правильно оценивать соотношение пользы к затратам на создание тестов).&lt;br /&gt;
&lt;br /&gt;
Но бывает так что с тестами действительно сильно упрощается и ускоряется процесс разработки даже небольших проектов. Например как раз сейчас делаю проектик на &lt;a href="http://code.google.com/appengine/"&gt;GAE&lt;/a&gt; (Google App Engine) который достаточно сложный. Много cron-задач создающих task'и (здесь и далее имеются в виду task'и из Task Queue), которые в свою очередь сами могут порождать task'и. Так как cron и Task Queues на девелоперском сервере поддерживаются довольно-таки условно - возникли неудобства с проверкой работоспособности.&lt;br /&gt;
&lt;br /&gt;
Учитывая что в GAE есть всё для удобного локального тестирования (&lt;a href="http://code.google.com/appengine/docs/java/tools/localunittesting.html"&gt;здесь&lt;/a&gt;) было решено позапускать нужные cron-задачи и task'и в нужной последовательности в тесте и там же проверить результат. Очевидно это быстрее чем руками в девелопмент сервере запускать cron-задачи и руками же проверять результат. Более того - так как это тест, то нет нужды потом зачищать datastore чтобы попробовать запустить то же самое, но с другими параметрами. Вобщем экономия времени была ощутимой, не говоря уже о том что куда приятнее откинуться на спинку кресла и смотреть за прогрессом, чем руками рефрешить сервлеты.&lt;br /&gt;
&lt;br /&gt;
Запустить сервлет в тесте не так уж и сложно - я использовал &lt;a href="http://httpunit.sourceforge.net/"&gt;httpunit&lt;/a&gt;. Те кто используют обычные сервлеты могут использовать его. У меня же возникла проблема, все мои cron/task-сервлеты были &lt;a href="http://code.google.com/p/google-guice/"&gt;guice'фицированы&lt;/a&gt; и поэтому подход с httpunit не годился.&lt;br /&gt;
&lt;br /&gt;
Немного подумав я решил что достаточно будет написать mock's для HttpServletRequest и HttpServletResponse и использовать полученный с помощью guice объект сервлета чтобы всё это заработало. В итоге всё что получилось я выложил сюда: &lt;a href="http://code.google.com/p/gaelocaltest/"&gt;http://code.google.com/p/gaelocaltest/&lt;/a&gt;. Там же есть пример использования на главной странице.&lt;br /&gt;
&lt;br /&gt;
Конечно оно сделано весьма быстро на коленке и имеет ряд ограничений, но работает и вполне покрывает типовые задачи. Собственно кода там мало и он примитивен - так что желающие могут взять его за базу для своих целей если вдруг возможностей этого не хватит. Для тех кто не сталкивался с граблями по конфигурации для Local unit testing'а GAE, советую взглянуть на пример &lt;a href="http://code.google.com/p/gaelocaltest/wiki/LocalServiceTestHelperConfig"&gt;конфига&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
Вобщем это решение сэкономило мне просто уйму времени. Может быть кому пригодится.&lt;br /&gt;
&lt;br /&gt;
P.S. Для проектов имеющих посещаемость 1.5 человека в сутки и не имеющих постоянно "молотящих" cron/task сервлетов использование guice приведёт к частому появлению паузы при открытии сайта, так как из-за guice увеличится время старта. Сейчас правда все вроде лучше чем год назад - но народ периодически жалуется на эту багофичу GAE. Так что для таких проектов наверное не следует бежать внедрять guice - проще модифицировать мой код под httpunit (самому мне лень).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30809594-1500219870772540478?l=pseudo-tech-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=ALDFs76nfKg:w2GDm-WDckc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=ALDFs76nfKg:w2GDm-WDckc:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=ALDFs76nfKg:w2GDm-WDckc:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=ALDFs76nfKg:w2GDm-WDckc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=ALDFs76nfKg:w2GDm-WDckc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=ALDFs76nfKg:w2GDm-WDckc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=ALDFs76nfKg:w2GDm-WDckc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=ALDFs76nfKg:w2GDm-WDckc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pseudo-tech-notes/~4/ALDFs76nfKg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pseudo-tech-notes.blogspot.com/feeds/1500219870772540478/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=30809594&amp;postID=1500219870772540478" title="Комментарии: 3" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/1500219870772540478?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/1500219870772540478?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/pseudo-tech-notes/~3/ALDFs76nfKg/task-queue-gae-guice-servletmodule.html" title="Тестирование сервлетов и Task Queue в GAE (с guice ServletModule)." /><author><name>Лаврентий Палыч</name><uri>http://www.blogger.com/profile/12257889673961252182</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_cR10U53OBxA/R8Xau9PAqjI/AAAAAAAAANg/0ZwZ5RO3MZY/S220/pic1.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://pseudo-tech-notes.blogspot.com/2010/07/task-queue-gae-guice-servletmodule.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08CQX06eCp7ImA9WxFXEU0.&quot;"><id>tag:blogger.com,1999:blog-30809594.post-4963869819995759017</id><published>2010-05-17T19:13:00.004+04:00</published><updated>2010-05-17T19:24:20.310+04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-17T19:24:20.310+04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GAE" /><title>Удалить индекс в GAE для Java проекта</title><content type="html">Для тех кто мучается с этой задачей, вот решение из гуглогруп:&lt;br /&gt;&lt;br /&gt;1) скачайте GAE python sdk&lt;br /&gt;2) в вашем java проекте создайте файл app.yaml с таким содержимым:&lt;br /&gt;&lt;br /&gt;application: YOURJAVA_APPID&lt;br /&gt;version: 1&lt;br /&gt;runtime: python&lt;br /&gt;api_version: 1&lt;br /&gt;&lt;br /&gt;handlers:&lt;br /&gt;- url: .*&lt;br /&gt;  script: main.py&lt;br /&gt;&lt;br /&gt;3) из директории вашего java проекте запустите (предполагается appcfg.py прописан в PATH)&lt;br /&gt;        appcfg.py vacuum_indexes .&lt;br /&gt;&lt;br /&gt;4) удалите индексы которые хотите удалить&lt;br /&gt;&lt;br /&gt;5) удалите файл app.yaml &lt;br /&gt;&lt;br /&gt;6) зазвездите здесь чтобы не приходилось так извращаться: &lt;a href="http://code.google.com/p/googleappengine/issues/detail?id=1893"&gt;http://code.google.com/p/googleappengine/issues/detail?id=1893&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;P.S. А вообще это какой-то позор и дискриминация.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30809594-4963869819995759017?l=pseudo-tech-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=L_CidUNoLUs:R5SxIleztSk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=L_CidUNoLUs:R5SxIleztSk:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=L_CidUNoLUs:R5SxIleztSk:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=L_CidUNoLUs:R5SxIleztSk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=L_CidUNoLUs:R5SxIleztSk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=L_CidUNoLUs:R5SxIleztSk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=L_CidUNoLUs:R5SxIleztSk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=L_CidUNoLUs:R5SxIleztSk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pseudo-tech-notes/~4/L_CidUNoLUs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pseudo-tech-notes.blogspot.com/feeds/4963869819995759017/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=30809594&amp;postID=4963869819995759017" title="Комментарии: 5" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/4963869819995759017?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/4963869819995759017?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/pseudo-tech-notes/~3/L_CidUNoLUs/gae-java.html" title="Удалить индекс в GAE для Java проекта" /><author><name>Лаврентий Палыч</name><uri>http://www.blogger.com/profile/12257889673961252182</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_cR10U53OBxA/R8Xau9PAqjI/AAAAAAAAANg/0ZwZ5RO3MZY/S220/pic1.jpg" /></author><thr:total>5</thr:total><feedburner:origLink>http://pseudo-tech-notes.blogspot.com/2010/05/gae-java.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4CQHw-fip7ImA9WxFRFU8.&quot;"><id>tag:blogger.com,1999:blog-30809594.post-6545397910093335282</id><published>2010-04-29T09:13:00.003+04:00</published><updated>2010-04-29T10:36:01.256+04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-29T10:36:01.256+04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="sqlite" /><title>Быстрый способ обработать большой набор данных</title><content type="html">Довольно стандартная минизадача - взять данные из одного или нескольких источников, сгруппировать и как-либо обработать их и выдать на выход в неком формате. Часто для группировки/обработки сильно помогает наличие SQL базы данных. Для минизадач напрашивается sqlite (для явы я использую &lt;a href="http://www.xerial.org/trac/Xerial/wiki/SQLiteJDBC"&gt;http://www.xerial.org/trac/Xerial/wiki/SQLiteJDBC&lt;/a&gt; но и вариант zentus вроде бы тоже использовал раньше). При больших объёмах данных узким местом обычно становится время затрачиваемое на insert/update. И тут сильно помогает то что в sqlite есть memory режим (имя базы данных для задания в конекте :memory:), что сильно ускоряет insert/update операции. Вобщем разница видна на глаз уже где-то на наборе из 500К объектов, а при отладке экономия времени просто неимоверная.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30809594-6545397910093335282?l=pseudo-tech-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=swGNym-X0MA:pFaCB4cjPv4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=swGNym-X0MA:pFaCB4cjPv4:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=swGNym-X0MA:pFaCB4cjPv4:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=swGNym-X0MA:pFaCB4cjPv4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=swGNym-X0MA:pFaCB4cjPv4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=swGNym-X0MA:pFaCB4cjPv4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=swGNym-X0MA:pFaCB4cjPv4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=swGNym-X0MA:pFaCB4cjPv4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pseudo-tech-notes/~4/swGNym-X0MA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pseudo-tech-notes.blogspot.com/feeds/6545397910093335282/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=30809594&amp;postID=6545397910093335282" title="Комментарии: 2" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/6545397910093335282?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/6545397910093335282?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/pseudo-tech-notes/~3/swGNym-X0MA/blog-post.html" title="Быстрый способ обработать большой набор данных" /><author><name>Лаврентий Палыч</name><uri>http://www.blogger.com/profile/12257889673961252182</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_cR10U53OBxA/R8Xau9PAqjI/AAAAAAAAANg/0ZwZ5RO3MZY/S220/pic1.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://pseudo-tech-notes.blogspot.com/2010/04/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0EFQnw9eip7ImA9WxFTEEU.&quot;"><id>tag:blogger.com,1999:blog-30809594.post-8515522700195927340</id><published>2010-04-01T05:08:00.004+04:00</published><updated>2010-04-01T05:33:33.262+04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-01T05:33:33.262+04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GAE" /><category scheme="http://www.blogger.com/atom/ns#" term="GWT" /><title>Про DTO в GAE+GWT</title><content type="html">Не знаю как остальных, а меня всегда раздражала необходимость создавать DTO (&lt;a href="http://en.wikipedia.org/wiki/Data_transfer_object"&gt;Data transfer object&lt;/a&gt;) в связке GWT-GAE. Ну не то чтобы раздражала, но не приводила в восторг необходимость клепать одно и то же каждый раз когда в клиентскую часть надо отдать данные объекта.&lt;br /&gt;&lt;br /&gt;Также всегда было ощущение что используя JDO, я уподобляюсь человеку забивающему гвозди микроскопом (вобщем понятно что какие-то экстра расходы на JDO уходят).&lt;br /&gt;&lt;br /&gt;Так что если у кого-то были схожие ощущения делюсь ссылкой: &lt;a href="http://code.google.com/p/objectify-appengine/"&gt;objectify-appengine&lt;/a&gt;. Из плюсов - не нужны DTO(конечно при использовании GWT-safe библиотек), быстрый холодный старт и тп. Сам пока в бою не щупал - пока только в планах. Даже есть проектик подходящий.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30809594-8515522700195927340?l=pseudo-tech-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=VbimJdQN7F4:WLNBX5Z_zPw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=VbimJdQN7F4:WLNBX5Z_zPw:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=VbimJdQN7F4:WLNBX5Z_zPw:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=VbimJdQN7F4:WLNBX5Z_zPw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=VbimJdQN7F4:WLNBX5Z_zPw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=VbimJdQN7F4:WLNBX5Z_zPw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=VbimJdQN7F4:WLNBX5Z_zPw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=VbimJdQN7F4:WLNBX5Z_zPw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pseudo-tech-notes/~4/VbimJdQN7F4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pseudo-tech-notes.blogspot.com/feeds/8515522700195927340/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=30809594&amp;postID=8515522700195927340" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/8515522700195927340?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/8515522700195927340?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/pseudo-tech-notes/~3/VbimJdQN7F4/dto-gaegwt.html" title="Про DTO в GAE+GWT" /><author><name>Лаврентий Палыч</name><uri>http://www.blogger.com/profile/12257889673961252182</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_cR10U53OBxA/R8Xau9PAqjI/AAAAAAAAANg/0ZwZ5RO3MZY/S220/pic1.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://pseudo-tech-notes.blogspot.com/2010/04/dto-gaegwt.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUIMQX4_eip7ImA9WxBVF08.&quot;"><id>tag:blogger.com,1999:blog-30809594.post-7272287761696524719</id><published>2010-02-21T07:39:00.003+03:00</published><updated>2010-02-21T07:46:20.042+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-21T07:46:20.042+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><title>Java сообщества</title><content type="html">Подписался на некоторые java рассылки/сообщества. Поражен количеством людей не понимающих как оно работает и способных рассуждать только на уровне оберток/фреймворков. Интересно есть термин для программиста способного механически писать только в любимом фрейморке и не понимающего сути?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30809594-7272287761696524719?l=pseudo-tech-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=JfU_56OuGlM:X-OAFAn2M9I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=JfU_56OuGlM:X-OAFAn2M9I:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=JfU_56OuGlM:X-OAFAn2M9I:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=JfU_56OuGlM:X-OAFAn2M9I:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=JfU_56OuGlM:X-OAFAn2M9I:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=JfU_56OuGlM:X-OAFAn2M9I:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=JfU_56OuGlM:X-OAFAn2M9I:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=JfU_56OuGlM:X-OAFAn2M9I:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pseudo-tech-notes/~4/JfU_56OuGlM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pseudo-tech-notes.blogspot.com/feeds/7272287761696524719/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=30809594&amp;postID=7272287761696524719" title="Комментарии: 3" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/7272287761696524719?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/7272287761696524719?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/pseudo-tech-notes/~3/JfU_56OuGlM/java.html" title="Java сообщества" /><author><name>Лаврентий Палыч</name><uri>http://www.blogger.com/profile/12257889673961252182</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_cR10U53OBxA/R8Xau9PAqjI/AAAAAAAAANg/0ZwZ5RO3MZY/S220/pic1.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://pseudo-tech-notes.blogspot.com/2010/02/java.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUBR3g7fSp7ImA9WxBVEU8.&quot;"><id>tag:blogger.com,1999:blog-30809594.post-2083599846330646815</id><published>2010-02-14T07:00:00.004+03:00</published><updated>2010-02-14T07:37:36.605+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-14T07:37:36.605+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GWT" /><title>Про будущее вёрстки</title><content type="html">Не прошло и года, как подвернулся случай изучить "GWT 2.0 Layout system". Случай подвернулся после того как в очередном проектике IE успешно не смог ничего показать, хотя ничего сложного от него не требовалось. В общем впечатления от "standards mode" пока сугубо положительные. Я как человек верстающий крайне редко, всегда убивал много времени на несложные вещи типа хедер с двумя колонками, правая резиновая и тп. Теперь куча проблем решена за меня практически из коробки: &lt;a href="http://code.google.com/webtoolkit/doc/latest/DevGuideUiPanels.html"&gt;http://code.google.com/webtoolkit/doc/latest/DevGuideUiPanels.html&lt;/a&gt; . Задействование мозга конечно никто не отменял, но в целом многое упростилось и про хрень типа "а под IE мы напишем хак" в светлом будущем видимо можно будет забыть (да и сейчас при переходе на gwt layout'ы мой проектик мгновенно заработал в IE). Вобщем такими темпами скоро потребность в волшебных верстальщиках для проектов на GWT отпадёт.&lt;br /&gt;&lt;br /&gt;Кстати если кто не был на GDD09(как например я), то тут есть записи: &lt;a href="http://code.google.com/intl/ru/events/developerday/2009/sessions.html"&gt;http://code.google.com/intl/ru/events/developerday/2009/sessions.html&lt;/a&gt;. Пробежавшись по заголовкам я просмотрел &lt;a href="http://www.youtube.com/watch?v=K-ffOcxMb0U"&gt;"GWT App Architecture Best Practices"&lt;/a&gt;. В принципе сейчас это и в хелпе есть частично (про MVP), но всё равно советую посмотреть. На русском смотреть не советую - переводчик жжот местами. Жаль не было этой презентации года 3 назад, когда я городил похожее сам и собирал все шишки тоже сам (например злоупотреблял шиной для посыла всего и получал дикую прожорливость и тормознутость из-за этого - тут же докладчик сразу говорит что так делать не стоит, что сбережёт многим много нервных клеток). Правда на практике не всё так гладко как он рассказывает получается с MVP, но для ознакомления с концепцией в принципе и этого примера вполне достаточно чтобы загрузить средний мозг. А все сложности можно решить - главное понимать идею.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30809594-2083599846330646815?l=pseudo-tech-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=_gsAv5Tb4s4:AjIB8126byQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=_gsAv5Tb4s4:AjIB8126byQ:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=_gsAv5Tb4s4:AjIB8126byQ:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=_gsAv5Tb4s4:AjIB8126byQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=_gsAv5Tb4s4:AjIB8126byQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=_gsAv5Tb4s4:AjIB8126byQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=_gsAv5Tb4s4:AjIB8126byQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=_gsAv5Tb4s4:AjIB8126byQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pseudo-tech-notes/~4/_gsAv5Tb4s4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pseudo-tech-notes.blogspot.com/feeds/2083599846330646815/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=30809594&amp;postID=2083599846330646815" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/2083599846330646815?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/2083599846330646815?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/pseudo-tech-notes/~3/_gsAv5Tb4s4/blog-post.html" title="Про будущее вёрстки" /><author><name>Лаврентий Палыч</name><uri>http://www.blogger.com/profile/12257889673961252182</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_cR10U53OBxA/R8Xau9PAqjI/AAAAAAAAANg/0ZwZ5RO3MZY/S220/pic1.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://pseudo-tech-notes.blogspot.com/2010/02/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0AARnY_eSp7ImA9WxBWF08.&quot;"><id>tag:blogger.com,1999:blog-30809594.post-8911245412854961080</id><published>2010-02-09T17:16:00.003+03:00</published><updated>2010-02-09T17:29:07.841+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-09T17:29:07.841+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GAE" /><title>Лучший способ убить GAE</title><content type="html">Если вдруг у вас в логах появились сплошные сообщения "Request was aborted after waiting too long to attempt to service your request. Most likely, this indicates that you have reached your simultaneous dynamic request limit. This is almost always due to excessively high latency in your app. Please see http://code.google.com/appengine/docs/quotas.html for more details." и вы недавно задеплоили новую версию, то не стоит первым делом проклинать гугл который не даёт вам по крону запускать относительно лёгкий на ваш взгляд скрипт. Потому что заподозрив гугл в плохом я стал искать признаки того что моя jvm постоянно релоадится из-за того что на сайт нету нагрузки извне и заниматься прочими глупостями. А всё оказалось очень просто. Относительно несложный regex натравленный на пару килобайт текста сжирал весь процессор в одну харю ну а дальше по цепочке не хватало процессора всем бэкграундным скриптам (которые впрочем успевали переодически пробиваться и худо-бедно работать). Самое хреновое что при этом почему-то и логгинг не работал(те чекпойнты заботливо прописанные по скрипту тупо ничего не писали в лог, а писалось только сообщение которое я привел выше), так что выделив методом исключения фрагмент кода на котором GAE ложился пришлось тупо догадаться в чём дело. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30809594-8911245412854961080?l=pseudo-tech-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=ELoViD0T-04:FbXjEJVPVOY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=ELoViD0T-04:FbXjEJVPVOY:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=ELoViD0T-04:FbXjEJVPVOY:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=ELoViD0T-04:FbXjEJVPVOY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=ELoViD0T-04:FbXjEJVPVOY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=ELoViD0T-04:FbXjEJVPVOY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=ELoViD0T-04:FbXjEJVPVOY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=ELoViD0T-04:FbXjEJVPVOY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pseudo-tech-notes/~4/ELoViD0T-04" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pseudo-tech-notes.blogspot.com/feeds/8911245412854961080/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=30809594&amp;postID=8911245412854961080" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/8911245412854961080?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/8911245412854961080?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/pseudo-tech-notes/~3/ELoViD0T-04/gae.html" title="Лучший способ убить GAE" /><author><name>Лаврентий Палыч</name><uri>http://www.blogger.com/profile/12257889673961252182</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_cR10U53OBxA/R8Xau9PAqjI/AAAAAAAAANg/0ZwZ5RO3MZY/S220/pic1.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://pseudo-tech-notes.blogspot.com/2010/02/gae.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUBSXY4eip7ImA9WxBWFUk.&quot;"><id>tag:blogger.com,1999:blog-30809594.post-3939844518265157300</id><published>2010-02-07T13:35:00.003+03:00</published><updated>2010-02-07T13:57:38.832+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-07T13:57:38.832+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GAE" /><title>GAE как сделать rollback в java</title><content type="html">Почему-то GAE сильно ориентирован на питонистов и в ошибках часто даёт подсказки только для них. Или может считают что те кто на джаве пишут сами догадаются...&lt;br /&gt;&lt;br /&gt;Вобщем наконец я смог сломать своё приложение до состояния когда пришлось пользоваться консолью. Во время очередного деплоймента мне показалось что оно зависло и я отменил его и перезапустил eclipse. В итоге стал получать сообщение вида: "Another transaction by user *** is already in progress for this app and major version. That user can undo the transaction with appcfg.py's "rollback" command.". Вобщем пришлось лезть к консольным GAE тулзам в eclipse (*path to eclipse*)/plugins/com.google.appengine.eclipse.sdkbundle_VERSION/appengine-java-sdk/bin/ и там запустить (вариант для винды) appcfg.cmd -e vasyapupkin@gmail.com rollback &lt;путь к war директории проекта eclipse&gt;.&lt;br /&gt;&lt;br /&gt;Также попробовал GAE "Task Queues". На мой взгляд замечательная вещь, очень удобно по сравнению со стандартными велосипедами на кроне. Жаль пока это экспериментальная фича и повально использовать даже в своём тестовом проектике я не буду пока.&lt;br /&gt;&lt;br /&gt;Из новых обнаруженных небольших недостатков GAE:&lt;br /&gt;- сторадж не очень стабилен, т.е. ситуации когда что-то не удаляется или не добавляется не так уж редки, что для серьёзных задач наверное сильно добавит гемороя;&lt;br /&gt;- в java невозможно удалить неиспользуемые индексы (в гуглогруппах советуют сделать это из питоновского sdk), это ни на что не влияет но раздражает :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30809594-3939844518265157300?l=pseudo-tech-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=qbbKsfU50Gk:-ibV4kudO3Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=qbbKsfU50Gk:-ibV4kudO3Y:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=qbbKsfU50Gk:-ibV4kudO3Y:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=qbbKsfU50Gk:-ibV4kudO3Y:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=qbbKsfU50Gk:-ibV4kudO3Y:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=qbbKsfU50Gk:-ibV4kudO3Y:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=qbbKsfU50Gk:-ibV4kudO3Y:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=qbbKsfU50Gk:-ibV4kudO3Y:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pseudo-tech-notes/~4/qbbKsfU50Gk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pseudo-tech-notes.blogspot.com/feeds/3939844518265157300/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=30809594&amp;postID=3939844518265157300" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/3939844518265157300?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/3939844518265157300?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/pseudo-tech-notes/~3/qbbKsfU50Gk/gae-rollback-java.html" title="GAE как сделать rollback в java" /><author><name>Лаврентий Палыч</name><uri>http://www.blogger.com/profile/12257889673961252182</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_cR10U53OBxA/R8Xau9PAqjI/AAAAAAAAANg/0ZwZ5RO3MZY/S220/pic1.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://pseudo-tech-notes.blogspot.com/2010/02/gae-rollback-java.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU8ASHc5fSp7ImA9WxBTF08.&quot;"><id>tag:blogger.com,1999:blog-30809594.post-5294214417763780088</id><published>2009-09-28T06:02:00.006+04:00</published><updated>2009-12-13T21:10:49.925+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-13T21:10:49.925+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GAE" /><title>GAE</title><content type="html">Чуствую GAE меня добъёт. Таких чудес насмотрелся - что на всю жизнь хватит. Надо будет поплотнее сесть, чтобы разобраться. Из последнего: в базе один основной объект с кучкой owned и unowned объектов (разных классов). Так вот через query без фильтров он возвращается как надо, а через getObjectById возвращается без child'ов. Как такое получается пока понять не смог. Из полезного - обнаружил что есть усечённая админ панель для локальной разработки, что облегчает жизнь ощутимо: &lt;a href="http://localhost:8080/_ah/admin"&gt;http://localhost:8080/_ah/admin&lt;/a&gt; (в последних билдах &lt;a href="http://localhost:8888/_ah/admin"&gt;http://localhost:8888/_ah/admin&lt;/a&gt; ) .&lt;br /&gt;&lt;br /&gt;Update: разгадка-решение к чудесам - (defaultFetchGroup="true") . Расписывать не буду - гуглиться в соответствующих гуглогруппах и не только там.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30809594-5294214417763780088?l=pseudo-tech-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=1p6QDwvFi3k:IHb7KVn7adM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=1p6QDwvFi3k:IHb7KVn7adM:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=1p6QDwvFi3k:IHb7KVn7adM:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=1p6QDwvFi3k:IHb7KVn7adM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=1p6QDwvFi3k:IHb7KVn7adM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=1p6QDwvFi3k:IHb7KVn7adM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=1p6QDwvFi3k:IHb7KVn7adM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=1p6QDwvFi3k:IHb7KVn7adM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pseudo-tech-notes/~4/1p6QDwvFi3k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pseudo-tech-notes.blogspot.com/feeds/5294214417763780088/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=30809594&amp;postID=5294214417763780088" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/5294214417763780088?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/5294214417763780088?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/pseudo-tech-notes/~3/1p6QDwvFi3k/gae.html" title="GAE" /><author><name>Лаврентий Палыч</name><uri>http://www.blogger.com/profile/12257889673961252182</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_cR10U53OBxA/R8Xau9PAqjI/AAAAAAAAANg/0ZwZ5RO3MZY/S220/pic1.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://pseudo-tech-notes.blogspot.com/2009/09/gae.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQDRno-fSp7ImA9WxJaE00.&quot;"><id>tag:blogger.com,1999:blog-30809594.post-2923667139675178450</id><published>2009-08-03T14:57:00.003+04:00</published><updated>2009-08-03T16:42:57.455+04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-03T16:42:57.455+04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="тестирование" /><category scheme="http://www.blogger.com/atom/ns#" term="GWT" /><title>Тестирование в GWT</title><content type="html">Прочитал занимательную статью про тестирование GWT приложений: &lt;a href="http://code.google.com/webtoolkit/articles/testing_methodologies_using_gwt.html"&gt;http://code.google.com/webtoolkit/articles/testing_methodologies_using_gwt.html&lt;/a&gt;. Интересный подход с MVP и EasyMock, но на мой взгляд слишком затратный в плане оверхеда. Т.е. для небольших проектов вряд ли стоит такое воротить. Также полезная ссылка о том как тестировать RPC в GWT: &lt;a href="http://code.google.com/docreader/#p=google-web-toolkit-doc-1-5&amp;amp;s=google-web-toolkit-doc-1-5&amp;amp;t=DevGuideJUnitAsync"&gt;http://code.google.com/docreader/#p=google-web-toolkit-doc-1-5&amp;amp;s=google-web-toolkit-doc-1-5&amp;amp;t=DevGuideJUnitAsync&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30809594-2923667139675178450?l=pseudo-tech-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=6b3lp_4QQ20:EePQvk0YiME:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=6b3lp_4QQ20:EePQvk0YiME:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=6b3lp_4QQ20:EePQvk0YiME:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=6b3lp_4QQ20:EePQvk0YiME:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=6b3lp_4QQ20:EePQvk0YiME:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=6b3lp_4QQ20:EePQvk0YiME:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=6b3lp_4QQ20:EePQvk0YiME:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=6b3lp_4QQ20:EePQvk0YiME:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pseudo-tech-notes/~4/6b3lp_4QQ20" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pseudo-tech-notes.blogspot.com/feeds/2923667139675178450/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=30809594&amp;postID=2923667139675178450" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/2923667139675178450?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/2923667139675178450?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/pseudo-tech-notes/~3/6b3lp_4QQ20/gwt.html" title="Тестирование в GWT" /><author><name>Лаврентий Палыч</name><uri>http://www.blogger.com/profile/12257889673961252182</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_cR10U53OBxA/R8Xau9PAqjI/AAAAAAAAANg/0ZwZ5RO3MZY/S220/pic1.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://pseudo-tech-notes.blogspot.com/2009/08/gwt.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04FQXo8eCp7ImA9WxJUGUQ.&quot;"><id>tag:blogger.com,1999:blog-30809594.post-5901017651308096995</id><published>2009-07-19T13:45:00.003+04:00</published><updated>2009-07-19T14:38:30.470+04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-19T14:38:30.470+04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GAE" /><category scheme="http://www.blogger.com/atom/ns#" term="GWT" /><title>Про GAE и GWT</title><content type="html">Недавно я решил плотно пощупать Google App Engine (GAE), а также подтянуть скилы по GWT. Надо сказать что с появлением Google плагина для Eclipse жизнь заметно упростилась и пропали например баги с RPC которые были относительно недавно и даже побудили меня переносить проект под нетбинс. Вобщем для того чтобы собрать и выкатить проект на GWT+GAE (на яве) никаких шаманств мне пока совершать не пришлось. Никаких глюков пока тоже не заметил.&lt;br /&gt;&lt;br /&gt;Когда начал писать проект в первые пару дней показалось вот оно счастье - настолько всё удобно и продуманно. Удобно отлаживать когда серверный и клиентский код доступен в одном дебагере и написан на одном языке, удобно выкатывать приложение(нажал кнопку и оно уже там). Но потом нашлись некоторые минусы. Например интернационализация. Я выбрал наиболее правильный на мой взгляд метод - с помощью статических строк(static string internationalization). Но на серверной стороне его использовать невозможно(потому что нужно использовать GWT.create) и возникает проблема когда например надо кинуть исключение на серверной стороне RPC с локализованным текстом. Пока ничего умнее как создание специального класса исключения с enum'ом всех типов исключений, и класса который на клиентской стороне производит получение нужного текста по типу исключения с учётом текущей локали я не придумал. Вобщем пустячок а неприятно - усложняет слегка жизнь. Второе разочарование постигло когда выяснилось что в GAE Datastore не предусмотрено создание unique ограничений. Но в целом пока впечатление сильно положительное, буду смотреть что там дальше будет при более глубоком погружении.&lt;br /&gt;&lt;br /&gt;P.S. Да чуть не забыл - отсутствие какого-либо GUI редактора/просмотрщика данных для datastore очень огорчает.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30809594-5901017651308096995?l=pseudo-tech-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=k4VXZn_bzcg:D28xWakuCVE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=k4VXZn_bzcg:D28xWakuCVE:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=k4VXZn_bzcg:D28xWakuCVE:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=k4VXZn_bzcg:D28xWakuCVE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=k4VXZn_bzcg:D28xWakuCVE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=k4VXZn_bzcg:D28xWakuCVE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?i=k4VXZn_bzcg:D28xWakuCVE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pseudo-tech-notes?a=k4VXZn_bzcg:D28xWakuCVE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pseudo-tech-notes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pseudo-tech-notes/~4/k4VXZn_bzcg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pseudo-tech-notes.blogspot.com/feeds/5901017651308096995/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=30809594&amp;postID=5901017651308096995" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/5901017651308096995?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/5901017651308096995?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/pseudo-tech-notes/~3/k4VXZn_bzcg/gae-gwt.html" title="Про GAE и GWT" /><author><name>Лаврентий Палыч</name><uri>http://www.blogger.com/profile/12257889673961252182</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_cR10U53OBxA/R8Xau9PAqjI/AAAAAAAAANg/0ZwZ5RO3MZY/S220/pic1.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://pseudo-tech-notes.blogspot.com/2009/07/gae-gwt.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0EFSHk6cSp7ImA9WxVQEUw.&quot;"><id>tag:blogger.com,1999:blog-30809594.post-190307254662959009</id><published>2009-01-28T05:46:00.003+03:00</published><updated>2009-01-28T06:00:19.719+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-28T06:00:19.719+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GWT" /><title>Темы GWT. фичобаг</title><content type="html">&lt;div style="text-align: justify;"&gt;Если вы делаете достаточно сложный с точки зрения вёрстки проект, и что-то у вас результат не всегда соответствует тому что вы хотите, и сильно отличается в браузерах, то советую вам взглянуть на магическую незакомментированную строчку в вашем XXX.gwt.xml файле: &amp;lt;inherits name="'com.google.gwt.user.theme.standard.Standard'/"&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Наверное они хотели как лучше, а получилось что получилось. Я конечно понимаю что новичкам возможность выбрать одну из предустановленных тем понравится наверное, но зачем делать стандартную тему которая мешает втыкать gwt кусок в большую сложную страницу со своим css - это для меня загадка. Вобщем закомментировав указанную выше строчку вы обретёте счастье.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30809594-190307254662959009?l=pseudo-tech-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/pseudo-tech-notes?a=pNM9d9YR"&gt;&lt;img src="http://feeds.feedburner.com/~f/pseudo-tech-notes?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pseudo-tech-notes/~4/bNiM_eGzL98" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pseudo-tech-notes.blogspot.com/feeds/190307254662959009/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=30809594&amp;postID=190307254662959009" title="Комментарии: 3" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/190307254662959009?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/190307254662959009?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/pseudo-tech-notes/~3/bNiM_eGzL98/gwt.html" title="Темы GWT. фичобаг" /><author><name>Лаврентий Палыч</name><uri>http://www.blogger.com/profile/12257889673961252182</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_cR10U53OBxA/R8Xau9PAqjI/AAAAAAAAANg/0ZwZ5RO3MZY/S220/pic1.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://pseudo-tech-notes.blogspot.com/2009/01/gwt.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YMQ3oyfCp7ImA9WxRRFkU.&quot;"><id>tag:blogger.com,1999:blog-30809594.post-5342631207768293806</id><published>2008-09-29T13:20:00.003+04:00</published><updated>2008-09-29T14:46:22.494+04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-29T14:46:22.494+04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="заметки на полях" /><title>Настройка дополнительных клавиш под Linux</title><content type="html">&lt;div style="text-align: justify;"&gt;Решил задействовать дополнительные клавиши моей относительно недавнокупленной Logitech Wave Keyboard. С удивлением увидел что утилиты под иксы которая бы подхватила мою клаву прямо "из коробки" нету(напомню - у меня fedora), более того настроить дополнительные клавиши тоже нечем - они игнорятся теми настройщиками какие есть. Править конфиги руками - лениво мне, всё же не 90-е уже. И тут я нашёл то что нужно в репозитории от Tigro (если кто не знает: &lt;a href="http://tigro.info/"&gt;http://tigro.info&lt;/a&gt; ) - keytouch и keytouch-editor.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;keytouch правда тоже мою клаву не знал, но keytouch-editor осилил мою клаву, правда комбинации типа Fn-F7 приходится нажимать хитро сначала жмём Fn, потом мышкой кнопку New а потом уже F7. Иначе в сканкод у вас запишется код клавиши Fn. После работы в keytouch-editor результаты сохранил в файл который потом подгрузил в keytouch. Жить с настроенными дополнительными клавишами стало веселее и более эффективно.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30809594-5342631207768293806?l=pseudo-tech-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/pseudo-tech-notes?a=L0sW9CNx"&gt;&lt;img src="http://feeds.feedburner.com/~f/pseudo-tech-notes?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pseudo-tech-notes/~4/2FvHeddVK30" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pseudo-tech-notes.blogspot.com/feeds/5342631207768293806/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=30809594&amp;postID=5342631207768293806" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/5342631207768293806?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/5342631207768293806?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/pseudo-tech-notes/~3/2FvHeddVK30/linux.html" title="Настройка дополнительных клавиш под Linux" /><author><name>Лаврентий Палыч</name><uri>http://www.blogger.com/profile/12257889673961252182</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_cR10U53OBxA/R8Xau9PAqjI/AAAAAAAAANg/0ZwZ5RO3MZY/S220/pic1.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://pseudo-tech-notes.blogspot.com/2008/09/linux.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MDR3o-eCp7ImA9WxRSFU8.&quot;"><id>tag:blogger.com,1999:blog-30809594.post-7443125797474171722</id><published>2008-09-16T04:14:00.002+04:00</published><updated>2008-09-16T04:37:56.450+04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-16T04:37:56.450+04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="заметки на полях" /><title>Работа с удалённой ФС через ssh</title><content type="html">&lt;div style="text-align: justify;"&gt;Довольно типичная задача когда необходимо быстренько что-то залить на сервер или перекинуть с сервера на сервер, причём ftp на серверах нет и не будет(по разным причинам). Когда это "что-то" - мои исходники/скрипты и т.п., то я использую svn потому что такие вещи у меня всегда в репозитории. Но что делать когда это например гигантский дамп БД, куча логов и тп? Тогда я обычно использовал scp - отлично копирует, но по юзабилити конечно консольно  минимилистична. В принципе с помощью scp можно сделать всё что нужно. Но не очень удобно в некоторых случаях.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;А удобнее использовать fuse и sshfs (в федоре пакеты fuse и fuse-sshfs). Тогда для того чтобы подмонтировать удалённую ФС необходимо сделать что-то типа такого:&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family: courier new;"&gt;sshfs root@server.com:/path/on/server /path/on/local&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Тогда в /path/on/local у вас будет доступна /path/on/server находящаяся на сервере server.com. Отмонтировать можно например так:&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family: courier new;"&gt;fusermount -u /path/on/local&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Вобщем в некоторых случаях sshfs экономит кучу времени.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30809594-7443125797474171722?l=pseudo-tech-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/pseudo-tech-notes?a=01O752Ss"&gt;&lt;img src="http://feeds.feedburner.com/~f/pseudo-tech-notes?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pseudo-tech-notes/~4/je_J4_yS66k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pseudo-tech-notes.blogspot.com/feeds/7443125797474171722/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=30809594&amp;postID=7443125797474171722" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/7443125797474171722?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/7443125797474171722?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/pseudo-tech-notes/~3/je_J4_yS66k/ssh.html" title="Работа с удалённой ФС через ssh" /><author><name>Лаврентий Палыч</name><uri>http://www.blogger.com/profile/12257889673961252182</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_cR10U53OBxA/R8Xau9PAqjI/AAAAAAAAANg/0ZwZ5RO3MZY/S220/pic1.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://pseudo-tech-notes.blogspot.com/2008/09/ssh.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQFQXk7eip7ImA9WxdaFEk.&quot;"><id>tag:blogger.com,1999:blog-30809594.post-1023734827114328461</id><published>2008-08-23T00:59:00.004+04:00</published><updated>2008-08-23T02:31:50.702+04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-23T02:31:50.702+04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="бэкап" /><title>Организация бэкапов в linux</title><content type="html">&lt;div style="text-align: justify;"&gt;Долгое время я вполне обходился рукописным велосипедом для создания бэкапов. Ну т.е. использовал tar с небольшими скриптами.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Но недавно наткнулся на достаточно удобную утилиту написанную на perl - &lt;a href="http://www.rsnapshot.org/"&gt;rsnapshot&lt;/a&gt;. Она использует rsync и hard links для создания серии бэкапов с заданными промежутками (у меня например создаются каждые 4 часа, каждый день и каждую неделю). При этом можно не просто указать что бекапить но и задать скрипты запускающиеся до/после очередного бекапа. Также есть много полезных функций например есть diff (например rsnapshot diff daily.0 daily.1 сравнит последний и предпоследний ежедневные бекапы), rsnapshot du покажет сколько отожрано места под ваши бекапы (отжирает надо сказать не так уж и много - читайте подробнее по ссылкам в заметке). Вобщем изучение man'а занимает минуты, всё просто и удобно - советую.&lt;br /&gt;&lt;br /&gt;Перечислю вкратце плюсы которые я получил. Даже без сжатия бэкапы занимают мало места, делаются быстро. Так как бэкапы не сжаты то мгновенно можно посмотреть всё что нужно (например меняли конфигурацию утилитой и что-то поломалось - хотите посмотреть что поменялось по сравнению скажем со вчерашним конфигом), а не ждать пока распакуется многогиговый зазипованный tar файл. Можно не страдать паранойей и не коммитить в svn каждый чих - хотя конечно это спорно и не для всех подходит. Но для проектов которые вы ведёте с одного компьютера вполне применимо.&lt;br /&gt;&lt;br /&gt;Ссылки по теме:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://www.mikerubel.org/computers/rsync_snapshots/"&gt;http://www.mikerubel.org/computers/rsync_snapshots/&lt;/a&gt; - желающим соорудить свой велосипед во чтобы то ни стало :)&lt;/li&gt;&lt;li&gt;&lt;a href="http://gentoo-wiki.com/HOWTO_Backup_to_DVD"&gt;http://gentoo-wiki.com/HOWTO_Backup_to_DVD&lt;/a&gt; - о тонкостях бэкапа на DVD&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.linux-backup.net/App/"&gt;http://www.linux-backup.net/App/&lt;/a&gt; - куча ссылок по теме, но много устаревших&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;br /&gt;P.S. да и делайте бэкап не на тот же диск на котором данные которые вы бэкапите. Помните закон Мерфи - бэкап нужен тогда когда его нет.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30809594-1023734827114328461?l=pseudo-tech-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/pseudo-tech-notes?a=oymKRPXM"&gt;&lt;img src="http://feeds.feedburner.com/~f/pseudo-tech-notes?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pseudo-tech-notes/~4/s9RC7ZDk12M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pseudo-tech-notes.blogspot.com/feeds/1023734827114328461/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=30809594&amp;postID=1023734827114328461" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/1023734827114328461?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/1023734827114328461?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/pseudo-tech-notes/~3/s9RC7ZDk12M/linux.html" title="Организация бэкапов в linux" /><author><name>Лаврентий Палыч</name><uri>http://www.blogger.com/profile/12257889673961252182</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_cR10U53OBxA/R8Xau9PAqjI/AAAAAAAAANg/0ZwZ5RO3MZY/S220/pic1.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://pseudo-tech-notes.blogspot.com/2008/08/linux.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkICQn45cCp7ImA9WxdXFk0.&quot;"><id>tag:blogger.com,1999:blog-30809594.post-3816516439037067746</id><published>2008-05-18T18:10:00.008+04:00</published><updated>2008-06-28T03:16:03.028+04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-28T03:16:03.028+04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="perl тусовки" /><title>Сходил на YAPC::Russia 2008</title><content type="html">Сходил на &lt;a href="http://2008.perlrussia.ru/"&gt;May Perl&lt;/a&gt;,  впечатления смешанные.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Для начала впечатления от докладов, которые я посетил.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1 день:&lt;br /&gt;&lt;div style="text-align: justify;"&gt;IO::Lambda - в принципе для меня это было что-то что я не трогал руками, но имею в планах попробовать - было интересно. Конечно то что модулю всего полгода несколько не радует, но с другой стороны свежие модули оперативней патчат по моим наблюдением, так что посмотрим.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Профилирование perl-кода - в принципе несмотря на то что большая часть информации для меня не была новой, но например kcachegrind надо будет попробовать (cправедливости ради  отмечу что слышал и раньше про неё, но по-моему не использовал).&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;May POE - ну доклад в принципе грамотный, но мне не особо интересный, так как новой информации там для меня было (да и в целом доклад в основном обзорный был).&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Потом я пошёл на мастеркласс POE - но там были проблемы с инетом, поэтому всё пошло как-то сумбурно. В целом наверное зря я на него пошёл - мастеркласс мне был не нужен, я собственно хотел задать один вопрос (задал только во второй день поймав Серёжкина с утра, но об этом ниже). Вобщем поскучал я тут, в отличие от тех кого поражала/развлекала скорость эффективного кнопкодавления в *nix консоли и emacs'е - я 90% времени живу в никсах, поэтому меня это не развлекло. Вобщем со стороны конечно виднее - но можно было и без инета придумать чего-нибудь (как вариант запустить apache/nginx и его дрючить POE или носить с собой usb-bluetooth и мобилу на случай отсутствия инета(хотя такой тонкий канал поможет не всегда)).&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;"Аргументы в пользу XSLT" - на мой взгляд инородный доклад. Лично мне абсолютно неинтересен был - аргументы и за и против XSLT давно известны всем интересующимся, а про какое-то приложение к perl'у не было вообще ничего сказано.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Построение совместимых Perl/mod_perl систем с веб-интерфейсом - чего-то я вообще не помню этого доклада. Либо его отменили, либо не зацепило совсем(судя по названию это очень может быть).&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Perl и Web 2.0 - несмотря на то что ничего особо нового для меня не было сказано, было весело и запомнилось. Не зря докладчику дали приз. :)&lt;br /&gt;&lt;br /&gt;2-й день:&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Блицы вобщем понравились все. Единственное что про обфускатор Stunnix мне было неинтересно(всё очевидно и уж больно самопиарно, хотя может кому полезно будет), ну а "CGI.pm - зло?!" не очень вписывается в формат блиц-доклада на мой взгляд, т.к. вопросы из зала наверняка бы были. :) Ну и у Серёжкина блиц получился не до конца&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Perl+виртуализация - меня не зацепило, но возможно я просто не проникся до конца.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;UTF Perl Practice - в принципе полезный доклад для тех кто не хочет сам пройтись по граблям. Жаль что его не было лет 5 назад когда я на эти грабли наступал изо всех сил. :)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;CMS для крупного портала на примере TRAVEL.RU - ну реально работающие решения всегда интересны. Докладчик грамотно отбивался от каверзных и не очень вопросов - видно что не в первый раз. :)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;ООП. Parrot. - Ну тут для меня тема была относительно новая, да и у Серёжкина на этот раз были заранее приготовленные слайды  так что доклад был интересен и безэксесен :).&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;YAPC::Russia::Golf - вобщем задачи были не из разряда моих любимых, да и в субботу у меня было много дел после которых в воскресенье болела голова, поэтому я забил на них. :) Но решение-победитель про делимость на 11 удивило, так как в перерыве начали прикидывать как можно сделать, но ничего похожего даже близко не придумывалось.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Теперь не про доклады, а про разное:&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Во время обеда оказался за одним столом с другими перловиками и выяснил что POE полетел не так как надо не только у меня. Т.е.  не у меня одного он тёк по копейке в минуту, и не меня одного его скорость не впечатлила. Вобщем после этого я передумал по этому поводу пытать Серёжкина - может действительно для его задач и скорость достаточная, и утечки не критичны (там вобщем действительно текло помаленьку, ну и как кто-то сказал  ничто не мешает убить и перезапустить скажем раз в сутки).&lt;br /&gt;&lt;br /&gt;Но на второй день случайно поймав Серёжкина, всё же спросил его про POE. Он сказал что у него оно работает и не течёт, но версия 1.0002. Я же пробовал давно и наверняка более младшую версию. Вобщем придётся видимо опять уколоться и пожрать кактус.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Про организацию:&lt;/span&gt;&lt;br /&gt;Футболки выдали, кофебрейки  были с едой и питьём - вроде всем хватило. Вобщем в этой части всё нормально.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Из минусов - накладки в докладах одного из организаторов (это я про Серёжкина), это как-то не очень радовало. Хотя я иногда малотерпим к чужой неорганизованности, поэтому может излишне предвзят. Ну и кроме того к чему-то придраться надо, а тут вроде как и по делу... :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Добавление:&lt;/span&gt;&lt;br /&gt;Забыл про два доклада вошедшие вне программы:&lt;br /&gt;ПеАр LinuxFormat - на удивление прошёл на удивление легко.&lt;br /&gt;ORM - местами было интересно, хотя я пока для своих задач не вижу смысла в нём особого.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Добавление 2:&lt;/span&gt;&lt;br /&gt;Забыл написать что в целом неплохо, но могло быть лучше. :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update 3: &lt;/span&gt;решил дать ссылку на страницу где есть ссылки на презентации а не втыкать их сюда по одной :) : &lt;a href="http://event.perlrussia.ru/yr2008/talks"&gt;http://event.perlrussia.ru/yr2008/talks&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;В рассылке jerom выложил новое мегарешение гольфа про деление на 11 (автор некто mtve):&lt;br /&gt;&lt;pre wrap=""&gt;#!perl -lp&lt;br /&gt;$_=s/..?\b/"@:[0..$&amp;amp;]"/e?redo:/^( {11})*$/?yes:'no'&lt;/pre&gt;Вобщем я поражён, пока больше и сказать нечего. :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update 4:&lt;/span&gt; видео с конференции здесь: &lt;a href="http://event.perlrussia.ru/yr2008/media/video.html"&gt;http://event.perlrussia.ru/yr2008/media/video.html&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30809594-3816516439037067746?l=pseudo-tech-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/pseudo-tech-notes?a=kUCHzxkP"&gt;&lt;img src="http://feeds.feedburner.com/~f/pseudo-tech-notes?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pseudo-tech-notes/~4/lc8GeaYi4ns" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pseudo-tech-notes.blogspot.com/feeds/3816516439037067746/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=30809594&amp;postID=3816516439037067746" title="Комментарии: 6" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/3816516439037067746?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/3816516439037067746?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/pseudo-tech-notes/~3/lc8GeaYi4ns/yapcrussia-2008.html" title="Сходил на YAPC::Russia 2008" /><author><name>Лаврентий Палыч</name><uri>http://www.blogger.com/profile/12257889673961252182</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_cR10U53OBxA/R8Xau9PAqjI/AAAAAAAAANg/0ZwZ5RO3MZY/S220/pic1.jpg" /></author><thr:total>6</thr:total><feedburner:origLink>http://pseudo-tech-notes.blogspot.com/2008/05/yapcrussia-2008.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UEQXY9fSp7ImA9WxdTEU0.&quot;"><id>tag:blogger.com,1999:blog-30809594.post-2869398021406574607</id><published>2008-05-07T00:20:00.000+04:00</published><updated>2008-05-07T00:20:00.865+04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-07T00:20:00.865+04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="vim" /><category scheme="http://www.blogger.com/atom/ns#" term="заметки на полях" /><title>vim как удобный diff (часть 2)</title><content type="html">&lt;div style="text-align: justify;"&gt;В предыдущем посте &lt;a href="http://pseudo-tech-notes.blogspot.com/2008/05/vim-diff.html"&gt;vim как удобный diff&lt;/a&gt; я уже описал как использовать vim в качестве diff. Но погуглив нашёл что оказывается есть дополнительная настройка которая делает использование vim для этой задачи ещё удобнее. Настройка называется diffopt и по умолчанию установлена в filler:&lt;blockquote&gt;:set diffopt=filler&lt;/blockquote&gt;Это заставляет оба столбца скролится синхронно. Но кроме этого можно задать игнорирование начальных и конечных пробелов, и  кол-во пробелов подряд:&lt;br /&gt;&lt;blockquote&gt;:set diffopt+=iwhite&lt;/blockquote&gt;Ну и конечно можно задать игнорирование регистра при сравнении:&lt;br /&gt;&lt;blockquote&gt;:set diffopt+=icase&lt;/blockquote&gt;Также можно задать кол-во строк между "схлопнутыми одинаковыми фрагментами" и отличающимися фрагментами (коряво описал - но прямее не получается чего-то), по умолчанию выставлено в 6:&lt;br /&gt;&lt;blockquote&gt;:set diffopt+=context:2&lt;/blockquote&gt;Пример того что получается при выставленном icase и context:2 приведён ниже(я добавил в f1 и f2 дополнительных 8 строк чтобы fold'инг был виден):&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_cR10U53OBxA/SB-zxnVtKOI/AAAAAAAAAac/jhAMvr0SEkE/s1600-h/vimdiff2.png"&gt;&lt;img src="http://bp0.blogger.com/_cR10U53OBxA/SB-zxnVtKOI/AAAAAAAAAac/jhAMvr0SEkE/s400/vimdiff2.png" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_cR10U53OBxA/SB-zxnVtKOI/AAAAAAAAAac/jhAMvr0SEkE/s400/vimdiff2.png" alt="" id="BLOGGER_PHOTO_ID_5197070159963826402" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30809594-2869398021406574607?l=pseudo-tech-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/pseudo-tech-notes?a=PXFM6Mch"&gt;&lt;img src="http://feeds.feedburner.com/~f/pseudo-tech-notes?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pseudo-tech-notes/~4/34Np7gti-x4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pseudo-tech-notes.blogspot.com/feeds/2869398021406574607/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=30809594&amp;postID=2869398021406574607" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/2869398021406574607?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/2869398021406574607?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/pseudo-tech-notes/~3/34Np7gti-x4/vim-diff-2.html" title="vim как удобный diff (часть 2)" /><author><name>Лаврентий Палыч</name><uri>http://www.blogger.com/profile/12257889673961252182</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_cR10U53OBxA/R8Xau9PAqjI/AAAAAAAAANg/0ZwZ5RO3MZY/S220/pic1.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://bp0.blogger.com/_cR10U53OBxA/SB-zxnVtKOI/AAAAAAAAAac/jhAMvr0SEkE/s72-c/vimdiff2.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://pseudo-tech-notes.blogspot.com/2008/05/vim-diff-2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8DRns6fCp7ImA9WxdTEE4.&quot;"><id>tag:blogger.com,1999:blog-30809594.post-1843384692192301053</id><published>2008-05-06T03:26:00.004+04:00</published><updated>2008-05-06T04:14:37.514+04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-06T04:14:37.514+04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="vim" /><category scheme="http://www.blogger.com/atom/ns#" term="заметки на полях" /><title>vim как удобный diff</title><content type="html">&lt;div style="text-align: justify;"&gt;Довольно обычная задача - сравнить два файла построчно. Можно конечно использовать diff (под виндой есть наверное что-то похожее, ну аналог точно есть - сам когда-то давно использовал), но вывод diff не очень красив, а для усталого ума ещё и не достаточно очевиден...&lt;br /&gt;&lt;br /&gt;Пусть у нас есть два файла f1 и f2.&lt;br /&gt;Файл f1 состоит из 5 следующих строк:&lt;br /&gt;&lt;blockquote&gt;row1&lt;br /&gt;row2&lt;br /&gt;row3&lt;br /&gt;row4&lt;br /&gt;row5&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Файл f2 получен из f1 закоментированием одной строки и добавлением двух новых:&lt;br /&gt;&lt;blockquote&gt;row1&lt;br /&gt;row2&lt;br /&gt;#row3&lt;br /&gt;newRow1&lt;br /&gt;row4&lt;br /&gt;newRow2&lt;br /&gt;row5&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Выполнение diff нам даёт следующий результат:&lt;br /&gt;&lt;blockquote&gt;[***]# diff f1 f2&lt;br /&gt;3c3,4&lt;br /&gt;&lt; row3&lt;br /&gt;---&lt;br /&gt;&gt; #row3&lt;br /&gt;&gt; newRow1&lt;br /&gt;4a6&lt;br /&gt;&gt; newRow2&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;В принципе понятно но не сказать что прямо сразу. Можно сделать чуть получше:&lt;br /&gt;&lt;blockquote&gt;[***]# diff -u f1 f2&lt;br /&gt;--- f1  2008-05-06 03:24:16.000000000 +0400&lt;br /&gt;+++ f2  2008-05-06 03:24:41.000000000 +0400&lt;br /&gt;@@ -1,5 +1,7 @@&lt;br /&gt;row1&lt;br /&gt;row2&lt;br /&gt;-row3&lt;br /&gt;+#row3&lt;br /&gt;+newRow1&lt;br /&gt;row4&lt;br /&gt;+newRow2&lt;br /&gt;row5&lt;/blockquote&gt;Но на больших файлах не очень это удобно смотреть будет, ну и если я сравниваю с целью поправить что-то то хотелось бы прямо на месте это сделать. И это можно сделать командой `vim -d f1 f2` что синонимично `vimdiff f1 f2`. После запуска этой команды получим следующую картину:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_cR10U53OBxA/SB-ewHVtKNI/AAAAAAAAAaU/BJz1rZkasfU/s1600-h/vimdiff.png"&gt;&lt;img src="http://bp2.blogger.com/_cR10U53OBxA/SB-ewHVtKNI/AAAAAAAAAaU/BJz1rZkasfU/s400/vimdiff.png" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_cR10U53OBxA/SB-ewHVtKNI/AAAAAAAAAaU/BJz1rZkasfU/s400/vimdiff.png" alt="" id="BLOGGER_PHOTO_ID_5197047044449839314" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;На мой взгляд весьма наглядно и удобно. Ну по крайней мере для тех кто умеет пользоваться vim. Тем кто не умеет - советую научится, так как vim обычно есть везде на *nix, там где нету - можно быстро поставить (даже под винды).&lt;br /&gt;&lt;br /&gt;P.S. Если вдруг когда-нибудь сюда набегут emacs'овцы - на emacs'е я сидел, правда довольно давно. Со временем стал считать что он избыточен для одних задач и недостаточен/неудобен для других (это вовсе не значит что vim для этих задач достаточен), так же избегаю лишних наворотов в vim'е. Но своё мнение другим не навязываю. :)&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30809594-1843384692192301053?l=pseudo-tech-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/pseudo-tech-notes?a=WoAONcQo"&gt;&lt;img src="http://feeds.feedburner.com/~f/pseudo-tech-notes?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pseudo-tech-notes/~4/Rgbg0KlS3i0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pseudo-tech-notes.blogspot.com/feeds/1843384692192301053/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=30809594&amp;postID=1843384692192301053" title="Комментарии: 2" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/1843384692192301053?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/1843384692192301053?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/pseudo-tech-notes/~3/Rgbg0KlS3i0/vim-diff.html" title="vim как удобный diff" /><author><name>Лаврентий Палыч</name><uri>http://www.blogger.com/profile/12257889673961252182</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_cR10U53OBxA/R8Xau9PAqjI/AAAAAAAAANg/0ZwZ5RO3MZY/S220/pic1.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://bp2.blogger.com/_cR10U53OBxA/SB-ewHVtKNI/AAAAAAAAAaU/BJz1rZkasfU/s72-c/vimdiff.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://pseudo-tech-notes.blogspot.com/2008/05/vim-diff.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0ENSX86eCp7ImA9WxZaE0U.&quot;"><id>tag:blogger.com,1999:blog-30809594.post-5870110296220726681</id><published>2008-04-28T14:24:00.003+04:00</published><updated>2008-04-28T17:34:58.110+04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-28T17:34:58.110+04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="заметки на полях" /><title>Покажи мне свою history и я скажу кто ты есть...</title><content type="html">Увидел на одном зарубежном блоге как собрать статистику по history коммандной строки в *nix, увеличил кол-во выводимых позиций до 50 и получил следующую картину:&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;history 1000 | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head -n 50&lt;br /&gt;&lt;br /&gt;134 vim&lt;br /&gt;123 svn&lt;br /&gt;108 make&lt;br /&gt;91 ssh&lt;br /&gt;48 dig&lt;br /&gt;34 mc&lt;br /&gt;33 perl&lt;br /&gt;29 rpm&lt;br /&gt;24 yum&lt;br /&gt;24 wget&lt;br /&gt;23 ps&lt;br /&gt;23 ls&lt;br /&gt;22 ./uri_test.pl&lt;br /&gt;21 startx&lt;br /&gt;21 service&lt;br /&gt;18 mysql&lt;br /&gt;15 shutdown&lt;br /&gt;12 touch&lt;br /&gt;12 man&lt;br /&gt;11 kill&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Всё что меньше 10 я отрезал - там вобщем много всего и неинтересно. В моём случае стата конечно не очень репрезентативна. dig - это временное явление, так как я настраивал dns кэш просто. Ну и make это не потому что я что-то руками собираю или на c/c++ мастерю - а в основном из-за сборки/инсталла perl-овых модулей (ну малая доля вызовов make пришлась на небольшой с++ проект). Но вобщем и целом видно чем человек занимается.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30809594-5870110296220726681?l=pseudo-tech-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/pseudo-tech-notes?a=kDdwRft3"&gt;&lt;img src="http://feeds.feedburner.com/~f/pseudo-tech-notes?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pseudo-tech-notes/~4/PZmQaNZ5-2k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pseudo-tech-notes.blogspot.com/feeds/5870110296220726681/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=30809594&amp;postID=5870110296220726681" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/5870110296220726681?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/5870110296220726681?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/pseudo-tech-notes/~3/PZmQaNZ5-2k/history.html" title="Покажи мне свою history и я скажу кто ты есть..." /><author><name>Лаврентий Палыч</name><uri>http://www.blogger.com/profile/12257889673961252182</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_cR10U53OBxA/R8Xau9PAqjI/AAAAAAAAANg/0ZwZ5RO3MZY/S220/pic1.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://pseudo-tech-notes.blogspot.com/2008/04/history.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8ER3c7eSp7ImA9WxZUGU4.&quot;"><id>tag:blogger.com,1999:blog-30809594.post-8426633723047262575</id><published>2008-04-11T20:14:00.003+04:00</published><updated>2008-04-11T21:10:06.901+04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-11T21:10:06.901+04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="языки программирования" /><title>Оригинальный аргумент в пользу того что PHP зло</title><content type="html">&lt;div style="text-align: justify;"&gt;Недавно нашёл доказательство мразостности PHP - люди посчитали количество goto в сорцах разных языков тут: &lt;a href="http://blog.ptpm.ru/index.php/2008/03/24/mrazotnyjj-pkhp/"&gt;http://blog.ptpm.ru/index.php/2008/03/24/mrazotnyjj-pkhp/&lt;/a&gt;. :)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Perl получился менее мразостным чем PHP (что и так очевидно) и чем Python.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;На самом деле я хотел попиарить тут проект &lt;a href="http://defun.ru/"&gt;http://defun.ru/&lt;/a&gt; который что-то типа аггрегатора новостей /статей про функциональные языки и не только. Вобщем на данный момент есть что почитать интересного.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;P.S. Просьба к части про мразостность языков отнестись с долей юмора.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30809594-8426633723047262575?l=pseudo-tech-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/pseudo-tech-notes?a=Z02XNNyK"&gt;&lt;img src="http://feeds.feedburner.com/~f/pseudo-tech-notes?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pseudo-tech-notes/~4/Bryvzfp6vDo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pseudo-tech-notes.blogspot.com/feeds/8426633723047262575/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=30809594&amp;postID=8426633723047262575" title="Комментарии: 2" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/8426633723047262575?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/8426633723047262575?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/pseudo-tech-notes/~3/Bryvzfp6vDo/php.html" title="Оригинальный аргумент в пользу того что PHP зло" /><author><name>Лаврентий Палыч</name><uri>http://www.blogger.com/profile/12257889673961252182</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_cR10U53OBxA/R8Xau9PAqjI/AAAAAAAAANg/0ZwZ5RO3MZY/S220/pic1.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://pseudo-tech-notes.blogspot.com/2008/04/php.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkAMSHY-eCp7ImA9WxZUEU8.&quot;"><id>tag:blogger.com,1999:blog-30809594.post-1603527606482568651</id><published>2008-04-02T09:48:00.003+04:00</published><updated>2008-04-02T12:26:29.850+04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-02T12:26:29.850+04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="lwp" /><category scheme="http://www.blogger.com/atom/ns#" term="perl" /><title>Неправильный POST через LWP</title><content type="html">&lt;div style="text-align: justify;"&gt;Писал я тут небольшое приложение и написал к нему тест на perl - с помощью LWP посылал POST запрос ну и соответственно проверял реакцию. Реакция оказалась неправильной, но при этом если я руками через firefox слал то же самое то всё замечательно работало. Побайтно сравнив посылаемое в обоих случаях - обнаружил что perl не эскейпит символ "!", т.е. посылает как есть, а firefox как %21. Полез искать почему так - нашёл что в итоге вызывается query_form (в URI::_query) который соответственно вызывает метод query такой:&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;sub query&lt;br /&gt;{&lt;br /&gt;  my $self = shift;&lt;br /&gt;  $$self =~ m,^([^?\#]*)(?:\?([^\#]*))?(.*)$,s or die;&lt;br /&gt;&lt;br /&gt;  if (@_) {&lt;br /&gt;my $q = shift;&lt;br /&gt;$$self = $1;&lt;br /&gt;if (defined $q) {&lt;br /&gt;    $q =~ s/([^$URI::uric])/$URI::Escape::escapes{$1}/go;&lt;br /&gt;    $$self .= "?$q";&lt;br /&gt;}&lt;br /&gt;$$self .= $3;&lt;br /&gt;  }&lt;br /&gt;  $2;&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Т.е. эскейпится всё кроме символов в $URI::uric. Полез смотреть что там прописано:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;$reserved   = q(;/?:@&amp;amp;=+$,[]);&lt;br /&gt;$mark       = q(-_.!~*'());                                    #'; emacs&lt;br /&gt;$unreserved = "A-Za-z0-9\Q$mark\E";&lt;br /&gt;$uric       = quotemeta($reserved) . $unreserved . "%";&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Т.к. "!" в $mark то он тоже не преобразуется. Полез смотреть стандарты в rfc1866 сказано следующее:&lt;br /&gt;&lt;blockquote&gt;The form field names and values are escaped: space&lt;br /&gt;     characters are replaced by `+', and then reserved characters&lt;br /&gt;     are escaped as per [URL]; that is, non-alphanumeric&lt;br /&gt;     characters are replaced by `%HH', a percent sign and two&lt;br /&gt;     hexadecimal digits representing the ASCII code of the&lt;br /&gt;     character. Line breaks, as in multi-line text field values,&lt;br /&gt;     are represented as CR LF pairs, i.e. `%0D%0A'.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Тут конечно можно задуматся входит "!" в alphanumeric или нет, но rfc2396 рассеивает все сомнения:&lt;br /&gt;&lt;blockquote&gt;      alpha    = lowalpha | upalpha&lt;br /&gt;&lt;br /&gt;    lowalpha = "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" |&lt;br /&gt;               "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" |&lt;br /&gt;               "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z"&lt;br /&gt;&lt;br /&gt;    upalpha  = "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" |&lt;br /&gt;               "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" |&lt;br /&gt;               "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z"&lt;br /&gt;&lt;br /&gt;    digit    = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" |&lt;br /&gt;               "8" | "9"&lt;br /&gt;&lt;br /&gt;    alphanum = alpha | digit&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Т.е. firefox прав, а lwp нет. В принципе lwp вообще непонятно зачем form_query в POST вызывает - оно не для этого. Ну ладно - это всё лирика...&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Поправить дело можно относительно легко - исправить $URI::uric на то что нужно перед POST, а потом обратно. Заменить можно например так:  $URI::uric = quotemeta("=&amp;amp;+")."A-Za-z0-9"; . Но возможно(скорей всего) я тут что-то не учёл - просто для моего теста это сработало, а всесторонне исследовать - времени нет.&lt;br /&gt;&lt;br /&gt;Всё-таки LWP написан очень плохо - в который раз убеждаюсь. Зачитать про &lt;a href="http://pseudo-tech-notes.blogspot.com/2007/09/cpan-lwp.html"&gt;другой баг LWP&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30809594-1603527606482568651?l=pseudo-tech-notes.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/pseudo-tech-notes?a=WmTZ3ZFV"&gt;&lt;img src="http://feeds.feedburner.com/~f/pseudo-tech-notes?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/pseudo-tech-notes/~4/v_NBeAt8kRU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://pseudo-tech-notes.blogspot.com/feeds/1603527606482568651/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=30809594&amp;postID=1603527606482568651" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/1603527606482568651?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30809594/posts/default/1603527606482568651?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/pseudo-tech-notes/~3/v_NBeAt8kRU/post-lwp.html" title="Неправильный POST через LWP" /><author><name>Лаврентий Палыч</name><uri>http://www.blogger.com/profile/12257889673961252182</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://bp2.blogger.com/_cR10U53OBxA/R8Xau9PAqjI/AAAAAAAAANg/0ZwZ5RO3MZY/S220/pic1.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://pseudo-tech-notes.blogspot.com/2008/04/post-lwp.html</feedburner:origLink></entry></feed>

