OmniAICreator/Qiita-1.07M huggingface dataset:
【Subversion】Capistranoのデプロイで必要ない時はasset precompileをしない

なにとなくsvnでかいてみた。
動作保証はできませぬ。
もっと簡潔な書き方あるような...

```ruby:precompile.rb
 namespace :assets do                                                              
    task :precompile, :roles => :webs do                                            
      revs = []                                                                     
      [                                                                             
        current_path,                                                               
        release_path                                                                
      ].each{|i|
        revs << capture("cd #{i} && svnversion").chomp.gsub(/M/, '')
      }       
      lines = revs.uniq.size < 2 ? 0 :                                              
        capture("cd #{release_path} && svn log -v -r#{revs.join(':')} | grep 'app/assets' | wc -l").to_i                                                                                                    
      if lines > 0                                                                  
        p "precompile"                                                              
        run %Q{cd #{latest_release} && #{rake} RAILS_ENV=#{rails_env} #{asset_env} assets:precompile}
      else                                                                          
        p "skipping precompile"                                                     
      end                                                                           
    end                                                                             
  end                  
```
uname26

最近のLinuxカーネルは3.xになっていますが、これだとどうもうまく動かない子が世の中にはちらほら存在するようです。代表的なものはとしては、ハードウェアRaid Controllerのユーティリティです。
そういう時にカーネルのバージョンを2.6系としてプログラムを実行してくれるコマンドラインツールがあります。
その名も「uname26」これをUbuntu12.04LTS上で使うと

```
./uname26 uname -a
Linux ubuntu 2.6.42-23-generic #36-Ubuntu SMP Tue Apr 10 20:39:51 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
```

などと表示されます。
下記のサイトからからダウンロードしてmakeします。

- http://mirror.linux.org.au/linux/kernel/people/ak/uname26/

```uname26.sh
mkdir uname26
cd uname26
wget http://mirror.linux.org.au/linux/kernel/people/ak/uname26/uname26.c
wget http://mirror.linux.org.au/linux/kernel/people/ak/uname26/README
wget http://mirror.linux.org.au/linux/kernel/people/ak/uname26/Makefile
make
```
UIWebViewのAudio/Videoが自動再生されない。

UIWebViewのhtmlロード後自動にAudio/Videoを再生しようとしたが再生できない。

```Javascript:Javascript
$(document).ready(function() {
	var audio = new Audio('./test.mp3');
	audio.play();
});
```

探してみたら、Appleがトラフィックを気にして自動再生できないように決めたらしい。
結局Javascriptで関数を作って「webViewDidFinishLoad:」で呼出すようにして解決した。


```Javascript:Javascript
var audio;

var playAudio = function() {
	audio.play();
};

$(document).ready(function() {
	audio = new Audio('./test.mp3');
});
```

```objectivec:ObjectiveC
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
    [webView stringByEvaluatingJavaScriptFromString:@"playAudio();"];
}
```
vim-coffee-script の zipball からの install，そして uninstall

Vim で CoffeeScript のコードのシンタクスハイライトをするために [vim-coffee-script](https://github.com/kchmck/vim-coffee-script) を導入してみました．

大体どこの解説記事を見ても [pathogen](http://www.vim.org/scripts/script.php?script_id=2332) 使おうぜ！とあったんですが，pathogen を導入したら Vim の起動が 1.3 秒も掛かるようになってしまい (※ [vim --startuptime で計測](http://vim-users.jp/2009/11/hack99/)) 世界がバッドエンドに染まりそうだったので vim-coffee-script を zipball からインストールするようにしました．

`~/.vim` にて，以下のコマンドを実行．

```sh
wget https://github.com/downloads/kchmck/vim-coffee-script/vim-coffee-script-v002.zip
unzip vim-coffee-script-v002.zip
```

unzip の結果は以下の通り．

```text
Archive:  vim-coffee-script-v002.zip
ae7ebc39cbf7f29a1034ba3dbe7e947d7dda3bf9
   creating: after/
   creating: after/syntax/
  inflating: after/syntax/haml.vim
  inflating: after/syntax/html.vim
   creating: compiler/
  inflating: compiler/coffee.vim
   creating: doc/
  inflating: doc/coffee-script.txt
   creating: ftdetect/
  inflating: ftdetect/coffee.vim
  inflating: ftdetect/eco.vim
   creating: ftplugin/
  inflating: ftplugin/coffee.vim
   creating: indent/
  inflating: indent/coffee.vim
   creating: syntax/
  inflating: syntax/coffee.vim
  inflating: syntax/eco.vim
```

これで Vim の起動も爆速のまま，`*.coffee` ファイルがカラフルになりました．ウルトラハッピーです．

アンインストールは，unzip で出来たファイルを根こそぎ消せばいいんじゃないんでしょうか？Vim Script 詳しく無いんで保証は出来ませんが…　少なくとも私はそれでシンタクスハイライトは行われなくなったのを確認しています．

## 余談

現在，`*.coffee` を保存したら自動で `*.js` にコンパイルしてくれるようにするために [watchr](http://rubygems.org/gems/watchr) を使っているのですが，これって Vim Script でも出来ませんかね？

`*.coffee` ファイルを保存したときに `coffee -c *.coffee` してくれるだけでいいんですが…

どなたかご存知であればご教授願いたいです．

## 実行環境と使用バージョン

* さくら VPS 1G
* Ubuntu 10.04 64bit
* Vim 7.2.330
* vim-coffee-script v002
preg_replace_callbackでテンプレ内の複数ヶ所のループ処理を済ませる

preg_replaceでreplacement部分をpatternで一致した値を引数にループ処理したかったんだけれど、preg_replace_callback という関数があるのね。


やりたいことの例：
テンプレに↓こう書いてある。

```テンプレ.html
		<dl>
			<dt>○○さんの発言</dt>
			<dd>
			__%topic_list(77)%__
			</dd>
		</dl>
		<dl>
			<dt>××さんの発言</dt>
			<dd>
			__%topic_list(78)%__
			</dd>
		</dl>

※__%topic_list(ユーザーID)%__ という形式の部分はそのヒトのトピック発言をループ処理した結果に置き換える。
```

期待する結果：

```		<dl>
			<dt>○○さんの発言</dt>
			<dd>
				<ul>
					<li><a href="#">○○○○○○○○○○○○○○○○○○</a></li>
					<li><a href="#">○○○○○○○○○○○○○○○○○○</a></li>
					<li><a href="#">○○○○○○○○○○○○○○○○○○</a></li>
				</ul>
			</dd>
		</dl>
		<dl>
			<dt>××さんの発言</dt>
			<dd>
				<ul>
					<li><a href="#">××××××××××××××××××</a></li>
					<li><a href="#">××××××××××××××××××</a></li>
					<li><a href="#">××××××××××××××××××</a></li>
				</ul>
			</dd>
		</dl>
```

テンプレを読み込んで preg_replace_callback で変換して出力する：

```php:preg_replace_callback-sample.php
$members_list = file_get_contents("テンプレ.html");
$members_list = preg_replace_callback(
                    "/__%topic_list\((\d+)\)%__/",
                    "get_topic_list_from_user_id",
                    $members_list);
echo $members_list;

function get_topic_list_from_user_id($matches) {
	$user_id = $matches[1];
	$topics = get_topics($user_id); // ←$user_id の発言が取れるものとする
	
	$topic_list = '<ul>';
	foreach ($topics as $topic) {
		$topic_list .= '<li><a href="'. $topic['link_url']. '"></>'. $topic['post'] .'</li>';
	}
	$topic_list .= '</ul>';
	return $topic_list;
}
```
Gitで共有リポジトリを作成しつつ、サーバー上にpushごとに自動展開したいとき

サーバー上にまず共有リポジトリを作成する。

```
mkdir Repo.git
cd Repo.git
git init --bare --shared=true
```

そして、
hooksフォルダ内のpost-receiveファイルを編集

```
(cd /home/admin/workspace/folder/;git --git-dir=.git pull;実行したいコマンド;)
```

サーバーのコピー先folderにて、

```
git clone Repo.git
```

ローカルマシンの、開発中のフォルダで

```
git init
git remote add origin ssh://admin@---/home/admin/workspace/---.git
git add .
git commit -m "initial import"
git push origin master
```
WebArena suitePro V3 で play framework を動かす

jvmがserverモードで動いている場合、jvmはメモリを最大限取得しようとするが、VPSの場合にはそれが許されていないため

```
# play
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
```

というエラーメッセージが出てしまう。

-clientモードに変更すると、2分の1くらいに速度が遅くなるという情報もあったため、

```sh
export _JAVA_LAUNCHER_DEBUG=1
```
で、デバッグ情報を見つつ、

```sh
 export _JAVA_OPTIONS='-Xmx512m'
```
と指定をしたら、正しく動作した。

play/frameworks/build.bat
などの設定を変えただけでは、全java実行のオプションを指定できないからだろうか。


追記（2012/06/10）

更に開発を進めていくと

```
play.api.UnexpectedException: Unexpected exception [IOException: Cannot run program "javac": java.io.IOException: error=12, Cannot allocate memory]
```

というエラーが出て、playコマンドの実行はできるが、その先のcompileが実行できない、という状況に陥った。
ひとまずの解決策として、

```sh
export _JAVA_OPTIONS='-Xmx256m -Xms256m'
```

としたら、コンパイルも可能となった。
メモリが2GBプランなので、起動はできてもコンパイル時にメモリ不足となるのだろうか。。。
文字列中のプラスを特定の場合にURLエンコードする

携帯の空メールで、拡張アドレスのデリミタをプラスにしているとauではまる
http://d.hatena.ne.jp/maru_cc/20101215/au_mailto

```ruby
module RegistrationHelper
  def encode_plus(email, user_agent)
    email.gsub!("+", "%2B") if user_agent =~ %r(^KDDI-[^ ]+ UP\.Browser/6\.2\.)
    email
  end
end
```
Capistranoを使ってるとreleasesがいっぱいっぱいになる


デフォルトで/releases以下の履歴は消えないので結構ディスクを圧迫することが分かった。
特にJenkinsを稼働させてCIもどきなことをしていたので、
access_logの肥大化以上の迫力を感じた。
（ログはちゃんとrotateしてるけど！）

--

手動で消すのは簡単で、以下を実行するだけ。

```bash
cap deploy:cleanup
```

デフォルトで5件残してほかは消える。

ただ、都度やるのはめんどいので、
deploy.rbに書いてあげた方いいかな。

```ruby:config/deploy.rb
after "deploy:restart", "deploy:cleanup"
```

--

デフォルトにせい！と思っている人もいるようだけど。
https://github.com/capistrano/capistrano/issues/89

production環境への反映としても使われる中で、
勝手に消えるのはまずいよねって話が一番有力かな。
Rspecでリストのチェック

リストに必要な要素が過不足なく含まれていることをチェックするとき，いちいちリストをソートしなくても`=~`を使えばよい

```ruby
array1.should =~ array2
```

マッチしなかった場合は足りない/余計な要素を別途表示してくれるので，そういう点でもsortして==より`=~`の方がよい．

```ruby
# test
[:zero, :one, :three].should =~ [:one, :two]

# log
Failure/Error: [:zero, :one, :three].should =~ [:one, :two]
  expected collection contained:  [:one, :two]
  actual collection contained:    [:one, :three, :zero]
  the missing elements were:      [:two]
  the extra elements were:        [:three, :zero]
```
任意のページからリンクが貼られている画像ファイルをダウンロード

```ruby:get_image.rb
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

require 'digest/sha1'
require 'nokogiri'
require 'pathname'
require 'parallel'
require 'open-uri'

dir = Pathname.new('/path/to/download')
dir.mkdir unless dir.exist?                       

html = Nokogiri::HTML(open(ARGV[0]))

Parallel.each(html.css('a'), :in_threads => 10) do |link|
  next unless link['href'] =~ /\.jpg$/
  filename = Digest::SHA1.hexdigest(link['href']) + '.jpg'
  filepath = dir + filename
  next if filepath.file?
  puts "Download... #{link['href']}"
  res = open(link['href']) rescue next
  if res.content_type =~ /^image/
    open(filepath, 'w').print res.read
  end
end
```
bundlerでの運用方法


とりあえず現時点での理解をまとめてみた。

## まとめ
* Gemfile.lockはバージョン管理しよう
* デプロイするときは--deploymentオプションを使おう

## GemfileとGemfile.lock

### Gemfile
何をインストールするべきか記述する。
開発時に参照されるファイル

### Gemfile.lock
何がインストールされたか、どのような依存関係があったかが記述される。
デプロイ時に参照されるファイル。

## コマンド: bundle install

### 開発環境
```bash:開発環境
$ bundle install #--path vendor/bundle
```
必要なら--pathを指定して、特定のディレクトリにgemをインストールさせる。
bundle install時に生成されたGemfile.lockは、デプロイ時に利用するので必ずバージョン管理する。

### デプロイ時
参考: http://gembundler.com/man/bundle-install.1.html#DEPLOYMENT-MODE

```bash:本番環境
$ bundle install --deployment
```

bundle install --deploymentすると、vendor/bundle以下にgemがインストールされる。
また、.bundle/configにBUNDLE_FROZEN="1"が追加される。
--deploymentオプションをつけた場合は、Gemfile.lockを元にgemがインストールされる。
--deployment付きで実行された環境で、Gemfileを書き換えて新たにgemをインストールすることはできない。


## コマンド: bundle update
bundle updateはGemfile.lockの記述を無視して、GemfileでのGemの指定やそのバージョン指定などに基づいて、gemを更新する。
更新時にGemfile.lockを更新する。
--deploymentを利用している場合、開発時にしか使わない。
herokuにgitでリリースするまでを割と丁寧に解説する


このエントリは[Git Advent Calendar / Jun.](http://qiita.com/advent-calendar/git)の5日目です(遅れてすみません)。
Advent Calendar参加者でネタ探しに困っている方は、最後に質問を載せたので回答いただけるとありがたいです。

###herokuを一言で言うと
リリース周りの設定とスケールアウトが簡単なレンタルサーバー
###どれくらい簡単なの？
```sh:リリース
%git push heroku master
#一度herokuの設定をしたらこれだけでリリースができる
```

```sh:スケール
%heroku scale web=2
#これでフロントの処理台数を2台にスケールアウトする
#フロント1台だけなら無料でつかえる
```

###普通どれくらい大変なの？
「普通」のレベルにもよりますが、レンタルサーバーの設定、OSの設定、apacheの設定、言語のインストール、フレームワークのインストール、memcachedの設定、ライブラリのインストール、ファイアウォールの設定…etcなどがありますが、pushするだけでこのあたりをよしなにしてくれます。herokuで使用できる言語は、ruby,node.js,clojure,java,python,scalaです。

***

##使い方
\#おとなの都合でscala + playです
\#copypastableを重視して、コマンド先頭の$や%は省略しています。
###0.herokuからherokuのCLIをダウンロード、インストールする

自分は以前gemでインストールした古いバージョンのCLIが残っていたりしてハマりました。
下記のコマンドでherokuのCLIのバージョンをあげることができます。

```sh:herokuCLIのupdate
heroku update
```

###1.プロジェクトのルートディレクトリに設定ファイルを作成する
```:Procfile
web: target/start -Dhttp.port=${PORT} ${JAVA_OPTS}
#このファイルの内容は、選択した言語等によって変わります
#今回はscala + playです。
```

###2.おさらい
```sh:gitリポジトリの作成
git init
git add .
git commit -m "initial commit"
```

###3.Heroku側にstackを作成しつつgit remote addする
```sh:
heroku create -s cedar
```
ここでいうstackはstackとqueueのstackではありません。単なる積み重ね的な意味のstackです。自分は初めてこれを聞いたときにとてもモヤモヤして、herokuのどこにstack的な振る舞いがあるのか悩みました。stackは一度作成されると半永久的に残るので、同じプロジェクトに修正を加えてpushする際は、この3番の工程は必要ありません。それと、このcedarというのは、そのstackの種類で、他にもbamboo-mriというのもあります。stackの種類によって、使える言語が異なります。cedar stackならほとんどの言語に対応しています(対応していないのは古いruby)。cedarという一般的でない単語が出たのでここでも困惑しました。英語圏だと一般的なんでしょうか。CUI的なものでもインターフェイスのわかりやすさは重要だと思いました。
また、このコマンドによって、プロジェクトのgitリポジトリのremoteにherokuという名前でホスト先の.gitがaddされます。

```sh:確認
git remote -v
heroku	git@heroku.com:test.git (fetch)
heroku	git@heroku.com:test.git (push)
```


###4.herokuにpushし、リリースする
```sh:herokuにpush
git push heroku master
heroku scale web=1
heroku open
````
git push heroku masterによって、先ほど3番で作成したstackにpushして完了です。heroku scaleは始めに必要(だったはず)ですが、それ以降は処理台数を変更するとき以外は使いません。heroku openによって、pushしたWebアプリをブラウザで開きます。

###質問
自分は、普段mercurialを使っていて、実はgitの長所がよくわかりません。gitのエコシステム(heroku,github)は素晴らしいと思うのですが、git自体はmercurialよりも使いにくい印象(工程が多い)で、エコシステムを利用するとき以外に使いどころがよくわからないので、両刀使いの方がいたらぜひ比較解説をお願いします(主に使い分けに重点を置きながら)。下記参考にしてください。
http://qiita.com/items/3d3503e427c0c51e9700
iOSのGLKitで２Dウィンドウ座標系の行列を作る

XCode4.3.2で確認
OpenGL ESプロジェクトのひな形を流用します。
下記のコードは最低限の手順しか書いていません。描画やモデルの準備は各々でお願いします。

```objectivec:AppViewController.m
// ビューポートの値を入れる
float viewport[4];

// 2D座標系矩形(512x512pxのテクスチャを
// 等倍で表示する前提
// こいつをTRIANGLE_STRIPで描画する
const GLfloat squareVertices2D[] = {
    // 座標X, Y, Z, U, V
    // 左回り
    0.0f, 512.0f, 0.0f, 1.0f,     // 左下
    512.0f, 512.0f, 1.0f, 1.0f,     // 右下
    0.0f, 0.0f, 0.0f, 0.0f,     // 左上
    512.0f, 0.0f, 1.0f, 0.0f,     // 右上
};

// 
- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.context = [[[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2] autorelease];
//					:
    // viewport設定
    viewport[0]=self.view.bounds.origin.x;
    viewport[1]=self.view.bounds.origin.y;
    viewport[2]=self.view.bounds.size.width;
    viewport[3]=self.view.bounds.size.height;

    [self setupGL];
}

// OpenGL ESのセットアップ
- (void)setupGL
{
//					:
//					:
    [EAGLContext setCurrentContext:self.context];
//					:
//					:
    glFrontFace(GL_CCW); // 左回りを表（これがOpenGLのデフォルト）
//					:
//					:
}

// 更新
- (void)update
{
//					:
//					:

// ２Dウィンドウ座標系（原点が左上 0,0 ）の行列を作る
	GLKMatrix4 tmpMatrix = GLKMatrix4MakeOrtho(viewport[0], viewport[2], viewport[1], viewport[3], -1024, 1024);

	tmpMatrix = GLKMatrix4RotateX(tmpMatrix, GLKMathDegreesToRadians(180));
	tmpMatrix = GLKMatrix4Translate (tmpMatrix, 0, -viewport[3], 0);

	_modelViewProjectionMatrix = tmpMatrix;	// これが2Dウィンドウ座標系の行列になります
//					:
//					:
}

// 描画
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
    glViewport(viewport[0], viewport[1], viewport[2], viewport[3]);
    glClearColor(0.65f, 0.65f, 0.65f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//					:
	// 2Dウィンドウ座標で描画
	// カリングをOFF（裏面も描く・重要）
	glDisable(GL_CULL_FACE);
//					:
// 頂点バッファの準備などをして下さい
//					:
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
//					:
}
```
POST binary data by "curl" command


    $ cat <binary_file> | curl --data-binary @- <url>

`curl`でPOSTリクエストを送る際のオプション`-d`(--data)は`--data-ascii`という扱い。その他にも`--data-binary`や`--data-urlencode`といったオプションが指定できる。
引数が`@`で始まる場合、残りの文字列はファイル名を指すことになり、それが`-`の場合は標準入力から読み込む、ということになる。従って`--data @-`は標準入力から読んだデータを使ってPOSTする、ということになる。
AutoHotKeyスクリプトを開く標準のテキストエディタを設定する

## スクリプト

```ahk:Set_Registry_Editor_AutoHotkeyScript.ahk
; Set text editor for editing AutoHotKey script.

ShowUsage(){
  msgbox, [Usage]: %A_ScriptName% [FullPath of editor application]
}

ContainSpace(s)
{
  StringGetPos, Pos, s, %A_Space% ,
  return Pos >= 0
}

SurroundByDoubleQuoteIfNeed(s)
{
  if(ContainSpace(s))
    s = `"%s%`"

  return s
}

SetRegistryForAutoHotKeyScriptEditor(EditorPath)
{
  EditorPath := SurroundByDoubleQuoteIfNeed(EditorPath)
  EditorPath = %EditorPath%%A_Space%`"`%1`"
  RegWrite, REG_SZ, HKEY_CLASSES_ROOT, AutoHotkeyScript\Shell\Edit\Command, , %EditorPath%
  return ErrorLevel = 0
}

ArgCount=%0%
IfNotEqual ArgCount, 1
{
  ShowUsage()
  return
}

EditorPath=%1%

IfNotExist, %EditorPath%
{
  MsgBox, ファイルが見つかりません: %EditorPath% .
  return
}

; エディタの実行ファイルが ～.exe でなければエラー。
StringCaseSense, Off
StringGetPos, Pos, EditorPath, .exe , R
IfEqual, Pos, 0
{
  msgbox, .exe ファイルではありません: %EditorPath%
  return
}

if( SetRegistryForAutoHotKeyScriptEditor(EditorPath) )
{
  MsgBox "AutoHotKeyスクリプト用のエディタを設定しました"
}
else
{
  MsgBox "AutoHotKeyスクリプト用のエディタに失敗しました"
}
```

## 使い方

こんな感じで、エディタとして使いたい実行ファイるを本スクリプトファイルにドロップしてください。
![画像](https://lh6.googleusercontent.com/-RPVgFCCUMFw/T84wBsrpskI/AAAAAAAAEMU/hweqoC6c3G4/s800/2012-06-06_01h11_58.png)

あとは、.ahk ファイルを右クリックして [Edit Script]を選択すれば、上記手順で設定したテキストエディタで、.ahkファイルが開かれます！！
Notepad++ で、AutoHotKeyスクリプトの構文強調表示とヘルプ参照を行えるようにする

# 設定

1. [Notepad++](http://notepad-plus-plus.org/)をダウンロードしてきてインストールする
2. [AHKTipsの記事](https://sites.google.com/site/ahktips/developmentenvironment/npp-basicusage)を参考に、シンタックスハイライトの設定を行う
3. Notepad++のメインメニューから[プラグイン] -> [Plugin Manager] -> [Show Plugin Manager] を実行し、プラグインの中から[Language Help] をチェックしてインストールする
4. [プラグイン] -> [Language Help] -> [Options...] を選択し、以下のように入力する。

![](https://lh6.googleusercontent.com/-XggTWOAtSZY/T84i9_kQ5ZI/AAAAAAAAELg/YS_cbHLgVjE/s800/2012-06-05_08h02_53.png)

	AutoHotKey_L
	ahk
	C:\Program Files\AutoHotkey\AutoHotkey.chm

AutoHotKeyを標準でインストールした場合には、上の場所にヘルプファイルがるはずです。
別の場所にある場合は、適宜読み替えてください。

# ヘルプの参照の仕方

あとは、.ahk ファイルをNotepad++で開き、調べたいコマンドの上で`CTRL`+`F1`キーを押せば、AutoHotKeyのヘルプが表示されます。

![](https://lh4.googleusercontent.com/-6-EE2Fh2jh8/T84i_HLJ4II/AAAAAAAAELs/4pZp1NzIMRc/s640/2012-06-05_08h03_47.png)

これで、気になったコマンドの内容をすぐ調べることができますね。
千里の道も一歩から。わからないコマンドの意味を１つずつ理解して行きましょう！

ヘルプが英語なのが嫌であれば、[AutoHotkey 日本語リファレンス chmヘルプ版](http://www6.atwiki.jp/eamat/)を探してきて代わりに使うのも一興。

![](https://lh4.googleusercontent.com/-ihVUPg6BG_w/T84pZgYrmXI/AAAAAAAAEL8/eoEo3ZY1wPU/s640/2012-06-06_00h44_00.png)

# 参考

* [AHKTips](https://sites.google.com/site/ahktips/)
* [AutoHotKeyJp](https://sites.google.com/site/autohotkeyjp/)
ファイルのフルパスがわかっている場合にエクスプローラで選択した状態で開く

コマンドプロンプトから以下のコマンドを実行すると、指定したファイルが選択された状態でエクスプローラが開きます。地味に便利。

```bat:
explorer /select,[ファイルパス]
```
# 例

```bat:
explorer /select,"D:\Dropbox\scripts\Set_Registry_Editor_AutoHotkeyScript.ahk"
```

![こんな感じ](https://lh6.googleusercontent.com/-wK37UzuKFpU/T84i-zWscuI/AAAAAAAAELo/gupS89w8wgs/s640/2012-06-06_00h12_14.png)
Emacs の dired で現在のディレクトリを Nautilus で開く

以下のコードを .emacs に記述すれば、dired で e を入力したときに、現在のディレクトリを開いた Nautilus を起動できる。

```cl
(defun dired-open-nautilus ()
  (interactive)
  (call-process "nautilus" nil 0 nil (dired-current-directory)))

(define-key dired-mode-map "e" 'dired-open-nautilus)
```
[Pow]Railsで使える便利な開発サーバー

[Pow](http://pow.cx/)というRackアプリケーション用サーバーを使うと、シンボリックリンクを貼るだけでバーチャルホストで切って開発できるそうです。
※Mac OS X用

http://project.dev
http://m.project.dev

さらにLAN内で共有することも簡単なようです。
http://project.192.168.1.20.xip.io/
http://m.project.192.168.1.20.xip.io/

当然スマートフォンもWiFiにつないでやれば見れました。

## インストール
インストールはコマンドを実行するだけ。

``` terminal
curl get.pow.cx | sh
```

##サンプル
以下の条件でサンプルを作ってみます。

* rails(3.2.5)
* rvm(ruby-1.9.3-p194)

rbenvもいけるようですが今回は割愛します。
まずサンプルのrailsアプリを作ります。

```terminal
cd ~/Works/
rails new sample
```

~/.pow/にシンボリックリンクを作ります。

```terminal
cd ~/.pow
ln -s ~/Works/project project
```

project直下に.powrcを作り、以下を記述します。

```~/.pow/project/.powrc
if [ -f "$rvm_path/scripts/rvm" ] && [ -f ".rvmrc" ]; then
  source "$rvm_path/scripts/rvm"
  source ".rvmrc"
fi
```

project直下に.rvmrcを作ります。

```terminal
cd ~/.pow/project/
rvm --rvmrc --create 1.9.3-p194@project
```

設定を変更した後は再起動で設定反映です。
再起動は tmp/restart.txtを更新するだけ。

```terminal
cd ~/.pow/project/
touch tmp/restart.txt
```

これでブラウザを開いてhttp://[project名].devにアクセスすれば自動で起動します。
http://project.dev

サブドメインもOKです。
http://m.project.dev

http://[project名].[LAN IP-ADDRESS].xip.ioでLAN内共有もできます。
http://m.project.192.168.1.20.xip.io/

15分アクセスがなければ停止するようです。
スマートフォン用とかサブドメインで切っていて今までいろいろ面倒だったので幸せです。
他にもポートが設定できたりするようです。

## 参考
Pow: http://pow.cx/

```困ったときのログの場所　
cd ~/Library/Logs/Pow/
```
Gauche でニコ動のタイトルやサムネ画像URLを取得したりとか

Gauche の勉強で書いてみたニコ動のタイトルやサムネ画像URLを取得する処理。
正直、SchemeやGaucheの流儀とかを知らずに書いたけど、取り敢えず動く。


```scheme:
(use rfc.http)
(use rfc.uri)

(define-constant *getthumbinfo-url* "http://ext.nicovideo.jp/api/getthumbinfo")
(define-constant *ok-string*   "<nicovideo_thumb_response status=\"ok\">")
(define-constant *fail-string* "<nicovideo_thumb_response status=\"fail\">")
(define-constant *elements* '(title description thumbnail_url watch_url))

(define (getthumbinfo video-id)
  (receive (code status body)
    (http-getthumbinfo video-id)
    (if (rxmatch (string->regexp *ok-string*) body)
      (map (lambda (element) 
             (rxmatch-substring ((element->regexp element) body) 1))
        *elements*)
      #f)))

(define (http-getthumbinfo video-id)
  (receive (scheme user-info hostname port path query frament)
    (uri-parse #`",|*getthumbinfo-url*|/,video-id")
    (http-get hostname path)))

(define (element->regexp element)
  (string->regexp #`"<,|element|>(.*?)<\/,|element|>"))
      
(receive (title description thumbnail_url watch_url)
  (apply values (getthumbinfo 'sm9))
  (print title)             ;=> 新・豪血寺一族 -煩悩解放 - レッツゴー！陰陽師
  (print description)       ;=> レッツゴー！陰陽師（フルコーラスバージョン）
  (print thumbnail_url)     ;=> http://tn-skr2.smilevideo.jp/smile?i=9
  (print watch_url))        ;=> http://www.nicovideo.jp/watch/sm9
(print (getthumbinfo 'smx)) ;=> #f
```

次は Gauche のオブジェクト指向的にクラス定義したりとか。
ただ、このままだと内臓がトップレベルに駄々漏れなので
なんとかした方がいいと思いつつも途中辞め。

```scheme:
(define-class <nicovideo> ()
  ((videoid :init-keyword :videoid :accessor videoid-of)
   (title :init-value #f)
   (description :init-value #f)
   (thumbnail_url :init-value #f)
   (watch_url :init-value #f)))

(define-method write-object ((nicovideo <nicovideo>) port)
  (format port "#<<nicovideo> (~a)>"
          (slot-ref nicovideo 'videoid)))

(define-method getthumbinfo ((nicovideo <nicovideo>))
  (let ((result (getthumbinfo (slot-ref nicovideo 'videoid)))) 
    (if (list? result)
      (receive (title description thumbnail_url watch_url)
        (apply values result)
        (set! (slot-ref nicovideo 'title) title)
        (set! (slot-ref nicovideo 'description) description)
        (set! (slot-ref nicovideo 'thumbnail_url) thumbnail_url)
        (set! (slot-ref nicovideo 'watch_url) watch_url))
      #f)))

(define sm9 (make <nicovideo> :videoid 'sm9))
(getthumbinfo sm9)
(print sm9)                           ; => #<<nicovideo> (sm9)>
(print (slot-ref sm9 'title))         ; => 新・豪血寺一族 -煩悩解放 - レッツゴー！陰陽師
(print (slot-ref sm9 'description))   ; => レッツゴー！陰陽師（フルコーラスバージョン）
(print (slot-ref sm9 'thumbnail_url)) ; => http://tn-skr2.smilevideo.jp/smile?i=9
(print (slot-ref sm9 'watch_url))     ; => http://www.nicovideo.jp/watch/sm9

(define smx (make <nicovideo> :videoid 'smx))
(print (getthumbinfo smx))            ; => #f
(print smx)                           ; => #<<nicovideo> (smx)>
```
勉強会の参考問題の解答例。rubyでもう一回。

7/6(金) に行われる勉強会( http://atnd.org/events/30285 )の参考問題( http://qiita.com/items/cbc3af152ee3f50a822f )の解答例、もう一つ。
ruby で、group_by やそれに相当する処理をしないという例。

```ruby:poka2.rb
%w(
 DASAD10CAHA  S10HJDJCJSJ
 S10HAD10DAC10 HJDJC3SJS3
 S3S4H3D3DA  S2HADKCKSK
 SASJDACJS10  S2S10H10HKD2
 CKH10D10H3HJ C3D3S10SKS2
 S3SJDAC10SQ  C3C9SAS10D2
).each{ |q|
  ranks=q.enum_for( :scan, /[SHDC](\d+|J|Q|K|A)/ ).to_a.flatten.sort
  puts(
    case ranks.uniq.size
    when 5
      '--'
    when 4
      '1P'
    when 3
      (ranks-[ranks[0]]).size==3 || ( ranks-[ranks[-1]]).size==3 ? '2P' : '3K'
    when 2
      ranks[1]==ranks[3] ? '4K' : 'FH'
    end )
}
```

enum_for のあたりは前回( http://qiita.com/items/c87f099e9f2bc6a661e7 )と同じ。
ややマジカルな計算になっているけど、そんなもんだと思う。

こういう別解が出しやすい問題が好ましいけれども、別解が出しやすい問題はあまり簡単ではないことも多く、難しところ。
個人的に便利だったdiffの使い方

symfonyの開発環境のconfigを結構いじって、configureもした状態でコミットする際、差分を見るのに困っていたら教わった便利なdiffの使い方。

dev.foo/ が開発環境
prod.foo/ が本番と同様の環境を構築している

新規で追加されたファイルのみを抽出

```
diff -r dev.foo/ prod.foo/ | grep "^dev.foo"
```

差分のあるファイルのみを抽出

```
diff -r dev.foo/ prod.foo/ | grep "^diff"
```
binding.pryがあったらコミットを中止する

ばいんでぃんぐぷらい便利ですね。

コミットすると、`binding.pry`がコミット予定のファイルに含まれていれば、コミットを中止すフックスクリプトを書きました。`.git/hooks/pre-commit`にコピペしてお使いください。ハードコーディングしちゃってるんで、適当に修正するといいですね。

gistにもあげてるので、forkなんかしてもらえるといいですね。
https://gist.github.com/2970881

```sh:.git/hooks/pre-commit
#!/usr/bin/env ruby

cached_files = `git diff --cached --name-only`
if cached_files.split($/).any? {|path| File.read(path).include?('binding.pry') }
  puts 'ERROR: binding.pry is found'
  exit 1
end
```

- `#!/usr/bin/env ruby`はrvmのrubyを使う場合のshebang
- `git diff --cached`でコミット予定のファイルの差分とってこれる
- `--name-only`でファイル名だけとってこれる
- `$/`は区切り文字
Cocoa Applicationのウィンドウでよく使う処理


``` objectivec:Appdelegate.m

// ウィンドウの位置やサイズを保存する
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
	// Autosave Nameを設定
	[_window setFrameAutosaveName:@"mainWindow"];
}

// ウィンドウをすべて閉じたらアプリケーションを終了
- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication
{
    return YES;
}

```
CUIサーバー上のJVMのスレッドダンプ、ヒープダンプの取得

よく使うので健忘録。

# JVM上のプロセス番号取得
```sh
$ $JAVA_HOME/bin/jps
5486 Jps
14691 jar
```

# システムプロパティ表示
```sh
$ $JAVA_HOME/bin/jinfo -sysprops 14691
```

# スレッドダンプ取得(ただのテキスト)
```sh
$ $JAVA_HOME/bin/jstack 14691  > threaddump.tdump
```

# ヒープダンプ取得(バイナリ）
```sh
$ $JAVA_HOME/bin/jmap  -dump:format=b,file=heap.hprof 14691
```

#ローカルのMac, Win, LinuxでのGUIを使ったスレッドダンプやヒープダンプの比較
VisualVM
http://visualvm.java.net/
を使ってダウンロード後、開いてみる。比較機能も充実。

こと不具合究明に関しては、再現性さえ取れればJavaならたいていなんとかなると思う。これらデバッグツールのお陰で。最後はリモートデバッグとプロファイルもある。
Enterでsubmitするtextarea

### 追記 (2019-04-16)

MDNによると、[keypress](https://developer.mozilla.org/en-US/docs/Web/Events/keypress)はdeprecatedで今後は[keydown](https://developer.mozilla.org/en-US/docs/Web/API/Document/keydown_event)を使ってくれとのこと。

あわせて[keyCodeもdeprecated](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode)なので、`key`か`code`を使ったほうが良い。

---

Facebookのコメント投稿欄とかLingrの発言欄とか、Enter一発でsubmitするtextareaの作り方。

一応次の機能も盛り込む。

* Shift+Enterで改行も入力できるようにしておく。
* 本文がスペース、改行だけならsubmitしない。

HTML:

```HTML
<form action="/messages" method="POST" id="new-message">
  <textarea id="message-text" name="text"></textarea>
</form>
```

Javascript:

```javascript
var $form = $("#new-message");
var $ta = $("#message-text");

$(document).on("keypress", "#message-text", function(e) {
  if (e.keyCode == 13) { // Enterが押された
    if (e.shiftKey) { // Shiftキーも押された
      $.noop();
    } else if ($ta.val().replace(/\s/g, "").length > 0) {
      e.preventDefault();
      $form.submit();
    }
  } else {
    $.noop();
  }
});
```

実際には連続でsubmitされないように、一度submitしてリクエストを投げたらそのレスポンスが返ってくるまでリクエストを送信しないような仕組みを入れる必要がある。
Homebrew でバージョンを指定してインストールするコマンド作った

[homebrewでバージョンを指定してインストールする](http://qiita.com/items/f8f647e757842f08b9ec)が便利だったのでコマンドにしてみました。

```zsh:homebrew-install-version

#!/usr/bin/env zsh

if [[ $# -lt 2 ]]; then
	print -P "%UUsage%u: brew install-version [install options] FORMULA VERSION"
	exit 1
fi

formula=
version=
install_opts=()
versions_opts=()
for arg in $*; do
	if [[ $arg =~ '^--' ]]; then
		install_opts+=$arg
		[[ $arg == --devel ]] && versions_opts+=$arg
		continue
	fi
	if [[ -z $formula ]]; then
		formula=$arg
		continue
	fi
	version=$arg
done

versions=`brew versions $versions_opts $formula`
if [[ $? -ne 0 ]]; then
	print -P "%F{red}%UError%u%f: No available formula for $formula"
	exit 1
fi

object=$(echo $versions | awk '$1=="'$version'" {print $4":"$5}')
object=${object/:`brew --prefix`\//:}
if [[ -z $object ]]; then
	print -P "%F{red}%UError%u%f: No available formula for $formula version $version"
	exit 1
fi

formula_cache="`brew --cache`/Formula/$formula.rb"
git --git-dir="`brew --repository`/.git" show $object > $formula_cache
if [[ $? -eq 0 ]]; then
	brew install $install_opts $formula_cache
fi

```

ダウンロードしてパスの通ったディレクトリに置き、ファイル名を```brew-install-version```として `chmod +x` してください。

`brew install-version FORMULA VERSION` で特定のバージョンのソフトウェアをインストールします。有効なバージョンは `brew versions FORMULA` で確認できます。

インストールしたバージョンが `brew upgrade` でアップグレードされないよう固定するには `brew pin FORMULA` とします。

gist はこちら： https://gist.github.com/2987161
homebrewでバージョンを指定してインストールする


## ex) play framework 1.2.4 をインストールする場合
デフォルトでインストールされるバージョンの確認

```sh:
$ brew info play

play 2.0
http://www.playframework.org/
Not installed
https://github.com/mxcl/homebrew/commits/master/Library/Formula/play.rb
/usr/local/Library/Formula% git checkout 3caf5c5 /usr/local/Library/Formula/play.rb
/usr/local/Library/Formula% git info play 
```

利用出来るバージョンを確認

```sh:
$ brew versions play

2.0      git checkout 351d751 /usr/local/Library/Formula/play.rb
1.2.4    git checkout 3caf5c5 /usr/local/Library/Formula/play.rb
1.2.3    git checkout bee9712 /usr/local/Library/Formula/play.rb
1.2.2    git checkout 3137b6a /usr/local/Library/Formula/play.rb
1.2.1    git checkout bcdf2d5 /usr/local/Library/Formula/play.rb
1.2      git checkout 744b044 /usr/local/Library/Formula/play.rb
1.1.1    git checkout 0476235 /usr/local/Library/Formula/play.rb
1.1      git checkout eea40ff /usr/local/Library/Formula/play.rb
1.0.3.1  git checkout aa76115 /usr/local/Library/Formula/play.rb
1.0.3    git checkout 19edb1f /usr/local/Library/Formula/play.rb
```

1.2.4をインストールするように設定

```sh:
$ cd /usr/local/Library/Formula
$ git checkout 3caf5c5 /usr/local/Library/Formula/play.rb
$ brew info play

play 1.2.4
http://www.playframework.org/
Not installed
https://github.com/mxcl/homebrew/commits/master/Library/Formula/play.rb
```

インストール

```sh:
brew install play
```
NokogiriでXML文字列からHashを生成する


元ネタは https://gist.github.com/2986414/32a6c6cb9a9cc99e96f4cd9026513d0644ba0511 ここ。
2年前のものだったのでNokogiri 1.5.0で動くように改修。Hash classを拡張。

~~~~~~ruby:xml2hash.rb
# USAGE: Hash.from_libxml(YOUR_XML_STRING)
# http://movesonrails.com/articles/2008/02/25/libxml-for-active-resource-2-0
require 'nokogiri'

class Hash
  class << self
    def from_libxml(xml)
      begin
        result = Nokogiri::XML(xml)
        return { result.root.name.to_s.to_sym => xml_node_to_hash(result.root)}
      rescue Exception => e
        # raise your custom exception here
      end
    end


    def xml_node_to_hash(node)
      # If we are at the root of the document, start the hash
      if node.element?
        if node.children.present?
          result_hash = {}

          node.children.each do |child|
            result = xml_node_to_hash(child)

            if child.name == "text"
              if !child.next_element.present? and !child.previous_element.present?
                return result
              end
            elsif result_hash[child.name.to_sym]
              if result_hash[child.name.to_sym].is_a?(Object::Array)
                result_hash[child.name.to_sym] << result
              else
                result_hash[child.name.to_sym] = [result_hash[child.name.to_sym]] << result
              end
            else
              result_hash[child.name.to_sym] = result
            end
          end
          return result_hash
        elsif node.attributes.present?
          # TODO
        else
          return nil
        end
      else
        return node.content.to_s
      end
    end
  end
end
~~~~~~~~

attributesが入り組んでいると取れないのだけど簡単な構造ならHash化できる
Qiitaのデザイン(キーボード操作最適化)と検索に関する提案


###1.Qiitaもキーボード操作したい
qiitaもkobitoみたいなデザインだと閲覧がしやすいです。
jkで移動でき、選択しているものが右側に表示される感じか、アコーディオン的にひろがる感じ。で、sでストックiでインクリメント。
google readerのキー操作はけっこう使いやすいので参考にしたりしなかったりしてください。
ちなみに、google readerはjkで移動でき、fでフルスクリーンのtoggle、sでstarをつけられます。
ご検討頂けると幸いです。
###2.検索について
もしこの部分に力を入れる予定があれば、そのときに参考にしてもらえると嬉しいです。
私は、user:puriketu99 tag:〜の検索をかなり使用しているのですが、userとtagのタイプがけっこうめんどくさいです(つくる側はそっちの方が楽なイメージはありますが)。
あと、検索の際は、各人恐らく自分が書いた記事を探す頻度が高いのではないかと思いますが、もしそうであれば、そのあたりも検索時に配慮してもらえると助かります(検索結果で自分の記事が優先的に上に来る)。
モダン for (var x in obj) -> for (;;)

### 今までの `for (var in )`
JavaScript で オブジェクトをハッシュ、連想配列代わりに利用し、for 文で回す場合このように書いていました

``` javascript
var forEachHash = function (obj, callback) {
  var name;

  for (name in obj) {
    if (obj.hasOwnProperty(name)) { // prototype を除く
       callback(obj[name], name);
    }
  }
};
```

しかし、元々 `for (var x in obj)` パターンのでは、name にプロトタイプからのプロパティ名まで取得してしまいます。
なので、`Object.prototype.hasOwnProperty()` で条件付けする必要がありました。

### `Object.keys()` を使おう
ES5 で `Object.keys()` が導入されたので、`for (;;)` 文で安全に目的のプロパティのみを参照してループできるようになります。

``` javascript
var forEachHash = function(obj, callback) {
  var keys = Object.keys(obj),
        index, length, key, value;

  for(index = 0, length = keys.length; index < length; index++) {
    key = keys[index];
    value = obj[key];
    callback(value, key);
  }
};
```

`Object.keys(obj)` は引数のオブジェクトから enumable なプロパティ名のみの配列を返します。

### オブジェクトのクローンを作りたい時などは `Object.getOwnPropertyNames()`

目的がハッシュの各 `key, value` をループで取得したい場合でなく、インスタンスのクローンを作りたい場合などは `Object.keys()` でなく、 `Object.getOwnPropertyNames()` を使います。

``` javascript
// 任意のオブジェクトを複製する
var clone = function (obj) {
  var copied = Object.create(obj),
        names = Object.getOwnPropertyNames(obj),
        index, length, name, desc;

  for (index = 0, length = names.length; index < length; index++){
    name = names[index];
    desc = Object.getOwnPropertyDescriptor(obj, name);
    Object.defineProperty(copied, name, desc);
  }
  return copied;
};
```

上記の例では `Object.create()` でまず prorotype のプロパティを引き継いだ新しいオブジェクトを作り、`Object.getOwnPropertyNames()` でインスタンスメソッドやプロパティ名を取得します。
その後、 `Object.getOwnPropertyDescriptor()` で元のプロパティの読み書き制限や列挙可能か、再定義可能かなどの指定をそのまま `Object.defineProperty()` で引き継ぎさせています。
サブクラスのファイル名を取得する

```php:getfilename.php
//Symfony2のKernel.phpより
class ParentClass
{
    function getFileName() {
        $r = new \ReflectionObject($this);
        return $r->getFileName();
    }
}
```

使いそうで使わないが、あると便利。
同様にSubClassの名前を取りたい時とかに利用する。Exceptionのスーパークラスを作成するときとかに使える。
function リテラルでのコンストラクタは Object.create() するとクラス名が消える？

JavaScript を書いてる人はおそらく普段このようなコードでクラスとインスタンスを記述するかと思います。

``` javascript
var Hoge = function (foo, bar) {
  this.foo = foo;
  this.bar = bar;
};
var hoge = new Hoge('hello', 'world');
```

しかし、ES5 で導入された `Object.create()` でこのオブジェクトを複製すると、Firefox や WebKitのコンソールで `Object` と出力されてしまいます。

実際には プロトタイプチェーンを引き継いでいますし、以下のような実行結果になります。

``` javascript
var hogeClone = Object.create(hoge);
console.log(hogeClone.constructor === Hoge); // true
console.log(hogeClone instanceof Hoge); // true
```

これは、`var` による変数に無名の function リテラルでコンストラクタを宣言している場合に起きる現象です。デバッガがオブジェクトのコンストラクタを認識する時に、`hoge.constructor.name` を参照するので、無名関数リテラルではその値が空と判断され、「それじゃあ出力で表示するクラス名は タダの`Object`でいいね」と判断するためです。

``` javascript
console.log(hoge.constructor.name); // ""
```

### ちゃんとデバッガがクラス名を出力するパターン

``` javascript
var Hoge = function Hoge(foo, bar){
  this.foo = foo;
  this.bar = bar;
};

// Firefox の Firebug だと、これでもダメ。
// function Hoge () {} と完全に function 文にする必要あり。

var hoge = new Hoge('hey!', 'you!');

console.log(hoge.constructor.name); // "Hoge"
```

このようにリテラルでなく、文としてコンストラクタを宣言すると、デバッガは function.name を参照してインスタンスをクラス名で表示してくれるようになります。

### 「実行に影響ないよね？」← やり方によってはあるよ
function 文で書いてしまうと、スコープの一番先頭に移動されるので、リテラルでの宣言と挙動が変わるケースは存在します。

しかし、大抵の場合、クラスのコンストラクタ宣言でそうした影響の可能性はほぼ無いかと思われます。(別にコンストラクタがグローバルリークするわけでもないし、宣言した箇所のスコープは保持するので）
特に `var Hoge = function Hoge() {}` のように名前つき function リテラル で宣言する場合はほとんど影響ないです。

じゃあ、してもしなくてもあんまり変わらないのかというと、デバッグしやすさにおいてかなり影響があります。

すべて `var` でコンストラクタを定義してあると、せっかくクラスを定義して、メソッドやプロトタイプを当て、役割を決めているのにデバッガですべて `Object` として出力されてしまってはもったいないですよね。
リモートのファイルを操作する

リモートファイルを操作するときのやり方をメモしておきます。

リモートファイル名の書式は「/METHOD:USERNAME@HOSTNAME:FILENAME」になります。

ここでMETHODには、ssh ,rsh, telnet, su, sudo がはいります。

sshでユーザ「foo」がホスト「ruby」にある`~/.bash_profile`を編集するには、`C-x C-f /ssh:foo@ruby:~/.bash_profile`を実行します。

また、root権限で`/etc/passwd`を編集するときは、`C-x C-f /sudo:root@localhost:/etc/passwd`を実行します。
ウェブ開発で大切な3つの環境: 開発・ステージング・プロダクション

もはや常識だと思うが、ウェブシステム開発にあたって3つの環境はそれぞれ独立して用意しておくといい。（独立といっても同じサーバにあっても構わないこともある。）

* 開発サーバ: 開発者用テスト環境
* ステージングサーバ: 顧客用レビュー環境
* プロダクションサーバ: 本番環境

## 開発サーバ

開発者がコミットした内容を開発者が反映し、開発者がテストする環境。基本的に顧客や運用チームに見せることはない。

ローカル開発環境とは別に用意するのがポイント。「ローカルだと動くんだけど」病にいち早く気がつくために重要。ローカルはしばしば、開発者がライブラリへのリンクや各種設定を無意識のうちに行なっていて、そのためローカルでは動くがサーバでは動かないということがある。

この病の典型的な例としては次のようなものがある。

* Case-Insentive環境(ローカル)で動くが、Case-sensitive環境(リモート)で動かない。パスを指定したファイル名の大文字小文字など。
* コミット漏れ。
* コードベースで管理されていないライブラリへのリンク

開発サーバは、個人によるプロジェクトであろうが、チームによるプロジェクトであろうが、ローカル環境とは独立した環境として用意しておくことが望ましい。

## ステージングサーバ

ステージングは、運用担当や実際のユーザ（すなわち顧客）がテストを行う環境。ステージングには、開発サーバでテストが完了した機能・特徴が提供(デプロイ)される。

ステージングでのテストはデバッグのためのテストではなく(デバッグは既に開発サーバで完了していなければならない)、要件を満たしているか、実際の運用をするにあたって支障がないかなどを確認・レビューする。このレビューの結果、顧客からフィードバックが行われることがある。


## プロダクションサーバ

プロダクションは、システムが製品として提供され、運用担当や実際のユーザ（顧客）がシステムを利用する本番環境。ステージングでテスト（レビュー）が完了した機能・特徴が提供される。
flymake で一時ファイルの出力先をファイルと同じディレクトリにしない

Dropbox 内部でプログラムを書いていると、頻繁にファイルのアップロードと削除が行われて嫌だったので調べてみた。

結論としては、`flymake-create-temp-inplace` ではなく `flymake-create-temp-with-folder-structure` を使用すれば良さそうだ。例えば Ruby であればこんな感じ。

```cl
(defun flymake-ruby-init ()
  (let* ((temp-file   (flymake-init-create-temp-buffer-copy
                       ;; 'flymake-create-temp-inplace ← ここを変更
                       'flymake-create-temp-with-folder-structure))
         (local-file  (file-relative-name
                       temp-file
                       (file-name-directory buffer-file-name))))
    (list "ruby" (list "-c" local-file))))
```

まあ temp-file を書き換えればどうにでもなるわけだけど、わざわざ関数が用意されてるのでそれを使わせてもらうことにする。

ちなみに私の環境だとこの設定によって、/tmp 以下に絶対パスのディレクトリ構成を作成し、そこにソースファイルを作成するようになった。あと、パスの途中にピリオドの入ったディレクトリが存在するとエラーが出るようなので注意。
勉強会の参考問題の解答例。rubyで。

先日投稿した参考問題( http://qiita.com/items/cbc3af152ee3f50a822f )の解答例。
今度は ruby で。

```ruby:poka.rb
%w(
 DASAD10CAHA  S10HAD10DAC10  S3S4H3D3DA
 SASJDACJS10  CKH10D10H3HJ  S3SJDAC10SQ
).each{ |q|
  ranks=q.enum_for( :scan, /[SHDC](\d+|J|Q|K|A)/ ).to_a.flatten
  key=ranks.
      group_by{ |i| i }.
      values.
      map( &:size ).
      sort.
      join.
      to_i
  puts( {14=>'4K', 23=>'FH', 113=>'3K', 122=>'2P', 1112=>'1P', 11111=>'--' }[ key ] )
}
```

ruby の解答は、atnd ( http://atnd.org/events/30285 ) のコメントに nido さんが書いて下さったものが完璧なのであまり付け加えることもない。
とはいえ、出題時に ruby タグもつけたことだしということで実装した。
enum_for と scan を組み合わせると便利だよ、というのが nido さんの実装にない部分。

```ruby
e.group_by( &:self )
```

と書けないのが悔しい。そのためだけに自分自身を返す me とかいうメソッドを定義するのも悪くないと思う。
複数人での Git 開発に便利な 3 つのコマンド

こんにちは、 rosylilly です。すっかり Advent Calendar のことを忘れていて、大急ぎで記事を書いています。ちゃんと予定は管理しておかないといけませんね……

ということでいつも使っているコマンドの中で 3 つほど紹介されていなかったものがあったので紹介しようと思います。

## git grep コマンド

特定の語句が含まれているファイルを検索し、そのファイルでその語句が含まれている行数などを調べるコマンドです。

```shell
$ git grep "検索単語"
```

通常の `grep` コマンドなどを利用してもいいのですが、コマンドがわかりにくいのと、対象として指定するファイルを指定するのが面倒です。

その点 `git grep` だと、 git が管理しているファイルだけが検索対象になるので、手軽にリポジトリから検索することが出来ます。

また、オプションを使うことでより柔軟な検索も実現出来ます。一部を紹介しておきますので、`man git-grep` してより便利な使い方を探してみてください。

- `-i / --ignore-case` : 大文字小文字を区別せずマッチします
- `-I` : バイナリファイルを無視します
- `-w / --word-regexp` : 検索文字が単語としてマッチする時のみマッチするようになります。このオプションが指定されているとき `a` は `abc` にマッチしません
- `-v / --invert-match` : 実際にマッチした単語がない行も表示します
- `-h / -H` : マッチしたファイル名を行頭に表示するか否かの指定です。
- `--full-name` : ファイル名を表示する時、詳細なファイルパスを出力するようにします(デフォルトでは basename のみ)
- `-E / --extended-regexp` : 検索に POSIX の拡張正規表現を利用します
- `-G / --basic-regexp` : 検索に POSIX の標準正規表現を利用します
- `-P / --perl-regexp` : 検索に Perl の正規表現を利用します
- `-F / --fixed-strings` : 検索に正規表現を利用しません
- `-n / --line-number` : マッチしたファイル名の後ろにマッチした行数を表示します
- `-l / --files-with-matches / --name-only` : マッチしたファイルのファイル名だけを表示します
- `-L / --files-without-match` : マッチしなかったファイル名だけを表示します

## git commit --amend --reset-author

会社のリポジトリを clone してきて、とりえずトピックブランチを切って、さっくり適当にコミットして……という時に、うっかり個人アカウントのメールアドレスと名前でコミットしてしまった！という時などに使います。

```shell
$ git ci -m "さっくりコミット"
$ git config user.name "Sho Kusano" # --global はつけない
$ git config user.email "sho_kusano@kaisya.com"
$ git ci --amend --reset-author
```

さすがに個人用アドレスで会社のリポジトリにコミット、というのはマズイので、気づいたら直しておくのが吉です。

## git blame

「誰がバグをコミットしたか」という犯人探しは良くないのですが、実際にバグが仕込まれてしまった場合、原因究明する時に多くの場合は「どのコミットでバグが入ったか」より「どこにバグが入ったか」の方が先に見つかります。

そういったとき、特定の行のバグがどのコミットで仕込まれたかを探すには、 `git blame` が便利です。

```shell
$ git blame src/bug.js
```

とすると、左から順に

1. (その行に最後に変更を与えた)コミットハッシュ
2. ファイル名
3. コミット者の名前
4. コミットした時間
5. 行数
6. ファイルの内容

という具合に表示されます。あとは目的の行までジャンプして、コミットハッシュを特定すれば解決、という具合です。

## まとめ

いかがでしたでしょうか？すこしでも日々の開発のお役に立てば幸いです。

git にかぎらず多人数で開発するときは「自分が書いていないソースコードをいかに高速に把握するか」という能力も重要になってくると思っています。そんな中で、git には今回紹介した以外にも様々な便利なサブコマンドがあるので、ぜひぜひ探してみてください。

もし便利なものがあったら僕にも教えていただけると幸いです！

また、git で困った時に助けてくれる便利なコマンドラインツール、[git-tasukete](https://github.com/rosylilly/git-tasukete) のコミッタも募集中です！

それでは！
vimperatorプラグインcopy.jsで、いま開いてるamazonの本のページの短いURLをクリップボードにコピる。あと正規表現で好きなとこコピる

copy.jsは、今開いてるページの好きなところをクリップボードにワンタッチでコピーできるvimperatorプラグイン。
デフォルトでは、URL、ページタイトルなどがコピーできるようになってる。

以下にあるとおり、いろいろカスタマイズできる。
http://d.hatena.ne.jp/teramako/20080621/p1

amazonの長ったらしい日本語まじりURLを、短いURLにしてクリップボードにコピーする設定を書いてみた。

以下をvimperatorrcに追加

```
javascript <<EOM
(function () {
  liberator.globalVariables.copy_templates = [
    { label: 'titleAndURL',    value: '%TITLE%\n%URL%' },
    { label: 'title',          value: '%TITLE%', map: ',y' },
    { label: 'anchor',         value: '<a href="%URL%">%TITLE%</a>' },
    { label: 'selanchor',      value: '<a href="%URL%" title="%TITLE%">%SEL%</a>' },
    { label: 'htmlblockquote', value: '<blockquote cite="%URL%" title="%TITLE%">%HTMLSEL%</blockquote>' },

    // ↑ここまでデフォルであるやついろいろ。ここからamazon↓
    { label: 'amazon',   value: 'copy clean amazon url from current page',
      custom: function() {
        var m = content.document.location.pathname.match(/dp\/(\d+)/);
        return m ? ('http://amazon.jp/dp/' + m[1]) : null;
      }
    },
  ];
})();
EOM
```

.vimperatorrcファイル上では、javascriptコマンドに文字列を食わすと実行できる。
vimperatorのコンテキストで実行されるため、documentオブジェクトにさわるには、content.document と書かないといけないので注意。


無名関数を渡せるので割となんでもできて便利。
以下は、ページ内のコンテンツのうち、正規表現にまっちする文字列をコピーする設定

```javascript
    { label: 'PA', value: 'copy account_id from CMSP', map: ',pa',
      custom: function() {
        var regexp = /PA\d{8}/;

        return (function (e, re) {
          var m = e.textContent.match(re);
          if (m) return m[0];
          
          for (var i = 0; i < e.children.length; i++) {
            var result = arguments.callee(e.children[i], re);
            if (result) return result;
          }
          return null;
        })(content.document.body, regexp);
      }}

```
Ant で Ivy の jar をダウンロードさせて、その jar からタスクを定義する

依存性の解決に [Apache Ivy](http://ant.apache.org/ivy/) を使っているが、コードの共有者が Ant を入れていても Ivy は入れていない場合に、Ivy インストールのため最初に実行してもらうタスクのマークアップです。

```ant:build.xml
<project xmlns:ivy="antlib:org.apache.ivy.ant">
    <condition property="ivy.home" value="${env.IVY_HOME}">
        <isset property="env.IVY_HOME" />
    </condition>
    <property name="ivy.home" value="${user.home}/.ivy2" />
    <property name="ivy.install.dir" value="${ivy.home}/lib" />
    <property name="ivy.install.dest" value="${ivy.install.dir}/ivy.jar" />

    <target name="-check-ivy-user-installed" description="check ivy jar file existence on user's ivy home">
        <available file="${ivy.install.dest}" property="ivy.install.dest.exisits" />
    </target>

    <target name="-taskdef-user-ivy" depends="-check-ivy-user-installed" if="ivy.install.dest.exisits">
        <path id="ivy.install.path">
            <fileset dir="${ivy.install.dir}" includes="*.jar" />
        </path>
        <taskdef resource="org/apache/ivy/ant/antlib.xml"
                 uri="antlib:org.apache.ivy.ant" classpathref="ivy.install.path"/>
    </target>

    <target name="install-ivy" description="Download Ivy jar file to ivy home">
        <property name="ivy.install.version" value="2.2.0" />
        <property name="ivy.install.src"
            value="http://repo1.maven.org/maven2/org/apache/ivy/ivy/${ivy.install.version}/ivy-${ivy.install.version}.jar" />

        <mkdir dir="${ivy.install.dir}" />
        <get src="${ivy.install.src}" dest="${ivy.install.dest}" usetimestamp="true"/>
    </target>

    <target name="clean-ivy" description="Delete Ivy jar file from ivy home">
        <delete file="${ivy.install.dest}" />
    </target>

    <!-- sample task to use user ivy -->
    <target name="resolve" description="Resolve dependency" depends="-taskdef-user-ivy">
        <ivy:resolve />
    </target>
</project>
```

```sh:usage
ant install-ivy
```

一方で、これをプロジェクトのビルドファイルに含めるのは、あまり合理的ではないかもしれません。
勉強会の参考問題の解答例。C言語で。

先日投稿した参考問題( http://qiita.com/items/cbc3af152ee3f50a822f )の解答例。
C99で。

```c:poka.c
/* use "-std=c99" */

#include <stdio.h>
#include <string.h>

#define ENDOF(ary) ( ary+sizeof(ary)/sizeof(*ary))

_Bool is_rank( char ch )
{
  return ! strchr( "SHDC1", ch );
}

int poka_key( char const * q )
{
  int lines=0;
  for( char const * from = q ; *from ; ++from ){
    if ( ! is_rank( *from ) ){
      continue;
    }
    for( char const * to=q ; to<from ; ++to ){
      if ( ! is_rank( *to ) ){
        continue;
      }
      if ( *from==*to ){
        ++lines;
      }
    }
  }
  return lines;
}

void poka( char const * q )
{
  int key=poka_key(q);
  puts( ((char const*[]){
    [6]="4K",
    [4]="FH",
    [3]="3K",
    [2]="2P",
    [1]="1P",
    [0]="--"
  })[key] );
}

int main()
{
  char const * q[]={
  "DASAD10CAHA",
  "S10HAD10DAC10",
  "S3S4H3D3DA",
  "SASJDACJS10",
  "H10D10H3HJCK",
  "S3SJDAC10SQ" };
  for( char const ** it=q ; it!=ENDOF(q) ; ++it ){
    poka(*it);
  }
}

```

やっぱりC言語だと長くなる。複合リテラルとか、指示付き初期化子とか使ってみた。
実装の方針は「同じランクのカードを線でつないでグラフを書いた時の、辺の数をかぞえると役がわかる」というもの。
カードが5枚だからたまたま成立する作戦で、カードが6枚だと、223344と222345が両方 3 になるのでうまくいかない。

ところで。
トラックバックの類はないのかなぁ。
RailsコンソールにPryを使う


知らなかった。PryがRailsコンソールに使えるだなんて。

```
$ cd rails_some_app
$ pry -r ./config/environment
```

しかもいろいろ便利機能満載でびっくりしました。

##モデルをサクサク取り回しできる
例えば、Userモデルにcd（えっ？）すると

```
pry(main)> cd User
pry(user):1> self
=> User(id: integer, name: string, age: integer, created_at: datetime, updated_at: datetime)
```

いちいちモデル名を頭につけなくてもよかったりする。

```
pry(user):1> all

pry(user):1> first

pry(user):1> find 10
```



##ブレークポイントの設定ができる
Gemfileにpryを設定してbundle installして、

```Gemfile
gem 'pry', :group => :development
```

binding.pry でブレークポイントを設定。

```users_controller.rb
  def index
    @users = User.all
    binding.pry 

```

でrails server走らせてブラウザでアクセスすると？

```
[2012-06-24 00:04:23] INFO  WEBrick 1.3.1
[2012-06-24 00:04:23] INFO  ruby 1.9.3 (2012-04-20) [x86_64-darwin11.4.0]
[2012-06-24 00:04:23] INFO  WEBrick::HTTPServer#start: pid=12823 port=3000

From: /Users/hoge/testAp030303/app/controllers/users_controller.rb @ line 4 UsersController#index:

     4:   def index
     5:     @users = User.all
 =>  6:     binding.pry
     7: 
     8:     respond_to do |format|
     9:       format.html # index.html.erb
    10:       format.json { render json: @users }
    11:     end
    12:   end

[1] pry(#<UsersController>)> 
```

プレイクポイントでPryが立ち上がってくれる。
先に行かせたいときは

```
[1] pry(#<UsersController>)> exit-all
```

まだいろいろある。スゴイ(；´Д｀)

[こちらのサイトより抜粋いたしました-->Pry With Rails](http://asciicasts.com/episodes/280-pry-with-rails)