ngrok for the wicked, or expose your ports comfortably
I've started using ngrok a lot lately (I know, I know, late to the party). But then last week, Homebrew has updated it to a version where it wants some $25 to supply custom domain names. I mean, I could pay that, but I'm paying Hetzner like $8 or [...]
PostgreSQL collation
I've got into a situation with PG I've never been into before. There is a financial reports table, containing some description of a transaction, with columns like date, amount and comment. And this comment field is often used to search for something case-insensitively. This is done best using where lower(comment) [...]


History Snapshotting in TwinSpark
TwinSpark is a library we use to write Kasta frontend now. You can see examples of basic behavior by opening a link, but a cornerstone of TwinSpark is HTML-replacement functionality, which is what concerns us now. You see, controlling app behavior can be done in various ways, but the [...]
Code streaming: hundred ounces of nuances
A few months ago I got a feeling that I’d enjoy live streaming some coding. Not sure exactly, but it seemed to be somewhere along the lines of “sitting at home,” “not enough people around to complain to” and things like that. Plus it felt like it could spark some [...]


Useful shell prompt
There are only a few apps I use every day and shell — ZSH — is one of the most used. It’s been that way since the beginning of the ’00s and back then I spent a lot of time configuring my prompt to be a good balance between compact/readable [...]
API pagination design
Returning all results for a given query could be a challenge for an API, especially if there are thousands of results. It puts a load on a server, on a client, on a network, and often is unnecessary. Thus people invented pagination. The usual way to paginate is an offset or [...]
ElasticSearch query builder
This post strives to be useful to anyone who uses ElasticSearch, but all examples are going to be in Clojure since it’s what we use. ElasticSearch is a wildly useful database (if I may say so), but at times it feels like its query language evolved rather than was planned. This [...]
Higher-order functions are like inheritance
HOF as a concept is quite simple: it’s a function which takes a function as an argument. Alternatively, it’s a function which returns a new function. In both cases it’s a higher-order function. Is it useful? Massively! Most sequence-processing functions take a function as an argument: map, filter, reduce, whatever. [...]
A tale of webpage speed, or throwing away React
Back in 2011, I happened to get a job writing Backbone.js app. If you never did that, don’t. I was complaining about difficulties with composition left and right to whoever would listen. As I started digging into alternatives for the front-end, I discovered FRP and Flapjax, and [...]
Clojure, GraalVM, PolyglotVM:
A bit more than 10 years ago I wrote a pastebin app: It’s quite simple and it came into existence because the one I was using went offline and I didn’t want to use Github’s Gist because of its persistence - it’s stored in your profile if you [...]
PostgreSQL query JIT
We’re proud users of PostgreSQL. Proud in a sense we’re really glad that our main data store is such a stable, performant, introspective, and overall great DBMS. It’s been very reliable for us and in times of turbulence made it possible to understand what the issue is. Overall, I love [...]
Blog workflow
A long time ago I had a blog that had an admin interface. That ended 10 years ago, and it’s been Emacs and git since then. Until yesterday! A few months ago I found an app - - which I love to use. It’s good for notes and for [...]
SSDNodes review
A while ago when reading yellow site I stumbled upon a comment from XERQ, who is a founder of SSDNodes. The company’s value proposition is to pay them for a year and get a massive discount on price compared to Linode (which is what I was [...]
I did not sleep enough for the last 3 nights and noticed an interesting thing. When I was woken up this morning I felt really bad, sleepy, and in general, had a feeling of “I really need to sleep.” But then as the day progressed presence of this feeling was [...]
Inheritance considered harmful
Many years ago I was a Python developer. That is, the only language I knew well was Python. I had some perspective though - via Perl, Elisp, C# and bits of others. And it’s not like I didn’t see any problems, but I embraced Python by heart and accepted these [...]
Gostatic got HTML hot reload functionality
After years of reminding myself to do it, I finally did it: gostatic now got hot reload! And it took me only two month (nothing compared to years of wait) to make a release and write this post. I should say, it’s pretty nifty, seeing browser being updated almost immediately [...]
Switching languages with Karabiner
Life has blessed me with being born in Ukraine; this complicates life a bit though when dealing with computers. For example, you can’t just use a single layout like all those peoples in the USA or elsewhere where they have this luxury. That makes living in Ukraine similar to living [...]


HTTP2 server push for static sites
It’s been a long time already since we’ve got HTTP2 push working at Kasta. And it’s a fantastic technology: if you know some resource is going to be needed by a client (browser or app), you can send that data down the network before the client even realizes the [...]
Як перекладалась Kasta
Вирішив написати в блог про те, як Kasta отримала українську мову. Враз і написання нею потренувати, а то я і книжки українською давно вже не читав, і не розмовляю майже, сумно. :( Пост буде складатися з двох частин — частина з історією і частина з технологіями. Частина історична Вперше ми заговорили, [...]
New Job!
Я в Касте уже 4 года Chief Technical Officer. Они ни в коем случае не были ни лёгкой прогулкой, ни скучным отсиживанием задницы. За эти 4 года мы (без всякого порядка) сменили платформу, пережили 3 (и не пережили один) Black Friday’я, выстроили довольно прикольную внутреннюю архитектуру, собрали крутейшую команду, успешно сменили бизнес-модель и [...]
Механическая клава
Недавно припекло мне попробовать механическую клавиатуру. Тяжело назвать причину, куча всяких - много уже всяких восторженных статей перечитал, “моя жизнь никогда не будет такой, как до механической”, чуть может желание что-то поменять, ничего прям совсем необходимого, но захотелось. Пошёл я смотреть на трушные клавы, типа WASD или Das Keyboard, но в Украине их нет, сроки [...]


Обработка RAW в Fujifilm X-T1
В прошивке фуджика (не знаю точно, в какой, сегодня с утра заметил) сделали прикольную штуку: если сфоткать в рав, можно применить любую трансформацию, которую умеет сам фотоаппарат. Это тем более прикольно, что текущие фуджики известны генерацией хороших JPEG’ов прямо из фотоаппарата и очень хорошо работающими симуляциями фотоплёнок (классических фуджиковских, типа Velvia, Provia, etc). С [...]
Server Side Rendering at
I’ve decided to translate an article I wrote for modnaKasta technical blog since it should be fairly interesting for a wider audience than just Russian-speaking people. is a single page application right now, which uses React internally and is written in ClojureScript. But we care about Google and people experience, which means [...]
Test Driven Walking
Все знают TDD - Test-Driven Development. Пишешь сначала тесты, которые проверяют те случаи, которые ты придумал, а потом пишешь код, который удовлетворяет этим тестам и только тестам - не забегая вперёд. Когда реальная жизнь показывает, что кода недостаточно, пишешь новые тесты (которые подсказала реальная жизнь) и улучшаешь код. Таким образом, код всегда покрыт тестами, [...]


Где-то в сентябре мне пришла в голову прекрасная мысль, что без хотя бы относительно вменяемого мониторинга приложения нам вообще-то нельзя, и надо бы узнать, сколько запросов в секунду мы обрабатываем, как долго это происходит, и что там люди чаще всего открывают. Иначе говоря, черная пятница на носу, а инфы у нас, что же [...] + Gmail
So I’ve decided once again I dislike having my mail client opened in one of the browser tabs and I want it somehow separate. I’m still unsure why’d I got this feeling, but I like the result - read on if you’re interested. I went with - free version at first. [...]
Новый 2016!
Я в 2015 году не написал ни одного поста в блог, меньше писал в твиттер и вообще всякой активности в онлайн у меня было меньше обычного. Всë потому, что я с прошлого января1 — CTO в modnaKasta, и вроде ожиданно, но всë равно очень резко уменьшилось количество времени, [...]


Пробки - странная штука
Обычно мост Метро в 9 утра двигается очень медленно, и хвост торчит аж до развязки на “Левобережной”, и проехать его занимает минут может 10, не знаю - долго довольно. Но сегодня на въезде со стороны Броваров сразу после “Лесной” на одной из двух рабочих полос (не занятых маршрутками и припаркованными машинами) была авария - [...]
Когда стоит использовать Go?
Понятное дело, что это мой личный блог, и потому этот дисклеймер в теории писать нет смысла, но на практике я всë равно напомню - всë, что я тут пишу, это мои личные мысли, если не указано обратное (что это факты или мысли кого-то другого, скажем). Так вот, когда? TL;DR: никогда. Длинный вариант: если вам прямо [...]
Clojure Cup 2014
Прошëл год и мы решили, что необходимо провести работу над ошибками и сделать что-то, что работало бы после двух дней бешеного забега, и, возможно, позволило бы попасть в тройку победителей. :) В этот раз по разным причинам не смогли участвовать двое из прошлого состава, так что команда получилась из меня, Севы,
ClojureScript: how to begin
This is a short guide which intends to give you shortest path to writing ClojureScript with React and reloadless workflow. It doesn’t teach you how to write actual applications, only how to set up all the necessary (and boring) boilerplate. For an application example see snake or flappy-bird. Let’s get [...]
Переписал Showkr на ClojureScript
После того, как я закоцал и восстановил себе сервер, я обнаружил (ну и вспомнил в какой-то степени), что Showkr (описание) перестал нормально собираться. Я там не зафиксировал версии библиотек, что-то себе сломало обратную совместимость, и всë такое. В прошлый раз я просто подпихнул рабочую версию, а в этот попытался разобраться, что там [...]
Недавно перевëз свой сервер на Digital Ocean, и заодно переехал с системы настройки “сча поправлю конфиг и забуду навсегда” на Dokku. Докку - это система деплоя, такой себе “Heroku для дома”. У докку есть список так называемых “билдпаков”, которые описывают, как собирать тот или иной тип приложений. Эти билдпаки есть для питона, руби, джавы, [...]
Почта: удобство против защищëнности
Все страсти со слежкой, NSA, усилением контроля над интернетом в России и т.д. заставляют всë большее количество людей задуматься о том, что возможно стоит перейти с “читай-кто-угодно” Gmail и подобных (я утрирую, конечно, вопрос лишь в принципиальной возможности и относительной простоте прочтения чьего угодно мыла) на что-то подобное недавно закрытому Lavabit (который в целом [...]
Недавно обнаружилось, что я пропустил целых два альбома Сепультуры - несмотря на то, что я порядочно их слушал (судя по’у, даже больше, чем Korn и Static-X, хм), это всë-таки не самая любимая группа и слежу я за ними не сильно вниматель. Но тут Сева дал ссылку на кавер на Just One [...]


Clojure Cup 2013
Недели три назад мне пришла в голову идея, что было бы прикольно поучаствовать в Clojure Cup и написать что-то прикольное на кложуре (сорри, я буду называть еë кложура, а не кложа, как делаю и в реальной жизни, потому что я так вижу ;)). Я вообще никогда особенно не испытывал большого желания участвовать в [...]
Когда ты хостишь репозитории сам, то можешь сделать какие угодно хуки и по push’у в свой репозиторий делать что угодно - например, рендерить свой сайт. Но когда ты перемещаешь эти репозитории на GitHub, приходится пушить изменения и туда, и себе на сервер, чтоб они там отрендерились. Хостить сайт [...]
Я люблю использовать комбинации кнопок для перехода к определëнным приложениям. У меня достаточно странный способ работы с кучей приложений - у меня они все на определëнных рабочих столах лежат (и я туда перехожу по Альт + цифра), но к каким-то я перехожу (или хочу переходить) отдельными . Адиум, например, сам имеет в настройках глобальный [...]
Теория погружения
Когда кто-нибудь жалуется на современное искусство или тяжëлую музыку, я рассказываю одну мысль, которая мне пришла в голову пару лет назад, и человеку обычно становится проще смириться с чем-то. Мысль это простая и очевидная (на мой вкус) после того, как она у тебя есть. Но так как я еë не подумал раньше, и не [...]
Go Replace!
Как-то раз два с лишним года назад я решил посмотреть на Go, поизучать, как это - писать на нëм программы, и насколько хороший выходит результат. Идея для первой программы родилась легко - так как мой любимый Python тормозит на запуске, я решил переписать sr, который я постоянно юзал, на Go. Так родился [...]
Go Replace!
Once upon a time two and something years ago I decided to check out Go to learn if it’s easy to write applications using it and how good (or bad) result is. Idea for a first application popped up immediately - my beloved Python has somewhat slowish startup, so I decided to [...]
Общение с архетипами
(архетип как образец, паттерн в сленге программирования) Только что прочитал статью Tailgating Y Combinator. Там некая девушка рассуждает о том, что люди слишком много значения вкладывают во внешний вид и переломить это практически нереально. В еë примере они приехали на собеседование Y Combinator’а на кемпере втроëм: чувак, похожий на гопника (я тут и [...]
Английский в слайдах задолбал
У наших докладчиков есть одна интересная привычка - они делают слайды на английском. Говорят на русском или на украинском, но слайды стабильно у большого количества народа - на английском. С ошибками, конечно же - не у каждого и не каждый раз, но очень, очень часто. С завтыками во время рассказа, потому что иногда нужно [...]
Translating in-browser applications
Earlier or later, if an application is not targeted on an English-speaking market exclusively, you’re going to work on localization. Such a moment happened for us a few weeks ago: when there are no more excuses left and something had to be done. :) And I started seeking for a library, which I could [...]
Переводы браузерных приложений
Рано или поздно, если приложение ориентировано не на англоязычный рынок, всем приходится сталкиваться с локализацией. Пару недель назад у нас подошëл момент, когда дальше уже нельзя и пора что-то делать. :) И я пошëл искать библиотеку, которую можно было бы использовать для переводов. Я нашëл какое-то их количество, некоторые из них были с зависимостью [...]
Рекрутëры, эйчары, хедхантеры и прочие проФФесионалы
В Украине, впрочем, как и везде в мире, спрос на разработчиков давно уже превышает предложение. И это является одним из главных факторов роста зарплат. Казалось бы, это должно еще и заставлять тех, кто ищет программистов, делать свою работу лучше. К сожалению, подход “отправить как можно больше писем, авось кто-то откликнется” цветëт и пахнет. И [...]
Электронные книги
Короткий пост непонимания. Вот есть у нас довольно прекрасная (ну т.е. не лучшая в мире, но всë-таки еë присутствие лучше еë отсутствия) компания Amazon, которая продаëт книги. И книги эти бывают бумажные, а бывают электронные. Прогресс же, 21 век и всë такое. И вот сижу я и смотрю на электронную книгу за $14,89, которую [...]
Mac OS X: too many open files
Иногда на Макоси возникает такая ошибка, и я боролся с ней разными способами: поднимал значения в kern.maxfiles и kern.maxfilesperproc, менял лимиты в launchctl limit - и обычно это не помогало, но как-то всë же я проходил дальше и всë работало. Но тут стало невыносимо, запускаешь gostatic в режиме слежения за файлами, и при изменении любого [...]
MacOS: too many open files
Sometimes MacOS gives you an error like this. I tried to fix that by whatever Internet told me: made kern.maxfiles and kern.maxfileperproc values bigger, changed limits in launchctl limit - it did not really help though. Usually the error went away just because some application stopped doing what it was doing. Lately it became [...]
Raspberry Pi
Прямо перед Новым Годом я себе сделал небольшой подарок - купил Raspberry Pi. У меня в голове не было какого-то определëнного плана, что я буду с ним делать, но уж очень хотелось. ;) Особенной любви к возне с железом у меня нет, поэтому рпи не открывает у меня двери, не заведует светом и [...]
Хотлайн и работа с клиентами
Есть такой прекрасный сайт - Хотлайн. Это самый большой агрегатор цен в Украине и я вообще никогда не парюсь, где смотреть цены на что бы то ни было вообще - хочется руль? нож? палатку? - всë там. Кроме довольно юзабельного обычного сайта, у них есть мобильный сайт и мобильное приложение. Приложение я не [...]
Gostatic: ещë один прекрасный блог-движок
Очевидно, что раз написав движок для блога, остановиться уже невозможно. Я чувствую себя Асприном, который пишет очередную МИФическую историю (я даже попытался сделать отсылку на них в названии, но не думаю, что получилось). Короче, ещë один. Зачем? Предыдущий тоже генерировал статику и хорошо при этом назывался, зачем менять? Ну, он тормозил. Скажем, [...]
RequireJS & AMD
Отсутствие модулей - это одна из самых неприятных проблем джаваскрипта, даже когда пишешь не слишком большое приложение. Когда пишешь большое, полноценное внутрибраузерное приложение, это становится проблемой первого порядка - без системы модулей что-то писать становится невозможно. Конечно, эту проблему решают разными способами и давно, но всерьëз я рассматриваю только один - AMD, Asynchronous Module Definition. [...]


Cross-compiling Go
I saw a thread on cross-compilation in golang-nuts group recently and decided to replicate information here so I won’t forget and (maybe/hopefully) it’ll make it easier to discover for others how to cross-compile go applications. I’m on OS X and my Go source code resides in ~/var/go. In this case what I do is:

    Showkr - an in-browser application
Some time ago I made quite simple, but (I hope) useful web application called Showkr. And now I decided to tell a story about why and how I did that - I think that could be useful considering growing popularity of in-browser applications. Why Flickr has quite heavy pages, and when you’re watching [...]
Showkr - приложение в браузере
Я за последние пару-тройку недель по вечерам и выходным понемногу сделал дикий, но симпатичный (и, может, полезный) сайт Showkr. И решил рассказать миру о том, зачем и как я это сделал - я думаю, что вторая часть может пригодиться, учитывая растущую популярность приложений в браузере. Зачем У фликра довольно тяжелые страницы, и когда смотришь [...]


SQLAlchemy tutorial: how to start
SQLAlchemy is a best Python ORM by far, and it has really thorough and detailed documentation. Being like that has a flip side though: it explains a lot of basic concepts right through beginning. I personally find it much easier to start with some recipes and simple examples. Which is why I’ve decided [...]
SQLAlchemy учебник: как начать
SQLAlchemy - очевидно, лучшая ORM для питона, с обширной и подробной документацией. У такой документации есть и обратная сторона: вместо быстрого введения она подробно объясняет все базовые концепции. Мне лично легче начинать с небольших рецептов и простых примеров, а не с серьёзных трактатов - поэтому я решил написать эдакий недо-учебник, самое короткое введение в [...]
rsync вместо cp
Надо было залить довольно большое количество больших бинарных файлов на сервер, на котором нет никаких ftp-демонов и прочих извращений. Я обычно пользуюсь scp (с -r для директорий), но сейчас файлов было действительно много и мне было бы лень стартовать несколькочасовую процедуру закачки заново. Поэтому я наконец-то (впервые в жизни) взял и внимательно просмотрел ман по [...]
Урлы и #!
За последнее время проскочило великое множество статей на тему того, какая плохая штука шебенги (#!) и как все срочно должны перестать их использовать. Меня эта тема немножко волнует и мне тоже хочется высказаться. Начнëм с того, почему они плохие. Основные аргументы: сайты с ними тормозят они ломают поисковики они ломают curl/wget Очевидно, что первый пункт никакого отношения к [...]
Почему ничто не может двигаться быстрее света?
Недавно на реддите проскочил совершенно замечательный ответ на вопрос, почему же всë-таки скорость света считается предельной и невозможно разогнаться быстрее неë. Он меня настолько впечатлил - тем, насколько всë легко укладывается в голове (в отличие от того, что обычно пишут в книгах и учебниках), что я решил его перевести на русский. Существует множество простых, интуитивных [...]
Bazaar: hate and... hate
Несколько месяцев назад я сменил работу и по несчастливому стечению обстоятельств оказалось, что основная система контроля версий здесь - Базар. Я его и раньше не любил, но мне триста раз указывали, что это всё просто непривычно, и он на самом деле не хуже, чем меркуриал или гит, и вообще всё супер. Я пользовался им три [...]


Бывает, пишешь какой-нибудь код, сам или с командой, в которой каждый озабочен качеством кода и его читаемостью, все пытаются заботиться о том, чтоб потом другой человек мог понять написанный код, и думаешь - эх, вот жаль в питоне мало сахара, сейчас бы пару фич из руби, немножечко сахара добавить, и будет у нас такой [...]
Пакетный менеджер в Emacs
Когда используешь Емакс достаточно долго, накапливается большое количество всяких сторонних .el-файлов, пакетов собственно. Всякие yasnippet, grep+, smex’ы и прочие ack’и. Само по себе это, конечно, клёво, но за ними приходится следить, обновлять руками, ложить их в тот же репозиторий с емаксовыми конфигами - а это уже как-то не совсем кайфово, ну и в общем нет [...]
Управление проектами в Емаксе
EDIT: на дворе 2019 год и я давным-давно пользуюсь projectile, чего и вам советую. :) У Емакса какое-то подобие проектов из коробки появилось только в 23 версии, и то очень простое - только переменные директорий (directory variables, что-то типа file variables, только хранящиеся в отдельном файле - .dir-locals.el). По большей части потому, что [...]
Google Maps API vs API Яндекс.Карт
Описанный в прошлом посте сервис Дислокации использовал с самого начала Яндекс.Карты как движок карт. Причин на то было несколько - я думал, что они будут распознавать адреса лучше, чем гуглевские; у них значительно лучше документация, чем у Мапии; нет вопросов с получением ключика к АПИ, в отличии от Визикома. В результате [...]
В жизни частенько приходится сталкиваться с тем, чтоб найти какое-то учреждение например, ближайшее отделение банка. И обычно этот процесс связан с просмотром списка из кучи адресов и попыткой выудить глазами знакомые улицы - потому что проверить все эти адреса по карте не представляется возможным вообще. Иногда у меня в голове появлялась мысль, что было [...]
Перезагрузка блога
Ну что, привет, в очередной раз на новый лад - я опять сменил себе движок блога. :) И на этот раз уже не очень важно, что это - потому что он просто генерирует статический сайт. ;) Я даже пошëл на столь экстремальный шаг, как отсутствие комментариев - обдумав ситуацию, я понял, что пишу не [...]


Mercurial 1.4.1
Хочу похвастаться - вышел Меркуриал 1.4.1, замечательный тем, что в него включили моë расширение - schemes. Это аналог алиасов, но только для адресов. После его включения и добавления в ~/.hgrc таких строчек: [schemes] p = ssh:// можно писать hg push p://byteflow/ вместо полного адреса. В расширении уже есть предопределëнные ссылки: py = bb = bb+ssh [...]
GAE писали идиоты
К сожалению, этот пост не изменит ничего, но тем не менее я не могу не поделиться наблюдением о том, что авторы питоновской части GAE - идиоты. Они попытались скопировать синтаксис джангового орма, при этом порядочно искалечив его, но не это самое плохое. Самое плохое, что я на сегодняшний день нашëл, выражается вот таким кусочком [...]
Two months ago I’ve released little command line parsing library for Python called opster (actually it was called finaloption then, but I’ve renamed it because of remark from native speaker ;-)). What’s the reason to write one more command line parser when Python already has getopt and optparse in standard library and not [...]
UPD. Библиотека переименована в Opster. Я тут выпустил библиотеку для парсинга коммандлайновых аргументов. Зачем еще одна, когда уже в питоне есть getopt и optparse, когда не так давно появились argparse и optfunc? Ну… как обычно, потому что они все неправильные и делают не то и не так, как хочется. ;) Всë началось тогда, когда Зед [...]
Юникод в Python 2.x - что это и зачем?
В реальном мире строковыми данными обмениваются в какой-то кодировке. Например, koi8-r, cp1251, utf-8. И когда тебе приходят данные, ты во многих случаях знаешь, какая это кодировка. Но когда тебе приезжают данные из разных мест в разных кодировках, работать с ними одновременно довольно напряжно - надо всегда об этом помнить. Чтоб облегчить жизнь, внутри программ используют [...]
Mercurial 1.3
Это, конечно, не полноценная статья в блог, но тем не менее довольно клëвое событие - вышел Mercurial 1.3. Событие клëвое тем, что в него добавили поддержку сабрепозиториев - аналог externals из svn. ;) Пока она еще не отполирована, поддерживает только меркуриаловые репозитории, но тем не менее - это уже [...]
Реиспользование приложений
Есть в Джанге такая сущность, как приложение - какой-то кусок функционала. На мой взгляд, то, что Джанга заставляет юзера делить свой проект на такие кусочки это один из ее самых толстых плюсов (наряду с отличной документацией). Она идет даже дальше того - предоставляет несколько уже готовых, отлично сделанных приложений. Для аутентификации, для комментариев и [...]
Byteflow 0.7
Я решил, что нет никакого смысла ждать с моря погоды и таки выпустил релиз Byteflow - 0.7. ;-) Такой странный номер потому, что до 0.9 какого-нибудь по фичастости и стабильности еще надо поработать, а вот от 0.1 явно уже далеко по тем же параметрам. Изменений от предыдущего релиза - никаких, [...]
Консультации по Mercurial
UPD. К сожалению, сейчас у меня нет возможности этим заниматься Я тут поразмышлял на досуге и подумал, что пора уже свои знания использовать для служения человечеству. ;) Так что welcome - если вам (или вашей команде) требуется тренинг, консультации по Меркуриалу (да и вообще DVCS), у меня есть и способности, и желание. ;) Оплата, естественно, [...]
Короткие ссылки — rev=canonical
Буквально вчера мне в читалку приехал пост Саймона Виллисона о довольно новом способе сокращать урлы. Идея заключается в том, что сокращалки урлов на самом деле - не очень хорошая штука, особенно с точки зрения жизни этих ссылок (вопрос о том, нужно ли сокращать урлы - отдельная вещь). Что, если умрет? Куча [...]
Short urls — rev=canonical
Just yesterday my feed reader fetched Simon Willison’s article about relatively new method of url shortening. The idea is that url shorteners in fact are not very good thing, especially from URL term of life point of view. What if is going to die? A lot of URLs will appear unusable, even [...]
Python переходит на Mercurial
Гвидо сегодня анонсировал, что питон переходит на меркуриал. Отлично! ;) Вообще, читаю несколько фидов в твиттере про PyCon и так жалко, что у меня никакой возможности съездить туда не было.
I couldn’t understand why my productivity went down when I had deliberately made more time available to write. Then I realized it was because I wasn’t flying as much. Before, I’d sit on a plane and pull out a computer and start writing a speech or whatever. And on most planes, there are [...]
Exception #10
Написать можно было и пораньше, конечно, но лучше так, чем никогда. ;) def saturday(): raise Exception(10)
Редактирование комментариев
Редактирование комментариев для блога (если они есть) - абсолютно необходимая вещь. Ну т.е. не так, чтоб кровь из носу, но я надеюсь, что тег этого поста дает мне немного свободы говорить такие безапеляционные вещи. ;) Написал я комментарий, отправил - смотрю, ошибка. Поправить уже нельзя. :( В общем, вордпресс подобен [...]
Узкие шаблоны
Я давненько (полтора месяца прошло) уже ничего не писал - как обычно январь и февраль у меня какие-то странно безумные месяцы. Непонятно, почему в этом году так - сессии-то уже нету, может по привычке? ;) Но писать есть о чем, в основном длинные вдумчивые посты. А тут я буквально пять [...]
Размер шрифта
Ян Бикинг написал несколько слов о дизайне, которые напомнили мне об отзывах на текущий дизайн моего блога. В принципе, его слова (и статья Вилсона Майнера, которая собственно и сподвигла меня таки сделать редизайн - там есть на неё ссылка) - это выражение причин, по которым дизайн изменился. :) Очень полезно, [...]


Смерть банкам!
Мой пост совсем не в тему блога приходится, но моя душа просто кричит о своём согласии с мнением Ллео о банках - я даже несколько лет назад начинал писать в свой ЖЖ пост по тому же поводу, но меня хватило лишь на пару строк матов, после чего я забил. :) Но тут прочёл [...]
Mercurial 1.1
Вышел Меркуриал 1.1 со списком изменений на 2,5 страницы. :) Есть там и результаты моих усилий, и в общем фичи очень клёвые. Помимо графика дерева изменений в вебморде мне очень нравится zeroconf - после его включения hg paths в локальной сети показывает все запущенные hg serve. Очень удобно - [...]
Mercurial 1.1
Mercurial 1.1 is out and list of changes takes 2.5 pages. There are some my efforts in this release, ;-) but in overall two most appealing features for me is a graph of changeset tree in webinterface and zeroconf extension - it allows hg paths to display all hg serve instances running [...]
Редизайн блога
Идея эта у меня висит ещё с лета, когда я увидел - очень симпатично сделанный, с моей точки зрения, сайт. Но когда я попытался натянуть дизайн на свой блог, оказалось, что мне не нравятся всякие мелочи. В результате я нарисовал практически всё с нуля, использовав оттуда только идеи [...]
Мои инструменты
Я тут немножечко протормозил с продолжением поста Лориена на тему используемых инструментов - довольно напряжённые были последние пару дней (да и последующие тоже такими будут, судя по всему :), но вот всё же собрался - и пишу. :) Собственно основное время я провожу в Емаксе. ;) У меня в нём [...]
FirePython - нет print'ам?
Когда я разрабатываю какое-то веб-приложение, то практически не пользуюсь разного рода отладчиками и всякими вспомогательными инструментами: в 90% случаев с головой хватает print variable для того, чтоб понять, в чём проблема. Ну, иногда я всё-таки делаю import pdb; pdb.set_trace(), в особо запутанных случаях. Но тут буквально вчера мне показали пальцем на [...]
Firepython - no prints?
While I’m developing some web application I almost never use any debuggers or supporting tools: in 90% of cases usual print variable is enough for understanding a trouble. Of course, there are some very complicated cases, when I do import pdb; pdb.set_trace(). But I was pointed at very cool thing yesterday - FirePython. [...]
Blogging Spree
That’s my first post in this blog. The idea of having blog in English arose a lot of time ago but I always had some lame excuses for myself to not do that. But two weeks ago I’ve added ForeignKey to Site to blog.Post model in Byteflow (which naturally [...]
jQuery scrollBottom
Наконец-то я собрался и сделал, чтоб ссылки “комментировать”/“ответить” вели себя так, как я хотел этого с самого начала. :) Всё просто - при нажатии ссылки появляется форма, и нижняя граница браузера скроллится к нижней границе формы. А так как в принципе функция довольно удобная, а я тут ещё и случайно увидел, [...]
Статьи про меркуриал
Я вдруг подумал, что читать DOU могут не все :-) и явно тогда стоит сообщить, что я написал все три статьи из цикла (введение, основы и расширения). Вообще задумывалось четыре статьи, но я сейчас просто не осилю сравнение с другими системами - может, как-нибудь попозже (через [...]
Тёмная сторона Django
В любом случае, когда используешь инструмент длительное время, то некоторые вещи в нём начинают раздражать. А так как Джангу я использую вот уже больше двух лет, то некоторые вещи меня раздражают очень порядочно, так что этот пост будет именно о том, что меня раздражает. Как ни странно, но наличие DJANGO_SETTINGS_MODULE в [...]
Mercurial: расширения
Продолжение, см. также: Mercurial: введение в распределённые системы контроля версий, Mercurial: основы. Несмотря на то, что Меркуриалом можно полноценно пользоваться, используя только встроенную функциональность, существует достаточно большое количество различных расширений, которые значительно увеличивают круг возможностей и решаемых задач. Немалая их часть входит в комплект поставки hg — все описанные, [...]
Ubiquity: емаксоподобный файрфокс
Disclaimer. Здесь под емаксоподобностью не подразумеваются столь милые сердцу емаксеров хоткеи или ещё какие-то внешние проявления. :-) В случае, если ваш канал позволяет, посмотрите видео представления этой штуки. Вкратце, что это такое - такая небольшая консоль, которая позволяет набирать команды с параметрами (и может использовать выделенные объекты на странице как аргумент), заодно показывает аяксом [...]
Exception #09
Опять у питонского мира праздник намечается - девятый Exception будет уже в эту субботу. Так что не забудьте зарегистрироваться и прийти. ;-) Тем более наметилась попытка придать слегка официальный статус обсуждениям после семинара. =)
Картинки в статьях
Наконец-то долгожданная фича, до которой у меня никак не доходили руки (и мозги ;), работает: теперь из админки можно загружать и публиковать картинки. Пока только с синтаксисом markdown’а, но если кто хочет проапгрейдить - патчи велкам. ;) Думаю, со временем можно будет проапгрейдить, но пока и такой вариант очень неплох, имхо [...]
Ура. Она вышла! :-)
В очередной раз искал, как сделать что-то в zsh, и наткнулся на html-версию man-странички zsh-lovers. В этот раз проглядел её (всё ещё не до конца) более внимательно и впечатлился. Раньше не знал клёвых штук, например вот такая команда делает символические ссылки на все файлы (не трогая директории, благодаря модификатору в [...]
На чём запускать Джанго?
Как я и писал в комментариях к предыдущему посту на эту тему, я решил, что тестирование производительности с помощью byteflow - не самая удачная идея, потому как довольно тяжёлая логика мешает веб-серверам показать себя. Потому взял простое приложение на джанго, которое всего и делает, что отдаёт строку “hello [...]
Вчера оформил как отдельное приложение и релизнул одно своё творение, которое делает самую малость - проходит по всем urlconf’ам джанги и создаёт их полный список. Если кинуть в настройки словарь URL_VALUES, где будет соотстветствие имя параметра - значение с какими-то тестовыми данными, то можно получить вполне рабочий список урлов для [...]
Music excavated
Уже довольно давно мы с Севой понемногу (ну совсем понемногу) делаем свой небольшой проект. Началось всё с того, что нас малость задолбало хранить разрастающуюся разнородную коллекцию txt и html файликов с текстами песенок. Хранились они по той простой причине, что для их нахождения в интернете приходилось применять значительные усилия и рассматривать тяжеловеснейшие дизайны каких-то [...]
Mercurial: основы
Продолжение, см. начало: Mercurial: введение в распределённые системы контроля версий Одним из несомненных плюсов меркуриала является его интерфейс, который покажется знакомым каждому, кто хоть какое-то время работал с subversion в командной строке. Естественно, что отличий хватает (сам принцип работы совершенно иной), но наиболее часто употребляемые команды - очень похожи. Рассматривать я буду только командную строку [...]
WSGI серверы кратко
За последние несколько дней обнаружилась (для меня) уйма интересных WSGI серверов. Я уже довольно давно использую (естественно, для Джанги) Apache mod_wsgi для продакшена и CherryPy’евский WSGI-сервер для разработки. Но недавно обнаруженный fapws2 заинтересовал меня и я наконец-то собрался его скомпилировать (основная загвоздка была в необходимости обновления libevent), потом моё [...]
OpenID в Byteflow
Такой маленький пост, чисто похвастаться. :) Вот уже несколько месяцев благополучно работают обе части OpenID в движке - и клиент, и сервер. Ни одного бага (кроме небольшого, связанного с траблами реверс-проксирования и не имеющего отношения к логике работы) с тех пор, как мы закончили встраивать DjangoID (главным образом усилиями [...]
Mercurial: введение в распределённые системы контроля версий
Что, почему, для чего? Примерно года полтора назад я заинтересовался распределёнными системами контроля версий (хотя и слышал о них раньше, обычно о git’e, который в то время под Windows не работал, что мне было критично), когда наткнулся на сайт Bazaar‘a. Подогревали мой интерес обещанные разработчиками блага, в том числе и возможность коммитить без подключения [...]
Расположение файлов в проектах Django
Последнее время мне всё более и более странным (я бы даже сказал “недальновидным”) кажется решение авторов оригинального туториала по Джанге показывать именно такой формат расположения файлов в джанге (и уж тем более то, какой sys.path они там используют): в туториале все файлики, созданные с помощью startproject, лежат в одной директории вместе с [...]
Особенность статей о git'е
Заметил одну интересную особенность статей о Гите - каждая из них рассказывает о формате его репозитория, в который раз талдыча про его простоту и понятность, в то время как статьи про Меркуриал и Базар содержат более близкую пользователю информацию. Похоже, всё потому, что с интерфейсом Гита просто невозможно справиться, не понимания [...]
Watchlist: подписка на комментарии
Какое-то время назад Бурчик перевёл свой блог на Byteflow, и благодаря его стараниям в движке появилась возможность получать новые комментарии по почте. “Возможность” - это, конечно, сильно сказано, потому как получали их все прокомментировавшие без особых разбирательств. ;) Однако, несмотря на всё несовершенство этой [...]
Граф чейнджсетов в Меркуриале
В транке меркуриала появилась одна очень клёвая штука - дерево чейнджсетов в hgweb’е. Раньше его можно было посмотреть только локально, а сейчас - и онлайн. Например, вот byteflow. Кстати, последние изменения в crew1 говорят о том, что возможно в скором времени можно будет коммитить без [...]
Rebase для бедных в Mercurial
Пока честный rebase для меркуриала находится в стадии проекта для GSoC, я расскажу про то, как его сделать с помощью существующих инструментов - всё же это бывает полезно. Итак, что у нас есть? У нас есть какой-то проект, разрабатывающийся где-то там (вне пределов текущего репозитория ;), и локальные изменения (ещё нигде не опубликованные - [...]
Доступ к репозиторию hg через ssh
Довольно долго для расшаривания репозиториев меркуриала мне хватало обычного доступа по HTTP: легко настроить (дал права пользователю веб-сервера - www-data, и всё), просмотреть, работает всё чётко и без запинки. Но в конце-концов достало меня раз за разом набирать пароль для заливания своих изменений в репозиторий, а так как единственным альтернативным вариантом при доступе через HTTP [...]
NOTE: Not to be confused with a mercurial extension, named shelve. Few days ago there was a lot links on the Internet to gitshelve, which implements persistent versioned storage of objects in the git. I’ve read it description and realized that there are few serious design flaws: Can store only strings Uses subprocess.PIPE [...]
Exception #08
Итак, 24 мая опять намечается тусовка питонистов! ;-) Что хорошо - у Ивана получилось, как он и обещал, устроить это всё через пару месяцев. А что отлично - что это будут мастерклассы. Три штуки. Меня лично больше всего интересует Twisted, как наиболее далёкая для меня сейчас из всей [...]
Музыкальные языки
Из исходника и обсуждения в jabber-конференции pythonua@cjr родился прикольный список соответствия языков программирования стилям музыки. 1С: блатняк Ada: военный марш Algol: рок, блюз Awk: панк Basic: в траве сидел кузнечик Brainfuck: goa trance С: классический хард-рок C++: heavy-metal Delphi: пост-диско Erlang: симфонический оркестр Forth: industrial Fortran: бит Haskell: mathcore J: grindcore Java/C#: поп JavaScript: rave Lisp: progmetal Lua: latin-jazz ObjectiveC: indy-rock Pascal: диско Perl: ска-панк, рок-н-ролл, рэпкор PHP: хип-хоп Python: NDH, немецкие марши Ruby: [...]
Фичи Django 1.0
Джеймс Беннет пару дней назад опубликовал список фич, которые важны для релиза Django 1.0, по причине того, что они очень большие и важные, либо того что они простые, маленькие и порядочно улучшают/облегчают использование в обычных случаях, либо (менее важно) они заметно нарушают обратную совместимость и было бы неплохо их [...]
Сегодня про это пишут все, но я всё равно не могу промолчать. :-) Ветку разработки queryset-refactoring смержили в транк Django, что означает приход порядочной толпы приятностей. ;-) Мне лично очень нравится возможность посмотреть SQL до выполнения собственно запроса (QuerySet.query.as_sql()), ну и логично работающую фильтрацию по одной и той же таблице, хорошо [...]
Как постгрес тормозил
Сегодня напоролись на смешной прикол. Со внешнего сайта собирается некоторое количество данных и запихивается в базу. Сначала в сырые таблички, а потом обрабатывается и пихается на положенное место вместе с инициализацией кое-какой инфраструктуры. Ну и всё бы неплохо, если бы сбор данных (и запихивание в сыром виде) не происходило за [...]
Буквально только-только реализовал в Byteflow одну маленькую (совсем), но очень полезную штуку, подсказанную Катапом: в стандарте Atom’а есть два разных поля, использующихся для указания даты для элемента - published и updated, при этом updated - обязательное. Раньше в updated просто кидалась дата создания поста или комментария, но сейчас всё [...]
Размер репозитория
Чисто ради интереса решил привести один маленький забавный факт о размере репозиториев. Есть у нас немаленький проект, при этом чекаут исходников джанговой части из SVN занимает 79 мегов. При этом этот же проект, переконверченный в меркуриал - рабочая копия и полная её история вместе - занимает 80 мегабайт.
OpenID server
Этот пост будет кратким - благодаря стараниям Олега в Byteflow теперь присутствует сервер OpenID. Клёво. :-) P.S. А ещё byteflow - второй по тегу django на, после самой джанги. :-)
render_to improved
[UPD от 12 ночи] Чуть больше года назад, когда меня окончательно задолбало писать render_to_response c кучей параметров, я себе написал маленький декоратор render_to, который заметно уменьшал количество писанины. Но вот не так давно обсуждали его в джаббер-конференции pythonua@c.j.r (кстати, официальная конференция, где появилась идея слегка его проапгрейдить до возможности задавать темплейт из [...]
S-expression markup
У меня некоторое время назад появилась мысль - а почему бы не сделать простой синтаксис разметки на секпах? Ведь это сразу убивает одну из самых напряжный вещей в маркдауне - невозможность набирать разметку, не переключаяся на латиницу. Даже брать самый первый вариант, который приходит мне в голову, (a "текст [...]
Mercurial vs git
Я уже довольно давно собираюсь написать хоть какое-то примерное сравнение этих двух систем контроля версий - просто потому, что меня это касается довольно прямым образом. Но постоянно не мог собраться - сомнения, как бы начать, достаточно ли я для себя точек сравнения накопил, и так далее… В конце концов решил не тянуть резину в [...]
Exception #07
Итак, после полугодового перерыва - Exception опять с нами. В этот раз в расширенном формате (два зала с параллельными докладами) и не только про питон (хех, про Ребол - это точно интересно :). Так что, господа, устремляемся регистрироваться! :-) P.S. Хорошие новости - дальше всё войдёт в ритм раз в два [...]
В процессе работы над одним проектом я в очередной раз столкнулся с тем, что джанговский ImageField меня ну никак не устраивает - в нём отсутствует возможность ресайза при аплоаде, некак загружать картинки в разные директории1, кроме как по дате, ну и динамически назвать файлик2 тоже нельзя. В [...]
5 инструментов
Давненько я ничего не писал, хотя причины вполне объективные - всю вторую половину января я усиленно делал диплом и готовился к запуску сайта, и потому начало февраля выдалось очень продуктивным - 2 февраля таки запустился наш проект, а 6 я сдал диплом и теперь наконец-то не студент! ;-) [...]
Производительность JavaScript
Только что зашёл ради интереса на проверялку скорости от MooTools, проверился в двух браузерах - в Firefox 2 и в Conkeror’е (который суть XULRunner - тот же движок, что и Firefox 3). И вот что интересно: несмотря на относительно немалое отставание jQuery в обоих браузерах (ну, ценим мы его не [...]
Кто скушал мои мозги?
Заметил совершенно случайно, он при коннекте в топ запрыгнул: S UID PID PPID C PRI NI RSS SZ WCHAN STIME TTY TIME CMD S piranha [...]
Разметка постов
Я сейчас пишу все свои посты (и, соответственно, и вы все комментарии здесь) с использованием Markdown’а. Он достаточно прост для написания, несложен для чтения (в отличии от требующих значительно большего количества букв HTML или, OMG, bbcode ;-), но у него есть одна маленькая загвоздка - он требует постоянного переключения на [...]
Conkeror. Кошерный браузер.
Я думаю, что большое количество людей слышали, видели, а то и сами пробовали расширения для Файрфокса, которые облегчают работу с ним с клавиатуры: Hit-o-hint, Firemacs, Vimperator. Я как-то пытался пользоваться каждым из них, но у них было одно общее свойство - я ни к одному не смог привыкнуть. :) А вот [...]


OpenID refactoring
Хорошие новости - я порядочно переделал механизм работы с опенидом в блоге. Правда, сами внутренности openidconsumer почти не подверглись издевательствам, изменения прошли в основном в коде работы с пользователем. Но зато для пользователей поменялось всё порядочно. Во-первых, теперь после попытки логина с неизвестным блогу OpenID’ом теперь не покажет две непонятные формы “введите логин/пароль”, а молча [...]
Дебаг Джанги
Как проходит дебаг джанги обычно? В 90% случаев хватает внимательно изучить желтенький джанговский трейсбек ошибки, со всеми переменными и кодом, ещё в 9% хватает расставить print‘ы, а в совсем запущенных случаях приходит на помощь winpdb. Но после одной отличной новости [...]
Пользователь и его профиль
Известная штука, что у Django есть статическая (неизменяемая официально поощряемыми путями) модель User и костыль для дополнительных полей (которые может каким-либо образом использовать приложение) в виде настройки USER_PROFILE, указывающей на модельку-профиль. В результате использования такого костыля, если не делать дополнительных телодвижений, количество запросов возрастает (пример для данного блога, где каждому [...]
Сортировка почты
Настраивал себе локально чтение почты (кое-какие потоки почты забираю вместо перенаправления на гмейл, проще жить выходит :-), ну и сортировку соответственно. Так как я не слишком люблю клиенты типа Тандербёрда или Сильфид, то основным способ у меня всегда был procmail. Но его правила порядочно раздражают: читаешь доки, читаешь, проходит три [...]
Django performance: Apache vs Nginx
Неделю назад я сравнивал производительность и устойчивость работы nginx’а с Django с помощью mod_wsgi и fastcgi. Сравнение показало, что скорость работы при наличии быстрой локальной (читай - практически не оказывающей влияние) БД практически не отличается, отличается только количество используемых ресурсов. А сегодня я наконец-то собрался посмотреть, что же будет, когда база данных находится на [...]
Django performance: Apache vs Nginx
Just a week ago I have compared performance and stability of nginx working with Django through mod_wsgi and fastcgi. Comparison revealed that performance with fast local DB (i.e. time of DB work is negligibly small) is almost identical and all the difference is in used resources. Today at last I have time to [...]
С подачи lorien‘а блог обзавёлся возможностью переопределять только нужные темплейты в темах. Всего лишь добавил загрузчик темплейтов (это оказалось очень просто), да настройку THEME - теперь первым делом темплейты ищутся в themes/{{ THEME }}/, а уж потом в templates/. :-) Ещё думаю сделать добавление стилей в зависимости от этой [...]
JSON в куках
В принципе, идея лежит на поверхности: JSON - такой формат, который легко понимается и серверными языками, и джаваскриптом, и часто человеком. Потому хранить какие-то маленькие кусочки информации в виде словаря в одной куке бывает очень даже удобно. Но есть один момент, который будет неочевиден любому, кто не сильно часто сталкивается с [...]
Nginx + Django: mod_wsgi vs FastCGI
Вчера вечером таки связался с автором mod_wsgi (до этого были какие-то проблемы он говорит, что мне отвечал, но у меня даже в спамбоксе пусто было) и скомпилировал nginx с mod_wsgi (ха-ха, как много решают слеши в нашей жизни ;-). Запуск джанговского приложения под nginx’ом не вызвал абсолютно никаких проблем использовался тот же файлик django.wsgi, [...]
Nginx + Django: mod_wsgi vs FastCGI
(Translation of my previous post). Yesterday I have finally sorted out my trouble with compilation of nginx' mod_wsgi and got it working (how much means slash in our life ;-). Configuration to get Django application running is quite simple - django.wsgi, which is used for Apache’s mod_wsgi, fits perfectly. I’ll not describe [...]
Пробелы в Питоне
Нашёл отличную статью Оливера Фромме про пробелы и отступы в Питоне. Рекомендуется к прочтению, особенно противникам Питона.
Пара слов о декораторах
Всем известна одна особенность декораторов - если просто, без всяких ухищрений, написать декоратор и применить его к функции, то любые способы определить имя функции, посмотреть её документацию и т.д. окажутся бесполезными - декоратор их заменяет своими. Для примера возьмём таки начавший понемногу расходиться по проектам render_to: def render_to(tmpl): def renderer(func): [...]
Шрифтовая эпопея
В общем, после моих жалоб на качество линуксовых шрифтов я получил несколько наставлений. ;) Первый несколько помог, спасибо Паше, но оставались кривоватые места - не так много, но изредка напрягающие. И вот по ссылке из ещё одного коммента я нашёл, во-первых, неплохой блог, а во-вторых - серию [...]
Симон Виллисон дал ссылку на reinteract, интерактивный интерпретатор для питона, можно даже сказать - следующее поколение IPython. Но IPython - это консольная штука, а тут - GTK, что позволяет небольшой интерактивный редактор (к сожалению, [...]
Вчера вечером заимпортировал все более-менее значимые посты из старого вордпрессовкого блога, осталось решить непонятную траблу с flatpages (сейчас почему-то работает только about :( ), и переезд можно будет считать окончательно завершённым - поставлю со старого блога редирект на этот, по возможности чтоб не промазывать по постам.
Я сейчас не очень плотно слежу за сообщениями в django-developers, но всё же избирательно тыкаю на треды (избирательность больше зависит от автора первого поста, чем от темы ;) - и наткнулся на сегодняшний (для Австралии :-) пост Трединника о рефакторинге Так что всё отлично, он движется и там есть [...]
Недавно Макс Ищенко подал отличную идею - непонятно, почему я не додумался сам - когда едешь в машине, слушать подкасты. А так как я езжу в ней каждый день утром и вечером минимум почти по часу (сегодня, если верить магнитоле, вышло вечером 46 минут ;-), это выходит достаточно полезная [...]
Сноски и обновление пингбека
Как я и писал, я решил добавить поддержку сносок. Оказалось это совсем просто, потому что порт Markdown на Python уже имеет такой плагин. Потому все изменения свелись к тому, что кинул в каталог проекта и немножко переписал свою функцию text_to_html. Правда, пришлось немного поправить код самого [...]
Как-то неожиданно пришло желание таки доделать всю функциональность, которую задумывал для подтверждения комментариев (подтверждение происходит тогда, когда незалогиненный, но существующий пользователь - проверяется по емейлу - пытается добавить новый комментарий) - логин сразу во время подтверждения. Сначала я, в лучших традициях чукотской наивности, просто попытался добавить вызов функции залогинивания после [...]
Связанные объекты
Сегодня наконец-то отбросил свою лень в сторону и сделал то, о чём так долго твердили большевики! :) Перед всем этим текстом хочу сказать спасибо Диме Догадайло, который собственно всё это и сделал. Недавно он мне говорил, что хочет этот код выложить в опенсорс, но так как этого пока не произошло - я значит [...]
Линухсы, линухсы...
Линукс не был моим основным десктопом (точнее, вообще не появлялся на нём) в течении вот уже трёх с половиной лет (краткое появление в сентябре прошлого года не считается, он появился по работе и быстро исчез ;), но вот с пару неделек назад я подумал - ну в любом случае при использовании флюксбокса мышка [...]
Apache + mod_wsgi + Django
Меня тут попросили описать то, как я запускаю джанговские приложения в апаче. Я решил не растягивать резину в долгий ящик и просто привести свой конфиг с комментариями. :) <VirtualHost *> ServerAdmin ServerName ServerAlias # директива [...]
Кеширование ContentType в память
Сегодня обсуждали немного generic relation’ы из Джанги, и пришли к выводу, что неплохо было бы сами ContentType‘ы закешировать прямо в память - мы постоянно используем один и тот же набор из нескольких типов (модельки, которые можно тегать и ставить рейтинги), и кеш даёт гарантию того, что для них будет [...]
Ощутил в полной мере только что, чем грозят флешки. Вот казалось бы, не слишком быстро, но жить можно: [root@(none) root]$ hdparm -t /dev/discs/disc0/part1 /dev/discs/disc0/part1: Timing buffered disk reads: 26 MB in 3.05 seconds = 8.52 MB/sec Но время поиска-то какое: [root@(none) root]$ time vim -c :q real [...]
Erlang lists:filter
Последние несколько дней понемногу читаю книженцию по ерлангу (давно собирался, но начал вот только-только). Очень рад, что я знаю и пользуюсь Питоном, а не каким-нибудь Перлом или C# - намного легче воспринимается передача функции в функцию, сами высокоуровневые функции - все эти filter, map. Однако одна штука заставила меня попотеть - [...]
Иногда прикольно полазить по сайту одной из самых частоиспользуемых утилит. Обнаруживаются такие штуки, как: PuTTY tray - можно регулировать прозрачность, усылать в трей и - самое прикольное - нажимать на гиперссылки. :) WinTabber - утилитка, с помощью которой можно добавить табы практически к любому приложению. К [...]
ZFS во FreeBSD
На Opennet’е дали ссылочку на презентационный ролик по использованию ZFS во FreeBSD. Оно стоит того, чтоб посмотреть полностью (хотя там не слишком быстро всё показывается - всё же презентация). Поржал. :)
Nginx и WSGI
Сегодня наткнулся на просто невероятную вещь - mod_wsgi для nginx’а. На английском упоминаний нету вообще нигде, но не сомневаюсь, что они скоро появятся. :) UPD. Он, конечно, совсем новый и ещё не юзабельный для продакшена, [...]
Всё, перевёл все свои виртуалхосты, использующие питон, на mod_wsgi, который куда лучше и проще настраивается, чем mod_python. Кроме того, он позволяет запускать процессы в таком себе daemon-режиме, благодаря чему теперь мой меркуриал запущен из-под моего юзера - а это значит, что репозитории, которые в нём [...]
Статическая типизация
Static typing guarantees that you’re using consistent types throughout your program. It does not guarantee that this consistent code isn’t doing something entirely braindead. Из reddit’а
В результате 20-минутной возни с кодом по заявкам телезрителей был сделан предпросмотр - отдельной кнопкой в форме комментирования, аяксом.
Написание и отображение постов
Сегодня прикрутил последнюю, похоже, часть в цепочке от написания поста до его отображения - highlight.js. И теперь пост проходит markdown, typogrify и уже в браузере код расцвечивается хайлайтом. :) Правда, сначала [...]
Импорт из WP
При всех плюсах настоящих пользователей у них есть один огромный минус - что-то я никак не придумаю, как из вордпресса импортировать комментарии. :( Они ведь там не имеют реальных пользователей, а здесь мне - придётся создавать… И если человек придёт второй раз комментировать? Или послать всем письма на предмет активации? Но [...]
def mySqrt(x): return x*x
Ну они там и курят, мозги в трубочку сворачиваются. :D
Django's ORM
Наткнулся тут (спасибо реддиту) на блог замечательного учаснега Адама Гомаа, последний пост которого вещает о том, что Джанговский ОРМ - мертвяк и припарки не помогут, потому он решил писать свой собственный декларативный слой над SQLAlchemy (потому как текущие [...]
Nine Inch Nails
Всё-таки Трент Резнор - не самый ординарный человек. Почитал и снова убедился. :)
lighttpd angel
Похоже, лайти наконец-то научился (хоть пока только в транке, но всё же) делать нормально graceful перезагрузку. Теперь его можно будет использовать и не напрягаться чрезмерно по поводу его рестартов и падений. :)
Апгрейд пингбека
Мне вот подсказали, как сделать лучше выдирание контента из пингующей странички, и решение действительно настолько удобное и правильно, что я не понимаю - как я сам не додумался? ;) Поэтому опять - проверка на работоспособность. :)
Pingback server
Фух, наконец-то сделал я его. Если говорить откровенно, самая плохая часть в нём - выдирание контента. Я б не против её переделать (а то там бьютифулсуп неоднократно парсит :( ), но сейчас я уже не в состоянии, хочу просто проверить, что оно вообще работает. Не то, чтоб много сомнений [...]
Pingback client
Ну, вот вроде и внедрил клиента pingback’а себе в блог. Реализацию, естественно, спёр из Cicero. :) Вот сейчас попробую послать его сам себе. Правда, там (в Cicero) он был жестко привязан к модели данных, а я немного его подточил, чтоб он был конфигурируемым (и можно было его вешать [...]
Одна из немногих групп, которые растут с каждым альбомом, ИМХО. Как началось в ‘92 всё с Money, так до этого момента музыка как минимум не падала в качестве, а так и поднималась. Огромной художественной ценности, в силу отсутствия каких-то сложных запилов или выкрутасов, я не вижу (а, впрочем, большинство слушаемой мною [...]
Django queryset refactoring
Адриан сегодня написал в рассылку, что хочет ускорить проведение рефакторинга QuerySet’a! Так что есть надежда, что в джанговом ORM’е скоро появится group by и прочие вкусные штуки. :)
Вечер, естественно, таким продуктивным, как два целых выходных, быть не мог, но всё же немножко добавилось - во-первых, толковое отображение того, где просматривающий сейчас находится (архив он смотрит или отфильтровал по тагу), и, во-вторых, фиды по тагу. Теперь есть 4 вида фидов (вообще 3, но, я думаю, их корректно будет разделить [...]
Добавил в меню сверху ссылочку, чтобы было понятно, куда идти в случае жажды увидеть исходный код и когда я его закоммитил. И вообще куда можно написать баг-репорт или пожелание (я таки понемногу начинаю надеяться, что не только я буду использовать эту штуку :)).
Хе-хе, вчера написал вечером про то, что комментарии можно редактировать, изменения в репозиторий закоммитил, а обновить блог - забыл. :) Теперь всё на месте и работает. Только, правда, оно как-то не слишком быстро меняет на текстареа и обратно. Это похоже потому, что текстовое поле создаётся (и убирается) после AJAX-запроса… Не [...]
Редактирование комментариев
Отлично, к концу дня стало возможным редактирование комментариев. Итого из возможностей нормального блога сейчас не хватает только pingback’ов. Если меня случайно не пробьёт в какой-то из вечеров заняться, то придётся ждать пару недель до реализации… потому что на следующих двух обоймах выходных свободного времени не намечается совершенно. Но на самом деле и [...]
JavaScript - это такая злая и непонятная мне штука, и только jQuery помогает мне его побороть. Без этого фреймворка я бы просто забил бы, наверное, на все аяксовые и джавоскриптовые примочки, потому что мне самому дзен такой дряни не даётся [...]
Поддержка OpenID
Что-то меня прям пробило на код. :-) 4 месяца ничего не трогал, а за последние два дня прям сделал выше всяких норм. :-) В общем, OpenID работает. Причём он привязан к собственной джанговой системе аутентификации. При логине с новым опенидом предлагается либо создать нового пользователя, либо привязать этот опенид к существующему [...]
Совсем забыл написать - естественно, в комментариях можно использовать маркдаун. :)
Когда я впервые употребил при Поле (мой CTO) слово “тег”, он меня поправил и сказал “таг”. Но я всё никак не могу привыкнуть и начать его произносить. :-( Однако ж написать его намного проще - больше времени на контролирование себя (ну и плюс бекспейс спасает :-)). Это я к тому, что [...]
Светлое будущее
Пятница вечер и суббота утро - отличная вещь. Именно она мне позволила сделать иерархические комментарии и фиды ко всему, чему надо. На очереди OpenID и теги! :)
Что-то забросил я этот блог. За последние два дня таки взялся и проапдейтил софт: теперь всё работает под последним транком Django (и последним же pytils ;), поубирал разные нестыковки в коде, причесал его (всё же за последние четыре месяца мой взгляд на то, как и что должно быть сделано, [...]
Сложность языка
Чем дальше, тем больше я сталкиваюсь с английским (а понемногу и с другими иностранными) языком. И вот у этого самого английского есть одна очень заметная штука - он заметно проще русского (ну с чем я ещё могу сравнивать? ;)). Рассуждать можно много, об исключениях (которые в английском - правило :)), [...]
Emacs tabbar
Какое-то время назад я писал про то, как я переключаю буферы в Emacs’е. Но в конце-концов меня задолбало отсутствие табов и я решил поставить и разобраться в таббаре (я его раньше ставил, но он раздражал своим внешним видом и странным поведением :)). Самая неочевидная штука заключается в том, что брать [...]
Django newforms
Сама по себе Джанга замечательна именно тем, что многие, очень многие вещи в ней делать намного проще, чем где-либо ещё. То есть практически любой компонент сделан так, что использовать его невероятно удобно. Но вот обработка форм (в Джанге ею занимались так называемые манипуляторы) была… не слишком удобная для меня лично. [...]
Попробовал в очередной раз (уже 7.0). В очередной же раз убедился в совершеннейшей неюзабельности сего продукта для нормального человека. Глобальные хоткеи - отсутствуют, а посторонние программы глючат и работают бестолково в большинстве случаев. Интерфейс достаточно тяжёлый, чтоб тормозить на неплохих компах. Масстаггера нету, переименовывальщика - тоже. Мне вот интересно - есть [...]
Korn - UNplugged
В большинстве случаев я слушаю вообще довольно тяжёлую музыку (преобладающее направление - industrial metal/rock, но походу даже до death-metal и metalcore’а дохожу), и среди неё обретается в том числе и Korn ( - особенно после выхода последнего альбома, See You on the Other Side (они значительно уклонились с музыкой [...]
Bugattis flooded European racetracks for almost two decades, winning more races than any other marque. But in those instances when Bugatti went head-to-head with Alfa, Bugatti usually lost. The P2 quickly dominated racing and continued to be competitive over a period of six years. The Type 35 Bugatti also dates [...]
Django render_to_response
Есть в Django одна очень часто используемая мной функция - шорткат render_to_response. По сути, её параметрами является имя темплейта и словарь передаваемых в него переменных. И вот переменные можно передать двумя путями. Либо явно указать его здесь в словаре, либо заставив рендерер использовать в качестве обработчика контекста класс django.template.RequestContext и [...]
Когда ты видишь дерево, о которое сейчас ударишься, - это называется недостаточная поворачиваемость. А вот когда только слышишь и чувствуешь - это избыточная. ;)


Замечательная программа для записи того, что происходит в консоли. Заодно генерит потом HTML, чтобы можно было удобно посмотреть/показать. 5 баллов. ;) P.S. Ей бы еще английский вариант описания…
The Pirate Bay
…кросавчеги. ;) Я этого раньше как-то не видел. P.S. Кому будет напряжно прочесть весь текст, читать со слов “instead of simply”. ;)
И еще про грамотность
Отсюда Skive: Хотя, может быть, безграмотность это как расстегнутая ширинка, указывать на нее во всеуслышание тоже вроде хамства, нужно намеками или с глазу на глаз, тогда я не прав выше. Но я с трудом представляю себе ситуацию, когда обладатель этой ширинки в ответ на намек еще и достанет оттуда свое [...]
Истории о Ходже Насреддине
Однажды, когда Ходжа Hасреддин был муллой, люди попросили у него помолиться, чтобы Аллах послал дождь для хорошого урожая. Ходжа исправно молился, но дождя все не было. Hаконец, люди стали говорить, что молитвы нового муллы не доходят до Аллаха. Мои молитвы прекрасно доходят, - не выдержал как-то раз мулла Hасреддин, - [...]
Учение - свет (с)
Читаю и рыдаю. ;) From: Odhiambo Washington Subject: Re: [vexim] Unknown User To: vexim mailing list * On 02/11/06 09:36 +0000, Adam Sweet wrote: | Alexander Solovyov wrote: | > Ave, Mark Tinka. | > According to your message: | > | >> I've tried working with the 'local_part_suffix = +* : -*' and | >> 'local_part_suffix_optional' Exim directives, with [...]
Последнее время всё чаще замечаю, что чем безграмотнее человек - тем он бестолковее программирует, проектирует, пишет конфиги… Тем более дурацкие вопросы задаёт, тем сложнее после него разобраться, где что как и почему, и т.д. Именно когда безграмотен, а никагда пытаецо кагто отжыгать, типотаво.
Установка django
Попросили написать о том, как поставить django в WinXP. В принципе, достаточно простая вещь. Поставить Python 2.4 (хотя, теперь уже наверное можно и 2.5 ставить? ;) Скачать либо последний релиз, либо svn Django. Реально есть два варианта действий. Попроще: install Как-то… приятней? ;) Просто скопировать поддиректорию django (оно выглядит часто [...]
UPD: Вряд ли кто сюда доберётся, но если что - конфиг мой лежит на гитхабе. Ясное дело, любой человек, который достаточно плотно общается с компами - ищет себе подходящий редактор. Но если у большинства людей эта проблема не стоит достаточно остро, у программистов вообще IDE обычно есть, то для никсового [...]
Несмотря на то, что большинство знакомых моих пользуются tcsh или bash, есть люди - и я среди них ;) - которые просто знают, что zsh лучше. ;) Даже если не упоминать пресловутое автодополнение (его вроде в bash’е в третьей версии кардинально улучшили?) - есть куча вещей, которые существенно облегчают жизнь. К примеру, есть такая [...]
Web servers
Н-да… Однако nginx и lighttpd - нельзя сравнить. Конечно, у lighttpd есть поддержка cgi (что, в принципе, очень удобно и хорошо), однако во всём остальном (особенно учитывая, что у nginx’а наконец появился параметр weight для бэкендов) - nginx на голову выше. По [...]
Переключатель раскладки клавиатуры
Обычно все для этого используют две различных комбинации - Alt+Shift или Ctrl+Shift. Я же, спасибо Линуху, уже года три использую в этом качестве кнопку Caps Lock. Плюсов куча - во-первых, это всего одна кнопка, а не комбинация. Во-вторых, её никогда не нажмёшь случайно - как бывает, нажимается Ctrl+Shift, если хотел использовать какую-то [...]
Text Editors
Выбор текстового редактора - это однозначно очень напряжная штука. Помню, когда-то давно, окончилось это где-то на первом курсе - я использовал Aditor, и был вполне доволен. Но как раз и отказался от него потому, что как раз начал в консольке рыться - на вииях, и начал использовать vim. Угу, некоторое время [...]
Оптимизация в питоне
Есть тут у нас на сервере скрипт, который занимается относительно простым с виду делом - выводит в том формате, котором нам хочется, файлики в определённом каталоге. Ну чтоб качать их можно было. Написан был мной и Саней еще в марте, просто чтобы иметь возможность гибко управлять выводом - никакие [...]
Lets go
Первый пост в этот блог. Это уже вроде третий блог, не считая жж-шного, но два предыдущих как-то не прижились… Ну посмотрим на этот. UPD от 11.10.2007: импортировано в четвёртый блог, в первый раз запущенный 4-го апреля 2007 года. ;) UPD от 07.03.2010: пятая инкарнация. :-) UPD от 10.01.2013: шестая, раз в три года прямо.