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