<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/css/style.css"?>
<rss version="2.0">
	<channel>
	<title>Пространство Яна Злобина - Статьи</title>
	<link>http://yan.zlobin.name/</link>
	<description>Пространство Яна Злобина - Статьи</description>
	<language>ru</language>
	<copyright>1998 - 2011, Ян Злобин</copyright>
	<webMaster>yan_zlobin@agniyoga.ru</webMaster>
	<lastBuildDate>Thu, 16 Feb 2012 01:27:00 +1000</lastBuildDate>
	<generator>Yan Zlobin's RSS tools</generator>
	<item>
		<title>Новосибирск - первые впечатления</title>
		<link>http://yan.zlobin.name/103</link>
		<category><![CDATA[Впечатления]]></category>
		<category><![CDATA[Путешествия]]></category>
		<author>Ян Злобин</author>
		<pubDate>Thu, 16 Feb 2012 01:27:00 +1000</pubDate>
		<description><![CDATA[<p>
Прошло уже три месяца как я переехал в Новосибирск.  Позади переживания, поиски жилья и работы.  Моя жизнь в сибирской столице обрела некоторую форму.  Впечатлений и наблюдений за это время поднакопилось, чем и хочу поделиться.
</p>
<h2>До поездки</h2>
<p>
Находясь в Приморье ещё до переезда, я старался побольше узнать о Новосибирске - читал, изучал, рассматривал фотографии, смотрел фильмы.  Первая фотография, что я увидел, была снята с крыши высокого дома в сторону центра города и опубликована на <a href="http://ru.wikipedia.org/wiki/%D0%9D%D0%BE%D0%B2%D0%BE%D1%81%D0%B8%D0%B1%D0%B8%D1%80%D1%81%D0%BA" title="Новосибирск на Википедии">Вики</a>.  Это вид мне напоминает города на побережье - вдали голубая дымка как будто море. Чуть правее центра фотографии виден шар - это четырёхэтажное кафе, где подают неплохой капучино.
</p>
<p>
Похоже, я рассматривал эту фотографию так часто и внимательно, что сам того не подозревая, поселился рядом с домом, откуда она сделана.
</p>
<img src="/blog/images/103_1_.jpg">
<p>
Несколько позже я посмотрел документальный фильм о Новосибирске. Фильм произвёл на меня настолько сильное впечатление, что мне захотелось побывать во всех местах, о которых там рассказывалось: в кафе с видом на часовню-центр России, в оперном театре, в музее паровозов в Академгородке (строго говоря, в этом музее не только паровозы, но и электровозы, и пассажирские вагоны, и другая специальная техника - я бродил там часа три), на набережной Оби, над которой проходит метро-мост и всех других местах, о которых говорилось в этом фильме. Предлагаю его вашему вниманию.  Длительность около 22-х минут.
</p>
<iframe width="612" height="380" src="http://www.youtube.com/embed/iRC-fEm64Sc" frameborder="0" allowfullscreen=""></iframe>

<h2>По приезду</h2>
<p>
Погода в сибирской столице оказалась нетипично тёплая для этого времени года - в середине ноября было -4 с лёгким снежком. Прелесть! Первые холода начались только в середине января 2012-го -33. Холод в сухом климате Сибири переносится легче, чем на всегда влажном побережье Тихого океана, но минус 33 есть минус 33 - моську пощипывает и покалывает. :-)
</p>
<p>
Первое, что я почувствовал после выхода из самолёта - люди.  Они <i>другие</i>. Это трудно описать словами. Одно можно сказать точно - люди здесь более спокойные и доброжелательные. Каждая местность накладывает отпечаток и на людей. Жизнь в портовом городе, например, способствует некоторой неврастении, что я смог заметить только оказавшись в Сибири. А жизнь в Новосибирске, на  мой взгляд - это приятный компромисс между суетой мегаполисов и размеренностью провинциальных городов.
</p>
<p>
Второе - энергия места.  Особенно это чувствуется в центе у часовни. Похоже, что именно эта энергия притягивает сюда людей, хотя не факт, что все её чувствуют.
</p>
<p>
Третье - столичный статус. Это чувствуется по многим, казалось бы, мелочам, которые режут глаз приезжему. Чистенькое и аккуратненькое метро, вежливые продавцы в магазинах (даже кассиршы здороваются, что для меня было непривычно, а новосибирцы считают, что именно так и должно быть, не замечая в этом ничего необычного), широкие проспекты, домофоны с ключами-"таблетками" в подъездах жилых домов (работающие, между прочим), огороженные дворы многоэтажек со шлагбаумами, включающимися дистанционно, горячая и холодная вода круглый год и круглые сутки (я ведь ещё помню времена, когда и холодная-то вода была в Приморье по графику), внятные, хорошо поставленным голосом объявления в транспорте, универсальные магнитные карточки для проезда в метро, троллейбусе и трамвае и многое другое...
</p>
<p>
Оперный театр действительно <a href="/146" title="Это не большой, это - самый большой">огромный</a>, с высоким куполом.  Открыт аж в 1945-м году.  Конечно же, я не мог не сходить на оперу.  Большой зал (а есть ещё и маленький) выдержан в классическом стиле со скульптурами и росписью.
</p>
<img src="/blog/images/103_2_.jpg">

<h2>Работа</h2>
<p>
Изначально при поиске работы я ориентировался на <a href="http://ru.wikipedia.org/wiki/%D0%9D%D0%BE%D0%B2%D0%BE%D1%81%D0%B8%D0%B1%D0%B8%D1%80%D1%81%D0%BA%D0%B8%D0%B9_%D0%90%D0%BA%D0%B0%D0%B4%D0%B5%D0%BC%D0%B3%D0%BE%D1%80%D0%BE%D0%B4%D0%BE%D0%BA" title="Академгородок на Вики">новосибирский Академгородок</a>, но после нескольких собеседований и прогулок по нему почти на целый день, я им пресытился, и меня потянуло обратно в центр.  Академгородок - это такой тихий уголок, можно сказать, среди леса, нашпигованный научными и учебными заведениями, находящийся на некотором удалении от города. Добираться туда каждый день на работу без своего транспорта несколько напряжно, да и сам городок очень похож на Приморье, только на ровном месте и лес уж очень однородный. Короче, я переключился на центр в поисках работы.
</p>
<p>
Надо сказать, что мне пришлось иметь дело с двумя кадровыми агентствами лично. С одним в академгородке, с другим в центре города. Вывод неутешителен - они совершенно неэффективны, хотя, казалось бы, специализируются в сфере IT. К примеру, применяя их советы в точности до наоборот, я сразу же находил общий язык с работодателем, общаясь с ним лично. Или же держа перед глазами моё резюме, мне предлагали работу совершенно другого профиля.
</p>
<p>
Прожив несколько дней в гостинице, я снял квартиру в центре города и, чуть позже, нашёл интересную работу, которая потребовала чуть ли не весь мой разнообразный опыт. Работа оказалась на расстоянии одной станции метро от дома.  Очень удачно.
</p>

<h2>В итоге</h2>
<p>
В итоге можно сказать, что один из самых лояльных городов меня принял и принял хорошо. Не знаю как там будет дальше, но если всё пойдёт как идёт сейчас, я приживусь в этом городе.
</p>]]></description>
	</item>
	<item>
		<title>Сапожник в сапогах</title>
		<link>http://yan.zlobin.name/81</link>
		<category><![CDATA[Интернет]]></category>
		<category><![CDATA[Разработки]]></category>
		<category><![CDATA[События]]></category>
		<author>Ян Злобин</author>
		<pubDate>Fri, 19 Aug 2011 00:14:00 +1100</pubDate>
		<description><![CDATA[<p>
Итак, свершилось!  Вышел в свет мой новый сайт.  Точнее, новая версия моего старого хомячка.  Очередная реинкарнация, можно сказать.  Что же в нём особенного?  Ну, во-первых, это самый сложный сайт из всех, что мне приходилось создавать.  Во-вторых, этот сайт потребовал больше всего времени и труда для своей реализации - около полугода.  В-третьих, он содержит максимальное количество сложных и продвинутых штучек, что мне только приходилось вкладывать в один сайт.  И, наконец, этот сайт дался мне тяжелее всех на фоне развода, смены работы, подготовки к переезду, нервов, раздумий о смысле жизни и общей сложности работы.  Некоторые вещи я делал впервые, некоторые требовали долгих раздумий и проб до тех пор, пока результат не начинал мне нравиться.  Что же в этом сайте нового?
</p>
<h2>Архитектура</h2>
<p>
Логика и внутренняя организация сайта спроектирована в соответствии с идеями <a href="/71" title="Статья - Разгружаем веб сервер">минимизации серверных ресурсов</a>.  Поскольку времени на проектирование и разработку у меня было много, и никто меня не подгонял, я имел возможность не спеша выбрать наилучшие варианты реализации на каждом этапе.  Дабы результат нравится мне самому.
</p>

<h2>Единая лента и фотоальбом</h2>
<p>
Первое и самое заметное, что добавилось к новому сайту - фотоальбом. Кроме того, фотографии и статьи блога теперь объединены в одну общую ленту, видимую прямо с главной страницы. Это даёт возможность значительно упростить адрес страницы и показывать в ленте сразу всё, не заставляя пользователя переходить по разделам сайта туда-сюда.  Во время обдумывания решения этой задачи, я прошёл через несколько вариантов организации структуры базы данных.  Это было и наследование таблиц с четырьмя уровнями, и их объединение, и разделение на основе правил. Но с четвёртой попытки у меня получилось решение, которое показывает единую ленту разнородных данных без объединений таблиц в виде UNION, без наследований и даже без конструкций JOIN - одним элегантным запросом.
</p>
<p>
Статьи и фотографии теперь <a href="http://yan.zlobin.home/98" title="Статья - Классификация документов на сайтах">помечены метками</a>, а разделы, которые были на старом сайте, убраны. При этом, все старые ссылки на статьи, разделы и ленты RSS сохранены в видел автоматической переадресации на новые.
</p>
<h2>
Да здравствуют веб-службы
</h2><p>
Главное отличие этой работы от всех моих предыдущих является отказ от веб-ориентированной системы администрирования.  То есть, от веб-интерфейса управления сайтом.  Вся система управления сайтом реализована в виде веб-служб и внешних программ-клиентов.  Что это даёт?  Не считая более высокого уровня безопасности, такой подход к управлению даёт удобство привычного оконного интерфейса, скорость работы и полный отрыв от веб-технологий - веб-службы могут работать с любым программным обеспечением на любой платформе.  Кроме этого, такая постановка вопроса даёт ощутимую разгрузку сервера путём переноса части операций на сторону клиента.  Для управления сайтом я написал две клиентских программы: локальную для обычного компьютера на языке си с использованием библиотеки GTK+ и мобильную, для платформы Андроид, которая работает на моём смартфоне.
</p>
<img src="/blog/images/81_1_.jpg" alt="" class="free" />
<p>
Согласитесь, куда удобнее иметь под рукой программу с Word-подобным оконным интерфейсом и управлением стилями шрифта, проверкой орфографии, клавиатурными комбинациями, возможностью одновременного редактирования нескольких статей, чем веб-администратор в браузере.
</p>

<h2>
Полная смена всех платформ
</h2><p>
Не смотря на то, что я уже давно ушел с Windows и всех привязанных к ней программ, этот сайт до сих пор работал на Windows, Active Server Pages и MS SQL Server.  Но руки мои дошли и до него в итоге.  Теперь все компоненты сайта, программной платформы веб-приложений, веб-сервера, СУБД и операционной системы - свободные.  Это даёт непревзойденную гибкость, значительно более высокую надёжность, скорость работы и скромные требования к ресурсам сервера - он тоже не резиновый.
</p>
<img src="/blog/images/81_2_.jpg" alt="" class="free" />

<h2>
Микроблог
</h2><p>
Наряду со ставшим уже привычным блогом, на сайте появился микроблог.  Последняя заметка микроблога показывается в специально выделенной области на всех страницах сайта, а остальные заметки (по сути архив) на отдельной странице. Интересная особенность - программа управления сайтом, запущенная со специальным ключиком не показывает главное окно, а сразу запускает окно создания новой заметки микроблога. А прикрученная к глобальным горячим клавишам среды GNOME, программа с этим ключиком упрощает создание новой заметки до одного нажатия клавиатурной комбинации.
</p>
<img src="/blog/images/81_3_.jpg" alt="" class="free" />

<h2>
Полнотекстовый поиск
</h2><p>
Теперь здесь, как и положено приличному сайту, работает полнотекстовый поиск с морфологией русского языка и подсветкой найденных словоформ.  Поиск работает как по блогу, так и по микроблогу с фотоальбомом.
</p><h2>
Система антиспама в комментариях
</h2><p>
В результате многолетнего слежения за спамом, который оставляют в комментариях к статьям сайта, я выработал ряд простых и эффективных правил для борьбы с ним.  На основе них я написал спам-фильтр, который успешно применяю на текущем сайте с эффективностью более 98%.
</p><h2>
Большое количество RSS-лент
</h2><p>
Теперь на сайте работает шесть основных RSS-лент, плюс по одной на каждую метку, плюс по одной для комментариев на каждую статью или фотографию.
</p><h2>
Мобильная версия сайта
</h2><p>
Стараясь идти в ногу со временем, я сделал ещё и мобильную версию сайта, специально адаптированную для устройств с небольшими экранами, такими как смартфоны.
</p>

<h2>Для истории</h2>
<p>
Ну и вид старого сайта, дизайн которого был любезно создан Борисом Хершбергом около шести лет тому назад:
</p>
<img src="/blog/images/81_4_.jpg" alt="" />]]></description>
	</item>
	<item>
		<title>Классификация документов на сайтах</title>
		<link>http://yan.zlobin.name/98</link>
		<category><![CDATA[Интернет]]></category>
		<category><![CDATA[Размышления]]></category>
		<category><![CDATA[Разработки]]></category>
		<author>Ян Злобин</author>
		<pubDate>Thu, 18 Aug 2011 01:19:00 +1100</pubDate>
		<description><![CDATA[<p>
Существует несколько систем классификации документов на сайтах. Поскольку при создании сайтов об этом так или иначе приходится задумываться, попробуем оценить их смысл и востребованность.  Итак, какие же системы существуют?
</p>
<p>
Во-первых, разделы. Они подобны книжным полкам, на которых стоят книги разных жанров. Вполне логичная система классификации, когда содержание документов можно чётко классифицировать. Например, электронная библиотека, где книги хорошо делятся на жанры или новостной сайт, где можно явно разделить новости на финансовые, спортивные, научные или какие-нибудь ещё. Эта система классификации имеет отображение и в реальном мире, откуда, собственно, и произошла. Облегчает поиск документов.
</p><p>
Во-вторых, привязки к датам. Неплохо подходит к периодическим изданиям или новостям. Другими словами, к документам, где эти даты важны. Пример - прогноз погоды.  Кому интересен прогноз погоды на вчера? Разве что специалистам в соответствующих областях науки, но никак не простым обывателям. Тоже имеет отражение в реальном мире, хотя и не такой важности. Поиск документов облегчает плохо, если только ищущий не знает заранее даты.
</p><p>
В-третьих, метки. Или теги, как их ещё называют. Как порождение виртуального мира является самой гибкой системой классификации поскольку допускает привязку к одному документу нескольких меток одновременно. Отражение в реальном мире чисто теоретически возможно, но автору неизвестно. Поиск документов облегчает чрезвычайно. Лучше меток облегчают поиск, наверное, только непосредственный поиск по сайту.
</p>
<h2>Применение</h2>
<p>
Оценим же нужность этих систем на примере блога.
</p><p>
Даты нужны. Хотя бы для того, чтобы можно было определить возраст документа. Но выставлять эти даты напоказ с приоритетом, а ещё и делать что-то вроде архива, на них основанного, на мой взгляд, излишне.  Во всяком случае, я бы никогда не стал искать статью по дате, особенно если в блоге их много.
</p><p>
Разделы не дают нужной гибкости, особенно для статей, которые затрагивают несколько тем.  Эта система вынуждает выбрать только один раздел, что не всегда возможно. Считаю, что разделы для блога не нужны, даже одновременно с чем-то ещё.
</p><p>
Метки дают и гибкость, и удобство поиска, и наглядность. Поэтому метки нужны и полезны.
</p>
<h2>Итоги</h2>
<p>
Тут, как говорится, можно поспорить, но я для своего сайта выбрал именно то, что описал.
</p>]]></description>
	</item>
	<item>
		<title>Разгружаем веб сервер</title>
		<link>http://yan.zlobin.name/71</link>
		<category><![CDATA[Интернет]]></category>
		<category><![CDATA[Разработки]]></category>
		<author>Ян Злобин</author>
		<pubDate>Mon, 15 Aug 2011 15:08:00 +1100</pubDate>
		<description><![CDATA[<p>
Доступность технологий веб-программирования и мощность современных компьютеров соблазняют многих веб-программистов использовать их бездумно и неэффективно.  Такая легкомысленность почти всегда приводит к ненужному расточительству ресурсов сервера и медленной загрузке страниц в браузере пользователя.  Но если подойти к созданию веб-приложений обдуманно, но можно в сотни, а в зависимости от посещаемости и в тысячи раз снизить нагрузку на сервер, исключить многократные обращения к жёсткому диску сервера и значительному уменьшению количества объектов, загружаемых браузером пользователя.
</p>
<p>
Давайте разберёмся, что именно мы можем сделать для разгрузки веб-сервера, ускорению работы сайта в целом и к субъективному повышению удовлетворённости пользователя от общения с сайтом.  Поскольку в качестве примера я выбрал настоящий блог, то оптимизировать мы будем непосредственно общедоступный сайт, ведь редактирование такого блога процесс редкий и некоторым утяжелением процедуры администрирования сайта можно поступиться.  Это означает, что местами такая оптимизация будет производиться за счёт системы управления сайтом и некоторой избыточности.  Все меры для достижения нужного результата можно разделить на три группы:
</p>
<ul>
<li>Изменение архитектуры программного кода веб-приложения</li>
<li>Оптимизация структуры базы данных</li>
<li>Исключение программного кода как такового, где это возможно.</li>
</ul>
<p>
Первое, что мы должны сделать — это уменьшить количество ненужных обработок данных, особенно повторяющихся.
</p>
<h2>
Отказ от динамического форматирования текста
</h2>
<p>
Блог содержит большое количество форматированного текста.  Все элементы форматирования, если они обрабатываются сразу после чтения текста из базы данных, повторяются помногу раз.  Это бессмысленная трата ресурсов.  Будет более правильным хранить тексты в базе данных уже отформатированными, то есть, в виде фрагмента HTML-файла.  В таком случае форматирование текста будет производиться во время его сохранения с помощью программы администрирования сайтом.
</p>
<h2>
Выделение афиши в отдельное поле
</h2>
<p>
Страницы сайта, отображающие списки статей, кроме заголовка, обычно показывают и небольшой фрагмент текста каждой статьи.  Если текст хранится одним куском, то во время чтения текста из базы данных из него выкусывается фрагмент и только потом показывается.  Делается это с помощью какого-нибудь программного когда, при чём, многократно по количеству статей на странице.  Такое выкусывание является расточительной и бессмысленно повторяющейся операцией.  Исключить это безобразие можно если хранить уже выкусанный предварительно форматированный фрагмент (афишу) отдельно и считывать целиком.
</p>
<h2>
Одна страница — один запрос
</h2>
<p>
Поскольку самое узкое место веб-приложения в большинстве случаев — обработка запросов к базе данных, необходимо уменьшить количество запросов.  В идеале до одного запроса на страницу.  Каким образом?  Кешированием и некоторой перестройкой базы данных.
</p>
<h2>
Кеширование редко изменяемых данных
</h2>
<p>
На моём сайте, как и в большинстве блогов, кроме основных данных показывается список меток или тегов, как они кое где называются.  Этот список обновляется довольно редко и было бы, как минимум, странным читать его из базы данных каждый раз, когда браузер пользователя запрашивает страницу с сервера.  Решается это методом кеширования списка меток на уровне приложения.  То есть, читается список из базы данных только один раз и показывается всем пользователям.  Перечитывается список меток только в случае его изменения, например, при добавлении автором блога новой метки.  Соответственно, необходимо предусмотреть какой-то механизм, который будет обновлять список в кеше в случае его изменения.  На примере моего сайта кеш обрабатывается специальным классом, который имеет все необходимые функции для управления кешем.  Таким же образом следует поступать и со всеми другими редко изменяемыми данными.
</p>
<h2>
Отказ от сложных запросов
</h2>
<p>
Очевидно, что для ускорения обработки запросов к базе данных необходимо отказаться от сложных запросов, например, от конструкций типа UNION и JOIN.  Как это сделать?  Например, список статей блога на этом сайте показывает так же и список меток для каждой статьи.  А ведь в базе данных для этого задействованы три таблицы: одна для хранения меток, другая для хранения собственно статей и третья для связи предыдущих двух.  Запрос, отображающий список статей со списком меток для каждой получается неприлично запутанным и ресурсоёмким для простого чтения списка.  Как же этого избежать?
</p>
<h2>
Кеширование сложных связей в базе данных
</h2>
<p>
Для разрешения создавшейся ситуации мы добавляем в таблицу, хранящую статьи, поле, содержащее в себе массив из пользовательского типа, хранящего имя метки и её идентификатор.  Таким образом, наш заумный запрос с несколькими JOIN-ами превращается в простой SELECT к одной таблице, хранящей непосредственно статьи.  А заполнением этого поля пусть займутся триггеры, срабатывающие на все три типа операций изменения данных.  Мы получаем простой запрос на чтение, экономящий ресурсы и более сложную обработку данных при администрировании сайта.
</p>
<h2>
Перенос ресурсоёмких операций на сторону клиента
</h2>
<p>
При управлении сайтом с помощью веб-служб (а этот сайт управляется именно так) или при явном разделении сайта с программой администрирования есть смысл по возможности перенести все ресурсоёмкие операции на сторону клиента, разгрузив тем самым сервер.  Такими операциями могут быть, например, программная обработка фотографий или форматирование текстов.
</p>
<h2>
Отказ от динамических RSS-лент
</h2>
<p>
Поскольку список статей в блоге меняется только при изменении самих статей, отображение каналов RSS методом программной обработки данных из базы — совершенно бессмысленное занятие.  Правильнее будет создавать статический XML-файл непосредственно после изменения статей.  Это избавит сервер от очень большого количества ненужной работы, особенно, учитывая, что блоги чаще читают с помощью RSS, чем непосредственно на сайте.
</p>
<h2>Минимизация файлов стилей и отказ от SSI</h2>
<p>
Так же нужно сказать, что чем меньше количество файлов стилей на сайте, тем лучше.  Не смотря на то, что они кешируются браузером, первая загрузка будет дольше да и обработка тоже.  То же самое касается и включаемых на стороне сервера файлов SSI — эти действия совершенно лишние.  Исполняемый файл должен быть предварительно скомпилированным и монолитным, что ускоряет его выполнение и исключает дополнительные считывания файлов на сервере.  Зачем грузить сервер многократными лишними чтениями диска?
</p>

<h2>Итоги</h2>
<p>
Описанные выше меры уменьшают нагрузку на сервер, на котором живёт сайт, в несколько десятков раз.  А при большой посещаемости и в тысячи раз. Ведь оно стоит того, не правда ли?
</p>]]></description>
	</item>
	<item>
		<title>Настройка Saitek Pro Yoke System на FlightGear под FreeBSD</title>
		<link>http://yan.zlobin.name/83</link>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Авиасимуляторы]]></category>
		<author>Ян Злобин</author>
		<pubDate>Tue, 22 Mar 2011 16:00:00 +1000</pubDate>
		<description><![CDATA[<p>
После приобретения <a href="http://www.saitek.com/uk/prod/yoke.html" title="http://www.saitek.com/uk/prod/yoke.html">Saitek Flight Yoke System</a> и попытки задействовать данный девайс на авиасимуляторе <a href="http://www.flightgear.org/" title="http://www.flightgear.org/">FlightGear</a> в своей FreeBSD-системе выяснилось, что штурвал работает только наполовину (вперед и влево). Проблему удалось решить только за несколько дней, о чем, собственно, и статья.
</p>
<img src="/blog/images/83_1_.jpg" class="free" />
<p>
Сначала я грешным делом подумал, что сам штурвал неисправен аппаратно. Это меня малость расстроило, поскольку покупалось на eBay и шло почтой несколько недель. Проверить было легко, подключив к другому симулятору на другом компьютере. Что и было сделано на мелкомягком симуляторе под виндовозом - мир не без добрых людей. На этом шаге я выяснил, что мой штурвал идеально настроен и работает без замечаний. Другими словами, проблема в моем компьютере.
</p><p>
Следующим шагом я проверил что выдает драйвер <a href="http://www.FreeBSD.org/cgi/man.cgi?query=uhid&apropos=0&sektion=0&manpath=FreeBSD+8.2-RELEASE&format=html" title="http://www.FreeBSD.org/cgi/man.cgi?query=uhid&apropos=0&sektion=0&manpath=FreeBSD+8.2-RELEASE&format=html">uhid</a> (что, по-уму надо было сделать в первую очередь). Я подчеркиваю - драйвер uhid из системы FreeBSD, а не <a href="http://www.FreeBSD.org/cgi/url.cgi?ports/sysutils/uhidd/pkg-descr" title="http://www.FreeBSD.org/cgi/url.cgi?ports/sysutils/uhidd/pkg-descr">sysutils/uhidd</a> из портов (его я тоже пробовал, но получил худший результат). Проверял я это так:
</p><pre>
usbhidctl -f /dev/uhid0 -a -l
</pre><p>
Что показало, что драйвер uhid правильно видит все движения элементов управления штурвала и квадранта (это такая отдельная коробочка с тремя рычагами и тремя двух-позиционными переключателями).
</p><p>
Далее, я сравнил эти показания с результатом утилиты js_demo, что идет в комплекте с симулятором и предназначена специально для тестирования джойстиков и других подобных девайсов (строго говоря, мой штурвал понимается симулятором как подвид джойстика). Утилита js_demo выдает все параметры в диапазоне от -1.0 до +1.0. Ровно так же видит все параметры и сам симулятор. То есть, если повернуть штурвал влево, соответствующий параметр станет равным -1.0, а если повернуть вправо, то значение данного параметра будет менять в большую сторону до тех пор, пока не достигнет значения +1.0 в крайне правом положении штурвала. Таким образом, любой параметр, который не попадает в пределы -1.0 - +1.0, обрабатывается неправильно. На этом этапе я, наконец, определил, что дело не в моей операционной системе и не в драйвере USB, а непосредственно в самом симуляторе, что значительно сузило круг поиска решения.
</p><p>
Следующим шагом я стал искать решение на англо- и русскоязычном форумах FlightGear. В результате нашел <a href="http://forum.flightgear.ru/viewtopic.php?f=4&t=152" title="http://forum.flightgear.ru/viewtopic.php?f=4&t=152">описание</a> подобной проблемы (второй пост сверху) от пользователя с ником yurik_nsk. На тот момент это был уже не первый и даже не третий день поисков решения, поэтому у меня уже свербило, и я не стал писать на форум, а связался непосредственно с автором поста Юрием Никифоровым по джабберу. Я застал его в командировке где-то не сервере, но не смотря на это, он мне здорово помог в поиске решения, за что ему спасибо. Проблема оказалась в том, что моя система выдает значение поворота штурвала в диапазоне с двойной точностью (1024 вместо 512), а библиотека plib не может правильно обработать такую ситуацию.
</p><p>
Поскольку проблема сузилась до редактирования исходных кодов библиотеки <a href="http://www.FreeBSD.org/cgi/url.cgi?ports/x11-toolkits/plib/pkg-descr" title="http://www.FreeBSD.org/cgi/url.cgi?ports/x11-toolkits/plib/pkg-descr">x11-toolkits/plib</a>, посредством которой FlightGear получает данные с джойстиков, следующим шагом я занялся подбором правильного значения методом научного тыка. В итоге правильными оказались параметры, которые выдает драйвер uhid посредством <a href="http://www.FreeBSD.org/cgi/man.cgi?query=usbhidctl&apropos=0&sektion=0&manpath=FreeBSD+8.2-RELEASE&arch=default&format=html" title="http://www.FreeBSD.org/cgi/man.cgi?query=usbhidctl&apropos=0&sektion=0&manpath=FreeBSD+8.2-RELEASE&arch=default&format=html">usbhidctl</a> (что и логично).
</p><p>
Пересобирал я исправленную библиотеку уже хорошо проверенным ранее методом. Последовательность пересборки такая:
</p><ul>
<li>Сначала неплохо бы убедиться, что в файле /etc/make.conf есть директива <span>FORCE_PKG_REGISTER=yes</span>, иначе нам будет необходимо вводить эту директиву каждый раз при сборке.</li>

<li>Копируем файл с исходными кодами библиотеки plib-1.8.5.tar.gz из /usr/ports/distfiles/ куда-нибудь в другое место, хотя бы в Desktop.</li>

<li>Разворачиваем ее в одноименную директорию plib-1.8.5 (так по-умолчанию делает Nautilus через контекстное меню).</li>

<li>Вносим необходимые исправления в файлы исходных кодов.</li>

<li>Архивируем директорию с исправленными файлами обратно в архив с тем же именем (опять же, Nautilus делает всё правильно через контекстное меню).</li>

<li>Переносим новый файл plib-1.8.5.tar.gz обратно в /usr/ports/disfiles/, перезаписывая при этом старый файл.</li>

<li>Переходим в директорию библиотеки /usr/ports/x11-toolkits/plib и запускаем сборку командой <span>make NO_CHECKSUM=yes install</span>. Второй параметр имеет ключевое значение, потому как без него система определит по контрольной сумме, что файл не тот и загрузит из Сети новый, перезаписав при этом наши изменения. Параметр clean на данном шаге необязателен - временные файлы почистятся на следующем шаге.</li>

<li>После нормального окончания сборки plib переходим в директорию симулятора /usr/ports/games/flightgear и собираем симулятор FlightGear обычным способом - make install clean. Пересборка симулятора необходима, потому что при сборке plib получается статическая библиотека libplibjs.a, которая (как и все статические библиотеки) жестко связывается с программой симулятора в момент её компиляции.</li>

<li>После нормального завершения предыдущего шага мы имеем заново собранными с нашими исправлениями библиотеку и симулятор. Остается только переинициализировать девайс. Если модуль uhid вкомпилирован в ядро (как в ядре GENERIC) - ничего не поделаешь - придется ребутнуться. Если же модуль подгружен вручную или посредством /boot/loader.conf, то нужно сделать четыре шага: физически отключить девайс от USB, выгрузить модуль ядра посредством команды <span>kldunload uhid</span>, загрузить модуль обратно командой <span>kldload uhid</span> и подключить снова девайс в разъем USB.</li>
</ul><p>
После всего вышесказанного мой штурвал заработал как положено. Но! Поскольку я увеличил диапазоны параметров для штурвала, то задел и рукоятки квадранта, диапазон которых вдвое меньше. Еще полночи я пытался выправить эти параметры XML-конфигами, но не получалось никак. Видимо, всё же, это делается не так, решил я и снова полез в исходники. В итоге я внес исправления в исходники еще в одно место и все заработало как и было задумано.
</p>

<h2>Исправления в коде</h2>
<p>Все исправления делаются в одном-единственном файле src/js/jsBSD.cxx. Первое исправление касается непосредственно самого штурвала. Нужно найти строчки:
</p><pre>
max       [ i ] = 255.0f ;
center    [ i ] = 127.0f ;
</pre><p>
У меня в plib версии 1.8.5 это строки с номерами 379 и 380 соответственно. Их надо заменить на:
</p><pre>
max       [ i ] = 1023.0f ;
center    [ i ] = 512.0f ;
</pre><p>
Далее, нужно найти строчку:
</p><pre>
os->cache_axes[i] = (float)d;
</pre><p>
У меня в неисправленном файле эта строка была под номером 490. Заменить её нужно на следующее условие:
</p><pre>
if (i > 1)
{
    os->cache_axes[i] = (float) (d * 4);
}
else
{
    os->cache_axes[i] = (float) d;
}
</pre><p>
Поскольку поворот и горизонтальное перемещение штурвала имеют номера 0 и 1 соответственно, то все элементы управления с номерами больше единицы должны иметь вдвое меньший диапазон. Что в данном месте кода выражается умножением на 4.
</p><p>
Оговорюсь, что всё вышесказанное справедливо для системы FreeBSD 8.1, симулятором FlightGear 2.0.0_3 и plib 1.8.5. Возможно, что с другими системами и версиями нужны будут другие множители, но суть изменений, надеюсь, ясна.
</p>]]></description>
	</item>
	<item>
		<title>Зорро</title>
		<link>http://yan.zlobin.name/72</link>
		<category><![CDATA[Впечатления]]></category>
		<category><![CDATA[Фильмы]]></category>
		<author>Ян Злобин</author>
		<pubDate>Fri, 21 Jan 2011 21:54:00 +1000</pubDate>
		<description><![CDATA[<p>
Откопал на просторах Сети Зорро - фильм 1975-года с Аленом Делоном.  Посмотрел с большим удовольствием, вспомнил как увидел его в первый раз еще в школе лет тридцать назад.  Тогда, школьником, я смотрел его как захватывающее приключение с дуэлями и погонями.  Сейчас же просмотр Зорро вызвал у меня в ностальгию и ощущение ушедшего детства.
</p>
<img src="/blog/images/72_1_.jpg" />
<p>
Таких фильмов сейчас уже не снимают.  Романтическое приключение с красивыми боями без голливудской крови, грязи и пошлости.  Платоническая любовь, в которой показали только один поцелуй (в современном голливудском фильме непременно случился бы скоропостижный секс под лирическую музыку где-нибудь по кустом), а герой без рисования перед публикой и лишних разговоров побеждает своих врагов и идёт дальше своей дорогой.  Но не будем забывать, что это все таки французский фильм - не Голливуд, что придаёт ему какое-то особое очарование.
</p>
<img src="/blog/images/72_2_.jpg" />
<p>
На мой взгляд, это лучший из шестнадцати (как оказалось) фильмов об этом необычном человеке.  Интересно, что у Зорро был реальный прототип, даже не прототип, а реальный человек, история которого описала Исабель Альенде в своей книге <a href="http://lib.aldebaran.ru/author/alende_isabel/alende_isabel_zorro_rozhdenie_legendy/" title="Книга в библиотеке Альдебаран">Зорро. Рождение легенды</a>.  Его действительно звали Диего де ла Вега, и он действительно сражался в маске за угнетённых.
</p>
<p>
Исабель Альенде в своей книге пишет, что это был особенный и яркий человек. Наверное, поэтому режиссёры не устают снимать фильмы про него.  А ведь так мало добрых фильмов, задевающих юношеское воображение настолько, что хочется быть похожим на героев и испытывать захватывающие приключения вместе с ним.  Особенно в наше время, когда торговля возведена в религию.
</p>
<p>
<img src="/blog/images/72_3_.jpg" class="free" />Окончательно добила меня биография самого <a href="http://ru.wikipedia.org/wiki/Делон,_Ален" title="Ален Делон на Википедии">Алена Делона</a>.  Почитав про его жизнь, посмотрев на его фотографии, начиная с юности, заканчивая современными (а ему уже 75 лет, однако), я как-то в очередной раз почувствовал быстротечность времени.  Герой моей юности, который представал в своих фильмах молодым и активным, сейчас уже практически старик. Хотя и продолжает с успехом сниматься. Например, в сериале Фрэнк Рива.
</p>
<p>
Когда можешь оглянуться назад и посмотреть на прожитую насыщенную жизнь человека, которого видел полным сил (пусть даже на экране), это очень впечатляет, и многое хочется переосмыслить.  Начинаешь как-то по-особенному чувствовать отпущенное тебе время.
</p>

<embed src="/blog/music/72_.mp3" loop="false" width="0" height="0" hidden="true" autostart="true" type="audio/x-mpeg" />]]></description>
	</item>
	<item>
		<title>Русский язык при автомонтировании сменных носителей в FreeBSD</title>
		<link>http://yan.zlobin.name/84</link>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Памятки]]></category>
		<author>Ян Злобин</author>
		<pubDate>Fri, 24 Dec 2010 13:30:00 +1000</pubDate>
		<description><![CDATA[<p>
Это статья-напоминание для себя и тех, кому может понадобиться. Мой компьютер работает под управлением FreeBSD с графической средой GNOME. На FreeBSD, как и на других осях, время от времени приходится монтировать флеш-накопители, переносные USB-диски, да и мало ли что еще. Сама процедура настойки автомонтирования описана в HAL FAQ, но я делаю так:
</p>
<ul>
<li>Монтирую виртуальную файловую систему procfs в точку монтирования /proc. В /etc/fstab это выглядит так:</li>
</ul>
<pre>
proc           /proc       procfs  rw  0   0
</pre>
<p>
Как показывает практика, для самой процедуры автомонтирования procfs необязательна, но все же лучше это сделать, ибо могут не работать некоторые функции GNOME.
</p>
<ul>
<li>Добавляю себя в группу operator:</li>
</ul>
<pre>
pw groupmod operator -m {мой_юзер}
</pre>
<p>
После описанных телодвижений автомонтирование работает, хотя на FreeBSD 8.1 и GNOME 2.32.1 оно работает и без этого, как говориться, из коробки. Если мы сейчас вставим флеш-накопитель с файловой системой VFAT и русскими именами файлов, записанными в виндовозе, то нормально прочитать их мы не сможем. Проблема заключается в том, что кодовая страница среды GNOME - UTF-8, а в виндовозе - CP-1251. Лечится разница в кодировках очень просто.
</p><p>
Для файловой системы VFAT в редакторе конфигурации gconf-editor пишем в /system/storage/default_options/vfat значение:
</p>
<pre>
longnames, -u=, large, -D=Windows-1251, -L=ru_RU.UTF-8
</pre>
<p>
Для NTFS в /system/storage/default_options/ntfs пишем:
</p>
<pre>
-m=755,-C=UTF-8
</pre>
<p>
Теперь русские имена файлов на вновь замонтированных носителях будут нормально читаться.
</p>]]></description>
	</item>
	<item>
		<title>Клубничный плагин к браузеру</title>
		<link>http://yan.zlobin.name/85</link>
		<category><![CDATA[Баловство]]></category>
		<category><![CDATA[Интернет]]></category>
		<author>Ян Злобин</author>
		<pubDate>Wed, 19 May 2010 01:21:00 +1100</pubDate>
		<description><![CDATA[<p>
Просматривая список новшеств в новой версии моего любимого <a href="http://projects.gnome.org/epiphany/" title="http://projects.gnome.org/epiphany/">браузера</a>, я обнаружил поддержку технологии <a href="http://ru.wikipedia.org/wiki/Greasemonkey" title="http://ru.wikipedia.org/wiki/Greasemonkey">Greasemonkey</a>, которая позволяет легко создавать расширения на языке Javascript. Это натолкнуло меня на мысль оформить свой клубничный скрипт, о котором я <a href="/91" title="Статья - Любителям клубнички">писал</a> несколько лет назад, в виде плагина к браузеру. О чем, собственно, и статья.
</p><p>
Напомню, что прежний скрипт был оформлен как <a href="http://www.webmascon.com/topics/tools/07a.asp" title="Статья Александра Качанова - Букмарклеты">букмарклет</a>, что означало необходимость создания специальной кнопочки с трудно читаемым кодом скрипта на панели браузера и нажимать ее при посещении сайтов с хитрыми ссылками. Просмотрев свой код, написанный около четырех лет назад, я усовершенствовал его таким образом, чтобы скрипт умел раскодировать особо коварные сочетания символов в хитрых ссылках, которые раньше не мог. Кроме того, я уменьшил его примерно на треть.
</p><p>
Что же получилось в итоге? А в итоге получился плагин, который работает в фоне без всякого участия пользователя и волшебным образом исправляет все хитрые ссылки на прямые сразу же после полной загрузки страницы. Другими словами, открывает юзер клубничный сайт и вуаля! Все ссылки ведут куда надо без всяких телодвижений! Магия, мля.
</p><p>
Если верить Википедии, плагины этого типа работают в Mozilla Firefox как родные. В моем браузере такие плагины устанавливаются путем правого клика на ссылку плагина и выбора в появившемся контекстном меню команды "Установить пользовательский скрипт". После выбора которой, он автоматически загружается, сохраняется в нужное место и уже готов к использованию. Подозреваю, что в Firefox процедура установки не особо сложнее.
</p>
<h2>Приложения</h2>
<p>
<a href="/blog/files/yan.zlobin.name.85.rmredirects.user.js">Установить клубничный плагин</a>
</p>]]></description>
	</item>
	<item>
		<title>Учим Apache Tomcat понимать UTF-8</title>
		<link>http://yan.zlobin.name/86</link>
		<category><![CDATA[Памятки]]></category>
		<category><![CDATA[Разработки]]></category>
		<author>Ян Злобин</author>
		<pubDate>Wed, 17 Mar 2010 10:47:00 +1000</pubDate>
		<description><![CDATA[<p>
Судя по большому количеству запросов в Гугле, многие веб-программисты сталкиваются с проблемой неправильного кодирования данных при попытке использования UTF-8 в <a href="http://tomcat.apache.org/" title="http://tomcat.apache.org/">Apache Tomcat</a>. Суть проблемы такова, что внутренняя кодировка Tomcat умолчанию - ISO-8859-1. То есть, текст, переданный из формы (неважно методом post или get) будет автоматически неявно перекодирован в ISO-8859-1 и окажется нечитаемым. Такая же участь ожидает текст, выводящийся наружу через Writer.
</p><p>
Существует несколько вариантов решения. Первый - прямое преобразование кодировки типа:
</p><pre>
String arg = new String (arg.getBytes ("UTF-8"), "ISO-8859-1")
</pre><p>
Этот способ представляется мне несколько кривым и неизящным. Второй - создание фильтра, который преобразует все запросы в UTF-8. Такой способ мне кажется слишком громоздким.
</p><p>
Самый правильный, на мой взгляд, вариант решения - комплексный. Первое, что надо сделать, это добавить в параметры используемого коннектора Tomcat директиву URIEncoding="UTF-8" в файле server.xml и перезапустить Tomcat. Но одной этой меры недостаточно. Второе, в сервлетах, печатающих текст, необходимо добавить три строки в таком порядке:
</p><pre>
response.setContentType ("text/html; charset=UTF-8");
PrintWriter out = response.getWriter ();
request.setCharacterEncoding ("UTF-8");
</pre><p>
Для ничего не печатающих сервлетов достаточно только последней строчки.
</p><p>
Для правильно принятия текста в JSP и JSPX можно использовать тег fmt из набора JSTL. Здесь нужно добавить в начало файла директиву
</p><pre>
&lt;fmt:requestEncoding value="UTF-8" /&gt;
</pre><p>
Это позволяет принимать данные в нужной кодировке. Для JSP и JSPX, которые не принимают данные, использования тега fmt не требуется. Но этого тоже недостаточно. Тег fmt основывается на кодировке локали браузера клиента, но не все браузеры правильно передают локаль в HTTP-запросе. При невозможности получить локаль от клиента, экземпляр тега берёт данные о кодировке из параметра <span>javax.servlet.jsp.jstl.fmt.request.charset</span>, которая по умолчанию соответствует кодировке системы, где работает Tomcat. Чтобы такого не случилось, нужно явно определить значение данного параметра в дескрипторе развертывания вот так:
</p><pre>
&lt;context-param&gt;
    &lt;param-name&gt;javax.servlet.jsp.jstl.fmt.request.charset&lt;/param-name&gt;
    &lt;param-value&gt;UTF-8&lt;/param-value&gt;
&lt;/context-param&gt;
</pre><p>
Теперь все данные будут попадать в веб-приложение в UTF-8. Но для правильного вывода текста в JSP и JSPX описанных мер недостаточно. Необходимо добавить в JSP первой строкой:
</p><pre>
&lt;%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %&gt;
</pre><p>
А для JSPX сразу после директив jsp:root и jsp:output doctype-root-element добавить такие строки:
</p><pre>
&lt;jsp:directive.page contentType="text/html; charset=UTF-8" /&gt;
&lt;jsp:directive.page pageEncoding="UTF-8" /&gt;
</pre><p>
Вот только теперь все данные в обе стороны будут в кодировке UTF-8.
</p>]]></description>
	</item>
	<item>
		<title>Программа для чтения электронных книг FictionBook</title>
		<link>http://yan.zlobin.name/19</link>
		<category><![CDATA[Разработки]]></category>
		<category><![CDATA[Электронные книги]]></category>
		<author>Ян Злобин</author>
		<pubDate>Mon, 09 Nov 2009 13:32:00 +1000</pubDate>
		<description><![CDATA[<p>Чуть больше года тому назад мое давнишнее увлечение чтением электронных книг привело меня к формату <a href="http://www.fictionbook.org/index.php/FictionBook" title="http://www.fictionbook.org/index.php/FictionBook">FictionBook</a>, о программе для чтения которого и пойдет речь.</p>
<p>
До этого я читал по большей части в PDF и CHM.  Но первый задумывался как формат для печати со всеми вытекающими, а второй делался только для виндовоза.  Хотя, и в других осях читать его можно, но это не наш путь. :-)</p>
<p>
Через какое-то время мне попался на глаза FictionBook, и выбор пал на него - он мне понравился сразу.  Формат изначально задуман для электронных книг и лишен неудобного наследства бумажных книг.  Выбор программ для чтения оказался невелик - большинство только под виндовоз или мне не нравятся.  А поскольку в Гноме на моей любимой FreeBSD читать толком не чем, решил написать свою.</p>
<p>
Средства и инструменты долго выбирать не пришлось - уже давно подсел на <a href="http://www.gtk.org/" title="http://www.gtk.org/">GTK+</a> и <a href="http://projects.gnome.org/anjuta/index.shtml" title="http://projects.gnome.org/anjuta/index.shtml">Анюту</a>.  Для чтения XML-файла с книгой - <a href="http://www.xmlsoft.org/" title="http://www.xmlsoft.org/">libxml2</a> как хорошо проверенную временем и быструю библиотеку.  Для хранения служебной и прочей информации - встраиваемую базу данных sqlite3.  Все эти средства переносимы, стало быть, работают на разных платформах.  С лицензией вопрос тоже не стоял - <a href="http://www.gnu.org/licenses/gpl.html" title="http://www.gnu.org/licenses/gpl.html">GPLv3</a>.</p>
<p>
Определимся с основными задачами, которые программа должна решать:</p>
<ul>
<li>Полная поддержка формата - что, как оказалось, редкость (забегая вперед, скажу, что от поддержки CSS я все же отказался).</li>
<li>Закладки (автоматическое запоминание места, где закрыл книгу, плюс пользовательские закладки).</li>
<li>Навигация (оглавление, ссылки, вложения и история).</li>
<li>Библиотека (уже на 50-ти книгах я начал ловить себя на том, что ищу нужную мне книгу глазами, а когда их будет тысяча?).</li>
<li>Настройка отображения самой книги (формат, за небольшим исключением, не оговаривает способ отображения текста, возлагая эту задачу на программу для чтения).</li>
<li>Кое какие дополнительные функции, о которых пока промолчу.</li>
</ul>
<p>
Кроме того, неплохо было бы реализовать интеграцию с Гномом.  А это зарегистрированный в среде MIME-тип, ассоциация его с программой, предосмотр в <a href="http://live.gnome.org/Nautilus" title="http://live.gnome.org/Nautilus">Наутилусе</a> (другими словами, в папках вместо иконки файла видна обложка книжки) и, конечно же, видимость программы в системном меню.</p>
<p>
Первая версия программы использовала технологию DOM как одну из самых простых.  Суть DOM такова, что в памяти создается структура, полностью соответствующая файлу по иерархии и содержимому.  А дальше эта структура читается программой, и из нее извлекаются данные.  Прочитав пару десятков книг в своей еще не готовой до конца программе, я убедился, что DOM не совсем подходит для решения задачи.  Во-первых, файл парсится минимум в два прохода, а это накладные расходы.  Во-вторых, поскольку структура строится в памяти, расход памяти становится просто неприличным.  В-третьих, ограничения технологии DOM, на которые я наткнулся, не давали реализовать задуманное простым и элегантным способом.  В итоге я решил переписать программу заново с использованием технологии SAX.  Это очень быстрая событийная технология, читающая XML-файл за один проход, использующая минимум памяти, а главное, ниже уровнем, чем DOM (SAX все равно работает внутри DOM, когда в памяти создается структура XML-файла).  Программного кода в итоге получилось значительно больше, но скорость чтения ощутимо возросла.  Плюс к тому, я учел опыт создания и использования первой версии.</p>
<p>
Следующей проблемой оказались иллюстрации - они хранятся в файле в формате base64, а это означает необходимость раскодирования перед отображением в программу.  Когда в файле единственная картинка - это обложка, то никаких проблем не возникает.  Но мне попалась электронная энциклопедия с количеством иллюстраций более пятисот - вот тут пауза при открытии была уже несколько секунд.  Проблема решается очевидно - раскодировать картинки отдельным потоком, а поскольку их, картинок, может быть много, то пулом потоков (потому как многократно создавать и освобождать потоки тоже накладные расходы).</p>
<p>
Исполняемый файл отдельной программы для показа обложек вместо иконок в Гноме получился чуть больше 10 Кб.  Когда я прикрутил его к Гному, на папки с книгами стало приятно смотреть - прямо как в библиотеке. :-)</p>
<p>
В интерфейсе программы я старался следовать философии HIG, то есть простота и понятность интерфейса вкупе с продуманной организацией управляющих элементов.  По совету разработчиков GTK+ я поглядывал на организацию интерфейса таких программ, как Evince и gedit (а на gedit еще и по организации программного кода).  Что мне не нравится в аналогичных программах для чтения - так это большая привязка к формату, чем к интерфейсу.  Этого я решил избежать.  По моему мнению, читатель не должен и понятия иметь о внутренней структуре файла книги, но должен видеть перед собой очевидные и уже привычные из других программ инструменты.</p>
<p>
С самого начала разработки я отдавал себе отчет в том, что без программы-библиотеки мне не обойтись.  Я реализовал ее как отдельное окно в программе плюс возможность запуска библиотеки отдельно от читалки с помощью ключа командной строки.  Посмотрев на организацию интерфейса аналогичных программ, я получил неприятные впечатления.  Во-первых, многошаговые операции с деревом (аля жанр -> автор -> серия -> книга), во-вторых, неочевидная организация интерфейса вообще (включая показ непосредственно книг), в-третьих, отсутствие пользовательских инструментов для управления библиотекой (я не имею в виду разного рода импорты-экспорты и прочие сторонние для библиотеки функции).  Мне гораздо больше импонирует логика таких программ как <a href="http://projects.gnome.org/rhythmbox/screenshots.html" title="http://projects.gnome.org/rhythmbox/screenshots.html">Rhythmbox</a> где можно самому организовать структуру свой библиотеки.</p>
<p>
Поскольку библиотека, да и сама программа в целом является однопользовательской, по моему мнению, логично использовать для хранения встраиваемую базу данных.  Вот тут я открыл для себя sqlite3 - очень быстрая и мощная база данных (тут тебе и реляционные связи, и индексы, и проверки и прочие приятные мелочи, которые скорее ожидаешь увидеть в "тяжелых" СУБД).  А коль скоро я задумал программу как межплатформенную, то решил хранить в sqlite3 вообще все: и пользовательские настройки, и закладки, и служебную информацию библиотеки.  Дабы не плодить излишние сущности типа GConf или виндовозного реестра.</p>
<p>
Хранить сами книги в библиотеке (сиречь, непосредственно в базе данных) я считаю неправильным, ибо задача библиотеки не хранение книг как таковое, а предоставление пользователю информации об имеющихся книгах плюс некоторый сервис.  Таким образом, я решил хранить в базе только служебную информацию о книгах (название, имя автора, обложку и тому подобное), а сами книги в файловой системе.</p>
<p>
Пользовательские настройки программы я решил разделить на общие и относящиеся непосредственно к книге.  Дабы не усложнять настройку и соответствовать принципу <a href="http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_KISS" title="Принцип KISS на Википедии">KISS</a>.</p>
<p>
От полной реализации стандарта я решил отказаться, а именно от реализации стилей CSS.  Во-первых, какая именно из версий CSS должна поддерживаться спецификацией стандарта не оговаривается, во-вторых, верстальщиками книг почти не используется, а, в-третьих, в следующей версии формата стили планируется убрать (я узнал это от авторов формата).</p>
<p>
С таблицами вообще получилось забавно - авторы читалок говорят - зачем нам это реализовывать, если толком нету редакторов, которые их поддерживают, а авторы редакторов, в свою очередь, говорят - зачем нам это делать, если нету читалок, которые умеют читать таблицы.  Замкнутый круг. :-)  Тем не менее, сделать поддержку таблиц в своей программе я считаю необходимым.</p>
<p>
В итоге в настоящее время я занимаюсь доделкой разного рода "рюшечек", читать без которых можно, но неудобно, типа точной прокрутки с начала строки, а не с ее середины, выпадающих меню и тому подобного.  Планирую закончить программу в ближайшее время.</p>]]></description>
	</item>
	<item>
		<title>Бережем здоровье при работе за компьютером</title>
		<link>http://yan.zlobin.name/88</link>
		<category><![CDATA[Здоровье]]></category>
		<author>Ян Злобин</author>
		<pubDate>Thu, 15 Feb 2007 23:37:00 +1000</pubDate>
		<description><![CDATA[<p>
В процессе общения с пользователями компьютеров я не перестаю удивляться их практически полной неосведомленности о правилах безопасности работы за компьютером. Следование таким правилам при работе за компьютером, давно определенным врачами и специалистами по эргономике, позволяет максимально обезопасить пользователя от ухудшения <a href="/87" title="Статья - Зрение можно исправить!">зрения</a>, проблем с <a href="/89" title="Статья - Займитесь вашим позвоночником">позвоночником</a> и значительно уменьшить усталость в конце рабочего дня.
</p><p>
Правила, грубо говоря, сводятся к трем пунктам: качество изображения, расположение монитора и элементов управления и расположение самого пользователя.
</p>
<h2>
Качество изображения
</h2>
<p>
Качество изображения определяется как качеством монитора, так и настроенными параметрами изображения. Монитор должен обеспечивать необходимые параметры изображения, на которых я остановлюсь чуть позже, и соответствовать рекомендуемым стандартам TCO. Подробнее о стандартах TCO можно почитать на соответствующих сайтах. При покупке компьютера не экономьте на мониторе - лучше сэкономьте на какой-нибудь другой части компьютера.
</p><p>
Монитор должен иметь плоский экран. Старайтесь выбрать производителя посолиднее и модель получше.
</p><p>
Оптимальные параметры для мониторов с электронно-лучевой трубкой (CRT) такие:
</p>
<ul>
<li>для экрана с диагональю 15 дюймов лучшим разрешением будет 800х600 точек с частотой обновления не менее 85 Гц</li>
<li>для экрана с диагональю 17 дюймов, соответственно, 1024х768 и 100 Гц</li>
<li>для 19-ти дюймов - 1280х1024 и 120 Гц</li>
</ul>
<p>
Для жидкокристаллических мониторов частота обновления значения не имеет (точнее, ставьте всегда минимальную - 60 Гц). А разрешение лучше всего то, которое рекомендует производитель монитора. На практике рекомендованное разрешение оказывается на порядок выше, чем у мониторов с трубой - 1024х768 на 15-ти дюймовом мониторе, 1280х1024 на 17-ти дюймовом и так далее.
</p><p>
Проверить правильно ли настроена частота монитора просто - нужно, сидя прямо перед монитором, посмотреть чуть выше экрана. Если частота обновления экрана слишком мала, периферийным зрением будет заметно мерцание.
</p><p>
Яркость экрана должна примерно соответствовать окружающему освещению или немного ярче.
</p><h2>
Расположение монитора и элементов управления
</h2><p>
Монитор должен находиться прямо перед глазами строго перпендикулярно взгляду. То есть, недопустимо, чтобы монитор находился сбоку стола так, что вам приходится поворачивать голову, чтобы посмотреть на экран. Расстояние от глаз до экрана должно быть примерно 60 см. Верхняя часть экрана должна быть чуть ниже уровня глаз.
</p><p>
Клавиатура должна находиться прямо перед пользователем параллельно экрану. Нельзя допускать, чтобы клавиатура лежала сбоку.
</p><h2>
Расположение пользователя
</h2><p>
Пользователь должен сидеть с вертикальной спиной. Бедра и предплечья параллельны полу. В идеале, стул должен иметь режим отдыха, когда спинка стула может быть несколько откинута назад.
</p><p>
Стол должен быть такой высоты, чтобы локти на нем лежали свободно.
</p><h2>
Что необходимо исключить
</h2>
<ul>
<li>Блики на экране являются самым вредным явлением на сегодняшний день. Необходимо сориентировать рабочее место относительно источников света. За спиной пользователя не должно быть никаких источников света, включая окна с закрытыми жалюзи (которые не закрывают свет полностью). Особенно вредны блики, попадающие только на один глаз. Увидеть блики легко при выключенном мониторе.</li>
<li>Источник света, бьющий в глаза, имеет эффект ослабленного блика (к примеру, сидя лицом к окну). Необходимо исключить.</li>
<li>Любое напряжение в теле, которое возникает из-за неудобной позы или мебели.</li>
</ul>
<h2>Дополнительные ссылки</h2>
<p>
<a href="http://www.ixbt.com/peripheral/ergonomic.html" title="http://www.ixbt.com/peripheral/ergonomic.html">Эргономика работы за компьютером - субъективные заметки</a>
</p>]]></description>
	</item>
	<item>
		<title>Ностальгия по ATARI</title>
		<link>http://yan.zlobin.name/28</link>
		<category><![CDATA[Личное]]></category>
		<author>Ян Злобин</author>
		<pubDate>Sat, 25 Nov 2006 23:00:00 +1000</pubDate>
		<description><![CDATA[<p>
Запустил <a href="http://www.FreeBSD.org/cgi/url.cgi?ports/emulators/atari800/pkg-descr" title="http://www.FreeBSD.org/cgi/url.cgi?ports/emulators/atari800/pkg-descr">эмулятор ATARI</a>, и нахлынули воспоминания. Очень захотелось поделиться своими чувствами.
</p><p>
Началось все с того, что мой старший брат привез из заграничного рейса <a href="http://ru.wikipedia.org/wiki/Atari_400/800" title="Atari 400/800 на Вики">ATARI 800XL</a>. Это было в феврале 1984-го. Сам компьютер был 1983-го года выпуска.  Это было что-то нереальное - представьте себе в советские времена большую красочную коробку с интересным и загадочным чудом техники внутри. Машина имела такие характеристики: 64 Кб памяти, кассетный цифровой магнитофон в качестве долговременной памяти, разрешение 320х192, 256 цветов.
</p>
<img src="/blog/images/28_3_.jpg" class="free" />
<p>
Первые в моей жизни компьютерные игры были собственноручно введенными с клавиатуры программами из журнала COMPUTE!. Со следующих рейсов брат привез коммерческие игры (Bruce Lee, Bounty Bob Strikes Back, Ghost Chaser, Zorro, шахматы Colossuss Chess и еще несколько), язык Action! и литературу - подробнейшее описание процессора 6502, машинного языка, бейсика и еще кучу всего. Брат в то время своими руками в машинных кодах (что-то типа COPY CON PROGRAM.EXE) написал ассемблер и дизассемблер (не написал на ассемблере, а именно написал ассемблер со всеми причиндалами) - кто представляет что это такое, поймет. Кто сейчас осмелится на подобное?
</p>
<img src="/blog/images/28_7_.jpg" class="free" />
<p>
Позже он написал еще ряд интересных программ, например, игра Жизнь и руссифицировал компьютер. Надо сказать, что это была, мягко говоря, нетривиальная задача для того времени - ведь не было ни шрифтов, ни кодировок, ни каких-либо других удобств как сейчас. По сути он разработал собственную кодировку, используя вторую половину таблицы ASCII для хранения русских символов. Сейчас такой подход кажется естественным, а тогда это было на уровне собственной разработки.
</p>
<p>
Надо сказать, что все мои школьные друзья частенько составляли мне компанию в играх (ATARI 800XL позволял подключить сразу два джойстика) - мы бились по многу часов подряд.
</p>
<img src="/blog/images/28_4_.jpg" />
<p>
Несколько лет спустя, я нашел во Владивостоке игровой клуб, в котором использовались исключительно ATARI, и переписал у них еще несколько игр (Boulder Dash, River Raid, Карате, Ninja и ряд других).
</p><p>
Но больше всего меня захватывало программирование. Бывает, сядешь после школы за компьютер... Бах! Уже утро! Брат тогда потратил кучу времени, обучая меня встроенному диалекту ATARI Basic по привезенным книгам. Конечно же, все они были английские (с этим у меня никогда проблем не было - когда я был совсем маленьким, мой отец рассказывал мне сказки только по-английски). Изучение бэйсика в 14 лет (когда в городе на тот момент был один-единственный персональный компьютер) направило меня в нужное русло и дало мне скачок - с того времени я освоил с десяток других языков.
</p>
<p>
Моя первая более-менее серьезная программа решала квадратные и биквадратные уравнения, которые мы примерно в то время проходили в школе. Причем, решала со всеми положенными промежуточными действиями, что можно было просто переписывать в тетрадь и идти на урок в школу.
</p>
<p>
Так с чего же я начал? Ах да, прочитал на Мембране <a href="http://www.membrana.ru/particle/62" title="Статья - ATARI и её синусоидальная хроника">статью</a> и отзывы ностальгирующих (сейчас эти отзывы что-то не могу найти на Мембране). Скачал и запустил игрушки своей юности, которые не видел уже больше 15-ти лет. Слезы на глазах. Кинул ссылку на эмулятор ATARI в комментарий к статье на Мембране - эффект тот же, что и у меня - люди плачут. Не у одного меня ностальгия.
</p>
<img src="/blog/images/28_6_.jpg" />
<p>
Что же такое ATARI для меня? Это не только первая в жизни написанная программа, первый изученный мною язык программирования, первая программа на заказ и, конечно, игры. Это целый период моей юности, отложивший отпечаток на всю жизнь - до сих пор вспоминаю его с упоением и грустью.
</p>

<h2>Все это время звучала...</h2>
<p>
...оригинальная музыка из игры <a href="http://en.wikipedia.org/wiki/Jet_Set_Willy" title="Jet Set Willy на Вики">Jet Set Willy</a>, которую ни я, ни кто-то другой из моих знакомых не смог пройти до конца (я изрисовал несколько листов формата А2 схемой игры, но это было далеко не все). Фрагмент, конечно. До сих пор удивляюсь, как можно было впихнуть такую длинную музыку в 48К памяти вместе с кодом игры.
</p>

<embed src="/blog/music/28_.wav" loop="true" width="0" height="0" hidden="true" autostart="true" type="audio/x-mpeg" />]]></description>
	</item>
	<item>
		<title>Тестируем браузер для клубнички</title>
		<link>http://yan.zlobin.name/90</link>
		<category><![CDATA[Баловство]]></category>
		<category><![CDATA[Интернет]]></category>
		<author>Ян Злобин</author>
		<pubDate>Sun, 22 Oct 2006 00:21:00 +1100</pubDate>
		<description><![CDATA[<p>
Пару недель назад компания <a href="http://www.heatseek.com/" title="Сайт компании">HeatSeek</a> выдала в мир первый (ну или первый из мне известных) специализированный браузер для просмотра клубничных сайтов. Посмотрим повнимательнее что это за фрукт, с чем его едят и сравним с обычными браузерами.
</p><p>
Во время установки можно выбрать из нескольких вариантов иконку для программы и задать название ярлыка. Таким образом, легко сделать так, чтобы невооруженным глазом клубничный браузер на вашем компьютере был незаметен.
</p><p>
Сразу после установки HeatSeek запрашивает пароль на ограничение доступа к использованию браузера. Далее он предлагает импортировать в свою скрытую базу данных уже имеющиеся фотографии. При этом, есть возможность удалить импортируемые фотографии со старого места.
</p><p>
Что же мы имеем в итоге?
</p>
<h2>Достоинства</h2>
<ul>
<li>Сохранение фотографий и мувиков одним кликом</li>
<li>Автоматическое переименование файлов при сохранении</li>
<li>Полная защита от всплывающих окон</li>
<li>Ограничение доступа к программе и сохраняемым файлам</li>
<li>Управление категориями файлов</li>
<li>Моментальное закрытие окна программы с клавиатуры</li>
<li>Все необходимые средства для просмотра сохраненных файлов</li>
</ul>
<p>
Некоторые достоинства начальники и слишком ревнивые жены могут извращенно понимать как недостатки. :-)
</p>

<h2>Недостатки</h2>
<ul>
<li>Невозможность прикрутить скрипт, о котором я <a href="/91" title="Статья - Любителям клубнички">писал</a></li>
<li>Невозможность просмотра в нескольких окнах одновременно</li>
</ul>

<h2>Выводы</h2>
<p>
По моему мнению, браузер HeatSeek неплохо подходит для платных сайтов, которые легко можно просматривать в одном окне и очень не удобен для сайтов <a href="/91" title="Статья - Любителям клубнички">TGP</a>, которые, как правило, для каждой галереи открывают новое окно.
</p>]]></description>
	</item>
	<item>
		<title>Экспорт статистики из InJoy Firewall 3.0</title>
		<link>http://yan.zlobin.name/97</link>
		<category><![CDATA[InJoy Firewall]]></category>
		<category><![CDATA[Разработки]]></category>
		<author>Ян Злобин</author>
		<pubDate>Wed, 18 Oct 2006 01:01:00 +1100</pubDate>
		<description><![CDATA[<p>
Как я уже <a href="/96" title="Статья - Структура файла статистики в InJoy Firewall">писал</a>, InJoy Firewall 3.0 сохраняет данные о статистике в ASCII-файле, содержащем большое количество данных, и неплохо подходящем для чтения человеком. К сожалению, ASCII-файл плохо подходит для экспорта информации в другие форматы.
</p><p>
Экспорт статистики подразумевает понимание двух моментов: куда мы будем сливать данные и в каком формате. В идеале формат должен быть таким, чтобы переносить данные можно было бы куда угодно.
</p>
<h2>Определяемся с форматом файла</h2>
<p>
Лучшим из известных мне форматов представления данных является XML, который имеет следующие плюсы:
</p>
<ul>
<li>Формат XML позволяет в одном файле представить сколь угодно сложную структуру данных</li>
<li>Почти все (а может и все) современные СУБД понимают формат XML</li>
<li>XML относительно легко воспринимается человеком</li>
<li>XML является самодостаточным форматом в том смысле, что для его чтения и анализа необязательно использовать базу данных</li>
</ul>
<p>
При всех его достоинствах файл формата XML имеет весьма значительный размер, что не может не сказаться при передачи файла по сети. Однако, он хорошо сжимается (мне удалось сжать XML-файл в 17 раз).
</p><p>
В нашем случае мы рассмотрим вариант, когда статистическая информация преобразуется в формат XML с целью дальнейшей заливки в базу данных. В данной статье собственно базу данных я рассматривать не буду (это тема отдельной статьи), а остановлюсь непосредственно на процессе преобразования данных в формат XML и программных средств, которые будут для этого использоваться.
</p>
<h2>Предварительные меры</h2>
<p>
В первую очередь необходимо отметить, что действующий файрвол продолжает работать с исходным ASCII-файлом, регулярно открывая его на запись. Из переписки с разработчиками файрвола я понял, что если открыть файл в тот момент, когда файрвол будет сохранять в него очередную порцию статистики, ничего хорошего не произойдет. Они рекомендуют сначала проверить время последнего изменения файла, после этого скопировать его в другое место и только тогда обрабатывать. Следовательно, программа-обработчик файла непременно должна начинать работу с проверки даты последнего изменения файла.
</p>
<h2>Выбираем среду разработки</h2>
<p>
Я решал задачу по экспорту статистики в своей любимой оси OS/2 Warp, на этом примере и опишу данный процесс. За выбором реализации программы-обработчика дело не стало - самым естественным решением, идеально подходящим для решения нашей задачи в OS/2 Warp, является REXX. REXX, для тех, кто не знает - это язык программирования, командный язык и макроязык в одном флаконе, на котором можно делать практически все, что позволяет операционная система (например, легким движением левой задней ноги напрямую вызывать функции API операционной системы, создавать многопоточные приложения и подключать внешние библиотеки). Не смотря на то, что REXX - язык интерпретируемый, программы на нем летают как пули.
</p><p>
Если InJoy Firewall работает в среде Windows, то самым простым вариантом реализации программы-обработчика будет использование встроенного в систему VBScript, который предоставляет родные для Windows средства доступа к файловой системе. Для UNIX, соответственно sh или аналог.</p>
<h2>Собственно обработка</h2>
<p>
Как я уже <a href="/96" title="Структура файла статистики в InJoy Firewall">говорил</a>, в результате обработки файла статистики в базе данных получается восемь таблиц, каждую из которых необходимо отобразить в XML-файле. Я не буду подробно вдаваться в описание кода программы-обработчика и описание структуры XML-файла, вместо этого я даю готовый <a href="/blog/files/yan.zlobin.name.97.statproc.cmd.txt" title="REXX-скрипт обработки статистики">скрипт</a> на REXX, который все это делает (для запуска изменить расширение на CMD, если кто не знает). Кому интересно, может посмотреть код программы и заглянуть в XML.
</p><p>
На самом деле обозначенный скрипт делает несколько больше, чем просто конвертирование файла статистики файрвола в XML - он обрабатывает сразу два файла статистики двух файрволов (внутреннего и внешнего), предварительно проверив дату последнего обновления обоих файлов, заливает все эти данные в один XML-файл (то есть, уже 16 таблиц), сжимает его в ZIP, отправляет по FTP на сервер, пишет лог, удаляет за собой все временные файлы и делает запись в специальном флаговом файле о дате последней удачно проведенной процедуры. Таким образом достигается непрерывность переноса данных статистики, так как следующая процедура переноса данных будет начинаться с даты, идущей непосредственно за последней удачно прошедшей заливкой. В моем случае ZIP-файл заливается на сервер статистики, где распаковывается, и данные заливаются непосредственно в базу данных.
</p>
<h2>Описание переменных</h2>
<p>
В начале REXX-файла есть выделенная область, в которой задаются переменные. Их необходимо определить до первого запуска программы и создать все нужные директории. Все файлы (включая временные и файл-флаг) программа создает автоматически. Вот краткое описание переменных:
</p>

<div class="quote">
<p>
<b>BufferPath</b> - полный путь к директории временных файлов
</p><p>
<b>LastRunLogFileName</b> - полный путь к файлу, хранящему дату последней удачной процедуры
</p><p>
<b>OutsideLogFileName</b> - имя файла статистики внешнего файрвола (должно совпадать с файлом статистики, определенным правилом файрвола)
</p><p>
<b>InsideLogFileName</b> - то же для внутреннего файрвола
</p><p>
<b>InsideLogProcess</b> - флаг, включающий обработку файла статистики внутреннего файрвола (1 - обрабатывать, 0 - не обрабатывать). Здесь можно отключить обработку второго файла статистики, если файрвол только один.
</p><p>
<b>FirewallIp</b> - IP-адрес хоста файрвола. Одновременно является именем результирующих XML- и ZIP-файлов. Таким образом становиться возможным заливать на сервер статистики одновременно несколько файлов с разных хостов-файрволов. Что в моем случае и происходит. Лучше использовать IP-адрес внутреннего интерфейса.
</p><p>
<b>FtpHost</b> - IP-адрес или имя FTP-сервера статистики
</p><p>
<b>FtpUser</b> - имя пользователя на FTP-сервере
</p><p>
<b>FtpPassword</b> - пароль на FTP-сервере
</p><p>
<b>LogLevel</b> - уровень подробности создаваемого программой лога (1 - подробно, 0 - кратко). Лог выдается на стандартное устройство вывода, то есть, по умолчанию на консоль. Для записи в файл надо использовать символы перенаправления >> {Имя файла}
</p><p>
<b>FirewallPath</b> - путь к корню внешнего файрвола. Путь внутреннего файрвола не регулируется и должен быть таким: "C:&#92;Firewall_Inside". Пробелы в этом пути использовать не рекомендуется.
</p><p>
<b>LogPath</b> - путь к файлам статистики файрвола, начиная от корня файрвола. Имеет смысл оставить значения по умолчанию.
</p>
</div>

<h2>Параметры запуска</h2>
<p>
Первое, что делает программа - это определяет месяц, который требуется обработать (напомню, что файрвол сохраняет новый файл статистики каждый месяц). Делается это на основе записи даты последней удачной процедуры обработки.
</p><p>
Если месяц - текущий, то при запуске без параметров программа определяет время и дату последнего обновления каждого файла статистики. Если дата не сегодняшняя, то файлы обрабатываются немедленно, иначе программа ждет 40 минут, проверяя дату последней записи каждые 10 секунд. Если зафиксировано новое изменение файла, программа ждет еще 10 секунд и обрабатывает файл. Каждый файл в отдельности.
</p><p>
При этом, можно определить и любой другой месяц из командной строки. Месяц определяется по тому же правилу, что и расширение файла статистики файрвола, то есть трехбуквенное сокращение месяца на основе языка системы. Например, statproc May обработает майскую статистику в октябре без ожидания перезаписи файла.
</p>
<h2>Дополнительные утилиты</h2>
<p>
Описанная выше REXX-программа использует в своей работе некоторые утилиты, которые должны находиться в директории C:&#92;OS2&#92;APPS&#92;.
</p><p>
Для правильной работы статистики необходимо запускать файл в начале каждых суток по расписанию согласовано с установленным в параметрах файрвола временем задержки сохранения статистики в файл (параметр Account-Interval в файле firewall/firewall.cnf). Для запуска по расписанию можно, например, использовать <a href="http://hobbes.nmsu.edu/h-viewer.php?dir=/pub/os2/util/schedule&file=cron.zip&backto=%2Fh-search.php%3Fkey%3Dcron%26pushbutton%3DSearch" title="cron на Hobbes">cron</a>.
</p><p>
Для сжатия в ZIP необходима программа <a href="http://hobbes.nmsu.edu/h-viewer.php?dir=/pub/os2/util/archiver&file=pkos2250.exe&backto=%2Fh-search.php%3Fkey%3Dpkzip%26pushbutton%3DSearch" title="pkzip на Hobbes">pkzip</a>. Программа работает именно с PKZIP. Тестировалась с версией 2.50, но будет работать и с любой другой аналогичной.
</p><p>
Для заливки файла по FTP никаких дополнительных утилит не требуется, потому как REXX-программа использует встроенное FTP API системы OS/2 Warp.
</p>
<h2>В заключение</h2>
<p>
Описанная выше моя программа работает около двух лет, обрабатывая каждую ночь статистику нескольких хостов-шлюзов, и сливая ее на один общий сервер статистики. Время работы программы при обработке двух файлов статистики за раз на самом слабом из шлюзов (Pentium 166 при 80-ти мозгобайтах памяти) занимает меньше секунды.
</p>]]></description>
	</item>
	<item>
		<title>Любителям клубнички</title>
		<link>http://yan.zlobin.name/91</link>
		<category><![CDATA[Баловство]]></category>
		<category><![CDATA[Интернет]]></category>
		<author>Ян Злобин</author>
		<pubDate>Thu, 13 Jul 2006 23:00:00 +1100</pubDate>
		<description><![CDATA[<p>
Как показывают мои наблюдения, большинство любителей полюбоваться клубничкой в Сети плохо понимают, что на самом деле представляют собой клубничные сайты, и какая опасность от них исходит. Отсюда и нередкие посещения компьютерных магазинов и сервисов с просьбой вылечить вирус или восстановить работоспособность компьютера. Разумеется, на таких компьютерах невооруженным глазом видны следы клубнички и последствия неосторожного ею любования.
</p><p>
Целью данной статьи является желание изложить результаты своего маленького исследования в данной области и дать ряд рекомендаций по безопасному и бесплатному клубничному серфингу.
</p><p>
Для начала надо понять какие виды клубничных сайтов существуют в Сети. Конечно, количество таких сайтов огромно, но во всем своем разнообразии они поддаются четкой классификации. Следует заметить, что львиная доля сайтов - платные. При этом, большинство из них показывают чуть-чуть клубнички бесплатно, аля замануха. И все. Но это не наш путь, ведь нас интересуют бесплатные сайты с большим количеством клубнички, не так ли? Таких сайтов очень много.
</p><p>
Таким образом, мы будем классифицировать только бесплатные сайты. А точнее, только один из типов бесплатных сайтов. Вся суть в том, что на самом деле бесплатных сайтов почти нет. Возникает резонный вопрос - о чем тогда вообще разговор? Справедливо. При этом, существуют сайты, которые позволяют нам видеть клубничку бесплатно и в большом количестве. Где же собака порылась? :-) Попробуем разобраться.
</p><p>
Существует тип сайтов, называемый TGP (Thumbnail Gallery Posts - Публикации Галерей с Предосмотром). На самом деле не всегда с предосмотром, но ведь нас интересуют именно сайты с предосмотром, не правда ли? Предосмотр выглядит как список небольших фотографий, являющихся ссылками на фото- или видео-галереи и бывает двух видов:
</p>
<ol>
<li>Все фотографии ведут на соответствующие галереи в рамках этого же сайта (хорошо, конечно, но в большинстве случаев так бывает только на платных сайтах).</li>
<li>Все фотографии ведут на галереи на других сайтах, на такие же списки-предосмотры на других сайтах или куда-либо еще с рекламной целью. (Такой подход, как правило, распространен на бесплатных сайтах, стало быть, рассмотрим этот вариант подробнее).</li>
</ol>
<p>
TGP-сайты с галереями второго типа встречаются следующих категорий:
</p>
<ol>
<li>Опасные (их мы рассматривать не будем - зачем нам лишняя головная боль?)</li>
<li>С прямыми ссылками (самые желаемые, но их очень мало), то есть, каждое фото ведет непосредственно на конкретную галерею, соответствующую фотографии предосмотра.</li>
<li>С непрямыми открытыми ссылками (вот таких просто море), то есть, ссылки-фотографии таких сайтов ведут на этот же сайт, но в параметрах, передаваемых в адресной строке, открытым текстом присутствует адрес запрашиваемой галереи. Стало быть, нам остается только отделить нужный адрес гелереи от лишней для нас шелухи. Но вернемся к этому позже.</li>
<li>С непрямыми закрытыми ссылками (таких тоже много, но меньше, чем предыдущих) - то же, что и пункт 3, за тем исключением, что адрес нужной галереи зашифрован HTML-символами. В этом случае нам нужно не только отделить нужный адрес, но и расшифровать его обратно в читаемый вид. К этому мы тоже вернемся позже.</li>
<li>С непрямыми зашифрованными ссылками (таких сайтов, пожалуй, еще меньше) - то же, что и предыдущая категория, только алгоритм шифрования адреса галереи уже более серьезен. На них в этой статье мы останавливаться не будем, скажу только, что почти все ссылки (если кликать на них обычным образом) ведут на TGP-сайты предыдущих двух категорий, то есть, и здесь есть чем поживиться.</li>
</ol>
<p>
Подытожим. Получается, что нам интересны только TGP-сайты с непрямыми ссылками, независимо от того, зашифрованы ссылки в виде HTML-символов или нет. Конечно, можно вручную найти все эти ссылки в коде-источнике вебстраницы и (опять же вручную) подставлять их в адресную строку браузера. Мы даже можем вручную или с помощью какого-нибудь текстового макроса расшифровывать HTML-зашифрованные адреса и подставлять их в адресную строку браузера. Но мы так делать не будем, если весь этот процесс можно автоматизировать.
</p><p>
Автоматизировать будем методом <a href="http://www.webmascon.com/topics/tools/07a.asp" title="Статья Александра Качанова &quote;Букмарклеты&quote;">букмарклетов</a> или закладурок, как их еще называют. Суть метода в объединении двух технологий: букмарки (закладки в браузере) и аплеты (java-программы на стороне клиента, работающие в браузере). Выглядит это так. На панель ссылок в браузере (такая панель есть и в Internet Explorer, и в Mozilla Firefox) помещается кнопка-букмарклет, нажатие на которую превращает все непрямые ссылки в обычные прямые ссылки и убирает HTML-шифрование. То есть, загрузив сайт (надо обязательно дождаться полной загрузки страницы), надо просто клинкуть мышкой по кнопке на панели ссылок браузера и наслаждаться зрелищем.
</p><p>
Осталась одна, так сказать, мелочь - как же определить какие сайты нам нужны? Повторюсь, что нам нужны неопасные сайты (то есть, без вирусов, непонятно куда ведущей рекламы, всплывающих окон и прочего безобразия). Рекомендации следующие:
</p>
<ol>
<li>Если ваш антивирус (а жить без антивируса в Сети нельзя) хоть раз ругнулся на вирус на TGP-сайте или на любом другом сайте, куда ведут ссылки с этого TGP-сайта, то данный сайт уже будет потенциально опасным.</li>
<li>Если TGP-сайт (или сайты куда он ведет) постоянно открывает всплывающие окна (даже если окна выходят при закрытии самого сайта), то это не наш случай.</li>
<li>Если даже после нажатия кнопки на странице закладок ссылки TGP-сайта ведут не на галереи, а на рекламные страницы, платные сайты или на главные страницы других сайтов, то про этот TGP-сайт нужно забыть.</li>
<li>Необходимо отличать фотографии-ссылки, ведущие на галереи, от баннеров и прочей шелухи. Это несложно.</li>
</ol>
<p>
И самое главное - вот как использовать описанную выше технологию. Надо создать на панели ссылок кнопку (ярлык интернета) и вписать вместо адреса вот этот <a href="/blog/files/yan.zlobin.name.91.removeredirects.js" title="Javascript">скрипт</a>. Можете назвать его, например, "Убрать редиректы" или что-то в этом роде. Теперь после открытия клубничного сайта просто нажмите на эту кнопку на панели закладок и все ссылки на галереи станут прямыми - можете смело кликать, и вы попадете непосредственно на нужную галерею.
</p>
<h2>Читайте так же</h2>
<p>
Статью <a href="/85">Клубничный плагин к браузеру</a> о плагине, который делает то же самое, только лучше и проще.
</p>]]></description>
	</item>
	<item>
		<title>Структура файла статистики в InJoy Firewall</title>
		<link>http://yan.zlobin.name/96</link>
		<category><![CDATA[InJoy Firewall]]></category>
		<category><![CDATA[Разработки]]></category>
		<author>Ян Злобин</author>
		<pubDate>Sat, 25 Feb 2006 20:15:00 +1000</pubDate>
		<description><![CDATA[<p>
В продолжение предыдущей <a href="/95" title="Подсчет трафика в InJoy Firewall 3.0">статьи</a> разберем структуру ASCII-файла статистики InJoy Firewall, что необходимо для дальнейшей обработки статистики.
</p><p>
Как я уже писал, каждый месяц файрвол создает новый файл с расширением, соответствующим трехбуквенному сокращению текущего месяца, основываясь на языке системы. Разберем файл статистики за декабрь 2003 года. Файл начинается с записи, указывающей расчетный период:
</p>
<pre>[Firewall accounting log - Period: Dec, 2003]</pre>
<p>
Вторая строка файла указывает время и дату последней записи в файл:
</p>
<pre>[Last revised 03.01.2004 - 03:19:47]</pre>
<p>
Далее, файл разбит на несколько блоков, количество которых соответствует количеству дней в месяце. Каждый блок начинается строкой вида:
</p>
<pre>[DATE: 01.12.2003]</pre>
<p>
Далее, после пустой строки в табличной форме построчно приводится количество трафика в обе стороны для каждого IP-адреса внутри сети (на самом деле IP-адреса, которые попадают в файл статистики зависят от параметров управляющего ими правила файрвола) для каждого часа текущих суток. Каждая строка завершается итоговой суммой трафика для IP-адреса текущей строки. В конце каждого блока находится специальная итоговая строка, в которой указаны итоговые суммы каждого часа для всех IP-адресов. В конце итоговой строки, в последней ячейке, приводится общая сумма трафика, прошедшего через интерфейс файрвола за текущие сутки.
</p><p>
Необходимо указать, что в каждый блок суточной статистики попадает информация только о тех IP-адресах, которые были активны в данные сутки. Таким образом, возможна ситуация когда определенные IP-адреса будут встречаться не в каждом суточном блоке файла статистики.
</p><p>
В конце файла статистики записывается еще один блок - итоговый, куда попадает информация обо всех IP-адресах, которые хоть раз встречались в файле. Начинается блок строкой вида:
</p>
<pre>[MONTHLY TOTAL]</pre>
<p>
В этом блоке хранятся результирующие суммы о каждом часе месяца, каждом IP-адресе за месяц и общая сумма трафика, пропущенного через интерфейс файрвола в течение данного месяца.
</p><p>
Для дальнейшей обработки сумм статистики необходимо иметь в виду два важных момента:
</p>
<h2>Соглашения о представлении данных</h2>
<p>
Вся информация о трафике рассчитывается и хранится внутри файрвола в байтах. В файле же статистики суммы отображаются в разных величинах. То есть, если какая-либо сумма превысила килобайт, то данная сумма будет пересчитана в килобайты и будет отображаться в килобайтах. То же самое справедливо для мегабайта и гигабайта. Пересчет происходит, как и положено, по 1024. Исходя из пересчета сумм, мы имеем следующий момент:
</p>
<h2>Округление сумм</h2>
<p>
Поскольку все суммы отображаются и хранятся в файле только в одной единице измерения каждая, мы неминуемо сталкиваемся с округлением сумм при переводе из одной единицы измерения в другую. При относительно малом трафике (порядка нескольких гигабайт в месяц) погрешность при округлении составляет порядка нескольких килобайт, но при большом трафике (сотни гигабайт в месяц) погрешность будет более значительна. Соответственно, надо отдавать себе отчет о целях, для которых мы собираем статистику трафика. Если перед вами стоит задача подсчета статистики локальной сети размером в несколько десятков машин, то, скорее всего, эти погрешности вы и не заметите, но если вы являетесь провайдером с несколькими тысячами клиентов, вам необходимо использовать другой метод обработки статистики, например, снимать статистику прямо с интерфейса.
</p>
<h2>Итоги</h2>
<p>
Какие же данные мы можем получить из файла статистики? А не так уж мало:
</p>
<ul>
<li>Месячная итоговая статистика для всей сети</li>
<li>Месячная итоговая статистика для каждого компьютера внутри сети</li>
<li>Месячная суммарная почасовая статистика для каждого компьютера внутри сети</li>
<li>Месячная суммарная почасовая статистика для всей сети</li>
<li>Суточная суммарная статистика для каждого компьютера внутри сети</li>
<li>Суточная суммарная статистика для всей сети</li>
<li>Почасовая статистика для каждого компьютера внутри сети</li>
<li>Почасовая статистика для всей сети</li>
</ul>
<p>
После переноса этих цифр в базу данных у меня получилось восемь подробных таблиц, каждая из которых содержит информацию об определенном виде трафика в обе стороны. Самое интересное, что все эти цифры в файле хранятся уже в готовом виде, избавляя нас от необходимости расчетов сумм.
</p>
<p><a href="/97" title="Экспорт статистики из InJoy Firewall 3.0">Продолжение следует</a></p>]]></description>
	</item>
	<item>
		<title>Две компании</title>
		<link>http://yan.zlobin.name/93</link>
		<category><![CDATA[Личное]]></category>
		<category><![CDATA[Размышления]]></category>
		<author>Ян Злобин</author>
		<pubDate>Sat, 25 Feb 2006 13:10:00 +1000</pubDate>
		<description><![CDATA[<p>
Прочитав статью Джоэла Сполски <a href="http://russian.joelonsoftware.com/Articles/TwoStories.html" title="http://russian.joelonsoftware.com/Articles/TwoStories.html">Две истории</a>, мне вспомнились похожие события двухгодичной давности из моей жизни.
</p><p>
Тогда я работал в большой компании <a href="http://www.dsv.ru/" title="http://www.dsv.ru/">Дальсвязь</a> разработчиком и администратором узла интернет, а по вечерам писал программы на заказ. В этом самый момент директор небольшой экспедиторской компании делает мне предложение о переходе на работу к нему с целью разработки системы автоматизации учета движения контейнеров (очень срочная, по его словам, задача). Предложение показалось мне весьма интересным, и я поменял работу.
</p><p>
Посмотрев на новое предприятие изнутри, я довольно быстро ощутил разницу между ним и Дальсвязью. Самое заметное, что сразу бьет в глаза и в точности соответствует тому, о чем говорит Джоэл Сполски - в Дальсвязи каждый занимается своим делом (даже мой непосредственный начальник никогда не лез в мои дела, спрашивая с меня за результат), а здесь, наоборот, нет четкого разделения обязанностей и зон ответственности, а некоторые вообще шагу ступить не могут без одобрения начальства.
</p><p>
Красноречивый пример. Директор считает себя очень знающим человеком в информационных технологиях (хотя по факту все, что он достиг это установка почтового клиента The Bat! с пятой попытки) мог запросто уронить отстроенный сервер, похоронив при этом бухгалтерскую базу данных вместе в резервными копиями. Бухгалтер, конечно, была очень рада.
</p><p>
Дальше - больше. Полгода (!) с момента моего прихода в эту компанию я не мог добиться постановки задачи, которая была нужна "еще вчера". А через два месяца после этого задача была отменена (во всяком случае, для меня) не глядя на то, что я уже сделал. До этого момента меня в компании держало только обещание закончить разработку (поскольку мне уже порядком надоел внутренний бардак), поэтому отказ от задачи был для меня большим облегчением. В тот же день я уволился.
</p><p>
Мораль той басни такова - если вы - разработчик, и вас привлекают интересные задачи, очень тщательно выбирайте место работы. Возможно, я еще расскажу о своем понимании этого дела. Для тех, кому интересен вопрос рекомендую статью того же Джоэла Сполски <a href="http://russian.joelonsoftware.com/Articles/CommandAndConquer.html" title="http://russian.joelonsoftware.com/Articles/CommandAndConquer.html">"Я начальник - ты дурак" и команда клоунов</a>.
</p>]]></description>
	</item>
	<item>
		<title>Управление правилами в InJoy Firewall</title>
		<link>http://yan.zlobin.name/100</link>
		<category><![CDATA[InJoy Firewall]]></category>
		<author>Ян Злобин</author>
		<pubDate>Sat, 18 Feb 2006 04:18:00 +1000</pubDate>
		<description><![CDATA[<p>
Моя предыдущая обзорная <a href="/99" title="Статья - Вкусности управления InJoy Firewall ">статья</a> вызвала некоторый неожиданный для меня резонанс, поэтому я решил более подробно остановиться на особенностях реализации правил в InJoy Firewall 3.0.
</p><p>
InJoy Firewall вместо привычной для других файрволов одной очереди правил, применяемых последовательно сверху вниз, имеет целых пять, работающих с разным приоритетом. Порядок обработки правил такой: Whitelist rules, Blacklist rules, User rules, System rules, Traffic shape.
</p><p>
Кроме этого, в InJoy Firewall существует динамический файрвол, который можно назвать шестой очередью правил. Работает он на основе очереди системных правил (System rules). Суть динамического файрвола заключается в оперативном реагировании на изменения трафика.
</p><p>
Например, какая-то редиска пытается провести сканирование IP-портов вашего шлюза на предмет открытости. Динамический файрвол тут же загоняет его IP-адрес в черный список (Black List), и ваш хост для него вообще исчезает в тумане. Или же другой умник терпеливо долбит какой-то определенный порт, скажем 139 (они это любят). Динамический файрвол после определенного количества попыток опять же загоняет его IP в черный список с тем же результатом. При желании, можно назначить такое правило, которое включает специальную систему наблюдения в случае конкретно оговоренного антиобщественного поведения какого-нибудь IP-адреса.
</p><p>
Разберем несколько типичных практических примеров применения такого гибкого и достаточно необычного механизма обработки правил.
</p>
<h2>Запрет выхода в Интернет для некоторых адресов</h2>
<p>
Допустим, вам требуется разрешить выход в Интернет только для определенных IP-адресов, а всех остальных отправить нюхать цветы.
</p><p>
Для этого требуется создать правило типа NAT в очереди White List для нужных IP-адресов, а в очереди Black List запретить выход для всех других. В таком случае очередь Whitelist rules будет применяться только для разрешенных адресов, а очередь Blacklist rules - только для запрещенных. То же самое справедливо и для частичного открытия портов (например, кого-то надо пускать только за почтой).
</p>
<h2>Разрешение входа из внешней сети (порт мапинг)</h2>
<p>
Бывают случаи, когда необходимо разрешить доступ из сети Интернет к какому-либо внутреннему ресурсу, например, вебсерверу. Для этого требуется создать правило типа Allow в очереди White List, разрешающее доступ к внешнему IP-адресу шлюза (Destination - MyIP) по 80-му порту с двусторонним направлением (Bidirectional). В дополнение к этому нужно включить переадресацию (Redirect) на IP-адрес вебсервера внутри сети. Внешний и внутренний порты могут не совпадать.
</p>
<img src="/blog/images/100_1_.jpg" class="free" />

<h2>Использование расписаний</h2>
<p>
InJoy Firewall позволяет создавать и более сложные конфигурации, например, микширование правил любых очередей с помощью расписаний. Один из вариантов применения расписаний такой - доступ в Интернет необходим определенным IP-адресам только в рабочее время. В вечернее и ночное время может потребоваться другая комбинация правил или некоторые компьютеры должны иметь выход в Интернет круглосуточно и независимо от других действующих правил.
</p>
<h2>Реагирование на адреса посещаемых сайтов</h2>
<p>
Файрвол предоставляет возможность отслеживать URL каждого конкретного сайта, посещенного пользователем изнутри сети. Эту возможность можно использовать для запрета посещения определенных сайтов, отслеживания посещения каких-либо запрещенных сайтов или сохранения полного журнала посещенных пользователями сети сайтов в циклическом файле.
</p>
<h2>Разделение трафика по приоритетам</h2>
<p>
Для некоторых сетей, особенно с большим трафиком, очень важно разделять проходящий через интернет-шлюз трафик по важности. Для этого в InJoy Firewall существует специальная очередь правил, именуемая Traffic shape. Она применяется к проходящему трафику последней. Суть правил Traffic shape в том, чтобы разделить разные виды трафика по группам и определить для них приоритеты. Например, компания активно пользуется электронной почтой, простой которой может нанести финансовый ущерб деятельности компании. В этом случае почтовому трафику назначается наивысший приоритет, что гарантирует бесперебойную работу почты даже в случае перегрузки интернет-канала.
</p>
<h2>Дополнительно</h2>
<p>
Инструмент управления правилами имеет два режима - Simple и Advanced. Они различаются количеством видимых настроек очередей правил и переключаются контекстным меню непосредственно в дереве правил. Все более-менее сложные операции с правилами делаются в режиме Advanced.
</p><p>
Методы управления правилами не зависят от того, локально вы управляете файрволом или удаленно.
</p>]]></description>
	</item>
	<item>
		<title>Роды глазами наблюдателя</title>
		<link>http://yan.zlobin.name/94</link>
		<category><![CDATA[Впечатления]]></category>
		<category><![CDATA[Личное]]></category>
		<category><![CDATA[События]]></category>
		<author>Ян Злобин</author>
		<pubDate>Thu, 09 Feb 2006 13:21:00 +1000</pubDate>
		<description><![CDATA[<p>
Чего ждет женщина, попадая в роддом? Насколько это отличается от того, что она получает? А что чувствует мужчина, присутствуя на родах своей жены? И что вообще за атмосфера царит в нашем роддоме? Это рассказ о фактах и моих впечатлениях, полученных на родах. Основано только на собственном опыте.
</p><p>
Мою жену положили в роддом с признаками приближающихся родов, как оказалось, за полторы недели до родов. Нескончаемые уколы и процедуры. (Может, так и надо?) Отвратительное по качеству и количеству питание. (Вновь поступившим котлеты нельзя. Де не хватает. При этом, половина противня котлет стоит на виду. Домой тащат?) В большинстве своем пофигистический персонал. Грубость. Ну да ладно, это всего лишь ожидание.
</p><p>
Я приехал в роддом при первых схватках и имел возможность наблюдать за процессом от начала до конца.
</p>
<h2>Схватки</h2>
<p>
Для тех, кто не знает, это очень болезненный процесс, длящийся несколько часов (от 2-х до 12-ти). Боль приходит с перерывами, которые все время уменьшаются вплоть до самых родов. Это в среднем, но бывают и другие случаи, когда ощущение схваток проходит как одна непрерывная схватка. Врачи-пофигисты, как оказалось, понятия не имеют, что такое бывает (о чем они вообще имеют понятие?) и не верят своим глазам. (Специалисты мля...) В итоге приходилось по многу раз объяснять, что роды начнутся не через 12 часов, как они предрекают, а максимум через полтора (что тоже оказалось для них сюрпризом). А раскрытие шейки в течение двух часов они, похоже, ни разу не видели (что вообще за публика там работает?)
</p>
<h2>Роды</h2>
<p>
Сами роды в холодном родзале (хорошо хоть пар не шел) прошли относительно быстро. В перерыве между схватками акушерка пыталась мне навялить обезболевающее из-под полы (ну, разумеется, я согласился!). Но когда дело дошло до зашития нескольких ссадин она на редкость похабно (а поработав год в операционной, я видел как аккуратно зашивают специалисты) зашивала огромной иглой безо всякого обезболивания (эти швы непрерывно болят по настоящий момент). Я видел как было больно моей жене и пытался надавить (в том числе за деньги) на эту гребанную акушерку, чтобы она обезболила перед тем, как шить. Но в ответ я услышал только какие-то кривые отмазки (ты какого хрена полчаса назад предлагала мне купить обезболивающее???)
</p>
<h2>Палата</h2>
<p>
После родов нас поместили в отдельную палату (это у них называется сервисная платная палата). Комнатушка 2х2. Отдельный санузел.
</p><p>
Коридор - проходной двор (каждые полчаса крики во все горло типа: "Маааня, тебя к телефооону!!!") Дверь для персонала не существует - вламываются с грохотом без предупреждения (не говоря уже о стуке) чего-то орут и с таким же грохотом уходят. На призывы быть потише ответ был такой: "Да они ничего еще не слышат." (И откуда берутся такие знатоки детского слуха?)
</p><p>
Один раз, как у них там принято, зашел мужик с дрелью и давай сверлить стенку. На слова о том, что в самом разгаре кормление ребенка, ответил, что он, дескать, быстро (шустрик мля!).
</p>
<h2>Вежливость</h2>
<p>
Одна из детских врачей пришла к нам на какой-то осмотр в момент смены пеленок. "Сначала я посмотрю, а потом ты будешь говно салфетками размазывать", - сказала она. (Кто пускает в детское учреждение таких циничных ублюдков???)
</p>
<h2>Процедуры</h2>
<p>
В последний день незадолго до выписки дежурный педиатр сказала, что надо взять кровь у ребенка. Выглядело это так. Ручка трехдневного ребенка сгибается в запястье до упора, а в наружную сторону ладони втыкается игла. Берет эта хренова сестра толстую иглу, втыкает ее под кожу, но в вену не попадает. Шарит иглой под кожей ребенка, но опять ничего не выходит. Ребеночек, естественно, кричит от боли. Тогда она вынимает иглу, и процедура повторяется с тем же успехом. Еще два захода на другой руке. "Ой как трудно найти вены..." И дает попробовать другой сестре. (Ты какого, спрашивается, хрена берешься делать уколы младенцам, если у тебя руки из задницы???)
</p>
<h2>Алчность</h2>
<p>
Если бы вы видели какими душками становятся вчерашние хамы-врачи когда им заплатишь. И в каких хамов с недовольными лицами превращаются вчерашние душки, когда ты перестаешь им платить.
</p>
<h2>Алчность</h2>
<p>
Святослав Рерих называл таких врачей ремесленниками от медицины. Хорошо, что не все они такие, даже в роддоме. А ведь я видел в деле первоклассных специалистов, вежливых и участливых к больным. Уважаю. Побольше бы таких.
</p>]]></description>
	</item>
	<item>
		<title>Вкусности управления InJoy Firewall</title>
		<link>http://yan.zlobin.name/99</link>
		<category><![CDATA[InJoy Firewall]]></category>
		<author>Ян Злобин</author>
		<pubDate>Tue, 10 Jan 2006 02:18:00 +1000</pubDate>
		<description><![CDATA[<p>
Хочу поделиться своим опытом работы с InJoy Firewall 3.0. В данном файрволе заложено куда больше, чем кажется на первый взгляд. Все задачи, которые мне приходилось решать на сервере-шлюзе оказывались решаемы с помощью InJoy Firewall.
</p>
<h2>Несколько очередей правил безопасности</h2>
<p>
InJoy Firewall анонсируется производителем как файрвол нового поколения. Одной из причин такого серьезного заявления, на мой взгляд, является уникальный подход к организации правил безопасности. В обычном файрволе с классическим подходом существует определенный набор правил, которые просматриваются и выполняются сверху вниз. В InJoy Firewall существует несколько очередей правил, которые выполняются с разным приоритетом. InJoy Firewall просматривает сверху вниз сначала очередь правил с наивысшим приоритетом, потом с более низким и так далее. Таким образом, дается дополнительная гибкость в настройке и удобство при большом количестве правил. Порядок просмотра правил такой: Whitelist rules, Blacklist rules, User rules, System rules, Traffic shape.
</p>
<h2>Установка нескольких экземпляров файрвола</h2>
<p>
Как я уже <a href="/95" title="Статья - Подсчет трафика в InJoy Firewall 3.0">писал</a> раньше, драйвер InJoy Firewall жестко привязывается к конкретному интерфейсу. В случае классического использования NAT все просто - указываем при установке внешний интерфейс, перезагружаемся и вуаля - все работает. Но бывают и более сложные ситуации, когда, например, требуется отделить два и более сегмента сети друг от друга или осуществить фильтрацию между подсетями с одновременным выходом в интернет.
</p><p>
Все эти задачи решаются с помощью установки нескольких экземпляров файрвола. Каждый экземпляр привязывается к своему конкретному интерфейсу и осуществляет фильтрацию трафика, проходящего только через этот интерфейс. Процедура установки двух и более экземпляров подробно описана в readme, что живет в корне файрвола - нужно поправить четыре файла: config.sys, protocol.ini, startup.cmd и файл gateway.cnf в папке config каждого экземпляра. Единственным недокументированным нюансом является порядок запуска серверов экземпляров файрвола - запускать нужно в обратном порядке параметру Device-Index, что в файле config/gateway.cnf.
</p><p>
В случае удаленного управления файрволом, нужно помнить, что все его экземпляры по умолчанию настроены на один и тот же порт IP, а это означает, что ни один из них удаленно управляться не будет. Выход прост - надо назначить экземплярам разные порты.
</p>
<h2>Использование удаленных командных файлов</h2>
<p>
В меню File файрвола (хоть удаленного, хоть локального) есть два пункта Execute "script1.cmd" и Execute "script2.cmd", которые запускают на выполнение соответственно командные файлы script1.cmd и script2.cmd, что живут в корневой папке файрвола. Для выполнения этих файлов неважно, удаленно вы подключились к файрволу или локально.
</p><p>
Использовать эти файлы (что очень удобно) можно разными способами, например, для удаленного выключения/перезагрузки компьютера или же обработки статистики. При выключении или перезагрузке неплохо бы сначала корректно погасить файрвол командой sync -kill из комплекта поставки файрвола.
</p>
<h2>Использование системы уведомлений</h2>
<p>
Правила InJoy Firewall 3.0 имеют очень приятную возможность - уведомления (или алерты, проще говоря). Если переключить любую из очередей правил в расширенный режим (Advanced), то мы увидим, что на каждое правило можно назначить уведомление (узел дерева Alert ветки Rule Processing).
</p><p>
Уведомление работает в двух режимах: Audio и Autostart. Первый - в случае удаленно стоящего сервера - не очень интересен, а вот второй можно использовать на полную катушку. Например, у нас в сети имеется почтовый сервер (за неимением можно за несколько минут поставить и настроить бесплатный по умолчанию сервер <a href="http://www.pmoylan.org/pages/os2/Weasel.html" title="Weasel - an e-mail server for OS/2">Weasel</a> на той же машине, что и файрвол). В этом случае по срабатыванию любого нужного правила можно легко настроить файрвол так, чтобы он отправлял соответствующее уведомление администратору по электронной почте.
</p>]]></description>
	</item>
	</channel>
</rss>

