2012年12月31日月曜日

Ruby Accessor Methods

( ̄(エ) ̄)彡☆

Ruby Accessor Methods

C#
class Foo
  private string name;

  public string Name
  {
    set
    {
      name = value;
    }
    get 
    {
      return name;
    }
  }
end

Ruby
class Foo
  def initialize(name)
    @name = name
  end
  
  #attr_reader #get only
  #attr_writer #set only
  attr_accessor :name #get set
end

It's simple ヘ(^o^)ノ

2012年12月27日木曜日

Sublime Text 2でBuildSystemをrbenvに変更

( ̄(エ) ̄)彡☆


Github → sublime-text-2-rbenv

使い方は簡単ヘ(^o^)ノ
cd ~/Library/Application\ Support/Sublime\ Text\ 2/Packages/
git clone git://github.com/felipeelias/sublime-text-2-rbenv.git rbenv

Sublime Textのツールバー Tools → Build System
RBenvを選択

さっそく⌘+Bで実行
ruby_version.rb
puts `ruby -v`

実行結果
[Errno 2] No such file or directory
[cmd:  [u'~/.rbenv/bin/rbenv', u'/usr/local/bin/rbenv', u'exec', u'ruby', u'/Users/murajun/test.rb']]
[dir:  /Users/murajun]
[path: /usr/bin:/bin:/usr/sbin:/sbin]
[Finished]

ディレクトリがない…だと…( ; ゚Д゚)

~/Library/Application Support/Sublime Text 2/Packages/rbenv/RBenv.sublime-build
{
  "cmd": ["~/.rbenv/bin/rbenv", "/usr/local/bin/rbenv", "exec", "ruby", "$file"],
  "selector": "source.ruby"
}

~/.rbenv/bin/rbenvってのを削除して⌘+Bで実行
ruby 1.9.3p327 (2012-11-10 revision 37606) [x86_64-darwin12.2.1]
[Finished in 0.1s]

できたヘ(^o^)ノ

2012年12月20日木曜日

Rails BulkInsert and Destroy #rails

( ̄(エ) ̄)彡☆

環境
Ruby 1.9.3-p327
Rails  3.2.2
Postgresql 9.2.2

以前、Rails CSVインポートっての書いたけど…
def create
  require 'csv'

  if params[:upload_file].blank? == false
    reader = params[:upload_file].read

    CSV.parse(reader) do |row|
      file = File.new
      file["field_name"] = row[0]
      file.save ← ここがマズイ
    end
  end
end

これだと鬼の様にInsertクエリが走ります…

なので、BulkInsertを使いましょうw

Gemfile
gem "activerecord-import", ">= 0.2.0"

修正後
def create
  require 'csv'

  if params[:upload_file].blank? == false
    reader = params[:upload_file].read
    
    files = []
    CSV.parse(reader) do |row|
      files << File.new(field_name: row[0])
    end

    File.import(files)
  end
end

これでInsertクエリが一発走っておしまいヘ(^o^)ノ

10,000レコードのインポートで5218.9ms

実はdestroy_allでも同じ現象…

鬼の様にDeleteクエリが走ります…

こんな感じ?
ids = []
@files = File.all
@files.each do |f|
  ids << f.id
end
File.delete_all("id in (#{ids.join(',')}) ")

ちょっと強引すぎるか…( ; ゚Д゚)

1628.5ms!

これでSelect, Delete, Insertのクエリがそれぞれ一回だけ実行されるようになった

ツッコミ大歓迎ヘ(^o^)ノ

2012年12月5日水曜日

Rails Tutorial Chapter3 Title test does not work #rails

Listing 3.17
it "should have the right title" do
 visit '/static_pages/home'
 page.should have_selector('title', :text => "Ruby on Rails Tutorial Sample App | Home")
end

Capybara2.0.1 does not work ( ̄0 ̄)
Also found "", which matched the selector but not all filters.

Updated
it "should have the right title" do
 visit '/static_pages/home'
 should have_xpath("//title[contains(.,'Ruby on Rails Tutorial Sample App | Home')]")
end

It Worked ヘ(^o^)ノ

or
gem 'capybara', '1.1.2'


2012年11月24日土曜日

MobiRubyをインストールしてみたよ

( ̄(エ) ̄)彡☆

明日?今日のもくもく勉強会の為にMobiRubyをインストールしたみたら…

こんなエラーでた( ;´・ω・`)人(´・ω・`; )
build-exports.rb:43:in `<main>': undefined method

xcodeproj 0.4.0 → 0.3.3にすればいけたヘ(^o^)ノ

MobiRubyはこれから期待してる

環境
Mac OS X 10.8.2
Ruby 1.9.3-p327
RVM 1.17.0

gem
nokogiri 1.5.5
xcodeproj 0.3.3

2012年11月10日土曜日

RubyWorld Conference2012へ行ってきたよ

( ̄(エ) ̄)彡☆

8、9日の2日間、島根県松江市で行われたRubyWorld Conferenceに参加してきましたー

前日の夜から夜行バスに揺られて松江へ…

到着は午前7時!

時間があるので松江城を見に行きました

.oO(岸和田城よりと同じくらいかな…)

マクドで朝マック食っていざ会場入り!

Untitled


初日の基調講演はMatzヘ(^o^)ノ
「How to Change the World」

Untitled
ソフトウェアで世界を変える喜び。

ハードウェアで世界を変えるのは個人レベルでは難しい

ITでなら少人数で小さく初めて世界を変えられるかもしれない。

どうやって?

1.小さく始める
  小さく始める事でコストもそれほどかからない。
  
2.何度もチャレンジする
  小さなプロジェクトは世界中に溢れている…
  成功するには運も必要!何度でもチャレンジする!
  撤退はすばやく!

3.自分の気持ちを大切にする
  やりたい事をできるだけたくさんやろう!
  そうすれば、仕事が楽しくなってくる!

みんながスーパープログラマーでは(ヾノ・∀・`)ナイナイ

続けるにはモチベーションが大事

もう一つはプロジェクトをオープンにしようヘ(^o^)ノ

そうすれば、世界中の誰かが共感してチームに参加してくれるかもしれない。

1人で成功するの難しい

印象に残った言葉がコレ↓

"自分の身近な世界から変えていこう"
"運がよければ共感する仲間ができ、本当に世界を変える事が出来るかもしれない"
"Be Happy.(幸せになろう)"

2日目の基調講演はDave Thomas氏ヘ(^o^)ノ
「The Limits of Language」

Untitled

DaveはRubyで繰り返し処理でforとeachをどちらを使う?って質問に
ほぼ全員eachでした

でも、なぜeachを使うのか?って聞かれると…答えられないw

多分、僕の中でRubyのコードってこう書かないといけない!って
思い込みがあるのでしょうw

Daveはコードに正解はない。Betterはあるけどねー。

変数名や見やすさがクリアであればforでもeachでも結果は同じ

そこにRubyはeachじゃないとなんて事はない(好き嫌いの問題w)

次にRubyには微妙な曖昧さがある。

a = 1, b = 2
p a

実行結果は…
[1, 2]

会場のほとんどの人が間違いましたwww

ポイントは1行で書いてあるとこと

a = 1, ←このカンマ!

なるほどwww

でも、この曖昧さがRubyが楽しい理由だと

印象に残った言葉がコレ↓

"Programming should be fun!(プログラミングは楽しくないとね)"

今年で2回目の参加ですが…

自分の英語力が向上していることを実感しました(そこかよw

永和システムの角谷さんがセッションで話してくれました

Rubyに興味があって、Ruby関連のイベントに参加する

それだけで、すでにRubyistなのだヘ(^o^)ノ

すごく勇気を与えてくれる言葉だと思います!

その他のセッションもヨカターヨ

GREEの大場さんとか…www

個人的には最後のセッション

ソニックガーデンの松村さんのセッションが気になります

今後の動向に要注目です

しかし、夜行バスは…きっついねw

楽しかったおヽ(●´ε`●)ノ



2012年11月5日月曜日

Railsチューニングでベンチマークとってみた

( ̄(エ) ̄)彡☆

プロ生でRailsチューニングでベンチマークとればいいのにー

って、声があったからベンチマークとってみたー

WEBrick
time = 3477ms

Unicorn
time = 1567ms

Rack Middleware
config.middleware.delete 'Rack::Cache'
config.middleware.delete 'Rack::ETag'
config.middleware.delete 'Rack::ConditionalGet'

time = 776ms

GC とめ
time = 751ms

やっぱりRack Middlewareをとめるのがきいてるなー

2012年11月4日日曜日

プログラミング生放送勉強会 第18回@大阪 #pronama 参加してきたー

( ̄(エ) ̄)彡☆

おやつ係だったので買い出し行ってきましたー

阪急梅田に出来たHAPPY Turn's

開店時間の10時に行けば楽勝…

まさかの2時間半待ちΣ(゚Д゚;エーッ!

先頭は8時過ぎから並んでたらしい…

結局2時間またなアカンのかw

Untitled
目の前でパウダーかけてくれますヘ(^o^)ノ

無事購入して会場へ=͟͟͞͞( •̀д•́)))

Untitled
会場では受け付けでみなさんをお出迎えw

《セッション内容》

NFC で始めるイベント出欠管理
スピーカーは@treby006さん

空のテンプレートから始める Windows ストアアプリ
スピーカーは@hatsune_さん

ここまでは@to_uedaと受付でRubyのお話してましたヘ(^o^)ノ

Delphi で Win/Mac クロスコンパイル
スピーカーは@tworksさん

クラウディア窓辺のタダではじめる Windows Azure(入門編)
スピーカーはなんと@Claudia_Azureさん キタ━(゚∀゚)━!

やさしくAzureを教えてくれましたヘ(^o^)ノ

ぐだぐだでしたが( ; ゚Д゚)
LTやってきましたー


Railsチューニングとコミュニティのお話

クラウディアさんと名刺交換できなかったのが悔やまれる…

でも、勉強会はやっぱり楽しいー

スタッフの皆さん、参加していだだいた皆さん、スピーカーの皆さん

祝日でしたが、(❤ฺ→∀←) おつかれ♫♬ (→∀←❤ฺ)

次回は12/22 プロ生勉強会 第19回@東京(予定)です

ではまたー

2012年11月1日木曜日

Qiita APIでtokenを取得してみた

( ̄(エ) ̄)彡☆

Faradayってgemがあるのでそっちを使った方が良いかも。。。
GitHub - Faraday


2012年10月15日月曜日

RailsでArelを使ってみたよ

( ̄(エ) ̄)彡☆

Railsの検索でクエリをゴリゴリ書くのもいいが…

あんまりクールでないwww

なのでArelを使ってみる

GitHub → Arel

例えばOR句を使いたい場合
users = User.arel_table
User.where(users[:name].matches('%murajun1978%').or(users[:admin].eq(true))

生成されたSQL
SELECT "users".* FROM "users" 
WHERE (("users"."name" LIKE '%murajun1978%' OR "users"."admin" = 't'))

LIKE句を使いたかったのでmatchesを強引に使いました (。・x・)ゝ

AND句はorをandに変えて使ってね

Rails 【モデル】 scopeを使って検索してみたよ

( ̄(エ) ̄)彡☆

コントロールに書くと…
@user = User.where(:name => params[:name])

でも、こういうのはモデルに書きたいヘ(^o^)ノ

Userモデル
class User < ActiveRecord::Base
  scope :search, lambda { |name|
    where("name = ?", "#{name}") 
  }
end

使い方はこんな感じ
@user = User.search

すっきりしたねーヾ(╹◡╹✽三✽╹◡╹)ノ″

んじゃ、複数の場合は…

Userモデル
class User < ActiveRecord::Base
  scope :search, lambda { |name, admin|
    where("name = ?", "#{name}").where("admin = ?", "#{admin}") 
  }
end

こんな感じでwhere文をくっつける事もできるのだー

しかも…
@user = User.search(params[:name], nil)

引数がnilでもそのまま書けるΣ(゚Д゚;

Railsなしでは生きて行けませんwww

2012年10月9日火曜日

Railsでid以外のカラムを主キーにしてみたよ

( ̄(エ) ̄)彡☆

新規プロジェクトをRailsで作るなら設定より規約にしたがっていけば良いのですが…

既存データのテーブル構造を使う場合は主キーがidとは限らない (。・x・)ゝ

というか、まずないwww

そんな時はModelにset_primary_key [:column]を追加してあげると幸せになれる

例えば
Areasテーブル
attr_accessible :area_id, :name
has_many :customers

+ set_primary_key :area_id
attr_accessible :area_id, :name
has_many :customers

Customersテーブル
attr_accessible :area_id, :name
belongs_to :area

Customer_index_view
<% @customers.each do |customer| %>
    <%= customer.name %>

    <%= customer.area_id %>

    <%= customer.area.name %> ← 今まで通りに使えるヘ(^o^)ノ

    <%= link_to 'Show', customer %>

    <%= link_to 'Edit', edit_customer_path(customer) %>

    <%= link_to 'Destroy', customer, method: :delete, data: { confirm: 'Are you sure?' } %>
<% end %>

Railsには複数キーを設定できないので、composite_primary_keysっていうgemを使うといいよ

GitHub→composite_primary_keys

2012年10月3日水曜日

Macでrbenvを使ってRails環境を構築したよ

( ̄(エ) ̄)彡☆

OS X 10.8.2

最近、RailsやらRubyMotionやらPandraやらでgemがぐちゃぐちゃ…

せっかくなのでRVMでなくてrbenvで環境を構築してみまーす

Homebrew
$ ruby -e "$(curl -fsSkL raw.github.com/mxcl/homebrew/go)"

openssl
$ brew install openssl
$ brew link openssl

readline
$ brew install readline
$ brew link readline

rbenv
$ brew install rbenv
$ brew install ruby-build

~/.bash_profile
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

Rubyをインストール
$ rbenv install 1.9.3-p194

なんかopensslのエラー出てインストールできないので
$ CONFIGURE_OPTS="--with-readline-dir=/usr/local --with-openssl-dir=/usr/local" rbenv install 1.9.3-p194

はー

Ruby1.9.3-p194をデフォに設定
$ rbenv global 1.9.3-p194

bundleをインストール
$ rbenv exec gem install bundle
$ rbenv rehash

rails_projects/myapp/Gemfile
source 'http://rubygems.org'
gem 'rails', '3.2.8'

bundle install
$ cd ./myapp
$ bundle install --path vendor/bundle

Rails apps
$ bundle exec rails new .

Gemfileの上書き確認くるのでYes

Railsコマンドの前に bundle execをつけるの忘れないでねw

これでプロジェクト毎にgemを分けれるのでスッキリ

RubyMotionの場合も
bundle install --path vendor/bundleすればいいのです

2012年10月1日月曜日

Ruby x Agile ~Rubyで作る、アジャイル開発~に参加してきた

( ̄(エ) ̄)彡☆

ATND→Ruby x Agile ~Rubyで作る、アジャイル開発~

複数人での開発はあまり経験がないので参加してきましたー

アドバイザとして株式会社アジャイルウェア代表取締役の川端光義さんが参加

当日の流れはこんな感じヘ(^o^)ノ
  1. チーム分け
  2. 第1イテレーション
  3. もくもく
  4. 成果発表
  5. 第2イテレーション
  6. もくもく
  7. 成果発表
Railsを使ってWebアプリを作りましたー

第2イテレーションでは機能追加がありました

ホントはテストから書くのだろうが…

いきなりコーディング ヽ(`д´;)/  うおおおお!?

なんとか見せられる程度に仕上げました (。・x・)ゝ

第1イテレーションではコードがぐちゃぐちゃでしたが、

第2イテレーション前にヒントをもらい修正しましたm( __ __ )m 

RSpecのテスト→モデル→コントローラー→ビュー

この流れがすごく自然でシンプルですヽ(´ー`)ノ

テストコードを書くときに手が止まってしまう…

慣れが必要ですね!

下記書籍は全部もってるのに…勉強不足です(_ _ )/ハンセイ

アジャイル開発のペアプロとかあるとイイかもヘ(^o^)ノ


2012年9月26日水曜日

RubyMotion1.24でBubbleWrapを動かしてみる

( ̄(エ) ̄)彡☆

RubyMotionでWeb APIからJSONファイルを取得してみたで、BubbleWrapが動かないと書いた。

RubyMotion1.24ではconfigsをサポートしなくなったからみたいです…

Qiitaに投稿が「RubyMotionを1.24にしたらBubbleWrapが動かなくなった」

僕はRVMを使ってるのでパスはこんなかんじ

~/.rvm/gems/1.9.3/gems/bubble-wrap-1.1.3/lib/bubble-wrap/ext/motion_project_app.rb
#この2行を削除
configs.each_value &bw_config
config.validate

#追加
config.setup_blocks << bw_config

これでおっけー(>Д<)ゝ

しかーし、Qiitaにコメントが…

@Watson1978さんがブランチを作ってくれてるみたいです アリガト!(´▽`)

app_path/Gemfile
$ cat > Gemfile
source :rubygems

gem "rake"
gem 'bubble-wrap', '~> 1.1.3', :git => "git://github.com/Watson1978/BubbleWrap.git", :branch => "configs"

$ bundle install

app_path/Rakefile
# -*- coding: utf-8 -*-
$:.unshift("/Library/RubyMotion/lib")
require 'motion/project'
require 'bubble-wrap' ←追加

Motion::Project::App.setup do |app|
  # Use `rake config' to see complete project settings.
  app.name = 'app_name'
end

これだと既存のgemとごっちゃになるので、以下のオプションを付けた方がいいみたい
$ bundle install --path vendor/bundle


ぽちさんの[RubyMotion] Bundlerを使って楽をしてみた!を参考にさせてもらいましたー

「RubyMotionもくもく会」行きたかったな(つд⊂)エーン

2012年9月25日火曜日

Redcarを使ってみた

( ̄(エ) ̄)彡☆

TwitterのTLに…


Redcar is written in Ruby and runs on JRuby.

おぉ…Ruby製のオープンソースエディタ!(JRuby)

プラグインもRubyで書けるヘ(^o^)ノ

install
$ gem install redcar

Redcar+RubyMotion


plugin redcar-rubymotion
#fresh install
$ cd ~/.redcar/plugins
$ git clone git://github.com/kattrali/redcar-rubymotion.git rubymotion

#upgrade
$ cd ~/.redcar/plugins/rubymotion
$ git fetch origin && git checkout 0.8

多少、もっさり感はありますが… Javaやからかな?

今から色々触っていくよ

2012年9月23日日曜日

RubyMotionでWeb APIからJSONファイルを取得してみた

( ̄(エ) ̄)彡☆

RubyMotionでWeb APIを叩いてJSONファイルを取得ヘ(^o^)ノ

BubbleWrapが便利→BubbleWrap-GitHub

でも、RubyMotion1.24では動かない…

んじゃ、スクラッチで実装すればイイじゃね?

って事で、サンプルコードを書いてみたヽ(´ー`)ノ

app/app_delegate.rb
class AppDelegate
 def application(application, didFinishLaunchingWithOptions:launchOptions)
  #connpass api
  url = "http://connpass.com/api/v1/event/?keyword=rubymotion"

  Dispatch::Queue.concurrent.async do
    error_ptr = Pointer.new(:object)

    data = NSData.alloc.initWithContentsOfURL(NSURL.URLWithString(url), options:NSDataReadingUncached, error:error_ptr)

    json = NSJSONSerialization.JSONObjectWithData(data, options:0, error:error_ptr)
    
    #JSONファイルの内容を表示
    p json
  end
  true
 end
end

rakeするとコンソールにJSONファイルの内容が表示されたはず♪

RubyMotionではAPI を直接叩けるのでホントに便利ヽ(´ー`)ノ

2012年9月21日金曜日

RubyMotion1.24のアップデートがすごかった

( ̄(エ) ̄)彡☆

Mac OS Xの10.8.2、Xcode4.5がリリースされました。

RubyMotionも1.24にアップデートヘ(^o^)ノ

@watson1978さんがRubyMotionコミッタの一員になって初のアップデートの内容がすごい!

Retina Displayに対応
$ rake retina=4   # starts the 4-inch simulator (iPhone 5)
$ rake retina=3.5 # starts the 3.5-inch simulator (iPhone 4S and older)

Device Debugが可能に
$ rake simulator debug=1
$ rake device debug=1

‎= RubyMotion 1.24 = 

* Added support for the GM version of the iOS 6 SDK.
* Added support for the iPhone5 architecture (armv7s).
* Added new values for the `retina' option of `rake simulator': `3.5' (for
iPhone4) and `4' (for iPhone5). A `true' value will default to `3.5' in
case the simulator target is lesser than 6.0, otherwise, `4' will be used.
* Added debugging support (experimental) for both simulator and device.
Simply set the `debug' parameter to any value to attach the debugger
(ex. `rake debug=1' for simulator and `rake device debug=1' for device).
The Ruby code compiles with relevant DWARF metadata and the debugger
used is gdb. Note that the debugger experience is a work in progress and
will be significantly improved in future releases.
Check out http://www.rubymotion.com/developer-center/articles/debugging
* Fixed the `development' mode to not compile with LLVM optimizations. This
results in faster compilation times and also better debugging support,
but the code might run a bit slower. The `release' mode builds with the
entire optimization passes.
* Added to the build system the `mode' option which can be used to specify
the build mode, either `development' (default) or `release'. You can now
test your app in release mode by using `rake mode=release' for simulator
and `rake device mode=release' for device.
* Fixed the build system not to execute the user-defined application setup
block twice, which is no longer necessary with the new `mode' option.
* Removed the `archive:development' and `archive:release' tasks which are
no longer necessary with the new `mode' option.
* Added the `archive:distribution' task which builds an .ipa with distribution
settings (certificate, default entitlements, symbols stripped).
* Fixed `rake spec' to produce an .app bundle that uses a different bundle
identifier than the regular app. This is necessary in Xcode 4.5 to avoid
simulator installation issues.
* Fixed a bug in the simulator launcher when output to stdout would not be 
displayed in case the rake process was piped to another process
(ex. `rake spec | ...').
* Added the Dispatch.once method, which wraps the dispatch_once() function,
that can be useful to implement singletons. Usage: Dispatch.once { ... }.
* Added support for `define_method'. Like `attr_*', it cannot be used to 
overwrite existing Objective-C methods due to limitations of the compiler.
* Fixed a bug when converting Bignum objects into 'long long' types.
* Fixed a bug in the build system where relative source paths pointing to the
parent directory would not properly be expanded and would trigger build
failures.
* Fixed several bugs in String#% related to arguments and precision format.
* Improved String#[]= performance. 50 times faster.
* Improved String#length performance with multibyte characters. If String
includes multibyte characters, its length will be cached and reused.
500 times faster.
* Improved String#reverse performance with ASCII-compatible string. 30 times
faster.
* Improved Fixnum/Float modulo performance. 2 times faster.
* Fixed memory leaks in String#{reverse, reverse!}
* Fixed a bug when calling a method on an uninitialized Regexp object.
(ex. Regexp.allocate.to_s).
* Fixed a bug when calling NSArray#flatten(level) with 0.
* Fixed bugs in NSArray#rindex, NSArray#values_at, NSArray#values_at,
NSDictionary#values_at and Kernel.#sprintf which could raise uncatchable
exceptions.
* Fixed a bug in Dispatch::Source.timer which couldn't handle the
Dispatch::TIME_FOREVER constant for interval.
* Fixed a bug in NSArray#delete_if where nil could not be returned if the
receiver did not change.
* Added the following methods: NSArray#rotate, NSMutableArray#rotate!,
NSMutableArray#sort_by!, NSMutableArray#select!, NSMutableArray#keep_if,
NSMutableDictionary#select!, NSMutableDictionary#keep_if.

まさに盛りだくさんヽ(´ー`)ノ

業務アプリでも使ってこかな…

2012年9月20日木曜日

RubyMotion タブバー

( ̄(エ) ̄)彡☆

RubyMotionでタブバーを実装してみる

RubyMotion Tutorialはコチラ→RubyMotion Tutorial

app/app_delegate.rb
controller.tabBarItem = 
 UITabBarItem.alloc.initWithTabBarSystemItem(UITabBarSystemItemFavorites, tag: 1)

カスタムアイコンを使ってみる

app/app_delegate.rb
controller.tabBarItem = 
 UITabBarItem.alloc.initWithTitle('HOME', image:UIImage.imageNamed('home.png'), tag: 1)

connpass用のアプリを作ってるので完成したらGitHubでも公開するよーヘ(^o^)ノ

2012年9月19日水曜日

Ruby Arrayクラス

( ̄(エ) ̄)彡☆

Arrayクラスってメソッド沢山あるので…

例えば…
p Array.new(5) {|i| i }

ary[0..2] = ["a", "b"]

面白いのがこのあたりヘ(^o^)ノ
p [1, 2, 3] * 3  #=> [1, 2, 3, 1, 2, 3, 1, 2, 3]
p [1,2,3] * "," #=> "1,2,3" #self.join(times)と同じ挙動
p([1, 2, 1, 3, 1, 4, 1, 5] - [2, 3, 4, 5]) #=> [1, 1, 1, 1]

【assoc(key)】
配列の配列を検索して、その 0 番目の要素がkeyに等しい最初の 要素を返す。
ary = [[1,15], [2,25], [3,35]]
p ary.assoc(2) #=> [2, 25]

【compact】
nilを取り除いた配列を返す。
ary = [1, nil, 2, nil, 3, nil]
p ary.compact   #=> [1, 2, 3]

【delete_at】
指定した位置の要素を削除してくれる。
array = [0, 1, 2, 3, 4]
array.delete_at 2
p array #=> [0, 1, 3, 4]

【delete_if】
真になった要素を取り除いた配列を返す。
array = [30,100,50,80,79,40,95]
array.delete_if {|x| x < 80} #=> [100, 80, 95]

他にも沢山あるお→Arrayクラス

Rubyってホントに楽しい!

Railsもそうだけど、やりたい事をコードに表現できるのが良い。

2012年9月11日火曜日

Rails ActiveRecord Query

( ̄(エ) ̄)彡☆

Rails 【モデル】リレーションでView側にもUserNameを表示してみた

views/microposts/index.html.erb
<% @microposts.each do |micropost| %>
    <%= micropost.content %>

    <%= micropost.user_id %>

    <%= micropost.user.name %> ← コレ追加

    <%= link_to 'Show', micropost %>

    <%= link_to 'Edit', edit_micropost_path(micropost) %>

    <%= link_to 'Destroy', micropost, method: :delete, data: { confirm: 'Are you sure?' } %>

<% end %>

無事表示されたけど…

logをみてると1レコード毎にselect文を発行してUserデータを取得してるやん!

Processing by MicropostsController#index as HTML
  Micropost Load (0.1ms)  SELECT "microposts".* FROM "microposts" 
  User Load (0.1ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
  User Load (0.1ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 2 LIMIT 1
  Rendered microposts/index.html.erb within layouts/application (3.5ms)
Completed 200 OK in 9ms (Views: 7.7ms | ActiveRecord: 0.4ms)

これではレスポンスが悪くなるので修正

試してみる!

まずは、find_by_sqlを使ってみる

早くなった!

でも、なんかクエリ書くのイヤwww

Railsリファレンス(Active Record Query)を見てみると…

includesメソッドなるものが!

標準ではリレーションデータは後読みらしい(なんでか知らんが…)

controllers/microposts_controller.rb
def index
    #@microposts = Micropost.all
    @microposts = Micropost.includes(:user) ← こんな感じに修正
    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @microposts }
    end
end

Processing by MicropostsController#index as HTML
  Micropost Load (0.1ms)  SELECT "microposts".* FROM "microposts" 
  User Load (0.1ms)  SELECT "users".* FROM "users" WHERE "users"."id" IN (1, 2)
  Rendered microposts/index.html.erb within layouts/application (3.9ms)
Completed 200 OK in 8ms (Views: 7.9ms | ActiveRecord: 0.3ms)

うん、レスポンスが良くなったが…

IN句でクエリー2つ走ってるのがなんか納得いかんなー(´・ω:;.:...

2012年9月10日月曜日

Rails 【モデル】リレーション

( ̄(エ) ̄)彡☆

Rails3でのリレーション

Rails モデルリレーションよりほんの少しだけ突っ込んでみる(ホントに少しw

Micropostのedit viewでコードを入力してるけどselect boxを使って選択できるようにする

views/microposts/_form.html.erbに以下を追加
<%= f.label :user_id %>

<%= f.select :user_id, User.all.map { |e| [e.name, e.id] } %>

以上!

これでselect boxで選択する事ができるよヾ(。╹◡╹。)

index viewを見るとuser_idの値が変更されてるのが確認できます

選択ボックスのリファレンスはこちら

簡単でしょ?www

2012年9月6日木曜日

Rails CSVインポート

( ̄(エ) ̄)彡☆

まずViewでCSVファイルをアップロード出来るようにする
file_field_tagを使うー
<%= form_tag files_path, :multipart => true do %>
  ファイルを選択して下さい:(*.csv)
  <%= file_field_tag 'upload_file' %>
  <%= submit_tag "アップロード", :confirm => "ほんまにアップロードする?" %>
<% end %>

コントローラはこんな感じかな?
def create
  require 'csv'

  if params[:upload_file].blank? == false
    reader = params[:upload_file].read

    CSV.parse(reader) do |row|
      file = File.new
      file["field_name"] = row[0]
      file.save
    end
  end
end

Ruby1.9.xではFasterCSVはCSVライブラリへ組み込まれてましたー

知らなかった… ヽ(`д´;)/  うおおおお!?

ほんでHerokuへpushしてルンルン♪ ポチっ♪

UTF-8 が(´△`)ホゲ(´△`)ホゲー!(Errorメッセージ略w)

確認!
$ heroku config

LANG                => en_US.UTF-8

これだね…

なのでヽ(´ー`)ノ
$ heroku config:add LANG=ja_JP.UTF-8

変わらずw
なのでヽ(´ー`)ノ
$ heroku config:remove LANG

もう一回
$ heroku config:add LANG=ja_JP.UTF-8

でけたわ‘`,、(’∀`) ‘`,、

2012年9月3日月曜日

Rails 【Active Record】

( ̄(エ) ̄)彡☆

Rails 3.2.8

データベース作成
$ rake db:create

データベース削除
$ rake db:drop

ぜーんぶ取得
$ Members.all

id列だけ取得
$ Members.all.map(&:id)

id = 1を取得
$ Members.find_by_id(1)

id = 1 && name = "Murajun"
$ Members.find_by_id_and_name(1, "Murajun")

カラムの値が一致するレコード全てを取得
$ Members.find_all_by_admin(1)

ファインダーメソッドを使った検索
$ Members.where(name: "Murajun").order("id DESC")

name列だけ
$ Members.where(admin: 1).map{ |m| m.name }

ここに色々かいてある

Rails 【Active Record】

Rails 【View】部分テンプレート

( ̄(エ) ̄)彡☆

Rails 3.2.8

Railsでフッターを統一したい場合

/views以下に例えばshareフォルダを作成して
この中に部分テンプレートを作成する事にする

/views/layout/application.html.erb

<body>
<%= yield %>
<!--追加-->
<div id="footer">
<%= render "share/footer" %>
</div>
<!--ここまで-->
</body>

/views/share/_footer.html.erb

Copyright (C) <%= link_to "XXX Inc.", "http://www.example.com/" %> 2007-2012


全てのページに"Copyright (C) XXX Inc. 2007-2012"って表示されるはず

ページ毎に変更したい場合
<%= render "footer" %>


Rails 【View】リンク

( ̄(エ) ̄)彡☆

Rails 3.2.8

Railsのビューでリンクヾ(。╹◡╹。)

<%= link_to "HOME", root_path %>

HOME ←こんなふうに表示されるよね

こうすれば…

<%= link_to_unless_current "My Page", mypage_path %>

HOME
My Page ←こんなふうに表示される

link_to_unless_currentメソッドを使えば、リンク先が現在のページなら文字だけ表示してくれるよー


2012年8月31日金曜日

Rails モデルリレーション

Railsでモデルのリレーションを設定

Usersテーブル
id: interger
name: string
email: string

Userモデル
class User < ActiveRecord::Base
  attr_accessible :email, :name
  has_many :microposts
end

Micropostsテーブル
id: interger
content: string
user_id: integer

Micropostモデル
class Micropost < ActiveRecord::Base
  attr_accessible :content, :user_id
  belongs_to :user
  validates :content, :length => { :maximum => 20 }
end

コードはRuby on Rails Tutorialより拝借(▰╹◡╹)

すごく丁寧な説明でわかり易い!

まぁ、こんなコンテンツあるの今日気づいたんだけどね…(つд⊂)エーン

これでUsersテーブルのidがMicropostsのUser_idを参照するようになったはず…

コンソールでチェックしてみよ
$ rails console
> first_user = User.first
user 05:54:54="05:54:54" 2="2" bar="bar" created_at:="created_at:" email:="email:" example.com="example.com" foo="foo" id:="id:" name:="name:" updated_at:="updated_at:"

> first_user.microposts
Micropost id: 1, content: "first microports", user_id: 2, created_at: "2012-08-31 06:26:42", updated_at: "2012-08-31 06:40:54">, micropost 06:57:15="06:57:15" 2="2" 4="4" content:="content:" created_at:="created_at:" id:="id:" microports="microports" pre="pre" second="second" updated_at:="updated_at:" user_id:="user_id:"

最近、チュートリアルやリファレンスを見るようにしてる

より理解が深まるよ

是非参考にしてください

ここ→Ruby on Rails Tutorial book Ruby on Rails Tutorial book (日本語)

( ̄(エ) ̄)彡☆

2012年8月28日火曜日

Rails ルーティング

基本系?
get "test" => "test#index"

/testパスとtestコントローラのindexアクションと紐付け

asオプションでルーティングに名前を付けると…
get "test" => "test#index", as: "test"

コントローラやビューからtest_pathみたいに呼び出せる
また、link_to、redirect_toメソッドではシンボル(:test)でパスを指定できるよー

特定のパスに対するアクションを指定する場合
match "test1" => "test#index"

postに限定したい場合
post "test" => "test#index"

パラメータを埋め込む場合
get "test/:name/:address" => "test#index"

ポイントはgetpostを理解して使い分けることー

セキュリティ上、絶対getじゃないダメってことはない

postじゃないとダメな場合もある

( ̄(エ) ̄)彡☆

2012年8月27日月曜日

Ruby 繰り返し処理

( ̄(エ) ̄)彡☆

timesメソッド
i = 1
10.times.do |i|
 print i, "\n"
end

uptoメソッド
1.upto(10) do |i|
 print i, "\n"
end

downtoメソッド
10.downto(1) do |i|
 print i, "\n"
end

eachメソッド railsでお馴染み(´▽`)
colors = ["red", "green", "blue"]
colors.each do |color|
 puts color
end

while文
i = 0
colors = ["red", "green", "blue"]
while i < colors.length
 puts colors[i]
 i += 1
end

for文
colors = ["red", "green", "blue"]
for color in colors
 puts color
end

Ruby case文

Rubyのcase文です( ̄(エ) ̄)彡☆

おみくじアプリ(Ruby1.9.3-p194)

omikuji.rb
num = rand(10) #0〜9の整数をランダムに取得
case num
when 0 
 puts "大吉"
when 1..3 #「..」なら1〜3
 puts "中吉"
when 4...6 #「...」になると4〜5
 puts "吉"
when 6..7
 puts "小吉"
when 8
 puts "凶"
else
 puts "大凶"
end

結果(。╹◡╹。)

$ ruby omikuji.rb #=> 凶

ちなみに…変数のクラスオブジェクトの比較とかもできる

aisatsu = "おはよう"
case aisatsu
when String
 puts "Stringオブジェクトオブジェクト"
end

2012年8月19日日曜日

TextMate2がOSSと聞いて…

TextMate2のバイナリーはGitHubから

TextMate-Download

環境
Mac OS X 10.8.1


RVMを使用している場合

1.9.3の場合(gemsetを利用の場合は1.9.3@railsな感じもオケ)
$ rvm wrapper 1.9.3 textmate
$ which textmate_ruby

TextMateのPreferences→Variables















TM_RUBYを追加して、Value値にtextmate_rubyのパスをセット

これでオケヾ(。╹◡╹。)

前は日本語対応されてなくて TextMate2IMFixなるものがあったみたいだが、OSSになってアップデートの頻度がすごく早く、日本語対応も早々に対応されてたー

後はRubyの補完がalt+escに割り当てられてすごくウザかったのでcontrol+tabに変更

全体的にいい感じだと思う

sublime text2がえらく盛り上がってるが、TextMateもOSSになってかなり頻繁にアップデートされているので目が離せませんぞ〜

でわ( ̄(エ) ̄)彡☆

2012年7月22日日曜日

第一回 RubyMotion 勉強会

このイベントのイメージ画像

参加してきましたーヾ(。╹◡╹。)

主催者の@satococoaさん

発表資料→RubyMotion は誰得?

MacRubyコミッタの@watson1978さん

発表資料→Differences CRuby/MacRuby/RubyMotion

LTは
@pchwさん

@haraken3さん
発表資料→SublimeRubyMotionBuilderの紹介

@mah_labさん

やはりみなさんレベル高かったですねー

モチベーションが一気に上がりました

とても勉強になったし、RubyMotionでアプリを作っていきます (`・ω・´)キリッ

やっぱりRubyで書けるメリットはとても大きい

ObjC力もつくので一石二鳥???ですw

第二回も開催してほしいな><

参加者、関係者のみなさんおつかれさまでした( ̄∇ ̄)

でわ( ̄(エ) ̄)彡☆

2012年7月21日土曜日

MetroStyleハッカソン 2Days

20120721_v1_original

MetroStyleハッカソン 2Daysに参加してきましたーヾ(。╹◡╹。)

スライドショー

いぬねこ写真館 from murajun1978

ハッカソンは初めての参加…

不安でいっぱいでしたが、なんとか形になりましたー

チームみんなで作っていく工程が楽しかったです^^

僕のWebカメラが実装されていれば1位とれたかもなー><

予習不足…_| ̄|○

チームいぬねこは2位でした

アプリは完成していないので、完成目指して「チームいぬねこ」は突き進みますwww

ハッシュダグもできたし→ #いぬねこ

参加されたみなさん、関係者のみなさんホントにお疲れ様でした♪

また参加したいですね( ̄ー ̄)ニヤリ

でわ( ̄(エ) ̄)彡☆