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でアクティブなページに対応するタブのスタイル変える場合
タブナビゲーションで現在いるページに対応するタブのみ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の開発環境を整えた時のメモ
ruby、railsの開発環境を整える情報はググれば大量にあるので、簡単なメモ
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 で接続できる様にした。