Thursday, November 29, 2012

WebSocket-чат на Tornado для вашего Django-проекта

TornadoНедавно я запустил сайт backgrounddating.com, одной из возможностей которого является чат с другими пользователями в режиме реального времени. Документации (как на русском, так и на английском), позволяющей быстро вникнуть в написание подобных приложений с помощью технологии WebSocket пока что мало, поэтому я решил написать данное руководство. Итак, задача состоит в том, чтобы любой пользователь мог отправлять другим пользователям сообщения, и, если у получателя сообщения открыт чат с этим пользователям, то он сразу же видел входящие сообщения (а в ином случае он мог прочитать сообщения позже: то есть при открытии чата загружается история последних сообщений).

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

Сразу уточню, что это не единственный способ реализовать подобное. Вы можете использовать другой асинхронный веб-сервер (например node.js), можете использовать другую очередь сообщений (или вообще её не использовать, если вам подходят особенности такого варианта: с пользователями одного канала обязательно общается один и тот же worker веб-сервера). Я даже не утверждаю, что этот вариант самый лучший (но в данном случае он подошёл лучше всех). В конце концов, мы здесь вообще не будем рассматривать костыли (long polling, Flash) для старых браузеров (а это почти все версии IE, например), не поддерживающих веб-сокеты, и даже не будем рассматривать возможность подключаться из тех браузеров, которые уже поддерживают протокол WebSocket, но не стандартизированную версию (RFC 6455), а одну из устаревших. О том, как можно включить поддержку устаревшей версии «draft 76» (она же «hixie-76»), смотрите в документации Tornado.

Тем не менее, что можно сказать точно — этот способ работает хорошо, причём не в одном проекте, а во многих (описанный способ реализации уже давно применяется, хоть о нём пока и не очень много информации). Например, сервер, на котором работает Background Dating — это на данный момент самый младший VPS от Linode (512 MiB памяти), но нагрузка на процессор не поднималась более 20—40 процентов, а использование оперативной памяти — около 30%. Причём ресурсы используют в основном gunicorn (веб-сервер, на котором работает Django) и PostgreSQL. Но тут нет абсолютно ничего удивительного, поскольку ни для кого не секрет, что Tornado достаточно лёгкий, чтобы не просто работать быстро, но даже справляться с C10k (о чём уже было на Хабрахабре).

Итак, мы будем использовать Django 1.4.2, Tornado 2.4, Redis 2.6.5 и PostgreSQL 9.2.1 (на самом деле вы можете использовать и другую реляционную СУБД — у Django есть много разных бэкэндов). Для подключения к Redis будет использоваться стандартный для Python клиент redis-py, а также brükva (асинхронный Redis-клиент для использования с Tornado). Для того, чтобы развернуть всё это на сервере, мы будем использовать haproxy и nginx, для запуска Django-проекта в production будем использовать веб-сервер gunicorn, а управлять запуском веб-серверов для Django и Tornado будет Supervisor.

Saturday, December 17, 2011

Автоматическая подсветка символов из другого языка в тексте

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

Я написал небольшую веб-страницу, где можно набрать (или вставить) текст, и выбрать, на каком он языке — на русском или на английском. Страница тут же подсвечивает символы английского языка, если текст русский, и, наоборот, символы русского языка, если текст на английском.

Скриншот

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

Практическое же применение может быть, например, если есть какой-то код авторизации, и имеется подозрение, что часть символов в нём может быть на русском (и поэтому код не работает). Эта веб-страница, соответственно, позволяет проверить, так ли это.

Friday, January 07, 2011

testcreator — автоматизация тестирования студентов

Вчера я дописал небольшую программу с веб-интерфейсом; она написана на Django (Python) и позволяет несколько автоматизировать процесс тестирования студентов.

Преподаватель может создать тест — например, по русскому языку или математике. После этого он может добавить к нему нужное количество вопросов и к каждому из вопросов заполнить несколько ответов, при этом он может выбрать один или несколько ответов как «правильные».

После того, как тест будет наполнен вопросами, можно экспортировать необходимое количество случайно выбранных вопросов в PDF, причём сразу в двух вариантах — один вариант для студента, для заполнения, а другой для преподавателя — для проверки теста (в варианте для преподавателя указаны правильные ответы).

Таким образом можно, например, сделать тест с двумя сотнями вопросов и выдать каждому студенту совершенно индивидуальный вариант с 20 вопросами.

Скриншот

Скриншот

Скриншот

Скриншот

Скриншот

Saturday, November 06, 2010

FLAC encoding to MP3 and Ogg

Okay, so you have a collection of amazing music in FLAC. But your portable media player only supports MP3. That means you have to convert the files before you can put them on your player. And it would be nice to convert whole albums.

If your player supports Ogg, you can simply execute this. It converts each of the .flac files in the current directory to Ogg.

oggenc -q7 *.flac

But how about MP3? LAME is a terrific MP3 encoder, but it doesn’t have an option to convert FLAC files.

Well, fortunately, Linux provides all the needed tools to get the needed combination of programs working together to do something.

for i in *.flac ; do flac -dc "${i}" | lame -b 320 --alt-preset insane - "/home/ml/mp3/${i%.flac}.mp3" ; done

Here we use the “for” cycle of bash to run the “flac” command for each of the .flac files in the current directory. Option -d tells flac to decode the given file and -c tells to write output to the standard output (stdout). LAME has two required arguments: input file and output file. But we can use a hyphen (“-”) for input file to use stdin and for output file to use stdout. In this case LAME has stdin received from flac. To transmit flac’s output to lame’s input we used pipes. Finally, ${i%.flac}.mp3 is a simple bash parameter substitution example. It takes the contents of the i variable, but without the ending “.flac”. Then you can just put .mp3 to the end of the string to make a new file extension.

Wednesday, July 21, 2010

Recording and editing screencasts with recordMyDesktop and Audacity

RecordMyDesktop is a nice tool for screencasting. It allows you to record the computer’s screen and your voice. But what if you want a little more? In my case, I wanted to edit the audio track to include music and change volume on my voice in some places.

Before running recordMyDesktop and recording the video, make sure that you have enough disk space available in /tmp. If you don’t, choose a different working directory using the -workdir option.

This runs the recording after waiting for 5 seconds, and uses /home/kasi_sona/tmp as a temporary files directory.

recordmydesktop --delay 5 --workdir /home/kasi_sona/tmp

To stop the recording, you can use Ctrl + Left Alt + s.

Sunday, July 18, 2010

Смотрим кино с субтитрами сразу на двух языках

Увидев только что на Хабрахабре вот эту блогозапись, подумал, а нельзя ли сделать так в Линуксе. Оказалось — можно. Причём метод не зависит от проигрывателя видео, главное, чтобы программа поддерживала субтитры в формате ASS.

Скриншот

if anyone needs this, i created a bash script allowing you to
watch/convert movies with two subtitles shown at the same time. you
may use this if a foreign friend comes to visit you and you both would
like to watch a movie with subtitles in your mother language, for
instance.
Если кому-то надо, я создал скрипт на bash'е, позволяющий смотреть/конвертировать фильмы так, чтобы одновременно показывались две дорожки субтитров. Вы можете им пользоваться, если, скажем, к вам в гости приезжает друг из другой страны, и вы бы оба хотели посмотреть фильм с субтитрами на вашем родном языке.

Thursday, October 22, 2009

Linux (или компьютер) совсем для всех

Задача. Обучить (с нуля) 60-летнюю маму пользоваться компьютером, Ubuntu Linux и электронной почтой Gmail.

Ресурс. Все необходимые детали, чтобы собрать компьютер, загрузочная флэшка с Ubuntu, вечер на сборку компьютера и установку ОС, несколько часов на написание руководства, полчаса на обучение.

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

Был собран компьютер — процессор Pentium D, 512 MiB оперативной памяти, встроенные в материнскую плату графика и звук, винчестер. Никаких наворотов вроде оптического привода или флоппи-дисковода — в 21-м веке оптические диски (не говоря уж о дискетах) устарели, да и какое отношение они имеют к электронной почте?

Далее на этот компьютер была установлена Ubuntu 9.04. Почти никаких особенностей. Раздел подкачки 1 GiB. Пришлось, правда, сделать небольшую лоботомию при установке — форсировать загрузку Live с графическим драйвером vesa (кажется, параметром vga=788 или как-то так). Очевидно, Ubuntu пробовала какой-то другой драйвер, который, впрочем, успешно вешал компьтер. Такую же проблему я уже встречал ранее на другом компьютере (там тоже было видео ATi, но не встроенное) — там умный подбор «подходящего» драйвера приводил к kernel panic. Впрочем, на большинстве компьютеров, которые я видел, установка Ubuntu проходит вообще без проблем.

После установки всё работало отлично. Эффекты были отключены для увеличения производительности. Звук не работал — нужно было всего-то снести pulseaudio (к этому я уже привык, я вообще считаю, что разработчики Ubuntu очень странные люди в этом плане: зачем встраивать в стабильный дистрибутив то, что работает только на некоторых компьютерах?), после этого всё стало замечательно.