myapp.herokuapp.comから独自ドメインへリダイレクトする

herokuへ独自ドメインを適用してもmyapp.herokuapp.comのドメインはアクティブであり続ける。
そのため、www.customdomain-example.comのような独自ドメインを登録したあとでも、myapp.herokuapp.comでもアプリケーションへアクセスできるので、独自ドメインへリダイレクトするようにしてみる。

# application_controller.rb
# -----------------略-------------------
before_filter :redirect_to_custom_domain

private
def redirect_to_custom_domain
    if request.host == "myapp.herokuapp.com"
        redirect_to "www.customdomain-example.com"+request.path, :status => 301
    end
end

とすると、myapp.herokuapp.com/example/hogeのようなアドレスにアクセスした時も、独自ドメインへリダイレクトできるようになる。

これがRails的にもheroku的にもSEO的にも正しいかどうかは調べてない

Railsでアクティブなページに対応するタブのスタイル変える場合

タブナビゲーションで現在いるページに対応するタブのみcssを適用したい場合、application_helper.rbか、viewに直書きするかのどっちかで実装されてることが多いよう

例えばトップページにいる場合

<!-- # application.html.erb -->
<ul class="nav">
     <li class="item active">TOP</li>
     <li class="item">PROFILE</li>
     <li class="item">LINKS</li>
</ul>

こんな感じで.activeを付け加えたい。

application_helper.rbに書く場合

# application_helper.rb
def active?(controller_name)
     return "active" if controller_name == params[:controller]
end
<!-- # application.html.erb -->
<ul class="nav">
     <li class="item <%= active?("articles") %>">ARTICLE</li>
     <li class="item <%= active?("profile") %>">PROFILE</li>
     <li class="item <%= active?("links") %>">LINKS</li>
</ul>


viewに直書きする場合

<!-- # application.html.erb -->
<ul class="nav">
     <li class="item <%= "active" if params[:controller] == "articles" %>">ARTICLE</li>
     <li class="item <%= "active" if params[:controller] == "profile" %>">PROFILE</li>
     <li class="item <%= "active" if params[:controller] == "links" %>">LINKS</li>
</ul>


application_helper.rbに書く方がいいのかな?

またarticleに添付されたファイルを扱うarticle_attachmentsコントローラのアクションの場合でもARTICLEタブに.activeをふりたいような場合、viewに直書きすると見づらくなってよろしゅうないということで、active?メソッドを

# application_helper.rb
def active?(*controllers_name)
     return "active" if controllers_name.include?(params[:controller])
end

として任意の数のcontroller名を受け取れるようにして、params[:controller]が含まれているかいないかで判定するようにすると、

<!-- # application.html.erb -->
<ul class="nav">
     <li class="item <%= active?("articles","article_attachments") %>">ARTICLE</li>
     <li class="item <%= active?("profile") %>">PROFILE</li>
     <li class="item <%= active?("links") %>">LINKS</li>
</ul>

割と見やすい気がする。
「ルーティングの特定のネームスペース以下のものだけこういう処理」みたいなのができるようであれば、それが一番簡単にかける気もする…

しばらくRailsとはお別れして、androidやる日が続きそう。
「Land of Lisp」とか「Rubyによるデザインパターン」とか「入門 機械学習」買ったのに積んでるからそれも読まんと…

HttpClientについてのメモ

androidでネットワーク通信をするときHttpCientを利用しているのだが、基本コピペですませていたので基本的な部分を少し調べてみた。

HttpClientは以下の様なステップでレスポンスを取得する。
1.HttpClientのインスタンスを作る
2.Httpメソッドのうちから適当なものを選び、インスタンスを作る。接続するURLはコンストラクタに渡される
3.HttpClientに2で作ったインスタンスを渡し実行
4.レスポンスを得る
5.コネクションを開放する
6.レスポンスを処理する
(エラーを考慮しないとこのような流れとなるらしい。)

・実行したメソッド(例えばGETやPOST)などはフリーズするなどして接続が終了するまで接続を待ち続けるため、この5にあたるコネクションの開放はエラーの有無に関わらず忘れてはならない。

・また、3の部分ではHttpExceptionやIOExceptionを考慮し例外処理を記述しなければならない。(3で投げられる例外はこの二つらしい)

・HttpExceptionはリクエストを送る事ができなかったり、HTTPの仕様から外れていたためレスポンスが処理されなかった場合。
・IOExceptionは一度きりのI/Oの問題が起こった場合であることが多い。
(リクエスト自体に問題がある場合はHttpException、何らかの問題によって一時的に通信が失敗している場合はIOExceptionという事なのかな?)

・デフォルトのHttpClientではIOExceptionが投げられた場合、3回まで正常な通信を試みる。このリトライの設定はカスタマイズできる。

(参考:http://hc.apache.org/httpclient-3.x/tutorial.html )

基本的な部分はこんなところらしい。
簡単な英語でもライブラリの仕様や使い方読むの辛い…

androidでアルファチャンネル付きのjpegをdecodeStreamするとnullが返ってくる?

web経由で画像をダウンロードしようと思い、以下のようなコードを書いた。

URL imageUrl = new URL("URL");
InputStream imageIs = imageUrl.openStream();
image = BitmapFactory.decodeStream(imageIs);
imageIs.close();

大抵の画像は取得できるものの、10枚中1枚ほどimageがnullになる問題に悩まされていた。
LogCatにはこのような文が。

09-18 20:02:52.957: D/skia(8343): --- decoder->decode returned false

問題をググってみるが、

InputStream imageIs = imageUrl.openStream();

の部分の書き換えが主で解決しなかった。

ならばと思い、取得失敗したものと、成功したもののを見比べてみると、失敗したものはアルファチャンネル付きのjpegであった。(アルファチャンネルは付いていなかったが色空間がRGBではないものも取得失敗しているケースがあった。)

いずれにせよ、decodeStream時にアルファチャンネルや色空間が原因でデコード失敗してるのかなぁ…

追記


http://stackoverflow.com/questions/5626795/how-to-get-a-bitmap-from-a-raw-image
これを見るとandroidのBitmapは「グレースケールのBitmapには対応していない」「アルファ要素を0にしろ(?)」と書いてある。
そもそもjpgがアルファチャンネルに対応してないこともわかった。
ListViewに画像を表示するつもりだったので、imageがnullだった時に、何かしらの画像に差し替える事で応急処置。

フォルダ内の画像をRMagickでリサイズした時のメモ

画像をリサイズしたかったので、RubyのRMagickを使ってやってみた。
まずは

brew install imagemagick

ImageMagickをインストール。
その後ImageMagickのラッパーライブラリのRMagickをgem install

gem install rmagick

あとはresize.rbを以下の様にして実行

require 'rmagick'
//フォルダにある画像のパスを配列で取得(.jpgのみ)
filename = Dir.glob('任意のフォルダ/*.jpg')
//今回は元の画像に上書き保存し、サイズは160*160
filename.each do |name|
  original = Magick::Image.read(name).first
  image = original.resize(160, 160)
  image.write(name)
end

もっと楽な方法があると思うけど、さくっと書いてさくっと成功すると嬉しい…

centosでruby、railsの開発環境を整えた時のメモ

rubyrailsの開発環境を整える情報はググれば大量にあるので、簡単なメモ


1.rvmを入れrubyをインストール
http://cloud-berry.jp/wordpress/?p=181



2.railsをインストール
上記のページの通り行いrubyのインストールはうまくいった。
しかしrailsをインストールしようと

# sudo gem install rails
sudo: gem: command not found

となってしまう。
ググってみた所解決法が見つかった。
http://ruby.about.com/od/rubyversionmanager/qt/Rvm-And-Sudo.htm
どうやらsudo gem コマンドはrvmの環境を含んでいないため実行できないらしい。
そのため、"sudo gem"のかわりに"rvmsudo"コマンドを使うことでgemコマンドが使える様になる。

# rvmsudo gem install rails

railsのインストール完了。


3.railsでテストプロジェクトを作ってみる
railsのインストールが終わったので下記のコマンドを実行してみる。

#rails new test_app

するとsqlite3がインストールされていないため怒られる。

checking for sqlite3.h... no
sqlite3.h is missing. Try 'port install sqlite3 +universal'
or 'yum install sqlite-devel' and check your shared library search path (thelocation where your sqlite3 shared library is located).

とあるので

# sudo yum install sqlite-devel


そのあと先ほど作ったテストプロジェクトのディレクトリで

# bundle install


問題が無ければsqliteのgemがインストールされる。

これでrailsの基本的な開発環境は整った。vimの設定ファイルなどをサーバー側に移してローカルの開発環境に近づけていきたい…

さくらvpsの初期設定メモ

サーバーの環境構築もやってみたいなと思い、月々千円弱で借りられるさくらvps1Gを契約した。
個人情報をあれこれ入力して申し込み、VPSコントロールパネルのリモートコンソールにて初期設定。その際にやった事をメモ。

登録完了後しばらくするとさくらインターネットから仮登録完了(現在二週間お試し期間中のため仮登録、2週間後自動で本登録へ移行するらしい)のメールが来る。
このメールには管理用のユーザ情報(最初にリモートコンソールでログインするためのユーザ名rootと初期パスワード)などが記載されている。
メールに記載されたrootとパスワードを入力しリモートコンソール上でログインした後、作業用ユーザを作成する。
まずは管理者rootのパスワードを変える。

#passwd


これで新しいパスワードを打ち込んで変更。

# adduser 作成するユーザー名
# passwd 作成するユーザー名


と打ち込むとパスワードは何にするか聞かれるのでrootのパスワードを変えた時と同じ様にする。

次はSSH接続のための設定を行う。しかしそもそもSSHが何かよくわかっていないので少しだけ勉強する。
http://www.adminweb.jp/web-service/ssh/index4.html

サーバー側の/etc/ssh/sshd_config でsshの接続に関する設定を行う。
その際は下のURLを参考にさせていただいた。

http://www.adminweb.jp/web-service/ssh/index8.html

まずはクライアント側で

# ssh-keygen


で鍵を作る。

そして作成した鍵の公開鍵(id_rsa.pub)をscpコマンドでサーバーへ送る

# scp id_rsa.pub [username]@[IPアドレス]:~/

先ほどサーバーに転送された公開鍵を適切な所へ移動させるため

# mkdir .ssh
# mv id_rsa.pub .ssh

そして.sshディレクトリ内にauthorized_keysというファイルを作る。
authorized_keysの中身は公開鍵と同じにする。
/etc/ssh/sshd_configに記述されている

#AuthorizedKeysFile

.ssh/authorized_keys
からわかる様に、sshサーバーは.ssh/authorized_keysへ公開鍵を求めて探しにいく。

# cp id_rsa.pub authorized_keys

そしてsshサーバーを再起動

# service sshd restart

# ssh ユーザー名@ドメインまたはIPアドレス (-p ポート番号)

で接続テストをして繋がったら終了!
ついでに~/.ssh/configを編集して # ssh sakura で接続できる様にした。


rubyrailsの環境構築も近いうちにメモするかも…