2010-11-09

Число Эрдёша

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

Меня заинтересовала дискусия в коментариях про число Эрдёша.

2010-08-17

Определение рабочего окружения и возможностей платформы в Emacs

Для правильной работы файла настроек .emacs на различных платформах и различных версиях Emacs требуется проверять множество условий.

Я собрал несколько из них.

2010-08-12

Топ 10 правил безопасного написания кода от CERT.

  1. Проверяйте входящие данные.
  2. Учитывайте предупреждения компилятора.
  3. Проектируйте с возможностью разделения привелегий.
  4. Делайте все прстым.
  5. По умолчанию запрещайте.
  6. Используйте наименее возможные привелегии.
  7. Уберите лишюю информацию при отправке в сторонние системы.
  8. Защищайтесь на всех уровнях.
  9. Используйте хорошие системы контроля качества.
  10. Разработайте правила/стандарт безопасного написания кода.
Подробней можно прочесть на странице CERT (на английском).

См. также:

2010-08-11

Пробретение процессора Intel Core i5 750

Мой брат решил обновить процессор с Athlon X2 до Intel Core i5 750.

Характеристики процессора Intel Core i5 750:

Ядер: 4 Потоков: 4 Clock Speed: 2.66 GHz 32-KB instruction and 32-KB data first-level cache (L1) for each core 256-KB shared instruction/data second-level cache (L2) for each core 8-MB shared instruction/data last-level cache (L3), shared among all cores Lithography: 45 nm Max TDP: 95 W TCASE: 72.7°C Processor Core Power Management: C0, C1, C3, C6 Instruction Set: 32/64-bit Intel® Virtualization Technology (VT-x) Enhanced Intel® Speedstep Technology Execute Disable Bit Price: 199$

2010-08-06

Сортировка с помощью утилиты sort элементов в строке.

Предположим мы имеем строку:
str="item4, item2, item3, item2, ..."
и хотим отсортировать ее элементы без повторений в shell-скрипте.

2010-03-31

Магия кавычек в POSIX sh.

Столкнулся с кодом, на который ругался интерпретатор:
if [ -n $COMSPEC -a -n $WINDIR ]; then ...
Оказывается переменная окружения COMSPEC раскрывалась в пустую строку и -n скушало -a!

Подумал я взять подвыражения по бокам -a в скобки (утилита test позволяет группировать условия, заключая их в скобки):

if [ \( -n $COMSPEC \) -a \( -n $WINDIR \) ]; then ...
Но снова интерпретатор ругается на недостающую закрывающуюся круглую скобку...

Тут до меня доходит что у -n аппетит хороший и нужно гарантировать ему аргумент! Потому заключаем переменные окружения в двойные кавычки (которые позволяют подстановки в отличии от одинарных кавычек):

if [ -n "$COMSPEC" -a -n "$WINDIR" ]; then ...
Смотрите что делают кавычки с нижеприведенной командой:
$ for item in a "" b; do echo $item; done a b

2010-03-07

emacs.info в Debian.

Политика проекта Debian запрещает размещение пакетов с контентом, покрытым лицензией FDL, если в тексте имеются инвариантные секции.

Потому мантейнеры пакета Emacs исключают emacs.info, eintr.info, elisp.info и некоторые другие документы из пакета.

Система документации Info очень удобна для пользователей Emacs. В основном за счет легкости пользования поиском.

Можно было бы получить emacs-no-chunk.html, открыть html в Firefox и с включенным "Search for text when I start typing" также легко искать текст, но:

  • приходится помнить/искать где лежит emacs-no-chunk.html
  • документ большой ~= 1 MiB, долго загружается Firefox'ом и немного натупляет Firefox

И так нужно поступать с каждым документом, тогда как при использовании site wide installed info по C-h i видны и искабельны by s или C-s все info-файлы.

Из дистрибутива исходных текстов Emacs извлекаем *.info файлы:

$ tar zxf emacs-22.2.tar.gz $ mkdir ~/usr/share/info $ cp emacs-22.2/info/* ~/usr/share/info

О наличии *.info файлов Emacs'у можно сказать переменной среды INFOPATH:

$ echo export INFOPATH=~/usr/share/info: > ~/.bash_profile
Двоеточие в конце необходимо как признак включать пути к *.info, установленными с Emacs'ом.

Я пошел по другому пути, что бы не прописывать на каждом хосте INFOPATH, добавил следующее в .emacs:

;; Because of Debian policy documentation covered by FDL license ;; with invariant sections is not allowed in packets ;; repository tree. So it must be installed manually. ;; My usual configuration is install user local software ;; into ~/usr DISTDIR. (unless (getenv "INFOPATH") (setenv "INFOPATH" "~/usr/share/info:"))

(unless (getenv "INFOPATH") позволит использовать переменную среды INFOPATH, которую я обычно устанавливаю в Windows для чтения info, поставляемых с MinGW/MSYS/Cygwin, из Emacs, но об этом в следующий раз.

Также это удобно тем, что собранные вручную программы я обычно конфигурирую таким образом:

$ configure --prefix=$HOME/use
потому их info документация автоматически становится доступной из Emacs.

2010-03-01

Логическая задача Льюиса Керрола.

Попробуйте прийти к заключению:
Ни один разумный поросенок не отправится путешествовать на воздушном шаре.
используя утверждения:
  • 1. Всякий, кто не танцует на туго натянутом канате и не ест пирожков за одни пенс, стар.
  • 2. Со свиньями, которые временами испытывают головокружение, обращаются почтительно.
  • 3. Разумная свинья, отправляясь в путешествие на воздушном шаре, берет с собой зонтик.
  • 4. Не следует завтракать в присутствии посторонних тому, кто имеет смешной вид и ест пирожки за один пенс.
  • 5. Юные существа, отправляющиеся в путешествие на воздушном шаре, временами испытывают головокружение.
  • 6. Жирные существа, имеющие смешной вид, могут завтракать при посторонних, если только они не танцуют на туго натянутом канате.
  • 7. Ни одно разумное существо не станет танцевать на туго натянутом канате, если оно временами испытывает головокружение.
  • 8. Свинья с зонтиком имеет смешной вид.
  • 9. Все, кто не танцует на туго натянутом канате и с кем обращаются почтительно, жирны.

Update:Я смог решить задачу только используя Reductio Ad Absurdum. Скорее всего в интуиционистской логике задача не решаема, т.е. прямого доказательства нет.

http://en.wikipedia.org/wiki/Reductio_Ad_Absurdum

2010-02-21

Игра в неправильные кубики.

Игра в кубики: 2 игрока бросают (каждый свой) кубик и у кого выпало большее число, тот и выиграл.

Если играть кубиками с развертками:

0 2 5 404 222 111 4 6 5 4 6 5
то какой бы кубик первый игрок не выбрал второй может выбрать такой, что будет выигрывать с вероятностью 2/3.

Действительно:

if first choose third, probability = ((4+2)*3 + 2*3)/36 = 2/3 if second choose first, probability = (2*4 + 4*4)/36 = 2/3 if third choose second, probability = (3*(4+2) + 3*2)/36 = 2/3
(1)==>(3)==>(2)==>(1)==>...

2010-01-13

Высказывание Джеймса Гуслинга о динамических языках.

В статье "The Art of Lisp & Writing" Ричарда Гебриела мне понравилась цитата:

Very dynamic languages like Lisp, TCL, and Smalltalk are often used for prototyping. One of the reasons for their success at this is that they are very robust.... Another reason ... is that they don't require you to pin down decisions early on. Java has exactly the opposite property: it forces you to make choices explicitly. -– James Gosling, Java: An Overview

Действительно когда пытаешься быстро написать прототип или проверить концепцию, избирая языком программирования Java, приходится возиться с различными мелочами, отнимающими только время.

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

Сравнение хорошо почувствуется если почитать статью "Why Functional Programming Matters" - все примеры демонстрируют обобщенность полученного кода, реализации концепции и возможность применения ее к различным по структуре данным.

См. также:

2010-01-09

SCIgen

SCIgen - программа генерирующая псевдонаучные статьи и имеются случаи когда их принимали в печать!

Значимость науки обусловила вовлечения громадного числа людей и денег в эту сферу. А где деньги - там и бюрократия с коррупцией.

Дипломы покупают, защиты покупают, статьи пишут для галочки, гоняются за грантами.

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

Для обслуживания такого рода клиентов работают научные журналы. Буквально печать производится за средства авторов!

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

Я посетил домашнюю страницу проекта - http://pdos.csail.mit.edu/scigen/. В предложенную форму вбил свое имя отчество, нажал кнопку получить - и вуаля статья готова:

On the Evaluation of 16 Bit Architectures

Как говорится в моей новоиспеченной статье:

After several years of difficult programming, we finally have a working implementation of our methodology.

Смотри также:

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 массивов (с избыточностью данных) лишь улучшают параметр непрерывности обслуживания!
  • Храните множество копий. Даже когда данные не утеряны может быть нарушена их целостность и вам придется покопаться в истории!