Screencast: Bildbearbeitung mit RMagick

In diesem Screencast zeigt Ryan wie Bilder mit RMagick verändert und/oder verarbeitet werden. Teil des Screencastes widmet er auch CarrierWave das in Kombination mit RMagick für die Verarbeitung von hochgeladenen Bildern eingesetzt werden kann.

Downloads in verschiedenen Formaten:

mp4
m4v
webm
ogg

 

Resourcen:

terminal

[bash]
brew install imagemagick
convert -version
convert octocat.png -resize ’70×70^‘ -gravity center -crop ’70×70+0+0′ -quantize GRAY -colors 256 -contrast source.png
composite stamp_overlay.png source.png source.png
convert -size 70×70 canvas:red ( octocat.png -resize ’70×70^‘ -gravity center -crop ’70×70+0+0′ -quantize GRAY -colors 256 -contrast stamp_overlay.png -composite -negate ) -compose copy-opacity -composite stamp.png
gem install rmagick
mate stamp.rb
ruby stamp.rb
[/bash]

stamp.rb

[ruby]

require "rmagick"

source = Magick::Image.read("octocat.png").first
source = source.resize_to_fill(70, 70).quantize(256, Magick::GRAYColorspace).contrast(true)
overlay = Magick::Image.read("stamp_overlay.png").first
source.composite!(overlay, 0, 0, Magick::OverCompositeOp)
colored = Magick::Image.new(70, 70) { self.background_color = "red" }
colored.composite!(source.negate, 0, 0, Magick::CopyOpacityCompositeOp)
colored.write("stamp.png")

# Or through the command line:
# system <<-COMMAND
# convert -size 70×70 canvas:red \( octocat.png
# -resize ’70×70^‘ -gravity center -crop ’70×70+0+0′
# -quantize GRAY -colors 256 -contrast stamp_overlay.png
# -composite -negate
# \) -compose copy-opacity -composite stamp.png
# COMMAND
[/ruby]

Gemfile

[ruby]
gem ‚rmagick‘
gem ‚carrierwave‘
[/ruby]

models/stamp.rb

[ruby]

mount_uploader :image, StampUploader
[/ruby]

app/uploaders/stamp_uploader.rb

[ruby]

class StampUploader < CarrierWave::Uploader::Base
include CarrierWave::RMagick

# Include the Sprockets helpers for Rails 3.1+ asset pipeline compatibility:
include Sprockets::Helpers::RailsHelper
include Sprockets::Helpers::IsolatedHelper

# Choose what kind of storage to use for this uploader:
storage :file

# Override the directory where uploaded files will be stored.
# This is a sensible default for uploaders that are meant to be mounted:
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end

# Add a white list of extensions which are allowed to be uploaded.
# For images you might use something like this:
def extension_white_list
%w(jpg jpeg gif png)
end

%w[red green blue purple black].each do |color|
version(color) { process stamp: color }
end

def stamp(color)
manipulate! format: "png" do |source|
overlay_path = Rails.root.join("app/assets/images/stamp_overlay.png")
overlay = Magick::Image.read(overlay_path).first
source = source.resize_to_fill(70, 70).quantize(256, Magick::GRAYColorspace).contrast(true)
source.composite!(overlay, 0, 0, Magick::OverCompositeOp)
colored = Magick::Image.new(70, 70) { self.background_color = color }
colored.composite(source.negate, 0, 0, Magick::CopyOpacityCompositeOp)
end
end
end
[/ruby]

stamps/index.html

[html]
<%= image_tag stamp.image_url(:blue) %>
[/html]

Screencast: MiniProfiler

MiniProfiler erlaubt es sich Geschwindigkeitsmessungen direkt auf der aufgerufenen Seite anzuschauen. Dabei werden auch die aufgerufenen SQL Befehle und wenn gewünscht Messungen für ausgesuchte Code-Blöcke.

 

Downloads in verschiedenen Formaten:

mp4
m4v
webm
ogg

 

Resourcen:

Gemfile

[ruby]

gem ‚rack-mini-profiler‘
[/ruby]

products/index.html.erb

[html]
<%= pluralize project.tasks.size, "task" %>
[/html]

projects_controller.rb

[ruby]

@projects = Project.order(:created_at).select("projects.*, count(tasks.id) as tasks_count").joins("left outer join tasks on project_id=projects.id").group("projects.id")
Rack::MiniProfiler.step("fetch projects") do
@projects.all
end
[/ruby]

config/environments/production.rb

[ruby]

config.serve_static_assets = true
[/ruby]

terminal

[bash]
rake assets:precompile
rake db:setup RAILS_ENV=production
rails s -e production
[/bash]

application_controller.rb

[ruby]

before_filter :miniprofiler

private

def miniprofiler
Rack::MiniProfiler.authorize_request # if user.admin?
end
[/ruby]

Screencast: Brakeman

Brakeman ist ein Ruby-Gem mit dem der eigene Ruby-Code innerhalb einer Rails Applikation auf bekannte Sicherheitslücken geprüft werden kann. In diesem Screencast zeigt Ryan wie es eingesetzt werden kann.

 

Downloads in verschiedenen Formaten:

mp4
m4v
webm
ogg

 

Resourcen:

terminal

[bash]
gem install brakeman
rbenv rehash
brakeman
brakeman -o brakeman.html
bundle update rails
brakeman –rake
[/bash]

config/application.rb

[ruby]
config.active_record.whitelist_attributes = true
[/ruby]

products_controller.rb

[ruby]
def index
direction = params[:direction] == "desc" ? "desc" : "asc"
@products = Product.order("name #{direction}")
end
[/ruby]

sessions_controller.rb

[ruby]
redirect_to redirect_url, only_path: true
[/ruby]

models/user.rb

[ruby]
validates_format_of :name, with: /Aw+z/
[/ruby]

Gemfile

[ruby]
gem ‚brakeman‘, group: :development
[/ruby]

Screencast: Copycopter

Copycopter ist eine Plugin um Texte in Rails auf einfache Weise zu bearbeiten. Erst kürzlich wurde es von Thoughtbot als OpenSource freigegeben und steht nun somit allen Interessierten zur Verfügung. Ryan zeigt diese Woche wie es installiert und in eigenen Applikationen benutzt werden kann.

 

Downloads in verschiedenen Formaten:

mp4
m4v
webm
ogg

 

Resourcen:

terminal

[bash]
heroku login
git clone git://github.com/copycopter/copycopter-server.git
cd copycopter-server
heroku create –stack cedar
bundle install –without=test # if heroku command fails
git push heroku master
heroku run rake db:migrate
heroku restart
heroku run rake copycopter:project NAME=Store USERNAME=ryanb PASSWORD=secret
heroku open
[/bash]

Gemfile

[ruby]
gem ‚copycopter_client‘, ‚2.0.0‘
[/ruby]

config/initializers/copycopter.rb

[ruby]
CopycopterClient.configure do |config|
config.api_key = ‚8df4bc164dd6bc5574eb1efd0499ddcb‘
config.host = ’strong-dawn-1901.herokuapp.com‘
end
[/ruby]

app/views/products/index.html.erb

[html]
<h1><%= t "products.headline", default: "Browse Products" %></h1>
<em><%= t ".tagline", default: "We have what you need at a great low price." %></em>
[/html]

Screencast: Pretty URLs mit FriendlyId

Benutzerfreundliche URLs erleichtert z.B. Besuchern sprechende Bookmarks zu erstellen oder Optimierungen bzgl. SEO durchzuführen. Das Plugin friendly_id erfüllt die Erstellung von Pretty URLs und bringt zusätzlich noch weitere Features mit. Ryan zeigt wie es installiert und eingesetzt werden kann.

 

Downloads in verschiedenen Formaten:

mp4
m4v
webm
ogg

 

Resourcen:

terminal

[bash]
rails g migration add_slug_to_articles slug:string
rake db:migrate
rails c
rails g friendly_id
[/bash]

rails console

[ruby]
Article.find_each(&:save)
[/ruby]

db/migrate/add_slug_to_articles.rb

[ruby]
add_column :articles, :slug, :string
add_index :articles, :slug
[/ruby]

models/article.rb

[ruby]
class Article < ActiveRecord::Base
extend FriendlyId
friendly_id :name, use: :slugged

def should_generate_new_friendly_id?
new_record?
end
end

# Or…

class Article < ActiveRecord::Base
extend FriendlyId
friendly_id :name, use: :history
end
[/ruby]

Screencast: HTML Emails mit Rails verschicken

Um Mails in HTML zu verschicken, bedarf es einiger Vorbereitung, da diese nicht wie Standard-Webseiten erstellt werden können. Die Unterschiede sind mannigfaltig, aber es gibt ein paar Helfer in Form von Gems, die diese Arbeit erleichtern. Ryan zeigt in diesem Screencast wie premailer-rails3 und roadie eingesetzt werden können.

 

Downloads in verschiedenen Formaten:

mp4
m4v
webm
ogg

 

Resourcen:

terminal

[bash]
rails new mailit
cd mailit
rails g mailer newsletter_mailer weekly
bundle
rails c
[/bash]

Gemfile

[ruby]
gem ‚roadie‘

# or

gem ‚hpricot‘
gem ‚premailer-rails3‘
[/ruby]

app/mailers/newsletter_mailer.rb

[ruby]
def weekly(email)
mail to: email, subject: "RailsCasts Weekly"
end
[/ruby]

config/environments/development.rb

[ruby]
config.action_mailer.default_url_options = { host: "railscasts.com" }
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
address: "smtp.gmail.com",
port: 587,
domain: "railscasts.com",
authentication: "plain",
enable_starttls_auto: true,
user_name: ENV["GMAIL_USERNAME"],
password: ENV["GMAIL_PASSWORD"]
}
[/ruby]

rails console

[ruby]
NewsletterMailer.weekly("foo@example.com").deliver
[/ruby]

Screencast: Arbeit an der Konsole mit ZSH

Als Rails-Entwickler arbeitet man häufig in einer Shell, einem Terminal bzw. Konsole. Ryan zeigt wie ein Wechsel zur Z-Shell, zusammen mit seinem entsprechend Theme, wechselt.

 

Downloads in verschiedenen Formaten:

mp4
m4v
webm
ogg

 

Resourcen:

bash

[bash]
ps
wget –no-check-certificate https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O – | sh
curl -L https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh | sh
mate ~/.zshrc
cat ~/.bash_profile >> ~/.zshrc
mate ~/.oh-my-zsh
[/bash]

.zshrc

[bash]
# Path to your oh-my-zsh configuration.
ZSH=$HOME/.oh-my-zsh

# Set name of the theme to load.
# Look in ~/.oh-my-zsh/themes/
# Optionally, if you set this to "random", it’ll load a random theme each
# time that oh-my-zsh is loaded.
ZSH_THEME="rbates"

# Uncomment following line if you want to disable colors in ls
DISABLE_LS_COLORS="true"

# Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*)
# Example format: plugins=(rails git textmate ruby lighthouse)
plugins=(git bundler brew gem rbates)

source $ZSH/oh-my-zsh.sh

# Customize to your needs…

export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
[/bash]

.oh-my-zsh/themes/rbates.zsh-theme

[bash]
PROMPT=’%3~$(git_prompt_info)%# ‚

ZSH_THEME_GIT_PROMPT_PREFIX="["
ZSH_THEME_GIT_PROMPT_SUFFIX="]"
[/bash]

.oh-my-zsh/custom/plugins/rbates/rbates.plugin.zsh

[bash]
c() { cd ~/code/$1; }
_c() { _files -W ~/code -/; }
compdef _c c
[/bash]

Screencast: Etwas zu Open-Source beitragen

Open-Source Projekte leben vom Beitrag von Freiwilligen. Github vereinfacht die Möglichkeit einen Teil, seien es auch nur kleine Verbesserungen, zur Verfügung zu stellen. An dem Beispiel von VCR zeigt Ryan diese Woche wie es funktioniert.

 

Downloads in verschiedenen Formaten:

mp4
m4v
webm
ogg

 

Resourcen:

bash

[bash]
git clone git@github.com:ryanb/vcr.git
cd vcr
git branch -r
bundle install
bundle exec rake
git submodule init
git submodule update
git status
git checkout .
git checkout -b readme-contributing-link
git diff
git commit -a -m "adding contributing link to readme"
git push origin readme-contributing-link
[/bash]

Gemfile

[ruby]
gem ‚rb-fsevent‘, ‚0.9.0.pre4‘
[/ruby]

Screencast: Virtuelle Maschinen mit Vagrant

Virtuelle Maschinen sind sehr praktisch um Umgebungen für Entwicklung und Tests aufzubauen. Mit Vagrant besteht die Möglichkeit diese automatisiert zu provisionieren und auf Wunsch so produktionsnah wie nötig aufzusetzen. Weiterhin können mit Virtuellen Maschinen eine gemeinsame Umgebung eingerichtet werden, damit alle Projektmitglieder auf der gleichen Umgebung arbeiten. Dadurch kann ggf. Fehler beim Übergang auf eine produktive Umgebung gemindert werden. Ryan zeigt in seinem Screencast wie Vagrant zum Aufsetzen von Virtuellen Maschinen auf Basis von Virtual-Box eingesetzt werden kann.

 

Downloads in verschiedenen Formaten:

mp4
m4v
webm
ogg

 

Resourcen:

Vagrantfile

[ruby]
config.vm.forward_port "rails", 3000, 3000
[/ruby]

Gemfile

[ruby]
gem ‚therubyracer‘
[/ruby]

bash

[bash]
# setup vagrant
gem install vagrant
vagrant box add lucid32 http://files.vagrantup.com/lucid32.box
rails new todo
cd todo
vagrant init lucid32
mate Vagrantfile
vagrant up
vagrant ssh

# inside virtual machine
whoami
cd /vagrant
ruby -v
sudo apt-get update
sudo apt-get install build-essential zlib1g-dev curl git-core sqlite3 libsqlite3-dev

# install rbenv and Ruby 1.9.2
git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
echo ‚export PATH="$HOME/.rbenv/bin:$PATH"‘ >> ~/.bash_profile
echo ‚eval "$(rbenv init -)"‘ >> ~/.bash_profile
source .bash_profile
git clone git://github.com/sstephenson/ruby-build.git
cd ruby-build/
sudo ./install.sh
rbenv install 1.9.2-p290

# get Rails running
cd /vagrant
gem install bundler
rbenv rehash
bundle
bundle exec rails s

# vagrant commands
vagrant reload
vagrant status
vagrant suspend
vagrant resume
vagrant halt
vagrant up
vagrant package
vagrant destroy
[/bash]

Screencast: Tests mit Spork beschleunigen

Ab einer bestimmten Größe können die Testläufe die Entwicklung „verlangsamen“. Spork ist kann in diesem Fall Abhilfe schaffen, indem es die Ladezeiten verbessert. In Verbindung mit Guard bekommt man so schneller Rückmeldung über den aktuellen Stand. Ryan zeigt in diesem Screencast wie Spork eingesetzt werden kann.

 

Downloads in verschiedenen Formaten:

mp4
m4v
webm
ogg

 

Resourcen:

bash

[bash]
rspec .
time rspec .
bundle
spork –bootstrap
spork
rspec . –drb
guard init spork
[/bash]

Gemfile

[ruby]
group :test do
gem "spork", "> 0.9.0.rc"
gem "guard-spork"
end
[/ruby]

Guardfile

[ruby]
guard ’spork‘, :cucumber_env => { ‚RAILS_ENV‘ => ‚test‘ }, :rspec_env => { ‚RAILS_ENV‘ => ‚test‘ } do
watch(‚config/application.rb‘)
watch(‚config/environment.rb‘)
watch(%r{^config/environments/.+.rb$})
watch(%r{^config/initializers/.+.rb$})
watch(’spec/spec_helper.rb‘)
watch(%r{^spec/support/.+.rb$})
end

guard ‚rspec‘, :version => 2, :cli => "–drb", :all_on_start => false, :all_after_pass => false do
# …
end
[/ruby]

spec/spec_helper.rb

[ruby]
require ‚rubygems‘
require ’spork‘

Spork.prefork do
# …
RSpec.configure do |config|
# …
config.treat_symbols_as_metadata_keys_with_true_values = true
config.filter_run :focus => true
config.run_all_when_everything_filtered = true
end
end

Spork.each_run do
# This code will be run each time you run your specs.
FactoryGirl.reload
end
[/ruby]