Посты

  • 4 способа создать синглтон в Ruby

    Как создать синглтон в Ruby? Лично мне приходят на ум 4 способа.

    Примечание: это почти полный копипаст моего поста на Хабре

  • Postgresql, неравенство и NULL

    Intro

    Постоянно забываю о том, что неравенство в Postgresql при сравнении с NULL ведет себя не совсем очевидным (на мой взгляд) образом.

  • Как добавить свой сервис в systemd

    Intro

    На моей Raspberry Pi играет MPD и так же там поднято 3 самописных сервера: HTTP API на Go для него, приложение на React.js, использующее это API и Telegram бот.

    При перезагрузке все это, разумеется, падает и нужно запускать все заново. Тут-то и приходит на помощь systemd.

  • Как закоммитить часть файла

    Intro

    Допустим есть код:

    def f(x)
      x * x
    end
    
    puts f(19)
    

    А теперь мы хотим узнать, чему будет равна сумма квадратов 19, а заодно провести небольшой рефакторинг:

    def square(x)
      x * x
    end
    
    def sum_of_squares(x)
      2 * square(x)
    end
    
    puts sqr(19)
    puts sum_of_squares(19)
    

    Рефакторинг и новая функция - разные задачи и хотелось бы их закоммитить по отдельности. Как?

  • Типы методов в Ruby: private vs protected

    Intro

    В Ruby очень вычурно используется модификатор protected. Лично я считаю бесполезной практикой его использование, но, знать, как он работает, может быть полезно (на собеседовании, например).

    Кстати, private тоже имеет кое-какую особенность;)

  • Используем Proc как хеш

    Intro

    Полгода назад придумал “хак” и сегодня воспользовался им вновь.

    Что такое хеш? В ruby Hash - это структура данных, которая позволяет хранить пары ключ-значение. Но что, если мы хотим, чтобы ключ “совпадал” по нескольким условиям? В моем случае, это попадание в диапазон значений (в т.ч. дробных).

  • tap, возвращающий результат блока

    Intro

    В Ruby есть такой замечательный метод, как #tap, который передает сам объект в качестве аргумента в блок и возвращает сам объект.

    x = 1
    y = 2.tap { |two| x += two }
    [x, y] # [3, 2]
    

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

  • mpd зависает при смене песни на Raspberry Pi

    Проблема

    Накатил на Raspberry Pi 3B плеер-демон mpd, но при смене песен периодически демон зависал и помогала только команда

    sudo systemctl restart mpd
    

    Решение

    Изначально я грешил на NFS (на котором хранилась музыка), но оказалось, что проблема каким-то образом связана с alsa.

    В общем, достаточно было в конфиге указать типом миксера “software”:

    audio_output {
      type        "alsa"
      name        "bcm2835 ALSA"
      device      "hw:0,0"
      mixer_type  "software"
    }
    

    Увидел этот прием случайно в этой статье.

  • ruby -run

    Intro

    Относительно недавно искал способ в одну строчку запустить веб-сервер в текущей директории.

    На просторах Stack Overflow нашел примерно такую команду:

    ruby -run -e httpd -- -p 9090 [DIR]
    

    Что же это за загадочная опция -run и почему ее нет в мануале?

  • Парсинг опций в Ruby

    Intro

    Пару месяцев назад узнал, что в стандартной библиотеке Ruby есть класс OptionParser, позволяющий обрабатывать ARGV на предмет всяких флажков. Решил сделать заметку, чтобы не забыть.

  • Однострочники на Ruby

    Предисловие

    Ruby очень многие вещи позаимствовал из Perl. В том числе ключ интерпретатора, позволяющий выполнить кусок кода “сразу”. Например: ruby -e 'puts "Hello, World"'. Думаю, понятно, что за такое поведение отвечает ключ -e (execute, стоит полагать).

  • Два брата: proc и lambda

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

    Собственно, для простоты можно сказать, что Proc, создаваемый с помощью метода proc, является объектным представлением блока, а, создаваемый с помощью lambda или его сахара ->() - чем-то более приближенным к объектному представлению метода (но не стоит путать с Method).

    Но в чем же действительно разница?

  • Неявное приведение в Ruby

    Существуют “пары” методов:

    • #to_i + #to_int
    • #to_s + #to_str
    • #to_a + #to_ary
    • etc.

    Только сегодня узнал разницу между ними. В книге “The Ruby Programming Language” более “длинные” версии методов называются “implicit conversion methods”. И реализованы они, как выяснилось, не у всех классов (раньше я думал, что это просто ненужные алиасы для тех, кто пришел из других языков).

  • Вызов изначальной версии метода при переопределении

    Проблема

    Допустим, есть класс:

    class Person
    def do_stuff
    some_stuff
    another_stuff
    and_another_stuff
    end
    end

    И мы не имеем прямого доступа к его коду, потому что он находится в геме.

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

  • Применение git-flow + Semantic Versioning при разработке гемов

    Зачем?

    При разработке гемов по git-flow я столкнулся с некоторыми проблемами при версионировании. Rubygems.org не позволит вам запушить два гема с одинаковой версией (что логично), поэтому использование 0.1.0-dev для нестабильных релизов является неприемлимым (точнее, приемлимым, но только если публикация нестабильной версии происходит только один раз между релизами).

Atom-фид