OmniAICreator/Qiita-1.07M huggingface dataset:
Mac nginx をPort:80で起動させる

brew install nginx の一部ログ：

```bash:
In the interest of allowing you to run `nginx` without `sudo`, the default
port is set to localhost:8080.

If you want to host pages on your local machine to the public, you should
change that to localhost:80, and run `sudo nginx`. You'll need to turn off
any other web servers running port 80, of course.
```

## 概要

Home brew からインストールしたNginx の待ち受けポートを、デフォルトの8080番から80番に変更、システム起動時に待ち受けさせる。

おおまかな手順としては
1. nginx.conf の編集
2. nginx をsudo で起動するシェルスクリプトを書く
3. nginx plist の編集
4. 自動起動できるように、sudo パスワード入力をスキップ

注意事項として、上記手順４にてroot権限が必要になるため、rootとして作業できることが必要。あと、Mac標準のhttpdさんは眠っている前提です。

---

80番ポートで待たせるためにはsudo が必要らしい。



8080番はJenkins やその他アプリケーションが利用するかもしれない。sudoer 権限で実行できるように設定する。

## nginx.conf の編集

```diff:/usr/local/etc/nginx/nginx.conf
http { …
	server {
-		listen	8080;
+		listen 80;
		server_name

		#charset koi8-r;
		…
}
```

## シェルスクリプトの作成
```sh:/usr/local/bin/nginx_with_sudo
#!/bin/bash

NGINX_BIN="/usr/local/sbin/nginx"

function on_die() {
	sudo $NGINX_BIN -s stop
	exit 0
}

trap on_die TERM

sudo $NGINX_BIN $@ &

wait
```

```chmod +x /usr/local/bin/nginx_with_sudo``` で実行権限を付与しておきましょう。

## plist の編集

```diff:~/Library/LaunchAgents/homebrew.mxcl.nginx.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
	<dict>
		…
		<key>KeepAlive</key>
		<false/>
+		<key>UserName</key>
+		<string>USER_NAME</string>
		<key>ProgramArguments</key>
-		<array>
-			<string>/usr/local/opt/nginx/sbin/nginx/
-			<string>-g</string>
-			<string>daemon off;</string>
-		</array>
+		<array>
+			<string>/usr/local/bin/nginx_with_sudo</string>
+		</array>
		…
	</dict>
</plist>
```

## sudoersファイルの編集

root としてログイン```sudo su```する。
```visudo```コマンドを叩いてsudoersファイルの編集を開始。

Nginxとスクリプトをsudoで実行した時のパスワード入力をスキップさせます。

```bash:
Cmnd_Alias NGINX=/usr/local/sbin/nginx
Cmnd_Alias NGINX_SCRIPT=/usr/local/bin/nginx_with_sudo

Your_User_Name	ALL=NOPASSWD: NGINX, NGINX_SCRIPT
```

```NOPASSWD: ALL``` なんかも指定出来てお手軽な感じがしますが、それは穴が大きすぎるとおもいますので、個別に指定して行きましょう。

最後に、作成したスクリプトを起動するか、再起動すればnginx が80番ポートで起動してくれるはずです。

```http://localhost:80/``` で確認してみましょう。

## リンク
* [qiita.com - osx の nginx を 80 番ポートで launchctl から起動する](http://qiita.com/items/3a5013714779ed07cce6)
* [sudoでパスワードを渡す - ぶろ〜ぐ(仮称](http://webcache.googleusercontent.com/search?q=cache:SAjPRT1TnpIJ:www.kotodama.jp/blog/index.php/2009/01/27/sudo+&cd=2&hl=ja&ct=clnk&gl=jp "コメント欄を参照")
* [Man page of VISUDO](http://linuxjm.sourceforge.jp/html/sudo/man8/visudo.8.html)

---

* [What is $* and $# in Linux? - Superuser](http://superuser.com/questions/247127/what-is-and-in-linux)
* [シグナルと trap コマンド - UNIX & Linux コマンド・シェルスクリプト リファレンス](http://shellscript.sunone.me/signal_and_trap.html)
[RestKit] 送信中のリクエストをキャンセルする


RestKit 0.10.2の話。

`RKObjectManager`を介して送信中のリクエストをキャンセルしたい。

すべてのリクエストをキャンセルするには以下のように呼び出せばよい。

```
[[[[RKObjectManager sharedManager] client] requestQueue] cancelAllRequests];
```

特定のdelegateオブジェクトに紐付いたリクエストのみをキャンセルするには以下のように呼び出す。

```
[[[[RKObjectManager sharedManager] client] requestQueue] cancelRequestsWithDelegate:self];
```
はじめてtmuxをつかうときに最初に覚えたこと/いじったこと


GNU Screen 開発版から移ってきた新人です。
移行して１０日間くらい使ってみて、最低限ここ覚えておけば/いじっておけば業務に支障ないかな、って思うまとめです。
（ただし、vimmer向け）

よろしくおねがいします。

## 最低限覚えたぽいコマンド

### セッションの一覧

```
tmux ls
```

### セッションの再開

```
tmux attach
tmux a
```

### セッション殺す

```
tmux kill-session -t session_name
```

### セッションの中断

```
<C-t> d
```

### 縦分割

デフォルト

```
<C-t> %
```

デフォルトから変えた。

```.tmux.conf
unbind %
bind | split-window -h
```

```
<C-t> |
```

### 横分割

デフォルト

```
<C-t> "
```

デフォルトから変えた。

```.tmux.conf
unbind '"'
bind '-' split-window -v
```

```
<C-t> -
```

### Paneの移動

下記でvimっぽくするので、覚えない。

### Paneをバラす

```
<C-t> !
```

### Windowの作成

```
<C-t> c
```

### Windowの移動

次のWindow

```
<C-t> n
```

前のWindow

```
<C-t> p
```

### kill Window

```
<C-t> &
```

### Windowの名前変更

作業中にWindow増やしたい！と思ったときに、
適した名前変えると分かりやすくて良いです。

```
<C-t> ,
```

### 困ったら

```
<C-t> ?
```

## 少しだけカスタマイズ

### prefixの変更

Screen時代からずっと変えてたので、慣れてる方に変えました。

```.tmux.conf
unbind-key C-b 
set-option -g prefix C-z 
bind-key C-z send-prefix
```

### 設定の再読み込み

最初は設定いじりまくるので、とりあえず。

```.tmux.conf
unbind r
bind C-r source-file ~/.tmux.conf ; display-message "reloaded"
```

http://www.mindfuzz.net/?p=178

### vimmer向け

emacs向けもあるようです。

```
set-window-option -g mode-keys vi
```

### 履歴を長く

Screenでもやってたので、とりまこれくらいは。

```
set-option -g history-limit 10000
```

### Paneの移動

最初、Windowの移動をviライクにしていたのだけど、Screenでもwindowはn/pで移動なので、Paneの移動をviライクにした。

そのほうがviと画面切り替えた時もスムーズ。

```.tmux.conf
unbind l                                                                                                                                                                                                                                      
bind -r k select-pane -U
bind -r j select-pane -D
bind -r h select-pane -L
bind -r l select-pane -R
```

### Windowの移動

これやめた。

### tmuxで選択した文字列をMacのクリップボードへ

ここに書くと長くなるので割愛ですが、やりました。
あんまりスマートじゃないけど、無いよりは全然良い。

https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard/

```.tmux.conf
# pbcopy for mac patch
# SEE: https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard/
set-option -g default-command "reattach-to-user-namespace -l zsh"
bind ^y run-shell 'tmux-pbcopy'
```

## 感想

Screenからうつってきた人はwindowとpaneの概念を理解するまでしっくりこないかも。
でも、カスタマイズが全体的に楽な気がします。hackしやすいのは良いこと。

あと、tmuxinator使うようになったら、paneを編集するコマンドわりと使わなくなった。
リモートでも動かすようになればまた変わるかな。
praat: 選択したサウンドオブジェクト全てに対する音響分析


マニュアル [Scripting 4. Object selection]
(http://goo.gl/IhGvw) に普通に載っているのだけれど，複数のサウンドオブジェクトに対する分析手順を統一して記述する方法。すぐ忘れちゃうので個人用メモメモ。
マニュアルではExample: doing something to every selected Soundという項目。
サウンドオブジェクトとTextGridオブジェクトを選択してExtract -系のコマンドと組み合わせるとかなり強力だと思う。

```praat
#ここまででサウンドオブジェクトを選択する処理を記述する
n = numberOfSelected ("Sound")
for i to n
    sound'i' = selected ("Sound", i)
endfor

for i to n
    select sound'i'
#ここにサウンドオブジェクトに対する分析コマンドを書く
endfor

# Restore selection:
if n >= 1
    select sound1
    for i from 2 to n
       plus sound'i'
    endfor
endif
```
gunicorn_djangoの起動とログ取得設定


環境：Amazon EC2, Amazon Linux

##手動コマンドで環境の起動

```
$ workon app_env
$ gunicorn_django -b localhost:8081 --log-level=debug
```

##起動ファイルでの起動

gunicornの起動設定ファイルを用意する
参考：http://dat.plastica-romantica.com/log699.html

```
$ sudo mkdir /var/log/gunicorn
$ sudo chown ec2-user:ec2-user /var/log/gunicorn
```

```Bash:run_gunicorn_django.sh
#!/bin/bash
SERVER=localhost
PORT=8081
LOGFILE=/var/log/gunicorn/django_app.log
LOGDIR=$(dirname $LOGFILE)
NUM_WORKERS=3 #recommended formula here is 1 + 2 * NUM_CORES
USER=ec2-user
cd /opt/django/app_name
source /home/$USER/.virtualenvs/app_env/bin/activate
test -d $LOGDIR || mkdir -p $LOGDIR
exec gunicorn_django -b $SERVER:$PORT -w $NUM_WORKERS --log-level=debug --log-file=$LOGFILE 2>>$LOGFILE  --user=$USER
```


gunicornの起動

```
$ ./run_gunicorn_django.sh &
```

ログを見る

```
$ tail -f /var/log/gunicorn/django_app.log
```
MySQLで各テーブルのレコード件数を確認

```sql
SELECT
  table_name
  , table_rows
FROM
  information_schema.TABLES
WHERE
  table_schema = 'schemaName'
ORDER BY
  table_name;
```

ただし、このカウントはSHOW TABLE STATUSと同様、数値項目は概算値なので、毎回微妙に値が変わることがある。
長くなりがちなRailsのモデルをきれいに分割する (別解)

http://qiita.com/items/f2ae316dc8e98b4ff82a

ActiveSupport::Concernを使えば、若干ですが簡潔に書けます。

```ruby:app/models/user.rb
class User < ActiveRecord::Base
   include User::Finder
end
```

```ruby:app/models/user/finder.rb
module User::Finder
  extend ActiveSupport::Concern

  included do
    base.has_many :items
  end

  # クラスメソッドの定義
  module ClassMethods
    def hot
      ...
    end
  end

  # インスタンスメソッドの定義
  def search(str)
    ...
  end
end
```
ActiveRecord内部でもActiveSupport::Concernが頻繁につかわれていますね。
HTML5のベースコード

````html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" type="text/css" href="css/html5reset.css"  />
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<style type="text/css">  
<!-- /*css*/

-->
</style>
<script type="text/javascript"> 
<!-- //javascript

//-->
</script>

<title>タイトル</title>
</head>
<body>

コンテンツ

</body>
</html>
````

> いちばんシンプルなHTML5のベースを用意 | necozine
> http://www.necozine.com/webdesign/copipehtml5base/
Jasmineの結果画面が真っ白になってしまう

Jasmineのバージョンを**1.2.0**から**1.3.1**に上げると、画面が真っ白になることがあるようです。

最初はrakeがうまくいかなくなりました。以下のような感じです。**この時点でおかしいと気づくべきだった。**

```
$rake jasmine
your tests are here:
  http://localhost:8888/
rake aborted!
uninitialized constant Jasmine::YAML

Tasks: TOP => jasmine => jasmine:server
(See full trace by running task with --trace)
```

このエラーは**Rakefile**に以下の一行を追加することによって解消されます。

```ruby
  require 'yaml' # <- Add this
```

これで問題解消かと思いきや、結果画面が真っ白になります。これは以下の2つのフォルダがおかしくなっているために起こります。

- `project/spec/javascripts/helpers`
- `project/spec/javascripts/support`

これらのフォルダをなおすために、いったん新しいプロジェクトのフォルダを作ります。そして中に入って初期化します。

```
$jasmine init
```

これで上記の2つのフォルダが生成されるので、こららを元のプロジェクトのフォルダの中に上書きします。

これで従来通りテスト結果の画面が表示されるようになります。

（ちなみに該当プロジェクトのフォルダで`jasmine init`しても上書きされませんでした。）


-----
ブログやってます：[PAPA-tronix !](http://weed.cocolog-nifty.com/wzero3es/)
Play Framework 2.0.4 のセッションテストでハマる

機能テストの際に、レスポンスのセッションを `session()` メソッドで取ってこられるわけですが、セッションを維持して何度もアクセスする場合には注意が必要です。コントローラで `session().put()` せずにレスポンスを返すと、`session()` で取れる中身が空になります。

具体的なプログラムを示します。これは `play new` で Java プロジェクトを作成して、それをちょこっといじったものです。

```java:Application.java
package controllers;

import play.*;
import play.mvc.*;

import views.html.*;

public class Application extends Controller {
    static int userId = 1;

    public static Result index() {
        if (session().get("user") == null) {
            session().put("user", "USER:" + userId);
            userId++;
        }
        return ok(index.render("Hello, " + session().get("user")));
    }

}
```

```java:ApplicationTest.java
package controllers;

import static org.fest.assertions.Assertions.assertThat;
import static play.test.Helpers.*;
import org.junit.Test;
import play.mvc.*;


public class ApplicationTest {

    @Test public void test() {
        running(fakeApplication(), new Runnable() {
            @Override
            public void run() {
                // 初回アクセス
                Result result = routeAndCall(fakeRequest(GET, "/"));
                System.out.println(result);
                // 結果: SimpleResult(200, Map(Content-Type -> text/html; charset=utf-8, Set-Cookie -> PLAY_SESSION=秘密;Path=/;HTTPOnly))
                Http.Session s = session(result);
                assertThat(s.get("user")).isEqualTo("USER:1");

                // 先ほどのセッションをつけてもう一度アクセス
                result = routeAndCall(fakeRequest(GET, "/")
                        .withSession("user", s.get("user")));
                System.out.println(result);
                // 結果: SimpleResult(200, Map(Content-Type -> text/html; charset=utf-8, Set-Cookie -> ))
                s = session(result);
                assertThat(s.get("user")).isEqualTo("USER:1");
                // ↑null になって失敗する！！！！

                // 上のテストが通らないからここまで到達しないけど
                // さらにアクセスしようとすると、別ユーザに！
                result = routeAndCall(fakeRequest(GET, "/")
                        .withSession("user", s.get("user")));
            }
        });
    }

}
```

これをなんとかするには、`s = session(result)` と単純に代入するのではなく、`s.putAll(session(result))` と上書きするようにします。ただし、この方法ではコントローラで `session().clear()` と明示的にセッションをクリアした場合でもセッションが残ってしまうので、そこのテストでは使わないようにしましょう。
初心者によく教えるswitch文のイディオム

>補足情報がコメント欄にあるので、参考にしてください。

何回か聞かれたので残しておきます。
switchの条件式をtrueにすれば、複雑な条件分岐もスッキリ書けます。
同じように条件式にtrueを入れたら使える言語が他にもあるので覚えておくといいと思います。
ただし、各条件の処理ごとにbreakが必要な言語もあるので、注意してください。
下記は、coffeescriptの例です。

```coffeescript:coffeescript_switch_true
switch true
	when a > 5
		console.log "a > 5"
	when b < 3
		console.log "b < 3"
	when c is 4
		console.log "c is 4"
```ちなみに、上記のcsをjsにコンパイルすると、下記のようになります。

```javascript:javascript_switch_true
switch (true) {
  case a > 5:
    console.log("a > 5");
    break;
  case b < 3:
    console.log("b < 3");
    break;
  case c === 4:
    console.log("c is 4");
}
gemspec に記述された依存関係を Gemfile に展開する

gemspec ファイルに展開された依存関係をすべて展開して `Gemfile` に直接記述したい場合、以下のようなプログラムで手軽に `Gemfile` を生成できる。

```gemspec2gemfile.rb
#!/usr/bin/env ruby
require 'bundler'

gemspec = ARGV.shift
puts "source :rubygems"
 
spec = Bundler.load_gemspec(File.expand_path(gemspec))
spec.dependencies.each do |dep|
  puts "gem '#{dep.to_spec.name}', '#{dep.to_spec.version}'"
end
```

https://gist.github.com/4562058

なお、 `Gemfile` に `gemspec` と書けば gemspec ファイルに記述された依存関係を考慮して gem をインストールできるので、通常はこのような処理は必要ない。
Xcode&gitで開発する時の.gitignore


みなさんは、.gitignoreどのようなのを使われていますか？

僕のやつを公開するので、みなさんも教えて下さい！

CocoaPodも使うので、Pods/*も入れています。（このフォルダ以下は `pod install`するとPodfileやPodfile.lockを参考に、installされ、自動的Fetchされ、つくられるので、共有する必要ありません）

PodFileは.gitignoreしないとして、Podfile.lockも.gitignoreに入れないほうが良いと思います。（理由は以下追記）


これが現状の.gitignoreです。

````
# Mac
.DS_Store

# Xcode
build/*
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
*.xcworkspace
!default.xcworkspace
xcuserdata
profile
*.moved-aside

#CocoaPod
Pods/*
````

# Podfile.lockについて

Podfile.lockは

```
PODS:
  - AFNetworking (1.3.4)

DEPENDENCIES:
  - AFNetworking (~> 1.3.4)

SPEC CHECKSUMS:
  AFNetworking: cf8e418e16f0c9c7e5c3150d019a3c679d015018
```

のように、PODSがライブラリが実際に使われているバージョン番号が固定で、DEPENDENCIESにはPodfileに書いてある指定の方法で、SPEC CHECKSUMSにはgitのハッシュが書かれています。

これを共有しておくことで、どの環境で`pod install`しても同じバージョンのライブラリがインストールされることになるので、.gitignoreしないほうが良いと思います

共同で開発している時に、ライブラリのバージョンが違うことによって、片方で動かないみたいなことがないようにしましょう！
ボタンを一時的に無効化する

簡易的な連打防止に。

```

@interface UIControl (AfterDelay)
- (void)setEnabled:(BOOL)enabled afterDelay:(NSTimeInterval)delay;
@end

@implementation
- (void)setEnabled:(BOOL)enabled afterDelay:(NSTimeInterval)delay
{
	int64_t delayInMilliSeconds = delay * 1000;
	dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInMilliSeconds * NSEC_PER_MSEC);
	dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
		[self setEnabled:enabled];
	});
}
@end
```

```
- (void)buttonAction:(UIButton *)button
{
	[button setEnabled:NO];
	[button setEnabled:YES afterDelay:0.8];
}
```
iOSアプリでpush通知の許可選択の挙動

情報あふれてそうだけど、ぐぐりにくかったのでメモ。

アプリ初回起動時に聞かれる「許可しない/許可する」どちらを選択しても二度とポップアップは出て来ない。同じアプリを削除→再インストールしてもダメ。

設定→通知に追加されているのでそちらから修正すれば良い。

ポップアップで許可しなかったらpush_tokenは取得できないが、設定から許可にしてやれば取得でき、その際はポップアップの表示は無し。
capistrano で mysql2 gem のビルドオプションを追加する


以下を `deploy.rb` とかに付け足しておけば `--with-mysql-dir` のオプションを足した状態で mysql2 gem のインストールをしてくれる。

```
before "bundle:install" do
  run "BUNDLE_GEMFILE=#{current_path}/Gemfile bundle config build.mysql2 '--with-mysql-dir=/usr/local/mysql'"
end
```
リリース前のアプリで忘れやすいデバッグのポイント


- フライトモードでちゃんと起動して、ネットワークにつなごうとしたときにちゃんとわかりやすいメッセージを出す
- 日本語環境/英語環境両方試す
- 24時間表示 on/off 切り替えても大丈夫
怪しいログをモニタリング


ステータスコードの 400 系と 500 系だけを tail する。
`$9`の部分はログのフォーマットに合わせて調整が必要。

```
tail -f /path/to/nginx/logs/hoge.access.log | awk '$9~/[45]0[0-9]/ { print }'
```
ruby-build のインストール、アップデート


brew のパッケージだと古いので。

```
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

ruby をインストールするとき。

```
rbenv install 1.9.3-p374
```


アップデートは普通に pull するだけ。

```
cd ~/.rbenv/plugins/ruby-build
git pull
```
よく使うGitコマンド

そこら中にありますが、まとめる機会があったので、公開します。

差異を見る

```
$ git diff
```

変更したファイルを表示

```
$ git status
```

変更したファイルを元に戻す

```
$ git checkout FileName
```

ブランチを移動する

```
$ git checkout BranchName
```

今いるブランチから新しいブランチを作り、そのブランチに移動する

```
$ git checkout -b BranchName
```

削除したファイルを戻す

```
$ git checkout HEAD --FileName
```

コミットの履歴を見る

```
$ git log
```

指定したファイルをStagingに移動させる

```
$ git add FileName
```

変更したすべてのファイルをStagingに移動させる(新規作成したファイルは移動されない)

```
$ git add -u FileName
```

StagingにあるファイルをCommitする
'-m'のオプションをつけるとコメントを追加できる

```
$ git commit 
```

Pushする

```
$ git push origin BranchName
```

ブランチ一覧を表示

```
$ git branch
```

直前にCommitしたコメントの修正

```
$ git commit --amend -m "コメント"
```

Remoteのブランチを削除する

```
$ git push origin :BranchName
```

Remoteのブランチをローカルに移動させる

```
$ git checkout -b BranchName origin/BranchName
```

ブランチを更新する

```
$ git fetch
```

変更をスタックに一時的に保存

```
$ git stash
```

スタックに保存されている変更を取り出す

```
$ git pop
```

StagingにあるファイルをStagingから下ろす

```
$ git reset HEAD 
```

一つ前のコミットに戻す

```
$ git reset HEAD ^
```

Rebaseをする

```
$ git rebase BranchName
```

Rebaseの途中でConflictが起こった時、Rebase前の状態に戻る

```
$ git rebase --abort
```

Remoteのmaster以外からPullをする

```
$ git pull origin BranchName
```

GitHubのIssueに対して、Pull Requestを送る
※[hub](https://github.com/defunkt/hub)を導入する必要あり

```
$ hub pull-request -i ISSUE_No -h organization:BranchName
```

GitHubのIssueに対して、master以外にPull Requestを送る

```
$ hub pull-request -i ISSUE_No -b organization:BaseBranchName -h organization:HeadBranchName
```
iPhoneアプリのネットワークステータスを取得する

ネットワークに接続する iPhone アプリを圏外で起動した場合にも
アラート表示をする等の動作をしないと、ユーザビリティが悪く Apple の審査に落ちてしまう。
そのため、アプリケーションからネットワークステータスを取得して
挙動を変える必要がある。

# 準備
[ここ](https://github.com/tonymillion/Reachability)から ARC に対応した Reachability を導入する。
CocoaPods を導入している場合は、Podfile に下記を追記する。

```
pod 'Reachability'
```

SystemConfiguration.framework を追加する。

# 実装

```objc
#import "Reachability.h"

@interface xxxViewController ()
@property (nonatomic) Reachability *reachability;
@end

- (void)viewDidAppear:(BOOL)animated {
    // ネットワーク状態が変更された際に通知を受け取る
    _reachability  = [Reachability reachabilityForInternetConnection];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notifiedNetworkStatus:) name:kReachabilityChangedNotification object:nil];
    [_reachability startNotifier];

    NetworkStatus networkStatus = [_reachability currentReachabilityStatus];
    /*
     ここで networkStatus には
     NotReachable : 接続されていない
     ReachableViaWWAN : 3G接続
     ReachableViaWiFi : Wi-Fi接続
     が入る
     */
    if (networkStatus == NotReachable) {
        // ここに UIAlertView など、圏外の場合の処理
    } else {
        [self xxx]; // ここに正常系の処理を関数で書く
    }
}

- (void)notifiedNetworkStatus:(NSNotification *)notification
{
    NetworkStatus networkStatus = [_reachability currentReachabilityStatus];
    // ネットワーク接続の通知を受け取った場合に、正常系の処理を行う
    if (networkStatus != NotReachable) {
        [self xxx];
    }
}
```
【Git】【git-flow】gitコマンドのエイリアス設定（Gitを使うなら、はじめにやっておくべき設定）

## gitコマンドのエイリアス設定

git のコマンド入力ってめんどくさい・・・

gitコマンドには、エイリアスが設定できる。
これをやるとやらないでは捗り具合が全然違う。


例えば、gitコマンドにエイリアスを設定した場合、下記のように実行できるようになる。

```bash
git branch     # 通常にコマンドを入力する場合
git b     # エイリアスを設定した場合

git checkout branch_name     # 通常にコマンドを入力する場合
git co branch_name     # エイリアスを設定した場合
```

git-flowのコマンドにもエイリアスを設定できる。

```bash
# 通常にコマンドを入力する場合
git flow feature start branch_name

# エイリアスを設定した場合
git ff start branch_name
```


### 設定方法
 
gitコマンドにエイリアスを設定するには、下記の通りにコンソール上でコマンドを実行すればいい。「alias.co 'checkout'」といった具合に、好きなエイリアスを設定する。

```bash
me-no-MacBook-Pro:me$ git config --global alias.co 'checkout'
me-no-MacBook-Pro:me$ git config --global alias.st 'status'
me-no-MacBook-Pro:me$ git config --global alias.di 'diff'
me-no-MacBook-Pro:me$ git config --global alias.b 'branch'
me-no-MacBook-Pro:me$ git config --global alias.mylog 'log --author="user_name"'
```

git-flow使ってる人は、上記に加え、git-flowのエイリアスも追加する。

```bash
me-no-MacBook-Pro:me$ git config --global alias.f 'flow'
me-no-MacBook-Pro:me$ git config --global alias.ff 'flow feature'
me-no-MacBook-Pro:me$ git config --global alias.fh 'flow hotfix'
me-no-MacBook-Pro:me$ git config --global alias.fr 'flow release'
me-no-MacBook-Pro:me$ git config --global alias.t 'tag'
```

#### 一括登録用コピペ

```bash
git config --global alias.co 'checkout'
git config --global alias.st 'status'
git config --global alias.di 'diff'
git config --global alias.b 'branch'
git config --global alias.mylog 'log --author="user_name"'
git config --global alias.f 'flow'
git config --global alias.ff 'flow feature'
git config --global alias.fh 'flow hotfix'
git config --global alias.fr 'flow release'
git config --global alias.t 'tag'
```
外部連携等が遅い場合に強制的にタイムアウトさせる方法

rubyの`timeout`を用いる

```ruby:sample_controller.rb
require 'timeout'

# ...
def index
  # 3秒たってもデータが取れなければ、Timeout::Errorがraiseされる
  Timeout::timeout(3) do
    # データ取りに行く
  end
rescue Timeout::Error
  render text: 'XXXサーバが遅いみたい'
end
# ...
```

まぁAjax使えよという内容。

Resqueとか?

```ruby:resqueからのコピペ
class Archive
  require 'timeout'
  @queue = :file_serve

  def self.perform(repo_id, branch = 'master')
    repo = Repository.find(repo_id)
    # このJobがやりたいこととtransaction doは関係ないけど
    ActiveRecord::Base.transaction do
      Timeout::timeout(3) do
        repo.create_archive(branch)
      end
    end
  end
end
```
see: http://doc.ruby-lang.org/ja/1.9.3/class/Timeout.html

### 以下妄想

書いていて、こんな感じにできればワーカーの起動で面倒なことしなくて済みそうと思った。
(あるのかな?)

```ruby:archive.rb
class Archive
  @queue = :file_serve
  @min_timeout = 5

  def self.perform(repo_id, branch = 'master')
    repo = Repository.find(repo_id)
    # Resque.current_worker.timeout でワーカーのタイムアウトが取ってこれる
    Timeout::timeout(Resque.current_worker.timeout) do
      # something
    end
  end
end
```

俺は5秒までのJob(@min_timeout <= 5)しか処理しないぜのワーカー

```
TIMEOUT=5 QUEUE=* rake resque:work
```

おいらは3秒までのJob(@min_timeout <= 3)しか処理しないぜのワーカー(ArchiveのキューはSkip)

```
TIMEOUT=3 QUEUE=* rake resque:work
```

と妄想。
CentOS 5.7にMySQLをソースからインストール


慣れないことを初めてやったので、メモに残しとく。

## 環境
* CentOS 5.7
* MySQL 5.5.29

## 方法
今回はyumコマンドなどを使わずソースからインストールする。

### 1. MySQLのグループとユーザーの作成
rootになる。

```
$ su -
```

```
# groupadd mysql
# useradd -g mysql -d /usr/local/mysql mysql 
```

※rootユーザーになるとき、-オプションを付けないと`groupadd`コマンドなどが使えないので注意。
オプションを付けないと、環境変数が元のユーザーの設定のままになってしまうようだ。
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/020suenv.html

### 2. MySQLのソースコードをダウンロード・展開
```
# cd /usr/local/src
# wget http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.29.tar.gz/from/http://ftp.iij.ad.jp/pub/db/mysql/
# tar zxvf mysql-5.5.29.tar.gz
# cd mysql-5.5.29
```

### 3. cmakeでソースコードをビルド
MySQL5.5系からconfigureでなく、cmakeでのコンパイルが推奨されたらしい。
cmakeが入っていなかったので、インストールするとこから。

```
# yum install -y cmake
```

MySQL依存パッケージも必要らしい。

```
# yum install -y ncurses-devel
```

これでcmake！
…うまくいくかと思ったら、エラーが出てコケた。
コンパイラが見つからないとかなんとか。
http://aji0.blog.fc2.com/blog-entry-12.html

追加でパッケージをインストール。

```
# yum install -y gcc-c++
# yum install -y bison  // こっちは必要なのかよく分からない…
```

このまま再度cmakeしてもエラるようなので、一旦MySQLのディレクトリを消してやり直し。

```
# rm -rf /udr/local/src/mysql-5.5.29
# cd /usr/local/src
# tar zxvf mysql-5.5.29.tar.gz
# cd mysql-5.5.29
```

これでcmakeが通るようになった。

```
# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DWITH_EXTRA_CHARSETS=all -DDEFAULT_COLLATION=utf8_general_ci -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1
```

cmakeのオプションは色々ある。今回はテーブルのパーティショニングをしたかったので、そのあたりのオプションを加えた。
http://dev.mysql.com/doc/mysql-sourcebuild-excerpt/5.5/en/source-configuration-options.html

### 4. MySQLインストール
```
# make
# make install
```

### 5. MySQLの初期設定
mysqlのディレクトリの所有者変更。

```
# chown -R mysql:mysql /usr/local/mysql
```

データベースの初期化。

```
# /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/
```

自動起動の設定。

```
# cp /usr/local/src/mysql-5.5.29/support-files/mysql.server /etc/init.d/mysql
# chmod +x /etc/init.d/mysql
# chkconfig --add mysql
```

起動スクリプトを編集し、実行環境を追記。

```/etc/init.d/mysql
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
```

設定ファイルコピー。

```
# cp /usr/local/src/mysql-5.5.29/support-files/my-medium.cnf /etc/my.cnf
```

MySQL起動確認！

```
# service mysql start
```

OKが出る(｀･ω･´)ゞ

### 6. PATHを通す
```~/.bashrc
PATH="$PATH":/usr/local/mysql/bin
```

```
# source ~/.bashrc
# mysql -V
mysql  Ver 14.14 Distrib 5.5.29, for Linux (x86_64) using  EditLine wrapper

# mysql -u root
```

mysqlがちゃんとインストールできてたら、ログインできる。

## 参考
今回はこちらの記事をほぼ参考にさせていただきました
http://codenote.net/mysql/229.html

一応公式ドキュメントも。
http://dev.mysql.com/doc/refman/5.5/en/installing-source-distribution.html
upstart + god + rails + daemons-railsでworkerを生かし続ける


# 環境

EC2(AmazonLinux)上で構築

| software | version |
|:--------:|:-------:|
| upstart  | 0.6.5   |
| god      | 0.13.1  |
| daemons-rails | 1.1.1 |

# インストール

## upstart

AmazonLinuxの場合は、upstartはすでに入っていたので特に何もなし

## god/daemons-rails

Railsプロジェクトの`Gemfile`に追加

```ruby:Gemfile
gem 'daemons-rails'
gem 'god'
```

その後に`bundle install`

```console
$ bundle install --path vendor/bundle
```

# 設定

## daemons-rails

`worker`という名前の`daemon`を作る

```console
$ bundle exec rails g daemon worker

$ cat config/daemons.yml
dir_mode: script
dir: ../../log
multiple: false
backtrace: true
monitor: false
ontop: false
```

- `worker`の実処理は`lib/daemons/worker.rb`
- pidファイルは`log/worker.rb.pid`

動作確認をしてみる

```console
$ RAILS_ENV=development bundle exec rake daemon:worker:start
```

コマンド自体はすぐに終了するがログを見ると動いているのがわかる

## god

次に`god`の設定

以下のファイルを作成

```ruby:#{Rails.root}/config/app.god
root_dir = File.expand_path(File.dirname(__FILE__) + '/../')
ENV["RAILS_ENV"] ||= "development"
rails_env = ENV["RAILS_ENV"]

God.watch do |w|
  w.name = "worker"
  w.interval = 5.seconds
  w.start = "cd #{root_dir} && RAILS_ENV=#{rails_env} bundle exec rake daemon:worker:start"
  w.pid_file = "#{root_dir}/log/worker.rb.pid"
  w.keepalive
  w.behavior(:clean_pid_file)
end
```

動作確認は

```console
$ bundle exec god -c config/app.god -D
```

とするとフォアグラウンドで起動してログがつらつらと出力される

```console
$ kill `cat log/worker.rb.pid`
```

をやってみるとすぐにまた`worker`が起動するのがわかる

```console
$ bundle exec god stop worker
```

とすると`worker`を落とせる

`god`自体の落とし方がよくわからなかったけど別のターミナルで

```console
$ bundle exec god terminate
```

としたらちゃんと`worker`も落とした上で落ちてくれた。

※`god`を`kill`したら`worker`が生き続けていた…。

## upstart

最後に`upstart`

`upstart`で`worker`を管理してもいいんだけどRailsプロジェクト内に`daemon`を集約したいので`upstart`で`god`を管理

```shell:/etc/init/god.conf
description "god"

start on runlevel [2345]
stop on runlevel [!2345]

chdir /data/app/current # Rails.root
env RAILS_ENV=development # Rails.env

script
  /usr/local/bin/bundle exec god -c config/app.god -l /var/log/god.log -D
end script

pre-stop script
  /usr/local/bin/bundle exec god terminate
end script

respawn
respawn limit 5 10
```

`bundle`のパスなどは環境に応じて適宜変更。

- godはSIGTERMを受け取っても監視対象プロセスをkillしてくれないので`pre-stop`で監視対象を終了させる

```console
# start god
```

で`god`が起動する事を確認。

```console
# stop god
```

で`god`が落ちる事を確認。

```console
# kill xxxx
```

で`god`を`kill`しても立ち上がる事を確認。

## deploy時

一応、`god`を`restart`してる。
`Capistrano`の場合は、`after 'deploy:restart'`のところに`restart`のレシピを追記した。

# まとめ

結構、長くなってしまったけど一応動いているっぽい。

というのも、本格運用してないのでまだわからない(笑)
Vimで複数ファイルを一括操作


特定フォルダ以下のファイルを一括で変換したり、
ゴニョゴニョするときの方法をまとめてみる。

# 操作するファイルを指定する

カレントディレクトリ以下のhtmlファイルに対して操作をしたい場合は、こんな感じに`:args`でまずはファイルを指定する。

```
:args ./*.html
```

さらにファイルを追加したい場合は、`:argadd`で追加

```
:argadd ./*.htm
```

# 現在操作対象のファイルを確認する
引数なしで`:args`を呼び出せば、確認出来る。


# 操作を実行する
`:argdo` に実行したい命令を引数として渡せばOK!
そのまま変更を保存したい場合は、最後に` | update`を付けて、実行する。

まとめて、ファイルエンコーディングをutf-8に変換したい場合は、

```
:argdo set fenc=utf-8 | update
```

のようにする。

## 参考
[vimで複数ファイルにまたがる特定のパターンを置換する場合のお作法](http://zx.jpn.org/b/20081025/155/vim/vim-mluti-file-replace)
コマンドの実行結果を入れ子にする　


バッククォートを使うと無理だけど、

```sh:
: pwdの結果をsedで置換した結果を…
cd /Users/foo
echo parent dir=`echo `pwd` | sed -e "s/foo//"`
zsh: parse error near `|'
zsh: parse error in command substitution
```

$()を使うと、

```sh:
echo parent dir=$(echo `pwd` | sed -e "s/\/foo//")
parent dir=/Users

: pwdの結果をsedで置換した結果をsedで置換し...
echo root dir=$(echo $(echo `pwd` | sed -e "s/\/foo//") | sed -e "s/Users//")
root dir=/
```

何重にでもできる。
VimでUTF8からBOMBを取り除く


ガラケー向けのHTMLファイルになぜかBOMBが紛れ込んだので、vimで取り除く方法を調べた。

```
:set nobomb
:w
```

以上

超カンタンだった。流石、vim

## おまけ
複数のファイルを一括してBOMBなしにするには、

```
:args **/*.html
:argdo set nobomb | update
```
webdriver起動時に付けたいオプション

とりあえずchromeだけ。

想定するケースは二つ。

1.開発中の環境のため、SSL証明書がオレオレなので警告画面が出てテストが止まるのをなんとかしたい。
2.ユーザのaccept-languageをブラウザデフォルトから一時的に変えたい

これらを合わせて解決するのが次の設定。GebConfig.groovyに書いたらいいと思う。

```
def capabilities = DesiredCapabilities.chrome()
capabilities.setCapability("chrome.switches", Arrays.asList("--ignore-certificate-errors", "--lang=en_US"))
return new ChromeDriver(capabilities)
```
--ignore-certificate-errorsは証明書エラーを無視、--lang=en_USは言語コードの設定。chromeの起動オプション知ってれば、たぶんcapabilitiesで設定できるのでは。
LinuxでJava7を使ってantできる環境を構築（超簡易版）

CentOS6の場合、antとOpenJDK1.7をyumでインストールしても
ビルドが失敗する可能性がかなりある。
それは、javacを提供しているjdkのバージョンが1.5.0だから。
OpenJDK1.7の入ってるっぽいところを探してもjavacのバイナリを発見できなかった。。。
その時は、
http://www.oracle.com/technetwork/java/javase/downloads/index.html
からjdkを落としてきてrpm -Uvhでインストール。
そうすればあとは

```bash:env.sh
export ANT_HOME="/usr/share/ant" 
export JAVA_HOME="/usr/java/latest" 
export PATH=/usr/java/latest/bin:$PATH
```

と環境変数を設定すれば使えるようになる
NeoBundleLazyをvimrcに導入した。

これまで以下の３つのプラグインは、NeoBundleLazyしてもNeoBundleSourceしないといけないので(面倒だし)、NeoBundleだとVimの起動が遅くなるから極力ロードしないようにしていたのだけど、`hooks.on_source()`が導入されたのでNeoBundleLazyを導入した。

```vim:
NeoBundle 'Shougo/vimfiler'
NeoBundle 'Shougo/vimshell'
NeoBundle 'Shougo/unite.vim'
```

とりあえず、↓こんな感じになった。導入したらVimの起動時間が4秒くらいだったのが2秒まで縮まった！

```vim:
NeoBundleLazy 'Shougo/vimfiler', {
\   'autoload' : { 'commands' : [ 'VimFilerBufferDir' ] },
\   'depends': [ 'Shougo/unite.vim' ],
\ }
let s:bundle = neobundle#get('vimfiler')
function! s:bundle.hooks.on_source(bundle)
  " ココにvimfilerの設定とか記述する。
endfunction

NeoBundleLazy 'Shougo/unite.vim' , {
\   'autoload' : { 'commands' : [ 'Unite' ] }
\ }
let s:bundle = neobundle#get('unite.vim')
function! s:bundle.hooks.on_source(bundle)
  " ココにunite.vimの設定とか記述する。
endfunction

NeoBundleLazy 'Shougo/vimshell', {
\   'autoload' : { 'commands' : [ 'VimShellBufferDir' ] },
\   'depends': [ 'Shougo/vimproc' ],
\ }
let s:bundle = neobundle#get('vimshell')
function! s:bundle.hooks.on_source(bundle)
  " ココにvimshellの設定とか記述する。
endfunction

nnoremap <leader>g  :<C-u>Unite grep -no-quit<CR>
nnoremap <leader>u  :<C-u>Unite file_mru<CR>
nnoremap <leader>f  :<C-u>VimFilerBufferDir<CR>
nnoremap <leader>s  :<C-u>VimShellBufferDir<CR>
```

あと、vimrc内で`vimfiler#set_execute_file()`を呼んでいたので、
今までVimの起動が1秒ほど遅くなっていたみたい...orz。vimrc内でautoload関数をホイホイ呼ぶものじゃないねぇ。
addSubViewした時の参照？weakプロパティの謎


なんかよくわからくなった。初心者的な話なのかも。Twitterで質問したら、優しい人が何人かリプライを飛ばしてくれたのですが、ながすぎて、返信しきれないので、ここに書いてみます。

### まずこのコードは正しい

```` objectivec:.m
UIImage *image = [UIImage imageNamed:@"sample"];
UIImageView *imageView = [[UIImageView alloc]　initWithImage:image];
[self.view addSubview:imageView];
````

これで、self.viewにstrong参照になり、もちろんsample画像が表示される。

参考(http://blog.natsuapps.com/2011/11/ios5-arc-weakproperty-for-outle.html)

### これは表示されない

さて、上記のimageViewをpropertyで持ちたい。addSubviewすると、strongで参照されるので、weakで持つのがいいよね。だって、removeFromSuperviewされたときは開放したいじゃん？（ですよね？不安）

```` objectivec:.h
@property (weak, nonatomic) UIImageView *imageView;
````

```` objectivec:.m
UIImage *image = [UIImage imageNamed:@"sample"];
self.imageView = [[UIImageView alloc] initWithImage:image];
[self.view addSubview:self.imageView];
````

これ、表示されない。なんで？

### これは表示される。当たり前だけど。

```` objectivec:.m
UIImage *image = [UIImage imageNamed:@"sample"];
UIImage *imageView = [[UIImageView alloc] initWithImage:imageView];
[self.view addSubview:imageView];
self.imageView = imageView;
````

こうしなきゃダメなの？

### これも表示される
```` objectivec:.m
UIImage *image = [UIImage imageNamed:@"sample"];
UIImage *imageView = [[UIImageView alloc] initWithImage:imageView];
self.imageView = imageView;
[self.view addSubview:self.imageView];
````

これは大丈夫。


### 結局どういうことなのか

わからん。こういうのってどうやって調べるんだろう。もしなぜかのか知ってたら教えて下さい。お願いします。

weak参照のsetterがなんか悪さしてそう？？

### 答えを教えて頂きました

https://twitter.com/t_okada/status/291859092270612480

>ローカル変数（この場合はimageView）も強参照だからという話じゃないですかね。弱参照だけになった瞬間にオブジェクトはreleaseされるので、self.imageViewプロパティはその時点でnullになるはず。岡田哲哉さん (@t_okada) 

とのこと。確かにそうだ！
Effective Java 18章 抽象クラスよりインタフェースを選ぶ

Effective Javaの18章「抽象クラスよりインタフェースを選ぶ」を読んだので軽くまとめます。

## インターフェースと抽象クラスの違い
インターフェースと抽象クラスは、複数の実装を許す為の仕組みの1つである。
両者の違いは、抽象クラスはメソッドの実装を持てるのに対してインターフェースは持てないことである。
インターフェースはクラス階層のどこに属していても実装できる。抽象クラスもどの階層においても実装できるが、Javaでは単一継承しか許されていない為、型定義をする為に抽象クラスを使用するのは非常に不便になる。
例えば、2つの異なるクラスA, Bに対して、抽象クラスCを実装させたいとする。その場合、AとBの祖先がCになるように実装しなければならない。ここで問題になるのは、AとBに関係ないクラスまでCを実装する必要が出て来てしまうことである。

## ミックスイン
複数のインターフェースを混ぜ合わせて振る舞わせることをミックスインと呼ぶ。たとえば、以下のようなSingerインターフェースとSongwriterインターフェースがあるとする。

```java:Singer.java
public interface Singer {
    AudioClip sing(Song s);
}
```

```java:Songwriter.java
public interface Songwriter {
    Song compose(boolean hit);
}
```

これらをミックスインし、以下のようなSingerSongwriterインターフェースを定義できる。

```java:SingerSongwriter.java
public interface SingerSongwriter extends Singer, Songwriter {
    AudioClip strum();
    void actSensitive();
}
```

これは抽象クラスでは実現出来ない。なぜなら、Javaではクラスは２つ以上の親を持つこと(多重継承)ができないから。無理に継承を使って実装しようとすると、組み合わせ爆発(combinational explosion)が起こり、クラス階層が膨れ上がる。

## 骨格実装

Javaではインターフェースに実装を含むことは許されていないが、それ単体で提供しても実装者の負担になるだけである。そこで、インターフェースと一緒に骨格実装クラスを提供することでその問題を解決する。
骨格実装クラスはAbstractInterfaceと呼ばれ、Javaの主要なCollection Frameworkではそれが提供されている。例えば、 [List](http://docs.oracle.com/javase/jp/1.5.0/api/java/util/List.html) インターフェースに対しては [AbstractList](http://docs.oracle.com/javase/jp/1.5.0/api/java/util/AbstractList.html) が提供されている。
ほとんどの場合、骨格実装を拡張してインターフェースを実装することを選択すべきである。

骨格実装を作る場合、それが継承して使われることを想定して実装すべきである。ドキュメントと設計の指針に正しく従って設計を行う。

## インターフェースの変更は困難
一度リリースされたpublicなインターフェースに対し、後から変更を加えることは非常に難しい。
このような問題を回避する為、正式リリース前にできるだけ多くのプログラマにこのインターフェースを使って実装してもらい、欠陥を早期に発見できるようにすると良い。インターフェースは最初から正しい設計をする必要がある。
RspecでApplicationControllerで定義した共通メソッドのテストをする方法


例えばログインしてるか確認する処理などbefore_filterで共通して使われそうなメソッドをテストする際に上手いことテストする方法。

[Anonymous Controller](https://www.relishapp.com/rspec/rspec-rails/docs/controller-specs/anonymous-controller)を使うと良い。

Anonymous Controllerを使うとテスト内でactionを定義することが出来るのでこのactionにリクエストを投げると良い。また、paramsの値によってテスト内容が変わる場合などもこの方法を取るとget,post呼び出し時にクエリストリングを渡す事が出来るので便利。

```ruby:
describe ApplicationController do
  describe "#login?" do
    controller do
      # index actionを定義
      def index
        login?
        render :text => 'dummy message'
      end
    end
    it '' do
      …

      # 上で定義したactionを呼び出す
      get :index

      …
    end
  end
end
```
RSpecでコントローラのテスト時にリクエストヘッダの内容を変更する方法


例えばUser Agentの値で表示される画面を切り替える処理など、HTTPヘッダの値に処理が依存する場合にコントローラに渡すヘッダの値を上書きしたい場合など。request.envを使えば良い

```ruby:
describe TestController do
  context 'iphon safari' do
    request.env['HTTP_USER_AGENT'] = '…'
  end
end
```
Object#freezeについて

```ruby
DAYS = ['日', '月', '火', '水', '木', '金', '土']
DAYS << '日'
p DAYS
#=> ["日", "月", "火", "水", "木", "金", "土", "日"]
```

- 定数のArrayやHashでも中身を簡単に書きかえられてしまう。ゆるふわな感じがする。
- こんな定数はイヤだ。

```ruby
DAYS = ['日', '月', '火', '水', '木', '金', '土'].freeze
DAYS << '日'
p DAYS
#=> /Users/naoty/workspace/misc/freeze_sample.rb:3:in `<main>': can't modify frozen Array (RuntimeError)
```

- `Object#freeze`を使うと、オブジェクトの中身を変更できなくなる（ただし、オブジェクトそのものを再代入することは可能）。
- こっちの方が定数っぽい感じがする。
Yii Framework: ファイル変更時にPHPUnitを自動実行してMacの通知センターに結果を表示させる

ファイルを変更して、保存したときに PHPUnit が自動実行されるとありがたい。かつ、通知センターに結果を表示してくれればもっとありがたい。ということで試してみました。パスが Yii でのやり方になっていますが、他でもいけると思います。とりあえず最近は Yii をけっこう触っているので、Yii でのやり方で説明していきます。

まず watchr と terminal-notifier というやつをインストールします。幸いなことに自分の環境では Ruby が元々入ってたみたいで以下のようにするとインストールができました。

```bash
sudo gem install watchr
sudo gem install terminal-notifier
~~~

次に watchr を使ってファイル変更時に何をどうするかというファイルを作ります。PHPUnit + watchr + Growl という組み合わせでテストの自動実行かつ通知をするという記事はけっこうあるので、それらの記事を参考にしつつ Growl ではなく terminal-notifier を使った感じにすると以下のようなコードになります。

~~~ruby:autounit.watchr
watch('./(.*).php')  { |m| changed(m[0]) } 

def changed(file)
  run "clear && cd tests && phpunit unit"
end

def run(cmd)
  result = `#{cmd}`
  puts result
  notify result
end

def notify(result)
  message = result.split("\n").last(3)

  title = message.find { |e| /FAILURES/ =~ e } ? "FAILURES" : "PASS"

  if title == "FAILURES"
    info = /\x1b\[37;41m\x1b\[2K(.*)/.match(message[1])[1]
  else
    if /^(Call Stack:|No tests executed!)$/ =~ result
      title = "ERROR"
      info = "Please check the error message ..."
    else
      info = /\x1b\[30;42m\x1b\[2K(.*)/.match(message[1])[1]
    end
  end

  require 'rubygems'
  require 'terminal-notifier'
  TerminalNotifier.notify(info, :title => title, :group => "phpunit")
end
~~~

.php ファイルを変更・保存したときに clear && cd tests && phpunit unit というコマンドが自動実行されて結果がターミナルと通知センターに表示される、という流れです。[Autotesting with watchr, growl and PHPUnit](http://criticallog.thornet.net/2011/03/08/autotesting-with-watchr-growl-and-phpunit/) などの記事を参考にしたんですが title が "FAILURES" かそれ以外の分岐だけでは PHP のエラーが出たときに watchr が終了してしまうみたいなので、PHPのエラーなどが含まれていれば ... という条件分岐を追加しました。あとは terminal-notifier のオプションに値を当てはめていきます。[Mountain Lion Notifications from Terminal with terminal-notifier](http://brettterpstra.com/2012/08/01/mountain-lion-notifications-from-terminal-with-terminal-notifier/) を参考にしました。また、コマンドラインで terminal-notifier -help とするとオプションの説明などが出てきます。

で、実際使うときですが、今現在は .bashrc に alias autounit='watchr /path/to/autounit.watchr' みたいなエイリアスを作って、自動実行したいなってときに コマンドライン で /protected まで移動して autounit リターンで開始するような形にしています。注意点としては watchr でファイル監視後に、新しくファイルを作成しても自動実行の対象外になるので、ある程度ファイルができてから開始したほうがいいように思います。
JavaScriptで列挙型っぽいことをやる

```JavaScript:enum.js
/**
 *  逆配列を求める（ただし1対1対応限定）
 */
function getEnum(arr) {
  var i;
  var len = arr.length;
  var ret = {};
  for(i=0; i<len; i++) {
    ret[arr[i]] = i;
  }
  return ret;
}
```

#使い方
var magiArr = ["MELCHIOR", "BALTHASAR", "CASPER"];
var magi = getEnum(magiArr);

// 定数の感覚で呼び出す
var a = magi.MELCHIOR; // => 0
var b = magi.BALTHASAR; // => 1
var c = magi.CASPER; // => 2

// 元のキーもわかる
magiArr[a] // => "MELCHIOR"
magiArr[b] // => "BALTHASAR"
magiArr[c] // => "CASPER"
システムアカウントをGID、UIDの希望を指定して作成

例えば

```
groupadd -g 450 redis
```

とすれば、指定のGIDでグループを作成出来ますが、使用済みだとエラーになります。

CentOS6.3の日本語man groupaddには載っていませんが、LANG=C man groupaddだと
-rオプションや-Kオプションというのが載っています。

例えば

```
groupadd -r redis
```

とかすると、499以下で未使用の最大値で作成されます。

そこで

```
groupadd -r -K SYS_GID_MAX=450 redis
```

とすれば、450以下で未使用の最大値で作成されます。
method="GET"なformのactionにクエリパラメータ付きURLを使う


```javascript

var getQueryParams = function(url){
	if( url.length < 1 ){
		return {};
	}
	var queryStr = url.slice(url.indexOf('?')+1);
	if(queryStr.length < 1){
		return {};
	}
	if(queryStr.indexOf('#')!==-1){
		queryStr = queryStr.slice(0, queryStr.indexOf('#'));
	}
	var query_a = queryStr.split('&');
	if(query_a.length < 1){
		return {};
	}
	var queryObj = {};
	for(var i=0; i<query_a.length; i++){
		var query = query_a[i];
		var kv = query.split('=');
		queryObj[kv[0]] = kv[1];
	}
	return queryObj;
};

var queryToHidden = function($formObj){
	var url = $formObj.attr('action');
	var queryParams = getQueryParams(url);
	var hash;
	if(url.indexOf('#')!==-1){
		hash = url.slice(url.indexOf('#'));
	}
	for(var name in queryParams){
		var input = $("<input>").attr("type", "hidden").attr("name", name).val(queryParams[name]);
		$formObj.append(input);
	}
	
	url = url.slice(0, url.indexOf('?'));
	url = (hash)? url+hash: url;
	$formObj.attr("action", url);
};

//methodがGETのformは自動でqueryToHidden
$(function(){
	$("form[method=GET]").submit(function(){
		queryToHidden($(this));
		return true;
	});
});

```

クエリパラメータをinput[type=hidden]に変換してsubmitします。
dataイベントで受け取るバッファの文字化け

「[Node.js入門](http://ascii.asciimw.jp/books/books/detail/978-4-04-870367-3.shtml)」勉強会にて、

## 質問：
勉強会参加者から、

> 「Webサーバなどで dataイベントで受け取る chunk Buffer を単純に文字列変換しているとマルチバイト文字を受けた時に文字化けする可能性はないですか？」

と質問を受けました。あっ!

```javascript
var data = '';
socket.on('data', function(chunk) {
 data += chunk;
});
````
を本のサンプルコードで各所に書いた覚えが… 

>「Node 内部でうまくエンコードの切れ目の処理してるんじゃないかなぁ～ ちゃんと調べて回答します。」

と一時しのぎの答えをしたので、ちゃんと回答します。

## 回答：
はい。文字化けしちゃいます。以下のサンプルコードの様に、utf8文字エンコードの切れ目でないところでデータを読みだしていると見事文字化けします。

```javascript:buf1.js
var http = require('http');
var port = 8080;
var server = http.createServer(function(req, res) {
  var data = '';
  req.on('data', function(chunk) {
    data += chunk;
  });
  req.on('end', function() {
    console.log('data:', data);
    res.writeHead(200);
    res.end();
    server.close();
  });
});
server.listen(port, function() {
  var client = http.request({port: port, method: 'POST'});
  var buf = new Buffer('\u3042\u3044\u3046\u3048\u304a'); // 'あいうえお'
  client.write(buf.slice(0,8));
  client.write(buf.slice(8));
  client.end();
});
````
実行結果

```bash
> node buf1.js
data: あい???えお
````
そうですよね。マルチバイト文字の事はちゃんと最初から考慮に入れておかないといけないです。内部でよろしくやってくれるはずと勝手に思い込んではいけません。

## じゃ正解は？
どんなエンコード形式で送られて来るのがわかっていれば、ちゃんとエンコードタイプを指定してあげることです。
下記のサンプルコードでは、HTTPレスポンスボディをutf8で受け取ることを明示的に設定しています。

```javascript:buf2.js
var http = require('http');
var port = 8080;
var server = http.createServer(function(req, res) {
  var data = '';
  req.setEncoding('utf8'); // 受信するレスポンスボディのエンコード形式をutf8に指定
  req.on('data', function(chunk) {
    console.log('chunk:', chunk);
    data += chunk;
  });
  req.on('end', function() {
    console.log('data;', data);
    res.writeHead(200);
    res.end();
    server.close();
  });
});
server.listen(port, function() {
  var client = http.request({port: port, method: 'POST'});
  var buf = new Buffer('\u3042\u3044\u3046\u3048\u304a'); // 'あいうえお'
  client.write(buf.slice(0,8));
  client.write(buf.slice(8));
  client.end();
});
````
出力結果

```bash
> node buf2.js
chunk: あい
chunk: うえお
data; あいうえお
````
おぉ、文字化け解消ですね。受信している chunk が変なところで分割されているのに結果が大丈夫なのは、内部処理で`string_decoder`オブジェクトが生成されていて、半端データを内部に保持しているからなんですね。

バッファ型のままで扱うなら、下のサンプルの様に配列で蓄えておいて最後に`Buffer.concat()`でつなげるという技がいいかと思います。

```javascript:buf3.js
var http = require('http');
var port = 8080;
var server = http.createServer(function(req, res) {
  var bufs = []; // バッファを蓄えておく配列
  bufs.totalLength = 0; // 受け取ったバッファの合計サイズ
  req.on('data', function(chunk) {
    bufs.push(chunk);
    bufs.totalLength += chunk.length;
  });
  req.on('end', function() {
    var data = Buffer.concat(bufs, bufs.totalLength);
    console.log('data:', data.toString());
    res.writeHead(200);
    res.end();
    server.close();
  });
});
server.listen(port, function() {
  var client = http.request({port: port, method: 'POST'});
  var buf = new Buffer('\u3042\u3044\u3046\u3048\u304a'); // 'あいうえお'
  client.write(buf.slice(0,8));
  client.write(buf.slice(8));
  client.end();
});
````
出力結果

````
> node buf3.js
data: あいうえお
````
さくらインターネットサーバでマルチサイト化

WordPress3.5をサブディレクトリ形式でインストールする場合のメモ。
htaccessファイルを管理画面の指示通りに行うと「CSSが適用されない」「ダッシュボードが表示されない」等の不具合が発生する為、下記に変更。

## ソースコード

```php5:.htaccess
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]

# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]
```
Pythonでconfig.iniを使う


```Python:aws.py

	import ConfigParser

    inifile = ConfigParser.SafeConfigParser()
    inifile.read("./config.ini")
    aws_access_key_id = unicode(inifile.get("aws","access_key_id"))
    aws_secret_access_key = unicode(inifile.get("aws","secret_access_key"))
```

```Ini:config.ini

	[aws]
	access_key_id = xxxxxxxx
	secret_access_key = yyyyyyyy
```
プログレスバー表示させたいなぁ

脈略もなく、タイトルのようなことを朝起きて断水してたしそういやどうすりゃいいんだろうなぁと思ってググったら[StackOverflowに色々と書かれていた](http://stackoverflow.com/questions/3173320/text-progress-bar-in-the-console)。

その投稿されている中から、[この投稿](http://stackoverflow.com/a/13685020)が他のライブラリ依存してないし、flushして書き換えしてるだけだからシンプルだなぁと思ったので参考にさせてもらった。
なんかこれだと100%表示されないし、どうなのかなぁと思ったのでちょっと改善。
といっても終了時に100%とするように修正しただけだけど。

``` python
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import sys
import time
from random import random

def progress_bar(label, end_val, bar_length=40, slug='#', space=' '):
    def writing_bar(label, bar, percent):
        sys.stdout.write("\r{label}: [{bar}] {percent}%".format(
            label=label, bar=bar, percent=percent
        ))
        sys.stdout.flush()

    for i in range(0, end_val):
        percent = float(i) / end_val
        slugs = slug * int(round(percent * bar_length))
        spaces = space * (bar_length - len(slugs))
        # Some processing...
        # Is provisional
        time.sleep(random() * 0.1)
        writing_bar(label, slugs + spaces, int(round(percent * 100)))
    writing_bar(label, slugs + spaces, 100)
    sys.stdout.write('\n')

if __name__ == '__main__':
    progress_bar("Processing", 100)
```

time.sleepの部分が処理になるわけで、これを適宜置き換えるか、
それともprogress_barそのものをdecoratorにしてしまうとか、
そうしないと普通には使い物にならない。といってもプログレスバーというのは
cliアプリケーションにおいてwgetやらcurl -Oやら、なんというか
ネット上のリソースを得るもんだしそんなに考えなくてもいいもんなんだろうなぁ...?
iPhoneとAndroidで同じ内容のプログラムを淡々とあげていく

# n秒後に処理を実行する

```objc
// 2秒後に、self の hoge を実行する。
[self performSelector:@selector(hoge) withObject:nil afterDelay:2.0];
// 上記の処理をキャンセルするには
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(hoge) object:nil];
```

```java
// 2秒後に、thisのhogeを実行する
new Handler().postDelayed( new  Runnable() { 
@Override
public void run() {
hoge() ;
				}},
				2000);
```
http.ClientRequest の request.write() によるデータ送信のタイミング

## 質問：
書籍：「[サーバサイドJavaScript Node.js入門](http://ascii.asciimw.jp/books/books/detail/978-4-04-870367-3.shtml)」の p186 10.4 HTTPクライアントの概要 で

> 最終的にreq.end() メソッドによって保存されたHTTPリクエストデータがサーバ側に初めて送信されます（図10-9）。

と書いてあるけど、実際動作確認してみると`req.end()`より前にデータが送られているように見える。記述の間違いじゃないか？

と質問を受けました。

そこで、 `http.ClientRequest`の`req.write()`の挙動（どのタイミングでデータは送られるのか）ということを調べました。

## 回答：
テキストの記載が間違いでした。`req.end()`の有無に関係なく`req.write()`の実行によりサーバ側へHTTPリクエストのボディデータは送信されます。

## 理由：
ソースを確認したら、`req.write()`するとソケットに接続していればその時点でソケットにデータを書き込む処理を行っていました。よって `req.end()`がなくてもHTTPリクエストのボディデータはサーバ側に送信されます。

## じゃなぜ間違えたの？：

下記の様に単純な HTTPクライアントリクエストを行うコードでは、`client.write()`が`false`だったので、どんな状況でも単純に `req.write()`では出力バッファに溜り、`req.end()`で出力バッファをフラッシュ＆送信しているものと思い込んでました。（私の確認不足です。）

```javascript:request1.js
var http = require('http');
var req = http.request({port:8080, method:'POST'});
console.log(req.write('a')); // false 出力バッファに溜まる
console.log(req.write('b')); // false 出力バッファに溜まる
req.end('c'); // false サーバに送信？
````

上記 request1.js で`client.write()`が`false`になってデータが出力バッファに溜まっている理由は、`req.write()`実行時にHTTPクライアントの socket 接続がまだ完了してないからです。

下記コードのように socket 接続が完了した後に client.write() すれば、実行時に直ちにデータはサーバに送信されます。

```javascript:request2.js
var http = require('http');
var req = http.request({port:8080, method:'POST'});
req.on('socket', function(socket) {
  socket.on('connect', function() {
    console.log(req.write('a')); // true サーバに送信
    console.log(req.write('b')); // true サーバに送信
    req.end('c'); // Chunk終了の"0\r\n\r\n"をサーバに送信
  });
});

````
よってテキストp186の記述は間違いで、

> req.write() は、リクエストオブジェクトのソケット接続が完了していれば、直ちにデータをサーバに送信します。ソケットが未接続の場合やエージェントからソケットの割り当てがまだされていない場合は、データは出力バッファに溜まります。

と書くのが正しい表現でした。近日中に正誤表を更新いたします。
Rで隠しオブジェクトを作る

オブジェクト名をドットで始まるものにすればよいだけ。
関数でも変数でも両方いける。


```r:てきとうにオブジェクトを作る
.secret <- "miserare nai yo!"
```

```
> .secret
[1] "miserare nai yo!"
```

ふつうに`ls()`しても出てこないけど、UNIXでいう`ls -a`にあたる`all.names=TRUE`オプションを加えると見えます。

```
> ls()
character(0)
> ls(all.names=TRUE)
[1] ".secret"
```
CoffeeScriptでプロパティをどうしても隠したい時

JS同様、closureを使うのです。

```coffee-script:fuga.coffee
_ivar = null #this is an ivar

module.exports = class Fuga
  constructor: -> _ivar = 'initated'
  ivar: -> _ivar
  setIvar: (x) -> _ivar = x
```

使ってみると、

```coffee-script
Fuga = require './fuga'

fuga = new Fuga()
console.log fuga.ivar()
# initiated
fuga.setIvar 'changed'
console.log fuga.ivar()
# changed
console.log fuga._ivar
# undefined
```
_ivarに直接アクセス出来ませんね。

[Object.defineProperty](http://qiita.com/items/e27bf9c78bbed7fcefac)と一緒に使うと面白いと思います。

結果的にはこういう風にコンパイルされます。

```Javascript:fuga.js
// Generated by CoffeeScript 1.4.0
(function() {
  var Fuga, _ivar;

  _ivar = null;

  module.exports = Fuga = (function() {

    function Fuga() {
      _ivar = 'initated';
    }

    Fuga.prototype.ivar = function() {
      return _ivar;
    };

    Fuga.prototype.setIvar = function(x) {
      return _ivar = x;
    };

    return Fuga;

  })();

}).call(this);
```

**訂正：以下のコードでは継承時に不具合が起こります。**
[kaminaly](http://qiita.com/users/kaminaly)、ありがとうございました。

[Crockford法](http://javascript.crockford.com/private.html)。


```coffee-script
class Fuga
  constructor: ->
    _ivar = 'initated'
    @ivar = -> _ivar
    @setIvar = (x) -> _ivar = x
```
XcodeにてiPhoneアプリを実機にインストール時"Cloud not launch"

下記の手順で解決した。

## 手順
* デバイスをUSBケーブルから外す。
* 実機のアプリを削除する。
* Xcodeを終了する。（⌘ + q）
* アプリのDerivedDataを削除する。
　場所：/Users/ユーザー名/Library/Developer/Xcode/DerivedData/アプリ名-dqmislmaqlyjnyfcqkakyneegmiu/）
* Xcodeを起動して、もう一度ビルドする。