29 нояб. 2009 г.
27 нояб. 2009 г.
Уникальная фича Google Wave
Благодаря тому, что в GW в реальном времени видно, что печатает собеседник, GW — это первое электронное неголосовое средство общения в котором я могу его перебить!
Зря они эту фичу сделали :-)
26 нояб. 2009 г.
24 нояб. 2009 г.
luamarca
Наконец-то слегка привёл в чувство и выложил луашную бенчмаркилку.
Надо теперь в бенчмарках порядок навести.
22 нояб. 2009 г.
Хабрастатьи
Хабранаписал хабрадве хабрастатьи.
Хабраплюсуйте:
Ярлыки:
git,
habrahabr.ru,
Lua,
programming,
tools
Оформление кода для Хабра
Оформление код для хабрастатей:
- Расцветить код на highlight.hohli.com со включённой галочкой "Use tag (for Habrahabr)".
- Добавить внутрь тега blockquote тэг code
- Если код не требует расцветки, проще его обрамить в blockquote-code-pre.
21 нояб. 2009 г.
Lua vs. C++ for large programs
Mature C++ programmers often argue against intense Lua usage in the large programs.
They say that C++ is fast, Lua is slow. C++ has excellent tools to provide compile-time validation, while Lua is too dynamic and, therefore, unreliable.
Some time ago there was a related discussion on Lua mailing list. I hear these arguments so often, that I've decided to post a small essay in reply. Now I'm posting a slightly edited version of this essay here.
* * *
Several years before, when I came to Lua, my professional programming experience was almost all C++, without much of dynamic languages experience. Indeed, in C++, with careful design, compile-time validation can give very good correctness guarantees.
At first it was quite hard to write code in Lua — without compile time validation, without static types, it felt as if I try to stand on a blob of wobbly jelly instead of a good solid rock.
However, the price of such validation is quite high. Not to mention longer compile times. You need to spend much time on the design itself. Sometimes much more time than you'd spend solving the problem that you write code for. You need highly skilled and disciplined architector paying constant attention to the each part of the project all the time. You need highly-qualified programmers.
If you have a hammer, try to avoid looking on everything as a nail.
I quite understand if that amount of effort is spent on the low-level "foundation" code in the system (application, library etc.). It is usually written once, must be of high quality and work fast. But to waste it on the business logic, that mutate every day to the whim of the high command?
You want to be able to write cheap business logic code. Okay, it should be reliable enough and fast enough. But it is usually comes in huge quantities, and you should be able to change it quick. You should not need extra skilled programmers to write it — or your budget will bust.
Lua is perfect here — it is reliable, quite fast and easy to grasp.
Compile-time guarantees are not possible to achieve with pure Lua. As we know, Lua compiler is dumb (and this is a good thing — since it is also fast and simple).
I do hope that, in time, we would get Metalua-based static code validation tool, powerful enough to do something like that. But there is no such tool now.
However, there is a simple solution. Write tests.
Any static analysis tool may only catch such generic errors, that it has heuristics for. Even C++ compile-time validation will catch only so much of wrong logic — and the more it may catch, the greater the price you have to pay for the code.
To give a sense of scale: My last project had 160+ KLOC of Lua code. 80 KLOC of it were tests for our Lua and C++ code (we had 90+ KLOC of C++ in total). Most of our tests were declarative and consist of table-structured input / expected output data, they were significantly sparser than the usual code, so the price per LOC is lower.
Tests catch more (you may tune them exactly to the behaviour you expect), they cost less (you may employ less sophisticated programmers), they help refactoring at least as much as the static compile checks.
If we compare Lua with "test-time" validation and C++ with its compile-time checks, to me Lua is the winner (for the business logic at least).
* * *
Do not be afraid to use Lua in large-scale applications! It is at least as easy to write reliable code in Lua as in C++.
Of course, you have to write tests, but you should write them anyway. Lua is powerful enough and is fast enough (especially with LuaJIT 2) to make you happy. Yet it is simple enough so you don't have to force guru-level programmers to write tons of mind-numbing business-logic code.
genmakefile
Когда я писал luabins, я довольно долго возился с системой сборки проекта.
По умолчанию luabins собирается как C89. Однако, со сборкой в тестовом режиме (make test) не всё так просто.
Хорошим тоном считается, когда луашный модуль написан, как и сам Луа, на "clean ANSI C" — подмножестве C89, C98 и C++.
Luabins следует этим гайдлайнам, и, значит, должен собираться под все три таргета. Под все три таргета должны запускаться и тесты. Есть желание не запускать тесты если они уже прошли и код с тех пор не менялся.
С учётом всех требований вся система получается довольно сложной.
Поскольку простой пользователь никогда не видит этой сложности, я не хотел вводить дополнительные зависимости и использовать стороннюю систему сборки. Нужно было обойтись простым Makefile.
Писать такой Makefile руками — тяжело. Нужен генератор.
Поскольку luabins — некоммерческий проект, мне было интересно написать такой генератор самому, в качестве развлечения.
Получился genmakefile.
Genmakefile — интересный "игрушечный" прототип мощной системы генерации текста на основе текстовых шаблонов.
Вот пример входных данных: Makefile.luabins.template.
По умолчанию luabins собирается как C89. Однако, со сборкой в тестовом режиме (make test) не всё так просто.
Хорошим тоном считается, когда луашный модуль написан, как и сам Луа, на "clean ANSI C" — подмножестве C89, C98 и C++.
Luabins следует этим гайдлайнам, и, значит, должен собираться под все три таргета. Под все три таргета должны запускаться и тесты. Есть желание не запускать тесты если они уже прошли и код с тех пор не менялся.
С учётом всех требований вся система получается довольно сложной.
Поскольку простой пользователь никогда не видит этой сложности, я не хотел вводить дополнительные зависимости и использовать стороннюю систему сборки. Нужно было обойтись простым Makefile.
Писать такой Makefile руками — тяжело. Нужен генератор.
Поскольку luabins — некоммерческий проект, мне было интересно написать такой генератор самому, в качестве развлечения.
Получился genmakefile.
Genmakefile — интересный "игрушечный" прототип мощной системы генерации текста на основе текстовых шаблонов.
Вот пример входных данных: Makefile.luabins.template.
То, что получается на выходе, мы уже видели в luabins: Makefile.luabins.out.
Вот код, который заставляет это всё работать: genmakefile.lua
Что же мы получаем из этих четырёхсот строк кода?
Что же мы получаем из этих четырёхсот строк кода?
- Шаблонную систему с подстановкой значений по ключам.
- Из шаблона можно контролировать подстановочные словари.
- Можно создавать макросы, переопределяя язык подстановок.
- Можно использовать шаблоны и макросы неограниченной вложенности — шаблоны, генерирующие шаблоны и т.п.
- Несколько вызовов, специфичных для генерации Makefile-ов. :-)
- Плохо продуманый синтаксис.
- Плохо продуманное API.
- Маловменяемые сообщения об ошибках.
Ярлыки:
codegeneration,
genmakefile,
Lua,
programming,
text templates
luabins
К вопросу о неанонсированных релизах. :-) Обнаружил, что ещё ничего не писал здесь про luabins.
Лицензия: MIT.
С библиотекой можно работать как из Луа, так и напрямую из C/C++.
Основное назначение luabins — сериализация данных для Lua-to-Lua RPC вызовов. При этом библиотека отлично подходит и для хранения простых данных.
Luabins поддерживает примитивные типы: nil, boolean, number и string. Поддерживаются нерекурсивные таблицы разумной вложенности (250 уровней по умолчанию, настраиваемо).
Luabins намеренно не поддерживает рекурсивные таблицы, функции, корутины и userdata. (Если нужна сериализация этих типов — вам к Pluto.)
Наивный пример работы на Lua:
Работа через luabins существенно быстрее чем сохранение и загрузка данных через луашный код в духе tstr и tserialize.
Размер сохранённых данных обычно больше, чем при сохранении в луашный код. (В основном из-за представления целых чисел в виде double; это та же проблема, что и при компиляции луашных исходников в байт-код.) В следующих версиях запланированы оптимизации на эту тему.
Luabins намеренно не сохраняет и не проверяет никакую мета-информацию о данных (включая версию формата!). Если нужно, эту информацию нужно подклеивать к данным руками.
Luabins пытается защищаться от враждебных (или просто неверных) данных при загрузке. Делаются проверки на переполнение и на переаллокацию.
На данный момент Luabins используется в нескольких коммерческих проектах.
Дополнительное чтение:
lua-phpserialize
Некоторое время назад я выложил v0.0.1 библиотеки lua-phpserialize.
Только теперь дошли руки написать об этом в блог. :-)
Части запланированных фичей нет (patches are welcome), но уже текущую версию библиотеки можно (и нужно) использовать для сохранения луашных данных в формат, понимаемый PHP-шным unserialize().
Очень удобно использовать для передачи данных из Lua в PHP.
Ограничения:
Как обычно, рекурсивные таблицы, функции и userdata не поддерживаются. Также, форматом PHP-шных массивов налагаются определённые ограничения на ключи.
Подробнее — здесь.
Ярлыки:
Lua,
lua-phpserialize,
PHP,
programming,
serialization
luadevtools
Слухи:
В проект добавлен Fabien Fleutot, автор metalua.
Проект создан от имени Sierra Wireless, работодателя Fabien'а.
Обещанное Fabien'ом наконец-то начало сбываться?
Ура!
20 нояб. 2009 г.
К вопросу о генераторах генераторов
Примечательный quine:
http://catap.ru/blog/2009/11/09/one-japan-man/
Ruby -> Python -> Erlang -> Perl -> Lua
-> OCaml -> Haskell -> C -> Java -> BrainFuck
-> Shell -> Whitespace -> Unlambda
-> Ruby
19 нояб. 2009 г.
Paul Graham on Apple's AppStore
When you look at the famous 1984 ad now, it's easier to imagine Apple as the dictator on the screen than the woman with the hammer. In fact, if you read the dictator's speech it sounds uncannily like a prophecy of the App Store.We have triumphed over the unprincipled dissemination of facts.
We have created, for the first time in all history, a garden of pure ideology, where each worker may bloom secure from the pests of contradictory and confusing truths.— Paul Graham, Apple's Mistake.
Gource: Визуализация истории кода
Медитативно, познавательно и, главное, крайне просто в использовании.
Смотрю на то, что было сделано год назад... Вспомнил пару занятных вещей :-)
18 нояб. 2009 г.
10 нояб. 2009 г.
20 Linux System Monitoring Tools Every SysAdmin Should Know
http://www.cyberciti.biz/tips/top-linux-monitoring-tools.html
Надо уже, наконец, запомнить:
- vmstat
- w
- sar
- mpstat
- pmap
- ss
- iptraf
- ntop
Но про dstat они так и не написали...
Поддержка Unix Domain Sockets в Lua
- LuaSocket's "undocumented" feature.
- nixio
- luasys
Ярлыки:
links,
luasocked,
network,
programming,
unix domain sockets
Yahoo открыл TrafficServer
TrafficServer — быстрый (до 35.000 запросов в секунду) кеш и прокси для HTTP/1.1.
Общение с ядром при помощи SysRq
Наиболее полная статья, что мне попалась по теме.
Не только ALT + SysRq + R, S, I, U, B, но и, например, D.
Что Гугль знает о моём аккаунте?
Написано здесь:
В том числе помечено, какая информация доступна публике.
Ярлыки:
google,
google dashboard,
links,
security
9 нояб. 2009 г.
7 нояб. 2009 г.
Linode.com
Какое-то время назад перетащил свой VPS с Мастерхоста на Linode.com. Доволен как слон, отличный сервис. Цена та же (20$), и всё кроме пинга ровно в 10 раз лучше. Пинг, правда, в 10 раз хуже (200 вместо 20), но мне это не критично.
Если вдруг кто будет брать себе у них хостинг, предлагаю воспользоваться моей реферральной ссылкой. ;-)
2 нояб. 2009 г.
Веб-прокси через SSH
У Йоты проблемы с роутингом на часть сайтов.
Если есть ssh на внешний сервер с нормальным провайдером, эти проблемы легко обойти.
Если есть ssh на внешний сервер с нормальным провайдером, эти проблемы легко обойти.
$ ssh -D 9999 login@server
А потом настроить в браузере SOCKS5 proxy на 9999-й порт локалхоста.
Проверить можно сравнением внешних айпишников в разных браузерах (настроенном и не настроенном).
Также можно поднять локальный HTTP-прокси перед SOCKS-прокси для пущей совместимости.
Взято отсюда.
1 нояб. 2009 г.
LuaJIT 2 beta1 is out!
Вышла долгожданная бета LuaJIT 2.0!
Анонс:
Reddit:
Бенчмарк:
LuaJIT 2 перекрывает Fortran в некоторых численных тестах!
Подписаться на:
Сообщения (Atom)