2012年12月30日日曜日

Rubyでコマンド一つでWebサーバを立てるadsf

config.ruを書いてrackを使うのもいいが

コマンド一発でWebサーバが立ち上がってくれるのはありがたい!というわけで紹介です。

インストールから起動まで

adsfをインストールして、ドキュメントルートにしたいディレクトリへ移動しadsfと打つと、3000ポート(変更可)で起動します。楽。めっさ楽。


gem install adsf
cd $document_root
adsf

プログラマーがHTMLとかCSSとか静的なファイルだけを扱うことって少ないのですが、時々必要になるので便利です。生成されたドキュメントをfile:///で見れないときとかね。

2012年12月25日火曜日

今プロジェクトマネジメントに置いて大事なこと

コストがやられたようだな

「ククク...奴は四天王の中でも最弱...(※ただし顧客に限る)」

たんなるつぶやきです。さらっと流しましょう

四天王じゃなくて、今は五天王かもと思う

  • 品質
  • コスト
  • スケジュール
  • スコープ
  • そして、モチベーション

最近、まつもとさんがPerlがあるのになぜRubyを作ったのかという話で、モチベーションも大事なリソースの一つだよねって話をしていて、なるほどと思った。というか、自分はモチベーションにかなり左右されるタイプなので、モチベーションが低い時はほんと辛い。(せめて、就業時間くらい、最低限の生産性は確保したいって微々たる責任感くらいは持ち合わせているつもりだから)


モチベーションの3つの柱

どこかの外人さんが言っていた話なのだけど、この3つが重なるとモチベーションは最も高まるらしい。聞いていて、自分もなるほどなと思ったので紹介しておきます。出典が分からなくてすみません...

  1. やれること
  2. やりたいこと
  3. やるべきこと

つまり自分が達成できるだろうし、達成したいし、達成すべきだと思うことですね。ある程度スキルもあって、ちょっとくらいやってみてもいいなと思っていて、周りも期待してくれているっていうような状況だったりとかですね。コーチングの方から来てるものなのかな?。モチベーションが低いときは、とにかくやってみるというのが一番らしいけど、高めるという時は、やれることを増やすこと、やりたいことを見つけること、やるべき課題に出会うことが大事なのかもしれませんね。PMなら、メンバーをそういう環境に導いて行くといいのかもしれない、と、今思いつきました。(PMじゃないけど)

2012年12月24日月曜日

gitのリモートレポジトリで削除されたブランチをローカルのも削除する

git remote レポジトリ名 prune

git branch -a でorigin/*という感じで、いくつものトピックブランチが残っていると思うのですが、年末ですし、お掃除しましょう。

やり方は、git remote origin prune。簡単ですね。

自分でpushして、マージされて、もう不要になったリモートレポジトリが残っているようであれば削除しましょう。(基本的にマージ時に削除して良いと思います。)

gitでブランチ間の差分を見る方法

git diff ブランチ名..ブランチ名

簡単過ぎて、意外と知ってるか知らないかが二分されるものですねー。ブランチのマージ前に差分を確認する時とかによく使ってます。-bで空白やタブの変更だけの行は非表示にできるので、それも一緒に覚えておくと便利です。


リモートのブランチとの差分

質問されたことがあったので書いておきます。

git diff master..origin/master、こんな感じです。originはリモートの名前です。

git commit時に他の人のコミットとして取り込む方法

gitを触ったことがない人の変更分を取り込む時にたまにやるよね

あまり良い開発のやり方ではないけど、ステージングや開発用のサーバで直接変更してもらって、その差分をコミットしときたい時に、わざわざgit config user.nameで変更して、また元に戻すのも面倒なので、覚えておくと便利なので紹介しておきます。


git commit --author "name <email address>"

--authorオプションで指定してあげればOKです。


authorを後から変更する --reset-authorの注意点

--amendで直前のコミットを修正する時に、その直前のコミットのauthorについては上書きされません。--reset-authorを使えば変更できますが、他の誰かではなく、configの設定に置き換わるようです(つまり自分)。--authorを指定する時は間違わないように注意しましょう。(やり方知ってる方いましたら教えてください...)。間違ってしまっても、まだresetとかしてOKな段階なら回避策はありますけどね。

2012年12月23日日曜日

Sublime Text 2のサイドバーをマスターする - TextMateからSublime Text2に切り替え中 〜 その3

サイドバーを制す者は、○○も制す

サイドバーの右クリックのメニューの少なさにちょっとびっくり。まぁReveal in Finderがあればなんとかなるのですが、Open with...とかもあれば欲しいのでSideBarEnhancementsパッケージを入れました。

  • Control + `
  • pa:ins
  • SideBarEn...

毎度のことながら、パッケージインストール簡単でいいですね。TextMate2も同じくらい簡単ですけど。


サイドバーをキーボードから操作する

マウスやタッチパッドで操作するのもいいけど、ちょっと集中が削がれるので、キーボードから操作したいですよね。特にVimでNerdTreeとか使っている人とかはそう思うんじゃないかな。(昔、wycats先生に感化されて、MacVimにスイッチしてみようとして挫折した組ですw)


サイドバーの操作方法

サイドバーに移る方法

control + 0で移ります。


サイドバーの中を移動する方法

カーソルキーで移動できます。(Control + N/B で移動もできますが、Control + Bの動きが最悪な時があります。お試しあれ)


ディレクトリの開く方法と閉じる方法

カーソルキーの→で開き、カーソルキーの←で閉じます。

ファイルを開く方法

サイドバーをカーソルキーで渡り歩いていれば、既にグループの方にファイルが展開されます。エンターキーか、Control + 数字でそのウインドウに移ればファイルを開いたことになります。

サイドバーに移る前のグループがファイルを開く先になるようです。



vintageを有効にしている組としては、jkで移動できて、oでディレクトリを展開できると楽なんですけどね。他のやり方とかご存知でしたら、コメント等で教えていただけると嬉しいです!Pythonの勉強がてらエクステンションを書くのもありかな?


fukayatsuさんによる補足

fukayatsuさんにコメントでサイドバーの移動をhjklでする方法を教えていただきました!ありがとうございます。なるほど、キーバインドの設定を書けばいいんですね〜♪

Sublime Text 2でctagsを使って定義元に飛ぶ - TextMateからSublime Text2に切り替え中 〜 その2

開発環境見直し第1弾

前回はSublime Text 2のインストールと、ショートカットキーを調べて、TextMateからスイッチできるだろうという範囲を調べたので、これからはSublime Text 2を使いたくなるように動いて行く。が、調べていたらctagsというものに出会ったのでちょっと入れてみよう。気分は孤独のグルメ。


brew install ctags

まずはMacにctagsをインストール。元々入っているかもしれないけど、brewで入れちゃいました。


CTagsパッケージをインストール

  1. Control + ` コマンドパネルを表示
  2. pa:ins と入力してPackage Controlのパッケージインストールを開く
  3. CTagsと入力して、CTagsパッケージをインストール

実に簡単だ...


実際に使ってみる

ctrl + t, ctrl + rでCTagsの何かキャッシュ的なものが作成され、ctrl+t ctrl+tでメソッドの定義元に飛べることは分かった。けども、精度はあまり高くないかもしれない。でも、モデル名のところでカーソルを合わせてパッとファイルが開けるのは楽だ。どんどん使って行ってみようと思う。


実はGitのPackageも入れてみたのだけど、デフォルトでキーバインドがなかったのと、CUIとSource Mapで事足りているので導入しなかった。ちなみにプラグインやパッケージ向けのキーバインドの基本方針みたいなものはあるのかな?OS Xのキーバインドは大体踏襲してくれているようで使いやすいが、一部既に割り当ててあるものがあって、よく使う機能じゃないから別によかったのだけど、他とかぶらないキーバインドってみんなどう探してるんだろう。


キーバインドをまとめておく

後日、あれ?キーバインドどうだっけ?となったので追記


  • CTRL T + CTRL R: ctagsが使えるようになる(語弊ありまくり)
  • CTRL T + CTRL T: カーソルが置かれているメソッド名の定義もとにジャンプなど
  • CTRL T + CTRL B:ジャンプ元へ戻る(これが何気に一番便利w)

TextMateからSublime Text2に切り替え中 〜 その1

スイッチングという葛藤と開発環境の見直しへ

TextMateユーザであれば、使い始めた当初から機会があれば他のエディタ等に切り替えができないか、何度か挑戦したり、実際に切り替えたことがあるのではないだろうか。おい!とツッコミを入れる人がいるかもしれないが、実は当たり前のことのような気がする。TextMateは良いエディタだし、TextMate2も日本語の入力問題が解消され、なかなか良い感じにはなった。けども、なんかね...。Ryan BatesがSublime Textにでも乗り換えない限り、自分も乗り換えないんじゃないかと思ってたけども、Sublime Text2も大分仕上がってきているようだし、何よりどんどん日本のユーザが増えているようなので、サポートもされていくのかな?と期待もしつつ、この際本当にスイッチできるかどうかはさておき(実は5回程挑戦してみたが、すぐにmateコマンドで...)、年の瀬ですし、普段の開発環境を見直してみようと思ったので、その遍歴を載せて行こうと思う。


まずはショートカットを調べる

普段TextMateで使っているこれは必須というショートカットや、調べていて便利なものを忘備録として集めた。網羅はできていないけど、これだけ知っておけばまずは大丈夫だろうと個人的に思った範囲。まだ実際に開発に使用していないので、他にも増えるだろうけどね。


ナビゲーションとその他

  • subl TextMateのmateコマンドにあたるもの

    ln -s "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl" ~/bin/subl


    過去に設定していたのを忘れていたので追記
  • Control + ` コンソールを表示
  • Command + P (Go To Anything) TextMateと同じくCommand + Tでも開く
  • Command + Shift + P コマンド実行選択ダイアログみたいなのが出る(後述するPackage Controlで使用)
  • Command + R メソッドやファンクション(シンボル)の一覧から選択しそこにジャンプできる TextMateでいうCommand + Shift + T
  • Command + { or Command + } タブ移動(Command + alt + ←がSublime Text2では普通のようだけど、Macユーザはこっちを使う人もいるので対応しているか調べた。対応されていてとても素晴らしい!
  • Command + K, Command + B、サイドバーの表示非表示
  • Command (+ Shift) + alt + 数字、ウィンドウを縦横に分割。
  • Control + G 指定行に移動
  • Control + L カレントラインが中心になるよう縦スクロール
  • Command + カーソルキー、↑ファイル先頭、↓ファイル最後尾、←行頭、→行末にカーソルを移動
  • alt + ←→ 単語間移動?

選択・検索・置換・編集

  • Command + F 検索
  • Command + Shift + F 検索/置換
  • Command + G 次に検索に該当したものに移動
  • Command + Shift + G 前の該当に戻る
  • Command + D カーソル位置にある単語とマッチするものをハイライト
  • Command + Control + G マッチした単語の後ろにカーソルを入れる(マルチカーソル) Command + Dと併用すると良い
  • Command + ] or Command + [ インデント
  • Command + L 行選択
  • Command + / コメントアウト切り換え


Package Controlのインストール

Package Controlというもので、Sublime Text2もTextMate2のバンドル管理のようなことができるらしい。ということで早速インストールして活用。

  1. Control + `でコンソールを開く
  2. Installationに書いてあるPythonコードをコピペ
  3. Sublime Text2を再起動し、Preferences > Package Controlが入っていればOK

viモードを有効にする

viのc + shift + $とか、慣れてると使うので、使えるものは使っちゃいましょうと思って有効化した。

  1. Command + , で設定ファイルを開き
  2. ignored_packagesに記述されているVintageを削除かまたはコメントアウトする

Soda ThemeとColor Schemeをインストール

Soda ThemeのDarkの見た目が好きなので入れてみた

  1. Control + `でコマンドパネルを開き、pa:insと入力しPackage Controlのインストールを開く
  2. sodaと入力しテーマをインストール
  3. Command + , で設定ファイルを開き、"theme": "Soda Dark.sublime-theme"と設定し有効化

カラースキームも変えてみたければ、やり方とファイルと配布されているのでSoda Themeのサイトを見てみると良いです。


続く...


気になったこと

  1. ユーザ個別の設定ファイルの置き場が深い。TextMate2なら~/.tm_propertiesで分かりやすい
  2. プロジェクト別に設定ファイルを持てるのか?
  3. スプリットビューのスムーズな移動・操作方法

追記...


スプリットビューのスムーズな移動・操作方法

control + 数字で移動できた!

2012年12月21日金曜日

nginxでRailsのassetsのgzを有効活用する

nginxのモジュールが入っているか確認

nginxのHttpGzipStaticModuleを使うので、有効になっているか確認します。有効になっていない場合は、configureからやり直し。

nginx -V|grep http_gzip_static_module

nginxのconfでgzip_staticをonに


location /assets {
     alias /path/to/rails/app/public/assets;
    gzip_static on;
    gzip_proxied        any;
    gzip_disable        "MSIE [1-6]\.";
    gzip_vary           on;
    expires max;
}


実際に動いているか確認

ブラウザで確認する場合、レスポンスヘッダーのContent-EncodingがgzipになっていればOKです。

nginx側で確認する場合、ワーカープロセスIDに対してstrace -p $PID 2>&1|grep openとしておいて、ブラウザからアクセスし(キャッシュを無効にするためにCommand + shift + Rか、Ctrl shift F5?) gzファイルがオープンされていることを確認してください。no such file or directory や gzが取れたファイルをオープンしている場合は何らかのエラーがあります。


gzip_http_version 1.1か1.0について

プロキシサーバを通してnginxにアクセスする場合、リクエストヘッダーのACCEPT-ENCODINGが渡されないことがあります。その際はgzip_http_version 1.0; とするとうまく動くかもしれません。(デフォルトは1.1)マニュアルに書いてあります。プロキシサーバがACCEPT-ENCODINGをきちんと渡すよう設定するのが一番良いです。

2012年12月20日木曜日

nginx + unicornな環境でRailsアプリをサブディレクトリに配置する方法

nginxのalias

nginxの設定ではlocationディレクティブにaliasで指定してあげるのがコツ。


upstream app {
  server unix:/path/to/rails/app/sock;
}

location /app {
    alias /path/to/rails/app;
    access_log  /access_log/path;
    error_log   /error_log/path;
    try_files $uri $uri/index.html $uri.html @app;
  }


Rackのmap

config.ruに以下のように記述。アプリに合わせて要修正


# This file is used by Rack-based servers to start the application.

require ::File.expand_path('../config/environment',  __FILE__)

if ENV['RAILS_RELATIVE_URL_ROOT']
  # unicorn_rails --path PATHが指定されている時はこちら
  # cdcontrolなどのサブディレクトリに配置する時はpathオプションが必要です
  map ENV['RAILS_RELATIVE_URL_ROOT'] do
    run YourRailsApp::Application
  end
else
  # pathオプションをしていない時は
  # http://localhost:8080/ でアクセスできます
  run YourRailsApp::Application
end


unicorn_railsの--pathオプション

unicornを起動する時に、unicorn_rails --path /app とすると、/app以下がRailsアプリとなります。 asset_pathなども自動で置き換わります。


これでRedmineもGitLabも同じドメインが使えるねっ!

2012年12月18日火曜日

RubyでModuleのmethodが呼び出せないのはmodule_functionしてないから

module_function :method_name [,:method_name2...]

きっと基本中の基本なんでしょうけど、以下のようなコードは動きません。


module A
  def a
    puts "a"
  end
end

A.a #呼び出し name error


module_functionで指定すると動きます


module A
  def a
    puts "a"
  end
  module_function :a
end

A.a #呼び出し


基本的なことなんだろうけど、忘れちゃうことだってあるんだ。人間だm...。でもなぜ??module_functionせずに呼び出せたらまずいものなだろうか?謎。