Posts

Showing posts with the label Tcl

TclCloud is an opensource tcl interface to the Amazon AWS webservices

Свершилось :) Полное описание и исходники см. по ссылке TclCloud TclCloud is an opensource tcl interface to the Amazon AWS webservices api that enabled cloud automation of most AWS products and operations. Example use cases include the following: * starting and stopping EC2 instances * attaching EBS volumes * creating and interfacing with SimpleDB and RDS instances * managing EC2 Autoscale and Load Balancer configurations * sending Simple Email Service messages * creating, submitting and monitoring Elastic Map Reduce (Hadoop) jobs * configuring VPC networks * and so on ... For more information on the Amazon AWS cloud products, see: http://aws.amazon.com/products/ Для удобства собрал пакет, брать в моем репозитории или по ссылке Tcl cloud deb package

Looking Ahead to Tcl 8.6 Jeff Hobbs

Про тикль 8.6, немного о бизнесе: Looking Ahead to Tcl 8.6 Jeff Hobbs Похоже, 8.7 все-таки будет, прежде чем появится версия 9.

Smooth Transitions: Using Tcl 8.5 and upgrading to Tcl 8.6

Скачать видеоролик: mplayer mms://a458.v235433.c23543.g.vm.akamaistream.net/7/458/23543/v0001/citrixvar.download.akamai.com/23543/www/231/846/4588671966114231846/1-4588671966114231846-12b5f34cf3a.wmv -dumpstream -dumpfile _tcl.wmv Создать индекс (для обеспечения возможности перемотки при воспроизведении): mencoder -forceidx -oac copy -ovc copy -o tcl.wmv _tcl.wmv Если mencoder не установлен или по каким-то причинам не хочется создавать индекс в файле вышеприведенной командой, можно запустить следующим образом: mplayer -forceidx _tcl.wmv При этом индекс будет создаваться "на лету" при каждом запуске.

Embedded Languages

For some reasons I find a few presentations about C applications with embedded Tcl script interpretator. The best links you can see below: Embedded Languages Tcl and C

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, только исполняемым в браузере или даже на сервере?.. Напоминает дежавю, не зря говорится, что развитие идет по спирали.

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-заголовках параметры временной зоны не передаются. Получить временную зону из яваскрипта напрямую тоже не удастся - можно узнать лишь временное смещение, которым могут соответствовать много зон. Что же делать? "Остается одно - только лечь помереть" (с). Или использовать смещение для локального времени, полученное на яваскрипт, в пределах одной сессии, а на стороне сервера применять соответствующее смещени...

UUID для PostgreSQL с помощью Tcl

Понадобилось мне быстро добавить уникальный идентификатор (uuid) к таблице. На тикле нужная функция пишется очень легко - с помощью пакета uuid или вызова внешней утилиты. Генерация 10 000 идентификаторов во втором случае занимает около 10 с на десктопе, что вполне себе шустро, так что на нем и остановимся. Установим пакет с нужной нам утилитой: sudo aptitude install uuid А вот и реализация функции: --DROP FUNCTION uuid(); CREATE OR REPLACE FUNCTION uuid() RETURNS text AS $BODY$ return [string map {- ""} [exec uuid]] $BODY$ LANGUAGE 'pltclu' VOLATILE SECURITY DEFINER; ALTER FUNCTION uuid() OWNER TO offline; --select uuid(); alter table offline.documents add column checksum text not null default uuid(); CREATE UNIQUE INDEX documents_checksum_idx ON offline.documents USING btree (checksum); Очень даже наглядная иллюстрация "unix way". Разумеется, так делать можно только под юниксами, где порождение множества процессов есть совершенно но...

Tcl и XMPP

Есть и сервер и клиент: tclxmppd - Cross-platform XMPP and Jabber server written in Tcl tclxmpp - XMPP client and component library in Tcl А также в клиенте Cocinella можно посмотреть соответствующую библиотеку: JabberLib Как оно сделано в Tkabber я не знаю, но нужный код там тоже есть. Плюс мы всегда можем вызвать внешнюю утилиту, например, ejabberdctl (необходимо запускать от рута или пользователя ejabberd) или sendxmpp (от любого пользователя, но требуется указать логин и пароль для доступа к jabber-серверу).

Memcached и Tcl

MEMCACHED FOR TCL Требует библиотеку libmemcached, для которой в дебиане squeeze есть пакет libmemcached2 и в sid пакет libmemcached4 . Актуальные исходники брать здесь: http://github.com/bovine/memcached-for-Tcl

Расширения для Tcl

Tcl Extensions - by Category

Репликация пользователей из основной БД в ejabberd

Для обеспечения высокой доступности при минимальной нагрузке оптимальным решением является синхронизация учетных записей пользователей из основной БД в базу ejabberd (mnesia). Ранее я приводил пример авторизации внешним скриптом, но для более-менее серьезного применения это создает лишнюю нагрузку на основную БД, плюс снижает доступность. См. ejabberdctl should be able to dump to stdout . Дамп пользователей sudo ejabberdctl dump_table /tmp/dump passwd Парсер дампа #!/usr/bin/tclsh8.5 proc K {arg args} {set arg} proc В результате для каждого виртуального хоста получаем список формата {nickname password}, далее сравниваем с аналогичной записью в основной БД и для отличающихся обновляем через ejabberdctl или любым удобным нам способом. Скрипт разумно запускать от имени пользователя ejabberd, подкладывая ему в заранее определенное место дамп пользователей из основной базы или настроив доступ на чтение к основной базе. Дамп 3000 пользователей из ejabberd занимает около 0,25 с, обно...

Tcl VFS integration for Sqlite3

Сегодня ночью с 3-х до 7-ми часов была придумана, написана, протестирована и документирована вот такая вещь: Tcl VFS integration for Sqlite3 Лично я участвовал только в четных из указанных пунктов, считая с нуля :-) но подтверждаю - под дебианом оно замечательно работает, в том числе позволяет аттачить базы. Спасибо Антону, вещь ценная.

Сумма прописью на tcl

По словам Anton Kovalenko, "КЛАДР напомнил о бурной юности..", и он прислал мне кусок своего кода, любезно разрешив его опубликовать на правах Public Domain: namespace eval speller { set names(19) { {ноль} {один одна} {два две} три четыре пять шесть семь восемь девять десять одиннадцать двенадцать тринадцать четырнадцать пятнадцать шестнадцать семнадцать восемнадцать девятнадцать} set names(90) { {} {} двадцать тридцать сорок пятьдесят шестьдесят семьдесят восемьдесят девяносто } set names(900) { {} сто двести триста четыреста пятьсот шестьсот семьсот восемьсот девятьсот} set major_triads { {1 тысяч а и {} 0} {0 миллион {} а ов 0} {0 миллиард {} а ов 0} {0 триллион {} а ов 0} {0 квадриллион {} а ов 0} {0 квинтиллион {} а ов 0} {0 секстиллион {} а ов 0} } set rur_descrip {0 рубл ь я ей 1} set kop_descrip {1 копе йка йки ек 1} proc spell {num descrip {usercall 0}} { variable names foreach {female root one two five spellZero} [lindex $descrip 0] {break} ...

Tcl на arm-android и другое

Alexander Danilov прислал интересные ссылочки: /tclkit/android-arm/ Judy Arrays Exploring Expect (477 страниц) Насчет этой ссылки мнения разделились, но все же: Tcl3D offers the 3D functionality of OpenGL and other 3D libraries at the Tcl scripting level. А вот еще попалось на глаза: The L Programming Language

Клиент-серверное взаимодействие

Предисловие, написанное после завершения заметки: все тесты выполнялись на ноутбуке core2duo, со сниженной до 800Мгц частотой процессора (для мирного использования дома хочется тишины). На десктопе с coreQuad процессором время уменьшится в несколько раз (имхо примерно втрое). Воспользуемся утилитами DJB. Проверим скорость: $ time ./header@ localhost / 8081 HTTP/1.0 200 OK Date: Tue, 5 Jan 2010 22:12:53 GMT Connection: close Cache-control: no-cache, no-store Content-Type: text/html; charset=utf-8 Content-Length: 1502 real 0m0.017s user 0m0.008s sys 0m0.012s $ time ./responce@ localhost / 8081 > test.html real 0m0.018s user 0m0.008s sys 0m0.008s $ time cat test.html |./header HTTP/1.0 200 OK Date: Tue, 5 Jan 2010 22:22:47 GMT Connection: close Cache-control: no-cache, no-store Content-Type: text/html; charset=utf-8 Content-Length: 1502 real 0m0.009s user 0m0.004s sys 0m0.004s Как видим, отправка запроса и получение ответа с помощью tcpclient занимает около 9 мс (включая время на преоб...

Updated sqlite3-rdiff

Image
The new version of sqlite3-rdiff utility can produce really small signatures. See below test on 10 Mb database. The analyze mode will help you to select optimal parameters for your databases.

AOL Server API

В далекие времена, когда API AOL Server нельзя было просто взять и загрузить в обычный тиклевый интерпретатор, жил-был вот такой проект: nstcl Исходники можно посмотреть в репозитории здесь . Начиная с версии 4.x, все намного проще: $ tclsh % load /usr/lib/aolserver4/lib/libnsd.so % join [lsort [info commands ns_*]] "\n" ns_addrbyhost ns_adp_abort ns_adp_append ns_adp_argc ns_adp_argv ns_adp_bind_args ns_adp_break ns_adp_close ns_adp_compress ns_adp_ctl ns_adp_debug ns_adp_dir ns_adp_dump ns_adp_eval ns_adp_exception ns_adp_flush ns_adp_ident ns_adp_include ns_adp_mime ns_adp_mimetype ns_adp_parse ns_adp_puts ns_adp_registeradp ns_adp_registerproc ns_adp_registerscript ns_adp_registertag ns_adp_return ns_adp_safeeval ns_adp_stats ns_adp_stream ns_adp_tell ns_adp_trunc ns_after ns_atclose ns_atexit ns_atshutdown ns_atsignal ns_cache ns_cache_flush ns_cache_keys ns_cache_names ns_cache_size ns_cache_stats ns_cancel ns_chan ns_charsets ns_checkurl ns_chmod ns_cond ns_config ns_...

The small signature for sqlite3-rdiff

Depends: current test version of sqlite3-rdiff The sqlite3-rdiff utility produces a signature file of size about 10% of original database size. Yes, it's better than coping an entire database but it's not good enough for production use. So I wrote a new algorithm that can build the small signatures. The algorithm calculates checksums for set of rows and so with N rows in each set the signature size will be decreased by the factor of N! Of course the delta file size will be increased but only a little for most databases. My code uses a hack select rowid/N as rowid, sum(murmurhash('$unixepoch',$cols)) from ... group by rowid This solution is not good and may be used for testing only. This code will fail with N>16. $ time ./sqlite3-rdiff signature slave.db slave.db.signature signature slave.db slave.db.signature --table-name % --rows-per-hash 1 =7 system_config =160 center =7 role =1 macroregion =988 point =7 region =1841 user =2867166 document_status =25 c...

sqlite3-rdiff: master-slave replication for SQLite

Link: http://mobigroup.ru/files/sqlite-ext/sqlite3-rdiff Depends: tcl 8.5, sqlite3, murmurhash SQLite extension I'm glad to annonce the sqlite3-diff utility for SQLite replication. Are used the ROWID value as unique key of row and murmurhash for build signatures for each row. It's enough for master-slave replication. The INTEGER PRIMARY KEY is not mandatory becouse sqlite3-rdiff may store the ROWID values. The signature and delta files are valid SQLite3 databases too. They can be dumped/restored, updated and analyzed by any SQLite3 client application. Hash collisions are resolved by using unique salt for each signature. So after first sync the theoretical frequency of collision (when any record is changed but the hash is same) is about 10^-9, after second sync - 10^-18, after N syncs - 10^-N*9. The salt is unix epoch time which is saved by using "PRAGMA user_version" in signature and delta databases. Note: the master-master replication is now unsupported becouse is...