<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Непредвиденные последствия</title>
	
	<link>http://shkuropiy.ru</link>
	<description>Блог Андрея Шкуропия, программиста shareware</description>
	<pubDate>Fri, 20 Aug 2010 08:01:38 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/shkuropiy" /><feedburner:info uri="shkuropiy" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Cautus.ru — новый блог о сетевой безопасности</title>
		<link>http://feedproxy.google.com/~r/shkuropiy/~3/K62ncBB-UVg/cautusru-novyj-blog-o-setevoj-bezopasnosti</link>
		<comments>http://shkuropiy.ru/news/cautusru-novyj-blog-o-setevoj-bezopasnosti#comments</comments>
		<pubDate>Fri, 20 Aug 2010 07:43:07 +0000</pubDate>
		<dc:creator>Андрей Шкуропий</dc:creator>
		
		<category><![CDATA[Интересные ссылки]]></category>

		<category><![CDATA[Новости]]></category>

		<category><![CDATA[безопасность]]></category>

		<category><![CDATA[блог]]></category>

		<category><![CDATA[компьютер]]></category>

		<category><![CDATA[сеть]]></category>

		<guid isPermaLink="false">http://shkuropiy.ru/news/cautusru-novyj-blog-o-setevoj-bezopasnosti</guid>
		<description><![CDATA[Открыл новый проект http://cautus.ru. Это блог о компьютерной и сетевой безопасности для начинающих]]></description>
			<content:encoded><![CDATA[<p>Открыл новый проект <a href="http://cautus.ru" onclick="javascript:pageTracker._trackPageview('/outbound/article/cautus.ru');">http://cautus.ru</a>. Это блог о компьютерной и сетевой безопасности для начинающих. Странно, но я не нашел в СНГ ни одного проекта похожей тематики (может плохо искал?), хотя необходимость просвещения пользователей о новых угрозах назрела уже давно.</p>
<p>На этом блоге в меру своих сил я буду делать следующее:</p>
<ul>
<li>Простым языком рассказывать неопытным пользователям об опасностях, подстерегающих их на просторах интернета и в локальных сетях. </li>
<li>Давать советы по безопасному сетевому поведению. </li>
<li>Снабжать обзорами сопутствующего программного обеспечения для защиты компьютера. </li>
<li>Информировать о новых глобальных сетевых угрозах и мировых новостях безопасности.</li>
</ul>
<p>В проект приглашаются авторы, которым, как и мне, надоело вытаскивать компьютеры знакомых из-под вирусных наездов. Если вам есть что рассказать людям, <a href="http://cautus.ru/stante-avtorom" onclick="javascript:pageTracker._trackPageview('/outbound/article/cautus.ru');">свяжитесь со мной</a>.</p>
<img src="http://feeds.feedburner.com/~r/shkuropiy/~4/K62ncBB-UVg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://shkuropiy.ru/news/cautusru-novyj-blog-o-setevoj-bezopasnosti/feed</wfw:commentRss>
		<feedburner:origLink>http://shkuropiy.ru/news/cautusru-novyj-blog-o-setevoj-bezopasnosti</feedburner:origLink></item>
		<item>
		<title>Новая версия easyQuizzy 1.6 готова</title>
		<link>http://feedproxy.google.com/~r/shkuropiy/~3/voyBp5EaeVc/novaya-versiya-easyquizzy-16-gotova</link>
		<comments>http://shkuropiy.ru/news/novaya-versiya-easyquizzy-16-gotova#comments</comments>
		<pubDate>Thu, 16 Jul 2009 09:34:29 +0000</pubDate>
		<dc:creator>Андрей Шкуропий</dc:creator>
		
		<category><![CDATA[easyQuizzy]]></category>

		<category><![CDATA[Новости]]></category>

		<category><![CDATA[1.6]]></category>

		<category><![CDATA[crack]]></category>

		<category><![CDATA[keygen]]></category>

		<category><![CDATA[serial]]></category>

		<category><![CDATA[бесплатно]]></category>

		<category><![CDATA[крак]]></category>

		<category><![CDATA[кряк]]></category>

		<category><![CDATA[многоязыковая поддержка]]></category>

		<category><![CDATA[патч]]></category>

		<category><![CDATA[серийник]]></category>

		<guid isPermaLink="false">http://shkuropiy.ru/news/novaya-versiya-easyquizzy-16-gotova</guid>
		<description><![CDATA[Напоминаем, что у нас имеются следующие варианты для бесплатного получения лицензии ...]]></description>
			<content:encoded><![CDATA[<p>Вчера вечером состоялся выпуск новой версии easyQuizzy 1.6. Загрузить ее, как всегда, можно здесь: <a href="http://easyquizzy.ru" onclick="javascript:pageTracker._trackPageview('/outbound/article/easyquizzy.ru');">http://easyquizzy.ru</a>. В программу была добавлена многоязыковая поддержка интерфейса, которая полностью соответствует <a href="http://shkuropiy.ru/software-development/o-yazykovom-perevode-interfejsa-v-shareware"  target="_blank">описанной здесь ранее схеме</a>. Напоминаем, что у нас имеются следующие варианты для бесплатного получения лицензии:</p>
<ol>
<li>Создать <a href="http://easyquizzy.com/translate/ru:index" onclick="javascript:pageTracker._trackPageview('/outbound/article/easyquizzy.com');">перевод интерфейса программы</a> на новый язык или откорректировать существующий перевод при обнаружении в нем ошибок. Прямо сейчас было бы неплохо сделать перевод на белорусский и казахский языки, если есть добровольцы — пишите. </li>
<li>Разработать тест с помощью easyQuizzy в соответствии с <a href="http://easyquizzy.ru/help/payment/#12" onclick="javascript:pageTracker._trackPageview('/outbound/article/easyquizzy.ru');" target="_blank">нашими требованиями</a> и прислать его нам для публикации. </li>
<li>Если вы имеете ученую степень или занимаете руководящий пост в учебном заведении, вы можете оставить на сайте короткий отзыв о вашем опыте использования программы. Отзыв присылайте на электронную почту <a href="mailto:support@easyquizzy.ru">support@easyquizzy.ru</a> или отправляйте прямо <a href="http://easyquizzy.ru/help/feedback/" onclick="javascript:pageTracker._trackPageview('/outbound/article/easyquizzy.ru');" target="_blank">с нашего сайта</a>. </li>
<li>Если у вас есть блог или новостной портал, то вы можете опубликовать там коротенький обзор программы easyQuizzy со своими впечатлениями от ее использования и дать индексируемую ссылку на наш сайт. </li>
</ol>
<p>Ну и прямо сейчас мы уже начали разработку версии 1.7, которая ориентировочно выйдет в сентябре 2009 г. План реализуемых функциональных возможностей на новую версию:</p>
<ul>
<li>Сделать свободно настраиваемые системы оценивания </li>
<li>Ввести разделение вопросов по сложности с помощью числового &quot;веса&quot; каждого вопроса </li>
<li>Переработать вывод отчета по тестированию </li>
<li>Усовершенствовать работу с паролями </li>
</ul>
<p>Поиск новых идей продолжается, всем заинтересованным пользователям просьба писать на почту.</p>
<img src="http://feeds.feedburner.com/~r/shkuropiy/~4/voyBp5EaeVc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://shkuropiy.ru/news/novaya-versiya-easyquizzy-16-gotova/feed</wfw:commentRss>
		<feedburner:origLink>http://shkuropiy.ru/news/novaya-versiya-easyquizzy-16-gotova</feedburner:origLink></item>
		<item>
		<title>Переводы без перевода</title>
		<link>http://feedproxy.google.com/~r/shkuropiy/~3/LrZi-VtJBLA/perevody-bez-perevoda</link>
		<comments>http://shkuropiy.ru/observations/perevody-bez-perevoda#comments</comments>
		<pubDate>Thu, 09 Jul 2009 13:02:07 +0000</pubDate>
		<dc:creator>Андрей Шкуропий</dc:creator>
		
		<category><![CDATA[Наблюдения]]></category>

		<category><![CDATA[бизнес-коуч]]></category>

		<category><![CDATA[буттон]]></category>

		<category><![CDATA[датирование]]></category>

		<category><![CDATA[партиции]]></category>

		<category><![CDATA[пресеты]]></category>

		<category><![CDATA[рисепшэнист]]></category>

		<category><![CDATA[смешные преводы]]></category>

		<guid isPermaLink="false">http://shkuropiy.ru/observations/perevody-bez-perevoda</guid>
		<description><![CDATA[Вроде бы и смешно, но так на полном серьезе сейчас пишут в блогах и даже газетах.]]></description>
			<content:encoded><![CDATA[<ul>
<li>disk partitions — дисковые партиции  </li>
<li>button — бутон (батон)  </li>
<li>blind dating — датирование вслепую  </li>
<li>configuration presets — настроечные пресеты  </li>
<li>receptionist — рисепшэнист  </li>
<li>business-coach — бизнес-коуч  </li>
<li>please re-dial — пожалуйста, сделайте редиал  </li>
<li>generic classes — классы-дженерики  </li>
<li>parsed token — распарсенный токен</li>
</ul>
<p>Вроде бы и смешно, но так на полном серьезе сейчас пишут в блогах и даже газетах.</p>
<p>Список можно дополнить в комментариях. </p>
<img src="http://feeds.feedburner.com/~r/shkuropiy/~4/LrZi-VtJBLA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://shkuropiy.ru/observations/perevody-bez-perevoda/feed</wfw:commentRss>
		<feedburner:origLink>http://shkuropiy.ru/observations/perevody-bez-perevoda</feedburner:origLink></item>
		<item>
		<title>О языковом переводе интерфейса в shareware</title>
		<link>http://feedproxy.google.com/~r/shkuropiy/~3/xabYl6w14RM/o-yazykovom-perevode-interfejsa-v-shareware</link>
		<comments>http://shkuropiy.ru/software-development/o-yazykovom-perevode-interfejsa-v-shareware#comments</comments>
		<pubDate>Tue, 07 Jul 2009 11:48:26 +0000</pubDate>
		<dc:creator>Андрей Шкуропий</dc:creator>
		
		<category><![CDATA[easyQuizzy]]></category>

		<category><![CDATA[Разработка софта]]></category>

		<category><![CDATA[GNU GetText]]></category>

		<category><![CDATA[MUI]]></category>

		<category><![CDATA[Unicode]]></category>

		<category><![CDATA[интернационализация]]></category>

		<category><![CDATA[интерфейс]]></category>

		<category><![CDATA[локализация]]></category>

		<category><![CDATA[множественные формы]]></category>

		<category><![CDATA[перевод]]></category>

		<guid isPermaLink="false">http://shkuropiy.ru/software-development/o-yazykovom-perevode-interfejsa-v-shareware</guid>
		<description><![CDATA[Наше решение не претендует на оптимальность для всех, но, если вы никогда раньше не занимались интернационализацей, то это поможет вам построить свою систему, более эффективную для вас.]]></description>
			<content:encoded><![CDATA[<p>Большинство границ между странами в Интернете на сегодняшний день фактически стерты. Но одна граница, которая осталась в наличии, еще долго будет головной болью разработчиков программного обеспечения — языковая. Создание интернациональных программ всегда было большой проблемой, и каждая компания решала ее по-своему. Сегодня хочу написать, как эту проблему решили мы. Наше решение не претендует на оптимальность для всех, но, если вы никогда раньше не занимались интернационализацией, то это поможет вам построить свою систему, более эффективную для вас.</p>
<p><span id="more-399"></span>
<p>Для начала немного теории.</p>
<p>Есть два термина, которые разработчики часто путают: <em>интернационализация</em> и <em>локализация</em> программы. Интернационализация — это адаптация продукта для потенциального использования в любой стране, а локализация — это добавление специальных функций для использования программы в некотором <em>определённом регионе</em>. Интернационализация производится на начальных этапах разработки. Локализация делается для каждого целевого языка отдельно (подробнее <a href="http://ru.wikipedia.org/wiki/Интернационализация" onclick="javascript:pageTracker._trackPageview('/outbound/article/ru.wikipedia.org');" target="_blank" rel="nofollow">смотрите здесь</a>). Разработчики <a href="http://ru.wikipedia.org/wiki/Shareware" onclick="javascript:pageTracker._trackPageview('/outbound/article/ru.wikipedia.org');" target="_blank">shareware</a> занимаются обычно как раз интернационализацией, потому что у них просто недостаточно ресурсов для создания отдельных версий приложений для разных языков или стран, как делает, например, Microsoft. </p>
<p>При интернационализации важно еще на стадии проектирования не привязываться к конкретным языкам и странам во избежание конфликтов на национальной почве. Если вы хотите, чтобы продажи программы пошли в <a href="http://ru.wikipedia.org/wiki/ОАЭ" onclick="javascript:pageTracker._trackPageview('/outbound/article/ru.wikipedia.org');" target="_blank" rel="nofollow">ОАЭ</a>, надо, как минимум, вставлять в нее текстовые редакторы с поддержкой двунаправленного письма, использовать <a href="http://ru.wikipedia.org/wiki/Unicode" onclick="javascript:pageTracker._trackPageview('/outbound/article/ru.wikipedia.org');" target="_blank" rel="nofollow">Unicode</a>-строки во всех местах и, соответственно, Unicode-шрифты. Также следует озаботиться запросом у операционной системы изменяющихся от страны к стране региональных стандартов представления чисел, даты, денежной единицы и всем остальным, что на русском языке по-идиотски называют &#8220;культура приложения&#8221;, очевидно криво переведя английский термин &#8220;software culture&#8221;.</p>
<p>Такими нехитрыми способами можно порешать практически все проблемы интернационализации, кроме одной: вы не сможете сами перевести строки пользовательского интерфейса на все языки. </p>
<p>Многие это последнее проблемой вообще не считают и просто переводят свой интерфейс на английский язык, так как интернациональное shareware продается лучше всего почему-то в англоязычных странах. Если вам этого мало, то придется ответить на главный вопрос: <em>как вы будете взаимодействовать с переводчиками?</em><strong> </strong></p>
<p>Способов решения два:</p>
<ol>
<li><strong>Платный.</strong> Вынести все используемые в программе строки в файл ресурса, раздать его переводчикам, заплатив примерно от $5 до $10 за каждые 1000 символов, и включить переведенные ресурсы в программу.  </li>
<li><strong>Бесплатный.</strong> Сделать файлы с переводными строками доступными для изменения &#8220;на ходу&#8221; всем желающим, и поощрять самостоятельное выполнение переводов заинтересованными пользователями с постепенным включением их в дистрибутивы новых версий. </li>
</ol>
<p>Платный способ хорош своей простотой для программистов, но вам придется повторять его снова и снова при выходе новых версий приложения. Причем, пока вы не закончите с переводами, нельзя будет сделать релиз.</p>
<p>Бесплатный способ имеет то преимущество, что позволяет при необходимости заказывать платные переводы, не жертвуя возможностью получить дополнительные бесплатные переводы, однако он и более сложный в плане реализации, так как приходится создавать прозрачную и надежную схему взаимодействия с переводчиками.</p>
<p>Мы нашли способ объединить эти два решения.</p>
<p>Был создан специальный <a href="http://easyquizzy.com/translate/" onclick="javascript:pageTracker._trackPageview('/outbound/article/easyquizzy.com');" target="_blank">сайт для переводчиков</a>, на котором они могут с помощью <a href="http://ru.wikipedia.org/wiki/Wiki" onclick="javascript:pageTracker._trackPageview('/outbound/article/ru.wikipedia.org');" target="_blank" rel="nofollow">Wiki</a>-движка редактировать переводные файлы в формате <a href="http://ru.wikipedia.org/wiki/Xml" onclick="javascript:pageTracker._trackPageview('/outbound/article/ru.wikipedia.org');" target="_blank" rel="nofollow">XML</a>. Переводные файлы при достижении определенной степени завершенности у нас включаются в дистрибутив программы в виде ресурсов, и пользователь после установки программы их редактировать не может, но, если загрузить переводной файл с сайта и положить его в папку программы, то он загрузится вместо файла, который был прикреплен к программе при компиляции. Это сделано для возможности быстрой проверки качества пользовательского перевода без необходимости выпускать новую сборку программы.</p>
<p>Решение редактировать XML-файлы вручную может показаться странным из-за необходимости <a href="http://ru.wikipedia.org/wiki/Валидация" onclick="javascript:pageTracker._trackPageview('/outbound/article/ru.wikipedia.org');" target="_blank" rel="nofollow">валидации</a>, но преимущества для нас перекрыли недостатки. XML очень просто структурируется и позволяет легко задать правила форматирования даже для тех, кто этот формат первый раз в жизни видит. Идентификаторами переводных строк у нас являются оригинальные строки на английском языке, что позволяет программисту не выдумывать никаких таблиц идентификации и не синхронизировать потом номера строк-оригиналов между десятком переводных файлов.</p>
<p>Для применения перевода следует делать так, как привыкли делать переводчики <a href="http://ru.wikipedia.org/wiki/Php" onclick="javascript:pageTracker._trackPageview('/outbound/article/ru.wikipedia.org');" target="_blank" rel="nofollow">PHP</a>-страниц, интернационализированных с помощью библиотеки <a href="http://ru.wikipedia.org/wiki/Gettext" onclick="javascript:pageTracker._trackPageview('/outbound/article/ru.wikipedia.org');" target="_blank">GNU GetText</a>&nbsp; — пробрасывать оригинальные английские строки сквозь функцию трансляции, которая в зависимости от текущего выбранного языка выдает нужную переводную строку. Пример на Delphi: </p>
<pre style="font-size: 12px; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff">CloseButton.Caption := SS('Close')</pre>
<p>При такой реализации пришлось решить несколько технических вопросов, самыми главными из которых были следующие.</p>
<ol>
<li>Как идентифицировать используемые языки?
</li>
<li>Как переводить множественные формы в предложениях с числительными?</li>
</ol>
<p>Рассмотрим эти вопросы подробнее.</p>
<p>Языков на свете очень много. Теоретически, добровольцы могут захотеть перевести ваш интерфейс на любой язык, поэтому лучше сразу быть готовым к этому в программе. Кроме обычного названия языка, написанного на нем самом, следует держать его английское название для использования в меню выбора языка, а также буквенный или числовой код. Этот код нужен будет потом для кодирования переводных строк и, опционально, для автоматического определения языка при первом запуске программы, чтобы пользователю не нужно было переключаться с английского языка на свой вручную. </p>
<p>С этими буквенными кодами языков не все просто. </p>
<p>Имеется несколько версий стандарта буквенного кодирования языков под названием <a href="http://ru.wikipedia.org/wiki/ISO_639" onclick="javascript:pageTracker._trackPageview('/outbound/article/ru.wikipedia.org');" target="_blank" rel="nofollow">ISO 639</a>, и каждая последующая версия расширяет их доступный набор. Стандарт ISO 639-1 регламентирует двухбуквенные коды для основных мировых языков (en, ru, fr и т.д.), ISO 639-2 расширяет код до трех символов, значительно увеличивая набор доступных языков (eng, rus, fra и т.д.) и вводя тонкости их модификаций (например, fre/fra — современный французский, а frm — средневековый французский), ISO 639-3 тоже трехбуквенный, но покрывает также десятки диалектов и наречий, включая все разновидности наречий американских индейцев. Гигантскую сводную таблицу этих стандартов можно посмотреть <a href="http://www.sil.org/iso639-3/codes.asp" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.sil.org');" target="_blank">здесь</a>.</p>
<p>Кстати, многие делают ошибку, путая код <em>языка</em> с кодом <em>страны</em>. Хотя они иногда и совпадают (например, для России и русского языка, ru-RU), но в общем случае они должны отличаться. Коды стран должны соответствовать стандарту <a href="http://ru.wikipedia.org/wiki/ISO_3166" onclick="javascript:pageTracker._trackPageview('/outbound/article/ru.wikipedia.org');" target="_blank" rel="nofollow">ISO 3166</a>, и их записывают обычно большими буквами, если они стоят в паре с кодом языка (en_US, en_GB, uk_UA). Код страны важен для определения региональных настроек, но, поскольку предполагается, что интернационализация программы была сделана вдумчиво, и все региональные настройки типа даты и валюты выбираются из операционной системы, мы отбросили код страны за ненадобностью. Единственное место, где он может пригодиться в таком случае — это поддержка &#8220;местных&#8221; особенностей языков и локальных диалектов. Характерный пример: британский и американский английский могут отличаться используемыми наборами слов. Однако, если ваше приложение не содержит больших объемов связного текста, этот аспект можно игнорировать, все равно текстовые метки над полями ввода из трех слов правильно поймут и американцы, и англичане.</p>
<p>Мы приняли за основу языкового кодирования стандарт ISO 639-2, как наиболее распространенный трехбуквенный код, который описывает большинство языков. А если его недостаточно для идентификации языка (или диалекта), то дополнительно к этому коду используется код ISO 639-3. Посмотреть, как строится наш переводной XML-файл с секцией описания доступных языков, можно по <a href="http://easyquizzy.com/translate/ru:structure" onclick="javascript:pageTracker._trackPageview('/outbound/article/easyquizzy.com');" target="_blank">этой ссылке</a>.</p>
<p>Автоматический выбор языка в таком случае слегка затруднен тем, что привычный программистам двухбуквенный код текущего языка операционной системы (en, ru и т.д.), возвращаемый системной функцией GetLocaleInfo() с параметром LOCALE_SISO639LANGNAME, соответствует двухбуквенному стандарту ISO 639-1, поэтому пришлось построить таблицу соответствия между ISO 639-1 и ISO 639-2. Так что для большинства языков автоматический выбор все равно сработает. А если не сработает, то пользователю придется его выбрать вручную в меню один раз, ничего не поделаешь. </p>
<p>Переходим к множественным формам.</p>
<p>Перевод предложений, в которых присутствуют численные переменные, очень часто бывает затруднен выбором нужной множественной формы в конкретном языке, чтобы предложение читалось правильно при любых значениях этих переменных.
</p>
<p>Пример: дана переводная строка «Было задано x вопросов», где x — числовая переменная. При обычной подстановке x = 1 получается строка, как будто написанная роботом, который не знает, как правильно согласовывать предложения с числами: «Было задано 1 вопросов». Некоторые разработчики используют убогую схему подстановки вроде такой «Было задано x вопрос(ов)», или вообще «Было задано x вопрос(-а, -ов)», т.е. право выбора правильной формы великодушно предоставляется пользователю.
</p>
<p>А если все делать, как следует, то переводная строка должна была бы меняться так: </p>
<ul>
<li>
<p>(x = 1) «Был задан x вопрос»</p>
</li>
<li>
<p>(x = 2) «Было задано x вопроса»</p>
</li>
<li>
<p>(x = 5) «Было задано x вопросов»</p>
</li>
<li>
<p>(x = 21) «Был задан x вопрос»</p>
</li>
<li>
<p>(x = 35) «Было задано x вопросов»</p>
</li>
</ul>
<p>Если посмотреть на изменения строки при последовательном увеличении переменной x, то можно увидеть, что в русском языке достаточно только трех множественных форм предложения, чтобы охватить все варианты.
</p>
<p>Особой формы обычно требует также нулевое значение переменной: </p>
<ul>
<li>
<p>(x = 0) «Не было задано ни одного вопроса»</p>
</li>
</ul>
<p>В английском языке и многих других языках достаточно только двух форм: единичной и множественной. В словенском языке четыре множественных формы, в русском, украинском и белорусском — три.
</p>
<p>Правила выбора нужной формы в зависимости от значения переменной в общем случае отличаются для разных языков. Описания правил выбора нужной множественной формы для большинства языков можно посмотреть <a href="http://translate.sourceforge.net/wiki/l10n/pluralforms" onclick="javascript:pageTracker._trackPageview('/outbound/article/translate.sourceforge.net');" target="_blank">на этом сайте</a>.
</p>
<p>Когда я решил включить поддержку множественных форм в программу, начал искать в Интернете готовые эффективные реализации этого механизма. Требовалось обеспечить как простоту программирования, так и легкость понимания правил для переводчиков. Оказалось, что все самые &#8220;продвинутые&#8221; библиотеки интернационализации используют метод работы с множественными формами, который был введен в уже упоминавшейся GNU GetText. Все формы предложения с переменными нумеруются, начиная с нуля, и переводчику предлагается в переводном файле задать для своего языка алгоритм выбора формы, а для каждой строки с числовыми переменными — все пронумерованные формы предложений. Пример:
<pre style="font-size: 12px; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff">msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "%d день назад"
msgstr[1] "%d дня назад"
msgstr[2] "%d дней назад"</pre>
</p>
<p>Здесь msgid — это оригинальная английская строка для одиночной формы, msgid_plural — оригинальная английская строка во множественном числе, %d — целочисленная переменная, по которой будет производиться выбор нужной формы в целевом языке, а массив msgstr[n] представляет все одиночные и множественные формы переведенной строки.</p>
<p>У этого метода есть серьезный недостаток, из-за которого я его отбросил: выбор нужной формы возможен только по <em>одной числовой переменной</em>, которая встречается в предложении. Если в предложение будут включены две (и более) переменные, то придется разбивать переводные строки на куски&nbsp; и потом склеивать в программе, усложняя и без того мутный для переводчиков синтаксис.</p>
<p>Отличное решение было подсмотрено мной на <a href="http://habr.ru" onclick="javascript:pageTracker._trackPageview('/outbound/article/habr.ru');" target="_blank" rel="nofollow">Хабрахабре</a> у разработчика <a href="http://afan.habrahabr.ru/" onclick="javascript:pageTracker._trackPageview('/outbound/article/afan.habrahabr.ru');" target="_blank">Afan</a> (к сожалению, не смог найти его настоящее имя) вот в <a href="http://habrahabr.ru/blogs/development/55286/" onclick="javascript:pageTracker._trackPageview('/outbound/article/habrahabr.ru');" target="_blank">этой статье</a>. </p>
<p>Суть его в том, чтобы включать все множественные формы в одну строку, используя специальную синтаксическую конструкцию такого вида:</p>
<pre style="font-size: 12px; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff">{%номер_переменной|форма_0|форма_1|форма_2|…|форма_N}</pre>
<p>где </p>
<ul>
<li>
<p>номер_переменной — порядковый номер целочисленной переменной, по значению которой будет выбрана нужная форма предложения;</p>
</li>
<li>
<p>форма_0 — нулевая форма, которая будет выбрана при нулевом значении переменной;</p>
</li>
<li>
<p>форма_1…форма_N — все множественные формы предложения в данном языке.</p>
</li>
</ul>
<p>Пример использования в наших переводных файлах:
<pre style="font-size: 12px; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff">   &lt;id text="{%1|No right answers|1 right answer|%1 right answers},
             {%2|no wrong answers|1 wrong answer|%2 wrong answers}"&gt;
     &lt;rus&gt;{%1|Нет правильных ответов|%1 правильный ответ|%1 правильных ответа|%1 правильных ответов},
          {%2|нет неправильных ответов|%2 неправильный ответ|%2 неправильных ответа|%2 неправильных ответов}&lt;/rus&gt;
   &lt;/id&gt;</pre>
</p>
<p>В данном примере оригинальная английская строка имеет две переменных: %1 — количество правильных ответов, %2 — количество неправильных ответов. С помощью данного синтаксиса множественных форм они при любых значениях переменных сформируют согласованную строку.
</p>
<p>Например, при подстановке %1 = 0, а %2 = 5 получим «No right answers, 5 wrong answers».
</p>
<p>Обратите внимание, что внутри каждой формы можно использовать переменные, константы или вообще обойтись только текстом.
</p>
<p>И для программиста, и для переводчика цельная строка такой конструкции будет гораздо нагляднее, чем разбитая на две части по методу GNU GetText. Разбирать такие строки в программе можно с помощью простейшего однопроходного интерпретатора, разработка которого доступна студенту-второкурснику с факультета программирования. Я применил рекурсивный спуск по простой левосторонней грамматике. В указанной выше ссылке на статью есть способ разбора с помощью регулярных выражений на C#.
</p>
<p>Вот в принципе и вся наша схема интернационализации приложений, которую я буду применять для всех будущих shareware-проектов. Остальные мелкие технические вопросы вроде использования запрещенных символов и подстановки переменных я здесь рассматривать не буду, так как они уже описаны на нашем <a href="http://easyquizzy.com/translate/" onclick="javascript:pageTracker._trackPageview('/outbound/article/easyquizzy.com');" target="_blank">wiki-сайте для переводчиков</a>.
</p>
<p>Если у вас есть идеи по улучшению данной схемы — пожалуйста, пишите в комментариях или на почту. Я подумываю о том, чтобы сделать свой модуль языковой поддержки бесплатным программным компонентом, и, если будет достаточно желающих его получить, то так и сделаю.</p>
<img src="http://feeds.feedburner.com/~r/shkuropiy/~4/xabYl6w14RM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://shkuropiy.ru/software-development/o-yazykovom-perevode-interfejsa-v-shareware/feed</wfw:commentRss>
		<feedburner:origLink>http://shkuropiy.ru/software-development/o-yazykovom-perevode-interfejsa-v-shareware</feedburner:origLink></item>
		<item>
		<title>Прекращение поддержки Windows 9x</title>
		<link>http://feedproxy.google.com/~r/shkuropiy/~3/QjKW-LpVFaY/prekrashhenie-podderzhki-windows-9x</link>
		<comments>http://shkuropiy.ru/software-development/prekrashhenie-podderzhki-windows-9x#comments</comments>
		<pubDate>Fri, 26 Jun 2009 12:06:29 +0000</pubDate>
		<dc:creator>Андрей Шкуропий</dc:creator>
		
		<category><![CDATA[easyQuizzy]]></category>

		<category><![CDATA[Разработка софта]]></category>

		<category><![CDATA[95]]></category>

		<category><![CDATA[98 SE]]></category>

		<category><![CDATA[9x]]></category>

		<category><![CDATA[Me]]></category>

		<category><![CDATA[Windows]]></category>

		<category><![CDATA[XP]]></category>

		<category><![CDATA[поддержка]]></category>

		<guid isPermaLink="false">http://shkuropiy.ru/software-development/prekrashhenie-podderzhki-windows-9x</guid>
		<description><![CDATA[Коллеги надо мной насмехаются и говорят, что Microsoft уже собралась снимать с поддержки Windows XP, а мы тут еще тестирую программы под всеми древними операционками]]></description>
			<content:encoded><![CDATA[<p>Очевидно, давно назрела необходимость принять волевое решение и прекратить поддержку в своих программах линейки операционных систем Windows 9x, куда входят Windows 95, 98 и Me. Коллеги надо мной насмехаются и говорят, что Microsoft уже собралась снимать с поддержки Windows XP, а мы тут еще тестируем программы под всеми древними операционками, но я до сих пор встречаю редкие прецеденты использования Windows 98 SE в некоторых небогатых учебных заведениях. Тот факт, что они не относятся к платежеспособным пользователям, для меня был не критичен, пока поддержка Windows 9x в коде не создавала проблем для дальнейшего развития программы <a href="http://easyquizzy.ru/" onclick="javascript:pageTracker._trackPageview('/outbound/article/easyquizzy.ru');" target="_blank">easyQuizzy</a>. Но вот сейчас я взглянул на весь свой код, написанный для обеспечения совместимости, и ужаснулся. Мне он совершенно не нравится. Он потенциально опасный в новых версиях Windows. Кроме того, он затрудняет добавление новой функциональности в области многоязыковой поддержки.</p>
<p>В общем так. Если кто-нибудь из пользователей Windows 9x отзовется здесь до выпуска easyQuizzy 1.6, мы продлим поддержку еще на пару месяцев. Если нет — ну, простите, но уже больше 10 лет прошло. Сколько ж можно-то&#8230;</p>
<img src="http://feeds.feedburner.com/~r/shkuropiy/~4/QjKW-LpVFaY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://shkuropiy.ru/software-development/prekrashhenie-podderzhki-windows-9x/feed</wfw:commentRss>
		<feedburner:origLink>http://shkuropiy.ru/software-development/prekrashhenie-podderzhki-windows-9x</feedburner:origLink></item>
		<item>
		<title>Twitter-шмиттер</title>
		<link>http://feedproxy.google.com/~r/shkuropiy/~3/FyMGqYl73ZE/twitter-shmitter</link>
		<comments>http://shkuropiy.ru/news/twitter-shmitter#comments</comments>
		<pubDate>Mon, 22 Jun 2009 08:50:25 +0000</pubDate>
		<dc:creator>Андрей Шкуропий</dc:creator>
		
		<category><![CDATA[Новости]]></category>

		<category><![CDATA[todo]]></category>

		<category><![CDATA[Twitter]]></category>

		<category><![CDATA[микроблоггинг]]></category>

		<category><![CDATA[ты где]]></category>

		<guid isPermaLink="false">http://shkuropiy.ru/news/twitter-shmitter</guid>
		<description><![CDATA[когда ты пишешь, что делаешь, то устанавливаешь эдакий контракт, который вынуждает тебя начать делать какое-то дело. И может быть даже закончить потом]]></description>
			<content:encoded><![CDATA[<p>Давно я уже слышу о микроблоггинге, много говорят как хорошего, так и плохого. Суть в том, чтобы сбрасывать в какой-либо <a href="http://twitter.com" onclick="javascript:pageTracker._trackPageview('/outbound/article/twitter.com');" target="_blank" rel="nofollow">сайт-агрегатор</a> короткие сообщения о своем текущем занятии и местонахождении, т.к. первый вопрос при звонке по телефону обычно идет: &#8220;Ты где?&#8221;, а второй: &#8220;А шо ты делаешь?&#8221;. Если эту информацию регулярно выкладывать где-нибудь для публичного доступа, или хотя бы только для друзей, то, теоретически, затраты на мобильную связь должны снизиться как минимум на половину. Потому что данные два вопроса являются в 50% случаев самой содержательной частью телефонной беседы.</p>
<p>Новый шаг к сближению людей или наоборот, к отдалению? Трудно сказать. С одной стороны, вся твоя деятельность открыта для тех, кому лично ты интересен. С другой стороны, вместо диалога — монолог, вместо личной встречи — твиттер-лента с явным сигналом &#8220;отцепитесь от меня, видите, я занят&#8221;, ценность выкладываемой информации — сомнительна. Вот у всех блоги, а ума у населения вроде не прибавилось.</p>
<p>Но я нашел в этом один очень большой плюс: когда ты пишешь, что делаешь, или даже только собираешься делать, то устанавливаешь эдакий контракт, который вынуждает тебя <em>начать</em> делать это. И, может быть, даже закончить потом. Для меня самым сложным является момент начала любого дела, можно сказать &#8220;разгон инициативы&#8221;, после которого инерция сделает свою работу. У кого-то есть для этого бумажные ежедневники и <a href="http://www.abstractspoon.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.abstractspoon.com');" target="_blank">ToDo</a>-списки, у программистов на стадии отладки есть <a href="http://ru.wikipedia.org/wiki/Система_отслеживания_ошибок" onclick="javascript:pageTracker._trackPageview('/outbound/article/ru.wikipedia.org');" target="_blank" rel="nofollow">багтрекеры</a>, а у меня будет <a href="http://twitter.com" onclick="javascript:pageTracker._trackPageview('/outbound/article/twitter.com');" target="_blank">Twitter</a>. </p>
<p>В общем, следите за мной на <a href="http://twitter.com/shkuropiy" onclick="javascript:pageTracker._trackPageview('/outbound/article/twitter.com');" target="_blank">twitter.com/shkuropiy</a>.</p>
<img src="http://feeds.feedburner.com/~r/shkuropiy/~4/FyMGqYl73ZE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://shkuropiy.ru/news/twitter-shmitter/feed</wfw:commentRss>
		<feedburner:origLink>http://shkuropiy.ru/news/twitter-shmitter</feedburner:origLink></item>
		<item>
		<title>easyQuizzy 1.5 — получите бесплатно</title>
		<link>http://feedproxy.google.com/~r/shkuropiy/~3/fB_7zp8Abm8/easyquizzy-15-poluchite-besplatno</link>
		<comments>http://shkuropiy.ru/easyquizzy/easyquizzy-15-poluchite-besplatno#comments</comments>
		<pubDate>Tue, 07 Apr 2009 11:33:37 +0000</pubDate>
		<dc:creator>Андрей Шкуропий</dc:creator>
		
		<category><![CDATA[easyQuizzy]]></category>

		<category><![CDATA[crack]]></category>

		<category><![CDATA[keygen]]></category>

		<category><![CDATA[кейген]]></category>

		<category><![CDATA[крак]]></category>

		<category><![CDATA[крэк]]></category>

		<category><![CDATA[кряк]]></category>

		<category><![CDATA[лекарство]]></category>

		<category><![CDATA[лицензия за тест]]></category>

		<category><![CDATA[патч]]></category>

		<category><![CDATA[таблетка]]></category>

		<guid isPermaLink="false">http://shkuropiy.ru/software-development/easyquizzy-15-poluchite-besplatno</guid>
		<description><![CDATA[Как следует из названия, можно получить активационный код к программе бесплатно, и при этом не нужно искать кряк, крак, крэк, crack, патч, patch, кейген, keygen, таблетку (таблэтку), лекарство и другие слова, которые люди обычно вводят в поисковиках после названия программы easyQuizzy]]></description>
			<content:encoded><![CDATA[<p>Тяжелой поступью шагает по планете экономический кризис, <em>невидимая рука рынка</em> обчищает карманы честных тружеников, радоваться нечему. Поскольку было уже много жалоб пользователей на то, что цена нашей программы <a href="http://easyquizzy.ru/" onclick="javascript:pageTracker._trackPageview('/outbound/article/easyquizzy.ru');" target="_blank">easyQuizzy</a> слишком высокая для рядового преподавателя, мы решили на время кризиса провести акцию &quot;<a href="http://easyquizzy.ru/help/payment/#11" onclick="javascript:pageTracker._trackPageview('/outbound/article/easyquizzy.ru');" target="_blank">Лицензия за тест</a>&quot;.</p>
<p>Как следует из названия, можно получить активационный код к программе бесплатно, и при этом не нужно искать кряк, крак, крэк, crack, патч, patch, кейген, keygen, таблетку (таблэтку), лекарство и другие слова, которые люди обычно вводят в поисковиках после названия программы easyQuizzy. Если кто не понял, в предыдущем предложении я провел хитрейшую манипуляцию ключевыми словами, чтобы люди, которые ищут бесплатный ключ, приходили сюда, к разработчикам, а не на сайт к какому-нибудь проходимцу, который запросто насует им троянов.</p>
<p>Пришлите нам всего один тест на любую тему, который <a href="http://easyquizzy.ru/help/payment/#12" onclick="javascript:pageTracker._trackPageview('/outbound/article/easyquizzy.ru');" target="_blank">соответствует не особо строгим требованиям</a>, и вы получите самый настоящий лицензионный ключ и мы внесем вас в нашу базу данных зарегистрированных пользователей.</p>
<p>Кстати, в easyQuizzy версии 1.5 мы ввели удобную функцию построения полного отчета по тестированию и созданию печатного протокола. Также теперь программа может импортировать тесты из популярного (по крайней мере, в нашем регионе) пакета программ Test-W от издательства &quot;Аспект&quot;. Если это название вам знакомо, то у вас, скорее всего, есть огромное количество уже разработанных тестов, которые сконвертируются в формат easyQuizzy за 1 секунду.</p>
<p>Ударим же по кризису нашим любимым антикризисным средством — <a href="http://ru.wikipedia.org/wiki/Договор_мены" onclick="javascript:pageTracker._trackPageview('/outbound/article/ru.wikipedia.org');" target="_blank">бартером</a>.</p>
<img src="http://feeds.feedburner.com/~r/shkuropiy/~4/fB_7zp8Abm8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://shkuropiy.ru/easyquizzy/easyquizzy-15-poluchite-besplatno/feed</wfw:commentRss>
		<feedburner:origLink>http://shkuropiy.ru/easyquizzy/easyquizzy-15-poluchite-besplatno</feedburner:origLink></item>
		<item>
		<title>Введите символы на картинке</title>
		<link>http://feedproxy.google.com/~r/shkuropiy/~3/3xFuat0-Gz0/vvedite-simvoly-na-kartinke</link>
		<comments>http://shkuropiy.ru/usability/vvedite-simvoly-na-kartinke#comments</comments>
		<pubDate>Thu, 19 Mar 2009 11:33:45 +0000</pubDate>
		<dc:creator>Андрей Шкуропий</dc:creator>
		
		<category><![CDATA[Юзабилити]]></category>

		<category><![CDATA[captcha]]></category>

		<category><![CDATA[rapidshare]]></category>

		<category><![CDATA[бот]]></category>

		<category><![CDATA[веб-сервис]]></category>

		<category><![CDATA[кот]]></category>

		<category><![CDATA[спам]]></category>

		<category><![CDATA[тест]]></category>

		<guid isPermaLink="false">http://shkuropiy.ru/usability/vvedite-simvoly-na-kartinke</guid>
		<description><![CDATA[Теперь у меня есть правило: если я не могу при регистрации пройти CAPTCHA за 3 попытки, то я иду искать другой аналогичный веб-сервис, благо сейчас их очень большой выбор. Да здравствует конкуренция!]]></description>
			<content:encoded><![CDATA[<p>С каждым днем разработчики веб-сервисов придумывают все более изощренные методы борьбы со спам-роботами и конкурентами, перекачивающими содержимое с одного веб-портала на другой. Любимое средство защиты &#8212; <a href="http://ru.wikipedia.org/wiki/CAPTCHA" onclick="javascript:pageTracker._trackPageview('/outbound/article/ru.wikipedia.org');" target="_blank" rel="nofollow">CAPTCHA</a>-тест с картинкой, конечно же. </p>
<p><img alt="captcha" src="http://static.flickr.com/3452/3366889865_3653eb21eb.jpg" border="0" /></p>
<p>Авторы спам-роботов не дремлют и создают целые <a href="http://DeCaptcher.com" onclick="javascript:pageTracker._trackPageview('/outbound/article/DeCaptcher.com');" target="_blank" rel="nofollow">веб-службы</a> для автоматического распознавания тестов (в том числе и с помощью обычных индусов, а не только каких-то продвинутых <a href="http://www.scorcher.ru/neuro/science/neurocomp/mem52.htm" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.scorcher.ru');" target="_blank" rel="nofollow">нейронных сетей</a>), идет нешуточная борьба интеллектов разработчиков CAPTCHA против разработчиков ботов.</p>
<p>И вот, в последние годы я стал замечать, что мне становится все труднее распознать новые модификации этих тестов. В то же время для современных ботов, <a href="http://ocr-research.org.ua/" onclick="javascript:pageTracker._trackPageview('/outbound/article/ocr-research.org.ua');" target="_blank" rel="nofollow">как показала практика</a>, они уже не являются большой проблемой. </p>
<p>Подозреваю, что в какой-то момент у каждого человека может наступить порог отказа от использования веб-сервиса, когда у него слишком долго не получается пройти CAPTCHA-тест. Например, у меня этот порог наступил, когда мне дали ссылку на загрузку файла с известного для любителей халявы сервиса <a href="http://rapidshare.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/rapidshare.com');" target="_blank" rel="nofollow">RapidShare</a>. Я был в таком шоке от их теста, что до сих пор с содроганием вспоминаю ту напряженную работу по раглядыванию котов. </p>
<p><img alt="cats" src="http://static.flickr.com/3624/3367714066_1822da413a.jpg" border="0" /></p>
<p>Где-то после 7-й попытки расшифровать его я плюнул на скачиваемый файл и пошел делать гимнастику для глаз. Особенно обидно было позже узнать, что этот тест был взломан ботами каким-то обходным путем. Т.е. фактически веб-сервис введением этого теста снизил шансы для человека и одновременно повысил их для другой компьютерной программы. </p>
<p>Теперь у меня есть правило: если я не могу при регистрации пройти CAPTCHA за 3 попытки, то я иду искать другой аналогичный веб-сервис, благо сейчас их очень большой выбор. Да здравствует конкуренция!</p>
<p>Если вы разрабатываете веб-сервис, подумайте о том, чтобы определить эту границу, за которой вы начнете из-за CAPTCHA-теста терять пользователей-людей и привлекать роботов.</p>
<img src="http://feeds.feedburner.com/~r/shkuropiy/~4/3xFuat0-Gz0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://shkuropiy.ru/usability/vvedite-simvoly-na-kartinke/feed</wfw:commentRss>
		<feedburner:origLink>http://shkuropiy.ru/usability/vvedite-simvoly-na-kartinke</feedburner:origLink></item>
		<item>
		<title>24/7</title>
		<link>http://feedproxy.google.com/~r/shkuropiy/~3/Ag-g6odAh_A/247</link>
		<comments>http://shkuropiy.ru/thoughts/247#comments</comments>
		<pubDate>Fri, 16 Jan 2009 08:48:15 +0000</pubDate>
		<dc:creator>Андрей Шкуропий</dc:creator>
		
		<category><![CDATA[Мысли вслух]]></category>

		<category><![CDATA[24/7]]></category>

		<category><![CDATA[shareware]]></category>

		<guid isPermaLink="false">http://shkuropiy.ru/thoughts/247</guid>
		<description><![CDATA[Меня уже начало передергивать, когда я ненароком слышу &#34;Мы работаем 24 часа в сутки, 7 дней в неделю&#34;. Не знаю почему, но этот рекламный штамп меня бесит гораздо больше, чем все остальные. Странно, что не додумались продолжить этот идиотизм &#34;Мы работаем 24 часа в сутки, 7 дней в неделю, 4 недели в месяц, 12 месяцев [...]]]></description>
			<content:encoded><![CDATA[<p>Меня уже начало передергивать, когда я ненароком слышу &quot;Мы работаем 24 часа в сутки, 7 дней в неделю&quot;. Не знаю почему, но этот рекламный штамп меня бесит гораздо больше, чем все остальные. Странно, что не додумались продолжить этот идиотизм &quot;Мы работаем 24 часа в сутки, 7 дней в неделю, 4 недели в месяц, 12 месяцев в году, 5 лет в пятилетку&quot;.</p>
<p>Возможно, это поначалу звучало гораздо круче, чем&#160; &quot;Мы работаем круглосуточно&quot;, но сейчас, когда это выражение стали использовать все, кому не лень, оно стало банальностью, которая часто не соответствует действительности.</p>
<p>Особенно глупо этот лозунг выглядит, если применяется к коммерческим веб-сайтам. То, что сайт работает круглосуточно, еще не значит, что компания, которая стоит за этим сайтом, никогда не спит. И было бы странно, если бы сайт компании работал с 8:00 до 17:00, а не 24 часа в сутки. Но не ждите, что заявки, оставленные вами на сайте в 3 часа ночи, будут рассмотрены и обработаны сразу же.</p>
<p>Немного отличается ситуация для дешевого <a href="http://ru.wikipedia.org/wiki/Shareware" onclick="javascript:pageTracker._trackPageview('/outbound/article/ru.wikipedia.org');">shareware</a>, которое продается через онлайн-магазины. Если после перевода денег через электронную платежную систему автоматический кодогенератор сразу же высылает клиенту регистрационную информацию с ключом, то это может считаться круглосуточным сервисом, если вся система работает без проблем. Но если вдруг где-то в цепочке автоматического обслуживания появляется сбой (например, сервер неожиданно упал и кодогенератор стал не доступен), то клиенту все равно придется ждать, пока вы проснетесь, проверите e-mail и придумаете решение проблемы. </p>
<p>Если хотите использовать лозунг 24/7 для своей компании, убедитесь сначала, что не врете своим клиентам и сможете его обеспечить в полном смысле этого слова.</p>
<img src="http://feeds.feedburner.com/~r/shkuropiy/~4/Ag-g6odAh_A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://shkuropiy.ru/thoughts/247/feed</wfw:commentRss>
		<feedburner:origLink>http://shkuropiy.ru/thoughts/247</feedburner:origLink></item>
		<item>
		<title>С новым годом!</title>
		<link>http://feedproxy.google.com/~r/shkuropiy/~3/emV7algOWI0/s-novym-godom</link>
		<comments>http://shkuropiy.ru/news/s-novym-godom#comments</comments>
		<pubDate>Mon, 05 Jan 2009 15:05:42 +0000</pubDate>
		<dc:creator>Андрей Шкуропий</dc:creator>
		
		<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://shkuropiy.ru/news/s-novym-godom</guid>
		<description><![CDATA[Пусть и со значительным опозданием (у меня были уважительные причины &#8212; сгорел компьютер) поздравляю читателей с новым годом. Как мне сообщили, 2009 является годом быка, поэтому пожелаю всем, и мне в том числе, полной сбычи всех мечт.
Есть идея в новом году жестко специализировать данный блог, полностью посвятив его моим коммерческим проектам. Как именно это будет [...]]]></description>
			<content:encoded><![CDATA[<p>Пусть и со значительным опозданием (у меня были уважительные причины &#8212; сгорел компьютер) поздравляю читателей с новым годом. Как мне сообщили, 2009 является годом быка, поэтому пожелаю всем, и мне в том числе, <strong>полной сбычи всех мечт</strong>.</p>
<p>Есть идея в новом году жестко специализировать данный блог, полностью посвятив его моим коммерческим проектам. Как именно это будет выглядеть &#8212; пока непонятно, но что-то определенно пора менять, так как, к моему удивлению, самая читаемая запись на блоге о том, <a href="http://shkuropiy.ru/observations/pro-moshek" >откуда берутся мошки</a>. </p>
<p>С праздником!</p>
<img src="http://feeds.feedburner.com/~r/shkuropiy/~4/emV7algOWI0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://shkuropiy.ru/news/s-novym-godom/feed</wfw:commentRss>
		<feedburner:origLink>http://shkuropiy.ru/news/s-novym-godom</feedburner:origLink></item>
	</channel>
</rss>
