LE Blog

Инженер с поэтической душой

19.06.2010 firtree_right Деплой

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

В связи с чем попробовал отечественный продукт: хостинг locum.ru. Не знаю, правда, как он под нагрузкой, но первые впечатления от настройки приятные. С тех пор, как я пользуюсь capistrano, залить что-то на хостинг — легко и быстро. Самое трудное, обычно — это первый деплой. Тут как раз всё прошло быстро и не меняя привычек. Недостаток инструкций, конечно, имеется, но не страшный.

Я бы даже написал им инструкцию, как залить свой проект на Ruby on Rails на их хостинг, но я всё время стесняюсь, что не умею пользоваться ssh-agent. Может кто-то научит меня пользоваться ssh-agent, чтобы мне не добавлять дополнительный deploy-ключ в список пользователей репозитория?

28.05.2010 firtree_right Dog's dream

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

♯♯♯

А ещё мне не хотелось поднимать свой почтовый сервер, и я узнал, что существует Яндекс почта для домена. Это гениально!

♯♯♯

Сегодня в комментариях (а мне нечасто в блоге пишут комментарии) некто Дмитрий подкинул мне прекрасную идею про «счастливый коммит». Это коммит, у хэша которого сумма левых 20-ти шестнадцатиричных цифр равна сумме правых 20-ти. Конечно же я тоже написал скрипт (конечно же на руби), который проверяет каждый коммит. И коммичу теперь почаще:

#!/usr/bin/env ruby
if `git log -1 --format=format:%H`.chars.each_slice(20).map{ |part| part.inject(0){ |sum, ch| sum + ch.hex } }.uniq.count == 1
puts '**************************************'
puts '*   Congratulations! Lucky commit!   *'
puts '**************************************'
end

♯♯♯

Наконец-то добрался и посмотрел последнюю серию:

via kuteev

Обтекаемо закончили :) Не то, что старик Линч.

27.04.2010 firtree_right Новьё

Новый постик в бложек лежит в черновиках. Не публикую ничего в начале и в конце недели. От Яндекса научился, хоть моя аудитория и поменьше :) На прошлой неделе не успел ничего написать из-за РИФа. Был там один день, но как докладчик, поэтому выпала первая половина недели, а не вторая.

Очень понравилась в последнее время концепция «достижений» (achievments) в играх и всём подряд. Например, Mass Effect 2 я проходил три раза, чтобы не только спасти всех компаньонов в самоубийственной миссии (no one left behind), но и сохранить их лояльность. А Portal начал проходить ещё раз, чтобы получить достижение «transmission received». Так же отлично это работает и в социальных сервисах. Например, в foursquare уже довольно подробно размечена вся Москва, потому что за внесение и посещение мест на карте дают очки, звания и знаки отличия. Например, сегодня я стал мэром «Улицы ОГИ». Павел «Ксан» Яковлев заявил, что социальным сетям типа Фейсбука или МоегоКруга следует создать для владельцев профилей Компаний систему достижений для их работников. Тогда работники компаний будут вполне себе мотивированно добиваться этих достижений, чтобы их было видно в профиле.

Ещё, с тех пор, как я приобрёл новый телефон мечты (HTC Desire), всё чаще мне попадаются упоминания и примеры Augmented Reality. Например, Google Goggles — пока мне не удалось получить от них много удививших меня результатов. Но он хорошо определяет продукты по баркодам. Если сфотографировать логотип Яндекс, то будут ссылки на википедию про Интернет и Историю Интернета, А если логотип Гугла, то ссылки будут на Гугл :). Однако второй пример поразил воображение не смотря на простоту. Карта звёздного неба от Гугла. Смотришь на небо через телефон, и все созвездия, звёзды и планеты подписаны. Это зашибись просто! Всего то нужно определить местоположение (по GPS или триангуляцией) и время с календарём. Потом акселерометр сообщает, как повернуть сферу.

А что нового у вас?

26.02.2010 firtree_right Вернулся

back from holidays

Давненько я не обновлял этот блог :)

Всё дело в том, что где-то там был Новый Год, в который я торжественно посетил родителей. До и после Нового Года была сдача панорам Санкт-Петербурга и ещё одного пока не скажу какого города.

Когда съёмки 2009 года были сданы, выяснилось, что полным ходом идёт зима. А у нас не так много городов, которые можно красиво снимать зимой. Тогда мы отправились всем составом в тёплые края, в месячный отпуск.

Теперь, когда я снова в Москве, этот блог вернётся к своему обычному режиму. Спасибо всем, кто был со мной в прошлом году. Этот год обещает быть очень интересным.

19.01.2010 firtree_right Митол

А меж тем, у нас корпоративный отдых до 1 марта, и где-то на серверах катарских авиалиний лежат наши авиабилеты до города-героя Джакарта. Цели поездки: смотреть на океанский пейзаж пока он не отпечатается на сетчатке; узнать, что такое «сезон дождей на о. Бали»; раскрасить цветными карандашами фигурку человека три раза; и кое-что ещё. Если будет настроение, буду держать в курсе.

С одной стороны понятно, что я буду делать с 1 марта (велика Рассея-Матушка, а градоглядъ пока только в Первопрестольной). С другой стороны, есть хорошая традиция — ставить цели на год. С третьей стороны, мой сектантский опыт исказил представления о целеполагании, и сейчас я черпаю наслаждение в отсутствии «долгосрочных планов на похвастался друзьям» Поэтому цель на ближайщие месяцы одна, но двойная: сделать на сайте портфоливо, и выделить рабочее время на сторонние занятия, в том числе и на флэш (начать с того, чтобы собрать игрулю с Петровым).

А на самом деле, писал я всё это для того, чтобы выложить видео (не могу же я просто взять и тупо перепостить этот баян!). Когда я учился в школе, некоторые из моих одноклассников увлекались тяжелейшей музыкой типа Пантеры и КэнибалКорпс. Я пытался в это вникнуть, но тяжелее Сепультуры слушать ничего не смог и остановлися на комфортной Металлике. Однако, бывает и весьма душевный тяжеляк (после первого просмотра прослушал ещё два раза — не мог оторваться).

10.09.2009 firtree_right Создание init-скриптов с помощью руби

Предисловие

Сегодня у меня кроме всего прочего появился повод похвастаться! :) Когда вы смотрите широко обсуждаемые Яндекс-Панорамы, знайте, что их производством в составе моей любимой компании neq4 занимался и я.

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

Так же я, безусловно, планирую раскрывать некоторые секреты. Кстати, практически все записи в этом блоге основаны на работе над этим проектом. Например, программа, которая управляет камерами во время движения, а так же получает данные от приборов, была так же написана мной. И теперь вы знаете, что написана она на руби. :) За исключением библиотеки для работы с камерами, о которой я уже писал.

Это и подводит нас вплотную к теме сегодняшней записи.

Введение

Безусловно, руби — лучший из языков. Для меня выбор в его пользу обусловлен прежде всего высокой скоростью разработки. Поэтому при возникновении какой-то задачи, особенно если её нужно сделать быстро, я пробую решить её на руби. В прошлый раз я рассказал об автоподстановке. А сегодня — создание init-скриптов

Скрипты эти располагаются в папке /etc/init.d и запускаются при старте в определённых условиях. Они должны принимать параметры start, stop, restart и status. Как правило, они служат для запуска и остановки служб.

Решение

Написать программу, которая принимает текстовый ключ на входе, не составляет труда (/etc/init.d/my_script):

#!/usr/bin/env ruby

APP_NAME = "my_script"

case ARGV.first
  when "status"
    if...
      ...
      exit 0
    elsif ...
      ...
      exit 1
    else
      exit ...
    end
  when "start"
    ...
  when "stop"
    ...
  when "restart"
    ...
  else
    puts "Usage: #{APP_NAME} {start|stop|restart|status}"
end

Круто, но до настоящего init-скрипта не дотягивает. Когда система проходит свой цикл жизни от запуска до перезагрузки или выключения, она проходит через шесть стадий. Нужно указать, в каких стадиях наш скрипт следует запустить с параметром start, а когда — с параметром stop. Для этого используется спецификация LSB (Linux Standard Base). Вот так:

#!/usr/bin/env ruby
# Start/stop my daemon
#
### BEGIN INIT INFO
# Provides:          my_script
# Required-Start:    $all
# Required-Stop:     $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Initializes my daemon at boot time
# Description:       In a Galaxy far, far away...
### END INIT INFO

APP_NAME = "my_script"

case ARGV.first
.....

Теперь лежащий в /etc/init.d скрипт нужно подрегулировать и зарегистрировать:

sudo chown root:root /etc/init.d/my_script
sudo chmod 755 /etc/init.d/my_script
sudo update-rc.d my_script defaults

Таким образом, вовсе необязательно изучать bash-скрипт. Вот, кстати, оболочка-альтернатива всяким башам, использующая синтаксис руби. Для таких, как я. :)

Для самостоятельного изучения

Спецификация LSB в части запуска и остановки скриптов