2009-12-24

Пасхальные яйца в программах.

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

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

В коммерческих продуктах пресекается встраивание пасхальных яиц, т.к. их исходный код может быть потенциальной дырой в безопасности продукта. Так было найдено множество пасхальных яиц в продуктах Microsoft, но после начала участия Microsoft в программе Trustworthy Computing программистам шутить запретили.

Одним из пасхальных яиц является появление отрывков из книги "The Book of Mozilla" если в строку адреса ввести URL: about:mozilla. Данный URL приводят в качестве примера в черновике спецификации схемы URL about: http://tools.ietf.org/html/draft-holsten-about-uri-scheme.

Текст отрывков вымышленной книги эзотерического характера и в переносном смысле говорит о восстании из пепла свободного браузера.

Интересно что разработчики Microsoft ответили "синим экраном смерти" - если набрать URL about:mozzila в Internet Explorer в Windows XP до SP1 включая. Указанная страница позже таким образом не доступна, ее можно увидеть введя URL: res://mshtml.dll/about.moz

2009-12-20

Непоследовательный калькулятор Windows.

Несогласованность режимов работы стандартного калькулятора Windows дает различные результаты при нажатии одних и тех же клавиш.
Запустите калькулятор:
Win+R calc RET
Нажмите последовательно:
2 + 2 * 2 RET
в режимаж "Вид ==> Обычный" и "Вид ==> Инженерный". Результат в первом случае - 8, во втором - 6.

2009-11-22

Сборка NetHack в MSYS/MinGW (Windows).

Давно хотел собрать NetHack в Windows ради спортивного интереса.
  • Получил исходные тексты: http://nethack.org/v343/download-src.html.
  • Получил работающую среду MSYS/MinGW: http://www.mingw.org.
  • Почитал nethack-3.4.3/sys/winnt/Install.nt. Встретил команду mingw32-make -f Makefile.gcc install, но как оказалось Makefile.gcc рассчитан на использование SHELL = cmd.exe, как я понимаю mingw32-make. Я же решил собирать make с SHELL = /bin/sh.
  • В Makefile.gcc установил значение переменной GRAPHICAL в "Y" для сборки также и GUI версии.
  • Запустил nhsetup.bat (скрипт кроме всего копирует Makefile.gcc в nethack-3.4.3/src)
  • Поправил nethack-3.4.3/src/Makefile.gcc с win-shell (cmd.exe) на unix-shell (/bin/sh):
    $(subst /,\,copy nhdat $(GAMEDIR))
    на
    cp nhdat $(GAMEDIR)
    регулярным выражением s=$(subst /,\\,copy \(.*\))=cp \1=
  • $(subst /,\,if exist $(GAMEDIR)/makefile del $(GAMEDIR)/makefile)
    на
    [ -f $(GAMEDIR)/makefile ] && rm $(GAMEDIR)/makefile || :
  • @copy $< $@
    на
    cp $< $@
    подстановкой copy на cp
  • $(subst /,\,@if not exist $(GAMEDIR)/*.* echo creating directory $(GAMEDIR)) $(subst /,\,@if not exist $(GAMEDIR)/*.* mkdir $(GAMEDIR)) $(subst /,\,@echo directory created > $@)
    на
    mkdir $(GAMEDIR)
  • И т.д.
  • Затем запустил сборку:
    $ cd nethack-3.4.3/src $ make -f Makefile.gcc install
  • В каталоге nethack-3.4.3/binary появились NetHack.exe и NetHackW.exe.
См. также

2009-11-08

Мои настройки blogger.

Я записал полезные настройки blogger, что б не забыть.

Первым делом при создании нового блога на blogger я устанавливаю эти настройки!

  • Отключить WYSWYG редактор.
    Settings ==> Basic ==> Show Compose Mode for all your blogs? ==> No.
    Я редактирую статьи в чистом HTML для полного контроля над видом статьи (WYSWYG редактор вставляет свои теги, они могут портить вид).
  • Включить ссылки быстрого редактирования статьи.
    Settings ==> Basic ==> Show Quick Editing on your Blog? ==> Yes.
    Не то что б я их использую, но оставил в шаблоне код, который создает их.
  • Открывать новую странице для создания комментария.
    Settings ==> Comments ==> Comment Form Placement ==> Pop-up window.
    Уменьшается использование площади страницы и чуть чуть сохраняет трафик тем кто не собирается оставлять комментарий.
  • Только авторизированные пользователи могут оставлять комментарии.
    Settings ==> Comments ==> Who Can Comment? ==> Registered Users.
    Нет anonymous. Не забудьте включить OpenID!
  • Отключить backlinks.
    Settings ==> Comments ==> Backlinks ==> Hide. Settings ==> Comments ==> Backlinks ==> Backlinks Default for Posts ==> New post do not have backlinks.
    Мне они не нужны (я даже удалил код из шаблона, который создает backlinks).
  • Использовать CAPTCHA.
    Settings ==> Comments ==> Backlinks ==> Show word verification for comments? ==> Yes.
    Остановим спам!
  • Сообщать о новых комментариях по email.
    Settings ==> Comments ==> Backlinks ==> Comment Notification Email ==> <Enter emails>.
    Мне нужно знать что кто то оставил комментарий.
  • Не вставлять <br/> после LF.
    Settings ==> Formatting ==> Convert line breaks ==> No.
    Я хочу иметь полный контроль дан содержимым статьи.

2009-11-04

Переименование пользователя в Linux.

Необходимо переименовать пользователя и его домашний каталог.
Собственно переименовать пользователя легко (используется дистрибутив Debian). От имени root выполняем команды:
# groupmod --new-name newuser olduser # usermod --login newuser --home /home/newhome olduser
Перемещение домашнего каталога командой mv не ограничится:
# mv /home/oldhome /home/newhome
Множество программ, используемых пользователем, использует файлы настроек (dot-файлы). Их придется править вручную ((. В каждом случае решение о правке приходится принимать человеку на основании знания форматов конфигурационных файлов.

Находим все вхождения слова olduser в конфигурационных файлах:

# find /home/newhome -maxdepth 2 -type f | xargs grep -Hn
Обычно пользовательские конфигурационные файлы находятся в корне домашнего каталога пользователя или в соответствующем подкаталоге. Потому глубина поиска ограничена 2.

Можно было использовать следующий способ поиска вхождений:

# grep -Hn user .* .*/*
правда некоторые программы отклоняются от стандартов именования конфигурационных файлов (или каталогов с конфигурационными файлами) - их названия не начинается с точки (dot).

Я для правок использовал команду Emacs grep-find, это позволяло мне быстро переходить в место вхождения заменяемого слова:

C-x d C-a C-k /home/newuser RET С-x grep-find grep -Hn user .* .*/* RET C-x ` =edit= C-x ` =edit= C-x ` =edit= C-x ` ....
Приятного Вам переименовывания пользователей!

2009-10-11

Сортируем без повторений в Emacs.

Только для сортировки строк в Emacs имеется встроенная функция: M-x sort-lines.

Для сортировки без повторений выполняем:

  • выделить область
  • C-u M-| sort -u RET

С включенными режимами transient-mark-mode и delete-selection-mode можно сразу заменить выделенную область отсортированными без повторения строками:

  • выделить область
  • M-| sort -u RET

mit.edu в помощь!

Кто не помнит название Массачусетского технологического института? Это имя помнят все и можно знания обратить в пользу!

Это я набираю по памяти:

$ sudo ntpdate time.mit.edu
и
$ gpg --keyserver pgp.mit.edu --search
Раньше приходилось гуглить NTP и PGP сервера каждый раз когда понадобятся ))

2009-10-09

TiddlyWiki.

Оффлайн wiki-движок одним html файлом - такое бывает?
Проект TiddlyWiki предлагает полноценный wiki одной html страницей.

Работает в Firefox, Explorer, Safari и Opera.

Движок wiki активно использует JavaScript. Движок и данные размещаются в одном и том же html файле.

Компактность движка (~340 KiB) и использование одного файла в качестве хранилища позволяют с легкостью переносить статьи с компьютера на компьютер, хранить wiki на внешнем носителе (например USB stick).

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

Ссылки:

2009-10-04

Резервное копирование, основные правила.

Ниже рассмотрены "общие" правила, которые следует соблюдать при создании и хранении резервных данных.
  • Создавайте резервные копии. Ваша данные имеют стоимость, вы же не хотите их потерять! В зависимости от важности данных и их объема определитесь с местом размещения резервных копий, сроком хранения резервных копий, какие данные требуют резервирования и как часто резервное копирование будет выполнятся.
  • Максимально автоматизируйте процесс создания резервных копий. Что бы самодокументировать процесс резервирования и вы ничего не забыли при создании копии в следующий раз.
  • Изредка проверяйте возможность восстановления из резервных копий. Вы же хотите быть уверенны в сохранности своих данных!
  • Опишите процесс создания и восстановления данных. Любой уполномоченный сотрудник должен мочь проконтролировать правильность создания резервной копии и восстановить данные из резервной копии.
  • Используйте различные хранилища для данных и их резервных копий. Используйте различные носители информации, физически разносите данные и резервные копии (храните копии в другом здании или другом городе). RAID массивы не являются способом организации резервного копирования, некоторые конфигурации RAID массивов (с избыточностью данных) лишь улучшают параметр непрерывности обслуживания!
  • Храните множество копий. Даже когда данные не утеряны может быть нарушена их целостность и вам придется покопаться в истории!

2009-09-02

Новый формат репозиториев Mercurial (fncache)

fncache - новый формат репозиториев для Mercurial, который изменяет правила формирования имен файлов revlog. Впервые введен в Mercurial версии 1.1 и становится форматом по умолчанию для новосоздаваемых репозиториев.

Причиной введения нового формата является улучшение способа именования файлов (из за ограничений некоторых операционных систем и файловых систем). Так зарезервированные имена файлов 'con', 'prn', 'aux', 'nul', 'com1'..'com9', 'lpt1'..'lpt9' ОС MS Windows теперь специальным образом декорируются. Также декорируются пути, длина которых превышает 120 символов (байт?), путем фиксации длины (обрезанием части пути) и добавления SHA1 хэша от оригинального имени.

Вспомним что с подобными проблемами некоторых ОС разработчики Mercurial ранее сталкивались. Только с переходом к версии 0.9.4 Mercurial смог одновременно хранить файлы и каталоги, имена которых различаются только регистром (что невозможно например в файловой системе FAT16/FAT32)!

Новый формат никоим образом не изменил протокол работы Mercurial через http[s] и bundle.

Но локально работать используя старую версию Mercurial (вплоть до 1.0.x) с репозиториями нового формата нельзя. Если Вы попробуете, то получите предупреждение:

abort: requirement 'fncache' not supported!
Эта проверка реализована посредством просмотра содержимого файла "requires":
$ cat repo/.hg/requires revlogv1 store fncache
Ключевое слово "fncache" говорит о необходимости поддержки нового формата утилитой hg.

Если у Вас имеется репозиторий нового формата, но приходится работать с CMS старой версии - можно конвертировать репозиторий в старый формат (правда при этом используя новую версию Mercurial, начиная с 1.1):

$ hg --config format.usefncache=0 clone --pull fncache-repo non-fncache-repo
Использование по умолчанию формата fncache репозиториев может быть отключено в hgrc(5):
[format] usefncache = False
или опцией командной строки "--config format.usefncache=0".

Одной из причин использования мною репозиториев старого формата - наличие в релизе Debian Lenny только версии Mercurial 1.0.1 (когда в Windows я использую версию 1.3.1).

За подробной информацией обращайтесь сюда http://mercurial.selenic.com/wiki/fncacheRepoFormat

2009-08-20

Переход на GNU Emacs 23.1 в Windows.

Переход с версий 22.x на недавно вышедший релиз GNU Emacs 23.1 прошел гладко за исколючением двух моментов.

Первое с чем пришлось столкнутся это сообщение об ошибке при выполнении функции (server-start):

error: The directory e:/home/.emacs.d/server is unsafe
Проблема расположена в функции server-ensure-safe-dir:
(unless (and (eq t (car attrs)) (eql (nth 2 attrs) (user-uid)) (or (eq system-type 'windows-nt) (zerop (logand ?\077 (file-modes dir))))) (error "The directory %s is unsafe" dir))))
На stackoverflow.com описано решение проблемы. Cледует удалить выделенный участок кода и обновить байткод (Emacs сначала ищет .elc файла и только затем .el, редактируем файл emacs-23.1/lisp/server.el, C-x byte-compile-file <Down> <Ret>).

Вторая проблема состояла в том что функция codepage-setup устарела и ее определение исключили из дистрибутива. Теперь нет необходимости предварительно перед использованием кодовой страницы IBM cpXXX ее создавать! Для совместимости со старыми версиями Emacs воспользуйтесь следующим кодом:

(when (<= emacs-major-version 22) (codepage-setup 866) (codepage-setup 1251) )

Новость о релизе GNU Emacs 23.1: groups.google.com

Update: 2010-03-17.

2009-09-19 был исправлен баг #4197 касающийся server-ensure-safe-dir. Из ChangeLog:

This fixes bug#4197 (merged to bug#865, though not identical). * server.el (server-auth-dir): Add docstring note about FAT32. (server-ensure-safe-dir): Accept FAT32 directories as "safe", but warn against using them.
Также я нашел другой способ обойти эту проблему:
(require 'server) (when (and (= emacs-major-version 23) (= emacs-minor-version 1) (equal window-system 'w32)) (defun server-ensure-safe-dir (dir) "Noop" t)) ; Suppress error directory ~/.emacs.d/server is unsafe on windows. (server-start)

2009-07-14

Коллективное ведение блога.

При использовании блогов blogger (www.blogger.com) доступна возможность вести блог одновременно несколькими персонами.

Модель совместного ведения блога на blogger.

  • Имеются два вида полномочий: администраторы блога и не администраторы.
  • Не администраторы могут создавать новые статьи и редактировать только свои статьи.
  • Администраторы могут все.
Официальная справка о совместном ведении блога: http://www.google.com/support/blogger/bin/topic.py?hl=en&topic=12454

Ограничения совместного ведения блога на blogger.

  • Обиженный участник с правами администратора может удалить учетные записи других участников без возможности как либо предупредить это.

Какие плюсы дает совместное ведение блога?

  • Создается сообщество.
  • Статьи могут улучшаться различными участниками.
  • Различия интересов и знаний участников делает содержимое блога более богатым и разнообразным.
  • Больше ответов (feedback) для читателей, комментарии модерируются несколькими участниками.
  • Каждый участник получает дополнительную ауру почета/уважения, как если бы он сам написал все эти умные статьи блога.
  • Коллективный блог более живуч, в блог могут привлекаться новые активные участники.

Как присоединиться к соавторству этого блога?

  • Очное знакомство, географическая приближенность и доверие к будущему автору, т.к. все участники будут иметь права администратора (все равны, никто не работает на дядю).
  • Будущий автор должен внести вклад в содержимое блога, потому с него спрашивается материал будущих статей (иначе зачем тогда он нужен?).
  • Будущий автор согласен с положением лицензии Creative Commons Attribution 3.0 Unported License.
  • Качество и профессиональный уровень статей нового автора, а следственно и навыки самого автора, должны соответствовать уровню участников блога (что б не пиарился без внесения вклада в блог).

Включение исходных текстов программ в блоги blogger.

Для включения исходных текстов программ наиболее просто воспользоваться тегом <pre>. Но таким образом обрамленный текст будет сложно различим среди основного текста статьи, к тому же длинные строки будут перекрываться с содержимым sidebar (правой колонки блога) или вылазить за границы окна браузера.

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

Ниже приведен пример как выглядит текст в тегах <pre> на странице blogger:
#include <stdlib>

int main()
{
    puts("hello world!");

    return 0;
}

После добавления стиля:

div#code { border: dotted 1px $bordercolor; background: $codebgcolor; width: 95%; overflow: auto; line-height: 1em; margin: 5px; padding: 5px; white-space: pre; font-family: monospace; }
и добавления определения переменной codebgcolor:
<Variable name="codebgcolor" description="Code Background Color" type="color" default="#fff" value="#fffff0">
исходный текст программы стал виден как:
#include <stdlib> int main() { puts("hello world!"); return 0; }
Небольшое пояснение назначения элементов стиля:
border: dotted 1px $bordercolor;
граница области <div> в точечку, тоненькая, цвета, определенного в шаблоне
background: $codebgcolor;
используем специально определенный цвет фона
width: 95%; overflow: auto;
делаем ширину области фиксированной, при наличии длинных строк появится горизонтальная полоса прокрутки
line-height: 1em;
междустрочный отступ определен в верхнеуровневых тегах и выглядит ужасно для текста программы, определяем явно "хороший" отступ
margin: 5px; padding: 5px;
лучше выглядит когда рамка не сливается с текстом
white-space: pre; font-family: monospace;
позволяет тегу <div id="code"> вести себя как тег <pre>

Цвета фона я подбирал в Layout ==> Fonts and Color для новоопределенной переменной codebgcolor (здесь доступен вид блога сразу, on fly). Остановился на светло светло желтом.

Используется стиль следующим образом:

<div id="code">line-1 line-2 ... line-(n-1) line-n</div>
Первая строка текста должна находится на той же строке что и открывающийся тег <div id="code">, последняя строка текста должна находится на той же строке что и закрывающийся тег </div>. Иначе в начале или в конце могут появится одна пустая строка.

2009-04-05

Приветик на Brain Break!

Данный блог - просто русская версия http://brain-break.blogspot.com/.

Статьи блога должны быть сугубо технические:

  • только факты
  • KISS (в нашем случае Keep It Short), нет болтологии и пустословию
  • нет личным впечатлениям и переживаниям
  • долой рассказы как хорошо провел время в путешествии/покупал машину/выгнали с роботы
  • не переводим чужие статьи
  • не бросаемся ссылками
  • не касаемся политики/религии