<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>софт, хард &#38; интERнет &#187; Разработка</title>
	<atom:link href="http://www.all-x.net/category/devel/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.all-x.net</link>
	<description>Личный опыт укрощения компьютеров</description>
	<lastBuildDate>Thu, 22 Sep 2011 06:28:13 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Использование Firefox как глобального XULRunner для Windows</title>
		<link>http://www.all-x.net/2010/08/13/firefox-global-xulrunne/</link>
		<comments>http://www.all-x.net/2010/08/13/firefox-global-xulrunne/#comments</comments>
		<pubDate>Fri, 13 Aug 2010 11:38:41 +0000</pubDate>
		<dc:creator>allex</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[XUL]]></category>

		<guid isPermaLink="false">http://www.all-x.net/?p=784</guid>
		<description><![CDATA[<p><a href="https://developer.mozilla.org/ru/XULRunner" class="broken_link" >XULRunner</a>&#160;&#8212; это движок для XUL+XPCOM приложений, таких как Firefox и Thunderbird. Кроме того, XULRunner можно использовать для встраивания браузера, например, в Eclipse. Для установки XULRunner для Windows его надо скачать, распаковать и объявить:</p>
<pre>xulrunner.exe -register-global</pre>
<p>Очень просто, но при уже установленном Firefox обидно ставить отдельную копию XULRunner. Так вот, оказывается можно скопировать в папку с Firefox только файл <code>xulrunner.exe</code> и выполнить вышеуказанную команду. Мелочь, а приятно.</p>
<p>Кстати, если не хочется искать xulrunner, то можно просто добавить в реестр следующую информацию (следите за путями и номерами версий!):</p>
<pre>Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\mozilla.org]

[HKEY_LOCAL_MACHINE\SOFTWARE\mozilla.org\GRE]

[HKEY_LOCAL_MACHINE\SOFTWARE\mozilla.org\GRE\1.9.2.8]
"Version"="1.9.2.8"
"GreHome"="C:\\Program Files\\Mozilla Firefox"
"xulrunner"="true"
"abi"="x86-msvc"
"javaxpcom"="1"
[HKEY_LOCAL_MACHINE\SOFTWARE\mozilla.org\Mozilla]
"CurrentVersion"="1.9.2.8"
</pre>
]]></description>
			<content:encoded><![CDATA[<p><a href="https://developer.mozilla.org/ru/XULRunner" class="broken_link" >XULRunner</a>&nbsp;&mdash; это движок для XUL+XPCOM приложений, таких как Firefox и Thunderbird. Кроме того, XULRunner можно использовать для встраивания браузера, например, в Eclipse. Для установки XULRunner для Windows его надо скачать, распаковать и объявить:</p>
<pre>xulrunner.exe -register-global</pre>
<p>Очень просто, но при уже установленном Firefox обидно ставить отдельную копию XULRunner. Так вот, оказывается можно скопировать в папку с Firefox только файл <code>xulrunner.exe</code> и выполнить вышеуказанную команду. Мелочь, а приятно.</p>
<p>Кстати, если не хочется искать xulrunner, то можно просто добавить в реестр следующую информацию (следите за путями и номерами версий!):</p>
<pre>Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\mozilla.org]

[HKEY_LOCAL_MACHINE\SOFTWARE\mozilla.org\GRE]

[HKEY_LOCAL_MACHINE\SOFTWARE\mozilla.org\GRE\1.9.2.8]
"Version"="1.9.2.8"
"GreHome"="C:\\Program Files\\Mozilla Firefox"
"xulrunner"="true"
"abi"="x86-msvc"
"javaxpcom"="1"
[HKEY_LOCAL_MACHINE\SOFTWARE\mozilla.org\Mozilla]
"CurrentVersion"="1.9.2.8"
</pre>
<p><img src="http://www.all-x.net/?ak_action=api_record_view&id=784&type=feed" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.all-x.net/2010/08/13/firefox-global-xulrunne/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wordpress плагин WP-Shortstat и кодировки</title>
		<link>http://www.all-x.net/2010/07/19/wp-shortstat/</link>
		<comments>http://www.all-x.net/2010/07/19/wp-shortstat/#comments</comments>
		<pubDate>Mon, 19 Jul 2010 09:12:25 +0000</pubDate>
		<dc:creator>allex</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Разработка]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[кодировка]]></category>

		<guid isPermaLink="false">http://www.all-x.net/?p=752</guid>
		<description><![CDATA[<p>Прижился у меня в блогах на Wordpress плагин <a href="http://blog.happyarts.de/wp-shortstat">WP-ShortStat</a>. Официально он работает c Wordpress до версии 2.7, последний релиз был в прошлом году. Так что пришлось самостоятельно устранять проблемы с кодировками. Заодно добавил поисковик mail.ru.</p>
<p>В PHP я почти ноль, всё делал методом тыка, если ошибся&#160;&#8212; поправьте, пожалуйста.</p>
<ul>
<li>Яндекс и mail.ru иногда отдают текст русского запроса в кодировке windows-1251, а не utf-8. Нашел на форуме способ определения кодировки, который работает лучше, чем <code>mb_detect_encoding</code>. Добавил в класс wp_shortstat функцию преобразования кодировки запроса: <code>query2utf8</code>. Вызываю её только для Яндекса и mail.ru, хотя по идее надо бы для всех поисковиков. Но кодировка запросов Google почему-то не всегда определяется правильно.</li>
<li>Перенес в функцию <code>sniffKeyword</code> преобразование запроса в нижний регистр.</li>
<li>Перенс в функцию <code>sniffKeyword</code> перекодировку запроса в utf-8.</li>
</ul>
<p>Теперь <code>sniffKeyword</code> возвращает полностью готовый к употреблению поисковый запрос&#160;&#8212; преобразованный к нижнему регистру, в utf-8. Русские буквы и отображаются, и сохраняются в базе правильно.<br />
Осталась непонятная проблема с кириллической буквой &#39;е&#39;&#160;&#8212; иногда вместо неё почему-то отображается &#39;� �&#39;.</p>
<p><a href='http://www.all-x.net/wp-content/uploads/2010/07/wp-shortstat-allex.zip'>Код для интересующихся. Основан на WP-Shortstat-1.15.</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Прижился у меня в блогах на Wordpress плагин <a href="http://blog.happyarts.de/wp-shortstat">WP-ShortStat</a>. Официально он работает c Wordpress до версии 2.7, последний релиз был в прошлом году. Так что пришлось самостоятельно устранять проблемы с кодировками. Заодно добавил поисковик mail.ru.</p>
<p>В PHP я почти ноль, всё делал методом тыка, если ошибся&nbsp;&mdash; поправьте, пожалуйста.</p>
<ul>
<li>Яндекс и mail.ru иногда отдают текст русского запроса в кодировке windows-1251, а не utf-8. Нашел на форуме способ определения кодировки, который работает лучше, чем <code>mb_detect_encoding</code>. Добавил в класс wp_shortstat функцию преобразования кодировки запроса: <code>query2utf8</code>. Вызываю её только для Яндекса и mail.ru, хотя по идее надо бы для всех поисковиков. Но кодировка запросов Google почему-то не всегда определяется правильно.</li>
<li>Перенес в функцию <code>sniffKeyword</code> преобразование запроса в нижний регистр.</li>
<li>Перенс в функцию <code>sniffKeyword</code> перекодировку запроса в utf-8.</li>
</ul>
<p>Теперь <code>sniffKeyword</code> возвращает полностью готовый к употреблению поисковый запрос&nbsp;&mdash; преобразованный к нижнему регистру, в utf-8. Русские буквы и отображаются, и сохраняются в базе правильно.<br />
Осталась непонятная проблема с кириллической буквой &#39;е&#39;&nbsp;&mdash; иногда вместо неё почему-то отображается &#39;� �&#39;.</p>
<p><a href='http://www.all-x.net/wp-content/uploads/2010/07/wp-shortstat-allex.zip'>Код для интересующихся. Основан на WP-Shortstat-1.15.</a></p>
<p><img src="http://www.all-x.net/?ak_action=api_record_view&id=752&type=feed" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.all-x.net/2010/07/19/wp-shortstat/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Перенос Cygwin в другую папку</title>
		<link>http://www.all-x.net/2010/06/23/cygwin-move/</link>
		<comments>http://www.all-x.net/2010/06/23/cygwin-move/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 04:33:10 +0000</pubDate>
		<dc:creator>allex</dc:creator>
				<category><![CDATA[Разработка]]></category>
		<category><![CDATA[cygwin]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.all-x.net/?p=733</guid>
		<description><![CDATA[<p>Если переместить папку с установленным Cygwin, то потеряются <code>/</code>, <code>/bin</code> и <code>/lib</code>. Чтобы их восстановить, необходимо прописать в реестре новые пути:</p>
<pre>[HKEY_CURRENT_USER\Software\Cygnus Solutions\Cygwin\mounts v2]
"cygdrive prefix"="/cygdrive"
"cygdrive flags"=dword:00000022

[HKEY_CURRENT_USER\Software\Cygnus Solutions\Cygwin\mounts v2\/]
<strong>"native"="D:\\TOOLS\\cygwin"</strong>
"flags"=dword:00000002

[HKEY_CURRENT_USER\Software\Cygnus Solutions\Cygwin\mounts v2\/usr/bin]
<strong>"native"="D:\\TOOLS\\cygwin/bin"</strong>
"flags"=dword:00000002
[HKEY_CURRENT_USER\Software\Cygnus Solutions\Cygwin\mounts v2\/usr/lib]
<strong>"native"="D:\\TOOLS\\cygwin/lib"</strong>
"flags"=dword:00000002
</pre>
]]></description>
			<content:encoded><![CDATA[<p>Если переместить папку с установленным Cygwin, то потеряются <code>/</code>, <code>/bin</code> и <code>/lib</code>. Чтобы их восстановить, необходимо прописать в реестре новые пути:</p>
<pre>[HKEY_CURRENT_USER\Software\Cygnus Solutions\Cygwin\mounts v2]
"cygdrive prefix"="/cygdrive"
"cygdrive flags"=dword:00000022

[HKEY_CURRENT_USER\Software\Cygnus Solutions\Cygwin\mounts v2\/]
<strong>"native"="D:\\TOOLS\\cygwin"</strong>
"flags"=dword:00000002

[HKEY_CURRENT_USER\Software\Cygnus Solutions\Cygwin\mounts v2\/usr/bin]
<strong>"native"="D:\\TOOLS\\cygwin/bin"</strong>
"flags"=dword:00000002
[HKEY_CURRENT_USER\Software\Cygnus Solutions\Cygwin\mounts v2\/usr/lib]
<strong>"native"="D:\\TOOLS\\cygwin/lib"</strong>
"flags"=dword:00000002
</pre>
<p><img src="http://www.all-x.net/?ak_action=api_record_view&id=733&type=feed" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.all-x.net/2010/06/23/cygwin-move/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XUL Gear стал расширением Firefox</title>
		<link>http://www.all-x.net/2010/05/31/xulgear/</link>
		<comments>http://www.all-x.net/2010/05/31/xulgear/#comments</comments>
		<pubDate>Mon, 31 May 2010 08:11:39 +0000</pubDate>
		<dc:creator>allex</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[XUL]]></category>
		<category><![CDATA[xulgear]]></category>
		<category><![CDATA[XULPIX]]></category>
		<category><![CDATA[ХабраХабр.]]></category>

		<guid isPermaLink="false">http://www.all-x.net/?p=725</guid>
		<description><![CDATA[<p>Визуальный редактор XUL Gear, за которым <a href="http://www.all-x.net/2009/06/19/xulpix/">я слежу</a> ещё с тех пор, когда он назывался XULPIX, <a href="https://addons.mozilla.org/en-US/firefox/addon/162046/">выпущен в виде расширения к Firefox</a>. Об этом мне <a href="http://www.all-x.net/2009/06/19/xulpix/comment-page-1/#comment-29466">сообщил Илья Харламов</a>, который в настоящее время поддерживает этот проект. А я решил, что пора  <a href="http://habrahabr.ru/blogs/firefox/94988/">ознакомить с XUL Gear широкую хабраобщественность</a>.</p>
]]></description>
			<content:encoded><![CDATA[<p>Визуальный редактор XUL Gear, за которым <a href="http://www.all-x.net/2009/06/19/xulpix/">я слежу</a> ещё с тех пор, когда он назывался XULPIX, <a href="https://addons.mozilla.org/en-US/firefox/addon/162046/">выпущен в виде расширения к Firefox</a>. Об этом мне <a href="http://www.all-x.net/2009/06/19/xulpix/comment-page-1/#comment-29466">сообщил Илья Харламов</a>, который в настоящее время поддерживает этот проект. А я решил, что пора  <a href="http://habrahabr.ru/blogs/firefox/94988/">ознакомить с XUL Gear широкую хабраобщественность</a>.</p>
<p><img src="http://www.all-x.net/?ak_action=api_record_view&id=725&type=feed" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.all-x.net/2010/05/31/xulgear/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>За что я люблю язык С</title>
		<link>http://www.all-x.net/2010/05/27/strlen/</link>
		<comments>http://www.all-x.net/2010/05/27/strlen/#comments</comments>
		<pubDate>Thu, 27 May 2010 12:09:36 +0000</pubDate>
		<dc:creator>allex</dc:creator>
				<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Языки]]></category>
		<category><![CDATA[C]]></category>

		<guid isPermaLink="false">http://www.all-x.net/?p=717</guid>
		<description><![CDATA[<p>Пришлось тряхнуть стариной и написать несколько сотен строк кода на С. Лет десять уже этим не занимался, расслабился и огреб по полной программе:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">static</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span> stralloc<span style="color: #009900;">&#40;</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span> str <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">char</span><span style="color: #339933;">*</span> res <span style="color: #339933;">=</span> malloc<span style="color: #009900;">&#40;</span> strlen<span style="color: #009900;">&#40;</span> str <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    strcpy<span style="color: #009900;">&#40;</span> res<span style="color: #339933;">,</span> str <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> res<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Код выглядит как настоящий, замыленным взглядом ошибку увидеть сложно. А уж какие эффекты появляются! Эта функция вызывалась из двух мест:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">static</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span> start<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> stralloc<span style="color: #009900;">&#40;</span> <span style="color: #ff0000;">&#34;{'start':true}&#34;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&#160;
<span style="color: #993333;">static</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span> stop<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> stralloc<span style="color: #009900;">&#40;</span> <span style="color: #ff0000;">&#34;{'stop':true}&#34;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Если вызывать только из первого места сколько угодно раз&#160;&#8212; всё работает. Если вызвать из второго места&#160;&#8212; падает при <em>втором</em> вызове. Если увеличить длину второй строки на один символ&#160;&#8212; опять же всё работает.</p>
<p>Рекомендую попробовать всем, кто использует языки с автоматическим управлением памятью. Незабываемые ощущения гарантированы!</p>
]]></description>
			<content:encoded><![CDATA[<p>Пришлось тряхнуть стариной и написать несколько сотен строк кода на С. Лет десять уже этим не занимался, расслабился и огреб по полной программе:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">static</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span> stralloc<span style="color: #009900;">&#40;</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span> str <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">char</span><span style="color: #339933;">*</span> res <span style="color: #339933;">=</span> malloc<span style="color: #009900;">&#40;</span> strlen<span style="color: #009900;">&#40;</span> str <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    strcpy<span style="color: #009900;">&#40;</span> res<span style="color: #339933;">,</span> str <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> res<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Код выглядит как настоящий, замыленным взглядом ошибку увидеть сложно. А уж какие эффекты появляются! Эта функция вызывалась из двух мест:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">static</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span> start<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> stralloc<span style="color: #009900;">&#40;</span> <span style="color: #ff0000;">&quot;{'start':true}&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">static</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span> stop<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> stralloc<span style="color: #009900;">&#40;</span> <span style="color: #ff0000;">&quot;{'stop':true}&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Если вызывать только из первого места сколько угодно раз&nbsp;&mdash; всё работает. Если вызвать из второго места&nbsp;&mdash; падает при <em>втором</em> вызове. Если увеличить длину второй строки на один символ&nbsp;&mdash; опять же всё работает.</p>
<p>Рекомендую попробовать всем, кто использует языки с автоматическим управлением памятью. Незабываемые ощущения гарантированы!</p>
<p><img src="http://www.all-x.net/?ak_action=api_record_view&id=717&type=feed" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.all-x.net/2010/05/27/strlen/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Ошибка при загрузке JSON данных в Firefox</title>
		<link>http://www.all-x.net/2010/05/26/firefox-json/</link>
		<comments>http://www.all-x.net/2010/05/26/firefox-json/#comments</comments>
		<pubDate>Wed, 26 May 2010 05:08:57 +0000</pubDate>
		<dc:creator>allex</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[JSON]]></category>

		<guid isPermaLink="false">http://www.all-x.net/?p=713</guid>
		<description><![CDATA[<p>Пишу веб-сервис на С с использованием <a href="http://www.gnu.org/software/libmicrohttpd/">GNU libmicrohttpd</a>. Firefox выдает сообщение об ошибке при попытке передать ему JSON: &#171;not well-formed&#187;. При этом всё работает.</p>
<p>Выяснислось, что это он так <a href="http://forum.jquery.com/topic/firefox-error-on-valid-local-json-load-not-well-formed">обижается</a> на то, что в ответе на запрос не указан </p>
<p><code>Content-type: application/json</code></p>
]]></description>
			<content:encoded><![CDATA[<p>Пишу веб-сервис на С с использованием <a href="http://www.gnu.org/software/libmicrohttpd/">GNU libmicrohttpd</a>. Firefox выдает сообщение об ошибке при попытке передать ему JSON: &laquo;not well-formed&raquo;. При этом всё работает.</p>
<p>Выяснислось, что это он так <a href="http://forum.jquery.com/topic/firefox-error-on-valid-local-json-load-not-well-formed">обижается</a> на то, что в ответе на запрос не указан </p>
<p><code>Content-type: application/json</code></p>
<p><img src="http://www.all-x.net/?ak_action=api_record_view&id=713&type=feed" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.all-x.net/2010/05/26/firefox-json/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Трудности перевода</title>
		<link>http://www.all-x.net/2010/02/04/encoding/</link>
		<comments>http://www.all-x.net/2010/02/04/encoding/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 22:32:18 +0000</pubDate>
		<dc:creator>allex</dc:creator>
				<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Языки]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.all-x.net/?p=676</guid>
		<description><![CDATA[<p>Несколько раз пришлось столкнуться с проблемами при чтении/записи кириллицы на Java. К примеру, есть файл в кодировке UTF-8, который читается с помощью <code>java.io.FileInputStream</code>. В результате русские буквы портятся. Бывает, что портятся не все, а только &#171;И&#187; и &#171;ш&#187;. Проблема проявляется только на Windows, классический случай&#160;&#8212; разработчик сидит на Linux: &#171;а у меня всё работает!&#187;.</p>
<p>Пришло время привести в порядок базовые знания.</p>
<p>В языке Java для строк используется тип <code>java.lang.String</code>. Символы в строке имеют тип Character&#160;&#8212; это 16-битные коды символов в кодировке <a href="http://unicode.org/">Unicode</a>.</p>
<p>Кодировка файлов может обеспечивать представление всех Unicode символов (UTF-8, UTF-16) или его подмножества (windows-1251). UTF-8 обеспечивает более компактное хранение наиболее распространенных символов (ASCII), но требует более сложного преобразования, поэтому существуют различные представления Unicode.</p>
<p>Что происходит, когда файл читается с помощью <code>java.io.FileInputStream</code>? Поток байтов преобразуется в последовательность Unicode символов. Стоп. Чтобы правильно преобразовать, надо знать кодировку файла. Но ни один из конструкторов <code>FileInputStream</code> не позволяет указать кодировку! Небольшое исследование выводит на инфрмацию о том, что используется умолчальная (дефолтная, стандартная) кодировка платформы. Что будет, если на самом деле в файле использована другая кодировка? Правильно, мусор. Как это победить? Есть такое свойство <a href="http://stackoverflow.com/questions/1128617/java-default-encoding"><code>file.encoding</code></a>, которое позволяет поменять стандартную кодировку, но оно не документировано (помните книжки типа &#171;Недокументированные возможности MS Word 6.0?&#187;).</p>
<p>Ладно, прочитали из файла строку в неправильной кодировке. В строке мусор. А мы этого не заметили и записали эту строку в другой файл. Конечно, через <code>java.io.FileOutputStream</code>. Тоже не имея возможности указать кодировку. В этом случае&#160;&#8212; к счастью. Потому что обратная функция почти все символы из мусора вернет в нормальное состояние. Кроме, если я не ошибаюсь, &#171;И&#187; и &#171;ш&#187;. А мы будем долго удивляться, откуда такая выборочная беда, ну ведь почти всё же правильно работает!</p>
<p>Лучше бы все символы поломались. Потому что понимание проблемы в этом случае пришло бы быстрее. Вот пример того, что получается при двойной неправильной перекодировке (потоки тут не используются, но суть та же):</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.UnsupportedEncodingException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> StreamEncoding
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args <span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">UnsupportedEncodingException</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">String</span> s <span style="color: #339933;">=</span> <span style="color: #0000ff;">&#34;Иллюзия&#34;</span><span style="color: #339933;">;</span>
        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#40;</span>  <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#40;</span> s.<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&#34;UTF-8&#34;</span> <span style="color: #009900;">&#41;</span>, <span style="color: #0000ff;">&#34;windows-1251&#34;</span> <span style="color: #009900;">&#41;</span>
                                        .<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&#34;windows-1251&#34;</span> <span style="color: #009900;">&#41;</span>
                                      , <span style="color: #0000ff;">&#34;UTF-8&#34;</span>
                                      <span style="color: #009900;">&#41;</span>
                          <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Результат вывода:<br />
<code>�?ллюзия</code></p>
<p>Редкий случай&#160;&#8212; удалось понять суть проблемы. Обычно удаётся устранить проявления, но не докопаться до сути. Как же делать правильно?</p>
<ol>
<li>В своих программах для файловых операций использовать <code>java.io.InputStreamReader/Writer</code> и их конструкторы с указанием кодировки. Не использовать более простые <code>File(Reader/Writer)</code>, потому что они не позволяют указать кодировку. И уж тем более не использовать <code>File(Input/Output)Stream</code>.</li>
<li>Чужие программы иногда удается победить указанием свойства <code>file.encoding</code> в командной строке Java-машины. Очевидно, не всегда.</li>
</ol>
<p>А почему под Linux всё работало? Потому что файл был в кодировке UTF-8, а это стандартная кодировка платформы в Linux. Только не надо нос задирать, в следующий раз попадется windows-1251 и всё будет наоборот.</p>
]]></description>
			<content:encoded><![CDATA[<p>Несколько раз пришлось столкнуться с проблемами при чтении/записи кириллицы на Java. К примеру, есть файл в кодировке UTF-8, который читается с помощью <code>java.io.FileInputStream</code>. В результате русские буквы портятся. Бывает, что портятся не все, а только &laquo;И&raquo; и &laquo;ш&raquo;. Проблема проявляется только на Windows, классический случай&nbsp;&mdash; разработчик сидит на Linux: &laquo;а у меня всё работает!&raquo;.</p>
<p>Пришло время привести в порядок базовые знания.</p>
<p>В языке Java для строк используется тип <code>java.lang.String</code>. Символы в строке имеют тип Character&nbsp;&mdash; это 16-битные коды символов в кодировке <a href="http://unicode.org/">Unicode</a>.</p>
<p>Кодировка файлов может обеспечивать представление всех Unicode символов (UTF-8, UTF-16) или его подмножества (windows-1251). UTF-8 обеспечивает более компактное хранение наиболее распространенных символов (ASCII), но требует более сложного преобразования, поэтому существуют различные представления Unicode.</p>
<p>Что происходит, когда файл читается с помощью <code>java.io.FileInputStream</code>? Поток байтов преобразуется в последовательность Unicode символов. Стоп. Чтобы правильно преобразовать, надо знать кодировку файла. Но ни один из конструкторов <code>FileInputStream</code> не позволяет указать кодировку! Небольшое исследование выводит на инфрмацию о том, что используется умолчальная (дефолтная, стандартная) кодировка платформы. Что будет, если на самом деле в файле использована другая кодировка? Правильно, мусор. Как это победить? Есть такое свойство <a href="http://stackoverflow.com/questions/1128617/java-default-encoding"><code>file.encoding</code></a>, которое позволяет поменять стандартную кодировку, но оно не документировано (помните книжки типа &laquo;Недокументированные возможности MS Word 6.0?&raquo;).</p>
<p>Ладно, прочитали из файла строку в неправильной кодировке. В строке мусор. А мы этого не заметили и записали эту строку в другой файл. Конечно, через <code>java.io.FileOutputStream</code>. Тоже не имея возможности указать кодировку. В этом случае&nbsp;&mdash; к счастью. Потому что обратная функция почти все символы из мусора вернет в нормальное состояние. Кроме, если я не ошибаюсь, &laquo;И&raquo; и &laquo;ш&raquo;. А мы будем долго удивляться, откуда такая выборочная беда, ну ведь почти всё же правильно работает!</p>
<p>Лучше бы все символы поломались. Потому что понимание проблемы в этом случае пришло бы быстрее. Вот пример того, что получается при двойной неправильной перекодировке (потоки тут не используются, но суть та же):</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.UnsupportedEncodingException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> StreamEncoding
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args <span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">UnsupportedEncodingException</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">String</span> s <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Иллюзия&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#40;</span>  <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#40;</span> s.<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;UTF-8&quot;</span> <span style="color: #009900;">&#41;</span>, <span style="color: #0000ff;">&quot;windows-1251&quot;</span> <span style="color: #009900;">&#41;</span>
                                        .<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;windows-1251&quot;</span> <span style="color: #009900;">&#41;</span>
                                      , <span style="color: #0000ff;">&quot;UTF-8&quot;</span>
                                      <span style="color: #009900;">&#41;</span>
                          <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Результат вывода:<br />
<code>�?ллюзия</code></p>
<p>Редкий случай&nbsp;&mdash; удалось понять суть проблемы. Обычно удаётся устранить проявления, но не докопаться до сути. Как же делать правильно?</p>
<ol>
<li>В своих программах для файловых операций использовать <code>java.io.InputStreamReader/Writer</code> и их конструкторы с указанием кодировки. Не использовать более простые <code>File(Reader/Writer)</code>, потому что они не позволяют указать кодировку. И уж тем более не использовать <code>File(Input/Output)Stream</code>.</li>
<li>Чужие программы иногда удается победить указанием свойства <code>file.encoding</code> в командной строке Java-машины. Очевидно, не всегда.</li>
</ol>
<p>А почему под Linux всё работало? Потому что файл был в кодировке UTF-8, а это стандартная кодировка платформы в Linux. Только не надо нос задирать, в следующий раз попадется windows-1251 и всё будет наоборот.</p>
<p><img src="http://www.all-x.net/?ak_action=api_record_view&id=676&type=feed" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.all-x.net/2010/02/04/encoding/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Если не запускается Eclipse</title>
		<link>http://www.all-x.net/2009/12/17/eclipse-maxpermsize/</link>
		<comments>http://www.all-x.net/2009/12/17/eclipse-maxpermsize/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 19:52:15 +0000</pubDate>
		<dc:creator>allex</dc:creator>
				<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Eclipse]]></category>

		<guid isPermaLink="false">http://www.all-x.net/?p=478</guid>
		<description><![CDATA[<p>Пару месяцев назад разбирался, почему у коллеги Eclipse отказывается стартовать, выдавая вот такое окошко:<br />
<a href="http://www.all-x.net/wp-content/uploads/2009/12/eclipse-maxpermsize.gif"><img src="http://www.all-x.net/wp-content/uploads/2009/12/eclipse-maxpermsize-300x157.gif" alt="eclipse-maxpermsize" title="eclipse-maxpermsize" width="300" height="157" class="alignright size-medium wp-image-479" /></a><br />
Решение нашел и благополучно забыл. А сегодня эта напасть добралась и до моего ноутбука. Еле вспомнил решение: надо в файле <code>eclipse.ini</code> уменьшить значение параметра <code>--launcher.XXMaxPermSize</code>, экспериментально подобрать максимум, при котором Eclipse стартует. Смешно, в свое время боролись с другой ошибкой&#160;&#8212; во время работы Eclipse жаловалась, что PermGen space не хватает (точный текст уже не помню). А лечилось это <em>увеличением</em> значения того же параметра. Много хорошо&#160;&#8212; тоже плохо...</p>
]]></description>
			<content:encoded><![CDATA[<p>Пару месяцев назад разбирался, почему у коллеги Eclipse отказывается стартовать, выдавая вот такое окошко:<br />
<a href="http://www.all-x.net/wp-content/uploads/2009/12/eclipse-maxpermsize.gif"><img src="http://www.all-x.net/wp-content/uploads/2009/12/eclipse-maxpermsize-300x157.gif" alt="eclipse-maxpermsize" title="eclipse-maxpermsize" width="300" height="157" class="alignright size-medium wp-image-479" /></a><br />
Решение нашел и благополучно забыл. А сегодня эта напасть добралась и до моего ноутбука. Еле вспомнил решение: надо в файле <code>eclipse.ini</code> уменьшить значение параметра <code>--launcher.XXMaxPermSize</code>, экспериментально подобрать максимум, при котором Eclipse стартует. Смешно, в свое время боролись с другой ошибкой&nbsp;&mdash; во время работы Eclipse жаловалась, что PermGen space не хватает (точный текст уже не помню). А лечилось это <em>увеличением</em> значения того же параметра. Много хорошо&nbsp;&mdash; тоже плохо...</p>
<p><img src="http://www.all-x.net/?ak_action=api_record_view&id=478&type=feed" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.all-x.net/2009/12/17/eclipse-maxpermsize/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Google выкатил Simple</title>
		<link>http://www.all-x.net/2009/07/30/google-simple/</link>
		<comments>http://www.all-x.net/2009/07/30/google-simple/#comments</comments>
		<pubDate>Wed, 29 Jul 2009 21:16:57 +0000</pubDate>
		<dc:creator>allex</dc:creator>
				<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Языки]]></category>
		<category><![CDATA[Google]]></category>

		<guid isPermaLink="false">http://www.all-x.net/?p=430</guid>
		<description><![CDATA[<p>Google <del>изобрел велосипед</del> придумал <del>BASIC</del> Simple. Это диалект BASIC для разработки приложений на платформе Android. Исходные файлы на Simple описывает компоненты&#160;&#8212; формочки и код, причем формочки в текстовом виде описаны в файле с кодом. Предполагается, что среды разработки будут скрывать текстовое описание GUI, предоставляя визуальный редактор.</p>
<p>Начнем с названия. Люди из этой компании вообще думают, как это искать? <img src='http://www.all-x.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Игрался я с языком, который называется <a href="http://nice.sourceforge.net">Nice</a>. Как вы считаете, сколько результатов Гугл выдаст по запросу Nice Programming Language? 2.5 миллиона! И это для малоизвестного языка. А для только что объявленного Simple Programming Language уже почти 19 миллионов!</p>
<p>Естественно, <a href="http://code.google.com/p/simple/">проект расположился на Google Code</a>. Интересно стало посмотреть в исходники, тема трансляторов мне близка (<a href="http://treedl.org">TreeDL</a> хоть и дает всего 1.5 тыщи ссылок, зато релевантность существенно выше). Транслятор Simple написан на Java 6. Парсер рукописный, дерево гетерогенное, рукописное. Классы для узлов дерева содержат методы для генерации байт-кода JVM (У Microsoft на .NET был Basic, теперь и на JVM есть <img src='http://www.all-x.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ). Решение достаточно эффективное, но плохо расширяемое.</p>
<p>Прежде чем на Windows удалось скомпилировать пустую программу, пришлось исправить три критические ошибки. Забавно, <a href="http://code.google.com/p/simple/issues/list?can=1&#038;q=&#038;colspec=ID+Type+Status+Priority+Milestone+Owner+Summary&#038;cells=tiles">первые четыре баг-репорта</a>&#160;&#8212; мои. Для версии 0.1.0 это, конечно, простительно, но осадочек остался. Нехорошо это&#160;&#8212; выкладывать сборку для платформы и ни разу ее не запустить... Впрочем, у проекта, похоже, один участник&#160;&#8212; Herbert Czymontek, он же simplecompiler.</p>
<p>Но самое главное&#160;&#8212; пока, судя по всему, есть только язык и транслятор с библиотекой. Средств визуального проектирования GUI нет. А пока их не будет, Simple своё название не оправдает. Впрочем, даже если они будут, не понимаю, чем BASIC проще нормальных языков. Ладно, поживем&#160;&#8212; увидим, деньги могут многое.</p>
]]></description>
			<content:encoded><![CDATA[<p>Google <del>изобрел велосипед</del> придумал <del>BASIC</del> Simple. Это диалект BASIC для разработки приложений на платформе Android. Исходные файлы на Simple описывает компоненты&nbsp;&mdash; формочки и код, причем формочки в текстовом виде описаны в файле с кодом. Предполагается, что среды разработки будут скрывать текстовое описание GUI, предоставляя визуальный редактор.</p>
<p>Начнем с названия. Люди из этой компании вообще думают, как это искать? <img src='http://www.all-x.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Игрался я с языком, который называется <a href="http://nice.sourceforge.net">Nice</a>. Как вы считаете, сколько результатов Гугл выдаст по запросу Nice Programming Language? 2.5 миллиона! И это для малоизвестного языка. А для только что объявленного Simple Programming Language уже почти 19 миллионов!</p>
<p>Естественно, <a href="http://code.google.com/p/simple/">проект расположился на Google Code</a>. Интересно стало посмотреть в исходники, тема трансляторов мне близка (<a href="http://treedl.org">TreeDL</a> хоть и дает всего 1.5 тыщи ссылок, зато релевантность существенно выше). Транслятор Simple написан на Java 6. Парсер рукописный, дерево гетерогенное, рукописное. Классы для узлов дерева содержат методы для генерации байт-кода JVM (У Microsoft на .NET был Basic, теперь и на JVM есть <img src='http://www.all-x.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ). Решение достаточно эффективное, но плохо расширяемое.</p>
<p>Прежде чем на Windows удалось скомпилировать пустую программу, пришлось исправить три критические ошибки. Забавно, <a href="http://code.google.com/p/simple/issues/list?can=1&#038;q=&#038;colspec=ID+Type+Status+Priority+Milestone+Owner+Summary&#038;cells=tiles">первые четыре баг-репорта</a>&nbsp;&mdash; мои. Для версии 0.1.0 это, конечно, простительно, но осадочек остался. Нехорошо это&nbsp;&mdash; выкладывать сборку для платформы и ни разу ее не запустить... Впрочем, у проекта, похоже, один участник&nbsp;&mdash; Herbert Czymontek, он же simplecompiler.</p>
<p>Но самое главное&nbsp;&mdash; пока, судя по всему, есть только язык и транслятор с библиотекой. Средств визуального проектирования GUI нет. А пока их не будет, Simple своё название не оправдает. Впрочем, даже если они будут, не понимаю, чем BASIC проще нормальных языков. Ладно, поживем&nbsp;&mdash; увидим, деньги могут многое.</p>
<p><img src="http://www.all-x.net/?ak_action=api_record_view&id=430&type=feed" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.all-x.net/2009/07/30/google-simple/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Конфликт Venkman Debugger и Firebug в Firefox 3.5</title>
		<link>http://www.all-x.net/2009/07/27/venkman-vs-firebug/</link>
		<comments>http://www.all-x.net/2009/07/27/venkman-vs-firebug/#comments</comments>
		<pubDate>Mon, 27 Jul 2009 12:29:03 +0000</pubDate>
		<dc:creator>allex</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Firebug]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Venkman Debugger]]></category>

		<guid isPermaLink="false">http://www.all-x.net/?p=426</guid>
		<description><![CDATA[<p>После обновления Firefox до 3.5 и соответствующих обновлений расширений в <a href="https://addons.mozilla.org/en-US/firefox/addon/216">Venkman Debugger</a> перестали работать точки останова. Говорят, это конфликт с <a href="https://addons.mozilla.org/en-US/firefox/addon/1843">Firebug</a>. Действительно, если выключить Firebug, точки останова начинают работать. Ну и что мне делать, если Firebug понадобится? Судя по отзывам, Firebug 1.4 сырой, можно попробовать откатиться на 1.3.3.</p>
]]></description>
			<content:encoded><![CDATA[<p>После обновления Firefox до 3.5 и соответствующих обновлений расширений в <a href="https://addons.mozilla.org/en-US/firefox/addon/216">Venkman Debugger</a> перестали работать точки останова. Говорят, это конфликт с <a href="https://addons.mozilla.org/en-US/firefox/addon/1843">Firebug</a>. Действительно, если выключить Firebug, точки останова начинают работать. Ну и что мне делать, если Firebug понадобится? Судя по отзывам, Firebug 1.4 сырой, можно попробовать откатиться на 1.3.3.</p>
<p><img src="http://www.all-x.net/?ak_action=api_record_view&id=426&type=feed" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.all-x.net/2009/07/27/venkman-vs-firebug/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

