prog

Регулярные выражения наглядно

RegExp Coach sample (12.55КиБ)

Увидел у Cooler’a ссылку на замечательную программу — The Regex Coach. Есть версия для Linux и Windows. Программа позволяет визуально проверять регулярные выражения — смотреть дерево, замены, совпадения и т. п. Очень рекомендую.

Оставить комментарий

Brainfuck

Как-то очень давно я наткнулся в сети на язык с названием Brainfuck. Его идея, так подходящая к его названию, так меня захватила, что я в своё время создал оптимизирующий компилятор программ Brainfuck в JavaScript, выполненный в виде минишелла и работающий прямо в браузере. Язык интересен тем, что содержит всего восемь конструкций, но позволяет писать программу любой сложности, правда скорость выполнения…

Дело давнее, но около месяца назад, поддавшись какому-то невнятному импульсу, я вернулся к идее оптимизирующего компилятора. Поскольку, в данный момент язык-фаворит для меня PHP, мне захотелось, руководствуясь теми же принципами, написать компилятор Brainfuck в PHP, что я и сделал.

Модуль к PHP написан в формате PEAR, т. е. его можно либо использовать непосредственно, либо исталлировать в составе PEAR.

Нельзя сказать, что я компилятор проводит глубокую оптимизацию, но, например, код «[->+>++<<][>+>[-]<<-][>+<[-]]" будет преобразован в

<?php
$in = array(0, $id = 0);
$d = array_fill(-65535, 65535, $di = 0);

$d[$di+1]+= $d[$di];
$d[$di+2]+= $d[$di]*2;
$d[$di] = 0;

$d[$di+1]+= $d[$di];
if ($d[$di]) $d[$di+2] = 0;
$d[$di] = 0;

$d[$di+1]+= $d[$di];
$d[$di] = 0;

В сам PEAR-репозиторий я его выкладывать не буду — даже по моим меркам это не слишком полезная штука, да и вряд ли за него проголосуют (все модули на PEAR подвергаются процедуре голосования, прежде чем попадут в репозиторий).

Оставить комментарий

Тег для календаря

WebForms-2 (8.91КиБ)

Лично для меня событие недели — появление Opera 9.0 Technology Preview 1. Помимо поддержки XSLT, появления аналога настроек FireFox, только сделанных для человека, а не робота, поддержки Canvas, некоторых селекторов CSS3 и прочего, несомненный интерес представляет поддержка стандарта WebForms 2 — обратносовместимого расширения HTML для разработки различных интерфесов ввода. В частности, картинка на скриншоте делается одним-единственным тегом:

<input type="datetime" step="120" name="start">

и это далеко не самая впечататляющая демострация — просмотрите стандарт, хотя бы по диагонали. Жаль, что это всё удасться использовать не ранее чем лет через пять, прежде всего из-за абсолютного главенства Internet Explorer, уверен, что Gecko/Safari подтянутся, а вот от Microsoft такой резвости ожидать не приходится.

Оставить комментарий

Блоки и локальные переменные в PHP

Давайте я опять про программирование, ага? Вообще, пусть это будет основной темой моего блога. Общечеловеческие ценности, безусловно, меня тоже волнуют, но это насколько скользкая тема, что так и норовишь вляпаться куда-нибудь и выйти в белом и без запаха уже никак не получается и даже самые умные люди говорят странное… впрочем, я отвлёкся.

Рассуждал я как-то — чего же мне не хватает в PHP — языке, которому я посвящаю почти всё своё рабочее время, плюс немного свободного? Помимо всяких мелочей, жизнь без которых не так мила, но, в общем-то, вполне сносна. Не хватает мне вещи, которую я впервые увидел в Perl’e — языке, с такой близкой мне идеологией — который дарит программисту то, что он сам бы никогда не купил.

Не хватает мне возможности изоляции переменных. Чтобы можно было, не задумываясь нет ли вверху чего-то с похожим именем, написать вот такое:

<?php
{
   var $i;
   echo $i = 1;
}
echo $i;

Пояснять нужно? Переменная, объявленная в фигурных скобках, перестаёт существовать за их пределами и не влияет на значения переменной с тем же именем, объявленной уровнем ниже. Я даже согласен на специальную конструкцию (хотя вот эта была бы предельно совместимой), чтобы это включили в PHP6, вместо пространств имён, которые, на мой взгляд, успешно подменяются объектами.

Наверное, нужно пояснить зачем, собственно, это нужно. Поясняю. Для уменьшения расхода памяти, чтобы объект, однажды объявленный в начале файла для локальных нужд, который забыли удалить не тянулся по всему коду, как смрад за народным ополчением, а сразу же, по выходу из блока, попал б в кандидаты на удаление.

Вторая причина — у вас никогда такого не было, что вы перетёрли переменную, которая используется где-то ниже? Например, вы правите чужой код и не в курсе, что переменная в вашей вставке, которой вы дали, на ваш взгляд, уникальное имя $dlja_tmp_2 уже используется и хранит что-то необычайно важное. Используя блок изоляции, можно быть уверенным, что ничего подобного не произойдёт.

На мой взгляд, реализовываться это должно довольно просто. Ведь это, по сути, просто анонимная функция со ссылками на все глобальные переменные внутри, где var просто очищает такую ссылку.

Оставить комментарий

Формат графики XBM

Есть такой интересный принцип дарить подарки — покупать в подарок то, что люди сами бы себе никогда не купили. У меня, похоже, одно из хобби — копать там, где ничего не растёт. В том смысле, что меня больше увлекают проекты, где практической пользы меньше, чем льда на Солнце.

Было время, меня увлёк графический формат XBM, единственное достоинство которого (впрочем, вполне достаточное, на мой взгляд) — безумная простота, позволяющая манипулировать графикой в этом формате из любого хоть чего-то стоящего языка программирования. Я даже разродился модулем ImageXBM и прочими вещами.

И вот я узнаю, что Internet Explorer 6.0SP1 и выше не поддерживает мой любимый формат! Причину цитирую:

A  change was made to Internet Explorer for Windows XP Service Pack 2 and Windows Server 2003 Service Pack 1 so that it does not render the XBM image file format. This update adds this change to all other supported versions of Internet Explorer. This change has been made to help prevent the Internet Explorer process from closing unexpectedly when users view invalidly-formed images. The XBM format is no longer supported by Internet Explorer.

Что переводится, примерно, так: «у нас что-то не работало, поэтому мы просто это отключили». Оплакал я смерть формата, которые за годы своей жизни так и не стал известен большинству разработчиков, да и сделал другой модуль.

Image_MonoBMP — модуля для работы с монохромными изображениями в формате BMP. А чтобы подтвердить, что я опять дарю вам то, что вы себе сами бы не купили, скажу, что этот формат, конечно, поддерживается Internet Explorer и Opera, но FireFox плевать на него хотел, да, в общем-то, и правильно.

Кстати, есть у меня идея сделать поддержку WBMP, но как же быть с принципом? Впрочем, я его уже нарушил, но об этом как-нибудь в другой раз.

Оставить комментарий

Новый раздел: 99

У меня на сайте появился новый раздел — «99». Старое хобби — написание одной считалочки на разных языках программирования. На сегодняшний день это 42 языка. Чувствую, что, вместо того, чтобы создавать разделы в меню для каждого хобби, их надо занести в один раздел «хобби» с подкатегориями.

Оставить комментарий

Автомакрос

Мне в редакторах не хватает одной простой вещи. Неплохо было бы, чтобы редактор смотрел на какие клавиши я жму (а большинство итак смотрит — для того, чтобы потом можно было отменить действия) и, если находит там циклическую последовательность, показывает мне какой-нибудь значок. Я, если вижу этот значок, понимаю, что последовательность редактор запомнил. Далее я могу либо повторить её какой-то комбинацией (например, Ctrl-точка) или посмотреть, кликнув на значок, что же там записал редактор.

Получается этакий «автомакрос». Иногда некоторые вещи проще сделать макросом (например, стереть последний символ в каждой строке — End, Del, Down), но лень создавать макрос, вешать его на клавишу, потом стирать…

В FARе очень сильно этого нехватает, есть, конечно, такая прекрасная вещь как плагин «Search&Replace» с регулярными выражениями, но что-то у нас как-то не сложилось — там сложная процедура получения ключа (сложность заключается во времени ожидания ключа — иногда на это уходят недели), да ещё он имеет наглость устаревать. Поэтому чаще всего я просто запускаю Perl или PHP.

Оставить комментарий

Скажи спасибо, сволочь!

Фраза из руководства по MySQL (вариант руководства на русском):

Благодаря этому удобному синтаксису, в сервере MySQL не поддерживается оператор ANSI SQL || для конкатенации строк: вместо него используется функция CONCAT().

«Благодаря… не поддерживается»? Не вижу причин благодарить.

Оставить комментарий

Распознавание CAPTCHA MTC

МТС сделал у себя на сайте защиту спама в сервисе отправки SMS. Защита, надо сказать плюшевая — усреднением помехи убираются почти подчистую, дальше распознать цифры очень просто — я пробовал. Удалось добиться стопроцентной вероятности распознавания.

CAPTCHA МТС (1.69КиБ)

Алгоритм на этот раз не публикую даже из исследовательских целей. Алгоритм для Beeline потом был использован в одной из спам-машин, извините, уважаемые пользователи этой сотовой компании.

Кстати, подходящее время вернуться к разговору о защите от спамовых роботов, специализирующихся на форумах, гостевых книгах и т. п. Поводом послужила попытка Helix (aka Ulitka) усовершенствовать предложенные мною методы CAPTHA.

Как уже было сказано, метод CAPTHA — помещение на картинку некого кода, который человек должен прочитать и ввести в особое текстовое поле, обладает следующим недостатком — слишком простое изображение читается роботом, слишком сложное — уже с трудом читается человеком и отпугивает посетителей.

Предлагаю, умозрительно, поискать другие способы защиты от роботов, в стороне от методов CAPTCHA. Скажем, некоторые форумы генерируют для каждого пользователя или хоста, заходящего к ним, идентификатор, который может зависеть, от IP и User-agent пользователя. Идентификатор этот заносится в hidden-поле формы и должен присутствовать в данных формы. Как сервер получает эти данные, идентификатор удаляется и генерируется другой. Если по прошествии какого-то времени идентификатор не был использован, он так же удаляется.

Всё бы ничего, но хорошие спамовые программы давно содержат средства для быстрой настройки обхода таких средств защиты — идентификатор легко изымается из кода страницы и отсылается серверу. Тем не менее, этот путь мне кажется плодотворным.

Как известно, в браузерах есть скриптовые языки. Наиболее распространённым является JavaScript — его понимает максимальное количество современных браузеров. Код на этом языке включается прямо в страницу браузера «как есть», что делает заимствование кода на JavaScript часто минутным делом. Это положение вещей не устраивает некоторых разработчиков, что привело к появлению (обычной для интерпретируемых языков) защиты — программ изменяющих код таким образом, чтобы его было трудно прочитать человеку (такие программы часто называют «obfuscator»).

Обычно такие программы изменяют имена пользовательский функций, процедур и переменных, убирают форматирование и, иногда, модифицируют сам код программы. Даже программисту средней руки вполне по силам создать неплохой obfuscator, делающий над строкой такие преобразования, чтобы JavaScript смог восстановить исходную строку, а написание программы-раскодировщика стало проблемой — ведь можно написать obfuscator, который при двух запусках выдаст разный, сгенерированный случайно (в каких-то пределах) код.

Таким образом, объединение «маркеров», которыми помечаются пользователи и JS-obfuscator’a, возможно, будет хорошим решением проблемы защиты от роботом-спамеров. Проблемы, которые нужно решить — написание хорошего obfuscator для JavaScript и вопрос генерации «маркера» (не забывайте о защиты от flood’a, если «маркер» генерируется при каждом заходе пользователя, злоумышленник может сгенерировать гигантское количество «маркеров»), оставляю на читателя.

Оставить комментарий

Sort в PHP

Оказывается функция sort в PHP не использует установки локали в PHP4. Косвенно это можно узнать из руководства:

Sorting type flags:

SORT_REGULAR — compare items normally

SORT_NUMERIC — compare items numerically

SORT_STRING — compare items as strings

SORT_LOCALE_STRING — compare items as strings, based on the current locale. Added in PHP 5.0.2

Параметр SORT_LOCALE_STRING появился только в PHP 5.0.2. На мой взгляд, это очень странно. Valshooter рекомендует в этом случае использовать

usort($fruit, 'strcoll');

правда, в том случае, если локаль у вас UTF8 вряд ли сортировка вернёт осмысленные данные.

Оставить комментарий

Мой mod_autoindex

Испокон веков в Apache (внимание! речь идёт об Apache 1.x) существует модуль mod_autoindex — в комментариях в его исходном коде есть дата, видимо написания первой версии — 23 марта 1993 года. С тех пор модуль, очевидно, претерпевал какие-то изменения, но с 1993 года форматирование вряд ли изменилось — всё тот же тег PRE.

С 1993 года HTML обогатился таблицами и каскадными стилями (CSS). Вряд ли сейчас кто-то использует браузеры не знающие что это такое, странно, что для вывода информации в модуле mod_autoindex до сих пор используется PRE. Сам по себе модуль очень неплох — он позволяет быстро (часто для этого вообще ничего не надо делать — просто убрать индексный файл из папки) организовать файловые архивы, а главное — организовать их без использования относительно медленного скриптинга, что может часто бывает критично для сервисов, пользующихся большой популярностью.

В моём портфолио есть несколько проектов, где приходилось изобретать какие-то вещи (где-то, наверняка, велосипеды, знания о всех готовых решениях у меня нет) для улучшения производительности. Как я уже сказал, для огранизации файловых архивов иногда очень удобно использовать модуль mod_autoindex. Удобно, да вот незадача — владельцу сервиса, как правило, помимо производительности важна такая вещь как дизайн, оформление.

Стандартный модуль Apache позволяет менять, в этом плане:

  • header, т. е. часть над списком файлов (HeaderName, SuppressHTMLPreamble)
  • footer, часть под списком файлов (ReadmeName)
  • размер иконок (IconWidth, IconHeight)
  • внешний вид иконок (AddIcon, AddIconByType, AddIconByEncoding)
  • убирать из списка некоторые столбцы (SuppressLastModified, SuppressSize, SuppressDescription)
  • изменять описание файла (AddDescription)
  • и весьма ограниченно менять внешний вид выводимой информации (FoldersFirst, SuppressColumnSorting и т. п.)

Чаще всего этого для «упаковки» списка файлов в дизайн очень мало. Для облегчения задачи интеграции вывода mod_autoindex в дизайн я несколько усовершенствовал этот модуль. Всё по порядку.

Что умеет новый модуль

my_mod_autoindex (10.06КиБ)
  • Режим FancyIndex всегда включен и не выключается. Вряд ли найдётся много людей
    не использующих этот режим.
  • В основном режиме (об этом подробнее — чуть ниже) таблица файлов выводится при
    помощи тега TABLE, где у большинства объектов (например, у первой строка, чётных
    и нечётных строк) прописаны идентификаторы CSS-классов, из чего следует, что внешний
    вид таблицы вы легко сможете задать при помощи файла стилей.
  • Новая опция, позволяющая включить в листинг файла ссылку на корень сайта
    (IndexOptions +RootFolder, при использовании не забудьте добавить иконку,
    например так: «AddIcon /icons/back.gif .»)
  • Появилась возможность перенести Description в отдельную (новую) строку
    (IndexOptions +DescriptionAtNewRow)
  • Появилась возможность локализовать (перевести на родной язык) текстовую
    информацию модуля (директивы ParentStr, RootStr, NameStr, SizeStr, DescriptionStr, LastModifiedStr).
  • С первой страницы (если пользователь находится в корне сайта) убрана
    ссылка «Parent Directory», ведущая в этом случае, на ту же самую страницу.
  • Появился новый режим вывода, основанный на теге SPAN (именно он на иллюстрации),
    в частности, количество иконок в строке в этом режиме зависит от ширины окна браузера
    (IndexOptions +BoxWidth=N +BoxHeight=N +MaxIconHeight=N)

Новый режим вывода  

Прямоугольник (7.08КиБ)

Новый режим вывода включается автоматически, если были использованы параметры BoxWidth и BoxHeight. Эти два параметра отвечают за размер прямоугольника, в который заключена иконка (на иллюстрации выделено чёрным) и, по сути, определяют расстояние между соседними иконками.

Размер этот нужно выбирать исходя из размеров иконки, текста названия файла и строки, где выводится размер файла, плюс некоторое пространство, необходимое для обеспечения зазора между соседними иконками. Есть ещё один параметр — MaxIconHeight, выбрать его просто — это всего лишь максимальная высота иконки в вашем наборе. Нужен этот параметр для того, чтобы подписи к иконкам располагались на одном уровне (на иллюстации — синяя линия).

В этом режиме под иконкой выводится имя файла, размер и дата модификации (если, конечно, не были использованы опции SuppressLastModified и SuppressSize), описание файла выводится в аттрибут «title» тега SPAN, охватывающего иконку и надписи (если не была использована опция SuppressDescription) — вы можете использовать DHTML, чтобы выводить информацию из title в статусную строку, всплывающую подсказку и т. п.

Пример

Файлы для вывода информации так, как это изображено на иллюстрации выглядят так:

Файл «.htaccess»:

IndexOptions +SuppressHTMLPreamble +NameWidth=*
IndexOptions +SuppressLastModified +FoldersFirst +RootFolder +DescriptionWidth=*
IndexOptions +BoxWidth=80 +BoxHeight=80 +MaxIconHeight=33

HeaderName /_bolk_autoindex/.HEADER.html
ReadmeName /_bolk_autoindex/.FOOTER.html
ParentStr "Наверх"
RootStr "В корень"
NameStr "Имя"
SizeStr "Размер"
DescriptionStr "Описание"

Файл «.HEADER.html»:

<head>
    <title></title>
    <style type="text/css">
    td,
    body { background-color: white; font-family: Verdana,Tahoma; font-size:10px }
    a    { color: black; text-decoration:none }
    .cell0, .cell1 {text-align: center}
    a:hover { text-decoration: underline }
    </style>

</head>
<body>
<h4>Пример использования</h4>
Содержимое каталога:
<!--#echo var="DOCUMENT_URI" encoding="none" -->
<br clear="all" /><br />

Файл «.FOOTER.html»:

</body>

Где взять и как установить

Файл можно взять у меня на сайте (ZIP, около 15Кб), для установки нужно переписать его на место старого модуля (каталог src/modules/standard) и перекомпилировать Apache.   Проблемы и их решения

Часто, помимо имени файла, его размера и даты создания, хочется вывести другую полезную информацию — например, разрешение для картинок, ID3 теги для MP3 файлов и так далее. Для этой цели я рекомендую воспользоваться полем «Description» и директивой «AddDesription». Задачей модуля не является и, надеюсь, не будет являться (иначе это приведёт к снижению производительности) автоматический вывод информации такого рода. Напишите скрипт (кстати, возможно позднее я его выложу), который пробежит по каталогам и добавит эту информацию в соответствующие .htaccess файлы и вызывайте его далее по мере необходимости.

Один из заказчиков попросил предоставить пользователю возможность самому выбирать какой вид листинга файлов он хочет получить — табличный или в виде иконок. К сожалению, у Apache 1.x нет методов переключения конфигурации в зависимости от каких-то внешних условий «на лету», так что было выбрано такое решение. На портах 80 и 443 (обычно используется для HTTPS-соединений) были заведены два виртуальных хоста:

<VirtualHost example.com:80>
...
AccessFileName .htaccess .htaccess-table
...
</VirtualHost>

<VirtualHost example.com:443>
...
AccessFileName .htaccess .htaccess-icons
...
</VirtualHost>

где прописаны одно общее имя .htaccess-файла для общих настроек и деректив AddDescription и два разных имени для различных наборов настроек mod_autoindex. Переключение происходит перенаправлением пользователя на определённый порт.   Хотелось бы ещё…

По всем вопросам, с пожеланиями по улучшению — добро пожаловать в мой почтовый ящик, он есть на моём сайте внизу каждой страницы.

Оставить комментарий

Сессии в SSI

Один из проектов, в разработке которого я участвовал в недавнем времени, расчитывался на огромную посещаемость (забегая вперёд, скажу — проект действительно стал исключительно посещаемым), в связи с чем пришлось разрабатывать и использовать технические решения, позволяющие проекту не «падать» под огромными нагрузками.

В частности, была разработана система кеширования, которую можно охарактерировать как «всё по максимуму в в HTML, остальное — включаем через SSI и фреймы». Поскольку на сайте используются пользовательские сессии, сложилась ситуация, когда сессию должны могли инициировать и скрипты (язык программирования — PHP, основной сервер — Apache 1.x), включенные через SSI. Тут надо заметить, что из-за жёсткого требования заказчика — в строке запроса не должны присутствовать PHPSID и т.п (на сайте используются ЧПУ), использование trans_sid исключалось.

Trans_sid использовать нельзя, скрипты, включенные через SSI заголовок выдать не могут и, следовательно, проставить сессию в cookie — тоже. Сначала я, было, решил полностью отказаться от SSI и работать исключительно с iframe, но подумал — нельзя ли Apache заставить генерировать идентификатор сессии самостоятельно?

Оказалось — можно. Первое, что пришло в голову — использовать модуль mod_unique_id к Apache — я слышал об этом модуле, но никогда его не использовал. Внимательно прочитав инструцию к модулю, я понял, что это совсем не то, что нужно — модуль генерирует уникальный идентификатор для каждого запроса:

This module provides a magic token for each request which is guaranteed to be unique across «all» requests under very specific conditions. The unique identifier is even unique across multiple machines in a properly configured cluster of machines.

Внимательно пролистав список официальных модулей Apache, я нашёл в списке mod_usertrack — модуль, маркирующий пользователей при помощи cookie. Обычно он используется для того, чтобы различать пользователей в логах веб-сервера, но для нас главно то, что он маркирует пользователей идентификатором, который можно прочитать.

Проведя испытания, я столкнулся с вполне ожидаемыми трудностями — во время первого запроса, когда сервер только что отослал cookie клиенту, в переменной PHP \_COOKIE$ пусто — cookie ещё не пришли от клиента назад и, соотвественно, не были записаны в эту переменную.

В PHP есть функция apache_response_headers, возвращающая массив всех заголовков, выдаваемых в HTTP-запросе в данный момент. Естественно, в числе этих заголовков нашёлся и тот, что отвечает за простановку cookie. Функция, читающая такой заголовок и cookie, может выглядеть, например, так:

<?php
function U_sid()
{
    // Если идентификатор уже есть в cookie, возвращаем его
    if (isset($_COOKIE['Apache'])) return $_COOKIE['Apache'];

    // Иначе - ищем его в ответе Apache
    $responce = apache_response_headers();
    foreach (preg_split('/s*;s*/', @$responce['Set-Cookie']) as $chunk)
    {
        list($key, $value) = explode('=', $chunk, 2);
        if ($key == 'Apache') return $value;
    }

    return null;
}

«Apache» — это имя cookie, которое проставляет Apache. Далее — всё просто, в php.ini отключаем «session.use_trans_sid» и «session.use_cookies», чтобы запретить PHP создавать сессии, в .htaccess помещаем директивы модуля mod_usertrack:

CookieFormat Compact CookieTracking on CookieStyle Cookie

А в библиотечный файл (или наши файлы PHP, поближе к началу), вызов необходимых, для создания сессии, функций:

<?php
// Узнаём идентификатор сессии
if (($sid = U_sid()) !== null)
{
    // Если он не null, создаём сессию
    session_id($sid);
    session_start();
}

В итоге мы получаем cookie-сессию, которая создаётся даже в файле, включенном через SSI.

Оставить комментарий

Маленькая Казань

Уважаемые казанцы, знаете ли вы, что Казань — это не только столица республики Татарстан, но и маленький город в Слободском районе Кировской области.

Казань, Кировская область, Слободский район (10.98КиБ)

1 комментарий

Индус trial-ной

Кста, недавна вычитал в интервью лидера гр Технология про строчку из их песни «Я солдат индус-триальной войны». Вообщем это прикол, он имел ввиду индус trial-ной. То есть более 50% программеров в мире индусы, пишущие шароварный софт…. Вот такая вот интеллектуальная ирония…

Я и не подозревал. Честно говоря, берут меня сомнения — могли ли товарищи из группы «Технология» вообще что-то знать тогда об оффшоре и индусах.

Оставить комментарий

Для чего нужен SQLite

Открылся Wiki по SQLite. Цитата:

В Web sqlite уготовано место исключительно блогов и прочего где минимально количество записей.

sqlite превосходен, когда большое количество запросов, и когда операции записи редки, и редко задействуют несколько таблиц. При более-менее сложных операциях плохо, ибо блокировку отдельных строк он не умеет, и во время транзакции блокирует базу целиком (даже не отдельную таблицу).

Оставить комментарий

Проблема доделки чужого

На одном из форумов увидел такой ответ одному начинающему программисту.

Вы столкнулись, пожалуй, с самой распространенной проблемой. По моему опыту — доделать чужой брошенный проект означает переделать его заново с «0», ибо тот, кто его бросил «на полпути» в большинстве случаем трезво осознает, что он написал полнейшей чуши, которую сам не сможет довести до рабочего состояния. Клиенты же в большинстве своем уверены, что если они за 80% (100) стоимости сделали 80% от сайта, значит, остальные 20% будут доделаны за соответствующий процент — 20. С такими людьми лучше не связываться на самом деле.

Привожу его здесь, так как он очень точно описывает суть проблемы, с которой я неоднократно столкнулся. Хорошо, если заказчик это понимает, иначе приходится пускаться в долгие объяснения или расставаться. Цитата содержит короткую фразу, с которой можно начинать разговор в подобных случаях и уже дальше выяснять реакцию.

Оставить комментарий

Зело тяжкий Ассемблер

Написание программъ на Ассемблере, рекомое канитель, паки и паки хитро будучи, душам праздным супротивно бысть, и ум девствен оное столь удручить может, что не только ночной покой смутит и дневное здравие, но и  яствъ отвратит и сладости вина пиющих возлишить может, и похоти от жен человеческих. А тем мужам знатным, в  коих имени ТАСМА и МАСМА трепету нет и бесии ти супротив них немощны и безсильны, от оного повреждения нет, а токмо благо есть для нихъ и рабов ихъ, и живота ихъ, и угодья ихъ всяческого, так сие полагая, что буде оные не имать в разсудке своем тяготу сию, Ассемблер рекомую, то чрез праздность ума ихъ и душам ихъ великий соблазнъ бысть, и господу хуление, и надругательство, и  скверна всяческая, и государству поруха, и запустение в  дворахъ ихъ, и животахъ ихъ, и твари всяческой, и бесям чрез то великое попущение. Ино и почитается Ассемблер, аки особая благодать.

Источник — ЖЖурнал den_rybakov.

Оставить комментарий

Тест nginx

Тестировал сегодня nginx. Отключил все ненужные модули (кстати, если будете компилировать под Linux-2.4.x не забудьте указать «—with-poll_module», иначе не собирётся), 100 workers, use rtsig. Сервер показал сравнимые с 0W-httpd (ZeroWait httpd) результаты (13-229ms) и лучшую стабильность.

Так или иначе, 0W лидирует по скорости и обладает более пригодным для моих задач возможностями. Но и nginx очень хорош, думаю, если будет развиваться, может стать достойным конкурентом остальным решениям.

Оставить комментарий

Тестирование веб-серверов

Прислали ссылку на тестирование различных веб-серверов, спасибо Валентину. Всё-таки я говорил немного не об этом (я говорил о сервере, который отдавал бы графику и видео, а более сложный контент передавал на обработку Apache), но, для интереса, потестировал и то, что есть у меня, плюс установил thttpd. Для тестирования использовал Apache Benchmark с параметром «-c 500». Машина — Pentium IV 2.80 GHz.

Итак. Лучше всех справился 0W-httpd, показав ответа 12-37ms, далее — thttpd (26-61ms), Apache, как и следовало ожидать, справился хуже всех (55-255ms). ZeroWait порадовал скоростью, но встревожил тем, что свалился во время одного из тестов.

Оставить комментарий

8sender

Написал программу (2.65Кб), позволяющую отправлять вложения в формате bolk quoted printable. На PHP. Вкратце напомню — это формат, который, в отличие от остальных форматов вложений (quoted printable, UUE, Base64), минимально увеличивает размер файла. Основные почтовые клиенты его понимают.

Утилита command-line, на вход нужно подать следующие параметры: адрес отправителя, адрес получателя и имена файлов вложений (их может быть несколько). Например, так:

php 8sender.php mail@example.com bolk@example.net big.tiff

Опционально первым параметром можно указать адрес вашего SMTP, он должен быть первым после ключа -t. Если его не указать, программа попытается самостоятельно определить MX получателя. Для работы под Windows желателен PHP 4.3.0 и выше.

php 8sender.php -t smtp.example.com mail@example.com bolk@example.net big.tiff

После запуска программа покажет диалог с SMTP-сервером, не пугайтесь — так и должно быть. Если что-то не так, то на экране появится слово «Error» с кратким указанием ошибки. У программы есть один недостаток — при кодировании файла используется файловый буфер, вместо выдачи файла сразу в сокет. Мне так удобнее было отлаживать и, обычно, это не мешает, если вы не собираетесь отсылать по почте фильмы.

Оставить комментарий

← 1 2 3 4 →