From Novosibirsk, Russia? Our tiny company is looking for current or future rock-star developers.

December 31, 2006

On the news

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

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

Даже не будем рассуждать о том, что казнь за убийство 148 человек, после которой в вызванных ею террактах погибло уже 80, — смешно. Весь судебный процесс был смешон. Собственно, Хуссейн добился своего — он держался лучше своих судей. «Враги вашей страны стремятся посеять между вами ненависть. Не дайте им разделить вас. Да здравствует джихад и священная война против оккупантов».

Радует только правильное отношение ко всему этому МИД России.

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

December 30, 2006

Nokia mobiles and the oldnewthing

У меня временно изменился номер, теперь это +7 906 193 2959. Старый телефон вместе с SIM-картой у меня стащили, взамен был куплен Nokia 5300. Я могу сказать, что Nokia сделала большой шаг вперёд в интерфейсах; он понравился мне больше, чем Sony Ericsson моей супруги (а Sony Ericsson сейчас являют собой стандарт качественных интерфейсов).

Пусть это просто реализуется, но всё равно автоматическая транслитерация чего-либо меня всегда поражает. Сначала это был Mac, транслитерирующий имя пользоватя для получения Unix-имени. Теперь это делает телефон. Когда вводишь имя в адресную книгу, он траслитерирует его на английский язык, синтезирует его звучание и добавляет в качестве голосовой команды. В результате голосовой ввод оказывается действительно полезным out of the box.

Еще у Nokia хорошо сделаны калькулятор, адресная книга, будильник и ввод SMS. (Мелкие нарекания есть: при вводе SMS неудобно переключается язык, а отображение контактов по группам должен иметь более простой доступ.) Это ровно то, на что я смотрю, чтобы составить впечатление об интерфейсе телефона.

Проведя пеар блогов Реймонда Чена (oldnewthing) и Скота Адамса (The Dilbert Blog), я обнаружил в списке декабрьских ссылок первого, что он с удовольствием читает второго. Сколько там знакомых в среднем связывают любых двух людей на планете? Мне кажется, если считать знакомства в блогосфере, это число уменьшится раза в полтора.

Прочитал про Google Santa Tracker (вживую смотреть было лень). Мне кажется, детей, использующих Google Earth для наблюдением за Санта-Клаусом, нам как раз не хватало для полной техногенности общества. В положительном, наверное, смысле, то есть техногенность — это здорово. Скоро ли появится Google Fairy Taler?

С Новым Годом вас, дорогие друзья!

December 23, 2006

Separation of content and presentation

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

Если вы бы сейчас увидели, что я качаю в P2P, вы бы никогда со мной больше не заговорили. Например, великое творчество Димы Билана. Всё потому, что среди наших тесных рядов затясалось несколько любителей попсы, а музыку к конторскому новогоднему празднику готовлю я.

Обсуждая с одним знакомым музыку, мы выяснили причину holy wars. Действительно, невозможно представить себе разработчиков нашей компанией за горячим спором «C++ против Java», ибо тему все понимают. В мировой же музыке разбираются далеко не все. (Впрочем, иногда holy wars вызываются и другими факторами, например, различием в опыте. Но в любом случае, несомненно, что единственно правильную точку зрения будет иметь мифический человек с бесконечным опытом.)

Про вёрстку с помощью CSS и отделение содержимого от представления. Недавно придумали с товарищем пример для подражания:

<div id="border_2px_solid_black">
<div id="text_align_center" class="f6f6f6">
Hello, world!
</div>
</div>

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

December 16, 2006

Notable events and December's blog of the month

За прошедшее время произошло несколько важных событий.

Мы стали или скоро станем авторами самых серьёзных средств разработки для Tcl (стали), Python (скоро) и Ruby (на горизонте). Открытый проект Dynamic Languages Toolkit нашей компании принят в состав eclipse.org. Сейчас ознакомиться с ним можно на www.eclipsedltk.org, но скоро мы переезжаем.

Вы можете добавить в DLTK свой любимый язык; мы окажем вам необходимую помощь и поддержку. Где любители Lisp и Haskel?

Доклад про Dynamic Languages Toolkit принят на EclipseCon 2007, а значит, нас (в том числе и меня как докладчика) ждут в марте 2007 года в Калифорнии. Надеюсь, мы там окажемся.

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

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

Ничего принципиально нового, но мои писательские привычки изменились напрочь. Все посты в блог сначала пишутся во WriteRoom. Интересные мысли накапливаются там же. Я в принципе стал больше писать.

Если вы сидите под Windows, на сайте дают ссылку на некий клон — Dark Room.

Наконец, воспользуюсь случаем, дабы выбрать блог этого месяца. Это совместный проект Kathy Sierra и Dan Russel под названием Creating Passionate Users. Обязательное чтение для всех, занимающихся разработкой программ и/или проектированием интерфейсов пользователя. Каждая из редко появляющихся статей — шедевр.

Недавно я узнал, что в создании известного стодолларового ноутбука принимал участие Alan Kay. Человек, работавший в Xerox PARC и Apple, один из создателей объектно-ориентированного программирования. Его видеолекцию по пользовательским интерфейсам (1987 года) я с большим удовольствием посмотрел и всем рекомендую (могу записать на CD).

December 10, 2006

New Year is coming

Mozilla красиво компилируется под Scorpions, почти попадая в ритм. Приятно засесть в пустом офисе на выходных и поразбираться с давно накопившимися делами. Правда, собрать нужный мне билд так и не получилось. Наивный Калугин обещал сделать это на спор; он еще не знает, что требуется отлаживать make-файлы в системе сборки.

Есть здесь еще желающие на спор собрать XULRunner из CVS HEAD под Win32? Tinderbox говорит, что собирается… oops, то есть Tinderbox говорил, что под Win32 оно собирается (тогда как под Linux и MacOS сборка горела синем пламенем). Теперь Win32 оттуда вообще убрали. И под Linux сборка всё еще сломана. Господа, XULRunner пока что есть только под Mac! Жаль, что как раз под ним он не доделан и нам не годится.

Заказал кучу книг по Web-дизайну. Быть может, я всё-таки разберусь с CSS.

Подрос мини-учебник по Си++, который я начинал когда-то писать к экзамену по объектно-ориентированному программированию и выложил на ru.wikibooks.org. Не моими стараниями, но мой стиль во многом сохранён. Приятно!

В канун Нового Года xored software превратилась в заговорщеческую контору. Все что-то втайне друг от друга планируют, собирают компромат и шифруются.

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

Я живо представил себе, как одним из лишних проводов подключен спрятанный в углу Jumper (Parkan!..), а второй где-то внутри общего месива уходит в другое измерение. Вот почему у нас такие странные админы. Задачей первого, видимо, было перебросить энергию в то самое другое измерение, а второй вообще спустился на Землю исключительно в поисках Jumper’а.

December 04, 2006

CVS vs. SVN

(Про историю и возможности CVS и Subversion написано в Wikipedia.)

Относительно CVS/SVN меня спрашивали за последнее время уже раза три, поэтому ниже изложено мое мнение по поводу source control в общем.

Первое. Если на сохранение версий исходных кодов есть время и не жалко сил, я бы посмотрел в сторону нетрадиционных бесплатных систем контроля версий. Например, darcs. (Но есть и множество других. Если вам правда хочется хранение истории видеть частью программистского искусства, не запрещается даже написать свою систему, как Линус Торвальдс. Уж по крайней мере стоит рассмотреть все имеющиеся варианты.)

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

Второе. Если вам нужно просто хранить историю версий для большого настоящего проекта со сроками и всеми делами, я бы выбрал CVS. Причина проста и банальна. Если в репозитории случится беда (а она хотя бы раз в год случается), в него можно залезть и поправить всё руками. Руками же можно перенести часть репозитория в другое место, исправить проблему в рабочей копии и т. п.

В сторону Subversion смотреть можно. Однако она ещё крайне молода. Стоит копнуть чуть глубже, например, в сторону нетривиальной настройки прав доступа или перемещений между репозиториями, как всё оборачивается печально. Кроме того, интеграция Subversion с, например, Eclipse чуть хуже, чем интеграция CVS.

У Subversion по сравнению с CVS есть три преимущества.

Первое — атомарные коммиты. Действительно хорошо, однако жить можно и без них. (Пару недель назад двое товарищей по работе начали коммитить в один и тот же репозиторий CVS одновременно. Получилась картина «две змеи, поедающие друг друга». У каждого процесс остановился посередине из-за конфликтов. Но ничего, справились.)

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

Третье — хранение метаданных. Однако метаданные нужны редко. Встроенные навороты вроде svn:external работают плохо. Другое дело, если у вас есть сторонние утилиты, интегрирующиеся с SVN при помощи свойств.

(Есть также мнение, что Subversion на больших проектах медленно работает, но я не поверю, пока не увижу сам.)

Сравнение возможностей разных систем управления версиями можно найти на Wikipedia.

November 27, 2006

November's blog of the month

Вчера я провёл небольшой соцопрос на тему «Что бы вы сделали с Дебеловым, оказавшись с ним на необитаемом острове без свидетелей?» Я, конечно, не удивлён жестокостью ответов, но вот я бы подарил ему цветок. От написания последней задачи я получил массу удовольствия. Надеюсь, с OpenGL будет так же. (Конечно, частично удовольствие состояло в приятной компании, но и не только.)

И еще я бы поблагодарил Apple за переносной компьютер, пользоваться которым каждый день — сказка. Даже при том, что у него всего 512 Мб памяти (разделяемой с видеокартой) и оттого он тормозит не по-детски на девелоперских и продвинутых применениях.

Ах, да. Настала пора выбрать blog of the month ноября. Им однозначно становится никак не связанный с программированием The Dilbert Blog. В качестве featured article предлагаю всего одну: «Optimist Cures Unhappiness – Wins Some Sort of Prize». Подписывайтесь и читайте, это здорово.

November 25, 2006

Long live xored software

Сегодня отмечалось двухлетие нашей замечательной компании. У нас вечно бардак с сетью, очень старый сайт, давно требующий обновления, и наработки, требующие раскручивания. Но зато у нас работают замечательные люди, с которыми не страшно реализовывать большие планы. (Только вот админа настоящего нет. Не нашли. Пока. Людей, кстати, у нас всё больше, и, если вы знаете очень клёвых программистов, администраторов, дизайнеров или технических писателей, мы бы тоже хотели с ними познакомиться.)

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

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

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

November 20, 2006

Google Reader shared items

Объявление. Я регулярно расшариваю самые-самые стоящие прочтения (программистами) чужие посты на страничке http://www.google.com/reader/shared/06895634140771009329. (Там есть и RSS, это от Google Reader'а.)

October 28, 2006

Declarative does not mean XML

«Декларативный» часто означает «описанный в XML». (Сам XML здесь не принципиален, вместо него можно подставить YAML, ini или любой другой приходящий в голову формат.) Многие люди стали считать, что это обязательное условие, но при этом они упускают из вида феномен под названием DSL.

Декларативность — это стиль описания, а не его формат. Вы можете вызывать набор методов из функции на Java и называть это декларативным описанием. Фактически, многие использования паттерна Builder подходят под это название.

У декларативных описаний внутри кода есть много преимуществ. Их проще реализовать, проще понять, они лучше поддерживаются рефакторингом и в целом больше соответствуют использованию «наиболее простого из подходящих решений». KISS!

October 20, 2006

Just-buzz

Интересно, сколько всё-таки людей читают мой блог? Если вы прочли эту запись, пожалуйста, отправьте мне по почте письмо или сообщите каким-либо другим способом. Через пару неделек подведём итоги.

Я определился с тем, что функция комментирования в моём блоге излишня (в силу разных причин — главным образом, интересная информация в комментариях до читателей всё равно не доходит, зато бесполезная плодится). Помимо прочего, по крайней мере некоторые люди любят оставлять комментарии, вообще никак не подписываясь, что я не считаю признаком особо хорошего тона. Так или иначе, комментарии отключены. Рад буду услышать ваше мнение и обсудить любые мои публикации по электронной почте: andreyvit@gmail.com. (В обмен обязуюсь не сохранять ваш адрес электронной почты в каких-либо адресных книгах, куда могут добраться вирусы и прочая гадость.) Об интересных дискуссиях я, конечно, тоже расскажу на страницах этого блога.

Из новостей: вчера посмотрел фильм Забриски Пойнт, который давно искал. Ура! Теперь хочу все остальные фильмы того же режиссёра.

Наконец, заголовки постов написаны по-английски, ибо это единственный способ получить здесь красивые URL. Увы.

October 17, 2006

Less time than none

Ко мне приезжали родители на пару недель. Безусловно, было очень приятно. Но (свободного от крайне срочных дел) времени даже не то, чтобы не было, его как будто бы было отрицательное количество. Сейчас вспоминал, какое же длинное-длинное сумасшествие (с кульминацией в виде написания графики на протяжении двух ночей) недавно закончилось, и понял, что его положено описать фразой «а у меня были в гостях родители».

Но всё равно здорово, пусть приезжают ещё. :)

October 13, 2006

October's blog of the month

В качестве нового начинания, которое, надеюсь, приживётся, предлагается «блог месяца».

Итак. Если вы ещё не читаете блог Реймонда Чена, но при этом интересуетесь программированием, обязательно подписывайтесь. Сейчас Рэймонд работает в Microsoft, но:

Before his career at Microsoft and lasting even into 1995, Raymond Chen identified himself as "just another Linux hacker" in his Usenet sig. He is listed in the Linux kernel CREDITS file as "Author of Configure script".

Сейчас блог посвящен красивым воспоминаниям про то, почему некоторые части Windows были (и есть) реализованы именно так.

В качестве featured article я рекомендую эту, эту и вот эту.

October 12, 2006

When to throw exceptions?

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

Зачем создана обработка исключений?

1. Чтобы каждая функция не занималась обработкой ошибок. Дело в том, что бо́льшая часть кода успешно работает, когда всё идет хорошо, но не знает, что делать, если произошла ошибка. Исключения позволяют сконцентрировать обработку ошибок в одном месте минимальными усилиями программиста. Помимо прочего, это делает код функций более коротким и понятным, т. к. в них описан только успешный сценарий.

2. Исключения невозможно игнорировать, тогда как проверку кода ошибки можно забыть или просто отложить до лучших времен.

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

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

Во-вторых, умные люди не видят в исключениях никакой магии. В Python исключения используются для выхода из циклов. В Ruby есть два вида исключений, один из которых специально упрощен для выхода из вложенных подпрограмм. Авторы JRuby (на Java) пытались использовать исключения для эмуляции параллельного исполнения в стиле Ruby.

В стандартной библиотеки C++ исключения кидаются, например, когда не получается открыть файл. Если задуматься, это нормальная ситуация — в 99% случаях вы получаете имя файла от пользователя, окружаете вызов open обработкой исключений и в catch сообщаете пользователю, что имя файла неверно. Если пользоваться логикой «исключения только для случаев, которые не ожидает программа», open должна была бы возвращать bool, а не кидать исключения.

Самое главное, что можно сказать про использование исключений — используйте их по-умолчанию, если только нет противопоказаний. Главное здесь — удобство клиентского кода; если вам кажется, что пользователю может быть удобно обработать какую-то ситуацию отдельно, кидайте исключение.

Случаев, когда исключения использовать не стоит, я вижу три:

1. Ошибка в процедуре, исполняющейся очень большое число раз. Скажем, функция Win32 API TryEnterCriticalSection создана ровно для того, чтобы очень часто вызываться в цикле, а механизм Critical Sections в принципе сделан для ускорения работы программы. Поэтому этой функции стоит возвращает bool (точнее, BOOL), а не кидать исключения. (Разумеется, это если бы функции Win32 API вообще могли бы кидать исключения в стиле C++.)

2. Особая ситуация, которая всегда обрабатывается там же и так же, как и нормальная ситуация. TryEnterCriticalSection могла бы быть подходящим примером, но еще более подходящий вариант — вызов fork() в Unix.

У fork есть три типа возврата: (1) не удалось создать процесс, (2) всё нормально и это родитель, (3) всё нормально и это ребёнок. В случае (2) функия возвращает PID (идентификатор процесса) созданного ребёнка. Можно было бы считать это основным результатом функции, а в случаях (1) и (3) кидать исключения. Однако случай (3) концептуально равноправен со случаем (2) и его обработкой точно занимается тот же самый код, который вызывает fork. Поэтому в третьем случае не стоит кидать исключения, тогда как в первом — стоит.

С другой стороны, например, вызов open для открытия файла сюда не попадает, поскольку обработкой ошибочного ввода пользователя может заниматься основная программа, тогда как open вызывать может какой-нибудь модуль разбора XML-файлов.

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

October 10, 2006

Opinions are welcome

В комментариях к предыдущему посту развернулась дискуссия о Питоне, Руби и их развитии (а также о C++). Всех желающих приглашаю прочесть её и/или высказать своё мнение.

Может (а вдруг) среди читателей также есть любители еще каких-нибудь языков? Например, про groovy я вообще мало что знаю. Или, вот, мы в разговоре мало упоминаем JavaScript, тогда как это полноценный язык, который отлично используется в функциональном стиле. И, да, он лучше PHP. Пусть там не развито метапрограммирование — сейчас — но prototype-based OOP тоже достойно внимания и анализа.

Готов сделать предсказание: скоро JavaScript обретёт свои наработки в метапрограммировании. Конечно, оно там будет в стиле Питона и потребует понимания механизма прототипов, но зато получится очень просто и красиво.

October 09, 2006

PHP5 vs. Python/Ruby

Встретил человека, которого удовлетворяет PHP5. Мне кажется, ему легко живется в этом мире.

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

Статическая типизация даёт программисту больше уверенности в коде (иногда ложной).

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

Если вы никогда не занимались метапрограммированием, то для вас вопрос выбора языка сводится только к наличию типов у переменных, то есть фактически к ничему. (Ну, о'кей, к выбору формы выражения мыслей.) Если вы пробовали метапрограммирование на C++ (единственном поддерживающем его статически типизованном языке), то уже поняли, насколько это сложно и непригодно для повседневной деятельности.

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

Что же мы видим в PHP5? Метапрограммирование отсутствует напрочь. Авторы очень старались сделать всё, как у нормальных людей, но так и не поняли самого главного. Более того, они пытаются сделать язык похожим на Java, но только без строгой типизации (что суммирует недостатки обоих подходов в одном языке).

Лично я предпочитаю Ruby, потому что в нем красивее выглядит и метапрограммирование, и применение higher-order functions (благодаря SmallTalk'овским корням). Впрочем, это уже дело вкуса. Пусть метапрограммирование в Питоне выглядит более странно, но оно не менее мощное.

P.S. Помнится, раньше были споры про строгую типизацию, а не про статическую. А вот сегодня я, не морщась, употребляю эти термины почти как синонимы. Десять лет назад меня бы за такое линчевали.

P.P.S. Да, забыл, но впрочем это естественно, зачем говорить о том, чего нет. Функции высших порядков в PHP тоже имеют рудиментарный вид (ну то есть отсутствуют).

October 05, 2006

To whom it may concern: happy new winter!

Вчера выпал первый снег! (Полагаю, правда, что для многих, читающих мой блог, это не новость.) На улице очень оптимистичный и праздничный вид. По ощущениям — как будто скоро Новый Год. Сегодня съездил в город, получилось что-то вроде выходного (на половину дня).

Очень красивые виды наблюдались в лесу. Извиняюсь за банальность, как в сказке: все деревья еще с листьями и в снегу. Шел с работы до универа и много-много раз пожалел, что с собой нет фотоаппарата. На обратном пути встретил человека с очень довольным лицом и фотоаппаратом на шее. Я его понимаю. …Впрочем, во всём Академгородке сейчас красиво.

У коворкера сегодня был день рождения. Хорошо посидели. На всех было 2 совершенно одинаковых фотоаппарата — Canon EOS (подробнее назвать модель не могу, но это довольно навороченная цифровая зеркалка). Фотоаппарат, конечно, хороший, но через видоискатель снимать жутко неудобно. Да и 20 штук за фотик я отдавать пока не готов.

Игра «русская рулетка» от xored: каждый сотрудник по-очереди отвечает на просьбы заказчиков что-то типа «подождите еще», «мы работаем над этим», «с вами скоро свяжется …»; тот, на ком заказчики обидятся и разорвут контракт, выплачивает всю его стоимость.

October 04, 2006

О глубоком сне, изогнутых клавиатурах и leap'ах

От постоянного использования клавиатуры на работе в запястье левой руки стали возникать неприятные ощущения. Пересел на Microsoft Natural Keyboard, и ощущения сразу исчезли. Так что изогнутые клавиатуры действительно делают своё дело, что бы там ни говорили.

Заодно научился работать на клавиатуре с нетрадиционным блоком дополнительных клавиш (которые посередине между основной частью и цифровой клавиатурой). Достаточно приучиться использовать Ctrl-C, Ctrl-V и Ctrl-X вместо Ctrl-Insert, Shift-Insert и Shift-Delete (что я и так уже сделал, ибо на маке применяются Command-C, Command-V и Command-X).

Кстати о Mac. Самым загадочным в его поведении был мгновенный выход из состояния hibernate (или его еще называют «suspend to disk»). (Как я уже говорил, обычного sleep, то есть suspend to memory, у него нет, видимо потому, что hibernate работает быстро.) Честное слово, если я бы не прочел Джефа Раскина и его описание загрузки Canon Cat, я бы не догадался.

Canon Cat при завершении работы сохранял образ экрана на дискете (вместе со всеми остальными данными). При включении этот образ загружался первым делом и выводился на экран. Остальные данные читались еще около 7 секунд, но большинству пользователей казалось, что компьютер загружается мгновенно. (Строго говоря, речь идет даже не о загрузке, а о чтении дискеты с данными, но в Cat эти действия почти эквивалентны.)

Так вот, в MacOS применяется хак имени Раскина. После открытия крышки изображение появляется мгновенно, но курсор еще секунды 2 не двигается.

А пользовательский интерфейс Canon Cat ныне существует в виде проекта The Raskin Center for Humane Interfaces по имени Archy (см. также описание Archy на Wikipedia). Archy представляет все данные, с которыми работает компьютер, в виде большого текстового документа. Основным способом навигации (перемещения курсора по нему) предлагается поиск, именуемый Leap. Вместо использования стрелочек или мыши вы нажимаете на клавишу поиска (Leap Forward или Leap Backward) и набираете текст.

Мораль: когда-то я попробовал Archy и решил, что его Leap слишком непривычно использовать. Но недавно я стал пробовать использовать Incremental Search в Eclipse для перемещения по файлу, и это действительно очень удобно и быстро. Неприятно только нажимать Ctrl-J и Ctrl-Shift-J (Archy использует левый и правый Alt, и это на порядок удобнее).

September 26, 2006

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

September 04, 2006

MacBook: more

Залил софт. Теперь здесь можно смотреть фильмы в формате DivX (причем VLC Player реально лучше, чем QuickTime Player).

На клавиатуре мне изначально не понравилась раскладка. Небольшие поиски вселили надежду, так как нашлась директория «/System/Library/Keyboard Layouts». Оказывается, раскладки здесь хранятся в XML-формате, и для него даже нашелся в Интернете удобный редактор. В результате я сотворил почти что раскладку своей мечты (отличающуюся от стандартной тем, что на английском вопросике расположена русская точка, как в винде — ну и, соответственно, запятая).

Кстати, свою раскладку клавиатуры я положил в «/Library/Keyboard Layouts». А есть еще «~/Library/Keyboard Layouts» (то есть в домашней директории пользователя), и можно было бы сделать раскладку только для текущего пользователя. Аналогично, например, новые кодеки для QuickTime и пр. системные дополнения каждый пользователь может положить только для своего личного пользования.

Зато в процессе этих раскопок обнаружилась другая удивительная вещь. С клавишей Option (то есть Alt) клавиатура позволяет набирать дополнительный набор символов, вроде кавычек (причем в русской раскладке — традиционные русские кавычки, «такие», „такие“ и ”такие“), длинного/короткого тире, троеточия и диакритических знаков.

Батареи хватает где-то на 4 часа непрерывной работы.

Оказывается, при закрытии крышки он переходит не просто в sleep, а в hybernate. Ни за что бы не подумал, если бы не прочел про это в логах ядра. На засыпание уходит несколько секунд (4-5), просыпается вообще мгновенно. То, что память действительно сбрасывается на диск, проверили отсоединением батареи.

Из остального, попробовал культовый редактор TextMate. Он действительно классный. Колеблюсь между ним и Vim'ом. За TextMate, если его выбрать, нужно отдать 50 евро.

Установил DarwinPorts. Это полноценный менеджер Unix-пакетов, так что, например, Subversion встал по команде «sudo port install subversion». (Собирается всё из сорцов, как и в FreeBSD ports.)

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

А родные Mac OS'евые приложения устанавливаются совсем по-другому, методом перетаскивания приложения в папку «/Applications». Сразу придает взаимопонимание с операционкой. (Конечно, не обязательно перетаскивать именно в Applications, можно положить куда угодно, например, в «~/Applications». Никакой магии при этом не происходит.) Дистрибутивы же приложений поставляются в виде образов дисков, которые автоматически монтируются при скачивании, так что остается только выполнить ритуальное действие мышью.

Кстати, монтирование всяких серверов и виртуальных дисков здесь сделано на уровне ядра, а не является абстракцией интерфейса, как в Windows Explorer.

September 01, 2006

MacBook: introduction

Я стал счастливым обладателем Apple MacBook. Сегодня. Первые впечатления в том порядке, в каком они приходят в голову.

Это красиво. Начиная от упаковки и заканчивая пультом ДУ и печатной инструкцией. Designed by Apple in California. И интерфейс, конечно, тоже.

Совершенно новая операционная система. Правда, ровно то, что я и ожидал. На самом деле от ОС мало впечатлений, кроме того, что это именно так хорошо, как и должно быть. (Впрочем, я уже видел MacOS X на работе, поэтому и ожидал.)

Клавиатура удобная. Я бы даже сказал, клавиатура обалденно удобная в смысле кнопок. Но её поведение абсолютно отличается. Русская пунктуация в других местах. Сочетания клавиш совсем другие. И их больше. В разы. В десятки разов. Есть один лишний модификатор -- на PC только Ctrl, Alt и Shift, а здесь -- Command, Ctrl, Option, Shift. А ещё есть непонятная кнопка. :) Нет Delete и Insert (Delete = Fn + Backspace, Insert просто не существует как вид на Mac'ах).

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

Софт! Как сказано на сайте, к Windows тоже приложено немало софта, просто это не тот софт, который вы захотите использовать. Здесь в составе есть средства для создания DVD, создания подкастов, Sticky Notes, какой-то иерархический органайзер, толковый словарь английског языка, разные игры, включая шахматы (2 вида), шашки и реверси. Но это плохо описывает ситуацию. Даже стандартный текстовый редактор (довольно простенький по возможностям) умеет открывать и сохранять в форматах RTF, HTML, MS Word (бинарный и XML-форматы). Все приложенные программы качественные.

На самом деле я ко всему почти привык. Сочетания клавиш для основных команд быстро входят в жизнь, новые способы переключения между окнами, переключения раскладок (увы, пока ничего удовлетворительнее Ctrl-Space получить не удалось, будем искать софт), новые сочетания клавиш редактирования (Home и End, опять же, нет, но зато вместе с Option, Command и Control клавиши управления курсором образуют интересные сочетания). На клавиатуре запросто и быстро набираю вслепую. Всего одна кнопка мыши, но к этому тоже привыкаешь быстро. И прокрутка двумя пальцами по тачпаду.

А еще об ноут можно греть ноги (макинтоши, в отличие от PC, намного сильнее греются, но зато намного меньше шумят вентилятором).

Зарядник: фенечки, раскрученные на сайте. Магнитный замок, который отсоединяется сам, если потянуть за провод, и не даёт ноуту упасть. Вторая часть провода (от зарядника к разетке) заменяется надевающейся прям на зарядник вилкой, чтобы не таскать с собой лишние провода.

Наконец, технические параметры. В стандартной комплектации 512 MB памяти, 13.3" экран (1280x800, маленьким не кажется, наверное, потому, что сам ноут -- малыш), процессор Intel Core Duo 2 GHz, винт 80 GB. Встроенная камера 640x480 (используемая даже для создания юзерпика при первой установке; экран работает вспышкой; также используется как встроенный микрофон).

August 25, 2006

Evolution

Эволюция моей будущей тестирующей (по мотивам недавних событий с анкетой).

Регистрация. Шаг 1. Она умеет регистрировать команды на олимпиады и собирать о них некоторые сведения.

Шаг 2. Она умеет регистрировать команды и собирать любые сведения об этих командах, их участниках и т.д.

Шаг 3. Она умеет собирать абсолютно любые сведения о любых объектах.

Тестирование. Шаг 4. Она умеет компилировать и запускать решения участников на тестах.

Шаг 5. Она умеет проверять присланные участниками сущности разными способами, в том числе и запуская их на тестах

Шаг 6. Она умеет проверять всё, что угодно, любым способом.

Оценка решений. Шаг 7. Она умеет составлять рейтинги ACM.

Шаг 8. Она умеет составлять рейтинги, считать баллы по сложным правилам, распределять дипломы и исправлять результаты согласно решениям жюри.

Шаг 9. Она составляет какие угодно таблицы из любых имеющихся данных.

Работа жюри. Шаг 10. Она хранит версии основных объектов (тесты, задачи), а также позволяет готовить следующую их версию, не нарушая работу предыдущих.

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

Шаг 12. Она управляет любыми взаимоотношениями любых людей на планете, так или иначе связанных с олимпиадами.

Шаг N. Тестирующая система захватывает мир и предъявляет человечеству свои требования.

Dirty

У меня играет Pink Floyd «Young Lust» (из The Wall). Там в припеве слова «…oh, I need a dirty woman, oh, I need a dirty girl…»

Сидящий справа Михаил Калугин (aka fourdman) говорит:

— Песенка в тему, у меня как раз флаг dirty не устанавливается.

August 23, 2006

What shall we do now?

Вся компания сейчас обсуждает, что можно сделать со 100 Гб порнухи, завалявшимися у одного из коворкеров дома на диске. Варианты: записать на DVD, скинуться на винт, зайти в гости с чипсами и посмотреть.

August 17, 2006

Новый блог на старом месте

Новый Blogger. Поддерживает учетные записи Google, тэги и удобное управление оформлением. Следовательно, пробуем, товарищи!