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やcssはiphone用のディレクトリに保存する
参考にした記事では通常用ファイルと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 を指定すればアセットは生成されないので、自分で必要なファイルを新しく開けばいい。まあなんだ。最初からファイル消して、新しく開いていればよかったんだよ。
hello world!!
プログラムやPCについてメモ書きしていく予定。