О намерениях. Данная компиляция не стремиться убедить вас использовать
Common Lisp. Не хотите - не используйте. Нам же лучше.
Адресовано в большей степени программистом, которые хотят понять, что
в лиспе есть такого, чего нет в других языках. Буду теперь посылать их
всех сюда.
( Read more... )
15 comments | post a comment
| Date: | 2009-12-15 20:43 |
| Subject: | Для памяти |
| Security: | Public |
Парадигмы программирования, очень хорошо рассмотренные в блоге "Lisp, the Universe and Everything"
2 comments | post a comment
Сегодня мы поговорим о такой милой сердцу каждого веб-программиста вещи как шаблонизация. По долгу службы мне необходимо было решить задачу, важность которой для интернет-магазина сложно переоценить: информирование Яндекс.Маркета о наших товарах. Не секрет, что значительная часть трафика интернет-магазина приходит именно с Яндекс.Маркета, и трафик этот очень важен - любой сбой сразу же отражается на заказах.
Чтобы Яндекс.Маркет был доволен и счастлив, ему надо предоставлять xml-файл в специальном формате (http://partner.market.yandex.ru/legal/tt/), в котором содержится информация о товарах и товарных группах. Если ваш магазин достаточно большой - построить этот файл на php будет затруднительно - php имеет ограничение на время работы скрипта и количество занимаемой памяти. Поэтому мы используем лучший во всех отношениях инструмент - лисп.
( Read more... )
2 comments | post a comment

5 comments | post a comment
| Date: | 2009-11-10 06:58 |
| Subject: | Потрясающе! |
| Security: | Public |
Я пишу этот текст, используя emacs. Настроить себе такое счастье несложно - все находится здесь: http://code.google.com/p/ljupdate/
1 comment | post a comment
Изучая лисп, поражаешься мощи и выразительности этого языка, однако без граблей
не обходится. Используя библиотеку clsql наткнулся на падение с ошибкой
"Unhandled memory fault at #x3C." Гугление показало, что не стоит создавать
таблицу вызывая
(clsql:query "CREATE TABLE ...")
потому что при попытке разобрать ответ mysql`я (которого в этом запросе
естественно нет - мы же просто таблицу создаем, а не делаем SELECT) библиотека
падает. Вместо query использовать надо
(create-table [foo] '(([id] integer) ([comments] longchar)))
который внезапно (!) создает таблицу с именем и столбцами в верхнем
регистре. Гугл подсказал что чтобы работать в нижнем регистре надо писать так
(create-table "foo" '(([|id|] integer) ([|comments|] longchar)))
Вы можете считать меня психом, но я сразу понял, почему это работает :)
2 comments | post a comment
Еще один из очевидных способов использования лиспа в веб-программировании
- это "гонять аналитику по базе", что, по-видимому, на большинстве задач
будет быстрее чем использование для этих целей php с присущими ему
ограничениями по памяти и времени исполнения скрипта. Таким образом схема
взаимодействия получается такой:
+----------------------+ +--------------------+
| process: apache2 | | process: sbcl |
| +-----------+ +---------+----------+
| | mod_php +---+ +---+ my.lisp | |
+----------+-----------+ | | +---------+----------+
| |
v v
------------------------
( mysql )
------------------------
Чтобы работать с mysql (postgress, etc...) из лиспа я использвал
библиотеку CLSQL (http://clsql.b9.com/) которую нужно скачать,
скомпилить и подключить так, как написано в документации.
Вот типичный пример подключения к базе данных и выполнения запроса:
(clsql:connect '("localhost" "dbname" "root" "") :database-type :mysql)
(clsql:query "select first_name,last_name from people where id = 1")
(disconnect :database (find-database "localhost/dbname/root"))
На самом деле библиотека довольно интересна и предоставляет много
различных вариантов доступа к базе данных, например с помощью FDML
(Functional Data Manipulation Language):
(clsql:insert-records
:into [employee]
:attributes '(first_name last_name email)
:values '("Yuri" "Gagarin" "gagarin@soviet.org" ))
или OODML (Object Oriented Data Manipulation Language) с которым я
пока еще не разбирался, но по-видимому он реализует ORM, и этот ОRM
выглядит гораздо вменяемее чем все что я видел до сих пор (может мало
видел просто :)
В целом, это подход (связывание php и lisp с помощью mysql) наверно
самое быстрое что можно придумать - меньше всего времени на изучение,
и работать можно начинать почти сразу. Следующий пост будет о более
прогрессивной схеме взаимодействия, которую предложил dark_aurel.
3 comments | post a comment
Итак, сейчас я экспериментирую со способами подключения лиспа к
задачам веб-программирования. Самый очевидный вариант, приходящий в
голову первым я уже реализовал. Остановимся на нем подробнее:
Php-скрипт, когда ему нужно обратиться к лисп-программе может открыть
сокет. Если на том же сервере есть сокет-сервер, написанный на лиспе,
который слушает нужный порт - они могут обмениваться данными
+------------------------+ +----------------------+
| process: apache2 | | process: sbcl |
| +-------------+ | +-----------------+
| | mod_php |---------------->| | my_server.lisp |
+----------+----------+--+ socket +----+-----------------+
Вот примерно так выглядит заготовка для сокет-сервера на лиспе:
( Read more... )
Проверить его работу можно подключившись к нему телнетом и отправляя
правильные лисп-выражения, которые будут исполнены.
В комментариях к предыдущему посту dark_aurel, по-видимому
гораздо более опытный в работе с лиспом предложил более удачное
решение, до которого я еще дойду. Но сначала для понимания всех
процессов стоит рассмотреть возможные очевидные решения и "походить по
граблям".
3 comments | post a comment
| Date: | 2009-10-15 19:19 |
| Subject: | Emacs |
| Security: | Public |

Я открыл для себя Emacs. Не просто чтобы писать (и сразу же
отлаживать) в нем программы на Lisp. Не просто чтобы сделать его своей
рабочей средой для программирования. Для всего. Вообще. Есть только
два приложения которые я запускаю каждый раз когда захожу в систему -
броузер и Emacs (может быть я просто не знаю, как запустить броузер
внутри Emacs?)
Скажу честно - я потрясен. Еще никогда программа не была такой гибкой,
настраиваемой и удобной. Да у меня много вопросов - но они
решаемы. Все. Нет ничего такого, что было бы невозможно сделать by
design. С помощью гугля и головного мозга, а не с помощью отладчика и
такой-то матери.
Например сейчас, мне интересно как работать по ftp с файлами на
удаленной машине с просмотром директорий в левом верхнем окне как это
сделано в Zend Studio 5.0. Заметьте, я не сказал "возможно ли". Я
уверен - возможно, просто я пока еще не знаю как! Точно так же как
возможно например внутри одного файла сделать несколько различных схем
форматирования. Представьте себе - в вашем коде комментарии
автоматически переносятся на следующие строки, а длинные строки кода -
нет. Разве не круто?
Так, как же ходить по ftp в ECB? Френды, кто знает? Также расскажите о
том, как и чем вы расширяете свой Emacs.
3 comments | post a comment
Чем больше узнаю лисп - тем меньше хочется писать на чем-то другом. Макросы, мультиметоды, множественное наследование, функционалы высшего порядка, лексические замыкания - все это сносит крышу сразу и напрочь :) Поставил hunchentoot, но пока не разобрался как связать его с апачем. Чтобы не забыть помещу тут ссылки на мануалы на русском языке:
pcl
ansi
мир лиспа
emacs shortcuts
...ну и кусок учебного кода, на котором я тренируюсь в освоении - под катом
( Read more... )
>
P.S. Кто знает как использовать лисп под web - поделитесь сведениями?
9 comments | post a comment
Допустим, у нас есть некий сайт (на PHP), рассматриваемый как "черный ящик", на вход которого поступает запрос (URL и параметры), а на выходе мы получаем некий HTML.
С помощью ob_start() в точке входа и ob_get_contents() в деструкторе объекта мы можем перехватить выходной HTML и записать его допустим в базу данных, чтобы потом отдавать оттуда, реализуя кеширование. Но обнаруживается, что сайт (местами) динамический - ротация баннеров, "товаров дня" и прочий мусор, который можно было бы даже выкинуть, когда мы отдаем страницы из кеша. Но некоторые страницы содержат какой-то важный объемный контент, который не хотелось бы упускать - например, описание акций, меняющееся по пять раз на дню - и такие вещи кешировать не нужно.
На сайте много тысяч страниц и ручное определение что кешировать, а что - нет: бесперспективно. Пока смотрю в сторону наибольшей общей подпоследовательности, но прогнав diff по двум похожим страницам получил очень много шума..
Может быть кто-нибудь подскажет другие идеи?
3 comments | post a comment
Посылать пароль в открытом виде и надеяться на лучшее уже не модно - лучшеe (SSL) часто недоступно по разным причинами, а интернет теперь почти везде беспроводной и перехват трафика в ряде случаев слишком прост. Поэтому возникает желание обеспечить себе более защищенную аутентификацию, не теряя удобства (cookies и кеширования). Схема такая:
При создании пароля пользователя сервер генерирует случайный ключ и шифрует им пароль пользователя, используя симметричное шифрование. И ключ и пароль хранится в таблице пользователя. Несмотря на то что теоретическая стойкость этой системы равна нулю, таким образом пароль не хранится совсем уж в открытом виде и мы защищаемся от злоумышленника, имеющего доступ к базе данных, но не знающего алгоритма шифрования.
При аутентификации используется протокол challenge|response:
| Клиент запрашивает у сервера challenge, используя ajax - мы не посылаем challenge в коде страницы чтобы сохранить преимущества кеширования. | | | | Сервер отдает клиенту случайное значение и запоминает его в сесии. | | Клиент выполняет хеширует (password+challenge) и пересылает результат серверу | | | | Сервер расшифровывает пароль пользователя и проверяет корректность хеша, используя значение, запомненное в сесии. Если хэш верный, авторизация считается успешно завершенной. Сервер может (если клиент хочет) установить ему cookie, представляющий собой контейнер, в котором хранится логин пользователя в открытом виде и зашифрованный ключом пользователя ассоциативный массив хранящий время установки cookie, challenge и hash.
Поскольку ключ пользователя известен только серверу, пользователь не может продлевать время жизни аутентификационного токена, зашифрованного в cookie, даже если будет продлевать время жизни полученной cookie |
Если серверу будет необходимо сбросить авторизацию пользователя до истечения периода существования токена - он может просто перешифровать пароль пользователя новым ключем.
Заинтересовавшимся могу выслать код. Исправления и критика приветствуются.
24 comments | post a comment
Штриховой код (штрихкод, штрих-код) — это последовательность чёрных и белых полос, представляющая некоторую информацию в удобном для считывания техническими средствами виде. Линейными (обычными) называются штрихкоды, читаемые в одном направлении (по горизонтали). На данный момент существует более 300 стандартов штрих-кодирования. Различные стандарты используют различные алгоритмы кодирования. У каждого алгоритма существуют свои особенности такие как минимальная и максимальная длинна данных, ограничения на размер штрих-кода и т.д. различные стандарты имеют свои достоинства и недостатки и часто разрабатываются с учетом конкретной области применения. Однако, есть небольшое количество стандартов, которые подходят для большинства приложений.
Code 128 - штрих-код переменной длины. Обычно кодируются буквенно-цифровые данные. Данный стандарт подходит для общего применения, например, для маркировки DVD-дисков, удостоверений личности и многих других целей. Для более плотного кодирования цифровых данных может использовать кодирование пар цифр, при этом в этом же коде могут быть закодированы алфавитные данные. ( Структура штрих-кода )
post a comment
Чтобы поиметь беспроводной, но пока не очень быстрый интернет от Yota под Ubuntu 9.04 нужно: 1. Купить USB-модем чуть менее чем за 2000 рублей 2. Найти где-нибудь машину с виндой и активировать его (зарегистрировав профиль на свой номер телефона, на который придет смс с кодом) 3. Найти здесь в конце страницы два .deb пакета, которые установить на свою Ubuntu (libusb1_1.0.0-1_i386.deb и madwimax_0.1.0-1_i386.deb) 4. Там же, но вверху страницы найти инструкцию по подключению.
Думаете это все? Нет, теперь мы хотим чтобы у нас все работало сразу как только модем воткнут в USB. Теперь, когда интернет у нас есть, можно действовать по схеме с хабра: http://habrahabr.ru/blogs/linux/66879/
Если какие-то проблемы и все не заработало - идем на http://code.google.com/p/madwimax/downloads/list скачиваем последнюю версию и собираем по инструкции в файле INSTALL из архива
После этого обычно все пашет. Ах да: в firefox убрать галку "Работать автономно", а pidgin (в котором такой галки нет) заменить на licq. При попытке настроить licq мы видим чудесное - в форме настроек кнопка OK уезжает за край экрана. А звуки тем не менее отключить хочется :) Можно использовать кнопочку TAB чтобы добраться до невидимой кнопки, а можно зайти в Система-Параметры-Экран и повернуть экран на 90 градусов :)
Мне действительно нравится линукс за то, что он тренирует нестандартное мышление :)
2 comments | post a comment
Miguel (http://migmit.vox.com) перевел отличный текст . Ниже скопирую себе - оно стоит того:
( Если бы языки программирования были религиозными учениями )
4 comments | post a comment
Проблема решается следующим образом:
1. Устанавливаем последнюю alsa 1.0.18:
wget http://www.linuxant.com/alsa-driver/alsa-driver-linuxant_1.0.18.0_all.deb sudo dpkg -i alsa-driver-linuxant_1.0.18.0_all.deb
2. Добавляем в файл /etc/modprobe.d/alsa-base строчку
options snd-hda-intel model=toshiba
после всех строк, начинающихся с "options snd..."
3. Перезагружаемся
P.S.:Первый пункт может быть не обязательным (просто я делал так) P.P.S: Если не помогло, вместо "toshiba" можно попробовать "3stack", "3-stack", "auto", "laptop", "5stack", "6stack", "laptop" , "laptop-eapd", "6stack-digout", "lenovo", "mitac" или "erf" P.P.P.S: На моем ноуте все вот так (возможно это кому-то поможет найти свой случай в поисковике):
lspci | grep Audio 00:14.2 Audio device: ATI Technologies Inc SBx00 Azalia (Intel HDA)
lsmod | grep snd snd_hda_intel 437544 1 snd_pcm_oss 46496 0 snd_mixer_oss 22784 2 snd_pcm_oss snd_pcm 83844 2 snd_hda_intel,snd_pcm_oss snd_page_alloc 16776 2 snd_hda_intel,snd_pcm snd_hwdep 15492 1 snd_hda_intel snd_seq_dummy 11012 0 snd_seq_oss 39936 0 snd_seq_midi 14368 0 snd_rawmidi 29728 1 snd_seq_midi snd_seq_midi_event 15232 2 snd_seq_oss,snd_seq_midi snd_seq 58352 6 snd_seq_dummy,snd_seq_oss,snd_seq_midi,snd_seq_midi_event snd_timer 29448 2 snd_pcm,snd_seq snd_seq_device 15500 5 snd_seq_dummy,snd_seq_oss,snd_seq_midi,snd_rawmidi,snd_seq snd 66212 11 snd_hda_intel,snd_pcm_oss,snd_mixer_oss,snd_pcm,snd_hwdep,snd_seq_dummy,snd_seq_oss,snd_rawmidi,snd_seq,snd_timer,snd_seq_device soundcore 15328 2 snd
cat /proc/asound/card0/codec#0 | grep Codec Codec: Realtek ALC268
4 comments | post a comment
Отчасти чтобы не забыть, отчасти в надежде что кому-то это будет полезно оставлю информацию о написании аплета для gnome-panel`и. Я делал это на си.
Сначала о том, как сделать правильно, а потом о том, как сделать универсально.
Итак, чтобы сделать правильно, необходимо прочитать вот этот документ: Writing Gnome Applets in Gnome2, рассказывающий о том, как сделать Hello World с отображением запущенного приложения в панели. Там главным образом о том, куда положить какие файлы, чтобы апплет можно было выбрать в диалоговом окне "Add to Panel".
Я решил подойти к этому с другой стороны и написал просто приложение, которое добавляет иконку на панель с помощью некоторых вызовов GTK.
Итак, чтобы ваша иконка появилась на панели необходимо сделать следующее: ( Read more... )
post a comment
Да, есть люди (потому что IT-специалистами их язык назвать не поворачивается), которые ходят на конференции ради обеда и чувства сопричастности. На прошлом технете таких было много. Это плохо по очевидным причинам - аудитория влияет на докладчиков, общий уровень падает и вообще. Поэтому рэндом пипл надо фильтровать. Обычно фильтруют ценой, тем более что желающих попасть на технет, платформу и прочее - много. Мы подразумеваем, что по меткому выражению raa "студент вообще всё, что дороже тыщи из своего кармана не оплатит". Но когда извините платформа стоит 20000 - это просто за гранью добра и зла. За что?
1 comment | post a comment
..на интуитивно понятном языке предметной области (DSL)
http://www.poparcade.net/swf/light-bot-2205.swf
5 comments | post a comment
| Date: | 2008-09-20 13:30 |
| Subject: | SpbHUG |
| Security: | Public |
Вчера мне довелось побывать на встрече SpbHUG. Уровень участников заставил вспомнить крылатую фразу Евгения Забокрицкого: "Они все секут!". Разительный контраст с аудиторией TechNet`a, где много random people, приходящих, чтобы почувствовать сопричастность и пообедать.
Дениса Москвин рассказал о Lambda Cube, но я не так силен в lambda-исчислении, чтобы иметь возможность оценить его доклад. Было интересно, но вынес я оттуда мало - главным образом идею о том, что некоторые разделы математики стоило бы изучить как можно скорее.
Доклад Андрея Власовских о генераторах, продолжениях и акторах в разных языках программирования практически сразу превратился в бурное обсуждение (чему, каюсь, я поспособствовал), которое мы прервали только в 23:30, не успев рассмотреть вторую половину доклада. Но и того что было рассмотрено хватило, чтобы снести крышу большей части аудитории. Кстати, Андрей еще не выложил в группе слайды, поэтому, думаю он не обидится, если я выложу здесь те слайды, которые он мне дал, чтобы я мог посмотреть их по дороге домой. Возможно это не последняя версия - так что рекомендую в первую очередь посмотреть в группе. Кодировка там utf-8.
Еще мы не успели поделиться впечатлениями о ICFPC'08, так что я с нетерпением жду следующей встречи группы
post a comment
|
 |
|
 |
 |