The net is vast
プログラミングや、コンピュータなどの備忘録です。 主にRuby, Java, Linux, 等を扱います。アルゴリズムも扱いたいな。
23:08

[Play2.0][Java] アクションの実行にログインを要求する方法

Category: , By jx
さて、PlayFramework2.0を勉強し始めました。今、Scalaを勉強しつつPlay2.0をJavaで利用しようとしています。そこで色々勉強していますが、今回はアクションの実行にログインを要求する方法を書いてみます。

play.mvc.Security.Authenticatedアノテーション

ログインを要求するためにはplay.mvc.Security.Authenticatedアノテーションをメソッドに追加します。こうするとログインしているかどうかを確認する事が出来ます。ログインしているかどうかは、play.mvc.Security.Authenticatorでチェックされます。ソースコードを見てみると分かるのですが、sessionにusernameという値が含まれているかどうかをチェックしています。
    /** 
     * Handles authentication.
     */
    public static class Authenticator extends Results {
    
        /** 
         * Retrieves the username from the HTTP context; the default is to read from the session cookie.
         *
         * @return null if the user is not authenticated.
         */
        public String getUsername(Context ctx) {
            return ctx.session().get("username");
        }   
    
        /** 
         * Generates an alternative result if the user is not authenticated; the default a simple '401 Not Authorized' page.
         */
        public Result onUnauthorized(Context ctx) {
            return unauthorized(views.html.defaultpages.unauthorized.render());
        }   
    
    }

ログインの判定をカスタマイズする

play.mvc.Security.Authenticatedアノテーションにはvalueのデフォルト値としてSecurity.Authenticatorが設定されていますので、ここの値を変更する事で挙動を変更する事が出来ます。下のようなクラスを作成して、play.mvc.Security.Authenticatedの引数として指定すれば、このクラスが認証のチェッククラスとして動作します。
public class Auth extends Security.Authenticator {
 @Override
 public String getUsername(Context context) {
  String user = context.session().get("userName");
  return "admin".equals(user) ? user : null;
 }

 @Override
 public Result onUnauthorized(Context arg0) {
  return redirect(routes.Application.loginForm());
 } 
}
  @Authenticated(Auth.class)
  public static Result index() {
    return ok(index.render("Your new application is ready."));
  }
 
6:42

VMのシンプロビジョニングの謎 sparse file

Category: By jx
KVMなどを触っているとシンプロビジョニングを行えるqcow2等のフォーマットのファイルによく出くわします。lsをしてみると、40Gのファイルが出来ていたりするのですが、実際には4Gくらいしか使っていません。今までどういう仕組なのかわからなかったのですが、これはsparse fileという名前で実際に書きこまれていない領域は確保しないという仕組みのようです。作り方は簡単で、Rubyで書くと次のようになります。
open('a.txt', 'w') do |f|
  f.seek 10000000
  f.puts 'a'
end
つまり、実際に書き込まずseekすれば良いということですね。ちなみにこういうファイルをコピーするときにはちゃんと気をつけてコピーしてあげなければいけません。cpコマンドは良きに計らってくれるようですが、rsyncについて自分で指定してあげないといけないのだとか。
rsync --sparse
tarでもまとめるときにも余分な部分を削除して通常ファイルを作ってくれます。
tar --sparse
これでVMのシンプロビジョニングも怖く有りません。
 
14:01

git cleanで追跡されていないファイルを削除する

Category: By jx
gitで途中までファイルを追加してしまったんだけど、元に戻したいときってありますよね?
そういうときはgit clean。
追跡されていないファイルを奇麗に削除してくれます。

ただし、オプションで -f をつけないと削除してくれません。

git clean -f
 
0:00

dreamhost(linux) + rsyncで差分バックアップをする方法

Category: By jx
中学校の頃からデジカメで写真を撮ってきて、バックアップをろくにとっていませんでした。いつもバックアップしようと思うのですが、当時はCD-Rに入りきらないし、DVD-Rがでてもその頃にはDVD-Rにも入りきらない状態でした。だからいつも億劫になってしまってバックアップを取ってこなかったのです。

それじゃまずいだろということで、さすがに良い歳にもなったのでそろそろまじめにバックアップを考えました。調べてみると最近はいろいろと手段があるようでした。WebサービスであればDropboxが有名ですが、これは容量制限が結構小さいので無理ですし、最近でてきたトレンドマイクロ オンラインストレージ SafeSyncもあまり使い勝手が良くないようです。

ここは、技術者の端くれとしてバックアップスクリプトを自分で書くのだということで、調べているとrsyncがバックアップしてくれるらしい記述を発見。--link-destというオプションをつけると、差分バックを取ってくれるようです。仕組みは意外とシンプルで、linuxの仕組みを使っていて感心しました。

ext2系のファイルフォーマットではi-nodeという仕組みでファイルを管理しています。ハードリンクを使うと同じi-nodeを指し示す別名のファイルを作成する事ができるのです。つまり、ファイル名は異なっても指し示しているファイルは同じ物です。つまり、このrsync --link-destを使ってバックアップを使用している限り、任意の時点からの差分バックアップが簡単にとれるのです。

また、私はDreamHostでサーバをレンタルしているのですが、このDreamHostはディスク容量が無制限なので、自由にバックアップする事ができます。しかし、本当に無制限で大丈夫なんでしょうかね?まぁちゃんとunlimited diskと書いてあるのでありがたく使わせてもらいましょう。

肝心のスクリプトですが、こんな感じになりました。これを定期的に実行すればバックアップは完璧ですね!
SOURCE_DIR=~/Documents/backuped
DEST_HOST=user@dreamhost.com
DEST_DIR=/home/user/backup
DATE=`TZ=JST-9 date "+%Y%m%d%H%M%S"`

CURRENT=$DEST_DIR/current
RELATIVE_CURRENT=../current
THIS_TIME=$DEST_DIR/$DATE

rsync -av --delete --link-dest $RELATIVE_CURRENT $SOURCE_DIR $DEST_HOST:$THIS_TIME
ssh $DEST_HOST "rm -fr $CURRENT; ln -s $THIS_TIME $CURRENT"
 
0:52

OSXでRuby1.9.2にバージョンアップしたらgemが動かなかった

Category: , By jx
Snow Leopardのportsでrubyを1.9.1から1.9.2にバージョンアップした。そうしたらgemが動かなくなってしまったんです。
$ gem1.9

/opt/local/lib/ruby1.9/site_ruby/1.9.1/rubygems/source_index.rb:68:in `installed_spec_directories’: undefined method `path’ for Gem:Module (NoMethodError)
from /opt/local/lib/ruby1.9/site_ruby/1.9.1/rubygems/source_index.rb:58:in `from_installed_gems’
from /opt/local/lib/ruby1.9/site_ruby/1.9.1/rubygems.rb:883:in `source_index’
from /opt/local/lib/ruby1.9/site_ruby/1.9.1/rubygems/gem_path_searcher.rb:81:in `init_gemspecs’
from /opt/local/lib/ruby1.9/site_ruby/1.9.1/rubygems/gem_path_searcher.rb:13:in `initialize’
from /opt/local/lib/ruby1.9/site_ruby/1.9.1/rubygems.rb:841:in `new’
from /opt/local/lib/ruby1.9/site_ruby/1.9.1/rubygems.rb:841:in `block in searcher’
from :10:in `synchronize’
<…and so on…>

どうした物かとググってみてたらPreston Lee's Blogに書いてありました。まさに的確な対処法。

要するに以下のコマンドを叩けばよい。ただ下のコマンドはファイルを完全に削除してしまうので注意してくださいね。
sudo rm -rf /opt/local/lib/ruby1.9/site_ruby/

実際に叩いてみるとあっさり動くようになりました。
どうやら以前のバージョンのgemを見てしまうのが問題だそうです。

詳しくはPreston Lee's Blogを参照してください。
 
21:33

自分でWEBサービスを作りたいと思っている人へ(プログラミング経験者)

By jx
とりあえず、こっちに写しておく。
http://anond.hatelabo.jp/20101207002426からの転載

Webサービスを公開するまでの軌跡を語るよ

自分でWEBサービスを作りたいと思っている人へ ( http://anond.hatelabo.jp/20101203150748 ) を読んで、初心者じゃなくてある程度の経験者が作ったらこうなるんだよってことで書いています。でも正直4ヶ月でそこまでできるようになるなんておそらく相当頭がいいんじゃないかなと思うんです。いや、本当に凄いと思う。
まず作ったサービスはグルーポンチケットのまとめサイト。 グルーポンナビ( http://gp-navi.net/ )まず自分のスペックだけど、昔から趣味でプログラムやったり仕事でプログラムしたりしてました。Web系ばっかりやってるいちおうこういうのを作るのには慣れてる方です。
お金使いたくないからHerokuを使う

それで私ですが、まず最初に http://anond.hatelabo.jp/20101203150748 の人と同じで全然お金を使いたくなかったです。だからいろんなホスティング会社を探したりしたんですが、VPSを借りちゃうと大金がかかるんですよね。そこで、いわゆる流行のクラウドであるHeroku( http://heroku.com/ )を使う事にしました。
このHerokuは無料で使えるから良いんですけど、バッチ処理を行うには有料のサーバを契約しなくちゃいけないんです。しかもWebの一回のリクエストは30秒までに押さえなくちゃいけないっていう制限があったりで、正直無料で使うには厳しい。
でもやっぱり無料っていう響きに吸い寄せられてHerokuを使うと決めてアプリケーションを書き始めました。Railsで書いて賞味2週間くらいちまちまと進めてアプリを完成させました。だいたい一日2時間くらいかな。Railsにはそこまで詳しくはなかったけど、Webで検索すれば結構情報がヒットするからそこまでの苦労は無かったです。それよりも制限のあるHerokuでどうやって実現するかというのが、結構問題でした。
でもやっぱり無料じゃ厳しい

それでしばらく運用してました。このときは全然宣伝しませんでしたから、ほとんどページビューはあがらなかったです。宣伝大事。これほんと。それでHerokuで作った仕組みなんですが、無料でやりたかったので、Workersを契約しないでアプリをつくってました。だからWebのリクエストをトリガーとして普通にクロールさせるよう作ったんです。でも、クロールするサイトを徐々に増やしていくと30秒以内にリクエストが終了しなくなってきてさぁ問題。どうしようかと考えたあげく、レンタルサーバもいいなっておもったけど、結局自宅サーバをたてることにしました。たぶん、これが一番コストパフォーマンスが良い。でも気をつけなくちゃ行けないのが、サーバ自体の管理を自分でやらなくちゃいけないから結構めんどくさいんですよね。結局自宅サーバかよって感じです。
サーバの発注とかシステムの構成

サーバをNTT-X Storeで発注して発注して、16,800円。かなり安いです。このサーバの詳細は http://wiki.nothing.sh/page/NEC%20Express5800%A1%BFGT110b に書かれています。なんでこのマシンにしたのかというと、VMWareのESXiで仮想化をしたくて、それに対応している安いサーバがこれだったというわけ。ちなみに、これをすると管理が楽になる。例えば、マシンのバックアップが取りたいなと思ってもすぐできるんですね。だから仮想化は凄く良い。
でも、素のGT110bを使うとメモリも少ないしCPUも弱いしハードディスクも少ないので、これはネットで買い足しました。あ、あとデスクトップ用のモニタが無かったのでそれも中古で買いました。それが次のような感じ。
Express/GT110b ¥16,800
Core i5 760 BOX ¥16,898
Samsung3.5インチHDD(SerialATA)/容量:1TB HD103SJ ¥4,980
TS256MLK72V3U [2GB DDR3 1333 ECC Long-DIMM 永久保証] ¥13,398
中古の液晶モニタ 15inch ¥3,980
計: ¥56,056
ずいぶんと安い買い物だったと思います。もちろん、マシンの上で動かしているOSはLinuxなので、ライセンス料もかからないしとてもリーズナブルです。
ここまできたら後はアプリを作り直すだけでした。Herokuで作ってたときにはHerokuの制限を考えながらアプリを作ってたので作りづらかったですが、自宅サーバを使うとそういった制限はなくなるのですごく作りやすい。お金を払うだけの価値はあると思います。やっぱりお金をかけるべきところはかけないとダメですね。
携帯対応とか

それから結構このアプリケーションは携帯ユーザの女の子がよく使ってくれます。結構教えると毎日見てくれるんですよ。やっぱりお買い物と言えば女の子ですね。だから、携帯対応しました。携帯はいままでやった事は無かったんだけど、Railsのプラグインであるjpmobile( https://github.com/darashi/jpmobile)を使ったところすごく簡単に対応する事ができた。凄いですね。id:darashiさんに感謝です。
iPhoneも対応していますが、こちらもあまり詳しくなかったので最初はjQuery mobileを使って構築しました。でもちょっと重かったのでjQuery mobileはやめて手組しています。そもそも一ページしか無いのでそんない難しい事は無いですね。
感想

最後に一番強調したい事を。。。
ウェブサービス公開するのはそこまで難しくないんですが、それを流行らせるのはかなり難しいですね。面白いサービスとかであれば結構色んなところがとりあげてくれたりするんですけど、後発のサービスになるとなかなか。。。開発者の方は作る事よりもどうやってみんなに知ってもらうかを考えるのがすごく大変な事だと思います。お金かけて広告うてれば楽なんですけどね。
とにかく作ったら公開。やる事は各方面への宣伝です。今のところやってるのはTwitterへの投稿と、ここへの投稿ですかね。これからいろいろ試そうとしているところ。このサービスがある程度知名度が上がってきたらまたそのとき軌跡を書きたいと思います。
 
0:34

vim-quickrunを使って高速開発

Category: , By jx
最近プログラミングコンテストチャレンジブックを読もうとしています。 そこで、c++を勉強してみようかと考えているのですが、学習効率の向上のため、vimで高速に開発できないものかといろいろ調べてみたところ、quickrun.vimというものが見つかりました。

quickrun.vimの種類

quickrun.vimには2種類あるみたいでujihisaさんが作ったquickrun.vimとthincaさんが作ったvim-quickrunがあるみたい。で、ujihisaさんの昨日はthincaさんのvim-quickrunに取り込まれてるらしいので、vim-quickrunを使えば良いみたいです。

インストール

vim-quickrunはShougoさんが作ったvimshellを必要としているのでそちらも必要になります。また、Vimは7.2以上が必要条件のようです。 そして、これらをpluginにコピーしてやればOK。
git clone http://github.com/Shougo/vimshell.git
git clone http://github.com/thinca/vim-quickrun.git
pushd .
cd vimshell
cp -R * ~/.vim/
popd
cd vim-quickrun
cp -R * ~/.vim/
これでうまく動きます。かなり快適に勉強できますよ!! vim-quickrunオススメ!