prog

Выбор веб-сервера

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

Tux — веб-сервер, работающий как модуль ядра. Сейчас поддерживается фирмой RedHat. Показывает хорошие характеристики по скорости, но не умеет работать со списками IPs.

X15 — веб-сервер фирмы Chromium. Судя по тестам — ешё быстрее Tux, хотя и работает в user space. Скачать не удалось — регистрация на сайте не работает, все ссылки ведут в никуда.

ZeroWait — решение, которое было выбрано. Характеристики устойчивости, защищённости и скорости неизвестны, но с задачей справляется. Два недостатка — почти полная неизвестность (а значит и неизвестная степень безопасности) и очень слабая документированность.

Кто-нибудь знает ещё какие-то решения? Было интересно узнать кто что использует.

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

Сколько книг прочёл

Через три дня — 19 сентября. 19 сентября 2003 года я начал вести список книг, которые читаю. За три дня я вряд ли успею ещё что-то дочитать, так что результаты, можно сказать, уже известны — 60 книг за год. Это по пять книг в месяц или чуть больше, чем книга в неделю.

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

Perl:

print scalar grep {/^\d+\.\d+/} <>

Unix Command Line Utils:

grep -E "^[0-9]+\.[0-9]+\."|wc -l

PHP:

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 удерживает лидирующие позиции на рынке серверов? Из-за бо́льшей надёжности? Но и во freeBSD немало уязвимостей. Из-за меньших проблем с настройкой? Достаточный ли это аргумент?

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

Compnews

Когда-то давно я создал сайт «Compnews». Основной его идеей было автообновление — он сам обходил новостные сайты, скачивал с них новости и давал их лентой. Идея пришла мне в голову, когда мне захотелось создать хотя бы подобие сайта, который мог бы сам, без участия человека обновлять своё содержимое. Помимо этого у сайта была очень хорошая система оповещения владельца об ошибках, но это уже отдельная история.

Полюбовавшись на сайт, я написал письмо всем известному Лебедеву — рассказал ему об идее и реализации. В ту пору я с ним переписывался на почве JUnix. Лебедев, казалось, идею не оценил, но, через некоторое время, у студии Лебедева появился проект «Закладки» — с моей идеей в основе, только проектам было предложено самим регистрироваться как источник информации (об RSS в России тогда слышали только единицы).

Через некоторое время проекты загнулись — и мой, и его брат. Зато, несколько позже, появился «Мой Яндекс». Идея всё та же, только на этот раз, поскольку времена были уже другие, для импорта данных были использованы RSS.

Идея, как известно, ничьей собственностью не является и речь идёт вовсе не о плагиате. Я вот о чём — могу ли я, интересно, считаться одним из отцов проекта «Мой Яндекс»?

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

Мифы о Java

Читаю статью «Top Reasons Why People Think Java Un-Cool — Debunked» (eng) — «Наиболее популярные причины, по которым люди думают, что 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 может и не понравится такое не целевое использования их системы или они просто планово поменяют что-то в интерфейсе и GMailFS перестанет работать.

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

Устранение потерь при кодировании почтовых аттачей в base64

Как известно, когда-то электронные письма предназначались исключительно для обмена текстом. Соотвественно и все протоколы тогда разрабатывались в расчёте на это. Когда появилась потребность передавать файлы, поступили очень просто — файлы специальным образом преобразовывались в текст и этот текст включался в тело письма. Конечно, такое преобразование не проходило даром — объём файла сильно увеличивался от этого пребразования, поскольку «текст» — это куда меньшее количество символов, чем бинарные данные, да и речь в те времена шла только об английском тексте. Со временем, это вошло в стандарт и почтовые программы научились самостоятельно вставлять в текст файлы, преобразуя их различными методами.

Прошло время, текст в электронных письмах давно уже не только английский, а стандарты кодирования текстовых файлов до сих пор используют только латинские буквы (плюс цифры и некоторые символы, такие как плюс, миную, слеш и так далее). Мне пришло в голову — а что если попробовать кодировать файлы всем полем допустимых символов. Сейчас, когда появились письма на UTF-8, допустимыми символами являются все, за исключением символов с кодами 0x00 (из-за того, что почти всё ПО написано на C/C++, где этот символ является признаком конца строки), 0x0A и 0x0D (это символы перевода строки, не хотелось бы, чтобы какой-нибудь умный клиент в бинарном файле добавил к 0x0D символ 0x0A — по стандарту в письмах перевод строки обозначается парой этих символов и, обычно, если встречается только один из них, почтовые клиенты или MTA добавляют и второй).

Из всех вариантов кодирования, а их три (Base64, UUencode и quoted-printable) для моих целей подошёл только quoted-printable. Идея его очень проста — все недопустимые символы (и «равно») преобразуются в последовательность из трёх символов: символ «равно» и шестнадцатиричный код символа. Поскольку «допустимых» символов традиционно очень мало, то метод не слишком экономичен.

Я же задался целью проверить, что же будет, если попробовать передать файл, где поле допустимых символов расширено до максимума. Сразу скажу — эксперимент удался. Можено эксперементально внедрять новый формат кодирования писем. Назовём его Bolk Quoted-Printable. Ладно, ладно, будем скромнее. 8bit Quoted-Printable.

Я написал небольшую программу на 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, мой quoted-printable — 36300, base64 encode — 46034, TheBAT! UUencode — 47052, TheBAT! Quoted-printable — 80576.

Случайный JPEG: исходный размер — 28144, мой quoted-printable — 29656, base64 encode — 38570, TheBAT! UUencode — 39429, TheBAT! Quoted-printable — 65663.

В случае QP-кодирования моим методом, размер файла, как видно по результатам двух экспериментов, увеличился совсем ненамного — 4-8%. Если для теста взять текстовый файл, то прирост будет едва заметен, если вообще будет, надо только переводы строки для текстовых файлов не кодировать, а пускать как есть.

Эксперименты на первом же попавшемся Sendmail показали, что, во-первых, типичный MX стремиться разбить строку по размеру своего буфера (у моей жертвы этот размер оказался равен приблизительно двум килобайтам) — но это легко устранимо, достаточно делать это за него и, что более неприятно, «умница» sendmail перекодирует письмо так как считает нужным — в традиционный quoted-printable.

Последняя беда поставила меня в тупик. Правда, ненадолго. Вспомнив, что большинство клиентов умеют открывать письма в формате 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 как UTF-8.

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

Патч к 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;
    }
}

В случае, если вы будете использовать эту функцию в проекте, будьте осторожны — это всего лишь заглушка. Во-первых, одна ссылка создаётся примерно за 0.6 — 1сек, во-вторых, в ней нет проверки на наличие специальных символов в переменных $target и $link — если там попадётся кавычка, возникнет опасность внедрения вредоносного кода.

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

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). По-русски говоря, что у вас может не заработать после установки SP2 для Windows XP. Много игр, в списке есть Corel Draw 9, Diet KaZaa и KaZaa, DivxPlayer, Adobe PageMaker, AOL IM, AutoCAD 2004, Cute FTP 5.0, ICQ Pro, WinRoute, Live Journal Semagic, Outlook, некоторые компоненты MS Office, Visual Studio и многое другое.

У меня есть подозрение, что всё дело во встроенном в Windows XP firewall, который несколько расширил свои функции в SP2. В списке есть почти все наиболее известные программы для работы с Сетью — firewall, прокси, IM, FTP-клиенты и прочее, а остальные программы, скорее всего, просто пытаются проверить нет ли в Сети новых версий или предлагают какие-то другие возможности для работы или развлечения в интернете.

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

Латрас

Один из способов придумать довольно хороший, но запоминаемый пароль — написать пару слов по-русски с ошибками и в латинской раскладке. Например: «асинаяфаприка» превращается в «fcbyfzafghbrf». Способ настолько распространён в определённых кругах, что при передаче пароля, чаще всего, ничего объяснять и не нужно — человек, встретив такую комбинацию, сам на клавиатуре посмотрит что за слово имелось ввиду.

Чаще всего удобнее (диктуя по телефону, да и просто удобно) сказать пользователю именно русское слово, объяснив, что набирать его нужно в русской раскладке. В связи с этим, хочется придумать этому приёму, раз уж он набрал такую популярность, какое-то короткое название.

Я предлагаю в качестве оного слово «латрас» (латинская раскладка). Т. е. типичная передача пароля будет звучать так: «набирай в латрасе — „расторопша“». Как вам?

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

Как повалить PHP

Статья «Top 10 ways to crash PHP». Язык — английский, но примеры, которые там приведены, поймёт любой PHP-программист. Кстати, первый из них я приводил на старой версии сайта. Интересно, все ли способы работают в PHP 5.

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

GIF в GD

Веб-разработчикам должно быть интересно: некоторое время назад вышла новая версия GD — 2.0.28. Главная особенность новой версии — поддержка формата GIF (чтение и запись).

Как известно, поддержка 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, а Интернет и Web-технологии — это довольно просто.

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

Total Eclipse

Total Eclipse (5.50КиБ)

В прошлый раз я опять вспоминал Spectrum. За мной это водится. Что ж — это был мой первый компьютер, на котором я начал серьёзно и много программировать.

В прошлый раз я упомянул 3D-бродилки, которые делались под этот компьютер. Их было несколько — Castle Master, The Crypt, Driller и Total Eclipse. На скриншоте именно последняя. Разрешения тогда были поскромнее и то, что у меня выглядит небольшой картинкой, размером с визитку, тогда было миром, полным тайн и загадок.

Созданная атмосфера поддерживалась настолько искусно, что я иногда физически ощущал нехватку воздуха и аритмию.

Сейчас меня удивляет как могла работать игра с 3D-графикой на компьютере с памятью в 48Кб и частотой процессора в два или три с половиной мегагерца. А тогда, я помню, меня удивляло, что Doom не идёт на 80286, а Prince II занимает пять мегабайт (или семь, не помню точно).

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

Back to Skool

Вспомнился «Спектрум». Для тех, кто не знает — был такой компьютер, который пользовался бешеной популярностью в нашей стране в 90-е годы прошлого века. 48Кб памяти, тактовая частота что-то около 3.5МГц, процессор Zilog Z80 один цвет фона и тона на квадрат 8x8 из 16-ти (кажется) возможных.

Тогда я ещё играл в игры, а игры для «Спектрума» делали потрясающие (господа, там, на пищалке, умудрялись делать псевдостерео, а уж о 3D-бродилке на таких-то мощностях я и не говорю).

Back To Skool (25.35КиБ)

От одной из тех игр у меня остался эффект незавершённого действия (кажется, это называется «гештальт»). Игра была довольно простая и где-то даже глуповатая, но на одном из этапов зависала. Я до сих пор иногда её вспоминаю и думаю — что же там было дальше. Игра называлась «Back to Skool» («Назад в школу»), выпускала её фирма Microsphere. Для желающих поиграть — можно скачать в Интернете, там же можно найти небольшую инструкцию, учтите — вам потребуется эмулятор «Спектрума». Мне играть не хочется — не смогу насладиться, а убить столько времени только для того, чтобы посмотреть чем это закончится, мне не хочется. Если кто-нибудь её пройдёт, расскажите мне, пожалуйста, чем там дело кончится.

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

«Языки программирования через сто лет»

Статья «Языки программирования через сто лет» Пола Грэма.

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

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

Да что там! Я помню как мы с братом мучались от безделья, думая — что бы нам ещё такого написать. Брали утилиты и переписывали их на Ассемблере, пытаясь сделать меньше, быстрее, функциональнее. Сейчас я больше в языках ценю скорость разрабоки, а не скорость работы. По-видимому, тенденция будет сохраняться — языки, позволяющие быстро решить задачу, будут для меня всегда ценнее, чем языка, позволяющие решить задачу быстро.

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

← 1 2 3 4 →