среда, 30 июня 2010 г.

Книга по fossil

Книгу можно скачать из fossil-репозитория: Fossil User Manual

четверг, 24 июня 2010 г.

Краеугольные камни HTML5: сайт HTML5ROCKS

Документация, рекомендации, примеры и место для тестирования HTML5: HTML5ROCKS

суббота, 19 июня 2010 г.

Книга jQuery Fundamentals

jQuery Fundamentals

Tcl/Tk widget demo

Давно демки не смотрел, а там появились новые и старые обновились, стоит взглянуть. И заодно стоит сделать wish алиасом для версии 8.5:
sudo aptitude install tk8.5
sudo update-alternatives --set wish /usr/bin/wish8.5
wish /usr/share/tcltk/tk8.5/demos/widget

Давненько же я Tk не использовал - когда-то написанные в дебиане под целевую платформу Windows XP утилиты успешно и без каких-либо усилий с моей стороны сначала "переехали" в висту, а теперь их уже пользователи в Windows 7 ставят и все работает. Вероятно, через год-другой работа с activesync и web camera будет нативно поддерживаться в популярных браузерах и эти утилиты станут вовсе не нужны. Хотя вот интересно, что получится из гуглового Native Client - кто знает, может, от веб-приложений снова перейдем к Tcl/Tk, только исполняемым в браузере или даже на сервере?.. Напоминает дежавю, не зря говорится, что развитие идет по спирали.

вторник, 15 июня 2010 г.

О стиле жизни

До сего дня неизвестный мне блоггер Лео Бабаута рассказывает о минимализме в жизни, на русском см. здесь: http://mnmlist.ru/

Есть и свои забавные стороны в том, что он пишет. Например, тут я бы никогда не отказался от… Попробовал бы он выйти на 40-ка градусный мороз после вегетарианской пищи... Еще интересно, почему он разделил "кабельное ТВ" и просто ТВ на разные пункты?.. И зачем он их раньше смотрел?... Хотя я не спорю, телевизор штука в доме полезная - у меня с него кот на шкаф прыгает, правда, приходится несколько раз в год сей трамплин вытирать от пыли, а то за котом реактивный след поднимается :-)

Upd.
И еще несколько переводов:
Хватит усложнять
Истинная цена вещей
Новые вещи не решат старые проблемы
Как избавиться от суеты

понедельник, 14 июня 2010 г.

Unicode в linux и tcl

Дело было относительно давно, 18-го апреля сего года:
(19:53:33) anton: Привет! привязка для collate -
http://www.siftsoft.com/inprogress/tclcoll.c

компилировать в collate.so, команда "сравнения строк в текущей локали" - collate s1 s2.

Makefile и прочей обвязки ещё нет, пока исследую, не поломается ли там чего (в норме tclsh не ставит LC_COLLATE по текущей локали вообще).
(19:54:23) anton: возвращает команда -1,0,1.
сортировать списки так: lsort -command collate
(19:56:10) anton: чтобы тебе меньше трудиццо и больше копипастить, вот команда сборки:
gcc -DUSE_TCL_STUBS -O3 -I/usr/include/tcl8.5 \
  -shared -fPIC -o collate.so tclcoll.c -ltclstub8.5
Вышеописанное расширение в апстрим пока не принято, так что подгружаем и пользуемся самостоятельно. А вот сегодня при обновлении debian testing+sid ко мне приехала следующая зависимость: libunistring0 Глядишь, наконец-то в линуксе появится стандартный путь для оперирования юникодными строками.

Управление временными зонами в веб-приложениях

Задача заключается в том, что каждый пользователь может работать в своей собственной временной зоне, более того, эта зона может изменяться. Широко распространенным вариантом решения проблемы является установка временной зоны непосредственно в настройках каждого пользователя. Минусы этого решения очевидны - эту настройку большинство пользователей никогда не найдет и не выставит в нужное значение, а при перемещении в другой город/страну и тем более никто об этом не вспомнит и не сменит свою временную зону. Другой вариант - использовать настройки ОС. Но увы, в стандартных HTTP-заголовках параметры временной зоны не передаются. Получить временную зону из яваскрипта напрямую тоже не удастся - можно узнать лишь временное смещение, которым могут соответствовать много зон. Что же делать? "Остается одно - только лечь помереть" (с). Или использовать смещение для локального времени, полученное на яваскрипт, в пределах одной сессии, а на стороне сервера применять соответствующее смещение. Например, для Москвы мы можем получить часовой пояс MSK или MSD (зимнее и летнее московское время), которым соответствуют смещения 3 или 4 часа. Чтобы было еще смешнее, в 1921-м году московское летнее время (MSD) имело смещение 5 часов от Гринвича, а в 2010-м году изменены часовые пояса для части субъектов РФ. Так что необходимо еще и текущую дату учитывать.

Код на яваскрипт тривиален:
getZone = function() {
tz = new Date().toString().replace(/^.*\(|\)$/g, "");
return tz;
}
alert(getZone());
Записать текущее значение часового пояса в кукисы также не представляет сложности. А вот на сервере все интереснее - нам нужна таблица всех временных зон и правил получения временного смещения для них. В линуксе есть пакет tzdata с нужной нам информацией, из которого несложно извлечь нужную информацию. В том числе, в тикле 8.5 есть соответствующие утилиты для преобразования в текстовые файлы. Подробнее см. здесь: Sources for Time Zone and Daylight Saving Time Data
Для OpenACS нашелся вот такой скрипт: http://pedroliska.com/files/load-timezones.tcl.txt Чтобы не лезть в код самого скрипта, запускаем его через враппер:
#!/usr/bin/tclsh8.5

proc ad_page_contract {args} {}

proc acs_root_dir {} {
  exec mkdir -p ./packages/ref-timezones/sql/common
  return "."
}
proc ReturnHeaders {args} {}
proc ns_write {line} {
  puts -nonewline $line
}
proc with_catch {errmsg if else} {
  uplevel 1 $if
}

proc ad_decode { args } {
#    this procedure is analogus to sql decode procedure. first parameter is
#    the value we want to decode. this parameter is followed by a list of
#    pairs where first element in the pair is convert from value and second
#    element is convert to value. last value is default value, which will
#    be returned in the case convert from values matches the given value to
#    be decoded
    set num_args [llength $args]
    set input_value [lindex $args 0]

    set counter 1

    while { $counter < [expr $num_args - 2] } {
 lappend from_list [lindex $args $counter]
 incr counter
 lappend to_list [lindex $args $counter]
 incr counter
    }

    set default_value [lindex $args $counter]

    if { $counter < 2 } {
 return $default_value
    }

    set index [lsearch -exact $from_list $input_value]
    
    if { $index < 0 } {
 return $default_value
    } else {
 return [lindex $to_list $index]
    }
}

source load-timezones.tcl.txt
В результате получаем два файла с нужной нам информацией: timezones.dat и timezone-rules.dat В файлике timezones.dat содержатся наименования временных зон - из яваскрипта мы эту информацию получить не можем, разве что предложим пользователю список выбора для ручного указания зоны, так что нам этот файл в настоящий момент не интересен (притом, если мы знаем наименование временной зоны, достаточно назвать ее тиклю или постгресу для пересчета, так что временное смещение уже не требуется, все совершенно тривиально). А вот timezone-rules.dat предоставляет все правила пересчета, с ним нам и придется работать. Как пример:
$ grep 2010 timezone-rules.dat |grep MSD
#tz_id, abbrev, utc_start, utc_end, local_start, local_end, gmt_offset, isdst
391,MSD,Sat Mar 27 23:00:00 2010,Sat Oct 30 22:59:59 2010,Sun Mar 28 03:00:00 2010,Sun Oct 31 02:59:59 2010,14400,t
428,MSD,Sat Mar 27 23:00:00 2010,Sat Oct 30 22:59:59 2010,Sun Mar 28 03:00:00 2010,Sun Oct 31 02:59:59 2010,14400,t
Здесь строчку комментария я добавил для удобства просмотра. Мы видим 2 временные зоны (а для зимнего времени MSK и более того - найдутся 4 зоны), несложно получить и их названия:
$ grep 391 timezones.dat 
391,W-SU,+030000
veter@veter-eeepc:/srv/work/tcl_tz/packages/ref-timezones/sql/common$ grep 428 timezones.dat 
428,Europe/Moscow,+030000
Нужная нам информация о временном смещении содержится в предпоследнем поле файла timezone-rules.dat, в данном случае это 14400 секунд от UTC. Флаг в последнем поле этого же файла подсказывает, что время летнее. Значит, на серевере для текущей сессии пользователя следует использовать временное смещение +4 часа, что и требовалось узнать. Upd. На практике, раз нам все равно не удается узнать временную зону, достаточно воспользоваться вот таким яваскрипт-кодом для получения временного смещения в секундах:
getZone = function() {
  return -(new Date()).getTimezoneOffset()*60;
}
alert(getZone());
Полученное значение следует прибавить на сервере ко всем значениям времени в UTC, передаваемым клиенту. Можно также хранить в кукисах и аббевиатуру, чтобы выводить время в виде "2010-06-01 12:00:00 MSD" (заметим, что в России не принято отображать время в подобном формате). Upd. В очередной попсовой статейке в тему: Автоматическое определение часового пояса пользователя попался интересный комментарий:
Все даты у меня возвращаются пользователю, как Unixtime в UTC. После, скармливаю этот таймштамп объекту new Date(timestamp), а Javascript знает, что Unixtime должен быть в UTC и сам корректирует дату с учетом текущего часового пояса пользователя. И в конце можно отформатировать дату как угодно, перед отображением пользователю. Таким образом, я никогда у пользователя не спрашиваю его часовой пояс, но даты ему отображаются корректно.

За неимением повсеместной поддержки HTML5 тоже решение.

среда, 9 июня 2010 г.

Просмотр сертификата с помощью openssl

Страничка вики: OpenSSL

Скрипт для разбора данных сертификата и отображения в нужном нам формате:
#!/usr/bin/tclsh8.5

set titles {Страна Регион Город Организация {Общее имя (СЦ)} {E-mail адрес}}

set cert [exec openssl x509 -text -in test.pem]

proc parse_sec {cert sec} {
  set regexp {: C=(.*), ST=(.*), L=(.*), O=(.*), CN=(.*)/emailAddress=(.*)}
  set regexp $sec$regexp
  set res [regexp -line -inline $regexp $cert]
  if {$res ne {}} {
    return [lrange $res 1 end]
  }
  return
}

proc parse_date {cert sec} {
  set regexp "Not $sec\\s*: (.*)"
  if { [regexp -line $regexp $cert res date] == 1 } {
    return $date
  }
  return
}

puts {Кто выдал}
foreach title $titles value [parse_sec $cert Issuer] {
  puts "$title: $value"
}

puts {Кому выдан}
foreach title $titles value [parse_sec $cert Subject] {
  puts "$title: $value"
}

puts [parse_date $cert Before]
puts [parse_date $cert After]

вторник, 8 июня 2010 г.

Системы очередей - легковесные реализации

В продолжение темы посмотрим на "легкие" реализации. Поиск я начал с упомянутой в рассылке sqlite-users библиотеки libjlog, а в итоге пришел к вот такой презентации: Playing Nice with Others, где рассказывается, в том числе, про сервер очередей beanstalkd с простым протоколом (есть клиентские библиотеки для кучи языков, только вот для тикля клиент отсуствует... пока) и, к тому же, он обнаружился в дебиане. Еще из перечисленных в презентации в дебиане нашелся пакет zeromq-bin, см. ZeroMQ Погуглив на тему Tcl-интерфейса к последнему, нашел вот это сообщение в рассылке: [zeromq-dev] TCL binding

понедельник, 7 июня 2010 г.

Firefox дурит с редиректом

Только что обнаружилось премерзкое поведение Файрфокса - игнорирует редирект на ту же страницу (после установки кукисов). В итоге авторизация, прекрасно работающая в гугл хроме, в файрфоксе не проходит. Как обходной путь, можно указать этому извращению, то бишь файрфоксу, редирект на ту же страницу с добавлением единственного символа "?" - это он отрабатывает. Замечу, что даже в ИЕ6 нет подобной проблемы, видимо, Файрфокс решил поспешить на свалку истории в погоне за "оригинальностью".

воскресенье, 6 июня 2010 г.

HTML5 browser checker

Воспользовавшись нижеуказанным сервисом, можно быстро получить нужную информацию: The HTML5 test - How well does your browser support HTML5?

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

Согласно этому сервису, уже сейчас можно использовать укороченный doctype, все равно браузеры наплевательски относятся к дополнительным атрибутам, требуемым текущим стандартом. Даже в ИЕ6 достаточно указания !DOCTYPE HTML. Соответственно, внес необходимые изменения в пакет mbgserver-html.

Пакет с набором иконок Fugue Icons

Обновился открытый набор иконок Fugue Icons 2.9.3a, распространяемых под лицензией Creative Commons Attribution 3.0 license:
2,926 icons are included in PNG format (16x16 pixels) + bonus.

Как известно, иконки разные нужны, иконки разные важны, так что я собрал деб-пакет fugue-icons, который и выложил в свой репозиторий. Ставим, пользуемся.

суббота, 5 июня 2010 г.

Памяти академика Арнольда

Владимир Арнольд

Пара особенно интересных (для меня) статей из перечисленных по ссылке выше:
Нужна ли в школе математика?
Новый обскурантизм и Российское просвещение

И еще:
Математическая безграмотность губительнее костров инквизиции
АНТИНАУЧНАЯ РЕВОЛЮЦИЯ И МАТЕМАТИКА
АКАДЕМИК В. И. АРНОЛЬД:ПУТЕШЕСТВИЕ В ХАОСЕ

И задачка для 5-го класса от Арнольда:
Из города А в город Б и из города Б в город А на рассвете одновременно вышли две старушки. В 12 часов они встретились. Потом продолжили свой путь. Одна пришла в конечный пункт в 4 часа дня, а другая — в 9 вечера. Вопрос: в каком часу рассвело в этот день?..

Красивая задача, не правда ли? Конечно, обычная пропорция, но в решении есть изюминка, поскольку получаем квадратное уравнение, причем в каноническом виде, так что для решения знания таблицы умножения достаточно. Из класса задач "из пункта А в пункт Б" эта задача выделяется явной оригинальностью.

пятница, 4 июня 2010 г.

HTML5 video player

Очередная приятность HTML5: Video JS - Open Source HTML5 Video Playe

Перетаскивание файлов в веб

Все мы привыкли к устройству под названием "манипулятор типа мышь" - хотя во многих случаях польза от него бывает сомнительной. Вот, например, в браузере на современных сайтах без мышки никак, такой уж интерфейс большинства веб-проектов. Забавно - действия, которые можно и без мышки выполнить, с клавиатуры, создатели интерфейсов (не только веб) заставляют нас выполнять мышью, а вот то, что очень даже удобно делать мышью - перетаскивание группы файлов - сделать нельзя вовсе! Прекрасной новостью будет то, что теперь все-таки можно. Работает в браузерах файрфоксе 3.6 и гугл хром, хотя с последним не очень понятно, в каких именно версиях поддерживается данная возможность - в линуксе с версией хром 6 все ок, а в винде в одной и той же версии у кого-то работает, а у кого-то нет (вариант с кривыми руками не озвучиваем, ибо эти некоторые мой блог читают, лучше спишем на некие астральные проблемы).

Работающий пример и описание реализации:
Перетаскивание файлов в браузер (Drag and Drop, XMLHttpRequest)
А здесь побольше рассказано о самой технологии, но похуже с реализацией: FileAPI

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

среда, 2 июня 2010 г.

О символах

В наше время веб-приложений с растущими возможностями много говорят и пишут об оптимизации на стороне клиента, для быстрого и красивого отображения содержимого веб-страниц. И вот мы вновь и вновь слышим про оптимизацию изображений, создание спрайтов... В то время как самый true way остается нехоженным! О чем это я? Все просто - вспомним про стандарт Unicode. В этом стандарте есть символы многих и многих алфавитов, а плюс к тому, математические символы, значки для отображения шахмат, карт и много чего еще. Так вот вместо картинок в качестве мелких иконок замечательно подходят именно стандартные символы. Посмотреть их можно, например, здесь - в виде набора pdf-файлов, где приведены и код и картинка соответствующих символов. Вот, скажем, такой набор Dingbats может заменить многие иконки для ajax-приложений. Для перевода кода символов в десятичную систему счисления можно воспользоваться таким сервисом: Онлайн калькулятор: Перевод из одной системы счисления в другую. Определяя в css-файле размер и вид выбранных значков, имеем чрезвычайно компактный и стандартный стиль, который корректно отображается в любом браузере под любой операционной системой. Теперь мы в полной мере осознаем всю бесполезность и убогость концепции спрайтов и прочих ухищрений от любителей ходить окольными путями.

Upd. Добавлю, что речь, в основном, идет о проектах, которым нужно поддерживать браузеры IE6/7, не понимающие data:URI. В дальнейшем будет несложно заменить коды символов в css-файлах на изображения в формате data:URI, ежели захочется большей гламурности.

Upd. В помощь веб-разработчику: Unicode

(C) Alexey Pechnikov aka MBG, mobigroup.ru