OmniAICreator/Qiita-1.07M huggingface dataset:
数値文字列に3桁区切りでカンマを入れる処理 

# 簡易コード

```javascript:delimiter.js
var num = '10000000';
num = num.split(/(?=(?:\d{3})+$)/).join();
```

正規表現は素晴らしい。

**(2014/11/07追記)**

元々、この実装は「正規表現を使っていかに短く書けるか」「String.prototype.replace のコールバック関数を使わずに書けるか」の着想を元にコーディングしています。
その為、かなり割り切った仕様にしており、下記制約があります。

- 数値文字列と数値以外の文字列が混在した文字列をサポートしない(完全な数値文字列でなければならない)
- 整数値のみをサポートし、小数値をサポートしない

# 本格的なコード

前述でサポートされなかった仕様に対応するためには String.prototype.replace のコールバック関数を利用するしか手段はないと考えています。
具体的には下記のようになります。

```js:insert-comma-delimiter.js
/**
 * insert-comma-delimiter.js
 * Insert commas in a numeric string.
 *
 * @version 1.0.1
 * @author think49
 * @url https://gist.github.com/think49/c13758815bc0af4b19e3
 * @license http://www.opensource.org/licenses/mit-license.php (The MIT License)
 */

'use strict';

/**
 * insert comma delimiter
 * @function
 * @param  {String} numberString Numeric string of decimal or integer.
 * @return {String} Numeric string of comma-separated.
 */
function insertCommaDelimiter (numberString) {
  return numberString.replace(/(\d+)(\.\d+)?/, function (subString, capture1, capture2) {
    capture1 = capture1.split(/(?=(?:\d{3})+$)/).join();
    return capture2 ? capture1 + capture2.replace(/(\d{3})(?=\d)/, '$1,') : capture1;
  });
}


/**
 * test
 */
var strings = ['私の戦闘力は530000です。',
               'STEINS;GATE(シュタインズゲート)世界線の世界線変動率は1.048596です。',
               'Aさんの犯罪係数オーバー10000、執行対象です。対象の脅威判定が更新されました。執行モード、リーサル・エリミネーター。慎重に照準を定め対象を排除してください。'];

console.log(insertCommaDelimiter(strings[0])); // 私の戦闘力は530,000です。
console.log(insertCommaDelimiter(strings[1])); // STEINS;GATE(シュタインズゲート)世界線の世界線変動率は1.048,596です。
console.log(insertCommaDelimiter(strings[2])); // Aさんの犯罪係数オーバー10,000、執行対象です。対象の脅威判定が更新されました。執行モード、リーサル・エリミネーター。慎重に照準を定め対象を排除してください。
```

# 参考

- [insert-comma-delimiter.js - gist](https://gist.github.com/think49/c13758815bc0af4b19e3)
- [15.5.4.14 String.prototype.split - ES3(ja)](http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/15-5_String_Objects.html#section-15.5.4.14)
- [15.4.4.5 Array.prototype.join - ES3(ja)](http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/15-4_Array_Objects.html#section-15.4.4.5)
- [15.5.4.11 String.prototype.replace - ES3(ja)](http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/15-5_String_Objects.html#section-15.5.4.11)
iTerm2 で emacs で C-tab で other-window

C-x o で other-window するのは2ストロークでつらいので Chrome みたいに C-tab とか1ストロークにしたい。

ただ、iTerm2 でターミナル内の emacs で C-tab は、tab が C-i 扱いなのでとれない。そこで

* iTerm2 の preference の keys で C-tab に別のキーを送るようにカスタマイズ
** 自分は M-p にした
* そのキーに、other-window を割り当て

で ok

ついでなので http://d.hatena.ne.jp/rubikitch/20100210/emacs から other-window-or-split も拝借。

````elisp:init.el
(defun other-window-or-split ()
  (interactive)
  (when (one-window-p)
    (split-window-horizontally))
  (other-window 1))
(global-set-key (kbd "M-p") 'other-window-or-split)
````

tab が C-i なのに気づかなくて3時間くらいはまりました...。
複数プロセス間での排他制御

`File.flock` を使うのが簡単、という結論に到達した。

```ruby
require 'timeout'
class AccessDenied < StandardError; end
def lock(&block)
  # 10秒以内に終わらない場合はAccessDenied例外が発生
  Timeout::timeout(10) do
    open(File.join(Dir.tmpdir, 'my-application.lock'), 'w') do |f|
      begin
        f.flock(File::LOCK_EX)
        block.call
      ensure
        f.flock(File::LOCK_UN)
      end
    end
  end
rescue Exception => ex
  raise AccessDenied.new('timeout')
end
```

```ruby
lock do
  # 排他処理
end
```
Sencha Touch SDK でアプリケーションを generate する


http://www.sencha.com/products/sdk-tools

をダウンロードすると、`sencha generate app application_name path` でアプリケーションのテンプレートが作れる。

ただし、sencha touch 2 sdk へのパスが通っている必要がある。もしくは、sencha touch 2 sdk をダウンロードしたパスに移動して実行する。

```bash:sh
~% cd sencha-sdk-folder
./sencha-touch-2.0.0-commercial% sencha generate app avfs ../sencha
[INFO] Created file sencha/.senchasdk
[INFO] Created file sencha/index.html
[INFO] Created file sencha/app.js
[INFO] Created file sencha/packager.json
[INFO] Created file sencha/app.json
[INFO] Created file sencha/app/view/Main.js
[INFO] Copied dir: sencha/sdk/src
[INFO] Copied dir: sencha/sdk/resources
[INFO] Copied dir: sencha/resources/icons
[INFO] Copied dir: sencha/resources/loading
[INFO] Copied dir: sencha/sdk/command
[INFO] Copied file: sencha/sdk/microloader/development.js
[INFO] Copied file: sencha/sdk/microloader/testing.js
[INFO] Copied file: sencha/sdk/microloader/production.js
[INFO] Copied file: sencha/sdk/version.txt
[INFO] Copied file: sencha/sdk/sencha-touch.js
[INFO] Copied file: sencha/sdk/sencha-touch-all.js
[INFO] Created file sencha/resources/sass/app.scss
[INFO] Created file sencha/resources/sass/config.rb
[INFO] Copied file: sencha/resources/css/app.css
```

パスが通っていないところで実行しても何も起きない（エラーも吐かない）ので注意。

作ったアプリケーションは、sencha app build testing などで最適化可能。

参考：http://docs.sencha.com/touch/2-0/#!/guide/getting_started
rvmrc を無視してしまった後に有効にするコマンド


有用な記事があったのでそちらを参考にすれば良いのですが
[.rvmrcの扱いを明示するrvm rvmrcコマンド](http://aligach.net/diary/20110820.html)

rvm rvmrc trust

で切り替えられます。

rvm rvmrc コマンドは他にも機能があるので詳細は上記記事か公式ドキュメント、ヘルプなどで確認して下さい。
mrubyをOSXでコンパイルする


*SIZEOF_ST_INDEX_T* が無いエラーだけ修正。後は上手くいった。

```bash:install-mruby
$ git clone git://github.com/mruby/mruby.git
$ cd mruby

# Issue https://github.com/mruby/mruby/issues/27
#   Patch https://gist.github.com/2430822
$ emacs src/st.c

$ make

$ cd bin
$ ./mruby test.rb 
Hello, mruby!!
```

```ruby:test.rb
puts 'Hello, mruby!!'
```
mrubyのソースコードを検索出来るようにしてみた


![image](http://s1-02.twitpicproxy.com/photos/full/564725790.png?key=305340)

フォルダやファイル名、特定の関数をキーワードに検索出来ます。

* [mrubyソースコード検索](http://kodeworld.ongaeshi.me/home/mruby?query=)
* ['f:ja'で検索](http://kodeworld.ongaeshi.me/home/mruby?query=f:ja)

手動で更新しているので、最新を追っかけたいのであればgithubの方が無難です。

* [mruby/mruby](https://github.com/mruby/mruby)
Mac作業環境メモ

Last Updated: 2012.04.20

何かあったときのために自分のMacの環境をメモしておきます。
便利なツールなどなど盛り込まれているので、もしかしたら参考になるものもあるかも。
※まだまだ追記します

## MacApp

### Utility

+ ClamXav: http://www.clamxav.com/
+ FreeMemory: http://itunes.apple.com/jp/app/freememory/id460931672
+ Growl: http://growl.info/
+ Scansnap: from DISC
+ googleIME: http://www.google.co.jp/ime/index-mac.html
+ AppCleaner: http://www.freemacsoft.net/appcleaner/
+ Skype: http://www.skype.com/intl/ja/get-skype/
+ DropBox: https://www.dropbox.com/
+ Sugersync: http://www.sugarsync.jp/download.html
+ Thunderbird: http://mozilla.jp/thunderbird/
+ SecondBar: http://blog.boastr.net/?page_id=79
+ StuffIt Expander: http://www.act2.com/software/smithmicro/stuffitexpander2011 
+ VMwareFusion: http://www.vmware.com/jp/products/desktop_virtualization/fusion/overview.html
+ WindowsXP: from Disc
 

### Browser

+ googleChrome: http://www.google.co.jp/chrome/intl/ja/landing_ch.html
+ firefox: http://mozilla.jp/firefox/ 
+ 

### Dcoument

+ Kobito: http://kobitoapp.com/
+ MacOffice: from DISC
+ Keynote: from Appstore
+ Evernote: http://www.evernote.com/about/intl/jp/

### Photo

+ Skitch: from AppStore


## Develop

### HTML

+ Coda: http://www.panic.com/jp/coda/
+ Mi: http://www.mimikaki.net/
+ Filezilla: http://filezilla-project.org/

### Design

+ Adobe:from DISC

### Program

+ iTerm2: http://www.iterm2.com/#/section/home
+ Xcode: from Appstore
+ Titanium Studio
+ LAMP
+ Homebrew: http://mxcl.github.com/homebrew/
	+ Emacs
	+ sl
	+ nkf
	+ tmux
	+ git
	+ curl
	+ readline
	+ ruby
		+ rbenv: form brew
		+ ruby-build: form brew
	+ wget
	+ spidermonkey
	+ xdebug
	+ node.js


## Browder 

### Chrome-Add-on

+ Google Mail Checker
+ MeasureIt
+ Pendule
+ Screen Capture (by Google)
+ はてなブックマーク GoogleChrome 拡張
+ AutoPagerize

### Chrome設定

+ 個人設定＞パスワード＞保存しない
+ 個人設定＞自動入力＞チェック外す
+ 個人設定＞ツールバー＞両方チェック入れる

### Firefox-Add-on

+ Firebug
+ FireMobileSimulator
+ ツリー型タブ
+ DownloadHelper
+ はてなブックマーク
+ ColorZilla
+ Awesome screenshot
AndroidでWebViewを使用する際の注意点

Androidのアプリ内でWebViewを使用する際に、サイトページ内に、window.open(url)やwindow.location.href=urlを使用したが画面遷移があると、うまく画面遷移ができない。

解決策は、shouldOverrideUrlLoadingをオーバーライドして、各種サービスの起動を明記する。

下記例では、urlが、「mailto:」で始まった時はメールアプリを起動する暗黙的インテントを発行し、TwitterやFacebookのシェアボタンをタップした時には、画面遷移先を読み込むようにしている。

```java:CustomWebView.java
		wb = (WebView) findViewById(R.id.event_wb);
		wb.setWebChromeClient(new WebChromeClient());
		wb.setWebViewClient(new WebViewClient() {
			@Override
			public boolean shouldOverrideUrlLoading(WebView webView, String url) {
				Intent intent = null;
				if(url.substring(0, 7).equals("mailto:"))
					intent = new Intent(Intent.ACTION_SENDTO, Uri.parse(url));
				else if(url.contains("twitter") || url.contains("facebook"))
					intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
				if(intent != null) {
					startActivity(intent);
					webView.reload();	
				}
				return true;
			}
		});
		WebSettings settings = wb.getSettings();
		settings.setJavaScriptEnabled(true);
```
Exif 情報を確認し、GPS 位置情報を削除する

` Mac `を使って、` Exif `情報を確認し、その中の` GPS `位置情報を削除してみます。` Sample `のために、` GPS `位置情報がついた画像ファイルをダウンロードします。ちなみに、` Exif `情報とはいわゆる` GPS `位置情報を含む情報のことです。


###Exif 情報の確認

```ruby:Terminal

#Tool Download
brew install exiftool

#Sample File Download
wget -b http://kent3583.cocolog-nifty.com/blog/images/2009/11/17/004.jpg

#Exif Search
exiftool 004.jpg

#Exif Search (Japanese)
exiftool -lang ja 004.jpg

```

###Exif 情報の削除

```ruby:Terminal

exiftool -overwrite_original -geotag= 004.jpg

```

正規表現を使い、` GPS `位置情報をまとめて削除することもできたと思います。その場合は、` *.jpg `とでもします。
` exiftool `を使って` GPS `位置情報の削除を多用する場合は、` alias `を設定しておくと便利です。


###参考URL
[Mac固有コマンド](http://macwiki.sourceforge.jp/wiki/index.php/OSX%E3%81%AE%E5%9B%BA%E6%9C%89%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89)
www.example.comをexample.comにリダイレクトする


今回は.htaccessをいじりました。

```.htaccess
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.example\.com(:80)?
RewriteRule ^(.*) http://example.com/$1 [R=301,L]
```

RewriteRuleの第一引数に"/"を入れるとリダイレクトされなかった。

> RewriteRule ^/(.*) http://example.com/$1 [R=301,L]

RewriteRuleの第三引数で"R=301,"と"L"の間にスペースを入れたらエラーになった。

> RewriteRule ^(.*) http://example.com/$1 [R=301, L]

参考: http://httpd.apache.org/docs/current/mod/mod_rewrite.html
StrictModeをadb shellからoffにする

Android4.0(3.xから？)のエミュレータ等でStrictMode機能をONにしていなくてもStrictMode機能が
ONの状態となり、UIスレッド上でDBにアクセスした場合など画面全体に赤枠が点滅表示され、ユーザ
にパフォーマンスの低下が通知されます。

DevToolsアプリからでも機能をOFFにすることもできますが、システムプロパティを設定することでも可能です。

```shell:qiita.rb
adb shell setprop persist.sys.strictmode.visual 0
```

ブログ：http://yuki312.blogspot.jp/2012/01/strictmode.html
MacのターミナルでEmacsを使う場合 C-@ と C-space は同じコマンドとして認識されるらしい

表題の通り。
MacのターミナルだけなのかEmacsだけなのかなど詳しいことは分からない。

普段Emacsのキーバインドにanything起動を C-@ に設定していて、ターミナル上ではなくEmacs.appを使っていたが、この設定のままターミナル上でEmacsを使ったらC-spaceでMarksetされなくて大分長い時間四苦八苦しちゃったんでメモとして残しておく。
anythingを別のキーにバインドしたら直った。
Formtastic でデフォルトの value 値を入力する方法


Rails で Form の生成を楽にしてくれる Formtastic でちょっとはまったので共有します。

```ruby
f.input :email, value: params[:email]
```

のようにはできません。

```ruby
f.input :email, input_html: { :value => params[:email] }
```

のようにします。

### 参考
[ruby on rails - formtastic - how to prepopulate a string input with a value - Stack Overflow](http://stackoverflow.com/questions/2044497/formtastic-how-to-prepopulate-a-string-input-with-a-value "ruby on rails - formtastic - how to prepopulate a string input with a value - Stack Overflow")
「Can't connect to local MySQL server through socket '/tmp/mysql.sock'」というエラーについて


##こういうエラーが起きたときに
MySQLサーバーに接続しようとすると
「Can't connect to local MySQL server through socket '/tmp/mysql.sock'」
のようなエラーが出て接続ができない。

##対処方法の前に

このエラーメッセージは
「_ソケット'/tmp/mysql.sock'を通じてローカルMySQLサーバーに接続することができません__」
という意味。

ソケットとは、プロセス、ネットワークの間での通信に使われるもので、今回のケースではMySQLでのサーバー、クライアント間の通信（やりとり）がソケットを通じて行われます。

##考えられるエラー
1.MySQLサーバーが起動していない
2.MySQLサーバーで使っているUNIXソケットとクライアントソフトで使っているUNIXソケットのパスが違う
3.なんらかの理由でソケットファイルが削除されている

##結果として
今回、エラーが起きたのは１番目の「MySQLサーバーが起動してない」という重大で簡単なミスでした。

```MySQLサーバーの起動
mysql.server start
```
これで起動出来て、エラーもなくなりました。

参考URLページを見つけなかったら、簡単なこんなことも調べずにどんどん泥沼にはまるところでした。

次からは気をつけます。


（参考URL：http://www.hi-ho.ne.jp/tsumiki/book_sup2.html）
tmux 起動中に Mac のクリップボードを共有する

通常の設定では` tmux `で` Mac `のクリップボードが共有されないようなので、必要な設定を済ませます。` Shell `は、` zsh ` を前提として話を進めます。


```ruby:Terminal

mkdir ~/bin && echo "PATH=$HOME/bin:$PATH" >> ~/.zshrc

git clone git://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard.git

cd ~/tmux-MacOSX-pasteboard

make reattach-to-user-namespace

cp reattach-to-user-namespace ~/bin

vim ~/tmux.conf

```

` tmux `の設定ファイルに以下を追記します。

```ruby:~/.tmux.conf

set-option -g default-command "reattach-to-user-namespace -l zsh"

```

###参考URL
http://d.hatena.ne.jp/Yuzuemon/20120222/1329841466
Mac での App の Download から Install まで

ここでは、` Mac `での` App `の` Download `から` Install `までをすべて端末上で作業してみます。以下は、具体例ですので、各自、ダウンロードするファイルやマウントするファイル名のところは、変更してください。

```ruby:Terminal

#Download
curl -O http://www.zipeg.com/downloads/zipeg_mac.dmg

#Mount
hdid zipeg_mac.dmg

#Move
cd /Volumes/Zipeg/

#Cope
cp -Ri Zipeg.app /Applications

#Start
open -a Zipeg

```
create event and dispatch


Event objectの作り方メモ。

```javascript
function _click(e) {
    console.log(e);
    alert('Clicked!');
}

function _loaded(e) {
    
    var evt = document.createEvent('MouseEvent');
    
    evt.initMouseEvent(
	'click', //type
	true,    //canBubble
	true,    //cancelable
	window,  //view
	0,       //detail
	0,       //screenX
	0,       //screenY
	0,       //clientX
	0,       //clientY
	false,   //ctrlKey
	false,   //altKey
	false,   //shiftKey
	false,   //metaKey
	0,       //button
	null     //relatedTarget
    );
    
    //execute a 'click' event.
    document.dispatchEvent(evt);
}

document.addEventListener('click', _click, false);
document.addEventListener('DOMContentLoaded', _loaded, false);
```
Terminal 上で Google 検索と ALC 検索を行う

ここでは、Terminal 上で使用している Shell を zsh として話を進めます。OS は Ubuntu です。


###テキストブラウザ w3m の Install 

```ruby:Terminal

sudo apt-get install -y w3m

vi ~/.zshrc

```

###設定ファイルに以下を追記します。

```ruby:~/.zshrc

# w3mでgoogle検索
function google() {
local str opt
if [ $ != 0 ]; then
for i in $*; do
str="$str+$i"
done
str=`echo $str | sed 's/^\+//'`
opt='search?num=50&hl=ja&lr=lang_ja'
opt="${opt}&q=${str}"
fi
w3m http://www.google.co.jp/$opt
}

# w3mでALC検索
function alc() {
if [ $ != 0 ]; then
w3m "http://eow.alc.co.jp/$*/UTF-8/?ref=sa"
else
w3m "http://www.alc.co.jp/"
fi
}

```


###検索
あとは、Terminal 上で以下の様なコマンドを用いれば、w3m が起動し、キーワードを検索してくれます。

$ google キーワード

$ alc キーワード
SSH の代替として Mosh を使う

Remote 接続に Mosh を使用すると、SSH と比べて体感速度が速くなると言われています。


###Ubuntu Server に Mosh を Install する

```ruby:Terminal

sudo add-apt-repository ppa:keithw/mosh

sudo apt-get update && sudo apt-get install -y mosh

```

###Mac Client に Mosh を Install する

```ruby:Terminal

brew install mobile-shell

```

###必要な初期設定と接続

```ruby:Terminal

#Server 側
sudo ufw allow 60000:61000/udp

#Client 側
mosh [host]

```

###接続できない場合の対処例

```ruby:Terminal

#Server
mosh-server

#Client
mosh remotehost --server="LANG=$LANG mosh-server"

echo "Port XXXX" > ~/.ssh/config

mosh username@IP Address

```

( XXXX には、SSH で使っている Port Number でも入れてください)


###参考URL
http://mosh.mit.edu/#getting
カレントディレクトリでHTTPサーバ立ち上げる

```sh
$ python -m SimpleHTTPServer 8888
```

で、ブラウザから `http://localhost:8888/` が見られる。

ソースコードダウンロードしたは良いけど、ドキュメントが HTML。。。だと。。。って時に使う。
mruby - Lightweight Ruby

ついに出ましたよ、待ってました。

[mruby/mruby](https://github.com/mruby/mruby/) 

* [Rails Hub情報局: ついに軽量Rubyの「mRuby」のソースコードが公開！](http://el.jibun.atmarkit.co.jp/rails/2012/04/rubymruby-2004.html) 

すでにmrubyに関連した派生プロジェクトも始まってます。iOSアプリを書いたりとか・・

* [MobiRuby](http://mobiruby.org/#) 

ダウンロードしたり、コンパイルした人とかいたらコメントに書いてくれると嬉しいです。
Terminalのプロンプト変数の変更



```terminal
Yoshinori-no-MacBook:~ sugiyama$ 
```
ターミナルには、常にホスト名、ディレクトリ名、ユーザ名が書かれてあって非常に目障りだったので、今日はここを短くする。

このときに表示されるこのような文字列を___プロンプト変数___と呼ぶらしい。




この変数の設定は、/etc/profile や.bashrcなどで___PS1___という変数を設定することで実現している.

\u はユーザ名 --> 
\h はホスト名 --> 
\w は作業ディレクトリ名

らしいので、おそらく・・・

```.bashrc
PS1='\h:\w \u\$'
```
という風に設定されていると予測できる。



```.bashrc
PS1='machine:\h dir:\w user：\u$'
```
と変更してみる。

```
machine:Yoshinori-no-MacBook dir:~ user：sugiyama$
```
こんな感じで長くなった。

実際にはこんなにいらないので、
ホスト名とユーザ名は表示なしで、

```.bashrc
PS1='\w\$ '
```

```
~$
```
こんな感じでスッキリしました。

重要なコマンド
source ファイル名：再読み込み
（.bashrcをこれで読まないと変更が次回起動まで適用されない）
Vim Plugin を管理する

###Plugin 管理 System の Download
```ruby:Terminal
git clone http://github.com/gmarik/vundle.git ~/.vim/bundle/vundle

echo "source ~/.vim/bundle/vundle/test/minirc.vim" >> ~/.vimrc

vim ~/.vim/bundle/vundle/test/minirc.vim

```

###Plugin の Install
```ruby:~/.vim/bundle/vundle/test/minirc.vim
以下を入力
:BundleInstall
```

###Plugin の 追加
```ruby:~/.vim/bundle/vundle/test/minirc.vim
Bundle 'gmarik/vundle'

"以下にインストールしたい Plugin を追記していきます。
Bundle 'Shougo/vimfiler'
Bundle 'Shougo/unite.vim'
Bundle 'Shougo/vimproc'
Bundle 'Shougo/vimshell'
Bundle 'Shougo/neocomplcache'
Bundle 'mattn/zencoding-vim'
Bundle 'majutsushi/tagbar'
Bundle 'taku-o/vim-screenshot'
Bundle 'slimv.vim'
Bundle 'thinca/vim-ref.git'
.
.
.


```

###参考URL
https://github.com/Shougo/shougo-s-github/blob/master/vim/.vimrc
require.jsっぽくファイルを読み込む

配列の各要素に0を突っ込んでおいて読み込みが完了したらレスポンスを突っ込む。
すべて埋まったら(0が入っている要素がなくなったら)comleteを呼ぶ。

```:javascript
function load(urls, complete){
  urls = Array.isArray(urls) ? urls : [urls];
  complete = complete || function(){};
  var results = [];
  
  urls.forEach(function(url, i){
    var xhr = new XMLHttpRequest;
    xhr.open('GET', url);
    xhr.responseType = 'arraybuffer';
    xhr.onloadend = function(){
      var s = xhr.status;
      if(s == 200 || s == 206 || s == 0) {
        results[i] = xhr.response;
        results.indexOf(0) === -1 && complete.apply(null, results);
      } else {
        throw "Load Error: " + s;
      }
    };
    results[i] = 0;
    xhr.send();
  });
};
```

使用例

```:javascript
load(["a.txt", "b.zip", "c.mp3"], function(a, b, c){
//なにか処理
});
```
ActiveSupportの時間のフォーマットに関するメモ


(注) 2.3.9 向け

以下に定義されている。

* Time::DATE_FORMATS
* Date::DATE_FORMATS

拡張する場合は config/initializers/date_time_format.rb などを作って、以下のように書いておく。

```ruby:
ActiveSupport::CoreExtensions::Date::Conversions::DATE_FORMATS.merge!(:nyan => '%m月%d日だにゃん')

ActiveSupport::CoreExtensions::Time::Conversions::DATE_FORMATS.merge!(:nyanco => '%Yねん%mがつ%dにち %Hじ%Mふん%Sびょうにゃー')
```

使用例：

```ruby:
Time.current.to_s(:nyanco) #=> 2012ねん4がつ20にち 12じ33ふん35びょうにゃー
```
Deferred


簡単なDeferredを実現するもの。

```javascript
/**
 * Deferred object
 * @returns {Object}
 * @returns Object.resolve Provide resolve. 
 * @returns Object.done If deferred is resolved, call this function.
 */
function Deferred() {
    
    var queue = [],
    	data;
    
    function resolve(arg) {
	
	var arr = [].concat(queue),
	    len = arr.length,
	    i   = 0;
	
	queue = null;
	data  = arg;
	
	for (; i < len; i++) {
	    arr[i](arg);
	}
	
	return this;
    }
    
    function done(fnc) {
	
	var arr = queue;
	
	arr ? arr.push(fnc) : fnc(data);
	
	return this;
    }
    
    return {
	resolve: resolve,
	done   : done
    };
}

/**
 * When all deferred object is resolved, will be called done.
 */
function when() {
    
    var dfd = new Deferred(),
	arr = [].slice.call(arguments),
	i = arr.length,
	len = i;

    while (i--) {
	arr[i].done(doneHandler);
    }
    
    function doneHandler() {
	--len || dfd.resolve();
    }
    
    return dfd;
}
```
サーバーにソースコード検索エンジンを設置する


![kodeworld](http://s1-02.twitpicproxy.com/photos/full/563818276.png?key=598393)

**過去に書いたコード**と、参照することの多い**Rubyのソースコード**をいつでも検索出来るようにしてみました。

[Kodeworld](http://kodeworld.ongaeshi.me/)

* [パッケージ一覧](http://kodeworld.ongaeshi.me/home)
* ['def transpose'で検索](http://kodeworld.ongaeshi.me/home?query=def+transpose+)


[Milkode](http://milkode.ongaeshi.me/wiki/Main_Page)という自作のソースコード検索エンジンを利用しています。類似のものとしてはgonzuiやOpenGrokが有名です。検索エンジンにgroongaを利用しているため、MySQL等のDBエンジンを必要としません。他の物と比べると比較的インストールは簡単なのではないかと思います。

## デプロイに必要なもの
* ruby
* gem install milkode
* Passenger (デプロイ用、何でもよい)

以下のような簡単なコードを書いて *bundle install* して準備完了です。

[kodeworld - Milkode](http://kodeworld.ongaeshi.me/home/kodeworld) - [github](https://github.com/ongaeshi/kodeworld)

デプロイにはPassengerを使いました。
Google Chrome のアドレスバーから Qiita で検索する

## 1. 検索のテキストフィールド上で右クリックして「検索エンジンとして追加...」を選ぶ

![1. 検索のテキストフィールド上で右クリックして「検索エンジンとして追加...」を選ぶ](http://30d.jp/img/kyanny/public/8736dd40-8a3e-11e1-9d4f-00262d0af68e_original.jpg)

## 2. ダイアログがでるので OK 押すと検索エンジンとして追加される。キーワードは短くて覚えやすいものが良いので q がオススメ

![2. ダイアログがでるので OK 押すと検索エンジンとして追加される。キーワードは短くて覚えやすいものが良いので q がオススメ](http://30d.jp/img/kyanny/public/87bb5a3e-8a3e-11e1-ade7-00262d0af68e_original.jpg)

## 3. アドレスバーに q [SPC] と入力すると「qiita.com を検索」と薄い青地で表示されて、続けてキーワードを入れて [RET] すると http://qiita.com/search?utf8=%E2%9C%93&q=rails&commit=%E6%A4%9C%E7%B4%A2 みたいな URL にジャンプする。注意点として、検索トリガーのキーワード（この例だと q です）のあとにスペースを入れないとダメ

![3. アドレスバーに q [SPC] と入力すると「qiita.com を検索」と薄い青地で表示されて、続けてキーワードを入れて [RET] すると http://qiita.com/search?utf8=%E2%9C%93&q=rails&commit=%E6%A4%9C%E7%B4%A2 みたいな URL にジャンプする。注意点として、検索トリガーのキーワード（この例だと q です）のあとにスペースを入れないとダメ](http://30d.jp/img/kyanny/public/8836d880-8a3e-11e1-ade7-00262d0af68e_original.jpg)

## 4. 検索結果はこういう感じで、ふつうに qiita.com にアクセスして検索するのと同じだけど幾分手間が省ける

![4. 検索結果はこういう感じで、ふつうに qiita.com にアクセスして検索するのと同じだけど幾分手間が省ける](http://30d.jp/img/kyanny/public/889d644c-8a3e-11e1-ade7-00262d0af68e_original.jpg)
OpenGLの描画領域が画面サイズに一致しない


Renderer#onSurfaceChangedに渡されてくる描画領域であるwidthとheightの値がそもそも画面サイズに比べて小さい。
(Xperia acro HD/IS12Sで発生。)

解決策：
minSDK=4, TargetSDK=10(acroのOSバージョンに一致)に指定すると直った。
＃プロジェクトプロパティでのターゲットは1.6を指定。
Vimshellでプロンプトの色を変える


```.vimrc
hi vimshellPrompt ctermfg=yellow guifg=#f9d59d
```

こんなかんじにゆのっちがちゃんと黄色い

![ゆのっちプロンプト](http://img.f.hatena.ne.jp/images/fotolife/a/aereal/20120420/20120420002551.png)
Ubuntu11.10でutf-8が使用可能なLaTeX環境構築方法

TeX Live 2011を使用するのがおそらく現時点で一番簡単。方法は以下のコマンドを順番に打っていくだけ。3つ目のcdコマンドのパスは日付部分が変わる場合あり。

```sh
$ wget http://mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz
$ tar -xvzf install-tl-unx.tar.gz
$ cd install-tl-20120419/
$ sudo ./install-tl
$ sudo /usr/local/texlive/2011/bin/i386-linux/tlmgr path add
```

再起動してplatexを実行すると以下のように表示されるはず。

```sh
$ platex
This is e-pTeX, Version 3.1415926-p3.2-110415-2.3 (utf8.euc) (TeX Live 2011)
 restricted \write18 enabled.
**
```

細かい話はググったり[ここ](http://physics.s.chiba-u.ac.jp/~kurasawa/ubuntu.html#tex2011)などを参考に。
タブバーの背景画像を設定する方法

```ObjectiveC:AppDelegate.h

// 以下のように、UITabBarControllerDelegateを追加します
@interface AppDelegate : UIResponder <UIApplicationDelegate, UITabBarControllerDelegate>
```

すると、以下のデリゲートメソッドが使えるようになります。

```ObjectiveC:AppDelegate.m

// タブが５つあるとき
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
    [[self.tabBarController.tabBar.subviews lastObject] removeFromSuperview];
    // ↑これやらないとどんどん増えちゃいます。
    // 最初のTabBar背景画像は別のメソッドでaddするので、この位置でremoveします。

	NSString *tabBarImageName = @"";
    switch (tabBarController.selectedIndex) {
        case 0:
            tabBarImageName = @"tabBar-1.png";
            break;
        case 1:
            tabBarImageName = @"tabBar-2.png";
            break;
        case 2:
            tabBarImageName = @"tabBar-3.png";
            break;
        case 3:
            tabBarImageName = @"tabBar-4.png";
            break;
        case 4:
            tabBarImageName = @"tabBar-5.png";
            break;
            
        default:
            break;
    }
    UIImageView *tabBg = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:tabBarImageName]] autorelease];
    [self.tabBarController.tabBar addSubview:tabBg];
}

```

ちなみにこの方法は、
タブ切替時にタブの背景すべてを変更するので、タブが５つあるなら、５つのタブ背景画像が必要です。
ハッシュのキーをシンボルに統一するメソッド

Railsに用意されているメソッドに再帰を加えたもの。YAMLをパースした後などに便利。

```ruby:hash.rb
class Hash
  def symbolize_keys
    inject({}) do |options, (key, value)|
      value = value.symbolize_keys if defined?(value.symbolize_keys)
      options[(key.to_sym rescue key) || key] = value
      options
    end
  end
end
```

例

```ruby:example.rb
hash = {"a" => "aaa", "b" => {c: "ccc", "d"=>"ddd"}, "e" => "eee"}
# => {"a"=>"aaa", "b"=>{:c=>"ccc", "d"=>"ddd"}, "e"=>"eee"}
hash.symbolize_keys
# => {:a=>"aaa", :b=>{:c=>"ccc", :d=>"ddd"}, :e=>"eee"}
```
レスポンスのステータスコードがエラーっぽいリクエストを抜き出す


```
cat /var/log/nginx/access.log | ruby -anle '$, = " "; print $F[9], $F[6], $F[7] if $F[9] !~ /200|204|301|302|304|404/' | grep -E 'HEAD|GET|POST|DELETE' | sort | tee error.log
```
jqGrid で動的に列幅を変更する


API はなさそう。

> Below are options which can not be changed dynamically when the grid is constructed (If changed they do not have effect or will cause the grid errors). For some of these options there are methods available to change the value.
> * name
> * width
> * resizable
> * label (method avail.)
> 
> "wiki:colmodel_options - jqGrid Wiki"
> http://www.trirand.com/jqgridwiki/doku.php?id=wiki:colmodel_options

> Yes it is not implemented. Currently not possible.
>
> "jQuery Grid Plugin – jqGridChange column width | Help | » Forum"
> http://www.trirand.com/blog/?page_id=393/help/change-column-width/

実装を見てみるとドラッグ & ドロップのイベントらしきものに直接列幅変更のロジックが書かれているので、これを呼ぶ。

```javascript
$("#grid").jqGrid(…);
// i は 0 から始まる列の index
// new_width は新しい列幅 (pixel)
// マウスイベントを模すため clientX を持つオブジェクトを渡す
$("#grid")[0].grid.dragStart(i, {clientX: 0}, [0, 0, 0]);
$("#grid")[0].grid.dragMove({clientX: new_width});
$("#grid")[0].grid.dragEnd();
```
Jasmineで特定のSpec,Suiteを無効にする


いつも忘れて探し回っているのでメモ

## Spec

```javascript
it('should increment a variable', function () {
  var foo = 0;
  foo++;
});

// Disable spec ->
xit('should increment a variable', function () {
  var foo = 0;
  foo++;
});
```
## Suite

```javascript
describe('Calculator', function () {
  var counter = 0

  it('can add a number', function () {
    counter = counter + 2;   // counter was 0 before
    expect(counter).toEqual(2);
  });

  it('can multiply a number', function () {
    counter = counter * 5;   // counter was 2 before
    expect(counter).toEqual(10);
  });
});

// Disable suite ->
xdescribe('Calculator', function () {
  var counter = 0

  it('can add a number', function () {
    counter = counter + 2;   // counter was 0 before
    expect(counter).toEqual(2);
  });

  it('can multiply a number', function () {
    counter = counter * 5;   // counter was 2 before
    expect(counter).toEqual(10);
  });
});
```
subversionのtrunkのhistoryをgitのmasterブランチに移す方法


subversionからgitに移行したい。でもいままでのhistoryは引き継ぎたい。かといってsubversionのすべてのブランチはもういらない。というときに使える方法

移行先Gitリポジトリを作る

```Bash:
git init --bare newrepo.git
```

手元に空のgitリポジトリを持ってくる

```Bash:
git clone http://git.example.com:newrepo.git
```

.git/configを変更してsvn-remoteリポジトリの指定を追加。
fetch = ~ の部分でsvn上のtrunkとgit上のmasterを紐付ける

```Text:.git/config
[svn-remote "svn"]
   url = http://svn.example.com/oldrepo
   fetch = trunk:refs/heads/master
```

svnからfetchする。これでhistoryが取り込める。

```Bash:
git svn fetch
```

リモートのgitリポジトリにpushする

```Bash:
git push origin master
```
LocalStorage を使ってブラウザ の Local Strage にデータを保存する


Sencha Touch 2 なら簡単にできる。下記は、ユーザーがログインをしていたらローカルに保存しておく機能の場合

Store

```coffeescript:store/User.coffee
Ext.define 'MyApp.store.User'
  extend: 'Ext.data.Store'
  requires: ['Ext.data.proxy.LocalStorage']
  config:
    model: 'MyApp.model.User'
    storeId: 'user'
    proxy:
      type: 'localstorage'
      id: 'userstorage'
```

使い方

```coffeescript:controller/Main.coffee
###
Main Controller
Main controller of this app.
###
Ext.define 'MyApp.controller.Main',
    extend: 'Ext.app.Controller'

    launch: () ->
      # load user data from localstorage
      MyApp.user = new MyApp.store.User
      MyApp.user.load()
      # ログインしてたら 必要な処理を行う
      if MyApp.user.getCount() > 0
        this.onLoginSuccess()

    # ログイン処理
    submitLogin: ()->
      Ext.Ajax.request
        url: login_url
        params:
          user: Ext.getCmp('login_user').getValue()
          password: Ext.getCmp('login_password').getValue()
        method: 'GET'
        ###
         ログイン成功時の処理。
         {'result':'OK',
            'user':{
              'login_id':'hoge',
              'email':'fuga'
            }
         }
          みたいなデータが入っているものとする
        ###
        success: (result)->
          # http requestsuccess
          res = Ext.decode result.responseText
          if res.result == 'OK'
            # store user data
            MyApp.user.add res.user
            MyApp.user.sync() # ここでローカルストレージに保存される


```
twitter-bootstrap-railsでの配色カスタマイズ


気軽に変更するには、```@black: #000000;```を適当な色にします。

```app/assets/stylesheets/bootstrap.css.less
@import "twitter/bootstrap";

// import responsive layout
@import "twitter/bootstrap/responsive";

// Your custom stylesheets goes here (override Less here)
@media (min-width: 980px) {
  body {
    padding-top: 60px;
  }
}
@black: #000000;
@grayDarker:            lighten(@black, 16%);
@grayDark:              lighten(@black, 32%);
@gray:                  lighten(@black, 48%);
@grayLight:             lighten(@black, 64%);
@grayLighter:           lighten(@black, 80%);
@white:                 lighten(@black, 96%);
.hero-unit {
  background-color: lighten(@black, 90%);
  margin-top: 19px;
  >h1 {
    font-size: 24px;
  }
}

.well {
  background-color: lighten(@black, 90%);
  border: 1px solid @grayLighter;
  border: 1px solid rgba(5, 5, 10,.05);
  .box-shadow(inset 01px1px rgba(5, 5, 10,.05));
  blockquote {
    border-color: #ddd;
    border-color: rgba(0,0,0,.15);
  }
}

.table-striped {
  tbody {
    tr:nth-child(odd) td,
    tr:nth-child(odd) th {
      background-color: lighten(@black, 93%);
    }
  }
}

.table {
  tbody tr:hover td,
  tbody tr:hover th {
    background-color: lighten(@black, 90%);
  }
}

.form-actions {
  background-color: lighten(@black, 90%);
  border-top: 1px solid lighten(@black, 93%);
}
C-w を少し賢くする

C-w に少し空気を読んでもらうようにする。（transient-mark-mode 使ってるの前提）

* __region がアクティブじゃない時__ は、CLI の C-w と同じく、カーソル左の一単語を削除
* region がアクティブの時は、通常の C-w
* transient-mark-mode が無効の時も、通常の C-w

```scm
(defun backward-kill-word-or-kill-region ()
  (interactive)
  (if (or (not transient-mark-mode) (region-active-p))
      (kill-region (region-beginning) (region-end))
    (backward-kill-word 1)))
(global-set-key "\C-w" 'backward-kill-word-or-kill-region)
```

こうでもしないと、region がアクティブじゃない時に Emacs 標準のマークセットで kill-region 発動して「うわあああああ」ってなる。
エロ動画フォルダからサムネイルをopencvで楽に作る


```
import cv
import os
import sys

f = open('./Sites/a.html', 'w')

n=0
file_list=os.listdir("/Volumes/a/new/")
for file in file_list:
 capture=cv.CaptureFromFile("/Volumes/a/new/"+file)
 cv.SetCaptureProperty(capture,cv.CV_CAP_PROP_POS_FRAMES,1000)
 image=cv.QueryFrame(capture)
 cv.SaveImage("./Sites/img/"+str(n)+"_0.jpg",image)
 capture=cv.CaptureFromFile("/Volumes/a/new/"+file)
 cv.SetCaptureProperty(capture,cv.CV_CAP_PROP_POS_FRAMES,2000)
 image=cv.QueryFrame(capture)
 cv.SaveImage("./Sites/img/"+str(n)+"_1.jpg",image)
 capture=cv.CaptureFromFile("/Volumes/a/new/"+file)
 cv.SetCaptureProperty(capture,cv.CV_CAP_PROP_POS_FRAMES,3000)
 image=cv.QueryFrame(capture)
 cv.SaveImage("./Sites/img/"+str(n)+"_2.jpg",image)
 capture=cv.CaptureFromFile("/Volumes/a/new/"+file)
 cv.SetCaptureProperty(capture,cv.CV_CAP_PROP_POS_FRAMES,4000)
 image=cv.QueryFrame(capture)
 cv.SaveImage("./Sites/img/"+str(n)+"_3.jpg",image)

 f.write('<img src="./img/'+str(n)+'_0.jpg" width=200><img src="./img/'+str(n)+'_1.jpg" width=200><img src="./img/'+str(n)+'_2.jpg" width=200><img src="./img/'+str(n)+'_3.jpg" width=200><br>'+file+'<br>')
 n+=1

f.close()
```
ダウンロード時間計測用シェルスクリプト

特定ドメインのページごとのダウンロード時間を表示する。

```bash:measure.sh
domain="http://example.com"
paths=("/" "/foo.html" "/bar.html" "baz.html")

for _path in ${paths[@]}
do
  echo "\n"$domain$_path
  time wget -o /dev/null -O /dev/null $domain$_path
done
```
func_get_args()は値渡しになる

仕様らしい。

```php
<?php
function testRef(&$a) {
  $args = func_get_args();
  $args[0] = 1;
}

testRef($a);
var_dump($a); //->null
```

func_get_arg()を使うと、あらかじめ参照渡し宣言がされている引数については参照で受け取り、それ以外は値渡しになります。

```php
<?php
function testRef(&$a) {
  $arg1 = func_get_arg(0);
  $arg1 = 2;
}

testRef($b);
var_dump($b); //->2
```
memcached安定稼働のためのメモ

1年くらい前に初めて勉強会に参加したときによくわからずに書いたメモ。
##起動系のオプション 
####最大コネクション数を増やす
sudo ./memcached -c 262144 -u nobody
※2010年8月のmixiの大規模障害はmemcachedのコネクションの数が足りていなかった
####冗長モード
./memcached -vv
メモリサイズ　-m
物理メモリの80%程度にしたほうがいい
casを無効に　-C
casのための予約領域を作らない
1アイテムに対して8byteの節約
####おすすめの起動オプション
./memcached -c 32768 -u nobody -C -m 16g -p 11211 -U 0
##設定の確認
stats settings
一定の間隔で監視を行うことで例外を発見し通知する
リソースモニタリング
cpuの使用率、メモリ使用量
通信量
webサーバのserver-status
データベースのトランザクション数
##監視ツール 
####稼働監視
nagios
monit
####リソースモニタリング
Cacti
Ganglia
munin
cloudforecast
##memcachedの監視ポイント 
動いているか
コネクション数は足りているか
メモリ使用率
cachehit率
負荷(cpu,トラフィック)
get/setなどの発行回数
サーバ間の偏り
##ハマりポイント 
memcachedはrootで動かない
play2.0 on herokuでmemcachedを使う

ぐぐらなくても雰囲気でできるレベル。herokuまたは俺すごい。

```sh
%brew install memcached
%memcached -vv
%heroku addons:add memcache:5mb//自分はherokuのGUIからインストールした
%heroku config
MEMCACHE_PASSWORD   => password
MEMCACHE_SERVERS    => server
MEMCACHE_USERNAME   => user_name
```

```myproject/conf/application.conf
memcached=enabled
memcached.host=MEMCACHE_SERVERS
memcached.user=MEMCACHE_USERNAME
memcached.password=MEMCACHE_PASSWORD
```

```scala:Application.scala
package controllers
 
import play.api.data.Form
import play.api.data.Forms.{single, nonEmptyText}
import play.api.mvc.{Action, Controller}
import anorm.NotAssigned
import play.api.cache.Cache
import play.api.cache.Cached
import play.api.Play.current
 
 
object Application extends Controller {

  def index = Cached("home_page") {
    Action {
      Ok(views.html.index())
    }
  }

}
javax.tools.ToolProviderを使用して、指定パッケージ以下のClassを取得

ちょっと長いです。

```java:
	@SuppressWarnings("rawtypes")
	private static Set<Class> getClasses(String packageName) {
    	JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    	JavaFileManager jfm = compiler.getStandardFileManager(
    	    new DiagnosticCollector<JavaFileObject>(), null, null);

    	// 一覧に含めるオブジェクト種別。以下はクラスのみを含める場合。
    	Set<JavaFileObject.Kind> kind = new HashSet<JavaFileObject.Kind>();
    	kind.add(JavaFileObject.Kind.CLASS);
    	
    	// ブートクラスパスから、指定のパッケージ以下のクラス一覧を取得する。
    	boolean recursive = true;
    	Set<Class> classes = new HashSet<Class>();
    	
		try {
			for ( JavaFileObject jfo : jfm.list(StandardLocation.CLASS_PATH, packageName, kind, recursive)) {
				String uri = null;

				try {
				    uri = jfo.toUri().toString();
				    // [/]はFile.separatorにしないとだめかも。
				    String uriDotSeparate = uri.replaceAll("/", ".");
				    
				    int indexOfPkgNmBegin = uriDotSeparate.indexOf(packageName);
				    String fqcnWithExtension = uriDotSeparate.substring(indexOfPkgNmBegin);
				    String fqcn = fqcnWithExtension.substring(0, fqcnWithExtension.length() - ".class".length());
				    
				    Class clazz = Class.forName(fqcn);
				    classes.add(clazz);
				} catch (NoClassDefFoundError e) {
					System.out.println("get class failed. " + uri);
					e.printStackTrace();
				} catch (ClassNotFoundException e) {
					System.out.println("get class failed. " + uri);
					e.printStackTrace();
				}
			}
		} catch (IOException e) {
			System.out.println("list class failed. packageName=" + packageName);
			e.printStackTrace();
		}
		return classes;
	}
```
call_user_funcで引数を参照渡しする

call_user_func()による関数呼び出しでは引数を参照で渡すことができません。(正確に言うと「できはしますが、エラーが発生するため推奨されません」)

```php
<?php
function testRef(&$a) {
  $a = 1;
}

testRef($b);
//$b === 1になる

call_user_func('testRef', $c); //エラー発生
call_user_func('testRef', &$c); //deprecatedな書き方
```

しかし、call_user_func_array()を使うと参照渡しが可能です。配列に参照として変数を組み込んでおけば良いです。

```php
<?php
function testRef(&$a) {
  $a = 1;
}
call_user_func_array('testRef', array(&$c)); //エラーが起きない
//$c === 1になる
```

裏ワザちっく。そのうち潰される書き方なのかな？
インストールしたwebアプリのエラーログを確認する


webアプリが安定しなかったり、すぐにメモリ不足が起きてしまうような場合、まずはエラーログを確認しましょう。

慌てるとついGoogle先生との対話に走ってしまいますが、原因にざっとでも当たりを付けておくと検索の精度も上がります。

## WebサーバーがApacheの場合
*/var/log/httpd/error_log* に記録されています。

```bash
$ cd /var/log/httpd

# 最後に書き込まれた10行を確認
$ tail error_log -n 10
66.249.67.112 - - [18/Apr/2012 23:56:13] "GET /home/ruby-1.9.2-p290/lib/rubygems/uninstaller.rb?query=f:* " 500 30 0.0021
#   NoMethodErrorが起きているのが分かる
NoMethodError - undefined method `records' for nil:NilClass: /usr/local/lib/ruby/gems/1.8/gems/milkode-0.5.3/lib/milkode/cdweb/lib/database.rb:54:in `record' /usr/local/lib/ruby/gems/1.8/gems/milkode-0.5.3/lib/milkode/cdweb/app. rb:57:in `GET /home*'/usr/local/lib/ruby/gems/1.8/gems/sinatra-1.3.2/lib/sinatra/base.rb:1211:in `call'
/usr/local/lib/ruby/gems/1.8/gems/sinatra-1.3.2/lib/sinatra/base.rb:1211:in `compile!'
/usr/local/lib/ruby/gems/1.8/gems/sinatra-1.3.2/lib/sinatra/base.rb:78

# エディタで開いてもよい
$ emacs error_log
```

エラーをリアルタイムに監視するには *tail -f* を使います。

```
$ tail -f error_log
```
Kobitoでmarkdownで記述したメモのhtmlをコピーする方法

レビューウィンドウで、context menuを表示して、

1. [Inspect Element]を選択
![Inspect Element](http://cdn-ak.f.st-hatena.com/images/fotolife/n/naoto5959/20120419/20120419005131.png)

2. レビューウィンドウの下に表示される[Inspector]の[Element]タブから<body>を選択
![Inspector](http://cdn-ak.f.st-hatena.com/images/fotolife/n/naoto5959/20120419/20120419005140.png)
3. [Copy As HTML]を選択
![Edit as HTML](http://cdn-ak.f.st-hatena.com/images/fotolife/n/naoto5959/20120419/20120419005645.png)

以上の操作で、htmlとしてクリップボードに保存されます。

このhtmlからbody要素を消してからペーストすれば、blogなどqiita以外のメディアにも連携することが出来ます。
子モデルとデータのプロパティ名のマッピングを指定する方法


こうすると、

``` javascript
hasMany: {model: 'App.model.Blog', name: 'blogs'}
```

データは

```json
{
	・
	・
	・
	"blogs": [
		{
			・
			・
			・
		},
		{
			・
			・
			・
		},
	]
	・
	・
	・
}
```

としないと子モデルのストアにデータは入らないが、

```json
{
	・
	・
	・
	"blog_list": [
		{
			・
			・
			・
		},
		{
			・
			・
			・
		},
	]
	・
	・
	・
}
```

の"blog_list"と子モデルのBlogモデルをマッピングしたい場合は、

```javascript
hasMany: {model: 'App.model.Blog', name: 'blogs', associationKey: 'blog_list'}
```

とするとマッピングできる。
iOSでの開発に必要なアセット


色々と手順はよく見かけるのですが、各手順やファイルの意味が分からなかったので
自分なりに調べてまとめてみました。間違いあればコメントにてご指摘下さい。

* 秘密鍵(Private Key)と公開鍵のセット(Public Key)
 * チーム開発時は開発用、配布用で分けるとよい。個人でも分けておくと後で楽。
 * それぞれ、以下のキーチェーンからのCSR作成時に自動で出来上がりキーチェーンアクセスに記録される。
 * 別の開発マシンで使う際やSaaSでPush通知する際などには、下記*.cerから*.p12ファイルとして書き出して、何らかのセキュアな方法(オススメはUSBとかなの？)で別マシンに移す。
* 証明書要求（Certificate Request or Certificate Signing Request）(いわゆるCSR)
 * キーチェーンアクセスから作成する。
 * デフォルト名は```CertificateSigningRequest.certSigningRequest```
 * 開発時の個人用は```dev-CertificateSigningRequest.certSigningRequest```として保存しておく
 * リリース時のプロダクト用は```dist-CertificateSigningRequest.certSigningRequest```として保存しておく
 * 上記のCSRをportalにてアップロードして、開発者用は```ios_development.cer```をダウンロードしておく
 * 上記のCSRをportalにてアップロードして、開発者用は```ios_distribution.cer```をダウンロードしておく
* 開発用証明書(Development Certificate)(Public Key)
 * ios_development.cer
 * デバイスにインストールする際に必要
* 配布用証明書(Distribution Certificate)(Public Key)
 * アップルへ申請する際に必要
 * ios_distribution.cer
* apple id
 * いつもの個人アカウントとは別に作っておくことを推奨
* デバイスID(Device identifier)
 * 開発用にインストール可能なデバイスとして登録する
 * TestFrightなどで配布する際に必要
* プロビジョニング プロファイル(Provisioning Profile)

>
![iOSでの開発に必要なデジタルアセット](https://developer.apple.com/jp/devcenter/ios/library/documentation/Xcode/Conceptual/ios_development_workflow/art/ios_dev_digital_assets.png)
[(iOS開発ガイドより)](https://developer.apple.com/jp/devcenter/ios/library/documentation/Xcode/Conceptual/ios_development_workflow/#100-Configuring_Your_Development_Assets/identities_and_devices.html)

# 配布用の証明書管理

これは、例えばあるチームで誰か管理する人を立てて、その人がやるべきなのではないかと考えている。
つまり、不用意に配布用の秘密鍵は全開発者に渡す必要ないのでは？
phpのfsockopenでhttps接続したい場合

```php
<?php
$fp = fsockopen('ssl://www.example.com', 443, $errno, $errstr, $timeout);
```

とすれば良し。

```php
<?php
$fp = fsockopen('www.example.com', 443, $errno, $errstr, $timeout);
```

では接続できません。


```shell
./configure --with-openssl
```

でコンパイルされている前提の話。
Avoid cycle retain in ARC environment


# ARC無し

block 内からの参照は自動的に retain される。 __block 指定の変数は retain されない。

````objectivec
__block typeof(self) bself = self;
b = ^{
    bself.prop = YES;
    int foo = bself->ivar;
};
````

# ARC有り

__block は効かないので注意。
また型の指定に typeof(self) も使えない。

````objectivec
__weak TypeA *wself = self;
b = ^{
    wself.prop = YES;
    int foo = wself->ivar;
};
````


http://stackoverflow.com/questions/8915981/block-self-reference-cycle-in-ivar-block-in-arc
heroku deploy



◆Gitリポジトリ作成
git init

◆Gitコミット
git add . && git commit -m "first commit"

◆Gitステータス確認
git status

◆Herokuアプリ作成
heroku create proto-test

◆Herokuプッシュ
git push heroku master

◆Herokuマイグレーション
heroku rake db:migrate

◆Herokuオープン
heroku open
Devise for mobile


皆さん、WebとMobileの認証、どのようになってるんだろうなぁとよく思う今日この頃。DeviseとMobileの共存について調べたのでメモ。もっといい方法あったら教えて欲しいです。

## Precondition
下記のようにして、UserというModelがdeviseを用いて作られている前提です。

```
rails generate devise User
```

あと、[こちら](https://matteomelani.wordpress.com/2011/10/17/authentication-for-mobile-devices/)を参考にしてます。

## さて
全体の流れとしては

* Mobile用TokenカラムをUserテーブルに追加
* Mobile用Tokenを制御するControllerの作成

## では
まず、Mobile用Tokenカラムを作成します。`db/migrate/`のなかに適当なmigrateファイルを作成。僕の場合は`20120418141059_add_devise_columns_to_user.rb`としました。中身はこんな感じ

```
class AddDeviseColumnsToUser < ActiveRecord::Migration
  def self.up
    change_table :users do |t|
      t.token_authenticatable
    end
  end
  def self.down
    t.remove :authentication_token
  end
end

```

そうそう、忘れぬうちに`/app/model/user.rb`の`before_filter`に`:token_authenticatable`を追加しておく。

んで、`rake db:migrate`を実行。
次にTokenを制御するControllerを作成します。

```
rails g controller api/v1/tokens
```

そしたら、`config/route.rb`を編集。

```
namespace :api do
  namespace :v1  do 
    resources :tokens,:only => [:create, :destroy]  
  end
end

```

はい、それではControllerの中身を書きます。下記の通り

```
class Api::V1::TokensController  < ApplicationController 
  skip_before_filter :verify_authenticity_token
  respond_to :json
  
  def create
    email = params[:email]
    password = params[:password]
    
    if request.format != :json
        render :status=>406, :json=>{:message=>"The request must be json"}
        return
    end
    
    if email.nil? or password.nil? 
      render :status=>400, :json=>{:message=>"The request must contain the user email and password."}
      return
    end
    
    @user=User.find_by_email(email.downcase)
    
    if @user.nil?
      logger.info("User #{email} failed signin, user cannot be found.")
      render :status=>401, :json=>{:message=>"Invalid email or passoword."}
      return
    end
    
    @user.ensure_authentication_token
    @user.save!
    
    if not @user.valid_password?(password) 
      logger.info("User #{email} failed signin, password \"#{password}\" is invalid")
      render :status=>401, :json=>{:message=>"Invalid email or passoword."} 
    else
      render :status=>200, :json=>{:token=>@user.authentication_token} 
    end
  end
  
  def destroy
    @user=User.find_by_authentication_token(params[:id])
    if @user.nil?
      logger.info("Token not found.")
      render :status=>404, :json=>{:message=>"Invalid token."}
    else
      @user.reset_authentication_token!
      render :status=>200, :json=>{:token=>params[:id]}
    end
  end  
end  

```

これで実装は終了！あとはアクセス！


http://localhost:3000/api/v1/tokens.jsonにPOSTでアクセス！Chromeのエクステンション「Simple REST Client」等でテストすると便利です。忘れていけないのがHeaderに

```
Content-type : application/x-www-form-urlencoded
```

を加えること。引数は

```
email=wirte_email_address_here&passowrd=write_passowrd_here
```

な感じになります。









## Reference
https://matteomelani.wordpress.com/2011/10/17/authentication-for-mobile-devices/
load-pathの追加を便利にするマクロ

add-to-listは1つのパスしかload-pathに追加できない。

```cl
(add-to-list 'load-path "~/.emacs.d")
(add-to-list 'load-path "~/.emacs.d/elisp")
```

そこで、以下のマクロを定義しておくと、複数のパスをまとめて追加できて便利(もちろん、load-path以外のリストにも使用可能)。

```cl
(defmacro append-to-list (to lst)
  `(setq ,to (append ,lst ,to)))
```

以下のように使用する。

```cl
(append-to-list load-path
                '("~/.emacs.d"
                  "~/.emacs.d/elisp"
                  "~/.emacs.d/elisp/my"
                  "~/.emacs.d/inits"))
```
HerokuでのLog（Loggly）

heloku logsではログが全然足らないのでログをどうにかする方法を探した。

最初はここに辿り着いて、rsyslogを立てないといけないのか？と思った。
https://devcenter.heroku.com/articles/logging

アドオンで何か無いかと思ってみたらLogglyというのがあった。一日分25MBまでは無料で保存してくれるらしい。
http://www.atotok.com/labo/ruby/20120331020319.html
ここを見てわかりやすそうなので導入。多謝。

AmazonS3にも保存できると書いてあったので、実質一日25M制限なのだろうか。詳細不明。
S3への保存はbucketを作成して権限を与え、bucket名をLogglyへ保存する。詳しくは下記。
https://wiki.loggly.com/s3bucketaccess
プリインアプリの有効・無効を判定する方法

Android4.0より、プリインアプリの有効/無効をユーザがある程度指定できる
ようになりました。
プリインアプリが無効化されているか否かは下記のコードより判断できます。

```java:qiita.rb
int state =
    getPackageManager().getApplicationEnabledSetting("com.android.browser");
```

有効化中のstateは0(COMPONENT_ENABLED_STATE_DEFAULT)が、
無効化中のstateは2(COMPONENT_ENABLED_STATE_DISABLED)が返されます。
http://yuki312.blogspot.jp/2012/01/blog-post.html
アプリの無効/有効をコマンドで切り替える方法

指定パッケージを無効化(ブラウザ無効化の例)

```bash:qiita.rb
pm disable-user com.android.browser
```


指定パッケージを有効化(ブラウザ有効化の例)

```bash:qiita.rb
pm enable com.android.browser
```


デバイス上のパッケージ一覧を表示

```bash:qiita.rb
pm list packages
```


有効中のパッケージ一覧を取得

```bash:qiita.rb
pm list packages -e
```


無効中のパッケージ一覧を取得

```bash:qiita.rb
pm list packages -d
```
rails で subdomain を使う場合の落とし穴


config/routes.rb で subdomain を指定するだけでは、local環境でうまくブラウザからアクセスすることが出来ない

ので、下記のように /etc/hosts (mac/linuxの場合) に追記する

	127.0.0.1       subdomain.localhost.local

ちなみに・・・・

	127.0.0.1       subdomain.localhost # これだとダメ

これでブラウザから subdomain.localhost.local:3000 でアクセス出来るようになる

’rails で’ というより localhost での tipsかもしれない・・・
shoulda-matchersでマッチャを増やす


shoulda-matchersをインストールするといろんなマッチャが使えるようになる。

```ruby:GemFile
gem 'rspec-rails'
gem 'shoulda-matchers'
```

モデルに対するマッチャ。

```ruby
should belong_to(:hoge)
should have_many(:fuga)
should validate_presence_of(:hogehoge)
```

コントローラに対するマッチャ。

```ruby
should assign_to(:members).with(@members)
```

その他にもいろいろなのがある。
https://github.com/thoughtbot/shoulda
自前のvalidatorを使う

lib/validators配下に置くのでそこを読み込むように設定。

```ruby:config/application.rb
config.autoload_paths += %w(#{Rails.root}/lib/validators)
# これも入れないとダメだった
config.autoload_paths += Dir["#{Rails.root}/lib/validators/**/"]
```

```ruby:lib/validators/fields_equivalent_validator.rb
# 複数のフィールドに同じ値があったらダメ
class FieldsEquivalentValidator < ActiveModel::Validator
  def validate(record)
    prev = nil
    valid = true

    options[:fields].each do |f|
      unless prev.nil? and record[f].nil?
        if prev == record[f]
          valid = false
          break
        end
      end
      prev = record[f]
    end

    record.errors[options[:fields][0]] << 'hogehoge' unless valid
  end
end
```

使い方。

```ruby
validates_with FieldsEquivalentValidator,
     fields: [:hoge_id, :fuga_id, :hige_id]
```
PHP+MySQLをCloud Foundryで動かす

環境変数$_SERVER["VCAP_SERVICES"]に入ってるjsonからmysqlへの接続情報(ホスト、ポート、ユーザー名、パスワード、データベース名)が取得できます。

ということで最もシンプルな例を：

```php:index.php
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>simplest php + mysql </title>
</head>
<body>
<h1>we love php! </h1>
<?php
$dbinfo = json_decode($_SERVER["VCAP_SERVICES"],TRUE);
$key = $dbinfo["mysql-5.1"][0]["credentials"];

$con = mysql_connect($key["host"].":".$key["port"], $key["username"], $key["password"]);
$res = mysql_select_db($key["name"],$con);

$result = mysql_query('select * from posts');
if(!$result) {
  die(mysql_error());
}
while ($row = mysql_fetch_assoc($result)) {
    print('<h2>');
    print($row['title']);
    print('</h2>');
    print('<p>');
    print($row['description']);
    print('</p>');
}
?>

</body>
</html>
```

## クラウド上にアップする

前準備：Ruby1.9(またはRuby1.8とrubygems)がインストール済みとして下記にてvmcコマンドをインストール

```
$ gem install vmc
```

準備ができたら、上で作ったphpファイルのあるディレクトリにて下記のコマンドを実行

```
$ vmc target xxx.yyyyyy.com  #<- おつかいのクラウドのapiホスト名
$ vmc login 
  # ユーザー名とパスワードを入力
$ vmc push your_app_name
```

とすると対話型が立ち上がるので下記のように進むとOK。(対話型なので入力してるのは'y'とか'3'くらいです)

```sh
$ vmc push  simple-php
Would you like to deploy from the current directory? [Yn]: y
Application Deployed URL [simple-php.foobar.com]: 
# デフォルトではアプリ名をサブドメインとしてはホスト名が発行される
Detected a PHP Application, is this correct? [Yn]: y
# 自動で何で書かれたアプリか判別される
Memory Reservation (64M, 128M, 256M, 512M, 1G, 2G) [128M]: 
Creating Application: OK
Would you like to bind any services to 'simple-php'? [yN]: y
# サービスとはRDBやmemcacheなどアプリにひもづける外部DB的なものの総称です
# MySQLをバインドするのでこの質問は"y"
Would you like to use an existing provisioned service? [yN]: n
# 他のアプリにひもづけられたサービス(DB等)をひもづけますか？
# 今回は新規に作成するので"n"
The following system services are available
1: memcached
2: mongodb
3: mysql
4: postgresql
5: redis
Please select one you wish to provision: 3
# 3のmysqlを選択する
Specify the name of the service [mysql-7f019]: mysql-test
# 適当に名前をつける
# ここまでで設定は終了。あとはズラズラっとアップロードしてDBが準備されてアプリが起動する
Creating Service: OK
Binding Service [mysql-test]: OK
Uploading Application:
  Checking for available resources: OK
  Packing application: OK
  Uploading (1K): OK   
Push Status: OK
Staging Application: OK                                                         
Starting Application: OK                                                        
```

これで完了。
ブラウザで払い出されたURLにアクセスすると動いていることがすぐ確認できます
Mapを回すときはkeySetよりも、entrySetの方が早い

知らんかったので・・

```Java 
		Map<Integer, String> map = new HashMap<Integer, String>();
		
		// ・・・・
		
		// 遅い		
		for (Integer key : map.keySet()) {
			String value = map.get(key);
		}
		
		// 早い
		for (Entry<Integer, String> entry : map.entrySet()) {
			String value = entry.getValue();
		}
```