QRMania — потрясающее обновление
На QRMania потрясающее, невероятное, восхитительное, чудесное, сногсшибательное обновление! Отныне создание QR-кодов происходит прямо у вас в браузере! Никаких обращений к серверу и передачи данных по Интернету. Сервер теперь нужен только для генерации EPS и предметов. В создание обычного кода и сохранении его в PNG-формате сервер никак не участвует и ваши данные от вас никуда не передаются, никем не читаются и никуда не записываются. По-моему, это замечательно.
Примеры использования Hastache
Выложил примеров для hastache: README.md (этот файл, кстати, хасташем же и собирается — mkReadme.hs). Эти же примеры россыпью файлов: examples.
Libqrencode-js: генерация QR-кодов на JavaScript
А вот какую офигенскую штуку я выложил!
Это генератор QR-кодов на чистом как хрусталь JavaScript, никаких серверных компонентов, всё прямо в браузере. Вот сразу демонстрашка для побаловаться.
Причем это не абы что, это порт продвинутой C-шной библиотеки libqrencode, которая работает в серверной части на подавляющем большинстве сайтов для генерации QR-кодов, и имеет биндинги ко всему на свете. Для JavaScript уже есть генераторы QR-кодов, но все очень сырые, в отличии от libqrencode который уже несколько лет пишется и, как я уже говорил, много где используется.
Процесс портирования C-шной библиотеки на JavaScript, это, скажу я вам, просто песня. Есть совершенно замечательный проект emscripten — компилятор LLVM в JavaScript. Вот с помощью него волшебство и произошло. Я написал небольшую C-шную обертку над libqrencode, скомпилировал всё вместе в LLVM-код с помощью Clang, передал в emscripten и написал JavaScript обертку над результатом его работы. Получилось хорошо.
Лицензия LGPL (вирусом от libqrencode). Пользуйтесь!
Hastache растёт и развивается
Новости хасташестроения:
Во-первых, Akaspin прислал полезный патч, позволяющий с помощью mkGenericContext создавать контексты для типов с полями MonadIO m => (Byte)String -> m (Byte)String, за что ему выдаётся очередной плюс в карму. Сам я о такой возможности думал, но не осилил, ура опенсорсу. Пример использования тут.
Во-вторых, я обобщил конструктор MuLambda до MuVar a => MuLambda (ByteString -> a), раньше можно было только ByteString возвращать, а теперь любой тип, для которого есть инстанс класса MuVar. Удобно, как-то я раньше не сообразил так сделать.
В-третьих, Сам Bryan O'Sullivan (один из авторов книги Real World Haskell), прислал небольшой патч для hastache и посоветовал использовать blaze-builder для записи результата работы шаблонизатора. Blaze-builder предназначен для генерации Lazy ByteString с контролем минимального размера фрагментов этой строки. За счет этого достигается существенное увеличение скорости дальнейшей работы с этой строкой. Вместо кучи мелких блоков (а именно так и получается при работе hastache), имеем несколько крупных, которые, к примеру, по сети уедут быстрее (за счет минимизации количества системных вызовов). Так что теперь и обычный результат hastache состоит из удобных крупных блоков внутри Lazy ByteString, и, также, можно получить непосредственно объект Builder библиотеки blaze-builder и дальше уже работать прямо с ним.