Блог Червонного Максима

Блог не придерживается какой-то тематики, претерпел несколько инкарнаций (livejournal, tumblr, несколько блог-движков), обновляется нечасто.

Подробнее обо мне можно узнать на домашней страничке chervonny.ru.

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

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

x

22.08.2012

Сортировка по словарю

Сортировка по словарю в Vim

Более 10 000 человек группируют CSS-свойства по их типу. У меня начинает болеть голова, когда я только думаю о том, что большинство из них делает это вручную.

Безусловно есть инструмент CSSComb, но при всем моем уважении к Славе Олиянчуку я не доверяю софту, написанному на PHP.

В виме есть встроенная команда :sort, которая сортирует по алфавиту. Этого многим достаточно, но даже если использовать CSS Style Guide от Google, то простая сортировка не покрывает нужды, так ка нужно игнорировать префиксы.

На помощь приходит Meaning sort, который может сортировать настолько сложным образом насколько моих когнитивных способностей уже не хватает (см. pdf-файл).

Итак, для начала надо создать файл со словарем. Свой я взял из CSSComb, который в свою очередь взят из Zen Coding. На каждой строке должно быть одно CSS-правило, без кавычек и запятых. Пример такого файла — gist.github.com/3426801.

Затем в виме выделяем блок кода и вызываем команду :'<,'>!msort -w -s ~/zen-coding-sort -l -q

  • '<,'> — означает операцию над выделенной областью,
  • !msort — вызов команды из терминала,
  • -w — аргумент, означающий что сортироваться будет весь файл (в нашем случае вся выделенная область),
  • -s ~/zen-coding-sort — файл, в котором указан порядок сортировки
  • -l — аргумент, говорящий о том, что каждя новая запись, которую нужно отсортировать нахожится на новой строке,
  • -q — отсутствие вывода какой-либо информации кроме непосредственно отсортированных строк.

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

vmap <F3> :!msort -w -s ~/zen-coding-sort -l -q<cr>

26.05.2012

Github Pages

Gitolite поломался и лишил меня возможности деплоить сайты. Этот блог, powered by генератор статики cyrax, собирался по гитовому хуку на VPS, а с недавних времен на домашнем сервере.

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

Недолгий research существующих блогоплатформ (Octopress, Jekyll, Hyde) под Github Pages выявил, что лучше бложить вручную (если уж переходить на /просто/ статику, то и инструмент для нее должен быть предельно простым). Этот пост о том, как это сделать.

Необходимы три составляющие:

  1. Cyrax (например, моя пропатченная версия без вывода даты в URL)
  2. Аккаунт на Github
  3. Контент блога с темплейтами jinja2

Cyrax можно установить командной sudo pip install cyrax, либо собрать из исходников sudo python2 setup.py install.

Платный аккаунт на github.com стоит $7 в месяц, и позволяет держать "кишки" блога скрытыми. К тому же страничка на гитхабе не засоряется, ведь ее еще показывать будущему продвинутому работодателю.

Дефолтные темплейты для cyrax'а есть в комплекте с исходниками, но свои собственные написать не составляет труда при знании HTML/CSS и луркании документации по Jinja2.

Самое интересное начинается, когда надо заставить все это вместе работать.


Итак, у нас есть master, где хранятся посты и тмплейты блога. Чтобы они отобразились на GitHub Pages, надо запушить их в ветку gh-pages. Но так как в gh-pages должен попасть не сам master, а выхлоп cyrax'а, то нужно воспользоваться руководством Github:

git symbolic-ref HEAD refs/heads/gh-pages создает ветку gh-pages, которая является ссылкой на текущий master. rm .git/index удаляет всю информацию о текущем индексе, соответственно все файлы становятся untracked. git clean -fdx форсированно удаляет все untracked файлы и директории.

Таким образом, мы получаем пустую ветку, которую можно заполнять с чистого листа. Чтобы она никуда не пропала, надо в нее что-нибудь прокоммитить. Например, файл CNAME, в содержимом которого будет домен блога.

Затем надо переключиться в master, запустить cyrax и получить собранный сайт в директории _build. Переключившись обратно в ветку gh-pages, мы сможем переместить содержимое _build в корень и прокоммитить. Чтобы не делать, эту рутину каждый раз, достаточно вызвать скриптик:

#!/bin/bash

git co master
cyrax
git co gh-pages
mv _build/* .
rm -r _build
echo 'deploying complete'

После того, как ветка gh-pages запушена, сайт сразу будет выложен на GitHub Pages.

Если используется свой домен, то этот домен нужно прописать в файле CNAME, и не забыть добавить A-запись у регистратора, указывающую на IP 204.232.175.78.

14.10.2011

Менеджер паролей

Пост о том, как я пришел к методу генерации пароля password = base64(sha1(sal + salt + masterPassword))

Тот, кто однажды прочитал «Криптономикон», уже никогда не станет прежним. Роман в отличной литературной форме иллюстрирует основы криптографии и защиты приватности информации и переписки. Конечно, я вряд ли докачусь до того, что буду экранировать свой ноутбук фольгой от перехвата Ван Эйка. Но в свете недавних взломов и уязвимостей на dropbox, kernel.org, hetzner.de (там хостится мой сервер) стоит хотя бы озаботиться секьюрностью паролей.

Раньше я, как и многие, держал один пароль на все сайты. Это не был Qwerty123, или подобный. Он состоял из букв в верхнем и нижнем регистре и цифр, удобно набирался (соотношение символов с левой и правой части клавиатуры), но был один на все сайты. Если бы один сайт себя скомпрометировал, опасности подвергались аккаунты на остальных сайтах.

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

Решение подсказал cF8. Он сузил условия задачи: нужно залогиниться в твиттер с украденного айфона, чтобы сообщить о травле полицаев, и привел решение: md5 хэш на основе мастер-пароля и доменного имени.

Плюсы такого решения в независимости от реализации. MD5 шифрование имеет определенный алгоритм и кучу реализаций на разных платформах. Кроме того, при таком методе нам нужен всего один мастер-пароль. Минус решения в том, что при каждой авторизации надо снова генерировать пароль, а также иметь доступ к одной из реализаций md5 шифрования (для систем, где таковых не установлено придется использовать веб-сервис).

Это решение я немного углубил и расширил. MD5 — скомпрометированный алгоритм, лучше использовать SHA. Кроме того, надо принять во внимание, что на некоторых сайтах стоит ограничение на длину пароля и диапазон используемых символов, поэтому пароль не должен превышать 20 символов и иметь в себе буквы верхнего, нижнего регистра и цифры. Для добавления букв верхнего регистра, пропускаем полученный шифрованием хэш через base64-кодирование, а затем берем от сгенерированной последовательности первые 20 символов. На самом деле я бы посоветовал не пользоваться сайтами, где есть такие ограничения. Во-первых, это очевидное мудачество, во-вторых, это скорее всего означает, что в базе хранятся не хэши паролей, а сами пароли в открытом виде, а значит девелопер с привилегиями может залогиниться под вашей учеткой. К сожалению, среди сайтов с ограниченем на длину пароля - rutracker.org и livejournal.com.

На некоторых сайтах могут иметься несколько аккаунтов, поэтому надо добвить еще один аргумент — логин. Таким образом, для аккаунта fiskus на google.com будет браться хэш на основе слов "fiskus", "google.com" и секретного мастер-пароля. Для аккаунта juvvi на google.com — хэш на основе слов "juvvi", "google.com" и секретного мастер-пароля. В таком случае получится один пароль для одного логина, но разных протоколов (Google+, GMail, GTalk), мне кажется, что это нормально, тем более что в том же гугле нет возможности завести разные пароли для джаббера, почты и соц. сети.

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


Существует также менее технологичное, и, соответственно, более независимое решение проблемы генерации паролей, основанное на использовании словарей.

Например, есть словарь, в котором каждая буква соответствует названию животного. Берем доменное имя, и заменяем первые три буквы названиями животных. Т.е. было twitter.com, стало Tiger_Whale_Iguanas_tter. Список животных можно взять в статье «What are some animals that begin with the letters A-Z?» на Answers.com. Вместо словаря животных, можно использовать стихотворение. Так как в стихотворении может не быть слов на определенную букву, то замены в доменном имени делаем не на основе самой буквы, а ее месте в алфавите. "T" - 20-я буква, "W"- 22-я, "I" - 9-я. Соответсвенно, подставляем 20-е, 22-е и 9-е слова из стихотворения.

Помимо того, что генерация пароля таким образом займет продолжительное время (возможно, без бумажки с карандашом не обойтись), за которое гэбня успеет сцапать и революционный твит не будет отослан, при плановой смене паролей придется выучивать новый словарь животных или новое стихотворение. Возникнет путаница, соответсвует ли буква 'T' слову 'tiger', или это было в прошлом месяце, а сейчас - 'tarantula'.

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

11.10.2011

Duck Duck Go

Все новые инструменты делятся на те, у которых большой wow-эффект от использования, и те, у которых малый wow-эффект. Дальнейшее деление происходит от того, удобно ли пользоваться инструментом, когда эйфория от новизны проходит, или нет.

Например, WolframAlfa имел колоссальный wow-эффект, но как им пользоваться в повседневной жизни, я не представляю. Зачем существует nigma.ru я никогда не понимал.

Метапоисковик DuckDuckGo несмотря на отвратительное незапоминающееся название имел успех при первом приближении. Я думал, что быстро им наиграюсь. Но прошло больше года, и теперь первое, что я делаю при установке браузера - ставлю duckduckgo-ssl дефолтным поисковиком.

Базовая функция этого метапоисковика - ответ на вопрос. DuckDuckGo так же, как и традиционные поисковики выводит список найденных ссылок, но первым пунктом он выводит абзац текста, релевантный запросу.

Киллер фичей метапоисковика является !bang-синтаксис запросов.

Я уже давно не ищу информацию просто в гугле. Когда я что-то ищу, то уже примерно знаю, где найду, и рациональней сразу искать на этом сайте. Например, определения терминов следует искать на wikipedia.org, документацию по джаваскрипту на developer.mozilla.org, ответы на тривиальные технические вопросы - на stackoverflow.com, и.т.д. Пользователи оперы посмеются надо мной, но с помощью DuckDuckGo я могу искать на гугле с помощью запроса '!g кто виноват и что делать', или на википедии '!w термин', или на stackoverflow '!so как построить атомную бомбу'. В опере уже есть такой синтаксис запросов, но по дефолту он только для десятков сайтов, остальные нужно настраивать самому. А тут все готовенькое.

Банг-синтаксис покрывает все нужды как нормального (!google, !yandex, !torrent, !wiki, !wru, !images. !stackoverflow, !translate и т.д.), так и ненормального (!javascript, !xkcd, !minecraft и т.д.) пользователя поисковых систем.

Устанавливается на все браузеры (инструкция есть на домашней странице) и работает быстро, прозрачно и почти не заметно.

30.07.2011

Просмотр превьюшек с помощью Imagemagick montage

Будучи минималистом, я живу без файлового менеджера и продвинутого просмотрщика картинок типа Picasa или Shotwell. Живу вполне комфортно, потому что у меня нет необходимости просматривать горы картинок. Тем не менее, иногда приходит и такая нужда. Например, просмотреть пару сотен фоток с корпоратива, чтобы выяснить, нет ли постыдного компромата.

Но даже ради такой благой цели, не хочется ставить продвинутый просмотрщик или тем более файловый менеджер. Обходной путь был быстро найден. Команда montage, входящяя в набор Imagemagick позволяет тайлить кучу картинок в одну.

Например, montage -label %f -geometry 300x300>+1+1 -shadow -border 2 * tile.jpg создает превьюшки размером 300 на 300 с небольшими эффектами и подписью.

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