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

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

О намерениях. Данная компиляция не стремиться убедить вас использовать
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



Date:2009-12-15 14:47
Subject:Шаблонизация, Яндекс.Маркет и Лисп. Веселее вместе!
Security:Public

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

Чтобы Яндекс.Маркет был доволен и счастлив, ему надо предоставлять xml-файл в специальном формате (http://partner.market.yandex.ru/legal/tt/), в котором содержится информация о товарах и товарных группах. Если ваш магазин достаточно большой - построить этот файл на php будет затруднительно - php имеет ограничение на время работы скрипта и количество занимаемой памяти. Поэтому мы используем лучший во всех отношениях инструмент - лисп.

Read more... )

2 comments | post a comment



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

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



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)))

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

2 comments | post a comment



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.

3 comments | post a comment



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

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

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

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

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

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

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



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

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

9 comments | post a comment



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

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

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

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

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

3 comments | post a comment



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

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

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

24 comments | post a comment



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

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

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

post a comment



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 градусов :)

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

2 comments | post a comment



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

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

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

4 comments | post a comment



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

4 comments | post a comment



Date:2008-12-21 04:30
Subject:Написание аплета GNOME
Security:Public

Отчасти чтобы не забыть, отчасти в надежде что кому-то это будет полезно оставлю информацию о написании аплета для gnome-panel`и. Я делал это на си.

Сначала о том, как сделать правильно, а потом о том, как сделать универсально.

Итак, чтобы сделать правильно, необходимо прочитать вот этот документ: Writing Gnome Applets in Gnome2, рассказывающий о том, как сделать Hello World с отображением запущенного приложения в панели. Там главным образом о том, куда положить какие файлы, чтобы апплет можно было выбрать в диалоговом окне "Add to Panel".

Я решил подойти к этому с другой стороны и написал просто приложение, которое добавляет иконку на панель с помощью некоторых вызовов GTK.

Итак, чтобы ваша иконка появилась на панели необходимо сделать следующее:
Read more... )

post a comment



Date:2008-09-28 23:25
Subject:Про конференции
Security:Public

Да, есть люди (потому что IT-специалистами их язык назвать не поворачивается), которые ходят на конференции ради обеда и чувства сопричастности. На прошлом технете таких было много. Это плохо по очевидным причинам - аудитория влияет на докладчиков, общий уровень падает и вообще. Поэтому рэндом пипл надо фильтровать. Обычно фильтруют ценой, тем более что желающих попасть на технет, платформу и прочее - много. Мы подразумеваем, что по меткому выражению [info]raa "студент вообще всё, что дороже тыщи из своего кармана не оплатит". Но когда извините платформа стоит 20000 - это просто за гранью добра и зла. За что?

1 comment | post a comment



Date:2008-09-24 00:16
Subject:Программирование в ограничениях...
Security:Public

..на интуитивно понятном языке предметной области (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


browse
my journal