Доступ к элементам списка по номеру в Hastache
Это конечно очень приятно когда что-то полезное делаешь. Пользователей Hastache в мире может и не очень много, но они точно есть. Вот недавно Christiaan Baaij прислал сообщение о функции которая есть во многих реализациях шаблонизатора Mustache, а в Hastache нет. Это обращение к элементам списка по номеру, т.е. как-то так:
|
|
Полезная штука, мне ни разу пока не пригодилась (поэтому и не сделал), однако легко можно придумать ей применение и кому-то такое точно понадобится.
Пользоваться так:
|
|
Результат:
|
|
Алгоритм Ахо-Корасик на Haskell
Выложил в open source свою реализацию алгоритма Ахо-Корасик на Haskell. Код на GitHub. Пакет в HackageDB.
Алгоритм Ахо-Корасик — алгоритм поиска подстрок, созданный Альфредом Ахо и Маргарет Корасик в 1975 году. Этот алгоритм предназначен для одновременного поиска сразу большого количества подстрок. Алгоритм состоит из двух фаз: сначала строится конечный автомат по всем подстрокам которые нужно будет искать, и дальше через этот построенный автомат пропускается текст, в котором эти подстроки нужно найти.
Моя реализация обобщена для любых последовательностей значений, для которых реализован тайп-класс Hashable (т.е. искать можно не только строки, но и, скажем, последовательность из чисел).
Примеры использования
Самый простой вызов:
|
|
|
|
К искомым строкам можно привязать произвольные данные:
|
|
|
|
Созданный автомат можно запускать по шагам (если нужен поиск не по спискам, а по чему-нибудь другому):
|
|
|
|
Некоторые подробности реализации
Построение конечного автомата у меня сделано в монаде ST. Это монада используется, когда вам нужны вычисления с изменяемыми данными, но при этом никакой внешний мир не нужен (т.е. монады IO для вас слишком много), соответственно снаружи монады мы имеем чистый интерфейс, а внутри у нас есть мутабельные переменные и массивы. Там я написал простейшую FIFO очередь в этой монаде, можно почитать кому интересно.Сам поиск с использованием созданного автомата сделан уже в чистых функциях, это можно видеть в примерах выше.
Ссылки по теме
Англоязычный генератор QR-кодов: qrcode.cx
Запустил англоязычную версию своего генератора QR-кодов: www.qrcode.cx.
Доменная зона .cx принадлежит Острову Рождества в Индийском океане. Население острова — 1400 человек. Площадь острова — 135 кв. км. Лучшей доменной зоны придумать нельзя.
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 и дальше уже работать прямо с ним.
«Широкий поиск» всё
С прискорбием вынужден сообщить, что Гугл пошел по стопам Яндекса и запретил открывать себя во фреймах. Судя по всему, это произошло в рамках Making search more secure. За более безопасный поиск можно только порадоваться, однако дальнейшее использование Гугла в рамках «Широкого поиска» становится технически невозможным. Так что я буду вынужден этот проект в ближайшее время закрыть, приношу извинения всем его пользователям.
Однако, поскольку стандартная организация поиска в современных браузерах меня лично совершенно не устраивает, буду думать что с этим можно сделать. Сейчас у меня основная идея делать браузерный плагин. Я сам пользуюсь Google Chrome, а у него весьма аскетичный API для плагинов. Боковые панели, от которых можно плясать с интерфейсом поискового плагина есть пока только в экспериментальном API. Вот видимо с ними и буду разбираться. От двухколоночного поиска придется отказаться, по крайней мере до тех пор, пока не появится API, на котором это можно сделать. Однако, можно будет искать по всем тем сайтам, которые запрещают iframe (например stackoverflow), а также сделать добавление собственных поисковиков. Поддержку Firefox и других браузеров обещать пока не могу, т.к. сам не пользуюсь и нужно будет смотреть их документацию, насколько там всё близко к Хрому.
Cледите за рекламой. Постараюсь выделить время на вышеописанное.