Mu/\EHHuyM

Всех с Новым годом, счастьем и всем прочим, с чем принято поздравлять при смене года и тысячелетия. :) Надеюсь, всем удалось отдохнуть.

Прошу прощения за молчание в весь период праздника Нового года, но, в конце концов, могу я расслабиться или нет?

Честно говоря, расслабиться в этот Новый год не получилось, не позволил туго набитый едой живот. Наученные предыдущим горьким опытом прогулок по праздничному городу, мы, с моей женой, решили на этот раз не толкаться на заполненных до отказа народом улицах, а набрать побольше еды (долларов на 50) и, засев перед телевизором, провести весь праздник вдвоем. Можно считать, что праздник удался. :) Жаль только, что наша маленькая кошка Кошмарка уронила бутылку шампанского, которое немедленно вспенилось и мне, успевшему его подхватить, посчастливилось оценить всю красоту шампанского, выстреливающего в крышку стола и льющегося обратно. На ковер. :)

Кошмарку тошнит от шампанского (на самом деле она чихает).

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

Хотя вспомнить в общем-то и нечего, но способом и местом проведения Нового года я остался доволен. Потому что впервые за несколько месяцев мне удалось по-настоящему отдохнуть. И поесть, никуда не торопясь, растягивая удовольствие от еды. Правда, все съесть не удалось, несмотря на то, что ели мы весь день и всю ночь. Возможности человеческого желудка ограничены, а последовать примеру древних римлян мы бы не рискнули. Будем доедать  —впереди еще целые сутки. Ночью заснуть вряд ли удастся — несмотря на то, что новогодняя ночь давно уже прошла, хлопки петард и прочей китайской пиротехники не утихают. Народ запасся основательно.

Время есть. И пить.

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

Базы данных. Наведем порядок

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

Устав бороться со своей и чужой ленью, я решил принять какие-то меры, чтобы облегчить жизнь себе и другим. Одна из таких мер — файл описания таблиц, который мы теперь вкладываем в корневой директорий каждого проекта. Я обычно называю его .tables (естественно в настройках Apache прописывается запрет на получение этого файла через Web), где в достаточно свободном формате описываются таблицы, поля, связи между ними и все остальные объекты.

Естественно, что файл предназначен для описания достаточно небольших баз данных (менее 7—10 таблиц). В этом случае больших баз без хорошо составленной наглядной документации все равно не обойтись. Не надейтесь. :)

Четкий формат представления имеют пока только таблицы, в силу того, что остальными объектами приходится пользоваться достаточно редко, да и синтаксис их описания различается для разных СУБД, но, возможно, в следующих версиях формата появятся правила и их описания тоже.

Вот пример описания двух таблиц, связанных между собой

[/usr/local/pgsql/bin/psql eshop]

items / товары
-----------------------
id              serial / идентификатор
gid             int4   / категория товара -> group.id
name            text   / наименование
price           real   / цена
comment         text   / описание товара

CREATE INDEX items_price_idx ON items (price)

group / категории
-----------------------
id              serial  / идентификатор -> items.gid
parent          int4    / родитель в дереве. -1, если верхний уровень -> id
name            text    / наименование

Думаю из примера и так все понятно, но я все-таки дам пару комментариев.

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

Инструкции заведения секвенсоров, представлений и хранимых процедур записываются в одну строку.

Так как формат файла представлений достаточно легко может быть разобран и преобразован в команды мониторов mSQL, PostgreSQL и MySQL я, пару дней назад, выбрав время, написал небольшую программку на Перле. Правда толком ее еще не обкатал, но не думаю, что с ее эксплуатацией возникнут какие-то проблемы.

Интепретатор файлов таблиц: intp.pl

#!/usr/bin/perl

sub StripComment
{
        my ($line) = @_;
        unless ($line=~s{^([^/]*)\s+/.+}{$1}o)
        {
                print "Предупреждение: не указан комментарий [ $line ].\n"
                unless ($line=~/^CREATE/o);
        };

        return $line;
};

sub AddData
{
        my ($table, @query) = @_;
        my $query  = join ',', @query;
        my $result = '';

        if ($todrop)
        {
                for (@query)
                {
                        if (/([^ ]+) serial$/)
                        {
                        $result.= "DROP SEQUENCE ${table}_${1}_seq\\g\n";
                        last;
                        };
                };


                $result.= "DROP TABLE $table\\g\n";
        };

        $result.= "CREATE TABLE $table ($query)\\g\n";

        return $result."\n";
};

sub AddDrop
{
        my $table = $_[0];

        if ($todrop && $table=~/^CREATE ([^ ]+ +[^ ]+)/o)
        {
                return "DROP $1\\g\n$table\\g\n";
        } else
        {
                return "$table\\g\n";
        };
};

unless (open F, (shift or '.tables'))
{
        print <DATA>;
        die "\n"
};

@query  = ();
$table  = '';
$result = '';
$comm   = '';
$todrop = shift or 0;

while (<F>)
{
        chomp;
        next if ($_ eq '' || /^\-\-/);

        if (/^\[(.+?)\]$/)
        {
                $comm = $1;
                next;
        };


        @data =  split (/       +/,StripComment $_);
        if (@data < 2)
        {
                $result.= @query?AddData($table, @query):AddDrop ($table)
                if ($table ne '');

                $table  = $data[0];
                @query  = ();
        } else
        {
                push @query, "$data[0] $data[1]";
        };
};

close F;

$result.= AddData ($table, @query) if (@query);

if ($result ne '')
{
        if ($comm ne '')
        {
                open  F, "|$comm";
                print F "$result\\q";
                close F;
        } else
        {
                print "Ошибка: не указана команда для приема данных.";
        };
} else
{
        print "Ошибка: файл для обработки пуст.";
};

__END__

Интерпретатор файлов таблиц для СУБД.
Написал Евгений Степанищев (2000 год).

Использование: inpt.pl имя_файла [DROP]

DROP - предварительно сделать DROP для таблиц и SEQUENCE

Формат:

-- БД stat                              комментарий

tablename / описание                    имя таблицы
---------------------                   оформительский элемент

поле1   тип / описание                  поля таблицы,
поле2   тип / описание                  описание интепретатор игнорирует
и т.д.

[/usr/local/mysql/bin/mysql stat]       комманда, принимающая данные

P.S. Если кто-то разовьет этот формат или предложит мне адекватную замену буду очень рад опубликовать и его тоже.
P.P.S. Вышеописанное ни в коем случае не претендует на панацею и всеобъемлющий инструмент, а всего лишь на роль мелочи, которая поможет избежать некоторых возможных трудностей.

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

Хибер. Нате

Когда-то давно, когда на Земле еще правил DOS, я задумал написать программу, которая могла бы сбрасывать на диск состояние компьютера и восстанавливать его по запросу. Тогда я был активным геймером и задуманная программа должна была помочь сохранить состояние любой игры в любом месте.

Жаль, но в то время эта задача была практически невыполнимой, а то бы я, возможно, уже сказочно разбогател. :) Или не я. Вряд ли мне принадлежит первенство в рождении этой идеи. Как показала практика, трудность не в сохранении дампа базовой (как тогда это называлось) памяти и содержимого XMS, да и с сохранением состояния контролера клавиатуры и прерываний (как не странно некоторые игры перепрограммировали и то и другое) я бы справился. Мне помешал защищенный режим и оставшееся оборудование.

Сначала на моем пути встал EMM386, этот менеджер VCPI— и EMS-памяти переводил процессор в защищенный режим (protected mode). Программировать под него я не умел, но из того, что знал, я сделал, может быть ошибочный, вывод — я не смогу после восстановления состояния компьютера сделать «так как было». Я решил на защищенный режим «забить» и загружать содержимое EMS уже после старта DOSа и самого EMM386. VCPI я не трогал, да он нигде и не использовался.

Потом появился DOS4GW. Его требовали DOOM и другие игрушки. Эта библиотека (или как это еще назвать?) так же использовала для своих темных дел защищенный режим. Я узнал слово «DPMI». С DPMI так же легко как с EMS я работать не умел, не было документации. Это стало первым гвоздем в гроб моей идеи.

Вторым, и последующими гвоздями, оказалось оборудование. Слово драйвер тогда рождало несколько другие ассоциации, ни о какой универсализации работы с оборудованием речи не шло. Так что нелегкий труд по опросу и сохранению состояния какой-нибудь карточки ложился целиком на плечи программиста. Для примера, со своей видеокарточкой, монстром от фирмы Trident с 512К на борту я бы еще как-то справился, но поддержка видеокарт всех фирм и моделей — задача для меня одного непосильная. То же и с другими компонентами.

Шли годы…

Незаметно появилась и вошла в нашу жизнь ОС Windows. Операционная система встала над защищенным режимом. Слово «драйвер» получило другой смысл, прослойка между операционкой и оборудованием… Слова XMS, EMS и VCPI стали забываться, а DPMI — расшифровываться по-другому. Появился ACPI и, как его часть, «OnNow». И Windows2000, как первая, по крайней мере в линии Windows, которая умеет его поддерживать. Ну хотя бы часть — ту что, «suspend-to-disk». И при условии поддержки ACPI оборудованием. Мы, не все конечно, узнали слово «Hibernate».

Идея «suspend-to-disk» или, как он называется в W2K, «Hibernate» недалека от того, что придумал в свое время я. На диске создается файл, куда после входа в этот режим за 10—20 секунд сбрасывается все, включая содержимое памяти машины и состояние его многочисленных компонентов, после чего предлагается нажать на кнопку «Откл.». После включения, компьютер говорит «Hibernating» и примерно за полминуты (у кого как) загружается. WinAmp продолжает играть с того места, где вы его «схибернатили», Word показывает содержимое ранее открытого документа, браузер — страницу… В общем все так, как будто компьютер и не отключали.

«Здорово», — подумал я, и отправился в недра настроек своей W2K — искать, где у меня спрятан этот самый режим. Найти с первого раза мне его не удалось. Пришлось идти в большой Интернет и читать. Все оказалось просто. Оказывается, по умолчанию возможность использования этого режима отключена. Так исторически сложилось. А для его включения необходимо выполнение двух условий:

  • все оборудование, включая материнскую плату, должно уметь работать с ACPI;
  • BIOS, который на этот самой плате стоит так же должен знать, что это такое.

Выяснить, как дело обстоит у вас просто — достаточно зайти на «Панель управления» («Control Panel»), там найти «Управление энергопитанием» («Power») и посмотреть, есть ли у вас закладка «Hibernate». Если есть — включайте режим, в списке «Lock-Restart-Shutdown» появится новый элемент. Если нет, вам не повезло, но не отчаивайтесь, возможно, не все еще потеряно, перейдите по первой ссылке внизу страницы и попробуйте поэкспериментировать.

Мне повезло. У меня машина «белой сборки» IBM-IntelliStation-чего-то-там и «Hibernate», теперь одна из причин, которая примеряет меня с существованием Windows 2000. :)

Ссылки по теме

Hibernate и Win2000
Hibernate и Windows 98
Технология Hibernate и Win2000

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

Как звери друг друга били. Найдено в FIDO

Медведь был безобразным, косолапым и грязным животным. Однако, добрее его не было никого во всем лесу. Hо звери замечали только его внешность, на что Медведь жутко обижался, ловил их и жестоко избивал ногами. Поэтому звери его не любили. Хотя он был очень добрым. И веселым. Он любил задорные шутки. За эти шутки звери его скоро жутко возненавидели и били. Да, трудно быть на свете добрым и веселым.

Волк был тоже безобразным и грязным. И еще он был очень злым и жестоким. Hо звери не испытывали к нему ненависти и не били. Потому, что Волк умер еще в раннем детстве. Потому, что Медведь родился раньше Волка. Да, хорошо, когда Добро побеждает Зло.

Заяц тоже был злым и жестоким. И грязным. И еще он был трусливым. Гадостей Заяц никому никогда не делал. Потому, что боялся. Hо его все равно сильно били. Потому, что Зло всегда должно быть наказано.

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

Крот был маленьким и слепым. Он не был злым. Он просто хорошо делал свое дело. Это он подъел дерево, которое упало на дятла. Об этом никто не узнал, и поэтому его не избили. Его вообще били редко. Чаще пугали. Hо его было очень трудно испугать, потому что он был слепой и не видел, что его пугают. Когда не удавалось испугать Крота, звери очень огорчались. И били Медведя. Потому, что им было очень обидно. Однажды Медведь тоже захотел испугать Крота. Hо Крот не испугался. Потому, что Медведь его убил. Нечаянно. Просто Медведь был очень неуклюжим. И звери его очень сильно избили. Даже, несмотря на то, что Медведь сказал, что пошутил. Плохо, когда твои шутки никто не понимает.

Лиса была очень хитрой. Она могла запросто обхитрить кого угодно. Когда ей это удавалось, то ее не били. Hо иногда ей не везло. И ее били. Били всем лесом. И она уже не могла кого-нибудь обхитрить. Потому, что очень трудно кого-нибудь обхитрить, когда тебя бьют. Однажды ее избили до смерти. Да, жилда всегда на правду выйдет.

Кабан был большой, сильный и страшный. Его все очень боялись. И поэтому его били только всем лесом. Или просто кидали в него камнями. Кабан этого очень не любил. И однажды ночью он спрятал все камни в лесу. За это его очень сильно избили. Больше Кабан никогда не прятал камни. Воистину говорят — время собирать камни и время их не трогать никогда.

Козел не был ни злым, ни добрым. Он был просто Козел. Он часто козлил. И его боялись бить. И он своим козловством всех достал. И тогда его избили до смерти. Потому, что иначе он бы умер от старости. Когда-нибудь. Когда Козел умер, Медведь сильно плакал. Потому, что он в тайне любил Козла. Да, любовь зла, полюбишь и Козла.

Ежик был маленький и колючий. Он кололся. Он не был злым, он кололся по своей природе. Из-за этого его били только в живот. Ежик этого не любил и стал бриться наголо. И тогда его стали бить как всех. Да, очень трудно быть не таким как все.

Скунс был почти таким, как Заяц. Hо только очень вонючим. Он плохо пахнул. Его били только в полиэтиленовом пакете. Тогда запах был не такой сильный. Однажды у Скунса был день рождения. Он пригласил всех зверей, потому, что был жадным и любил подарки. И звери подарили ему новый полиэтиленовый пакет. И сильно избили до потери сознания. И Скунс задохнулся в пакете. Так его и похоронили. В пакете. В Очень Дальнем Лесу. Потому, что мертвый Скунс вонял еще сильнее. Потом пришли жители Очень Дальнего Леса и всех сильно избили. Им не понравился запах мертвого Скунса. Да, с соседями надо жить в мире.

Хомяк был тоже очень жадным. И богатым. Если бы он делился своим богатством, его бы били не так сильно. Hо он был очень жадным. За это его били сильно. И ему все равно приходилось делиться. И он горько плакал. Да, богатые тоже плачут.

Лев был царь зверей. Он правил лесом. Царей бить не положено. Это закон. Hо звери давно забили на закон. Звери били и льва. Hи за что. Потому, что так уж здесь повелось.

2 комментария

Всех с Рождеством. Новый TheBAT! и PostgreSQL

Что поделать? Опять праздники, я, право, не виноват. В конце концов, могу же я отдохнуть еще разок? Рождество — штука странная. Вроде, в Рождество родился Христос, так? Причем, по разным версиям, родился либо где-то в районе 25-го декабря, либо что-то ближе к 7-му января. Тем не менее, летоисчисление у нас ведется прямехонько от рождества Христова. А еще более странную вещь я услышал в свое время на лекции по истории религии. Мне тогда очень хотелось спать и я плохо соображал, но, кажется, понял все верно. Иисус aka Христос aka Иешуа родился не в первом году, а вовсе даже в четвертом до нашей эры.

Тем не менее, всех вас с уже неоднократно прошедшим Рождеством, сами уж разберитесь, кого с каким. :)

Хе-хе-хе… С этим Рождеством пропустил выход новой версии моего любимого TheBAT!. Всем интересующимся — немедленно качать новую версию! 1.49 Christmas Edition порадовала нас, кроме кучи новых макросов для шаблонов и исправлений пары-тройки багов, затыком, как там написано, «потенциальной проблемы в безопасности, связанной с содержащимися в именах приаттаченных файлов слешами». Так очень рекомендуется… проапгрейдить…

Кроме того, из приятных (по крайней мере для меня) новостей на сегодня — выход так мной ожидаемой версии 7.1 СУБД всех времен и народов — PostgreSQL (поклонникам Oracle, Informix и прочего просьба не беспокоить). Правда это еще beta3, но скорость, с которой эти самые беты появляются, вселяет надежду на скорый выход релиза. Ждал я выхода этой версии по одной простой причине — в этой версии (уже начиная с beta2) тип поля text наконец-то стал неограниченной длины. И это радует. В предыдущих версиях он мог вмещать от 8 до 32Кб в зависимости от ядра и конфигурации. И необходимость использовать large object для хранения текста меня огорчала.

Кстати, о временах и народах. Вот-вот выйдет новая бета (уже 3-я по счету) всех времен и народов файлового менеджера FAR. Жду с нетерпением. Все, что я знаю о ней, это то, что найденный лично мной баг, связанный с копированием из менеджера процессов, будет как-то пофиксен. Скорее всего, списываться процесс будет под другим именем. В общем, выйдет — все сами узнаете.

На этом, разрешите откланяться, у моего хорошего друга сегодня день рождения, люди ждут. :)

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

PalmOS. Секурность

Похоже, есть вещи, которым люди никогда не научатся. Одна из таких вещей — анализ чужих ошибок. Ну, казалось бы, о безопасности, паролях и необходимости выбора «сильного» алгоритма шифрования уже столько сказано… Так нет, уважаемая мной фирма, производящая операционку PalmOS для «наладонников», допустила такой досадный промах.

В базовых приложениях этой ОС есть возможность пометить часть данных как «Private», закрыв их от любопытных глаз паролем. Само собой, пароль хранится где-то в системе. Причем. Промах номер раз: пароль хранится в базе, доступной для прочтения любому приложению. И, промах номер два: догадайтесь, какой выбран алгоритм для шифрования паролей? Да, практически никакой. Для шифрования используются два так называемых «алгоритма». Разные, для паролей длины менее пяти символов, и для длины более четырех. Но оба они сводятся к применению операции xor, за использование которой, в криптовании паролей и прочей частной информации, по-моему, давно пора отдавать под суд.

Такого шока я не испытывал с тех времен, когда обнаружил, что хваленая утилита из комплекта Norton Utilites (DiskReet, кажется), позволяющая создавать диск с доступом по паролю, хранит этот самый пароль также за’xor’енным по константе.

Будем надеяться, фирма Palm хватится за голову или другое место (чем они там придумывали этот алгоритм шифрования?) и выпустит в скором времени патч, предотвращающий дешифрование пароля обратным преобразованием. А пока, владельцам «наладонников» с PalmOS рекомендуется запирать свой Palm и не давать его в руки злым кул хацкерам.

P.S. А вы говорите WindowsCE…

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

26-й кадр

Ребята, ну не верю я в магическое воздействие на сознание человека штуки, под названием 26-й кадр. Не верю! Знаете почему? Я скажу.

Что вообще известно об этой «технологии»? 26-й кадр практически не заметен, сознание его не воспринимает, воспринимает подсознанием и понимает как сигнал к действию. Теперь последовательно.

Я сейчас сижу на работе, за монитором со 100-герцовой разверткой, дома у меня — 85 герц и все, что мигает с частотой ниже последней цифры, для меня заметно на глаз. За монитором с 75Hz я долго просидеть не смогу, а телевизор вблизи для меня ТАК мерцает, что смотреть я его могу только с расстояния 3-4 метра. У большинства людей, работающих за мониторами с хорошей частотой обновления, те же проблемы.

Лично для меня 26-й кадр заметен и читаем, не удивительно — изображение обновляется 26 раз в секунду. Я успеваю заметить, что там что-то написано и частично осознать, что же именно. Кстати меня всегда интересовало, почему именно 26-й кадр, а не 27-й, или 40-й? Больше не нужно или дальше и подсознание не успевает воспринимать?

Теперь о том, что слова, написанные в этом самом кадре, воспринимаются подсознанием, как сигнал к действию.

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

Второе. Даже если фраза проскочила мимо сознания в подсознание, не факт, что она воспримется так, как того хотели люди, туда ее внедрившие. Я бы даже сказал, совсем не факт. Знаете почему? Потому что это текст, а не речь, он печатный. Вы когда-нибудь пробовали общаться с человеком исключительно текстом? Наверное, пробовали. В письменном общении трудно передать свои эмоции, особенно есть фраза короткая. Для этого в Интернете придумали смайлики. Кроме того, мы все под одинаковыми словами понимаем разные вещи.

Пример. Когда-то слово «секс» говорить было стыдно. Многие говорили «ЭТО». Большими буквами и громким шепотом. :) Теперь представьте себе рекламу… ну, скажем, стирального порошка, где в 26-м кадре написано «КУПИ ЭТО». Логическая цепочка: упоминается «это» без привязки, речь идет о сексе, предлагается секс купить, говорят о проституции. И, если предположить, что каждая такая фраза должна подтолкнуть к какому-то действию, то человек пойдет и снимет проститутку. Фраза привела не к тому действию, которое планировалось, если это, конечно, не реклама проституции. А у другого человека слово «это» может прочно ассоциироваться с местом его работы, если работает он в электротехническом отделе или в экспериментальном творческом объединении.

Третье. В нашем мире «картинка» перед глазами часто меняется очень быстро. Так, что сознание «зацепить» ее не может. Например, близкостоящие деревья за окном автомобиля, несущегося на солидной скорости. Да, то, что это деревья — видно, а вот какие, сидят ли на них птицы? Информация об этом в сознание не попадает, тогда должна, по той же идее, попасть в подсознание и заставить меня что-то сделать… Что же я должен сделать, увидев дерево? Знак «проезд запрещен» (пусть веду не я)? Суслика, стоящего столбиком? Я — не просто смотрю. Так что, как говорится, «фиг вам».

P.S. Кстати, в фильме «Бойцовский клуб», есть кадр, который появляется на экране только одно мгновение — за спиной человека, сидящего на стуле, появляется девушка (кажется в красном, давно смотрел не помню), держащая руку на плече сидящего, и тут же исчезает. Возможно, в кассетной версии этого момента нет, я не знаю.

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

Гагаузы

Вчера, просматривая найденные ссылки по 26-му кадру, я наткнулся на упоминание о некой странной народности, называемой гагаузами. Странная она своей национальной музыкой, цитирую «она вся 9/16 (девять шестнадцатых), 7/16, 11/16». Я не совсем понимаю, что это значит, но, опять цитата, «ездили с концертами в Беларусь. Там музыканты удивлялись: „Видели как музыканты ошибаются, но что-бы так ВМЕСТЕ!!!“». Это все меня заинтересовало, и я решил узнать об этой национальности побольше. Просто так, для расширения кругозора.

Я просмотрел 380 ссылок, выданных мне Yandex’ом, но узнал совсем немного. Гагаузы — небольшой народ, проживающий, в основном, на территории Молдавии (3,5% процента за 1990 г), Украине и Российской Федерации. Общая численность на 1992 год 220 тысяч человек. Какое-то время назад активно боролись за собственную независимость, в более поздних источниках упоминается Гагаузия, значит чего-то они все-таки добились. Язык гагаузский, письменность на основе русского алфавита. Слово «гагауз» в переводе с турецкого означает «предатель» (это не по моему мнению, это компиляция из того, что мне выдал «Яндекс» в 2001 году — более позднее примечание). Что бы это значило я не знаю.

Что еще? 99% источников говорят о том, что гагаузы — православные и только сайт Ethnomuseum утверждает, что…

  • конфессиональная принадлежность: Ислам: суннизм;
  • языковая принадлежность: Алтайская семья: тюркская группа: гагаузский язык.

Правда, у меня к нему доверия мало. Татар (а я живу в Татарстане) сайт относит:

  • конфессиональная принадлежность: Христианство: католицизм, протестантизм;
  • языковая принадлежность: Индоевропейская семья; славянская группа; польский язык.

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

Больше мне ничего найти не удалось, кроме разве что того, что флаг гагаузов — изображение белой полной луны и головы волка на голубом фоне.

P.S. Просматривая информацию о гагаузах, я случайно наткнулся на список национальностей, проживающих на территории бывшего СССР. Он наверняка не полный (например, нет русских :), но все же, очень любопытный. Никому не в обиду, как вам названьица «самоеды» и «зыряне»?

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

Микромечта по Unix

Есть у меня маленькая мечта. Прикупить новый жесткий диск, старый поставить на вторую мою машину, что пылится в кладовке, поставить на нее Linux, соединить это все коаксиалом и делать все проекты исключительно дома.

Все что мне нужно от второй машины — это наличие там Apache, Perl, PHP, MySQL и PostgreSQL. Пока приходится довольствоваться одной, и при каждой переустановке Виндов, все настраивать заново. Занятие весьма утомительное. Или было таковым до вчерашнего дня.

Вчера я узнал о существовании некого проекта, поддерживаемого, как я понял, группой энтузиастов, который позволяет ставить на машину с Windows 95/98/NT/2000, Apache, PHP, Perl и MySQL при помощи одного файла setup.exe. Как я понимаю, там есть какой-то мастер для установки всего этого хозяйства быстро и без проблем. По-моему, то что нужно. Буду качать.

Обойдусь пока тем что имею. Хотя мучаться и соблюдать совместимость с Unix мне порядком поднадоело. Вот сделаю рывок и прикуплю все-таки себе новый жесткий диск.

P.S. Дистрибутив скачался, но оказался битым. :( i опять что-то напутал с множественным соединением. Жаль, но сегодня рассказать, что же это такое, уже не получится. Буду качать повторно.

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

Opera: три в одном

Вы любите многофункциональные вещи? Шампунь, бальзам и кондиционер в одном флаконе? Отвертка, плоскогубцы, нож в одном футляре? Ньюс-ридер, почтовый клиент и браузер в одном пакете? Лично мне, подобного рода вещи кажутся «недоделанными», я не люблю такие решения.

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

Недавно, запустив Opera, я вновь заинтересовался вопросом «зачем», и вспомнил одну вещь. Идея авторов Opera изготовить среду «все в одном» родилась не сегодня. В Opera есть ньюс-ридер, довольно примитивный и неудобный, есть WAP-клиент, который не открывает половину отечественных WAP-сайтов, и вот, теперь, появился такой же недоделанный ICQ.

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

Судя по всему, разработчики из Opera corp. пошли по пути расширения количества сервисов продукта, наверное надеясь, что так его будет легче продать. Напоминаю, что до 5-й версии продукт был платным и продать один, пусть даже самый навороченный и супербыстрый браузер, это совсем не то же, что продать за ту же цену HTML-браузер, WAP-браузер, news-клиент и ICQ-пейджер в одной коробке.

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

И не стоит, кстати, думать, что «бесплатная» Opera начнет в этом вопросе меняться в лучшую сторону. Почему? Потому что.

Во-первых, есть определенная инерция мышления и старые долги. Сразу в момент ничего поменяться не может.

Во-вторых, откройте глаза, люди. «Опера» не бесплатна. Если вы не заплатили 35$ или не применили определенный «довесок», вы увидите в окне браузера баннер, который будет сопровождать вас во время вашего серфинга по всемирной паутине. Это и есть ваша плата за его пользование. Что из этого следует?

Из этого следует, что ничего не изменилось.

Подпункт первый. Почему Opera не поддерживала KOI-8r? Потому что покупатели софта из нас никакие. А почему не будет поддерживать сейчас? Как почему? Какая в браузере крутится реклама? Правильно, буржуйская. А какие же из нас кликеры буржуйской рекламы? Сделали выводы?

Подпункт два. Чтобы продать побольше рекламы нужно распространить побольше копий. Вот и подумайте, что проще — распространить «пусть даже самый навороченный и супербыстрый браузер» или… Ну, вы понимаете.

Так что, увы. Opera так и останется навсегда браузером с хорошим потенциалом и кучей «шашочек». Пока что-то не изменится кардинально.

P.S. Кстати, для прикола, зайдите на opera.ru, а потом на opera.com.

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

Java и JavaScript. Близнецы или братья?

Сегодня, когда мне в триста тысяч двадцать седьмой раз сказали, что Java и JavaScript — это одно и тоже, я не выдержал, и решил высказаться со своей относительно высокой трибуны.

Господа! Java и JavaScript — языки разные, что я намерен сейчас доказать.

Большинство, в качестве защиты своей точки зрения, приводит такой аргумент, буквально: «посмотри на название, если ты не видишь сходства…» и т. д. Странная точка зрения, тем более, что это самое большинство вполне допускает, что C и C++ — языки разные. Разубеждать таких людей бесполезно, у них сформировалась своя точка зрения, менять которую они не собираются, в голове их путаница, и чтобы их еще больше запутать, я скажу, что JavaScript — это не один язык, а три. Есть JavaScript от Netscape, JavaScript от Microsoft, который еще называется JScript, и EMCAScript, который тоже является JavaScriptом. Вот эти три языка весьма похожи, хотя и не совместимы между собой полностью.

А теперь, собственно, перейдем к сути. Начнем с базового языка. Корни этих двух языков уходят куда-то в C, так что синтаксически они довольно близки. По крайней мере, что касается инструкций if, while, switch и прочих им подобных, в обоих языках записываются они одинаково. Но вот если коснуться описания функций, объектов, переменных, то тут эти языки весьма существенно различаются.

Простой пример на JavaScript:

function somefunct (s)
{
        Arr    = new Array (2)
        var k = parseInt (s) + '99'
        alert (k)
}

вопрос к знатокам Java — какая из этих строчек, исключая скобки, не вызовет ошибки в интерпретаторе? Правильно, вызовут все. Думаю, лучшего доказательства и не придумаешь. Кстати, обратите внимание: в JavaScript точка с запятой элемент необязательный и ставится лишь там, где действительно нужна (например, после пустого цикла for).

Если кто не понял, тут я создал объект типа Array и переменную k. Преобразовал s в число, а потом сложил со строкой «99». В результате, опять получил строку и при помощи alert вывел на экран. Тут я подхожу к еще одному отличию JavaScript от Java: первый язык с нестрогой типизацией данных. Переменная в разные моменты времени может хранить строку, целое или любой другой объект. Кстати, строка, число и прочие типы в JavaScript являются объектом, а «базовые» функции — методами объекта Global. Чего не скажешь о Java. Да, и кстати, вспомните о том, как выполняется конкатенация в Java. И вот, проделайте мне еще такую штуку в Java:

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

function somefunct2 (s)
{
        if (/\d+\s+/.test(s)) alert ('Ok!'); else
        s = s.replace (/(\d)/g,'\\1!')
}

99,9999% людей такое объяснение удовлетворит, а вот самые стойкие, знаю по опыту, приведут мне примеры блоков try и вызовов Java-методов из JavaScript в Netscape. Последовательно.

Блок try — catch поддерживается только JScript 5.0 и Netscape JavaScript 1.4, т. е. введение это довольно недавнее. Кроме того, этот блок имеет синтаксис отличный от принятого в Java. Наверное достаточно будет сказать о наличии у try, по крайней мере в версии от Microsoft, блока else при отсутствии finally, а так же о том, что catch возвращает специальный объект Error с двумя (в 5.5 — тремя) свойствами, что уже совсем никак не похоже на Java.

Теперь относительно вызовов Java-методов. Вызов Java-методов из JavaScript в NC называется LiveConnect и к самому языку непосредственного отношения не имеет. Пользуясь LiveConnect я, теоретически, могу вызвать Java из Flash, Flash из JavaScript, JavaScript и DOC-viewer и так далее. Для этого эта технология и предназначена. Надеюсь, это не повод мешать все перечисленное в одну кучу?

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

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

Microsoft is DEAD? А также warez

Новость дня — вся сеть Microsoft лежит в дауне. Не отвечают ни DNS-сервера, не Web-сайты, ни другие сервисы. Насколько я знаю, пока не поступило никаких комментариев от самой Microsoft, по крайней мере, мне не удалось найти ничего об этом в Интернете. Народ выдвигает предположения об атаках хакеров. Моя версия — чисто хардварные проблемы, в любом случае, правды мы все равно не узнаем. Просто интересно, как это объяснит Билл Гейтс и компания. Вот будет смешно, если никак. :)

Ну, а теперь, к менее важным новостям. MySQL 3.23 перешел в разряд стабильных. В общем-то, для меня эта новость никакая. Я давно перестал интересоваться, какую я сейчас версию качаю stable или beta, поскольку и те, и другие при пиковых нагрузках просто падают. Ничего не хочу сказать плохого об этой СУБД, у нее есть своя ниша (так же как у miniSQL — своя), но, будь моя воля, я бы с ней постарался не пересекаться. К сожалению, не получается.

А вот новость, которую я каждый раз жду с нетерпением. Вышла очередная версия программы удаленного администрирования через веб-интерфейс Webmin 0.84. Я знаю, что многие системные администраторы поморщатся при одном упоминании о программе подобного рода. Не спешите свистеть и кидаться помидорами. Во-первых, Webmin умеет работать через HTTPS — камень в огород людям, до сих пор не перешедшим с telnet на ssh. Во-вторых, подумайте. Как вам на время передать права, на администрирование, скажем, sendmail одному человеку, а Apache — другому? Да, я знаю, вы скажете: «Не проще ли, просто, завести им аккаунт в Webmin и передать каждому права на модуль»? Это отговорки. Уверяю вас, гораздо проще. Хотя мне, например, неудобно работать таким образом с Apache, а вот с Sendmail или MySQL — в самый раз.

Вот как раз открылся change log. Что у нас нового? Добавлен модуль PAM Authentication, добавлена поддержка групп в ACL-модуль, изменения в модуле DHCP, пофиксена пара багов. Качать!

А что у нас с FARом? Давненько там не был… А с Фаром у нас… хм… фаровская эха у меня не грузится.. идем на сайт… А с Фаром у нас ничего. На сайте лежит все также без движения вторая бета. Новый FAR не вышел. Зато вышел WinAMP 2.72. Причем уже давненько. Аж 10 дней назад. Хожу я туда редко, поскольку скорость выхода новых версий, после придания проекту статуса бесплатного, упала на порядки. Но все-таки интересно, что новенького. Вы не поверите, но полная версия уже разрослась до семи мегабайт!!!

Итак. Подправлен кодек и пара плагинов. Уменьшен размер WinAMP agent (а я им все равно не буду пользоваться). Пофиксены баги. Ну что же. Можно и скачать. Но семь мегабайт… Кстати, надо бы выяснить чем полная версия отличается от стандартной и «облегченной». Прямо сейчас и выясним. Итак.

Полная версия — это и так понятно. Стандартная не проигрывает Windows Media Audio и M-Juice и понятия не имеет об Exclusive Radiohead track. Впрочем, как и я. Облегченная версия, минус ко всему, представления не имеет как обращаться с MIDI и MOD-файлами и про Advanced Visual Studio придется тоже забыть. Не больно-то и хотелось. Кто как, а я качаю Lite. Ибо остальное мне как-то ни к чему.

На сегодня с меня хватит, только что докачался VNC, сейчас пойду знакомиться: Хочется узнать, что это за зверь. Всем пока! :)

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

Quake под PDA, DOOM в фотоаппарате. BSoD

LOL!!! Сейчас будете смеяться! У вас Windows 2000?

Если да, то сделайте вот что:

  • Запускаем regedit.exe
  • Переходим на KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters
  • Из меню «Edit» выбираем «New», DWORD
  • Вводим CrashOnCtrlScroll, нажимаем Enter
  • Кликаем туда мышкой и устанавливаем в «1». Нажимаем «OK»
  • Перезагружаемся

Теперь, если дважды нажать комбинацию Ctrl+Scroll Lock, система рухнет с появлением знаменитого «голубого экрана смерти» и сообщением MANUALLY_INITIATED_CRASH (0xE2). По словам тех, кто это нашел на сайте Microsoft — сделано это для разработчиков (наверное, чтобы «не забыли» как выглядит экран смерти aka BSoD :).

Pocket Quake

Сегодня, определенно, день смеха… Slashdot (устами DZ-online) сообщает о выходе карманного Quake. Точнее, Quake под PDA, а еще точнее — под Compaq iPaq (OC — Windows CE). Называется это чудо Pocket Quake и, по скриншотам, выглядит как первый Doom.

Проект все еще в стадии доработки (текущая версия — 0.02 alpha), и когда выйдет первая версия, пока неясно. Остается надеяться, что это не очередной fake. В любом случае, на сайте доступны два файла, общим объемом примерно в 9 мегабайт для скачивания, так что владельцам iPaq стоит на это посмотреть.

P.S. Кстати, для интереса я скачал оба файла. В первом действительно лежит PocketQuake.exe, readme.txt и файл конфигурации. Во втором — pack0.pak. Так что, по крайней мере, с виду, все честно.

P.P.S. На том же DZ, основываясь на анализе цвета, Завалишин сделал вывод, что все это — надувательство. Может быть, а может быть и нет. Есть же Doom под фотоаппарат Kodak DC-290, почему бы не быть Quake под PDA от Compaq?

Doom
Doom

Кстати, о Doom’e и Kodak DC-290. Я всерьез заинтересовался, что это за фотоаппарат такой, и что он, собственно, умеет. Для начала цена. Купить это чудо, по уверению Price.Ru, можно уже за 670 американских рублей. Странно, я думал, что оно будет стоить пару тысяч. 2.1 мегапиксельный сенсор, 1792×1200. Режим сохранения несжатых кадров, поддержка внешней вспышки, ну и прочее. Мне это не интересно, профи смогут ознакомиться с полной информацией, кликнув по ссылке.

Сзади фотоаппарата располагается прямоугольное окошко, где вы сможете просмотреть отснятое, покопаться в полноцветном меню или… а вот тут самое интересное. DC-290 имеет собственную операционную систему (Digita OS), которая умеет, помимо отображения упомянутого меню, выполнять скрипты и бинарные программки, а их, в формате CAM, можно писать… да на том же GNU C. И люди пишут! На упомянутом сайте, помимо DOOM’a, я нашел MP3 player, Mame (что-то вроде Paсman), Mess (ходилка), BombSweeper (минер), Sokoban, BoulderSmash и Multipac. Наверняка стоит поискать — и найдутся другие программки. Кстати, помимо DC-290, DigitaOS ставится еще и на DC-220, 260, 265, Minolta Dimage 1500 EX, 1500 3D, HP C500 Photosmart, C618 Photosmart, C912 Photosmart, PENTAX EI-200 и EI-2000.

Теперь, интересующие меня, технические характеристики. Kodak DC-290 обладает процессором 66 Mhz PowerPC MPC823, joypad’ом, цветным LCD-экраном 288×216, 6Mb памяти и возможностью воспроизводить звук (11Hhz). Что для фотоаппарата совсем неплохо. А самый производительный (HP C912) имеет на борту 90MHz Coldfire, 16Mb RAM и joypad. Плюс звук. Правда никакой. Так что, если кто-то вам скажет, что программирует для фотоаппарата, не спешите звонить «03»… может так оно и есть… :)

Видеочасы

Судя по всему, есть тенденция встраивать операционные системы во все, что имеет экран. Наверное, очередь за часами. Вот сверху часы — видеотелефон (фото с Вебтилятора). Подождем когда… :) По-моему, это явление — временное, до появления чего-то (про BlueTooth слышали?) объединяющего всю эту мешанину из портативных устройств в одно большое, легко модифицируемое нечто. Тогда каждая часть будет заниматься своим делом. Экран — отображать, наушники на голове — наушничать, проц — работать, накопитель — накоплять, сотовый телефон — держать связь и так далее.

Надеюсь BlueTooth пробьет себе дорогу. Это, если кто-то не знает, «технология радиосвязи ближнего диапазона (до 10 м), разработанная консорциумом Bluetooth Special Interest Group, в состав которого вошли компании Ericsson, IBM, Intel, Nokia и Toshiba. Bluetooth — это открытый стандарт по передаче на короткие расстояния голоса и данных между мобильными и настольными устройствами. Уже появилось большое количество устройств, поддерживающих этот стандарт и в скором времени их количество увеличится. Можно прогнозировать, что в течение года эта технология станет доминирующей в своем сегменте.».

Так вот.

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

Микрософт жива. mod_cgisock, JScript и CK-22B6

Для начала, о событии, так меня заинтересовавшем в позапрошлом выпуске. Вчера на ZDNet.com я, наконец-то, смог прочитать, что же, все-таки, случилось в сетевом хозяйстве Майкрософт.

Оказывается, во всем был виноват (а я был в чем-то прав!) плохой дядя Роутер. Именно он содержал «configuration error» и оставлял запросы к внутренней сети компании «unanswered». Целый день. Вот такой бяка этот роутер. Там еще много чего написано, любопытствующих отсылаю к источнику.

Веб-мастера, имеющие отношение к Apache, знают что такое Fast CGI. Если не вдаваться в подробности — это метод, позволяющий держать CGIs сразу в памяти и выполнять их по мере необходимости.

А теперь скажите мне, что такое mod_cgisock. Так вот, это модуль Apache, который предоставляет возможность работать с CGI через обычные юниксовые сокеты. CGI в этом случае пишется на языке, способном работать с сокетами, и, насколько я понимаю, выступает в роли сервера, обслуживающего запросы Apache. Утверждается, что такой способ позволяет существенно экономить память и выполнять приложения гораздо быстрее.

Весьма любопытно, тем более, что слышу я об этом впервые, но для PHP (а он у меня скомпилирован как модуль), который мне в последнее время так полюбился, абсолютно бесполезно. :)

Есть у меня телевизор Samsung CK-22B6SR. Локализация выполнена довольно странным способом. Многие не замечают или не обращают внимания, но факт — при нажатии на кнопку «меню», это самое меню появляется сначала на английском языке, а уже потом затирается и пишется локалью (в моем случае — по-русски). Лично мне это не мешает, тем более, что все это едва заметно на глаз, но интересно — что помешало выполнить локализацию нормально, не прибегая к таким кривохитрым ходам?

Кстати, загляните на сайт Самсунг. Там, у телевизора есть забавная характеристика — кривизна экрана… Я долго смеялся. Тем, кто юмора не понял, объяснять ничего не буду. Не способен. :)

Маленькое продолжение темы недокументированных возможностей. На этот раз порадовал Microsoft Internet Explorer 5.0 и 5.5. Случайно обнаружил, что в JScript интерпретаторе этого браузера есть две, нигде не описанные, но, тем не менее, судя по всему, прекрасно работающие фичи.

Во-первых, это константа условной компиляции @_microsoft, имеющая значение true. Фича, абсолютно пока бесполезная, но интересная самим фактом своего существования. Возможно, не за горами времена, когда она примет значение false.

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

А на сегодня это все. :)

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

Наши браузеры. Какие они?

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

Internet Explorer

Explorer. Внешний вид

Начну я со своего любимого браузера — детища фирмы Microsoft. Internet Explorer (текущая версия — 5.5SP1) — пожалуй самый навороченный браузер из всех нижеописанных. Выпускается под Windows, Mac, я так же слышал о версиях под Unix.

Из стандартов поддерживает: HTML 4.0, со своими расширениями; CSS 1, (почти полностью) CSS 2, плюс специальные эффекты — фильтры; DirectAnimation; VML (векторный язык); VRML; JScript (как составляющую — JavaScript и ECMAScript); W3C DOM; VBScript; XML; ActiveX; Java; динамическое связывание в HTML; behaviors и многое другое.

В данный момент — это самый популярный браузер в российском Интернете, его доля составляет около 70%—80%, по данным SpyLog. Что, в общем-то, неудивительно — с момента появления версии 4.0 и до определенного времени серьезных конкурентов у него не было. Обладает огромным набором очень ценных для Веб-мастера возможностей, которые, к сожалению, не поддерживаются другими браузерами, так что используются они, в основном, в интранете.

Netscape 4

Netscape. Внешний вид

Точнее Netscape 4. Выпускается одноименной компанией, текущая версия — 4.75. В прошлом — основной конкурент Explorer, ныне — отмирающая тупиковая ветвь. Совокупная с Netscape 6 доля, по данным SpyLog, — примерно 9—19%. Выпускается под Windows, Unix и Mac.

Сейчас уже практически не развивается, хотя время от времени появляются новые версии с незначительными или некому не нужными (типа добавления к пакету WinAmp) изменениями. Поддерживает HTML 3.2, со своими расширениями; частично CSS1 и CSS2; Java; VRML; JavaScript (в его рамках — EMCAScript). Браузер расширяется в основном за счет так называемых «плагинов» — модулей расширений от сторонних производителей. Был любим среди пользователей Unix, как практически единственный графический браузер в этой среде.

Кстати, о версии HTML. HTML 4.0 не поддерживается этим браузером. Достаточно взглянуть на стандарт от W3C, что бы это понять.

Netscape 6

Netscape6. Внешний вид.

Надежда всех любителей браузеров от Netscape. Время показало, что ожидания оказались напрасными. Релиз оказался на удивление сырым и с массой глюков.

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

Отличительная его особенность — браузер позволяет менять свой внешний вид, т. е. устанавливать так называемые скины. Эта способность, как и новой Мозилле, досталась ему от Netscape 5, так называемом Gecko, который в чистом виде в уже природе не встречается.

Mozilla

Mozilla. Внешний вид

Текущая версия — 0.7. По внешнему виду — брат-близнец Netscape 6, поскольку отпочковался от одной из ранних версий Netscape 5. Нет, это не тот самый Mozilla, на коде которого основаны Explorer и Netscape 4, это совсем другой браузер. Выпускается под Windows, Unix, Mac, планируется портирование под BeOS, Rhapsody и OS/2.

О его доле я сказать ничего не могу, но проект, в последнее время (а ему уже 3 года), стал очень динамично развиваться и стремительно завоевывать сердца и мониторы пользователей Unix. Эта хорошая альтернатива, для противников продуктов от Microsoft, морально устаревшему Netscape 4. Насколько я знаю, поддерживает HTML 4.0, CSS 1, частично CSS 2, EMCAScript, W3C DOM, частично DOM II, XML, Java, есть экспериментальная поддержка ActiveX.

Lynx

Lynx. Внешний вид.

Этот браузер в данном ряду необычен тем, что он полностью текстовый. Текущая версия — 2.8.3. Выпускается под Unix, Windows, VMS, DOS, OS/2 и Mac. Процент его использования невелик — порядка одной десятой процента, используется, в основном, под текстовой консолью Unix и распространяется вместе операционными системами этого типа, чем и жив.

Поддерживает HTML в рамках разумного. Т. е. практически все, что можно реализовать в текстовом режиме, в нем реализовано. Поддержки CSS, скриптовых языков и XML нет. Зато, в силу невеликих возможностей браузера, за все время существования была найдена только одна дыра в безопасности. :) Вот и все, что можно о нем сказать.

Opera

Opera. Внешний вид

Очень хороший браузер. Быстрый, относительно легкий. Урезанный дистрибутив умещается на одной дискете. Текущая версия для Windows — 5.02. Выпускается для платформ Windows, EPOC, Unix, Mac и BeOS.

Его доля близка к одному проценту, браузер еще относительно молодой. Жаль, только его создатели так увлеклись накручиванием «шашечек». Но, не смотря на это, Opera — потенциально, довольно серьезный конкурент MSIE и Mozilla.

Из возможностей — поддержка HTML 4.01 с собственными расширениями, CSS 1,2 (по-моему наиболее полная), плагинов от Netscape, Java, EMCAScript, XML, частично — DOM. Что интересно — поддерживается WAP (WML). Отличительная особенность — высокая скорость отрисовки и получения контента.

***

P.S. Я не включил в обзор экспериментальные браузеры (например Arena) и браузеры, не получившие широкого распространения. Их время еще не пришло или не придет никогда. В любом случае, пока серьезно я их не воспринимаю. Докажите мне, что я ошибаюсь и я охотно помещу здесь описание любого из них. :)

P.P.S. Спасибо моему другу, Сергею Шишкину, за время, потраченное на попытки сделать скриншот с Mozilla. К сожалению, я так и не смог его забрать.

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

CollectGarbage. И все-таки она работает!

Сегодня я решился все-таки выяснить, работает ли, найденная мной в MSIE, недокументированная функция CollectGarbage(). Я довольно долго размышлял, как бы мне это сделать, поскольку был уверен в наличии у интерпретаторов JavaScript автоматического сборщика мусора. «Стоит мне удалить объект» — размышлял я — «и сборщик мусора тут же освободит память. Я ничего не смогу проверить».

Монитор. Расход памяти

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

Скажу сразу — функция работает! Но самое интересное не это. Оказалось, что если в MSIE (ровно, как и в Netscape, позднее я повторил эксперимент и под ним тоже) и есть сборщик мусора, то он очень неторопливый. В одном из экспериментов я прождал около 20 минут, прежде чем мое терпение кончилось!

Более того, если нажать «Create» несколько раз подряд, то память будет выделяться после каждого раза. То есть в программах на JavaScript, постоянно создающих структуры большого объема, вызов этой функции жизненно необходим! Я, например, сегодня же выпущу новую версию JUnix с демоном сборки мусора. К сожалению, как я не старался, мне не удалось найти ничего похожего в версии JavaScript от Netscape. Так что вопрос об высвобождении памяти под этим браузером остается открытым.

Демонстрационный пример:

<SCRIPT>
function Create()
{
        Arr = new Array ()
        for (i = 0; i&lt;100000; i++)
        Arr[i] = '01234567890123456789012345678901234567890'+
        '12345678901234567890123456789012345678901234567890'+
        '12345678901234567890123456789012345678901234567890'+
        '12345678901234567890123456789012345678901234567890123456789'
}

function Drop()
{
        delete Arr
}

function Collect()
{
        CollectGarbage()
}
</SCRIPT>
<BODY>
<FORM>
<INPUT TYPE=BUTTON onClick="Create()" VALUE=Create>
<INPUT TYPE=BUTTON onClick="Drop()" VALUE=Drop>
<INPUT TYPE=BUTTON onClick="Collect()" VALUE=Collect>
</FORM>
</BODY>

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

JavaScript: Недосказанное Нетскейпом

Не оставляя надежду найти аналог CollectGarbage в Netscape, я сегодня расковырял интерпретатор JavaScript’а своего браузера на предмет наличия всего недокументированного. Ковырять вручную было лениво и я сначала написал небольшую программку, вычесывающую все текстовое из файла, на Перле, а потом небольшой скриптик под JUnix, который проверил, что из найденного относится к JavaScript. Ничего похожего на вызов сборщика мусора я так и не нашел, зато нашел кое-что другое. Результатами хочу поделиться.

Script(string) — создает кусок JavaScript-кода, который можно вызвать как обычную функцию. Разница между этим конструктором и Function заключается в том, что из кода, созданного конструктором Script, нельзя получить доступ к arguments и прочим свойствам и методам, специфическим для функций.

Пример использования Script:

AX      = new Script ("alert('TEST')")
AX      ()                      // Нaпечатает "TEST"

Call() — создает пустой объект типа Window. Практической пользы маловато, но, как это можно применить я могу придумать.

Пример того, что можно сделать с Call:

AX      = window
AX.BX   = "TEST"
alert (window.BX)                       // Напечатает "TEST"

window.BX = "TEST1"
AX      = new Call()
AX.BX   = window.BX
window.BX = "TEST2"
alert (AX.BX)                   // Напечатает "TEST2"

AX.open = window.open
AX.open ("about:blank")         // Откроет новое окно

BX      = {}
BX.open = window.open
BX.open ("about:blank")         // Вызовет ошибку

With(object) — достаточно странная функция. Копирует объект на новое место. Конструктор не вызывается, операция сравнения без приведения утверждает, что был создан новый объект, но изменения в одном экземпляре вызывают изменения в другом. Вообще-то, можно ее вызвать, как конструктор без параметров, в этом случае она создаст объект типа Object.

Пример вызова функции With:

function probe ()
{
        alert ('Create.')
        this.let = let
        this.val = val
}

function let (n)
{
        this.val = n
}

AX      = new probe()           // Напечатает "Create"
BX      = AX
alert   (AX===BX)                       // Напечатает "true"

BX      = With (AX)
BX.let  ("TEST")
alert   (AX.val)                        // Напечатает "TEST"
alert   (AX===BX)                       // Напечатает "false"

Closure(function_object) — очень похожа на With, но с парой отличий. Во-первых, Closure работает только с объектами Function, а во-вторых, ее можно вызвать как конструктор. И вот тут начинается самое странное. Внимание на пример.

Пример вызова функции и конструктора Closure:

function let (n)
{
        this.val = n
}

Function.prototype.let = let
AX      = new Function ("","")

BX      = AX
alert   (AX===BX)                       // "true". Объекты одинаковые.
AX.let  ("TEST1")
alert   (BX.val)                        // "TEST1". И это логично.

BX      = Closure (AX)
alert   (AX===BX)                       // "false". Объекты разные.
AX.let  ("OTHER")
alert   (BX.val)                        // "TEST2". И это тоже логично.

BX      = new Closure (AX)
alert   (AX===BX)                       // "false". Объекты разные.
AX.let  ("TEST2")
alert   (BX.val)                        // "TEST2". И это странно.

Arguments(объект) — в принципе можно применять для дублирования массива аргументов. Если применить как функцию, а не как конструктор, то Netscape может обидится и сказать GPF. А вообще во время экспериментов с этим объектом мой NC 4.7 падал настолько часто, что можно сказать — это его больное место, трогать которое не рекомендуется.

Пример вызова конструктора Arguments:

AX      = new Function ("", "return new Arguments(arguments)")
alert   (AX("TEST1").length)            // "1"
alert   (AX("TEST1","TEST2").length)    // "2"

Желающим испытать свое терпение и способности к обобщению, предлагается выяснить, какие функции несет каждый объект, свойство или метод из списка: __count__, __parent__, __proto__, __name__, __length__, __arity__, __call__, __caller__, __callee__. Кое-что совсем очевидно, но кое с чем придется серьезно помучиться. :))

Мое мнение — все, что я накопал, это усы от внутренней объектной модели браузера. Результат попытки упихать все, что только возможно, в объекты.

P.S. Мучал я Netscape версии 4.7. Как нибудь, надеюсь, руки дойдут до чего-нибудь более современного. Кстати, было бы интересно рассмотреть все эти, вырванные с мясом куски, на предмет дыр в безопасности и crash code.

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

Warez. WinAmp3a2, Opera 5.02, WinRAR 2.8b4

Интерфейс программы для редактирования аудио: слева список треков, справа панель управления с таймером, эквалайзером и кнопками воспроизведения.
WinAMP3alpha2. Внешний вид

Хе-хе… Оказывается фирме, выпускающей WinAMP, надоело выпускать версии с двойкой. Ничего никому не сказав, они начали, в тайне от всех, разрабатывать WinAMP версии три. На скриншоте, честно передранном с сайта «Правый щелчок», вы можете видеть альфа-2-версию этого монстра. Судя по обилию «шашочек» на пресловутом скриншоте, нас ждет скачкообразное увеличение дистрибутива еще на порядок. Вот сейчас сижу и думаю — а оно мне надо?

P.S. Подробности — на сайте «Правый щелчок».

Пока Фар-тим всей огромной командой выпускает раз в полгода по бете, великий Евгений Рошаль, в одиночку, неустанно выпускает вот уже четвертую бету своего WinRAR’a. Пофиксены пара проблем в SFX-модуле, исправлена пара-тройка багов. Ничего особенного, но, если вы, как и я, пользуетесь бета-версиями — качайте.

Мультяшный белый кролик в зелёной футболке с белым кругом и зелёной стрелкой вверх, стоящий на жёлтых лапках.
Птичка. Эмблема Парсера

Сайт «Парсера» студии Лебедева растет и пухнет. Парсер обзавелся довольно симпатичной эмблемой, со времени моего последнего появления появились разделы «FAQ», «жаргон», «в действии» и «куда говорить». Вообще-то развитие сайта закономерно, даже если на него снаружи никто не будет ходить. Почему? Парсер активно используется студией и на этот сайт, в случае затруднений, можно отправлять своих собственных сотрудников. Это что-то вроде красиво оформленной документации, выложенной на всеобщее обозрение.

Вообще, я думаю, любая более или менее крупная фирма, занимающаяся разработкой Веб-сайтов, рано или поздно обзаводится сайтом или местом, где свалена в кучу или красиво разложена по полочкам какая-то документация, необходимая для повседневной работы сотрудников. У нас, например, там лежит документация по Perl, PHP, JavaScript, HTML, mSQL, MySQL, PostgreSQL, ну и так далее. Если у вас ничего подобного нет — очень советую завести.

Фирма Opera буквально на днях порадовала нас выходом новой подверсии своего одноименного браузера. В списке «WhatsNew» 5.02 в основном «шашечки»: изменения в мыль-клиенте, Instant Messaging, File Transfer и прочее. Список довольно обширный, но изменения мелкие. Из «ехать» имеются: оптимизация использования памяти, обновления в opera.jar и модели безопасности JavaScript. Как сказано в конце этого документа, «имеется куча обновлений, исправлений и добавлений слишком мелких для упоминания». Я скачаю.

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

Китайское 404, taint в JavaScript, NewOrder и NoNaMe

Сообщение об ошибке HTTP 404: «404 не найдено», с пояснением, что сервер не может найти запрошенный файл или команду, и рекомендацией проверить URL или обратиться к администратору.
Ошибка 404 по-китайски

Вы когда нибудь видели «ошибку 404» (страница не найдена), написанную по-китайски? Я до этого момента — никогда. А вот сегодня увидел. Увиденное меня так поразило, что я тут же решил поделиться этим c вами. :) Красота-то какая! :)

Если просмотреть все сообщения о дырах, найденных в браузерах, за последние пару лет, то видно, что большинство, своим наличием, обязано факту поддержки браузером JavaScript. Почему так сложно сделать защищенный интерпретатор мне не ясно.

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

Никакое «внутреннее» значение не может быть присвоено объекту с флагом «внешний». За этим следит строгая, но справедливая система безопасности. Других ограничений нет. Таким образом, буфер обмена получает статус «внутренний», объект location и методы, позволяющие передать информацию во внешний мир (open, replace и т. д.), становятся «внешними», а вот свойства объекта navigator никакого особого статуса не заслуживают.

Единственная сложность — решить к какому классу отнести информацию, полученную от «сторонних» источников — Java-апплетов, приложений ActiveX и проч. Я бы отнес их к классу «внутренних» объектов. Передавать информацию от них во внешний мир через JavaScript я нужды не вижу. Если их собственная система безопасности это позволит, то они прекрасно справятся с этой задачей сами.

По-моему, такой метод разделения объектов на «своих» и «чужих» уже где-то использовался, но я, честно говоря, не помню где, а может я и ошибаюсь. Как бы то ни было, думаю, что в JavaScript он вполне к месту.

Скриншот веб-страницы сайта dvd.box.sk с заголовком «new order» и ссылками на новости, статьи и ресурсы по музыке New Order.
Сайт NewOrder. Screenshot

Сегодня, в который раз обращаясь за помощью к Astalavita, я нашел там ссылку на сайт, услугами которого я теперь намерен пользоваться достаточно часто. Речь идет о сайте «NewOrder» (наверное можно перевести, как «Новый Порядок» :). Это обширный и, судя по всему, обновляемый довольно часто, каталог всего того, что может понадобится любому человеку, который тесно общается с компьютерной техникой.

Думаю, разделы скажут сами за себя: «Security», «Privacy», «Virii», «Exploits», ну и так далее. Информации и программ очень много, ценно, что все это, вот так вот, собрано в одном месте и разложено по полочкам. На сайте публикуются новости из мира хака, проводятся голосования, есть форумы. Теперь о ложке дегтя (хотя лично для меня она — чайная) — все это на _английском_. Надеюсь, вы ничего другого и не ожидали.

Скриншот веб-интерфейса с заголовком «ДОСААФ» и таблицей данных в центре экрана, вероятно, из архивного сайта или базы знаний организации.
Сайт NoNaMe. Screenshot

Людям, в силу каких-то причин, читающим только по-русски, я бы порекомендовал посетить сайт «NoNaMe». Направленность — warez, mp3, видео и прочее (о направленности этого самого «прочего» говорит домен сайта — cracks.ru). Момент его появления я пропустил, но, по всему видно, что сайт еще достаточно молодой, но уже очень интересный своим содержанием.

Я, например, уже обзавелся «довеском» к Win 2.80b4, скачанным по ссылке с этого сайта и узнал, что сайт LevelZero, следы которого оборвались на закрытом, с недавних пор, lz.knet.ru, оказывается переехал на другой адрес. Так что очень рекомендую посетить.

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

← сюда туда →