суббота, 10 октября 2015 г.

Делать быстро или качественно?

Постоянно возникают споры на эту тему как делать проект: качественно продумывая или быстро лишь бы работало?

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

Сложившийся бизнес.
Делаем быстро или качественно?
Качественно и точка! У нас серьёзный бизнес!

Но на мой взгляд всё не так очевидно. И главной проблемой является отсутствие чётких понятий что значит качественно и как это - быстро. Нормальных метрик в разработке софта нет в принципе, поэтому всё очень зависит от личного опыта/квалификации/мнения/настроения людей.

В этой записи моё мнение.

воскресенье, 20 сентября 2015 г.

Проверка баланса у провайдера и оповещение о снижении

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

Масштаб проблемы таков, что терпеть невозможно (внезапные отключения в самый неподходящий момент - обычное дело) и надо это автоматизировать. Так появился скрипт проверяющий баланса и оповещающий о необходимости оплаты когда тот приближается к 0.

Быть может кто-то из ЛПР любимого провайдера прочитает эту запись и таки реализует сию необходимую и безумно простую функцию. А пока мой костыль.


среда, 10 июня 2015 г.

rbenv, openSUSE 64-bit, фикс проблемы с nokogiri (libxml not found)

Столкнулся с проблемой при установке рубигемов в rbenv на openSUSE 13.2 64-bit. Сборка nokogiri падает с руганью 'libxml not found'  хотя libxml и libxml-devel пакеты установлены. Решение было найдено тут https://groups.google.com/forum/#!topic/nokogiri-talk/dbKKKv3PLDo.
Если коротко: баг с путями к либам на 64-битах.
CONFIG_SITE=''
gem install nokogiri -v '1.6.6.2' # указать крайнюю версию на момент
После чего выйти из этой консоли и запустить новую (быстрый способ восстановить значение переменной CONFIG_SITE) и bundle install проходит успешно.



четверг, 4 июня 2015 г.

zsh: поиск по первым символам стрелками вверх/вниз

Постоянно забываю как включается эта жизненно важная функция. 
Вот теперь чтобы не забыть повторяю сюда.
autoload up-line-or-beginning-search
autoload down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey "^[[A" up-line-or-beginning-search
bindkey "^[[B" down-line-or-beginning-search
Всё это в /etc/zshrc или ~/.zshrc. 

воскресенье, 24 мая 2015 г.

Работа с образами дисков в GNU/Linux

В этой статье описываются основные принципы в работе с образами жестких дисков и CD/DVD. Первоначально статья была написана очень давно для Wiki Калиниградской группы пользователей Linux, но так часто выручала меня, что решил перенести и сюда. Со временем, вероятно, будет дополнена материалом по работе с образами в контексте одноплатных компьютеров типа Raspberry PI.

Создать образ CD/DVD очень просто:
dd if=/dev/sr0 of=/path/to/image.iso
/dev/sr0 - имя привода;
/path/to/image.iso - путь, куда сохранить образ диска с именем image.iso;
Таким образом всё содержимое диска скопируется один-в-один со всеми данными и файловой системой. Теперь вероятно вам понадобится смонтировать этот образ локально и работать с ним как со смонтированным диском:
mount -o loop /path/to/image.iso /path/to/mount
/path/to/mount - каталог, куда нужно смонтировать образ;

В случае с образами жестких дисков всё несколько сложнее.

среда, 22 апреля 2015 г.

Server Sent Events в Ruby on Rails. Прохождение

В Rails начиная в 4 версии есть поддержка так называемого Live Streaming, позволяющего реализовать Server-Sent Events. По сути своей это костыль, позволяющий держать TCP-соединение открытым не завершая HTTP-транзакцию так что сервер всегда может инициировать отправку данных клиенту по установленному клиентом соединению. Инициируется соединение клиентом как HTTP-запрос, но в ответ сервер отправляет порцию хедеров с Content-Type: text/event-stream и не закрывает соединение. Такой простой механизм лежит в основе Server-Sent Events.
В сети есть несколько тьюториалов по использовании этого в RoR приложении, но они весьма простые и не затрагивают некоторые важные подводные камни, с которыми я столкнулся при написании feature branches build server - приложения подобного continuous integration, но с особенностью не важной для данной записи. О неудобствах, подводных камнях и моём их решении ниже.

пятница, 27 февраля 2015 г.

Ruby attr_accessor: добавляем callback на изменение аттрибута

Оказывается, в Ruby очень просто сделать так чтобы при изменении аттрибута вызывался произвольный code block.

Сначала определить новый  attr_accessor с такой фичей:
class Class
  def attr_accessor_with_onchange_callback(*args, &block)
    raise 'Callback block is required' unless block
    args.each do |arg|
      attr_name = arg.to_s
      define_method(attr_name) do
         self.instance_variable_get("@#{attr_name}")
      end
      define_method("#{attr_name}=") do |argument|
        if argument != self.instance_variable_get("@#{attr_name}")
          self.instance_variable_set("@#{attr_name}", argument)
          self.instance_exec(attr_name, argument, &block)
        end
      end   
    end
  end
end

Использование:
class MyClass
  attr_accessor_with_onchange_callback :my_var do |attr_name, value|
    puts "#{attr_name} changed value to #{value}"
  end
end
Теперь при всяком изменении my_var будет вызываться блок:
m = MyClass.new
m.my_var = 1
m.my_var = 100500

=> my_var changed value to 1
=> my_var changed value to 100500

воскресенье, 17 августа 2014 г.

Теория Решения Изобретательских Задач и Законы Развития Технических Систем

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