четвер, 27 грудня 2012 р.

Робота з файлами eml в Ruby

Сьогодні зіткнувся з проблемою пошуку вкладень серед багатьох файлів з розширенням eml.

Формат eml використовується багатьма клієнтами електронної пошти, включаючи Microsoft Outlook Express, Windows Mail і Mozilla Thunderbird. Це звичайний текстовий файл у форматі MIME, що містять заголовки повідомлень електронної пошти, а також вміст повідомлення та вкладення.

Відкрити його під Linux не складає труднощів, наприклад, за допомогою поштового клієнта KMail, однак таке рішення мені здалося занадто складним.

Трохи погугливши, виявилося, що бібліотека email чудово вміє розбирати такі файли.

В результаті вийшов невеликий скрипт, який вибирає всі файли з розширенням eml у поточній директорії, і відображає в консолі текстовий вміст листа, а прикріплені файли зберігає у відповідних директоріях.
require 'mail'

Dir.glob('*.eml') do |filename|
  mail = Mail.read(filename)

  puts <<EOF
  From:    #{mail.from}
  To:      #{mail.to}
  Subject: #{mail.subject}
  Date:    #{mail.date}

EOF

  charset = mail.text_part.content_type_parameters['charset']
  puts mail.text_part.body.decoded.force_encoding(charset).encode('utf-8')

  if mail.multipart?
    dir = File.basename(filename, File.extname(filename))
    Dir.mkdir(dir) if !Dir.exists?(dir)

    mail.attachments.each do |attachment|
      file = File.open(dir + '/' + attachment.filename, 'wb') { |f| f.write attachment.body.decoded }
      puts "Saving `#{attachment.filename}`"
    end
  end

  puts "===\n\n"
end

понеділок, 29 жовтня 2012 р.

Opal — реалізація Ruby на JavaScript

Opal — реалізація Ruby, написана на мові JavaScript.

Opal включає в себе компілятор (який можна запустити в будь-якому браузері), основну бібліотеку і середовища виконання. У стисненому вигляді основна бібліотека і середовище виконання займають всього-на-всього 10.8kb.

пʼятниця, 26 жовтня 2012 р.

Оголошено 'Feature Freeze' для Ruby 2.0

Точно за розкладом, основна команда Ruby оголосила про заморожування коду нових можливостей('feature freeze') майбутнього Ruby 2.0. Це означає, що з цього моменту розробники лише будуть виправляти баги, не додаючи нових фіч в дану версію.

Нижче я збираюся представити переклад статті "Things to Look Forward to in Ruby 2.0" у якій автор перерахував декілька нових можливостей Ruby 2.0.

вівторок, 23 жовтня 2012 р.

Ruby Bits.Частина 2


Для багатьох не секрет, що Ruby — це потужна мова програмування. Але чи використовуєте ви її в повній мірі?
У другій частині курсу від Code School ви зможете познайомитися з найбільш корисними можливостями метапрограмування у Ruby.

У цьому курсі ви дізнаєтеся про:
  • Використання Procs і лямбда для зберігання і виконання блоків коду
  • Різні способи для передачі блоків у методи
  • Як використовувати необов'язкові блоки
  • Динамічне визначення та виклик методів
  • Відповідь на неіснуючі методи
  • Управління контекстом, в якому виконується код

В кінці курсу, ви зможете використовувати вивчені можливості для побудови Domain Specific Languages(DSL).

>>> Перейти до курсу

Реліз JRuby 1.7.0


Спільноті JRuby рада оголосити про випуск JRuby 1.7.0, починаючи з якої заявлена офіційна підтримка Ruby 1.9.x.

Після півтора років розробки вийшов мажорний реліз відкритої багатоплатформної реалізації інтерпретатора мови програмування Ruby, написаної цілком на Java.

В JRuby 1.7  проведений величезний обсяг робіт, десятки учасників, і покращення у кожній підсистемі. І тепер за замовчуванням JRuby працює у режимі сумісності Ruby 1.9.3. Втім, не означає, що реалізація не буде більше вдосконалюватися. Це означає лише, що в майбутньому будуть вирішуватися проблеми з якими зіткнуться користувачі. На даний момент, розробники планують випускати нові версії 1.7.x кожні 2-3 тижні.

1.7 є першим стабільним JRuby з підтримкою нової можливості JVM - invokedynamic. Ви можете включити використання invokedynamic для Java 7, але вона по замовчуванню відключена, через проблему в JVM. На Java 8 , вона включений за умовчанням: http://wiki.jruby.org/PerformanceTuning.

Що нового:
  • Режим сумісності з 1.9.3 тепер використовується по замовчуванню(1.8 необхідний для підтримки 1.8.7)
  • Стандартна бібліотека оновлена до 1.9.3p286
  • Багато виправлень сумісності з 1.9.x
  • Підтримка invokedynamic
  • Численні покращення продуктивності
  • Припинена підтримка Java 5(тепер обов'язкова Java 6+).
  • Вирішені всі відомі проблеми з кодуваннями у 1.9
  • Покращення і виправлення для Java інтеграції
  • Краща підтримка для Solaris, ARM Linux.
  • Оновлення до Rubygems 1.8.24
  • Оновлення до Rake 0.9.2.2

субота, 13 жовтня 2012 р.

Ruby 1.9.3-p286

Новий реліз включає в себе виправлення кількох критичних помилок, і не містить нових можливостей.
Докладніше на офіційній сторінці.

Для Linux:
$ rvm get head

$ rvm upgrade ruby
Are you sure you wish to upgrade from ruby-1.9.3-p194 to ruby-1.9.3-p286? (Y/n):

Для Windows доступний для завантаження RubyInstaller 1.9.3-p286.

вівторок, 9 жовтня 2012 р.

Курс по Ruby на Codecademy

На навчальному порталі Codecademy з'явився курс з мови програмування Ruby.

Курс інтерактивний, інтерпретатор працює прямо в браузері. Складається з більше сотні вправ, розбитих на 5 блоків. Частина вправ кожного блоку ввідні, а частина - приклад реалізації найпростіших додатків.

Курс можна рекомендувати, тим, хто тільки починає вивчення Ruby.

Курс на англійській, але на простій і зрозумілій.


середа, 15 серпня 2012 р.

Стилізація sinatra-flash для Bootstrap

Про гем sinatra-flash, я писав у статті Flash-повідомлення і Sinatra
Задачею є створити замість стандартного styled_flash, методу-помінчника для Sinatra, який відображатиме попередження стилізовані під Bootstrap.


вівторок, 14 серпня 2012 р.

Як зробити локальий веб-сервер загальнодоступним

Сьогодні відкрив для себе чудовий сервіс, який дозволяє швидко і просто зробити локальний веб-сервер загальнодоступним в Інтернеті.

Зустрічайте ProxyLocal

Це програмне забезпечення складається з клієнтської і серверної частин. Серверна частина працює на сервері proxylocal.com, і ви можете використання його ресурси абсолютно безкоштовно. Клієнт написаний на мові Ruby і поширюється як gem, його вихідний код відкритий і доступний на GitHub.

Інсталяція

ProxyLocal - це утиліта командного рядка.

Відкрийте термінал і наберіть:
$ gem install proxylocal

Використання

Припустимо, ваш локальний веб-сервер запущений на порту 9292. Щоб зробити його загальнодоступним виконайте в терміналі:
$ proxylocal 9292
Local server on port 9292 is now publicly available via:
http://o18f.t.proxylocal.com/

Тепер ваш локальний сервер на порту 9292 доступний через:
http://o18f.t.proxylocal.com/

Також ви можете вказати бажане ім'я, яке ви хочете використовувати, наприклад:
$ proxylocal 9292 --host testhost
Local server on port 9292 is now publicly available via:
http://testhost.t.proxylocal.com/

вівторок, 3 липня 2012 р.

ВКонтакте → Авторизація додатків з Ruby і Net::HTTP

На днях виникло бажання переписати код своєї бібліотеки для для авторизації ВКонтакте і здійснення запитів до API, використовуючи тільки стандартні модулі Ruby.

Для того, щоб прикинутися справжнім браузером, просто завантажувати потрібні сторінки недостатньо. Як мінімум, потрібно коректно обробляти куки і редіректи. Для цього у попередній статі я використовував чудову бібліотеку Mechanize.

Спочатку встановимо необхідні параметри.

Детально про параметри звернення можна прочитати в документації.
client_id - ідентифікатор вашого додатку.
Тут слід зазначити, що ми будемо використовувати параметр display із значенням wap, так в цьому варіанті сторінки практично відсутній JavaScript.
scope являє собою список прав, до яких ми хочемо отримати доступ.

Звертаємося до сторінки авторизації




Парсимо відповідь


Подивимося на код сторінки авторизації. Найбільше нас буде цікавити наступна частина:


Для подальшої відправки форми необхідно розпарсити всі input'и (и тому числі і приховані), а також URL, на який сабмітиться форма.


Авторизуємось


Підставляємо в параметри запиту електронну пошту та пароль користувача і відправляємо форму:


Отримуємо куку




Встановлюємо куку




Отримуємо код


Наступним етапом, якщо користувач цього ще не робив, треба дати додатку ті права, які ми запитували в параметрі scope. Для цього нам буде запропонована сторінка з формою.

В результаті отримуємо відповідь наступного вигляду:
http://oauth.vk.com/blank.html#code=xxxxxxxxxxxxxxxxxx



Даний метод авторизації не є офіційним і може змінитися.