По адресу http://rigidus.ru теперь лежит сайт, с которого я начинаю экспансию языка Common Lisp в современное веб-программирование. Там многое непонятно (поначалу), зато все "правильно". Если вы любите красивые решения так как люблю их я, т.е. до безумия - в статьях есть много интересного :)
В связи с зашкаливающим количеством спама комментарии отключены. Ведется работа по обустройству собственной блог-площадки, после чего посты будут перенесены, а этот блог - удален. Такие дела...
В данный момент я нахожусь на конференции Sun Tech Days 2010 в ЛенЭкспо (С-Пб). К сожалению, мне не удалось попасть на нее в первый день работы - вчера, но сегодняшние доклады вполне это окупили.
Не успел я зайти в павильон как оказался на докладе по робототехнике, который проводили ребята из Благовещенска - там оказывается есть целая робототехническая лаборатория. Продемонстрировали мобильного робота на платформе SunSpot - довольно интересная хотя и дорогая платформа - по сравнению с SunSpot, Arduino - практически бесплатен. В числе их разработок - платформа для распознования лиц, использующая нечеткую логику - я был очень заинтересован. Удивительным оказалось то, что Александр из Благовещенска лучше меня знает где в Санкт-Петербурге купить сервомоторы и датчики для роботов :)
Пообщавшись с робототехниками я ушел на доклад JetBrains, которые рассказывали о MPS. Скажу честно - я впечатлён количеством работы, которое они вложили в реализацию, прямо скажем, не самой удачной (на мой взгляд) идеи. Если коротко - JetBrains делают платформу для разработки DSL. Делают путем кодогенерации, которая поддержана средствами среды. Поддержка действительно хорошая - не отличишь от базовой поддержки языка в современных IDE + все настраивается. В числе минусов, которые, думаю, даже не осознаются разработчиками - отсутствие ретроспекции, которым страдает генеративный подход в compile-time, сложность вывода типов и контроля за этим процессом (в последнем я возможно ошибаюсь). Кстати, JetBrains хайрит спецов - я взял на всякий случай их требования и думаю сходить на собеседование. Хотелось бы, наверно, поработать с ними над MPS и привнести туда ряд идей, воплощенных в лиспе - думаю это был был бы весьма интересный опыт.
По видимому Java стала настолько сложной и многословной в сравнении с другими языками, что назрела необходимость решать эту проблему - и JetBrains использует для этого новую "серебряную пулю" - DSL.
Также довольно интересный доклад о новом сборщике мусора для HotSpot - G1. Четко, взвешенно и по делу рассмотрены основные алгоритмы сборки мусора. Эту тему я глубоко не исследовал, но знания в любом случае полезные.
Что касается организации мероприятия - вполне неплохо - есть вайфай (сегодня я весь день не могу подключиться к йоте - луч поноса им), есть зона отдыха с большими красными мешками, играющими роль кресел, но в залах для докладов не хватает кресел - многие слушают доклады стоя. Традиционно не хватает кофе и плюшек - их разбирают моментально. Впрочем, это, наверное, хорошо, сюда нужно не за плюшками ходить. Если говорить об аудитории - удивило наличие довольно большого числа девушек среди посетителей - правда не ожидал. С другой стороны - не видел ни одной девчонки, задающей вопросы докладчику - может они все просто за компанию со своими парнями пришли? :) Черта момента: прямо рядом со мной мальчик пяти лет строит из мешков для сидения вавилонскую башню :)
Погуглил по рунету и обнаружил, что нигде нет getting started для того
чтобы поднять hunchentoot и заняться наконец веб-программированием на
лиспе.
Ну раз нет, то надо написать, люди просят.
Все нижеизложенное - мой опыт хождения по граблям, а не истина в
последней инстанции, так что вы можете взять его за основу а дальше
развлекаться как вам вздумается.
( Read more... )
Внимание! Эта статья в более полном и, что самое главное, обновляемом виде теперь лежит на Rigidus.ru в разделе статьи!
Сначала цитата - вдруг кто-то не знает об этом замечательном инциденте.
И даже более впечатляющий пример удаленной отладки произошел в
миссии NASA «Deep Space 1» в 1998 году. Через полгода после запуска
космического корабля, небольшой код на Lisp должен был управлять
космическим кораблем в течении двух дней для проведения серии
экспериментов. Однако, неуловимое состояние гонки (race condition) в
коде не было выявлено при тестировании на земле и было обнаружено уже
в космосе. Когда ошибка была выявлена в космосе (100 миллионов миль от
Земли) команда смогла произвести диагностику и исправление работающего
кода, что позволило завершить эксперимент. Один из программистов
сказал об этом следующее:
- Отладка программы, работающей на оборудовании стоимостью 100
миллионов долларов, которая находится в 100 миллионах миль от вас,
является интересным опытом. REPL, работающий на космическом корабле,
предоставляет бесценные возможности в нахождении и устранении
проблем.
( Read more... )
О намерениях. Данная компиляция не стремиться убедить вас использовать
Common Lisp. Не хотите - не используйте. Нам же лучше.
Адресовано в большей степени программистом, которые хотят понять, что
в лиспе есть такого, чего нет в других языках. Буду теперь посылать их
всех сюда.
( Read more... )
| Date: | 2009-12-15 20:43 |
| Subject: | Для памяти |
| Security: | Public |
Парадигмы программирования, очень хорошо рассмотренные в блоге "Lisp, the Universe and Everything"

| Date: | 2009-11-10 06:58 |
| Subject: | Потрясающе! |
| Security: | Public |
Я пишу этот текст, используя emacs. Настроить себе такое счастье несложно - все находится здесь: http://code.google.com/p/ljupdate/
Изучая лисп, поражаешься мощи и выразительности этого языка, однако без граблей
не обходится. Используя библиотеку 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)))
Вы можете считать меня психом, но я сразу понял, почему это работает :)
Еще один из очевидных способов использования лиспа в веб-программировании
- это "гонять аналитику по базе", что, по-видимому, на большинстве задач
будет быстрее чем использование для этих целей 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.
Итак, сейчас я экспериментирую со способами подключения лиспа к
задачам веб-программирования. Самый очевидный вариант, приходящий в
голову первым я уже реализовал. Остановимся на нем подробнее:
Php-скрипт, когда ему нужно обратиться к лисп-программе может открыть
сокет. Если на том же сервере есть сокет-сервер, написанный на лиспе,
который слушает нужный порт - они могут обмениваться данными
+------------------------+ +----------------------+
| process: apache2 | | process: sbcl |
| +-------------+ | +-----------------+
| | mod_php |---------------->| | my_server.lisp |
+----------+----------+--+ socket +----+-----------------+
Вот примерно так выглядит заготовка для сокет-сервера на лиспе:
( Read more... )
Проверить его работу можно подключившись к нему телнетом и отправляя
правильные лисп-выражения, которые будут исполнены.
В комментариях к предыдущему посту dark_aurel, по-видимому
гораздо более опытный в работе с лиспом предложил более удачное
решение, до которого я еще дойду. Но сначала для понимания всех
процессов стоит рассмотреть возможные очевидные решения и "походить по
граблям".
| Date: | 2009-10-15 19:19 |
| Subject: | Emacs |
| Security: | Public |

Я открыл для себя Emacs. Не просто чтобы писать (и сразу же
отлаживать) в нем программы на Lisp. Не просто чтобы сделать его своей
рабочей средой для программирования. Для всего. Вообще. Есть только
два приложения которые я запускаю каждый раз когда захожу в систему -
броузер и Emacs (может быть я просто не знаю, как запустить броузер
внутри Emacs?)
Скажу честно - я потрясен. Еще никогда программа не была такой гибкой,
настраиваемой и удобной. Да у меня много вопросов - но они
решаемы. Все. Нет ничего такого, что было бы невозможно сделать by
design. С помощью гугля и головного мозга, а не с помощью отладчика и
такой-то матери.
Например сейчас, мне интересно как работать по ftp с файлами на
удаленной машине с просмотром директорий в левом верхнем окне как это
сделано в Zend Studio 5.0. Заметьте, я не сказал "возможно ли". Я
уверен - возможно, просто я пока еще не знаю как! Точно так же как
возможно например внутри одного файла сделать несколько различных схем
форматирования. Представьте себе - в вашем коде комментарии
автоматически переносятся на следующие строки, а длинные строки кода -
нет. Разве не круто?
Так, как же ходить по ftp в ECB? Френды, кто знает? Также расскажите о
том, как и чем вы расширяете свой Emacs.
Чем больше узнаю лисп - тем меньше хочется писать на чем-то другом. Макросы, мультиметоды, множественное наследование, функционалы высшего порядка, лексические замыкания - все это сносит крышу сразу и напрочь :) Поставил hunchentoot, но пока не разобрался как связать его с апачем. Чтобы не забыть помещу тут ссылки на мануалы на русском языке:
pcl
ansi
мир лиспа
emacs shortcuts
...ну и кусок учебного кода, на котором я тренируюсь в освоении - под катом
( Read more... )
>
P.S. Кто знает как использовать лисп под web - поделитесь сведениями?
Допустим, у нас есть некий сайт (на PHP), рассматриваемый как "черный ящик", на вход которого поступает запрос (URL и параметры), а на выходе мы получаем некий HTML.
С помощью ob_start() в точке входа и ob_get_contents() в деструкторе объекта мы можем перехватить выходной HTML и записать его допустим в базу данных, чтобы потом отдавать оттуда, реализуя кеширование. Но обнаруживается, что сайт (местами) динамический - ротация баннеров, "товаров дня" и прочий мусор, который можно было бы даже выкинуть, когда мы отдаем страницы из кеша. Но некоторые страницы содержат какой-то важный объемный контент, который не хотелось бы упускать - например, описание акций, меняющееся по пять раз на дню - и такие вещи кешировать не нужно.
На сайте много тысяч страниц и ручное определение что кешировать, а что - нет: бесперспективно. Пока смотрю в сторону наибольшей общей подпоследовательности, но прогнав diff по двум похожим страницам получил очень много шума..
Может быть кто-нибудь подскажет другие идеи?
Посылать пароль в открытом виде и надеяться на лучшее уже не модно - лучшеe (SSL) часто недоступно по разным причинами, а интернет теперь почти везде беспроводной и перехват трафика в ряде случаев слишком прост. Поэтому возникает желание обеспечить себе более защищенную аутентификацию, не теряя удобства (cookies и кеширования). Схема такая:
При создании пароля пользователя сервер генерирует случайный ключ и шифрует им пароль пользователя, используя симметричное шифрование. И ключ и пароль хранится в таблице пользователя. Несмотря на то что теоретическая стойкость этой системы равна нулю, таким образом пароль не хранится совсем уж в открытом виде и мы защищаемся от злоумышленника, имеющего доступ к базе данных, но не знающего алгоритма шифрования.
При аутентификации используется протокол challenge|response:
| Клиент запрашивает у сервера challenge, используя ajax - мы не посылаем challenge в коде страницы чтобы сохранить преимущества кеширования. | | | | Сервер отдает клиенту случайное значение и запоминает его в сесии. | | Клиент выполняет хеширует (password+challenge) и пересылает результат серверу | | | | Сервер расшифровывает пароль пользователя и проверяет корректность хеша, используя значение, запомненное в сесии. Если хэш верный, авторизация считается успешно завершенной. Сервер может (если клиент хочет) установить ему cookie, представляющий собой контейнер, в котором хранится логин пользователя в открытом виде и зашифрованный ключом пользователя ассоциативный массив хранящий время установки cookie, challenge и hash.
Поскольку ключ пользователя известен только серверу, пользователь не может продлевать время жизни аутентификационного токена, зашифрованного в cookie, даже если будет продлевать время жизни полученной cookie |
Если серверу будет необходимо сбросить авторизацию пользователя до истечения периода существования токена - он может просто перешифровать пароль пользователя новым ключем.
Заинтересовавшимся могу выслать код. Исправления и критика приветствуются.
Штриховой код (штрихкод, штрих-код) — это последовательность чёрных и белых полос, представляющая некоторую информацию в удобном для считывания техническими средствами виде. Линейными (обычными) называются штрихкоды, читаемые в одном направлении (по горизонтали). На данный момент существует более 300 стандартов штрих-кодирования. Различные стандарты используют различные алгоритмы кодирования. У каждого алгоритма существуют свои особенности такие как минимальная и максимальная длинна данных, ограничения на размер штрих-кода и т.д. различные стандарты имеют свои достоинства и недостатки и часто разрабатываются с учетом конкретной области применения. Однако, есть небольшое количество стандартов, которые подходят для большинства приложений.
Code 128 - штрих-код переменной длины. Обычно кодируются буквенно-цифровые данные. Данный стандарт подходит для общего применения, например, для маркировки DVD-дисков, удостоверений личности и многих других целей. Для более плотного кодирования цифровых данных может использовать кодирование пар цифр, при этом в этом же коде могут быть закодированы алфавитные данные. ( Структура штрих-кода )
Чтобы поиметь беспроводной, но пока не очень быстрый интернет от 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 градусов :)
Мне действительно нравится линукс за то, что он тренирует нестандартное мышление :)
Miguel (http://migmit.vox.com) перевел отличный текст . Ниже скопирую себе - оно стоит того:
( Если бы языки программирования были религиозными учениями )
Проблема решается следующим образом:
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
|
 |
|
 |
 |