| 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)))
Вы можете считать меня психом, но я сразу понял, почему это работает :)
1 comment | 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, по-видимому
гораздо более опытный в работе с лиспом предложил более удачное
решение, до которого я еще дойду. Но сначала для понимания всех
процессов стоит рассмотреть возможные очевидные решения и "походить по
граблям".
2 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 |
Если серверу будет необходимо сбросить авторизацию пользователя до истечения периода существования токена - он может просто перешифровать пароль пользователя новым ключем.
Заинтересовавшимся могу выслать код. Исправления и критика приветствуются.
22 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
Видеоиллюстрация. Рекомендуется смотреть в подгузниках.
1 comment | post a comment
Каллигатическая Остиополлюция - метафизическое явление, впервые обнаруженное в городе Калькутта, Индия в древнейшем храме богини Кали (Калигат-темпл). Считается аномально быстро прогрессирующей формой рака костей, встречавшейся у фанатиков секты тугов, поклонявшихся богине разрушения Кали.
Источник
44 comments | post a comment
Ну вот теперь я отрастил бороду и собрал статистику. Ею и поделюсь. Сегодня мы посмотрим на риски, угрожающие завершению IT-проектов. Было проанализировано около сорока проектов, связянных с вебом, что конечно нельзя считать репрезентативной выборкой, но кое-какие представления сформировать можно. Итак, в порядке убывания важносности:
- Исходные требования неспецифицированы. Часто случается, когда менеджмент не обладает технической квалификацией чтобы реально оценить ресурсы проекта, но при этом обладает амбициями и влиянием, чтобы раздавать обещания и определять сроки (бюджет) без согласования с техническим отделом.
- Недостаточные усилия со стороны клиента, т.н. позиция "деньги заплачены, что им еще надо?!". Особенно ярко проявляется на этапе проектирования, в виде настойчивого желания увидеть первый прототип как можно скорее и саботажа мероприятий связанных с проектированием - совещаний, составления документации, и.т.п. В результате имеем отвратительное планирование, костыли и неуправляемый проект.
- Неспособность менеджмента контролировать ожидания пользователя. Пользователи искренне не могут понять, почему некоторые изменения внести легко, а некоторые потребуют возврата на этап проектирования. Менеджеры со своей стороны склонны обещать все что угодно, ради поддержания хороших отношений с заказчиками. Программисты, не желая конфликтовать с менеджерами по вопросам архитектуры, создают костыли и "пожарные решения", что делает проект все более неуправляемым и ненадежным.
- Неспособность справиться с изменениями на ходу. Часто это связано с неудовлетворительной архитектурой, неспособной к изменениям. Пользователи непоследовательны и хотят разного. Разработчики не готовы справляться с противоречивыми и непоследовательными требованиями, а менеджеру часто не хватает квалификации или желания взять задачу урегулирования требований на себя.
- Ошибки проектирования. Неправильный дизайн проекта, недостаток масштабируемости, неправильный выбор технических средств.
- Ошибки взаимодействия разработчиков, особенно проявляющиеся на этапе интеграции. Недостатки стандартов разработки, или их отсутствие. Недостатки процесса контроля качества или его отсутствие.
- Ошибки при составлении бюджета проекта и в определении сроков завершения.
От себя добавлю также, что в большинстве случаев, получив первый прототип, заказчик агрессивно настаивает на скорейшем добавлении нереализованных функций и выходе на релиз, даже в том случае, если прототип вскрыл проблемы, требующие перепроектирования. К чему это приводит думаю не нужно объяснять.
Спешка при составлении документации приводит не только к осложнению разработки, но и к созданию "неподдерживаемых" проектов, в которых никто не хочет разбираться ни за какие benefits, в результате чего поддержка таких проектов сваливается на неквалифицированных сотрудников, делающих проект еще более запутанным и неуправляемым.
2 comments | post a comment
"Как правильные ребята мы всегда даем оценку перед тем, как приступить к работе. Потом менеджеры берут эту оценку, производят над ней хитрые манипуляции и в результате появляется стоимость проекта..." Недурак
2 comments | post a comment
|
 |
|
 |
 |