prog
Выбор веб-сервера
Вопрос к уважаемой публике: имеется
Tux —
X15 —
ZeroWait — решение, которое было выбрано. Характеристики устойчивости, защищённости и скорости неизвестны, но с задачей справляется. Два недостатка — почти полная неизвестность (а значит и неизвестная степень безопасности) и очень слабая документированность.
Сколько книг прочёл
Через три дня — 19 сентября. 19 сентября 2003 года я начал вести список книг, которые читаю. За три дня я вряд ли успею ещё
Кстати, для подсчёта количеста прочитанных книг нужна всего одна строчка — нужно просто посчитать количество строк, начинающихся с даты. Я немного побаловался — подсчитал количество этих строк на разных языках, тех, которые были под рукой.
Perl:
print scalar grep {/^\d+\.\d+/} <>Unix Command Line Utils:
grep -E "^[0-9]+\.[0-9]+\."|wc -lPHP:
echo preg_match_all('/^\d+\.\d+\./m', file_get_contents('php://stdin'), $m);Windows NT CMD:
@SET C=0 & FOR /F %%I IN ('findstr "^[0-9][0-9]*\.[0-9][0-9]*\."') DO @SET /A C+=1 @ECHO %C%Windows Script Host (JScript):
for (i = 0; !WScript.StdIn.AtEndOfStream;)
if (/^\d+\.\d+\./.test(WScript.StdIn.ReadLine())) i++ WScript.Echo(i)Microsoft Word Visual Basic:
Sub Макрос1()
Cnt = 0
With ActiveDocument.Content.Find
.Text = "^#^#.^#^#.^#^#^#^#"
.Execute
While .Found
.Execute
Cnt = Cnt + 1
Wend
End With
MsgBox Cnt
End SubБыстродействие ФС
Прочитал статью «FreeBSD vs Linux: быстродействие файловых систем». Самые интересные выводы:
- файловая система freeBSD (UFS и UFS2) куда
медленнее файловых систем Linux (EXT2, EXT3, ReiserFS, XFS, JFS). - EXT2 рано выбрасывать на помойку, если вам хочется добиться максимальной
производительности. Но не забудьте купить UPS. - JFS лучше не ставить. В режиме по умолчанию она обеспечивает
наихудшую производительность, а в её настройках ещё нужно разобраться. - Возможно, следует приглядеться к ReiserFS.
- EXT3/writeback может быть и не быстрее EXT3/ordered.
Удивительно как с такой непроизводительной файловой системой freeBSD удерживает лидирующие позиции на рынке серверов?
Compnews
Полюбовавшись на сайт, я написал письмо всем известному Лебедеву — рассказал ему об идее и реализации. В ту пору я с ним переписывался на почве JUnix. Лебедев, казалось, идею не оценил, но, через некоторое время, у студии Лебедева появился проект «Закладки» — с моей идеей в основе, только проектам было предложено самим регистрироваться как источник информации (об RSS в России тогда слышали только единицы).
Через некоторое время проекты загнулись — и мой, и его брат. Зато, несколько позже, появился «Мой Яндекс». Идея всё та же, только на этот раз, поскольку времена были уже другие, для импорта данных были использованы RSS.
Идея, как известно, ничьей собственностью не является и речь идёт вовсе не о плагиате. Я вот о чём — могу ли я, интересно, считаться одним из отцов проекта «Мой Яндекс»?
Мифы о Java
Читаю статью «Top Reasons Why People Think Java
- Java содержит значительно меньше неожиданностей. Тут нечем удивить.
- Язык Java неоправданно приобрёл славу медленного языка.
- Библиотека Swing умножила дурную славу Java. Она слишком сложна для изучения.
- Java строго типизирован. Компилятор чересчур назойлив в своём стремлении строго следовать типам.
- Для Java не существует хорошего IDE, сравнимого с MS Visual Studio.
- Java — популярный язык. Его широкое использование лишает его элитарности.
- На Java вы не сможете написать драйвер устройства или игру вроде Doom III.
Смысл статьи — рассматриваемые недостатки, либо устарели, либо не являются недостатками — поскольку сложность изучения или отсутствие неожиданностей проблемой не является. Оставлю в стороне всё сказанное в статье. Мне интересно почему не рассматривается проблема с переносимостью. Конечно, Java задуман как переносимый язык. Это (вкупе с декларируемой безопасностью) считается одним из гланых достоинств Java.
Как это всегда бывает — стандарт Java, как идеальный газ — существует только в умах его создаетелей. Мне сейчас ближе всего J2ME — Java для мобильных устройств. Теперь, подержав в руках Siemens S55 и Nokia 6230 я знаю, что мидлеты (программы на J2ME) бывают не переносимыми не только в переделах разных платформ (Siemens и Nokia), но и в пределах разных моделей. Кажется, в Siemens особой проблемы с этим нет, но в Nokia я сплошь и рядом сталкиваюсь с тем, что мидлет работает только на определённой модели.
Правда заключается в том, что на Java можно писать переносимые приложения. Но это не значит, что нужное вам приложение можно написать переносимым. Простой пример — Microreader (мидлет для чтения книг). Прекрасно идёт на моём Siemens S55, поскольку у Siemens есть собственное API для чтения файлов из файловой системы, но не пойдём на моей Nokia 6230, поскольку там нет не только Siemens File API, но и недавно принятого стандарта J2ME File Connect.
В итоге, есть переносимые мидлеты для чтения книг. Книгу приходится упаковывать внутрь — единственный универсальный путь, но это очень неудобно. Для Siemens же существует более удобный, но непереносимый мидлет позволяющий хранить книги отдельно от мидлета.
Другой пример — разрешение экрана в разных моделях разное. Разработчики редко заморачиваются с масштабированием. Не думаю, что в J2ME есть
GmailFS
GmailFS — файловая система (для Linux), позволяющая использовать почтовую службу GMail для хранения файлов. Поддерживаются системные вызовы read, write, open, close, stat, symlink, link, unlink, truncate и rename.
Достоинства очевидны — файлы этой файловой системы будут доступны вам в любое время из любой точки мира, было бы только подключение к интернет. Недостаток один — компания Google, которая является владельцем GMail ничего не знает о GMailFS — это сторонняя разработка. А это чревато тем, что Google может и не понравится такое не целевое использования их системы или они просто планово поменяют
Устранение потерь при кодировании почтовых аттачей в base64
Как известно,
Прошло время, текст в электронных письмах давно уже не только английский, а стандарты кодирования текстовых файлов до сих пор используют только латинские буквы (плюс цифры и некоторые символы, такие как плюс, миную, слеш и так далее). Мне пришло в голову — а что если попробовать кодировать файлы всем полем допустимых символов. Сейчас, когда появились письма
Из всех вариантов кодирования, а их три (Base64, UUencode
Я же задался целью проверить, что же будет, если попробовать передать файл, где поле допустимых символов расширено до максимума. Сразу скажу — эксперимент удался. Можено эксперементально внедрять новый формат кодирования писем. Назовём его Bolk
Я написал небольшую программу на PHP, которая в качестве параметра использует имя файла, который нужно закодировать, а на выход выдаёт этот файл в формате понятном почтовому клиенту. Таким образом, если её запустить как «php -q 8qp.php somegif.gif > somename.eml» и открыть получившийся файл вашим почтовым клиентом, внутри вы должны увидеть свою картинку.
<?php
// Example 1. 8qp.php
// Written by Evgeny Stepanischev aka BOLK
$bound = 'BOLKNOTE.RU';
$mime = getimagesize($argv[1]);
$mime = $mime['mime'];
$str = file_get_contents($argv[1]);
$len = filesize($argv[1]);
echo <<<HEADER
Content-Type: multipart/mixed;
boundary="----{$bound}"
------{$bound}
Content-Type: $mime; name="{$argv[1]}"
Content-Disposition: attachment; filename="{$argv[1]}"
Content-Transfer-Encoding: quoted-printable
HEADER;
$np = array (0, 10, 13, 61);
for ($i = 0; $i<$len; $i++)
{
$code = ord($str{$i});
echo in_array($code, $np) ?
'='.strtoupper(str_pad(dechex($code), 2, '0', STR_PAD_LEFT)):
$str{$i};
}
echo "rn------{$bound}--";Для эксперимента я выбрал наугад две картинки. JPEG и GIF. И вот что получилось в итоге. «TheBAT!» — это наименование моего почтового клиента.
Случайный GIF: исходный размер — 33590, мой
Случайный JPEG: исходный размер — 28144, мой
В случае
Эксперименты на первом же попавшемся Sendmail показали, что,
Последняя беда поставила меня в тупик. Правда, ненадолго. Вспомнив, что большинство клиентов умеют открывать письма в формате EML я решил пойти на хитрость — прикрепить моё письмо как аттачмент другого, замаскировав моё письмо под обычный текст — Sendmail вряд ли проверяет аттачи глубже одного вхождения. А чтобы письмо максимально адекватно воспринималось почтовым клиентом, я дал ему disposition inline и убрал из него все служебные поля. Попробовал отправить — получилось. В TheBat видно только лишнее пустое поле — беда небольшая.
<?php
// Example 2. 8qp_next.php
// Written by Evgeny Stepanischev aka BOLK
$bound = '3D1E1C92aaBF00D';
$bound2 = '3D1E1C92xxBF00D';
$mime = getimagesize($argv[1]);
$mime = $mime['mime'];
$str = file_get_contents($argv[1]);
$len = filesize($argv[1]);
echo <<<HEADER
From: <mailbox@sample.com>
To: mailbox@sample.com
From: mailbox@sample.com
Content-Type: multipart/mixed;
boundary="----------{$bound2}"
------------{$bound2}
Content-Type: message/rfc822; name="1.eml"; charset=utf-8
Content-Disposition: inline; name="1.eml"
Content-Transfer-Encoding: 8bit
Content-Transfer-Encoding: 8bit
Content-Type: multipart/mixed;
boundary="----{$bound}"
------{$bound}
Content-Type: $mime; name="{$argv[1]}"; charset=utf-8
Content-Disposition: attachment; filename="{$argv[1]}"
Content-Transfer-Encoding: quoted-printable
HEADER;
$np = array (0, 10, 13, 61);
for ($i = 0; $i<$len; $i++)
{
$code = ord($str{$i});
echo in_array($code, $np) ?
'='.strtoupper(str_pad(dechex($code), 2, '0', STR_PAD_LEFT)):
$str{$i};
if ($i && ($i % 512) == 0) echo "=rn";
}
echo "rn------{$bound}--",
"rn------------{$bound2}--";Полный размер письма после такой двойной «упаковки» увеличивается незначительно. Кстати говоря, Opera 7.0 с таким письмом не справилась. Возможно, в силу старости — текущая версия этого пакета — 7.61b. Для интереса я отправил письмо на мои ящики на серверах Mail.ru и Gmail.com. Оба сервера вполне достойно справились с задачей, единственно, что Gmail не принимал письмо, пока я не указал charset как
Патч к IMP/Horde
Если при работе с webmail IMP/Horde у вас выдаются ошибки в функции imap_fetchbody, попробуйте применить мой патч. Порядок применения:
- Разместить в папке lib, с названием, например, bolkpatch.php.
- В файлах lib/IMP.php и view.php после блока строк require_once надо ставить строку
require_once IMP_BASE . ’/lib/bolkpatch.php’; - Заменить в этих двух файлах все вызовы imap_fetchbody на imap_fetchbody2.
- Установить модуль PEAR Mail_Mime (pear install Mail_Mime)
// IMP patch. Written by Evgeny Stepanischev
function imap_fetchbody2(&$imap_stream, $msg_number, $part_number, $options = NULL)
{
$params = array(&$imap_stream, &$msg_number, &$part_number);
if ($options !== NULL)
$params[] = &$options;
$str = @call_user_func_array('imap_fetchbody', $params);
if ($str == '' || $str === FALSE)
{
array_splice($params, 2, 1);
$mail = @call_user_func_array('imap_fetchheader', $params).
@call_user_func_array('imap_body', $params);
require_once 'Mail/mimeDecode.php';
$decoder =& new Mail_mimeDecode($mail);
$structure = (array) $decoder->decode(array('include_bodies' => true));
return isset($structure['parts'][$part_number-1]) ?
$structure['parts'][$part_number-1]->body :
$structure['body'];
}
return $str;
}Хардлинки в WinXP
Я очень часто начинаю разрабатывать проект под Windows и заканчиваю — под Linux или freeBSD. Конечно, даже на уровне PHP, между этими группами операционных систем есть существенные различия. Обычно, они легко преодолеваются. В последнем проекте мне более всего не хватало функции link.
Поэкспериментировав с w32api и ffi, я понял, что этот путь — тупиковый. Побродив по поисковикам, я выяснил, что простейший выход — использовать в качестве заглушки утилиту fsutil из Windows XP. У неё есть параметр «hardlink create», позволяющий создавать ссылки.
if (PHP_OS == 'WINNT' && file_exists($_ENV['windir'].'\system32\fsutil.exe'))
{
function link($target, $link)
{
$cmd = $_ENV['windir'].'\system32\fsutil.exe hardlink create';
exec ($cmd.' "'.$link.'" "'.$target, $out, $ret);
return !$ret;
}
}В случае, если вы будете использовать эту функцию в проекте, будьте осторожны — это всего лишь заглушка.
WinAPI и PHP
Так случилось, что в PHP существует три модуля расширения — два для PHP4 и один для PHP5, позволяющих обращаться к Windows API. Способы их вызова различны, плюс ко всему, положение усугубляется тем, что модули расширения имеют одинаковые имена, документация есть только по первому из них, тогда как в комплект PHP включается второй.
Ниже — результат моей потребности выяснить как же это всё работает. Прежде всего стоит заметить, что w32api не работает с mod_php, если старая версия вызывает ошибку при попытке повторного вызова в то же child, то новая вызывает ошибку сразу. В режиме CGI и с PHP5 я таких экспериментов не проводил.
Итак, ниже — реализация функции link (hard link) для Windows NT. Под CLI пример работает как с PHP5, так и с PHP4. Конечно, для того, чтобы пример заработал, нужна файловая система, поддерживающая hard links. Под моей NTFS5 (Windows XP) ссылки ставятся.
// Written by Evgeny Stepanischev (aka BOLK)
if (PHP_OS == 'WINNT') {
// Модуль расширения FFI для PHP5
if (extension_loaded('ffi') || intval(PHP_VERSION) >= 5 && @dl('php_ffi.dll')) {
function link($target, $link) {
$api = & new ffi("[lib='kernel32.dll'] int " . "CreateHardLinkA( char *link, char *target, long *attr);");
return (bool)$api->CreateHardLinkA($link, $target, NULL);
}
} else
// Модуль расширения w32API для PHP4
if (extension_loaded('w32api') || @dl('php_w32api.dll')) {
// Старая версия модуля
if (function_exists('w32api_register_function')) {
if (!function_exists('CreateHardLinkA')) {
@w32api_register_function('kernel32.dll', 'CreateHardLinkA', 'bool');
}
if (function_exists('CreateHardLinkA')) {
function link($target, $link) {
return CreateHardLinkA($link, $target, NULL);
}
}
} else {
// Новая (примерно с версии PHP 4.3.0)
function link($target, $link) {
$api = & new win32;
$api->registerfunction("bool CreateHardLinkA" . "(string &link, string &target) From kernel32.dll");
return $api->CreateHardLinkA($link, $target);
}
}
}
}LANG
«Его пример — другим наука». Господа, если при попытки инсталляции модуля для Perl, вы встретите сообщение вида «Makefile:85: *** missing separator. Stop.», не отчаивайтесь, а посмотрите значение переменной LANG. Её значение должно быть «en_US». Скорее всего у вас там «UTF8», измените его на «en_US» (обычно «export LANG en_US») и попробуйте установить модуль ещё раз.
Что отвалится после SP2
Документ от Microsoft «Programs that may behave differently in Windows XP Service Pack 2» («Программы, которые, возможно, будут работать иначе в Windows XP после установки SP2).
У меня есть подозрение, что всё дело во встроенном в Windows XP firewall, который несколько расширил свои функции в SP2. В списке есть почти все наиболее известные программы для работы с Сетью — firewall, прокси, IM,
Латрас
Один из способов придумать довольно хороший, но запоминаемый пароль — написать пару слов
Чаще всего удобнее (диктуя по телефону, да и просто удобно) сказать пользователю именно русское слово, объяснив, что набирать его нужно в русской раскладке. В связи с этим, хочется придумать этому приёму, раз уж он набрал такую популярность,
Я предлагаю в качестве оного слово «латрас» (латинская раскладка). Т. е. типичная передача пароля будет звучать так: «набирай в латрасе — „расторопша“». Как вам?
Как повалить PHP
Статья «Top 10 ways to crash PHP». Язык — английский, но примеры, которые там приведены, поймёт любой PHP-программист. Кстати, первый из них я приводил на старой версии сайта. Интересно, все ли способы работают в PHP 5.
GIF в GD
Как известно, поддержка GIF была удалена из GD ещё в версии 1.6 в связи с тем, что алгоритм LZW, используемый в GIF оказался патентованным. После истечения срока действия патента, GD снова поддерживает GIF.
Видео в мультфильмы
Статья от Microsoft, A Slice of Time and Space (eng), рассказывающая о технологии, позволяющей переводить видео в мультфильмы. Если не знаете английского, всё равно сходите по ссылке — хотя бы что бы посмотреть картинки или небольшой фильм (14Мб).
У комсомольцев своя правда
Из «Комсомольской правды»:
Программисту важно уметь разрабатывать приложения Microsoft. NET (MCAD) и знать один из языков программирования — С++, C# или Java — базовые знания по ним дают в вузах. Системный администратор должен уметь обслуживать компьютерные сети, а для этого получить сертификат Microsoft по Windows Server 2003.
Студентам-«лирикам» тоже не стоит отчаиваться: есть программы, которые рассчитаны на тех, кто с <компом> не дружит, но очень хочет. Для начала стоит освоить базовый уровень компьютерной грамотности (офисные программы, Интернети Web-технологии) — это довольно просто.
Так мы узнали, что языка программирования всего три, системные администраторы — это те, кто имеют сертификат Microsoft по Windows 2003, а Интернет
Total Eclipse

В прошлый раз я опять вспоминал Spectrum. За мной это водится. Что ж — это был мой первый компьютер, на котором я начал серьёзно и много программировать.
В прошлый раз я упомянул
Созданная атмосфера поддерживалась настолько искусно, что я иногда физически ощущал нехватку воздуха и аритмию.
Сейчас меня удивляет как могла работать игра
Back to Skool
Вспомнился «Спектрум». Для тех, кто не знает — был такой компьютер, который пользовался бешеной популярностью в нашей стране
Тогда я ещё играл в игры, а игры для «Спектрума» делали потрясающие (господа, там, на пищалке, умудрялись делать псевдостерео, а уж

От одной из тех игр у меня остался эффект незавершённого действия (кажется, это называется «гештальт»). Игра была довольно простая
«Языки программирования через сто лет»
Статья «Языки программирования через сто лет» Пола Грэма.
Кощунство — это языки, которые заставляют программистов выполнять ненужную работу. Не расход машинного времени, а пустая трата времени программиста — вот истинная неэффективность. И это будет становиться всё очевиднее по мере повышения скорости работы компьютеров
Именно по этой причине я постепенно перешёл с Ассемблера на PHP и Perl — эти языки не позволяют мне контролировать ресурсы машины, но я куда эффективнее использую своё время. Огромное количество собственных повседневых задач я решаю откровенно сляпанными программами, которые после выполнения задачи тут же исчезают. Их миссия — решить задачу, пусть хоть полным перебором и изчезнуть. В той прошлой жизни, когда я программировал на Ассеблере, я бы взял набор этих программ, приградил, снабдил бы документацией и отправил в плаванье. Тогда самой трудной жизненной задачей представлялось не расстроить родителей своими оценками и злокачественной опухолью на чувстве противоречия. Одним словом, временных ресурсов было предостаточно.
Да что там! Я помню как мы с братом мучались от безделья, думая — что бы нам ещё такого написать. Брали утилиты и переписывали их на Ассемблере, пытаясь сделать меньше, быстрее, функциональнее. Сейчас я больше в языках ценю скорость разрабоки, а не скорость работы.