<?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>empty pages &#187; translation</title> <atom:link href="http://look-in.net/category/translation/feed/" rel="self" type="application/rss+xml" /><link>http://look-in.net</link> <description></description> <lastBuildDate>Mon, 05 Dec 2011 06:07:14 +0000</lastBuildDate> <generator>http://wordpress.org/?v=2.9.2</generator> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <item><title>PrestaShop &#8211; обновление в безопасности. версия 1.3.1</title><link>http://look-in.net/2010/06/07/important-security-update-prestashop-v-1-3-1/</link> <comments>http://look-in.net/2010/06/07/important-security-update-prestashop-v-1-3-1/#comments</comments> <pubDate>Mon, 07 Jun 2010 18:29:25 +0000</pubDate> <dc:creator>slookin</dc:creator> <category><![CDATA[translation]]></category> <category><![CDATA[prestashop]]></category> <guid
isPermaLink="false">http://look-in.net/?p=358</guid> <description><![CDATA[PrestaShop v.1.3.1 &#8211; Important security update
Внимание, обращаем внимание на новую версию prestashop.
При поддержке John JEAN из Wargan Solutions компании, что специализируется на компьютерной безопасности, мы нашли и исправили  несколько уязвимостей в коде которые затрагивает все версии prestashop (с v0.8 до v1.3).
Крайне рекомендуется обновить ваш магазин PrestaShop для решения проблем с безопасностью:
Для обновления вы можете:
- [...]]]></description> <content:encoded><![CDATA[<h2>PrestaShop v.1.3.1 &#8211; Important security update</h2><p><strong>Внимание, обращаем внимание на новую версию prestashop.</strong></p><p>При поддержке John JEAN из <a
title="audit de sécurité informatique &amp; test d'intrusion informatique" href="http://www.wargan.com/" target="_blank">Wargan Solutions</a> компании, что специализируется на компьютерной безопасности, мы нашли и исправили  <span
style="color: #800000;"><strong>несколько уязвимостей в коде которые затрагивает все версии prestashop (с v0.8 до v1.3). </strong></span></p><p><span
style="color: #800000;"><strong><span
id="more-358"></span><br
/> </strong></span></p><p><strong><span
style="color: #de1f61;"><span
style="color: #800000;">Крайне рекомендуется обновить ваш магазин PrestaShop для решения проблем с безопасностью:</span><br
/> </span></strong></p><p><strong>Для обновления вы можете:</strong></p><p>- Обновить PrestaShop новой версией 1.3.1.</p><p><strong>Эта версия идентична  1.3 (не включает исправления ошибок) и только проблемы безопасности исправлены</strong></p><p>или вы можете исправить уязвимости вручную:</p><p><strong> /!\ Не забудьте сделать копию своего магазина.</strong></p><p><strong>Файл:</strong> /config/smarty.config.inc.php<br
/> где: в конце файла, перед &laquo;?&gt;&raquo;<br
/> добавить: $smarty-&gt;register_modifier(&#8217;secureReferrer&#8217;, array(&#8216;Tools&#8217;, &#8217;secureReferrer&#8217;));</p><p><strong>Файл:</strong> /modules/paypalapi/error.tpl<br
/> где: строка 13<br
/> заменить : {$smarty.server.HTTP_REFERER}<br
/> на : {$smarty.server.HTTP_REFERER|secureReferrer}</p><p><strong>Файл:</strong> /themes/prestashop/errors.tpl :<br
/> где: строка 9<br
/> заменить: {$smarty.server.HTTP_REFERER|escape:&#8217;htmlall&#8217;:'UTF-8&#8242;}<br
/> на: {$smarty.server.HTTP_REFERER|escape:&#8217;htmlall&#8217;:'UTF-8&#8242;|secureReferrer}</p><p><strong>Файл:</strong>/themes/prestashop/shopping-cart.tpl :<br
/> где: строка 255<br
/> заменить: {$smarty.server.HTTP_REFERER|escape:&#8217;htmlall&#8217;:'UTF-8&#8242;}<br
/> на: {$smarty.server.HTTP_REFERER|escape:&#8217;htmlall&#8217;:'UTF-8&#8242;|secureReferrer}</p><p><strong>Файл:</strong> /admin/login.php<br
/> где: строка 67<br
/> заменить:<br
/> $cookie-&gt;passwd = $employee-&gt;passwd;<br
/> $cookie-&gt;write();<br
/> на:<br
/> $cookie-&gt;passwd = $employee-&gt;passwd;<br
/> $cookie-&gt;remote_addr = ip2long($_SERVER['REMOTE_ADDR']);<br
/> $cookie-&gt;write();</p><p><strong>Файл:</strong> /admin/confirm.php<br
/> где: строка 22<br
/> заменить: $referer = rawurldecode(Tools::getValue(&#8216;referer&#8217;));<br
/> на: $referer = Tools::htmlentitiesUTF8(rawurldecode(Tools::getValue(&#8216;referer&#8217;)));</p><p><strong>Файл:</strong> /classes/Tools.php<br
/> где: строка 17<br
/> После: &laquo;class Tools<br
/> {&raquo;<br
/> Добавить две новых функции:</p><p>/**<br
/> * Get the server variable SERVER_NAME<br
/> *<br
/> * @param string $referrer URL referrer<br
/> */<br
/> static function getServerName()<br
/> {<br
/> if (isset($_SERVER['HTTP_X_FORWARDED_SERVER']) AND $_SERVER['HTTP_X_FORWARDED_SERVER'])<br
/> return $_SERVER['HTTP_X_FORWARDED_SERVER'];<br
/> return $_SERVER['SERVER_NAME'];<br
/> }</p><p>/**<br
/> * Secure an URL referrer<br
/> *<br
/> * @param string $referrer URL referrer<br
/> */<br
/> static public function secureReferrer($referrer)<br
/> {<br
/> if (preg_match(&#8216;/^http[s]?:\/\/&#8217;.self::getServerName().&#8217;\/.*$/Ui&#8217;, $referrer))<br
/> return $referrer;<br
/> return __PS_BASE_URI__;<br
/> }</p><p><strong>Файл:</strong> /classes/Cookie.php<br
/> где: строка 164<br
/> Заменить функцию isLoggedBack() новой<br
/> function isLoggedBack()<br
/> {<br
/> /* Employee is valid only if it can be load and if cookie password is the same as database one */<br
/> if ($this-&gt;id_employee AND Validate::isUnsignedId($this-&gt;id_employee) AND<br
/> Employee::checkPassword(intval($this-&gt;id_employee), $this-&gt;passwd) AND (!isset($this-&gt;_content['remote_addr']) OR<br
/> $this-&gt;_content['remote_addr'] == ip2long($_SERVER['REMOTE_ADDR'])))<br
/> return true;<br
/> return false;<br
/> }</p> ]]></content:encoded> <wfw:commentRss>http://look-in.net/2010/06/07/important-security-update-prestashop-v-1-3-1/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Обновился Prestashop &#8211; версия 1.3</title><link>http://look-in.net/2010/05/31/prestashop-v-1-3-release/</link> <comments>http://look-in.net/2010/05/31/prestashop-v-1-3-release/#comments</comments> <pubDate>Mon, 31 May 2010 09:59:43 +0000</pubDate> <dc:creator>slookin</dc:creator> <category><![CDATA[WebDev]]></category> <category><![CDATA[translation]]></category> <category><![CDATA[php]]></category> <category><![CDATA[prestashop]]></category> <guid
isPermaLink="false">http://look-in.net/?p=347</guid> <description><![CDATA[Новая стабильная версия PrestaShop.
Версия 1.3 обосновано названа наиболее завер?енной, стабильной и профессиональной по сравнению с предыдущими версиями. Огромное количество оптимизаций было сделано, что бы максимизировать производительность и поддержку многоязычности. Эта версия включет множество рекомендаций от Open-Source сообщества. ]]></description> <content:encoded><![CDATA[<p><a
href="http://www.prestashop.com/en/downloads/" target="_blank"><img
src="http://www.prestashop.com/download/media_kit/1.3/ban_13_en.jpg" alt="" /></a></p><h1>Новая стабильная версия PrestaShop</h1><p>Версия 1.3 обосновано названа наиболее завершенной, стабильной и профессиональной по сравнению с предыдущими версиями. Огромное количество оптимизаций было сделано, что бы максимизировать производительность и поддержку многоязычности. Эта версия включет множество рекомендаций от Open-Source сообщества. Версия доступна на трех языках: английский, испанский и французский.</p><p><span
id="more-347"></span></p><p>Наряду с техническими улучшениями, так же было добавлено множество новых функций, добавлено более 200 технических, функциональных и графических расширений<strong>.</strong></p><p>Детальнее о добавлениях :</p><h2>Новые модули</h2><p>- <strong><a
title="Moneybookers" href="http://www.prestashop.com/en/partner_moneybookers" target="_blank">Moneybookers</a>,</strong> платежи через  Moneybookers</p><p>- <strong><a
title="Hipay" href="http://www.prestashop.com/en/partner_hipay" target="_blank">Hipay</a></strong>, платежи через Hipay</p><p>- <strong><a
title="ReversoForm" href="http://www.prestashop.com/en/partner_reversoform" target="_blank">ReversoForm</a></strong>, автоматизирует заполнение форм</p><p>- <strong><a
title="Dejala" href="http://www.prestashop.com/en/partner_dejala" target="_blank">Dejala</a></strong>, доставка товара курьером (Испания и Франция)</p><p>- <strong>Product Tooltip</strong>: на странице товара показывает количество одновременных просмотров, дату последнего добавления в корзину и дату последней покупки</p><p>- <strong>Catalog Evaluation</strong>, для проверки каталога (описание, наличие изображений, товаров на складе)</p><p>- <strong>Cross Selling</strong>, модуль для кросс-продаж</p><h2>Новая функциональность и улучшения:</h2><p>-  Добавлен <strong>Испанский языка</strong> (инсталлятор, консоль управления, сайт)</p><p>-<strong> Система налогов переписана<br
/> </strong></p><p>-<strong> Улучшена производительность базы (индексы)<br
/> </strong></p><p>- Совместимость с PHP 5.3</p><p>- <strong>Улучшена производительность поиска</strong></p><p>- Улучшен модуль оплаты <strong><a
title="Paypal" href="http://www.prestashop.com/fr/partners/partner_paypal" target="_blank">Paypal</a></strong></p><p>-<strong> Улучшены компонены SEO, особенно для многоязычных сайтов<br
/> </strong></p><p>- <strong>Добавлены правила налогов для новых территорий (Испания, Канада)</strong></p><p>- Улучшения в <strong>Google Checkout</strong> модуле</p><p>- Лучше совместимость со всеми интернет-браузерами</p><p>- Поисковые функции расширены на всю консоль управления</p><p>-  Новые статистические данные на первой странице консоли администрирования</p><p>- Автоматическое создание языка, при импортировании из .gzip файла</p><p>- И наборот, автоматическое предложение скачать gzip файл когда создается новый язык</p><p>- Возможность покупки модулей и тем напрямую из инсталлятора</p><p>- Возможность ограничения способов доставки по группам покупателей</p><p>- Возможность сохранить только необходимые таблицы в базе (выбор таблиц)</p><p>- На этапе установке уже можно выбрать страну по умолчанию</p><p>- Возможность фильтровать модули по доступности для страны по умолчанию.</p><p>- Отключение Ajax в  &laquo;search block&raquo;  если он не в &laquo;шапке&raquo; страницы</p><p>- Несколько новых &laquo;хуков&raquo; добавлено для консоли управления (backOfficeTop;  backOfficeFooter; header &#8230;)</p><p>- При создании модуля можно ограничить список стран, где он применим.</p><p><strong>Подробнее смотрите CHANGELOG &#8211; </strong><strong>других полезных изменений было сделано начиная с версии 1.2.5:</strong></p><p><em>&laquo;Нашей целью является непрерывно улучшать PrestaShop для предоставления продавцам электронной </em><em>онлайн-</em><em>коммерции  полной,  функциональной и подходящие к их потребностям, с учетом их ограничений </em><em>платформы </em><em>.  PrestaShop модульное и гибкое решение для удовлетворения </em><em>потребностей </em><em>всех стран  и всех видов деятельности. &raquo; </em>Говорит соучредитель PrestaShop  &#8211; Igor Schlumberger.</p><p><em> </em></p><h2>Новые партнеры</h2><p><strong>Выпуск PrestaShop v.1.3 это возможность еще раз рассказать про наших новых партнеров</strong> &#8211; курпнsх игроков на рынке безопасных платежей, <a
title="Moneybookers " href="http://www.prestashop.com/en/partner_moneybookers" target="_blank">Moneybookers </a>и <a
title="Hipay " href="http://www.prestashop.com/en/partner_hipay" target="_blank">Hipay </a>(Hi-media  group) присоединились к уже работающим в нашем решении <a
title="Paypal " href="http://www.prestashop.com/en/partner_paypal" target="_blank">Paypal </a>and Google Checkout.</p><p><a
title="Moneybookers " href="http://www.prestashop.com/en/partner_moneybookers" target="_blank">Moneybookers</a> один из крупнейших европейский поставщик услуг по проведению on-line платежей в более чем 200 странах,  в 42 валютах, и в более чем  100 способов оплаты;<a
title=" Hi-Media" href="http://www.prestashop.com/en/partner_hipay" target="_blank"> Hi-Media</a> является одним из самых крупных сайтов издателей и занимает позицию лидера  европейского рынка интерактивной рекламы и электронных платежей.</p><p>Французские участники рынка электронной коммерции так же будут обрадованы появлением интеграции с сервисом  <a
title="ReversoForm" href="http://www.prestashop.com/en/partner_reversoform" target="_blank">ReversoForm</a>, системы заполнения форм базируясь на каталоге телефонных номеров.</p><p><em>«Это партнерство позволит продавцам предлагать несколько вариантов  взаимодействия их PrestaShop магазином,  и откроет новые перспективы для  бизнеса и маркетинга.&raquo;</em> Сказал Bruno Lévêque, PrestaShop CEO.</p> ]]></content:encoded> <wfw:commentRss>http://look-in.net/2010/05/31/prestashop-v-1-3-release/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Hook в шаблонах prestashop</title><link>http://look-in.net/2010/03/24/prestashop-template-hook/</link> <comments>http://look-in.net/2010/03/24/prestashop-template-hook/#comments</comments> <pubDate>Wed, 24 Mar 2010 11:50:52 +0000</pubDate> <dc:creator>slookin</dc:creator> <category><![CDATA[WebDev]]></category> <category><![CDATA[translation]]></category> <category><![CDATA[php]]></category> <category><![CDATA[prestashop]]></category> <category><![CDATA[smarty]]></category> <guid
isPermaLink="false">http://look-in.net/?p=309</guid> <description><![CDATA[Перевод рецепта по созданию HOOK&#8217;а для Prestashop.
Шаблоны для prestashop базируются на шаблонизаторе Smarty и все модули используют хуки (hooks) как определение места положения модуля на странице.
По умолчанию в prestashop есть следущие хуки: rightColumn, leftColumn, payment, paymentReturn, updateOrderStatus, top, footer, productActions, cart, customerAccount, header, productTab, productTabContent, home и т.д.
Если же нужно создать новый хук для размещения [...]]]></description> <content:encoded><![CDATA[<p>Перевод рецепта по созданию HOOK&#8217;а для Prestashop.</p><p>Шаблоны для prestashop базируются на шаблонизаторе Smarty и все модули используют хуки (hooks) как определение места положения модуля на странице.</p><p>По умолчанию в prestashop есть следущие хуки: rightColumn, leftColumn, payment, paymentReturn, updateOrderStatus, top, footer, productActions, cart, customerAccount, header, productTab, productTabContent, home и т.д.</p><p>Если же нужно создать новый хук для размещения вашего модуля, то вот краткая инструкция как это сделать:</p><p><span
id="more-309"></span></p><p>1. Добавить описание хука в базе данные &#8211; таблица ps_hook… (ps_ это префикс prestashop в моей базе, у вас может быть иначе)</p><pre>insert into ps_hook(name,title,description,position)
values ('new_hook','New hook for footer page','Added for new module',1)</pre><p>2. В обработчике страницы изменить код обработки хуков (например в footer.php)</p><p>было</p><pre> $smarty-&gt;assign(array(</pre><pre>        'HOOK_RIGHT_COLUMN' =&gt; Module::hookExec('rightColumn'),</pre><pre>        'HOOK_FOOTER' =&gt; Module::hookExec('footer'),</pre><pre>        'content_only' =&gt; intval(Tools::getValue('content_only'))));</pre><pre>        $smarty-&gt;display(_PS_THEME_DIR_.'footer.tpl');</pre><p>должно стать</p><pre> $smarty-&gt;assign(array(</pre><pre>        'HOOK_RIGHT_COLUMN' =&gt; Module::hookExec('rightColumn'),</pre><pre>        'HOOK_FOOTER' =&gt; Module::hookExec('footer'),</pre><pre>        <span style="color: #ff0000;">'HOOK_NEW' =&gt; Module::hookExec('new_hook'),</span></pre><pre>        'content_only' =&gt; intval(Tools::getValue('content_only'))));</pre><pre>        $smarty-&gt;display(_PS_THEME_DIR_.'footer.tpl');</pre><p>3. Вставьте {$HOOK_NEW} в ваш smarty шаблон (в нашем случае footer.tpl)</p><p>PS. У вас должно быть что-то что публиковаться в новый хук &#8211; это может быть новый или модифицированный существующий модуль.</p><p><strong>О Prestashop (<a
href="http://www.prestashop.com" target="_blank">www.prestashop.com</a>)<br
/> </strong></p><p>Prestashop &#8211; это легковесный движок интернет-магазина. В базовой поставке уже достаточно модулей для старта магазина среднего уровня. Включенный же в стандартную поставку удобный и красивый дизайн позволяет быстро стартовать магазин. Сообществом пользователей разработанно большое количество дополнительных модулей, которые расширяют возможность базового движка.  Хорошо продуманная внутреняя архитектура позволяет сторонним разработчикам легко добавять дополнительную функциональность.</p><p>источник: <a
href="http://www.prestashop.com/forums/viewthread/12637/" target="_blank">http://www.prestashop.com/forums/viewthread/12637/</a></p> ]]></content:encoded> <wfw:commentRss>http://look-in.net/2010/03/24/prestashop-template-hook/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Prestashop модуль Catalog Evaluation</title><link>http://look-in.net/2010/03/19/prestashop-modul-catalog-evaluation/</link> <comments>http://look-in.net/2010/03/19/prestashop-modul-catalog-evaluation/#comments</comments> <pubDate>Fri, 19 Mar 2010 11:09:10 +0000</pubDate> <dc:creator>slookin</dc:creator> <category><![CDATA[WebDev]]></category> <category><![CDATA[projects]]></category> <category><![CDATA[translation]]></category> <category><![CDATA[prestashop]]></category> <guid
isPermaLink="false">http://look-in.net/?p=302</guid> <description><![CDATA[ Исправил ошибку с оценкой “качества” описания продукта и привинтил русский перевод.
Скачать исправленную версию.
О модуле: Модуль позволяет быстро найти товары у которых незаполнены поля описания или нет изображений. Просто и красиво.
http://www.prestastore.com/back-office-tools/749-catalog-evaluation.html
]]></description> <content:encoded><![CDATA[<p><a
href="http://look-in.net/wp-content/uploads/2010/03/image.png" class="thickbox no_icon" rel="gallery-302" title="image"><img
style="display: inline; border: 0px;" title="image" src="http://look-in.net/wp-content/uploads/2010/03/image_thumb.png" border="0" alt="image" width="57" height="57" /></a> Исправил ошибку с оценкой “качества” описания продукта и привинтил русский перевод.</p><p><a
href="http://look-in.net/wp-content/uploads/2010/03/statscheckup_fixed.zip" target="_blank">Скачать исправленную версию. </a></p><p>О модуле: Модуль позволяет быстро найти товары у которых незаполнены поля описания или нет изображений. Просто и красиво.</p><p><a
title="http://www.prestastore.com/back-office-tools/749-catalog-evaluation.html" href="http://www.prestastore.com/back-office-tools/749-catalog-evaluation.html">http://www.prestastore.com/back-office-tools/749-catalog-evaluation.html</a></p> ]]></content:encoded> <wfw:commentRss>http://look-in.net/2010/03/19/prestashop-modul-catalog-evaluation/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Новости Prestashop (#25)</title><link>http://look-in.net/2010/03/12/novosti-prestashop-25/</link> <comments>http://look-in.net/2010/03/12/novosti-prestashop-25/#comments</comments> <pubDate>Fri, 12 Mar 2010 08:33:28 +0000</pubDate> <dc:creator>slookin</dc:creator> <category><![CDATA[WebDev]]></category> <category><![CDATA[translation]]></category> <category><![CDATA[prestashop]]></category> <guid
isPermaLink="false">http://look-in.net/2010/03/12/novosti-prestashop-25/</guid> <description><![CDATA[
PrestaShop новостное письмо # 25
11 Март , 2010
Доступна версия 1.3 beta 1 PrestaShop!
&#160;
За последнюю неделю сделаны следующие изменения:
Исправления в CSV импорте
Появилась возможность добавлять javascript блоки в тектовое поля через TinyMCE
Исправления в поиске по тегам
Исправления в модулях PaypalAPI и Moneybookers
Упарвления упаковками продуктов
Адрес заказчика отображается на сводной странице
Исправления в [...]]]></description> <content:encoded><![CDATA[<p><a
href="http://www.prestashop.com/newsletters/redirect.php?id=25&#038;link=http://www.prestashop.com/en/downloads/?utm_source=mmt&#038;utm_medium=email&#038;utm_campaign=psnews25"><img
alt="PrestaShop 1.3 beta1" src="http://www.prestashop.com/newsletters/025/images/version-13beta1.jpg" /></a></p><p> <span
id="more-301"></span><br
/><h4></h4><p>PrestaShop новостное письмо # 25</p><p>11 Март , 2010</p><p>Доступна версия 1.3 beta 1 PrestaShop!</p><p><a
href="http://www.prestashop.com/newsletters/redirect.php?id=25&#038;link=http://www.prestashop.com/en/downloads/?utm_source=mmt&#038;utm_medium=email&#038;utm_campaign=psnews25"></a></p><p>&#160;</p><p>За последнюю неделю сделаны следующие изменения:</p><ul><li>Исправления в CSV импорте</li><li>Появилась возможность добавлять javascript блоки в тектовое поля через TinyMCE</li><li>Исправления в поиске по тегам</li><li>Исправления в модулях PaypalAPI и Moneybookers</li><li>Упарвления упаковками продуктов</li><li>Адрес заказчика отображается на сводной странице</li><li>Исправления в скидках без налогов</li><li>Исключена возможность удаления последнего поддомена.</li></ul><p>Полный спиоск измений в <a
href="http://www.prestashop.com/newsletters/redirect.php?id=25&amp;link=http://www.prestashop.com/download/changelog_1.3.0.3.txt"><b>CHANGELOG</b></a> или в SVN.</p><p>&#160;<a
href="http://www.prestashop.com/newsletters/redirect.php?id=25&#038;link=http://www.prestashop.com/en/downloads/?utm_source=mmt&#038;utm_medium=email&#038;utm_campaign=psnews25">Скачать PrestaShop v.1.3 Beta 1</a></p><h4>Модуль в подарок</h4><p><a
href="http://www.prestashop.com/newsletters/redirect.php?id=25&#038;link=http://www.prestastore.com/outils-d-administration-back-office/749-catalog-evaluation.html/?utm_source=mmt&#038;utm_medium=email&#038;utm_campaign=psnews25"><img
alt="Evaluation Catalogue" src="http://www.prestashop.com/newsletters/025/images/store_en.jpg" /></a></p><p><b>На этой неделе PrestaStore предлагает бесплатный модуль: “Catalog Checkup”!</b> <br
/>Этот модуль дает возможность проверить в реальном времени качество описания товаров в вашем каталоге<b>!</b> <br
/><b>Разработан командой PrestaShop team</b>, совместим с версиями 1.2 и выше .</p><p><a
href="http://www.prestashop.com/newsletters/redirect.php?id=25&#038;link=http://www.prestastore.com/outils-d-administration-back-office/749-catalog-evaluation.html/?utm_source=mmt&#038;utm_medium=email&#038;utm_campaign=psnews25">Скачать “Catalog Checkup” модуль on PrestaStore</a></p><p>&#160;</p><p>Источник: <a
title="http://www.prestashop.com/newsletters/025/newsmail_en.html" href="http://www.prestashop.com/newsletters/025/newsmail_en.html">http://www.prestashop.com/newsletters/025/newsmail_en.html</a></p></p><p><b><a
href="http://www.prestashop.com/infos.php?email=slooki.n@gmail.com&amp;nltoken=464fb98055956a6d3c9122ca0107dcac146dab34"></a></b></p> ]]></content:encoded> <wfw:commentRss>http://look-in.net/2010/03/12/novosti-prestashop-25/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Using Apache Access Logs with JMeter</title><link>http://look-in.net/2007/12/24/create-jmeter-plan-apache-access-log/</link> <comments>http://look-in.net/2007/12/24/create-jmeter-plan-apache-access-log/#comments</comments> <pubDate>Mon, 24 Dec 2007 10:03:39 +0000</pubDate> <dc:creator>slookin</dc:creator> <category><![CDATA[translation]]></category> <category><![CDATA[access log]]></category> <category><![CDATA[apache]]></category> <category><![CDATA[jmeter]]></category> <category><![CDATA[makeplan]]></category> <guid
isPermaLink="false">http://look-in.net/2007/12/24/ispolzovanie-apache-access-log-s-jmeter/</guid> <description><![CDATA[Перевод статьи посвященной созданию нагрузочных тестов с помощью JMeter и Apache logs.
Автор:  Geoff Mottram (geoff at minaret dot biz). (English version on http://minaret.biz/tips/jmeter.html)
Перевод: Sergey N Lukin (sergey at look-in dot net)
Опубликовано автором 21-го сентября 2004.
Этот документ и все сопутствующее программное обеспечение поставляет &#171;как есть&#187; (&#171;as is&#187;), при этом не предусматривается никаких гарантий, явных или [...]]]></description> <content:encoded><![CDATA[<p><a
href="http://look-in.net/2007/12/24/create-jmeter-plan-apache-access-log/jmeter/" rel="attachment wp-att-106" title="JMeter"><img
src="http://look-in.net/wp-content/uploads/2007/12/logo_jmeter.jpg" alt="JMeter" align="left" border="0" hspace="20" vspace="20" /></a>Перевод статьи посвященной созданию нагрузочных тестов с помощью JMeter и Apache logs.<br
/> Автор:  Geoff Mottram (geoff at minaret dot biz). (English version on <a
href="http://minaret.biz/tips/jmeter.html" title="http://minaret.biz/tips/jmeter.html">http://minaret.biz/tips/jmeter.html</a>)</p><p>Перевод: Sergey N Lukin (sergey at look-in dot net)</p><p>Опубликовано автором 21-го сентября 2004.<br
/> <span
id="more-105"></span></p><p>Этот документ и все сопутствующее программное обеспечение поставляет &laquo;как есть&raquo; (&laquo;as is&raquo;), при этом не предусматривается никаких гарантий, явных или подразумеваемых, включая, но не ограничиваясь, подразумеваемую гарантию товарного состояния при продаже и пригодности для использования в конкретных целях, а также любые иные гарантии. Весь риск в  отношении качества и производительности программы ложится на вас. Если программа окажется с дефектом, вы принимаете на себя расходы по всему необходимому обслуживанию, восстановлению и исправлению.</p><h2><strong>Содержание</strong></h2><p><a
href="#introduction">Введение</a><br
/> <a
href="#software">Программное обеспечение</a><br
/> <a
href="#tips">Советы JMeter Tips</a><br
/> <a
href="#log_files">Использование файлов Apache Log (логи)</a><br
/> <a
href="#filtering">Фильтрация ваших логов</a><br
/> <a
href="#duration">Продолжительность и нагрузка</a><br
/> <a
href="#creating">Создание тестового плана</a><br
/> <a
href="#running">Запуск теста</a><br
/> <a
href="#analyzing">Анализ результатов</a></p><h2><a
title="introduction" name="introduction"></a>Введение</h2><p>Это документ описывает некоторые советы о том как использовать логи апача (apache logs) в качестве исходного материала для тестового плана JMeter. Скрипт на perl для генерации тестовых планов по логами и тестовый план обрабатывающий результаты работы приложен к статье. Естественно, что возможно тебе придется отредактировать скрипт и тестовый план для твоих особенностей конфигурации.</p><p>Хотелось бы отметить что после того как была написана статья появился <em>Tomcat Access Log Sampler</em> (и Access Log Sampler). Этот sampler может так же читать логи в формате Apache common log и создавать запросы к вашему web приложению. У автора не было возможности попробовать этот sampler, но многие советы из этой статьи будут также применимы. В частности, ты должен подготовить логи для каждого тестового потока.</p><h2><a
title="software" name="software"></a>Файлы</h2><p><a
href="http://minaret.biz/tips/jmeter.zip">Скачать</a> архив (и <a
href="http://look-in.net/wp-content/uploads/2007/12/jmeter.zip" title="jmeter_makeplan">копия</a> на этом сайте). Архив содержит:</p><table
border="1" cellpadding="3" cellspacing="0"><tr><th>файл</th><th>описание</th></tr><tr><td
valign="top">filter.sh</td><td
valign="top">Шелл-скрипт, фильтрует исходных лог и выделяет 10 минутный набор запросов.</td></tr><tr><td
valign="top">makeplan.pl</td><td
valign="top">Создает тестовый план JMeter по логам</td></tr><tr><td
valign="top">results.jmx</td><td
valign="top">Тестовый план для обработки результатов тестирования.</td></tr><tr><td
valign="top">runtest.sh</td><td
valign="top">Шелл-скрипт, для запуска теста в режиме командной строки, сохраняет результаты в текстовый файл.</td></tr><tr><td
valign="top">sample.jmx</td><td
valign="top">Пример тестового плана с одним потоком и одним запросом созданный с помощью скрипта <code>makeplan.pl</code>.</td></tr><tr></tr></table><h2><a
title="tips" name="tips"></a>Советы по JMeter</h2><p>Следующие советы могут быть полезны в отношении JMeter:</p><ol><li>JMeter хранит тестовые планы как XML. Значит ты можешь создавать тестовые планы используя текстовый редактор или шелл (shell) скрипты.</li><li>Созданный и сохраненный тестовый план (.jmx) с помощью JMeter может быть разделен на части с помощью текстового редактор. Это может быть полезно для использования их скриптам.</li><li>Имей ввиду, что когда используются логи как источник то тестовые планы могут быть большими, очень большими. Например, план с 2800 запросами требует 256 MB RAM и не может быть загружен в JMeter GUI без увеличения памяти под JVM.</li><li>Запускай свои тесты в консольном режиме &#8211; что бы уменьшить размер требуемой памяти.(опция -n в JMeter).</li><li>У всех JMeter Listeners&#8217;ов (такие как <em>Aggregate Report</em>) есть <em>Filename</em> поля. Используя его можно загрузить и посмотреть результаты теста.</li><li>Создай тестовый план, которые содержит только Listeners для анализа результатов теста. Для примера смотри &#8211; <code>results.jmx</code>.</li><li>Можно запустить JMeter-тест с удаленного сервера, на котором даже нет GUI. Потом скопируй результат<code>.jtl</code> на рабочую станцию с GUI для анализа результатов.</li><li>Если вы планируете запускать JMeter под IBM AIX, необходимо изменить скрипт запуска <code>jmeter</code> в папке bin &#8211; закомментировать опцию <code>-XX,</code> она не поддерживается на IBM&#8217;s JVM.</li><li>Во время работы теста, ты можешь из браузера сделать дополнительный запрос, что бы почувствовать как система реагирует. Эта субъективная оценка поможет сравнить желаемое и реальное время обработки запроса. Но помни, что эти дополнительные запросы не фиксируются в отчетах, и не отражаются в результатах тестирования.</li></ol><p>Следующие советы наиболее применимы когда используются Apache access log  в качестве исходного материала для тестов. (для примера смотри <code>sample.jmx</code> ).</p><ol><li>Используй <em>HTTP Request Defaults</em> для указания имени сервера который тестируете, и не вноси эту и информацию в каждый запрос. Это поможет если придется менять имя сервера. Надо будет изменить только одну настройку, а не каждый запрос.</li><li>Используй <em>Constant Throughput Timer</em> когда используешь Apache log как исходный материал, что бы обеспечить частоту запросов как в исходных логах (подробнее смотри ниже). Постоянная скорость запросов применяется для каждого потока. В нашем примере каждый поток делает 10 запросов в минуту.</li><li>Используй <em>Uniform Random Timer</em> когда у тебя более одного потока и хочется предотвратить запуск всех потоков &laquo;волной&raquo;. Без этого таймера все ваши потоки будут посылать запросы в одно и тоже время т.к. мы используем <em>Constant Throughput Timer. </em>Выберете значение Random Delay соответствующее значению в <em>Constant Throughput Timer. </em>В нашем примере <em>Constant Throughput Timer</em> установлен в 10 запросов в минуту. Это дает каждому запросу &laquo;окно&raquo; в 6 секунд, установи в <em>Uniform Random Timer</em> значение Random Delay Maximum в 6000 миллисекунд (6 секунд).</li><li><em>HTTP Cookie Manager</em> действительно работает отлично и поддерживает множество cookie для каждого запущенного потока.</li></ol><h2><a
title="log_files" name="log_files"></a>Используем Apache Log файлы</h2><p>Файлы apache log это отличный исходный материал для создания нагрузочных тестов JMeter. Мы используем простой процесс преобразования текстовых лог файлов в тестовый план JMeter, потому что JMeter хранит тесты используя XML. Преимущество использования Apache access log &#8211; то что ты не строишь догадки о том как нагружается твой сервер &#8211; ты используешь готовую информацию.</p><p>С другой стороны, используя Apache log, ты ограничиваешься только GET запросами (т.к. логи не включают содержание запросов POST). И также не возможно эмулировать запросы, что возвращают 304 (Не изменен), это требует добавление в заголовок запроса даты/времени модификации страницы. Это можно сделать в самом JMeter самостоятельно, если есть такая необходимость.</p><h2><a
title="filtering" name="filtering"></a>Фильтрация Apache log</h2><p>Тебе надо решить насколько большой тест желаешь, и извлечь подходящие запросы из лога. Я просмотрел статистику и графики созданные программой Webalizer, для определения когда сервер наиболее загружен (т.е. день и час). Решил, что 10 минут достаточная длительность теста, я использую <code>filter.sh</code>, который включен в эту документацию, для определения той 10-ти минутой части лога, что отражает наиболее загруженный час, и отфильтровываю запросы, которые меня не интересуют.</p><p>В моем случае, я удаляю также записи, что не содержат HTTP 200 (OK) и 320 (Moved Temporarily) ответы. В последнем случае, приложение выполняет тест cookie когда сессия стартует  и пересылает пользователя на другой URL.</p><p>Если тестируешь приложение с базой (как я), вы должны найти способ выполнить login для тестовой сессии. Если используешь cookies, что бы отслеживать сессии, необходимо создать сессии для каждого потока в JMeter. Т.к. мое приложение выполняет автоматический логин по IP адресу, то я только сконфигурировал тестовый аккаунт с IP адресом компьютера с которого я планирую запускать тесты JMeter.</p><p>Вы должны быть аккуратны, когда отфильтровываете запросы из вашего исходного лога, т.к. это уменьшает нагрузку на сервер. Для лучшего теста, вы должны добавить несколько дополнительных запросов из вашего лога, для приближения к полной загрузки вашей системы. Это похоже на мистику, но ты должен сделать догадку, как много дополнительных запросов тебе нужно добавить.</p><h2><a
title="duration" name="duration"></a>Длительность и нагрузка</h2><p>В конце концов, твой лог файл должен содержать число запросов которое будет нацело делиться на количество потоков, с помощью которых будешь тестировать приложение. В этом случае намного легче симулировать нагрузку с помощью JMeter.</p><p>Ты должен использовать не только <em>Constant Throughput Timer</em> для эмуляции реальной загрузки сервера, т.к. этот таймер будет запускать все потоки одновременно, в этом случае запросы нахлынут на сервер волной. Что бы решить эту проблему, ты должен добавить также <em>Uniform Random Timer </em>(JMeter таймеры аддитивны). <em>Uniform Random Timer</em> добавляет случайное число миллисекунд в каждый поток перед следующим запросом. Это значение может быть от 0 до <code>Random Delay Maximum</code>. Это значение пересчитывается каждый раз что делает тестирование более реалистичным. Значение <code>Random Delay Maximum</code> уставите таким же как частота в <em>Constant Throughput Timer</em>. Единственное что переведите &laquo;запросы в минуту&raquo; в миллисекунды.</p><p>В моем случае, десять запросов в минуту на поток работают как 6 секунда на запрос. Эти 6000 и должны быть выставлены в качестве <code>Random Delay Maximum</code> в <em>Uniform Random Timer.</em></p><p>Я выбрал что 2800 запросов для моего 10 минутного теста. Использую 28 потоков, каждый поток сделает 100 запросов в 10 минут или 10 запросов в минуту. Это значение и было использовано в обоих таймерах. Если бы мы решили использовать 14 потоков, то каждый поток выполнил бы 200 запросов за 10 минут или 20 запросов в минуту.</p><p>Если захочешь запустить тест с уменьшенной нагрузкой, то есть послать меньшее количество запросов за тот же период. Например, для уменьшения нагрузки в 2 раза, ты можешь уменьшить количество запросов и кол-во потоков дважды. В моем случае это будет 1400 запросов и 14 потоков.</p><p>Для увеличения нагрузки, увеличь количество запросов посланные в тоже период времени и количество потоков. Для моего теста 125% увеличение требует 3500 запросов и 35 потоков.</p><h2><a
title="creating" name="creating"></a>Создание тестового плана</h2><p>Скрипт <code>makeplan.pl</code> включает в себя документацию по использованию:</p><blockquote><pre>Usage: makeplan.pl [-h HOST] [-t THREADS] [FILE1] [FILE2] ...        Where: -h specifies the host name or ip address to test (default is "localhost").
-t specifies a non-zero number of threads to generate (default is 1).
Reads each FILE in succession (or standard input), generating a JMeter test plan to standard output.</pre></blockquote><p>Ты можешь редактировать эту программу под свои требования. В частности, скрипт проверяет наличие параметра auto и добавляет его, если это необходимо (эта специфика нужна была для моего приложения). Вы должные изменить это и посылать логин и пароль с каждым запросом что бы каждый поток JMeter мог зарегистрироваться в вашей системе.</p><p>Перенаправь вывод скрипта в файл с расширением .jmx &#8211; это и есть ваш тестовый план.</p><p>Для первичного теста, запустите <code>makeplan.pl</code> скрипт с небольшим логом. Загрузите этот тест файл в JMeter и запустите тест. Далее, проверьте результаты, для этого можете использовать <em>View Results Tree</em> Listener (его нужно добавить до запуска теста). После того как запустите тест, вы можете использовать <em>Response data</em> для точного просмотра того что вернулось от сервера.</p><p>Внимание, скрипт <code>makeplan.pl</code> не просто нарезает исходный файл на количество кусочком равное количеству поток. Он пытается расположить запросы примерно в том же порядке что они были в Apache log, каждый поток получает n-й запрос (n количество потоков).</p><h2><a
title="running" name="running"></a>Запуск теста</h2><p>Ты можешь запустить свой полный тест используя <code>runtest.sh</code> скрипт. Перед использование укажи путь к папке &laquo;bin&raquo; внутри этого скрипта к твоей инсталляции JMeter.</p><p>Суть скрипта в следующей строке:</p><blockquote><pre>jmeter -n -t $DIR/$1.jmx -l $DIR/$1.jtl</pre></blockquote><p>Где <code>$DIR</code> твоя текущая директория, и <code>$1</code> имя тестового плана. Опция -n, говорит JMeter запускаться в консольном режиме, опция -t указывает на тест что нужно запустить, -l указывает на выходной файл результатов.</p><h2><a
title="analyzing" name="analyzing"></a>Анализ результатов тестирования</h2><p>После выполнения теста, открой тестовый план <code>results</code>, что приложен к этой документации. Этот план включает в себя только анализаторы результатов (listeners), ваши результаты могу быть загружены в них для анализа.</p><p>Я решил что <code>Aggregate Report</code> наиболее удобный для анализа результата тестирования описанного здесь. Наиболее важный столбец называется &laquo;<code>Average</code>&raquo; и показывает среднее число миллисекунд, которые потребовались для обработки запроса. Столбец &laquo;rate&raquo; показывает как часто этот запросы был послан. Т.к. мы использует таймеры для ограничения скорости посылания запросов, то количество в этом столбце не отражает то как хорошо/плохо сервер обрабатывает запрос.</p><p>Для загрузки результатов теста, выбери <code>Aggregate Report</code>, далее в <code>Filename</code>, далее <code>Browse...</code> . Выбери файл с результатами и нажми <code>Load</code>. Для просмотра результатов в другом формате используйте остальные отчеты (listeners).</p> ]]></content:encoded> <wfw:commentRss>http://look-in.net/2007/12/24/create-jmeter-plan-apache-access-log/feed/</wfw:commentRss> <slash:comments>5</slash:comments> </item> <item><title>Перевод статьи &#171;Введение в Lucene&#187;</title><link>http://look-in.net/2005/02/16/lucene-introduction-article/</link> <comments>http://look-in.net/2005/02/16/lucene-introduction-article/#comments</comments> <pubDate>Wed, 16 Feb 2005 14:00:49 +0000</pubDate> <dc:creator>slookin</dc:creator> <category><![CDATA[java]]></category> <category><![CDATA[translation]]></category> <category><![CDATA[java translation lucene searchengine]]></category> <guid
isPermaLink="false">http://localhost/wordpress/index.php/2007/11/27/lucene/</guid> <description><![CDATA[ Перевел статью по индексированию и поиску с использование Lucene API, работающие примеры на Java.
автор Erik Hatcher (01/27/2005) источник
перевод Сергей Лукин
По мере усложнения восприятия мира люди изобретали различные виды классификации, каталоголизации по различным иерархическим схемам (как то по видам и родам животных, по направлениям музыки в каталоге дисков). Развитие интернета и электронных хранилищ позволили сделать [...]]]></description> <content:encoded><![CDATA[<p><a
href="http://look-in.net/wp-content/uploads/2007/11/lucene.gif" title="Lucene logo" class="thickbox no_icon" rel="gallery-33"><img
src="http://look-in.net/wp-content/uploads/2007/11/lucene.gif" alt="Lucene logo" align="left" hspace="20" /></a><small> </small>Перевел статью по индексированию и поиску с использование Lucene API, работающие примеры на Java.</p><p><small>автор <a
href="http://today.java.net/pub/au/15" target="_blank">Erik Hatcher</a> (01/27/2005) <a
href="http://today.java.net/pub/a/today/2003/07/30/LuceneIntro.html" target="_blank">источник</a><br
/> перевод <a
href="http://look-in.net/" target="_blank">Сергей Лукин</a><br
/> </small><span
id="more-33"></span></p><p>По мере усложнения восприятия мира люди изобретали различные виды классификации, каталоголизации по различным иерархическим схемам (как то по видам и родам животных, по направлениям музыки в каталоге дисков). Развитие интернета и электронных хранилищ позволили сделать огромный шаг в построение сложных каталогов для быстрого поиска информации. Как пример, Yahoo содержит огромный классификатор сайтов интернета. Но поиск по каталогу долог и требует от человека хорошего знания предметной области, поэтому требовался &laquo;свободный&raquo; поиск, сквозной поиск по всему каталогу, с произвольно составленным запросом. Лучший пример этого демонстрирует Google.</p><p>Если же от вашего приложения пользователи требуют такой  функциональности, то Lucene это лучший способ сделать это быстро, просто и эффективно.</p><p>Lucene это высокопроизводительный, масштабируемый, поисковый движок. В нем одновременно реализованы и функции индексирования и функции поиска, доступ к этим функциям предоставляется через API Lucene. В первой части этой статья вы увидите пример использования Lucene для индексирования файлов в каталоге и подкаталогах. Далее небольшое отступление описывающее формат индексного каталога Lucene. Потом о краткое исследования методов анализа текста и, наконец реализацию поиска.</p><h2>Индексирование</h2><p>В начале создадим класс Indexer который будем использовать для индексирования всех текстовых файлов в указанной директории. Этот утилитарный класс с единственным внешним (public) методом index(), который принимает два аргумента. Первый indexDir &#8211; объект класса File который ссылается на каталог в котором будет создаватся индексная база. Второй аргумент это другой объект класса File который в свою очередь ссылается на каталог который будет индексироваться.</p><pre lang="java">
public static void index(File indexDir, File dataDir) throws IOException {
  if (!dataDir.exists() || !dataDir.isDirectory()) {
     throw new IOException(dataDir + " does not exist or is not a directory");
  }
  IndexWriter writer = new IndexWriter(indexDir, new StandardAnalyzer(), true);
  indexDirectory(writer, dataDir);
  writer.close();
}</pre><p>После проверки что dataDir существует и это каталог, мы инстанцируем объект класса IndexWriter который будет использоваться для создания индекса. Конструктор IndexWriter принимает в качестве первого параметра каталог в котором индексная база будет создана последний аргумент указывает что мы будем пересоздавать индекс, а не дополнять существующий (если таковой есть в каталоге). Средний параметр &#8211; это анализатор, который используется для анализа полей. Анализ полей будет описан ниже, но сейчас мы можем быть уверенны что все важные слова в файлах будут проиндексированы благодаря анализатору StandardAnalyzer.</p><p>Метод indexDirectory() ходит по дереву каталогов, сканирует его на наличие файлов с расширением .txt. Любой .txt файл будет проиндексирован методом indexFile(), а любой каталог будет обработан методом indexDirectory(), все остальные файлы будут проигнорированы. Ниже приведен код метода indexDirectory</p><pre lang="java">private static void indexDirectory(IndexWriter writer, File dir)  throws IOException
{
      File[] files = dir.listFiles();
      for (int i = 0; i &lt; files.length; i++) {
            File f = files[i];
            if (f.isDirectory()) {
                indexDirectory(writer, f);  // recurse
            } else if (f.getName().endsWith(".txt")) {
                indexFile(writer, f);
            }
      }
}</pre><p>Метод indexDirectory() живет полностью независимо от Lucene. Этот пример использования Lucene основной &#8211;  крайне редко при использовании Lucene приходиться много программировать с Lucene API, надо просто использовать готовое. В завершени класса Indexer, мы реализуем самое главное &#8211; индексирование отдельного текстового файла:</p><pre lang="java">
private static void indexFile(IndexWriter writer, File f) throws IOException {
  System.out.println("Indexing " + f.getName());
  Document doc = new Document();
  doc.add(Field.Text("contents", new FileReader(f)));
  doc.add(Field.Keyword("filename", f.getCanonicalPath()));
  writer.addDocument(doc);
}</pre><p>И&#8230; поверите вы или нет, но мы сделали это!<br
/> Мы проиндексировали все текстовые файлы в дереве каталогов.<br
/> Это действительно так просто. Подведем итог, перечислим шаги которые мы предприняли:</p><li>Создали IndexWriter.</li><li>Определили каждый файл который необходимо проиндексировать. (прошлись по дереву каталогов, и выбрали<br
/> все файлы с расширением .txt)</li><li>Для каждого файла создали объект класса Document с желаемыми полями.</li><li>Добавили этот документ в инстанс IndexWriter.Теперь соберем все эти методы в класс Indexer и добавим импорт необходимых пакетов.Индексировать файлы можно вызвав метод Indexer.index( indexDir, dataDir). Мы также добавим метод main() класса Indexer, который при запуске из командной строки принимает два аргумента &#8211; каталоги для индексной базы и индексируемый каталог.</li><pre lang="java">
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;import java.io.*;
public class Indexer {
 public static void index(File indexDir, File dataDir) throws IOException {
 	if (!dataDir.exists() || !dataDir.isDirectory()) {
 		throw new IOException(dataDir
 				+ " does not exist or is not a directory");
 	}
 	IndexWriter writer = new IndexWriter(indexDir, new StandardAnalyzer(),
 			true);
 	indexDirectory(writer, dataDir);
 	writer.close();
 }
private static void indexDirectory(IndexWriter writer, File dir)
 throws IOException {
 	File[] files = dir.listFiles();
 	for (int i = 0; i &lt; files.length; i++) {
 		File f = files[i];
 		if (f.isDirectory()) {
 			indexDirectory(writer, f); // recurse
 		} else if (f.getName().endsWith(".txt")) {
 			indexFile(writer, f);
 		}
 	}
 }
private static void indexFile(IndexWriter writer, File f)
 		throws IOException {
 	System.out.println("Indexing " + f.getName());
 	Document doc = new Document();
 	doc.add(Field.Text("contents", new FileReader(f)));
 	doc.add(Field.Keyword("filename", f.getCanonicalPath()));
 	writer.addDocument(doc);
 }
public static void main(String[] args) throws Exception {
 	if (args.length != 2) {
 		throw new Exception(
 		"Usage: " + Indexer.class.getName() + " &lt; index &gt; &lt; data &gt;");
 	}
File indexDir = new File(args[0]);
 	File dataDir = new File(args[1]);
 	index(indexDir, dataDir);
 }
}</pre><p>В этом примере в каждый документ входит два поля: contents &#8211; содержание текстового файла и его полное имя (с путем) &#8211; filename. Поле с содержанием специальным образом обрабатывается с помощью StandardAnalyzer, это будет описано позже. Поле filename индексируется как есть. Статические методы класса Filed: Text и Keywords будут подробно объяснены после краткого взгляда внутрь Lucene.</p><h2>Внутри Lucene индекса</h2><p>Формат индекса Lucene &#8211; это каталог с различными файлами. Вы можете успешно использовать Lucene и без понимания структуры каталога. Можно свободно пропустить этот раздел и рассматривать каталог как черный ящик без заботы о том что внутри. Если же вы готовы рассматривать глубже, то вы обнаружите что файлы созданные в прошлом разделе содержат статистику и другие данные облегчающие быстрый поиск и ранжирование. Индекс содержит последовательность документов. В нашем примере, каждый документ представляет информацию о текстовом файле.</p><h3>Документ (<code>Document</code>)</h3><p>Документ это основный объект, которым оперирует Lucene. Документы содержат последовательность полей Поля имеют имена (&laquo;contents&raquo; и &laquo;filename&raquo; в нашем примере).Значения полей это последовательность элементов (terms).</p><h3>Элементы (<code>Terms</code>)</h3><p>Элементы это мельчайшие части конкретного поля. Поля имеют три атрибута.</p><li>Stored (Сохранен) &#8212; Текст будет доступен в документе полученном в результате поиска.</li><li>Indexed (Индексированный) &#8212; Помещает поля как пригодные для поиска.</li><li>Tokenized (Размеченный) &#8212; Текст добавляется через запущенный анализатор и разделяется на релевантные части (это делается только для индексированных полей).Сохраненные поля удобны для немедленного получения исходного текста сразу после поиска, такие как первичный ключ базы данных или имя файла. Сохраненные поля сильно увеличивают размер индекса, поэтому использовать их нужно мудро.<br
/> Информация размеченных полей хранится очень эффективно, так как одни и те же элементы в тех же полях для множества документов сохраняются только единожды, с указанием на документ что содержит их.Класса Field имеет несколько статических методов для создания полей с различной комбинацией этих атрибутов. Вот они:</li><li><code>Field.Keyword</code> &#8212; Индексирован и сохранен, но не размеченный. Ключевые поля<br
/> обычно используются для таких данных как имена файлов, номера партий, первичные ключи,<br
/> и другой текст который необходимо оставить незатронутым.</li><li><code>Field.Text</code> &#8212; Индексирован и размечен. Этот текст также<br
/> сохранен есть он добавлен как класс <code>String</code>, и не будет сохранен если добавлен как класс Reader.</li><li><code>Field.UnIndexed</code> &#8212; Только сохраняется. По таким поля нельзя искать.</li><li><code>Field.UnStored</code> &#8212; Индексирован и размечен, но не сохранен. Такие поля идеальны, если вы хотите искать по этому полю, но хранить его отдельно от индексной базы и нет необходимости получать оригинальный текст сразу при выполнении поискового запроса.Глядя на выше сказанное, Lucene кажется относительно простым. Но он просто внешне, внутренняя реализация сложна, и основная сложность заключена в методах анализа текста, и в том как хранить элементы из размеченных полей.</li><h2>Анализ</h2><p>Анализ происходит в полях что помечены как размечаемые(<code>tokenized</code>). В нашем примере, мы индексируем поле contents &#8211; содержание текстовых файлов. Наша цель сделать все слова в текстовом файле пригодными для поиска,<br
/> но на практике цель немного отличается нам не нужно делать индекс чувствительным к каждому полю. Такие слова как &laquo;a&raquo;, &laquo;and&raquo; и &laquo;the&raquo; обычно обдуманно не подходят для поиска и исключением их из индекса можно оптимизировать<br
/> индекс, такие слова называется стоп-слова.</p><p>Какую сущность мы ищем? Что является словом, как отделить одно слово от другого. Акронимы, электронные адреса, интернет ссылки и другие такие конструкции, оставлять незатронутым и делать доступными для поиска? Если<br
/> слово в единственном числе проиндексировано, делать ли доступным для поиска его множественное число?<br
/> Это все интересные и сложные вопросы, ответы на которые позволяют выбрать какой из анализаторов использовать, или создавать свой.</p><p>В нашем примере, мы используем в встроенный в Lucene анализатор <code>StandardAnalyzer</code>, но существуют и другие встроенные анализаторы, а также и некоторые дополнительные. Приведем не большой кусочек кода который позволяет рассмотреть работу различных анализаторов на двух различных строках.</p><pre lang="java">import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.WhitespaceAnalyzer;
import org.apache.lucene.analysis.StopAnalyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.Token;
import org.apache.lucene.analysis.SimpleAnalyzer;
import org.apache.lucene.analysis.snowball.SnowballAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import java.io.StringReader;
import java.io.IOException;public class AnalysisDemo {
    private static final String[] strings = {
        "The quick brown fox jumped over the lazy dogs",
        "XY&amp;Z Corporation - xyz@example.com"    };
private static final Analyzer[] analyzers = new Analyzer[]{
        new WhitespaceAnalyzer(),
        new SimpleAnalyzer(),
        new StopAnalyzer(),
        new StandardAnalyzer(),
        new SnowballAnalyzer("English", StopAnalyzer.ENGLISH_STOP_WORDS)
    };
public static void main(String[] args) throws IOException {
        for (int i = 0; i &lt; strings.length; i++) {
            analyze(strings[i]);
        }
    }
private static void analyze(String text) throws IOException {
        System.out.println("Analzying \"" + text + "\"");
        for (int i = 0; i &lt; analyzers.length; i++) {
            Analyzer analyzer = analyzers[i];
            System.out.println("\t" + analyzer.getClass().getName() + ":");
            System.out.print("\t\t");
            TokenStream stream = analyzer.tokenStream("contents",
                  new StringReader(text));
                  new StringReader(text));
            while (true) {
                Token token = stream.next();
                if (token == null) break;
System.out.print("[" + token.termText() + "] ");
            }
            System.out.println("\n");
        }
    }
}</pre><p>Метод analyze использует исследовательскую форму Lucene API, для обычного индексирования эти функции не нужны, но удобны для рассмотрения как различные анализаторы размечают текст на элементы (термы). Результат выполнения следующий:</p><pre>Analzying "The quick brown fox jumped over the lazy dogs"org.apache.lucene.analysis.WhitespaceAnalyzer:[The] [quick] [brown] [fox] [jumped] [over] [the] [lazy] [dogs]
org.apache.lucene.analysis.SimpleAnalyzer:
[the] [quick] [brown] [fox] [jumped] [over] [the] [lazy] [dogs]
org.apache.lucene.analysis.StopAnalyzer:
[quick] [brown] [fox] [jumped] [over] [lazy] [dogs]
org.apache.lucene.analysis.standard.StandardAnalyzer:
[quick] [brown] [fox] [jumped] [over] [lazy] [dogs]
org.apache.lucene.analysis.snowball.SnowballAnalyzer:
[quick] [brown] [fox] [jump] [over] [lazi] [dog]
Analzying "XY&amp;Z Corporation - xyz@example.com"
org.apache.lucene.analysis.WhitespaceAnalyzer:
[XY&amp;Z] [Corporation] [-] [xyz@example.com]
org.apache.lucene.analysis.SimpleAnalyzer:
[xy] [z] [corporation] [xyz] [example] [com]
org.apache.lucene.analysis.StopAnalyzer:
[xy] [z] [corporation] [xyz] [example] [com]
org.apache.lucene.analysis.standard.StandardAnalyzer:
[xy&amp;z] [corporation] [xyz@example] [com]
org.apache.lucene.analysis.snowball.SnowballAnalyzer:
[xy&amp;z] [corpor] [xyz@exampl] [com]</pre><p>Анализатор <code>WhitespaceAnalyzer</code> самый простой, он просто разбивает на элементы основываясь на пробелах.<br
/> Он даже не меняет регистр букв. Поиск регистрочувствительный поэтому обычной практикой приведение к нижнему регистру текста в процессе фазы анализа. Остальные анализаторы приводят к нижнему регистру в процессе анализа. <code>SimpleAnalyzer</code> разбивает текс основываясь на несимвольных разделителях, таких как специальные символы (&#8216;&amp;&#8217;, &#8216;@&#8217;, и &#8216;.&#8217;). <code>StopAnalyzer</code> использует  фенкциональность <code>SimpleAnalyzer</code> и так же удаляет основные английские стоп-слова.</p><p>Наиболее сложный анализатор встроенный в ядро Lucene это <code>StandardAnalyzer</code>. Под ним скрывается основанный на JavaCC парсер с правилами для электронных адресов, акронимов, веб-адресов, дробных чисел, а так же он приводит к нижнему регистру и удаляет слова входящие в список стоп-слов. Анализатор построен по архитектуре цепочки фильтров, таким образом несколько разноцелевых правил комбинируются.</p><p>Анализатор <code>SnowballAnalyzer</code> демонстрирует не встроенный на данных момент в Lucene функциональность. Эта часть кода доступна в jakarta-lucene-sandbox CVS хранилище. Он показывает наиболее специфичные результаты. Алгоритм его основан на языке текста, и использует стемминг (stemming). Алгоритмы стемминга пытаются привести слово к его основной корневой форме. Это мы видим в примере с  &laquo;lazy&raquo; который был приведен к &laquo;lazi&raquo;. Слово &laquo;laziness&raquo; так же<br
/> будет приведено к &laquo;lazi&raquo;, тем самым при поиск мы найдем оба документа сразу. Другой интересный пример работы<br
/> <code>SnowballAnalzyer</code> с текстом &laquo;corporate corporation corporations corpse&raquo;, который приведет к следующим результатам</p><pre><code>[corpor] [corpor] [corpor] [corps]</code></pre><p>На этом мы остановим исследование текстовых анализаторов. Так как за этой темой стоит множество диссертаций и патентов, и конечно множество исследований. Теперь, зная как разбивается текст при индексировании, построим класс для поиска.</p><h2>Поиск</h2><p>В соответствии с нашим примером индексирования, создадим класс поиска Seacher который показывает результаты для того же индекса. Основные части этого класса:</p><pre lang="java">
import org.apache.lucene.document.Document;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Hits;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.Directory;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import java.io.File;public class Searcher {
    public static void main(String[] args) throws Exception {
        if (args.length != 2) {
            throw new Exception(
            "Usage: " + Searcher.class.getName() + " &lt; index &gt; &lt;query&gt;");
        }
File indexDir = new File(args[0]);
        String q = args[1];
if (!indexDir.exists() || !indexDir.isDirectory()) {
            throw new Exception(indexDir + " is does not exist or is not a directory.");
        }
search(indexDir, q);
    }
public static void search(File indexDir, String q)  throws Exception{
        Directory fsDir = FSDirectory.getDirectory(indexDir, false);
        IndexSearcher is = new IndexSearcher(fsDir);
Query query = QueryParser.parse(q, "contents", new StandardAnalyzer());
        Hits hits = is.search(query);
        System.out.println("Found "
        hits.length() + " document(s) that matched query '" + q + "':");
        for (int i = 0; i &lt; hits.length(); i++) {
            Document doc = hits.doc(i);
            System.out.println(doc.get("filename"));
        }
    }
}</pre><p>Объект Query из API Lucene создается в IndexSearcher.search методе. Объект Query может быть создан через<br
/> API используя встроенные подклассы Query:</p><li>TermQuery</li><li>BooleanQuery</li><li>PrefixQuery</li><li>WildcardQuery</li><li>RangeQuery</li><p>и несколько других. В нашем случае мы используем метод parse класса QueryParser для разбора введенного пользователем запроса. QueryParser это сложный основанный на JavaCC парсер который разбирает из запроса, похожего на Google запрос, в представление Lucene API Query.<br
/> Синтаксис запросов Lucene документирован на сайте Lucene, выражения могут содержать логические операции, указание на поля в которых искать, группировку, ранжирование запросов и многое другое. Как пример, выражение &laquo;+java -microsoft&raquo;, которое вернет совпадения для документов содержащих слово &laquo;java&raquo;, но не содержащих слово &laquo;microsoft.&raquo; QueryParser.parse необходимо указать поле по умолчанию для поиска, и в нашем случае мы укажем &laquo;contents&raquo; поле. Это будет эквивалентно запросу &laquo;+contents:java &#8211; contents:microsoft&raquo;, но будет намного удобнее в использовании пользователям.<br
/> Так же разработчик должен указать какой анализатор использовать для разметки запроса. В нашем случае мы используем StandardAnalyzer, который тот же самый что и при индексировании. Обычно один и тот же анализатор используется и для индексирования и для разбора строки запроса. Если мы использовали SnowballAnalyzer то как было показано в примере исследований анализатора, то запрос со словом &laquo;laziness&raquo; вернет все документы с элементом &laquo;lazi&raquo;.После поиска, возвращается набор ссылок на результаты &#8211; Hints Collection.<br
/> Ссылки возвращаются в порядке определяемый &laquo;очками&raquo; &#8211; релевантностью документа. Обсуждение алгоритма начисления очков не входит в рамки этой статьи, но можно быть уверенным что алгоритм по умолчанию подойдет к большинству приложений, и существует возможность настройки его в тех редких случаях когда этого алгоритма недостаточно.<br
/> Набор результатов сам по себе не является набором документов которые были найдены. Так сделано в частности и для повышения эффективности. Но ссылка (hint) представляет простой метод для получения документа. В нашем примере<br
/> мы выводим на экран поле с именем &laquo;filename&raquo; для каждого документа что были получены в результатах поиска.</p><h2>Подводя итоги</h2><p>Lucene логичный и красиво построенный продукт с изумительной функциональностью, это требует от разработчика искусного подхода к построению приложения вокруг него. Мы кратко обсудили проблему выбора анализатора, кроме этого<br
/> перед разработчиком стоят следующие вопросы:</p><li>Что является моим &laquo;документом&raquo;? (строки из базы, параграфы текстового файла)</li><li>Какие поля и как мне индексировать?</li><li>Как пользователи будут использовать поиск?Эта статья служит введением в возможности Lucene,<br
/> демонстрируя как наиболее просто использовать Lucene.[от переводчика] В этой статье не рассмотрены такие интересные вопросы как:</li><li> Индексирование русскоязычных документов.</li><li> &laquo;Подсветка&raquo; найденного слова в результатах поиска.</li><li> Оптимизация индексирования, сведение двух индексов в один.</li><h2>Источники</h2><p>Для дополнительной информации о Lucene, посетите сайт <a
href="http://jakarta.apache.org/lucene" traget="_blank">Lucene</a>.<br
/> Там вы сможете найти информацию о синтаксисе запросов и формате индексных файлов.</p><p>Erik Hatcher соавтор книги об Ant&#8217;е,<br
/> &laquo;Java Development with Ant&raquo; (опубликовано издательством Manning),<br
/> и так же соавтор книги &laquo;Lucene in Action&raquo;.</p> ]]></content:encoded> <wfw:commentRss>http://look-in.net/2005/02/16/lucene-introduction-article/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
