Emacs. Каждый день что-нибудь новое

Сегодняшние герои - projectile и комбинация C-h.

Часто, начиная поиск в projectile при помощи C-c p f мне приходилось натыкаться
на кучу хлама из каталогов tmp, log, не говоря уже про содержимое каталога
контроля версий. Брр. Но чтение документации, даже изредка, приносит свои плоды.
А именно, открываем файл $PROJECT_ROOT/.projectile, добавляем

+/app
+/lib
+/spec
-/log
-/tmp
-/.hg
-.*

и ищем нужные файлы быстро и без головной боли.

Второе. Комбинация C-h сама по себе вызывает подсказку. Разнообразную, какую только
можно себе представить. Но, предположим, нам нужна подсказка по горячим клавишам
projectile или perspective. Лезть в документацию, выходя из Emacs? Нееет, можно
обойтись и без этого.

Например. Стандартный префикс команд в projectile - C-c p. Добавляем к нему C-h и - оп!
Получаем полный список команд projectile, вызываемых с клавиатуры.

Но моё удовольствие и удивление были бы неполными, если бы точно так же, нажав C-x x C-h
я бы не получил списка команд perspective. И в yasnippet та же история: C-c & C-h.

Почему emacs?

Не помню, какой по счёту год пользования emacs, полет нормальный.

В какой-то момент, довольно протяженный во времени, уходил на sublime,
привлеченный магией, которую давал поиск по C-p - действительно,
потрясающая штуковина, которая в emacs до сих пор не реализована (или просто
я об этом не слышал).

Чем на данный момент emacs привлекает меня больше, чем sublime?

  • Melpa - да, пакетный менеджер есть и в sublime, но когда я узнал,
    что он есть в emacs, это сильно сместило баланс
    (до этого приходилось каждый пакет скачивать и размещать ручками)
  • Projectile (поиск файла в проекте, в т.ч. fuzzy)
  • Perspective (больше не нужно держать открытыми несколько emacs-ов одновременно)
  • imenu - поиск метода в текущем файле,
    отвратительно ведёт себя в javascript, но хорош в coffeescript и ruby
  • Работа с системами контроля версий. Не всегда прямая и приятная,
    но в sublime она тоже не идеальна
  • Отсутствие напоминашек. Да, мне жалко 60 баксов на sublime.

Кто ты такой

Кто ты такой, чтобы указывать мне, учить меня, исследовать меня, игнорировать меня?
Кто я такой, я сам, чтобы задавать вопросы и беспокоить кого бы то ни было?
Кто мы, кем мы будем, когда смысл вопросов перестанет быть смыслом?

В чём печаль? В том, что время, отпущенное нам, конечно.
Чему же тогда радоваться?

Радоваться стоит тому, что отпущенное нам время закончилось не вчера.
Оно закончилось не пять минут назад, не только что.
И это, само по себе, уже кое-что.

Почему bluepill не мониторит мою задачу?

Случается страшное неприятное: падает процесс, поддерживающий работоспособность
вашего приложения и перестаёт ходить почта, обновляться данные и много чего ещё.
Узнаёте вы об этом из вопросов ваших пользователей, большая часть которых сводится
к фразе “почему, собственно?” Это если опустить все остальные, нецензурные слова.

Но, думаете вы себе, я же всё настроил, сказал bluepill, что вот мои процессы,
запускай их так-то и если процесс умер, запускай его снова? Возможно, что так
оно и есть, но процесс падает и не перезапускается. Так тоже бывает.

Читать полностью

Минутка ненависти

Внезапно обнаружил, что точка входа в ruby-объект может находиться в жо не совсем
подходящем месте, а именно, в private секции:

class PrivateMethodMissing
private

def method_missing(sym, *args)
puts "Hello, it's me, #{sym}!"
end
end

PrivateMethodMissing.new.bar

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

Линки и открытия прошлой недели

ActiveAdmin 0.5.0

Обновление, которое пока что можно игнорировать.
Если, конечно, вас не забрасывает письмами cron.

Парочка волшебных слов, связанных с этой темой: table_for
и selectable_column.

table_for помогает оформить таблицу, которую придётся рендерить там, где раньше использовался класс Dashboard,
а selectable_column используется, если нужно добавить в index колонку, по которой можно будет выбрать
несколько элементов для последующего, например, удаления.

jQuery 1.8.1 и Backbone 0.9.2

Внезапный выход gem-а, содержащего jQuery 1.8.1 доставил мне минут десять неприятных ощущений, а-ля “я всё сломал!”

Что характерно, jQuery 1.8.1 и Backbone работают отлично, если брать 0.9.2 из репозитария. Но версия в соответствующем
gem-е заметно отличается от содержимого репозитария. Как результат – события вьюхи банально не вызывали обработчики.
Учитывая, что репозитарий rails-backbone не обновлялся с апреля 2012 года, выход видится только один – зажать версию
jquery-rails на 2.1.1 и читать новости – вот выйдет версия Backbone 0.9.3, например, сделают для него отдельную
версию gem-а и всё заработает ;)

cdnjs и jsfiddle

Про cdnjs я действительно узнал совсем недавно.
Возможность в любой момент вытянуть жаваскриптовую библиотеку из одного места,
не залезая в Google может пригодиться. Особенно если просядет Google :)

JsFiddle, скорее, наоборот - огорчил. Не знаю, был это глюк или реально заложенное ограничение,
но в результат попадали только две жаваскриптовые библиотеки из назначенных.

ActiveAdmin 0.5 и почему меня должна волновать новая версия

Всё портится, даже в том случае, если что-то становится лучше.
Вот, например, ActiveAdmin - удобная штука для тех, кому лень писать собственную админку.
И правильно, не царское для разработчиков это дело.
Но иногда приходится.
И вот вдруг, когда dashboard в админке давно написан и забыт,
приходит обновление,
которое, в частности, гнусно намекает, что в следующем обновлении dashboard
вообще будут исключены и приложение, что? – правильно, запускаться не будет вообще.

Читать полностью

Caller & Pry

Когда у меня отказывают мозги, я берусь за отладчик.
Если бы не необходимость писать код, я бы из него не вылезал вообще.
И отсутствие толкового отладчика в Ruby меня до сих пор очень расстраивает.

Читать полностью

Папа, настрой nginx

Есть задача, даже две. Первая - разобраться с настройкой nginx для отдачи rails-статики
и балансировки двух (трёх, сколько нужно), mongrel-ов. Вторая - всё то же самое, но без mongrel,
а с использованием passenger и, главное, через capistrano.

Читать полностью