?

Log in

Алгеброй гармонию поправить...
20 most recent entries

Date:2011-03-22 18:20
Subject:Программирование - как искусство
Security:Public

По адресу http://rigidus.ru теперь лежит сайт, с которого я начинаю экспансию языка Common Lisp в современное веб-программирование. Там многое непонятно (поначалу), зато все "правильно". Если вы любите красивые решения так как люблю их я, т.е. до безумия - в статьях есть много интересного :)





Date:2011-01-10 19:31
Subject:Комментарии отключены
Security:Public

В связи с зашкаливающим количеством спама комментарии отключены. Ведется работа по обустройству собственной блог-площадки, после чего посты будут перенесены, а этот блог - удален. Такие дела...





Date:2010-04-09 17:18
Subject:Сантехнические дни.. (Sun Tech Days 2010)
Security:Public

В данный момент я нахожусь на конференции Sun Tech Days 2010 в ЛенЭкспо (С-Пб). К сожалению, мне не удалось попасть на нее в первый день работы - вчера, но сегодняшние доклады вполне это окупили.

Не успел я зайти в павильон как оказался на докладе по робототехнике, который проводили ребята из Благовещенска - там оказывается есть целая робототехническая лаборатория. Продемонстрировали мобильного робота на платформе SunSpot - довольно интересная хотя и дорогая платформа - по сравнению с SunSpot, Arduino - практически бесплатен. В числе их разработок - платформа для распознования лиц, использующая нечеткую логику - я был очень заинтересован. Удивительным оказалось то, что Александр из Благовещенска лучше меня знает где в Санкт-Петербурге купить сервомоторы и датчики для роботов :)

Пообщавшись с робототехниками я ушел на доклад JetBrains, которые рассказывали о MPS. Скажу честно - я впечатлён количеством работы, которое они вложили в реализацию, прямо скажем, не самой удачной (на мой взгляд) идеи. Если коротко - JetBrains делают платформу для разработки DSL. Делают путем кодогенерации, которая поддержана средствами среды. Поддержка действительно хорошая - не отличишь от базовой поддержки языка в современных IDE + все настраивается. В числе минусов, которые, думаю, даже не осознаются разработчиками - отсутствие ретроспекции, которым страдает генеративный подход в compile-time, сложность вывода типов и контроля за этим процессом (в последнем я возможно ошибаюсь). Кстати, JetBrains хайрит спецов - я взял на всякий случай их требования и думаю сходить на собеседование. Хотелось бы, наверно, поработать с ними над MPS и привнести туда ряд идей, воплощенных в лиспе - думаю это был был бы весьма интересный опыт.

По видимому Java стала настолько сложной и многословной в сравнении с другими языками, что назрела необходимость решать эту проблему - и JetBrains использует для этого новую "серебряную пулю" - DSL.

Также довольно интересный доклад о новом сборщике мусора для HotSpot - G1. Четко, взвешенно и по делу рассмотрены основные алгоритмы сборки мусора. Эту тему я глубоко не исследовал, но знания в любом случае полезные.

Что касается организации мероприятия - вполне неплохо - есть вайфай (сегодня я весь день не могу подключиться к йоте - луч поноса им), есть зона отдыха с большими красными мешками, играющими роль кресел, но в залах для докладов не хватает кресел - многие слушают доклады стоя. Традиционно не хватает кофе и плюшек - их разбирают моментально. Впрочем, это, наверное, хорошо, сюда нужно не за плюшками ходить. Если говорить об аудитории - удивило наличие довольно большого числа девушек среди посетителей - правда не ожидал. С другой стороны - не видел ни одной девчонки, задающей вопросы докладчику - может они все просто за компанию со своими парнями пришли? :) Черта момента: прямо рядом со мной мальчик пяти лет строит из мешков для сидения вавилонскую башню :)





Date:2010-03-03 06:57
Subject:Веб-программирование на лиспе. Первые шаги с hunchentoot.
Security:Public

Погуглил по рунету и обнаружил, что нигде нет getting started для того
чтобы поднять hunchentoot и заняться наконец веб-программированием на
лиспе.

Ну раз нет, то надо написать, люди просят.

Все нижеизложенное - мой опыт хождения по граблям, а не истина в
последней инстанции, так что вы можете взять его за основу а дальше
развлекаться как вам вздумается.
Read more...Collapse )





Date:2010-02-25 09:18
Subject:Как подключать emacs к удаленному лисп-процессу через swank.
Security:Public

Внимание! Эта статья в более полном и, что самое главное, обновляемом виде теперь лежит на Rigidus.ru в разделе статьи!

Сначала цитата - вдруг кто-то не знает об этом замечательном инциденте.

И даже более впечатляющий пример удаленной отладки произошел в
миссии NASA «Deep Space 1» в 1998 году. Через полгода после запуска
космического корабля, небольшой код на Lisp должен был управлять
космическим кораблем в течении двух дней для проведения серии
экспериментов. Однако, неуловимое состояние гонки (race condition) в
коде не было выявлено при тестировании на земле и было обнаружено уже
в космосе. Когда ошибка была выявлена в космосе (100 миллионов миль от
Земли) команда смогла произвести диагностику и исправление работающего
кода, что позволило завершить эксперимент. Один из программистов
сказал об этом следующее:

- Отладка программы, работающей на оборудовании стоимостью 100
  миллионов долларов, которая находится в 100 миллионах миль от вас,
  является интересным опытом. REPL, работающий на космическом корабле,
  предоставляет бесценные возможности в нахождении и устранении
  проблем.

Read more...Collapse )





Date:2010-01-21 05:56
Subject:Особенности Common Lisp
Security:Public

О намерениях. Данная компиляция не стремиться убедить вас использовать
Common Lisp. Не хотите - не используйте. Нам же лучше.

Адресовано в большей степени программистом, которые хотят понять, что
в лиспе есть такого, чего нет в других языках. Буду теперь посылать их
всех сюда.

Read more...Collapse )





Date:2009-12-15 20:43
Subject:Для памяти
Security:Public

Парадигмы программирования, очень хорошо рассмотренные в блоге "Lisp, the Universe and Everything"





Date:2009-12-10 20:59
Subject:Я сегодня знатно развлекся :)
Security:Public





Date:2009-11-10 06:58
Subject:Потрясающе!
Security:Public

Я пишу этот текст, используя emacs. Настроить себе такое счастье несложно - все находится здесь: http://code.google.com/p/ljupdate/





Date:2009-10-20 05:28
Subject:Беготня по граблям :)
Security:Public

Изучая лисп, поражаешься мощи и  выразительности этого языка, однако без граблей
не  обходится.  Используя  библиотеку  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)))

Вы можете считать меня психом, но я сразу понял, почему это работает :)





Date:2009-10-17 19:03
Subject:Lisp и Web-программирование
Security:Public

Еще один из очевидных  способов использования лиспа в веб-программировании
- это "гонять  аналитику по базе", что, по-видимому,  на большинстве задач
будет  быстрее  чем использование  для  этих  целей  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.





Date:2009-10-17 18:03
Subject:Lisp и Web-программирование
Security:Public

Итак,  сейчас  я  экспериментирую  со способами  подключения  лиспа  к
задачам  веб-программирования. Самый  очевидный вариант,  приходящий в
голову первым я уже реализовал. Остановимся на нем подробнее:

Php-скрипт, когда ему нужно  обратиться к лисп-программе может открыть
сокет. Если на том же  сервере есть сокет-сервер, написанный на лиспе,
который слушает нужный порт - они могут обмениваться данными

 +------------------------+                 +----------------------+
 | process: apache2       |                 | process: sbcl        |
 |          +-------------+                 |    +-----------------+
 |          | mod_php     |---------------->|    |  my_server.lisp |
 +----------+----------+--+     socket      +----+-----------------+

Вот примерно так выглядит заготовка для сокет-сервера на лиспе:
Read more...Collapse )

Проверить его работу можно подключившись к нему телнетом и отправляя
правильные лисп-выражения, которые будут исполнены.

В комментариях к предыдущему посту 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.





Date:2009-10-13 07:39
Subject:Не волшебник. Учусь.
Security:Public

Чем больше узнаю лисп - тем меньше хочется писать на чем-то другом. Макросы, мультиметоды, множественное наследование, функционалы высшего порядка, лексические замыкания - все это сносит крышу сразу и напрочь :) Поставил hunchentoot, но пока не разобрался как связать его с апачем. Чтобы не забыть помещу тут ссылки на мануалы на русском языке:
pcl
ansi
мир лиспа
emacs shortcuts
...ну и кусок учебного кода, на котором я тренируюсь в освоении - под катом
Read more...Collapse )
> P.S. Кто знает как использовать лисп под web - поделитесь сведениями?





Date:2009-09-16 14:40
Subject:Кеширование динамических сайтов
Security:Public

Допустим, у нас есть некий сайт (на PHP), рассматриваемый как "черный ящик", на вход которого поступает запрос (URL и параметры), а на выходе мы получаем некий HTML.

С помощью ob_start() в точке входа и ob_get_contents() в деструкторе объекта мы можем перехватить выходной HTML и записать его допустим в базу данных, чтобы потом отдавать оттуда, реализуя кеширование. Но обнаруживается, что сайт (местами) динамический - ротация баннеров, "товаров дня" и прочий мусор, который можно было бы даже выкинуть, когда мы отдаем страницы из кеша. Но некоторые страницы содержат какой-то важный объемный контент, который не хотелось бы упускать - например, описание акций, меняющееся по пять раз на дню - и такие вещи кешировать не нужно.

На сайте много тысяч страниц и ручное определение что кешировать, а что - нет: бесперспективно. Пока смотрю в сторону наибольшей общей подпоследовательности, но прогнав diff по двум похожим страницам получил очень много шума..

Может быть кто-нибудь подскажет другие идеи?





Date:2009-09-15 16:03
Subject:Защищенная аутентификация на php
Security:Public

Посылать пароль в открытом виде и надеяться на лучшее уже не модно - лучшеe (SSL) часто недоступно по разным причинами, а интернет теперь почти везде беспроводной и перехват трафика в ряде случаев слишком прост. Поэтому возникает желание обеспечить себе более защищенную аутентификацию, не теряя удобства (cookies и кеширования). Схема такая:

При создании пароля пользователя сервер генерирует случайный ключ и шифрует им пароль пользователя, используя симметричное шифрование. И ключ и пароль хранится в таблице пользователя. Несмотря на то что теоретическая стойкость этой системы равна нулю, таким образом пароль не хранится совсем уж в открытом виде и мы защищаемся от злоумышленника, имеющего доступ к базе данных, но не знающего алгоритма шифрования.

При аутентификации используется протокол challenge|response:

Клиент запрашивает у сервера challenge, используя ajax - мы не посылаем challenge в коде страницы чтобы сохранить преимущества кеширования. 
 Сервер отдает клиенту случайное значение и запоминает его в сесии.
Клиент выполняет хеширует (password+challenge) и пересылает результат серверу 
 Сервер расшифровывает пароль пользователя и проверяет корректность хеша, используя значение, запомненное в сесии. Если хэш верный, авторизация считается успешно завершенной. Сервер может (если клиент хочет) установить ему cookie, представляющий собой контейнер, в котором хранится логин пользователя в открытом виде и зашифрованный ключом пользователя ассоциативный массив хранящий время установки cookie, challenge и hash.

Поскольку ключ пользователя известен только серверу, пользователь не может продлевать время жизни аутентификационного токена, зашифрованного в cookie, даже если будет продлевать время жизни полученной cookie

Если серверу будет необходимо сбросить авторизацию пользователя до истечения периода существования токена - он может просто перешифровать пароль пользователя новым ключем.

Заинтересовавшимся могу выслать код. Исправления и критика приветствуются.





Date:2009-09-12 20:56
Subject:Штрихкод code 128
Security:Public

Штриховой код (штрихкод, штрих-код) — это последовательность чёрных и белых полос, представляющая некоторую информацию в удобном для считывания техническими средствами виде. Линейными (обычными) называются штрихкоды, читаемые в одном направлении (по горизонтали). На данный момент существует более 300 стандартов штрих-кодирования. Различные стандарты используют различные алгоритмы кодирования. У каждого алгоритма существуют свои особенности такие как минимальная и максимальная длинна данных, ограничения на размер штрих-кода и т.д. различные стандарты имеют свои достоинства и недостатки и часто разрабатываются с учетом конкретной области применения. Однако, есть небольшое количество стандартов, которые подходят для большинства приложений.

Code 128 - штрих-код переменной длины. Обычно кодируются буквенно-цифровые данные. Данный стандарт подходит для общего применения, например, для маркировки DVD-дисков, удостоверений личности и многих других целей. Для более плотного кодирования цифровых данных может использовать кодирование пар цифр, при этом в этом же коде могут быть закодированы алфавитные данные.
Структура штрих-кодаCollapse )





Date:2009-09-12 20:55
Subject:Yota Wimax на Ubuntu 9.04
Security:Public

Чтобы поиметь беспроводной, но пока не очень быстрый интернет от 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 градусов :)

Мне действительно нравится линукс за то, что он тренирует нестандартное мышление :)





Date:2009-01-26 06:40
Subject:Если бы языки программирования были религиозными учениями
Security:Public

Miguel (http://migmit.vox.com) перевел отличный текст . Ниже скопирую себе - оно стоит того:

Если бы языки программирования были религиозными учениямиCollapse )





Date:2008-12-30 14:58
Subject:Ubuntu 8.10 : Не работает звук на ноутбуке hp 2520er.
Security:Public

Проблема решается следующим образом:

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




browse
my journal