Category Archives: Ruby

Ruby 2.2.0, Ruby on Rails 4.2.0 — instalacja na Ubuntu 14.04

Na początek instalujemy potrzebne biblioteki i narzędzia do skompilowania Rubiego i gemów domyślnie będących w zależnościach Railsów.

sudo apt-get install build-essential bison openssl libreadline6 libreadline6-dev curl git git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-0 libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake libtool nodejs

W przypadku korzystania z gemu ‚pg’ warto doinstalować:
sudo apt-get install libpq-dev

Na stronie: https://rvm.io/rvm/install za pomocą polecenia:

curl -L https://get.rvm.io | bash -s stable --ruby

instalujemy RVM (Ruby Version Manager) oraz najnowszą wersję Rubiego.

Następnie do pliku .bashrc w katalogu domowym dodajemy następujące linijki:

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
export PATH="$PATH:$HOME/.rvm/bin"

W terminalu wczytujemy zmieniony .bashrc za pomocą polecenia source ~/.bashrc.

Teraz opcjonalnie możemy stworzyć plik .gemrc w katalogu domowym i dodać:

gem: --no-ri --no-rdoc

Dzięki temu przy instalacji gemów nie będzie generowana dokumentacja.

Poleceniem:

rvm use 2.2.0 --default

wskazujemy, że domyślnie chcemy korzystać z Rubiego 2.2.0.

Zaktualizujmy narzędzie gem do najnowszej wersji:

gem update --system

Warto zainstalować jeszcze Bundlera:

gem install bundler

Do zainstalowania pozostały jeszcze Railsy, co robimy poleceniem:

gem install rails

Po instalacji tworzymy testowy projekt, aby sprawdzić poprawność działania.

rails new projekt
cd projekt
rails server

Wchodzimy na stronę: http://localhost:3000, aby zobaczyć działającą aplikację.

Rails 4, EventSource & Unicorn

W Railsach 4 pojawił się ActionController::Live dzięki czemu po nawiązaniu połączenia serwer może przesyłać strumieniowo dane.

Stwórzmy prostą aplikację, która będzie otrzymywać dane od serwera i dodawać je do listy na stronie.
Tworzymy nową aplikację railsową:

rails new app

Przechodzimy do pliku Gemfile i dodajemy:

gem 'unicorn'

Instalujemy wszystkie zależności:

bundle install

Do pliku config/routes.rb dodajemy:

  get '/' => 'items#index'
  get '/stream' => 'items#stream'

Tworzymy app/controllers/items_controller.rb i dodajemy:

class ItemsController < ApplicationController
  include ActionController::Live

  def index
  end

  def stream
    response.headers['Content-Type'] = 'text/event-stream'
    (1 .. Float::INFINITY).lazy.each do |i|
      response.stream.write "data: #{i}\n\n"
      sleep 0.1
    end
    response.stream.close
  end
end

Tworzymy plik app/assets/javascripts/stream.js i dodajemy:

var source = new EventSource('/stream');

source.onmessage = function(event) {
  var item = $('<li>').text(event.data);
  $('#items').append(item);
}

Tworzymy plik app/views/items/index.html.erb i dodajemy:

<ul id="items"></ul>

Uruchamiamy serwer: unicorn_rails i przechodzimy na stronę http://localhost:8080

JRuby 1.7.4 locally and on Heroku

Install JRuby via RVM:

rvm get stable
rvm install jruby-1.7.4
gem install rails
rails new app --database=jdbcpostgresql --skip-test-unit

Add those lines to your Gemfile:
#ruby=jruby-1.7.4
ruby '1.9.3', engine: 'jruby', engine_version: '1.7.4'

Initialize git repository, commit and:

heroku create
git push heroku master

Run JRuby on Heroku right now

Local server for JRuby apps — Puma
gem install puma
Puma server

Sinatra: Access-Control-Allow-Origin & Access-Control-Request-Method

set :protection, :except => [:http_origin]

before do
  headers['Access-Control-Allow-Origin'] = '*'
  headers['Access-Control-Request-Method'] = '*'
end

JRuby 1.7.2: kolejne spotkanie

Tym razem miałem potrzebę użycia Gephi Toolkit z poziomu JRubiego.

Co rzuciło mi się w oczy podczas zamiany kodu Javy na JRubiego.

1. Refleksja.
.class zwróci nam klasę typu Class
.java_class zwróci nam klasę Java::JavaClass

2. Enum types
Java: EdgeDefault.DIRECTED
JRuby: EdgeDefault::DIRECTED

3. getResource
Metoda getResource z java.lang.Class w JRubym jest dostępna jako java.getResource.

Do działania poniższego kawałka kodu potrzebny jest Gephi Toolkit.

require 'gephi-toolkit.jar'

java_import 'java.io.ByteArrayOutputStream'
java_import 'java.io.File'
java_import 'java.io.IOException'
java_import 'java.io.StringWriter'
java_import 'org.gephi.graph.api.GraphModel'
java_import 'org.gephi.io.exporter.api.ExportController'
java_import 'org.gephi.io.exporter.preview.PDFExporter'
java_import 'org.gephi.io.exporter.spi.CharacterExporter'
java_import 'org.gephi.io.exporter.spi.Exporter'
java_import 'org.gephi.io.exporter.spi.GraphExporter'
java_import 'org.gephi.io.importer.api.Container'
java_import 'org.gephi.io.importer.api.EdgeDefault'
java_import 'org.gephi.io.importer.api.ImportController'
java_import 'org.gephi.io.processor.plugin.DefaultProcessor'
java_import 'org.gephi.project.api.ProjectController'
java_import 'org.gephi.project.api.Workspace'
java_import 'org.openide.util.Lookup'

# Init a project - and therefore a workspace
pc = Lookup.getDefault.lookup(ProjectController.java_class)
pc.newProject
workspace = pc.getCurrentWorkspace

# Get controllers and models
importController = Lookup.getDefault.lookup(ImportController.java_class)

# Import file
file = File.new("file.gml")
container = importController.importFile(file)
container.getLoader.setEdgeDefault(EdgeDefault::DIRECTED)
container.setAllowAutoNode(false)

# Append imported data to GraphAPI
importController.process(container, DefaultProcessor.new, workspace)

# Graph
gm = workspace.getLookup.lookup(GraphModel.java_class)
graph = gm.getGraph

Źródła:
Gephi
Gephi Toolkit Demos
Gephi Toolkit JavaDoc

Review: „Learning Rails 3” Simon St. Laurent, Edd Dumbill, Eric J Gruber, O’Reilly Media

learning ruby

Really good introduction to Rails 3

I was very curious about this book when came out. I like the way authors present material in book. First, they show bigger picture and step-by-step explain it in details. Book covers basics and focuses on providing good background for further learning. Each chapter at the end contains „Test Your Knowledge” section which nicely recap topics mentioned in chapter. Authors put a lot of valuable tips.
From my point of view book needs improvement to be perfect — there are some errors and I found Chapter 5 with REST & HTTP methods not-so-easy to grasp in comparison to other chapters.
To sum up, Learning Rails 3 is really, really good book.

My rating:

Product page: http://shop.oreilly.com/product/0636920021322.do

I review for the O'Reilly Blogger Review Program

Review: „Learning Ruby” By Michael Fitzgerald, O’Reilly Media

learning ruby

For beginners

This book is good introduction to the Ruby language for beginners. Book covers the most important aspects of language: syntax, data structures, classes, some common libraries, etc. Reader need to be aware that book was published in 2007 and there are outdated parts (e.g. there are newer versions of Ruby and Ruby on Rails).
Learning Ruby can be still valuable position for beginner however I would recommend find more up-to-date book.

My rating:

Product page: http://shop.oreilly.com/product/9780596529864.do

I review for the O'Reilly Blogger Review Program

Railsberry – słodka konferencja

railsberry_badge
W dniach 19-20 kwietnia 2012 w Krakowie w Centrum Sztuki i Techniki Japońskiej Manggha odbędzie się konferencja Railsberry. W tym momencie na liście Speakers znajdują się m.in. developerzy należący do Rails Core Team — Aaron Patterson, Yehuda Katz, José Valim, Jon Leighton oraz inni developerzy Marcin Bunsch, Sebastian Deutsch, Mariusz Łusiak, Konstantin Haase.

Więcej informacji na: http://railsberry.com
oraz na blogu: http://blog.railsberry.com

I’m in. And you?

Aktualizacja
Lista spikerów powiększyła się o następujące osoby: Elliott Kember, Linda Liukas, Tom Stuart, Zach Holman, Corey Donohoe, Gregg Pollack, Ben Orenstein, Eric Redmond, Randall Thomas, Tammer Saleh, Patrick Huesler, Tim Lossen, Josh Kalderimis, Xavier Noria.
Imponująca lista!

Teraz wiem, już dlaczego:

😉

Miniatury stron internetowych

W sieci funkcjonują darmowe i płatne serwisy do tworzenia miniatur dla stron internetowych. Jednak nic nie stoi na przeszkodzie, aby samemu wygenerować sobie potrzebne miniatury.

W pierwszej kolejności instalujemy biblioteki i programy potrzebne do gemów:

  • dla capybara-webkit – Qt
  • dla mini_magick – ImageMagick lub GraphicsMagick

Kolejny krok to zainstalowanie wspomnianych gemów:

gem install capybara-webkit
gem install mini_magick

Czas na kod (testowany dla Ruby 1.8.7 i 1.9.2):

require 'rubygems' #Ruby 1.8.7
require 'capybara/driver/webkit'
require 'mini_magick'

@driver = Capybara::Driver::Webkit.new(nil)
@driver.visit("https://cichykacik.wordpress.com/")
@driver.render("cichykacik.jpg")

image = MiniMagick::Image.open("cichykacik.jpg")
#ratio - szerokość/wysokość
ratio = 3.0 / 2.0
width = image[:width]
height = image[:width]/ratio

image.crop "#{width}x#{height}+0+0"
image.resize "300x200"
image.write "cichykacik-miniatura.jpg"

Tym sposobem otrzymaliśmy dwa pliki – jeden z pełnym zrzutem strony i miniaturę.

Z dokumentacji do mini_magick:

MiniMagick gives you access to all the commandline options ImageMagick has

Dlatego ze szczegółowym opisem funkcji i przyjmowanych argumentów polecam zapoznać się na stronie: http://www.imagemagick.org/www/mogrify.html

Gedit i Ruby on Rails

Spośród wielu edytorów i IDE, które testowałem pisząc kod projektu w Ruby on Rails okazało się, że najprostsze rozwiązania bywają najlepsze. Dzięki Gosiu 🙂

W sieci natknąłem się na wpis: Configuring Gedit for Rails
Instalujemy wtyczki:

sudo add-apt-repository ppa:ubuntu-on-rails/ppa
sudo apt-get update
sudo apt-get install gedit-gmate gedit-plugins gedit-developer-plugins

Po instalacji czas na konfigurację. Możliwości jest wiele.
Za swej strony mogę polecić:

  • włączenie wtyczki File Browser Pane i panelu bocznego (F9) — widok otwartych dokumentów i drzewa katalogów,
  • włączenie wtyczki Embedded terminal i panelu na dole (Shift+F9),
  • przełączanie w tryb pełnego ekranu (F11),
  • włączenie wtyczki Code comment — zakomentuj (Ctrl+M), odkomentuj (Ctrl+Shift+M),
  • wtyczki:
    • Snippets — gotowe wstawki kodu
    • Draw spaces, Smart spaces — w swoim kodzie stosuje 2 spacje jako wcięcie
    • Word completion — autouzupełnianie przydaje się przy często powtarzających się słowach
    • Rails Extract Partial, Rails File Loader, Rails Hot Commands, Rails Hotkeys — zbiór narzędzi ułatwiających tworzenie i nawigację w projektach RoR
    • Regex Search and Replace — wyszukiwanie i zamiana tekstu w oparciu o wyrażenia regularne; szkoda, że nie jest to domyślnie jak np. w geany