rubyでWake-on-LANのマジックパケットを送信する

電源停止状態からのWake-on-LANに非対応だと思ってた自宅のPCがBIOSアップデートしたら対応になってたので。

require 'socket'

def wake(mac)
  #メッセージの生成
  #FFを6回
  mes = ['FF'].pack('H2') * 6
  #続けて MACアドレスを 16回
  mes << mac.split(':').pack('H2H2H2H2H2H2') * 16

  #UDPソケットを生成
  s = UDPSocket.new
  #ブロードキャストの送信を有効化
  s.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)
  #メッセージの送信
  s.send(mes, 0, '<broadcast>', 7)
end

#MACアドレスを指定
wake('**:**:**:**:**:**')

宛先のポート番号については7とか9とか2304とか説明されてるけど、到達さえすれば何番でもいいっぽい。

kaminari でトータルページ数を知る方法

ページネーションを行ってくれる kaminari でトータルページ数(最大ページ数、最終ページ数)を知る方法が分からなかった。調べたら PageScopeMethods に num_pages ってのがあった。ちょっと分かり難い名前のような。

AR.page.per(20).num_pages

とか

<%= @entries.num_pages =>

みたいな。現在のページは current_page でいける。

railsでiphone対応をする基礎知識的な

jQueryMobileを使って 簡単にRuby on RailsサイトをクールなiPhone対応サイトにしてみた - @yuumi3のお仕事日記

上の記事が参考になった。参考にしつつ、やり方を変えてみたりしたところをメモ。

レイアウトの切り替えはrailsに任せる

iphone用のMIME TYPEを定義して、*.iphone.erbが使えるようになったのだから、レイアウトを"iphone"と"application"を振り分けることなどせずに、

app/views/layouts/
|-- application.html.erb
`-- application.iphone.erb

とすればよさそう。なので application_controller.rb でlayoutを設定している部分は削除した。

class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :set_iphone_format

  private

  def set_iphone_format
    request.format = :iphone if iphone_request?
  end 

  def iphone_request?
    request.user_agent =~ /(Mobile.+Safari)/
  end 
end

iphoneで利用するjsやcssiphone用のディレクトリに保存する

参考にした記事では通常用ファイルとiphone用のファイルを同じ場所に置き、通常時にiphone用ファイルの読み込みを防ぐためにrequire_treeを削除していた。require_treeはサブディレクトリを含めた全てのファイルを読み込んでしまうが、require_directoryを使用すればサブディレクトリは読み込まれないので、iphone用のファイルはサブディレクトリに保存することにしてみる。

css
assets/stylesheets/
|-- application.css
`-- iphone
    |-- application.css
    |-- images
    |   |-- ajax-loader.png
    |   (略)
    `-- jquery.mobile-1.0.1.css

app/assets/stylesheets/application.css

/*
 *= require_self
 *= require_directory .
*/

app/assets/stylesheets/iphone/application.css

/*
 *= require_self
 *= require_tree .
*/
js
assets/javascripts/
|-- application.js
`-- iphone
    |-- application.js
    `-- jquery.mobile-1.0.1.js

app/assets/javascripts/application.js

//= require jquery
//= require jquery_ujs
//= require_directory .

app/assets/javascripts/iphone/application.js

//= require jquery
//= require jquery_ujs
//= require_tree .
レイアウトでiphone用ファイルを指定

app/views/layouts/iphone.iphone.erb

(略)
<%= stylesheet_link_tag "iphone/application" %>
<%= javascript_include_tag "iphone/application" %>
(略)

これで通常用のファイルとiphone用のファイルの置き場所が分離された。ところで jQueryMobileは本当は vender/assets/javascript に置くべきなのかも。

jQueryMobileが動かない

jquery-railsの現時点の最新バージョンは2.0.2だが、これに入ってるjqueryのバージョンは1.7.2で、こいつだとjQueryMobileの1.0.1が動作しなかった。Gemfileで

gem 'jquery-rails','2.0.1'

2.0.1を指定してやったら、jqueryのバージョンが1.7.1になってこいつだと動いた。

画像の置き場所によるパスの指定方法の違い

public 以下に置いたとき

public以下に置いたファイルを指定するときは、パスを / から始める。ファイルが public/images/foo/bar.jpg なら、

image_tag "/images/foo/bar.jpg"

とする。パスを / から始めることにより、public以下を指定したことになる。

assets/images 以下に置いたとき

パスを / から始めてはいけない。app/assets/images/foo/bar.jpg なら、

image_tag "foo/bar.jpg"

とする。

herokuにRailsアプリをデプロイして遊んだ

herokuで遊んでみたメモ。一通り引っかかった気がする。

sshでpermission deniedとなって git push heroku master 出来ない

heroku keys:add

で public key を登録して解決。本当はherokuコマンドを使った作業の前にあらかじめ、

heroku login

しておくことで、public keyの登録が出来るみたい。
(参考)Getting Started with Ruby on Heroku/Cedar | Heroku Dev Center

heroku keys:clear

でpublic keyの削除。

Gemfile

herokuのDBはPostgreSQL。database.ymlはsqlite3のままでもいけるが、Gemfileは書き換えなければいけない。ローカルではsqlite3だったので、Gemfilesを書き換えて対処。

group :development do
    gem 'sqlite3'
end

group :production do
    gem "pg"
end

ローカルの開発環境ではpgを使用しないので、

bundle install --without production

とすれば、group :production do下のブロックに記述されたgemはインストールされない。herokuにpushした際は、--without development:test で実行されるみたい。

db:migrateを実行し忘れる

heroku run db:migrate

heroku db:push に失敗する

heroku db:push でローカルのDBの内容をアップロード出来る。
(参考)
HerokuでDBのデータをダウンロードしたりアップロードしたり - アインシュタインの電話番号
Importing and Exporting Your Data Using Taps | Heroku Dev Center

が、これが上手くいかない。途中までは進むが、

Taps Server Error: PGError: ERROR:  time zone displacement out of range: "2011-09-25 12:00:00.000000+5893992000"

となってコケる。ぐぐるrubyの1.9.3から発生するようになったらしく、1.9.2なら平気らしい。rvm環境下だったので、1.9.2をインストールしてgemはherokuとtapsだけ入れて再度実行で通った。

アプリの停止

heroku maintenance:on

で、メンテナンスモードへ。

rails gコマンドで生成された.js.coffeeなファイルを.js にリネームしてそのまま使ったらはまった

rails g controller で生成された .js.coffee なファイルを .js にリネーム。CoffeeScriptではなく、普通にJavaScriptで書いた。そして動かない。何故だ。

答。ファイルにCoffeeScript形式のコメント行が残っていたから。

CoffeeScriptを全く使うつもりがないなら、Gemfiles から coffee-railsコメントアウトしておけば、CoffeeScriptは無効化され、rails g controller でも単に.jsなファイルが生成される。もしくは、rails g controller 実行時のオプションに --assets false を指定すればアセットは生成されないので、自分で必要なファイルを新しく開けばいい。まあなんだ。最初からファイル消して、新しく開いていればよかったんだよ。