How it should be

May 19, 2010

I’m almost done with one project, and as it allways goes I have some last-minute fixes. It is a Bash script file automating the build process on various *nixes and as the reality is, there are no common in my environment and the one the build server has. So I’ve got that I must use absolute paths to the utilities I’ve used in script. I figured it out to use variables like in GNU Autoconf’s Makefiles: “RM=/usr/local/bin/rm” and “${RM} -vf foo”. The work is almost done but I have 3 more files that look quite the same, but I really did not wanted to make these replacements by hand… so I’ve tried to make a version of `replace-string’ in Emacs’ *scratch*, just for my problem:

(defun foo ()
  (interactive)
  (let ((begin (region-beginning))
	(end   (region-end)))
    (mapcar #'(lambda (p)
		(replace-string (format "%s " (cadr p))
				(format "${%s} " (car p))
				nil begin end))
	    '((GNUTAR tar) 
	      (GUNZIP gunzip) 
	      (GZIP gzip)
	      (GMAKE gmake) 
	      (AUTORECONF autoreconf)
	      (MKDIR mkdir)
	      (ECHO echo) (CP cp)
	      (FIND find) 
	      (RM rm)
	      (TEST test)
	      (LN ln)))))

And that’s all!

Инъекции в код

May 14, 2010

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

Но, что будет потом?

Через некоторое время этот наспех сделанный костыль похоронит весь класс и вы скорей решитесь написать новый, чем взять на поддержку этот, заросший мхом нестандартных, недокументированных, плохооттестированных и вообще не обдуманных фишек (понятно, что не он один к этому приведёт, нет — такой подход: быстро подправить что-то мелкое).

Поэтому, не стоит добавлять функционал на скорую руку.

Если же добавить ОЧЕНЬ надо, то трогать рабочий класс нельзя. Просто и мысли такой не должно быть! Всё новое надо добавлять в дочерний класс и наращивать функциональность правильно.

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

News through the proxy

April 19, 2010

Finaly I’m done with the news at work. NNTP + Proxy + HTTPS + Proxytunnel + Gnus!

At firts nntp.aoie.org runs NNTP on 443 port SSL-ed, so this is the command line for proxytunnel:

proxytunnel -v -p proxy.mywork:3128 -d nntp.aioe.org:443 -P %USERNAME% -e -a 8119

Then just for clearness goes a line in /etc/hosts:

127.0.0.1 nntp.aioe.org.local # Proxing for news

And finally — a select method for Gnus:

'(nntp "nntp.aioe.org.local" (nntp-port-number 8119))

It will be nice to have proxytunnel been run by the Gnus start hook and stopped by its stop hook. But just now it works!

Скрипты автоматизации и интерактивный обработчик ошибок

April 15, 2010

Сегодня утром, поднимаясь на эскалаторе в метро, пришла в голову идея: почему бы не использовать технику обработки ошибок, которую я увидел в Lua и Lisp, в скриптах автоматизации!

Эти скрипты по определению содержат большое количество side effect, и сколько раз чтобы получить результат приходится запускать, читать сообщение об ошибке, подкладывать архив, библиотеку, что-то переименовывать.. и перезапускать скрипт заново. Зачем?

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

Lua и Lisp умеют это делать, осталось научиться делать это в Bash, Ruby, Python…

Interactive recursion magic

February 15, 2010

Изучаю Common Lisp. И Emacs. Нажал C-c RET (в Lisp Slime режиме). Потом подумал — а что если — и нажал ещё раз. Класс!!!

Люблю, когда вот так вот касаешься края магии.. :))

Про именованные параметры функций в языках программирования

February 11, 2010

Если в языке нет такой возможности, то приходится решать задачу документированием (если IDE умеет подсказывать документацию функции при её использовании, если нет — то не очень удобно, т.к. придётся самому искать функцию в системе документации), использованием специальных имён функций (например findByColor, findBySize, findByAge — своего рода документация в названии).

А если идти путём перегрузки по типу, или просто уйти от использования специальных имён, то в коде, где происходит вызов, для облегчения понимания в будущем, приходится использовать специально названные переменные, с которыми будет осуществлён вызов. Что тоже не блещет красотой, т.к. с одной стороны использование осмысленных имён переменных — это хорошо, но до тех пор, пока значение этой переменной не нужно будет использовать в двух разных контекстах — в одном её имя будет осмысленно, в другом сомнительно. Это приведёт к тому, что во втором случае будет комментарий, рассказывающий, что имелось ввиду.

А мне просто захотелось синхронизировать Google Calendar на Windows Mobile…

January 13, 2010

А на деле это оказалось огромной PITA, как говорят американцы.

Начало вдохновляет: всё просто. Но, имея прокси в рабочей сетке, вы будете обречены программистами из microsoft: activesync не понимает, что это за зверь.. и вы никак ему это не объясните.

Идея родилась такая: на Apache поднять виртуальный хост m.google.com, который проксировать через прокси на localhost к оригинальному m.google.com:443.
Почему, через localhost?
Потому, что рабочий прокси требует NTLM аутентификацию.. с этим справляется Paros (не без нареканий, правда).
Ну и доабвить в etc/hosts запись: 127.0.0.1 m.google.com.

Что я говорил, настоящая “боль в заднице”!

Exception or error code?

January 11, 2010

I’ve been reading Programming in Lua and found a valuable guideline for the question in subject.

“There are no fixed rules for choosing between those two options, but we can provide a general guideline: An exception that is easily avoided should raise an error; otherwise, it should return an error code.”

Read the full section 8.3 – Errors to dig in.

I’ve got an NXT for New Year’s holidays

January 2, 2010

Forth!
No pbForth for NXT 2.0 (but I’ve wrote to Ralph, so may be later I’ll retry).

Lisp?
XS:Lisp; page in japanese… downloaded Franz Lisp, but it occurred that Lisp for NXT is a high layer that calls C functions via FFI and I can’t find a synonym for nxt.dll on Mac.

Java or pbLua?
pbLua, because the compiler is in firmware, so you only type your program into NXT via tty and,.. and because it is YAPL.

Статическая типизация и выведение типов в языке

December 11, 2009

Изучая систему типов Haskell, появилась мысль, как он может помочь при дизайне системы с нуля, в частности при определении необходимых и достаточных интерфейсов объектов.

В принципе, не обязательно Haskell, но язык обладающий статической типизацией и выведением типов.

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

Если же начать описывать систему на языке с указанными возможностями и без уточнения типов объектов (а иначе зачем всё это начинать?), то не приступая к фактической реализации можно запросить у компилятора, какие он смог сделать выводы насчёт типов объектов в описанной системе. Компилятор расскажет, какие требования к типам каждого аргумента каждой написанной функции он определил, и это и будет необходимый и достаточный набор интерфейсов объектов системы. Ничего лишнего!


Follow

Get every new post delivered to your Inbox.