OmniAICreator/Qiita-1.07M huggingface dataset:
Vagrant セットアップ (Mac)


## 1. Vagrant のインストール

公式サイト
http://www.vagrantup.com/

上記公式サイトから、 vagrant_1.8.1.dmg をダウンロードし インストール

``` bash
$ vagrant --version

Vagrant 1.8.1
```


## 2. VirtualBox を公式サイトからインストール

VirtualBox 公式サイト
https://www.virtualbox.org/

VirtualBox-5.0.20-106931-OSX.dmg をダウンロードし インストール

## 3. 初期化と起動

Centos6.7の例です。

```bash
$ mkdir -p ~/Vagrant/CentOS67/
$ cd ~/Vagrant/CentOS67/

$ vagrant init bento/centos-6.7
$ vagrant up --provider virtualbox

```


その他のBoxは下記にあるので、他のBoxを探して利用することも可能です。
https://atlas.hashicorp.com/boxes/search

例）ubuntuの例

```bash
$ vagrant init ubuntu/trusty64
$ vagrant up --provider virtualbox
```

以前からある vagrantbox.es からBoxを探して利用することも可能です。
http://www.vagrantbox.es/

例）

```bash
$ vagrant box add centos65 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box

$ mkdir -p ~/Vagrant/CentOS65
$ cd ~/Vagrant/CentOS65

$ vagrant init centos65
$ vagrant up
```

## 4. 仮想マシンの操作

### 起動するには、up 

```bash
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...

[default] VirtualBox VM is already running.
```
すでに起動してます。

### 状態を見るには、 status

```bash
$ vagrant status

default                   running (virtualbox)
```

### 一時停止するには、suspend

```bash
$ vagrant suspend

[default] Saving VM state and suspending execution...
```
## 5. 仮想マシンへの接続

```bash
$ vagrant ssh

Welcome to your Vagrant-built virtual machine.
[vagrant@localhost ~]$ 
```
## 6. ネットワークの設定

```bash
$ vim Vagrantfile
# config.vm.network :private_network, ip: "192.168.33.10"
 ↑ ここのコメントアウトを削除
```
vagrant のリロード

```bash
$ vagrant reload
```

これで、192.168.33.10 というIPでアクセスできる

```bash
% ping 192.168.33.10
PING 192.168.33.10 (192.168.33.10): 56 data bytes
64 bytes from 192.168.33.10: icmp_seq=0 ttl=64 time=0.383 ms
64 bytes from 192.168.33.10: icmp_seq=1 ttl=64 time=0.624 ms
64 bytes from 192.168.33.10: icmp_seq=2 ttl=64 time=0.794 ms
```

## 7. プロビジョニング

Vagrantには chef や ansible のようなサーバーの初期設定をするしくみが備わっています。
大きく分けて、Vagrantfile に直接記述する inlineの方法と、外部ファイル(shell script)に記述する方法があります。

### 7.1 プロビジョニング/inlie

Vagrantfile に直接記述します。

```
Vagrant.configure("2") do |config|
  config.vm.provision "shell", inline: <<-SHELL
     sudo yum update
     sudo yum install -y git screen tree wget
  SHELL
end
```

変更したら、provisionを実行

```
$ vagrant provision
```

### 7.2 プロビジョニング/外部ファイル

外部のshell scriptを実行します。

```
Vagrant.configure("2") do |config|
  config.vm.provision "shell", path: "script.sh"
end
```

このscript.sh はホストOS側にあります。

### 7.3 その他

他にも、指定したURLのスクリプトを実行したり、いろいろできます。
詳しくはこちら
https://www.vagrantup.com/docs/provisioning/shell.html


## 補足

Vagrantのsharedfolder使ってて良くはまるのが、CSSとかJSとかHTMLといった静的なコンテンツを更新しても
反映されない事があります。
そんな現象が起きた時は下記を参考にしてapacheやnginxの設定を見直すと良いかもです。

VagrantでCSSの更新が反映されない場合の対処法
http://qiita.com/shoyan/items/12389d5beaa8695b1a53
Elispに添付した外部プログラムの変数定義方法


Elispに外部プログラムやファイルを添付したとき、そのパスを適切に設定する方法を紹介します。

外部プログラム foo.rb を 使用する foo.el を開発しており、foo.rb は foo.el と同じディレクトリに配置するとします。

```
foo
├── foo.el
└── foo.rb
```

foo.rbのパスの変数`foo-rb-program`を次のように定義すると、状況に合わせてパスが設定されます。

- 開発中は `eval-buffer` や `eval-last-sexp` などによって`foo-rb-program`を評価する。そのとき、自分のワーキングディレクトリからパスが設定される。
- Elispを配布したときは、`require` や `load` で該当のファイルを読み出したとき、 そのロードされたファイルのパスから`foo-rb-program`のパスが設定される。


``` clisp
(defvar foo-rb-program
  (let ((current (or load-file-name (buffer-file-name))))
    (expand-file-name "foo.rb" (file-name-directory current)))
  "Path to the `foo.rb'.")
```
[robe.el](https://github.com/dgutov/robe/blob/1bc5a9b572e4de606e3549af3e396f4b5259d3cf/robe.el#L77-L80) の コードを読んでいる時に知りました。
Droppletsがやたら重く感じるのはメニューのMarketを読んでるせいだった

- hardwired
- hard_wired
- 2013/11/16
- Dropplets 
- published

Nginx + php-fpm でこんなに遅いのはなんか理由があるはずだと思って探しまくったがミドルウェアレベルでは全く理由が見つからず。ログアウト状態だとアホみたいに速い事に気がついたので、なんかログイン状態の左メニューが悪さをしてるのかとおもって探したら本家にあった。最初から本家のGithubのIssue読んでおけばよかった。結果からいえば正にコレが原因。

- [Marketメニューが遅すぎだからトグルできるようにしようぜのPullRequest](https://github.com/circa75/dropplets/pull/271)

さっさとMasterにPullしてほしいところだが、内容を見ると変更箇所が少ない感じだったのでもう手でパッチした。実に快適。
DroppletsをNginxでサブフォルダで動かす

- hardwired
- hard_wired
- 2013/11/15
- Nginx 
- published

シンプルかつMarkdownで書けるBlogプラットフォームとして[Roon.io](https://roon.io/) がかなり気になっていたのだが、手軽に似たような感じがかもし出せるシンプルなアプリ[Dropplets](http://dropplets.com/)を発見。喜び勇んでインストールするも、Nginxで動かす際に軽くハマったので備忘。

検索すると以下の様な設定項目が引っかかる。

    location / {
        try_files $uri $uri/ /index.php?filename=$uri;
    }
    
が、これはルートフォルダで動作させる場合の設定。ここのようにサブフォルダで動かす際は以下のようにする必要がある。（locationディレクティブを増やす）

    location / {
        try_files $uri $uri/ /index.php?filename=$uri;
    }
    location /dropplets {
        try_files $uri $uri/ /dropplets/index.php?filename=$uri;
    }
    
これでポスト詳細をクリックしても404ではなくちゃんと内容が表示される。
「回文の発掘」をErlangで(横へな15参考)

「[回文の発掘](http://nabetani.sakura.ne.jp/hena/ord15subpalin/)」をErlangでやってみました。他の実装は [第15回オフラインリアルタイムどう書くの参考問題](http://qiita.com/Nabetani/items/0b56395d4c9e7c64b230) から辿れます。

```erlang:subpalin.erl
-module(subpalin).
-compile(export_all).

%% 解く
solve(Data) -> integer_to_list(palinnum(Data)).

%% 回文の最大長を返す
palinnum([]) -> 0;
palinnum(L) -> lists:max([palinnum2(S) || S <- tailcombi(L)]).

palinnum2([]) -> 0;
palinnum2([H | T]) ->
  F = fun % 先頭と同じ文字を探し、その間に含まれる回文の最大長を返す関数
    ([H2 | T2]) when H2 =:= H -> palinnum(lists:reverse(T2)) + 1;
    (_) -> 0
  end,
  lists:max([0 | [F(X) || X <- tailcombi(lists:reverse(T))]]) + 1.

%% "abc" -> ["abc", "bc", "c"]
tailcombi(L) -> tailcombi(L, []).

tailcombi([], Acc) -> lists:reverse(Acc);
tailcombi(L = [_ | T], Acc) -> tailcombi(T, [L | Acc]).

%% テスト
test(Data, Expected) ->
  Result = solve(Data),
  OkNg = case Result =:= Expected of true -> ok; false -> ng end,
  io:fwrite("~s: ~s -> ~s~n", [OkNg, Data, Result]).

tests() ->
  test("I_believe_you_can_solve", "9"), %0
  test("a", "1"), %1
  test("aa", "2"), %2
  test("aaa", "3"), %3
  test("ab", "1"), %4
  test("aabb", "2"), %5
  test("ABBA", "4"), %6
  test("Abba", "2"), %7
  test("1234567890", "1"), %8
  test("1234567890987654321", "19"), %9
  test("abcdcba", "7"), %10
  test("0a1b2c3d4c5b6a7", "7"), %11
  test("abcdcba0123210", "7"), %12
  test("abcdcba_123210", "7"), %13
  test("_bcdcba0123210", "7"), %14
  test("abcddcba0123210", "8"), %15
  test("abcdcba01233210", "8"), %16
  test("a0bc1dc2ba3210a", "9"), %17
  test("a0bc1ddc2ba3210", "8"), %18
  test("3a0bc1ddc2ba3210", "10"), %19
  test("11oooo1111o1oo1o111ooooooooooo", "20"), %20
  test("11o1111o1111oo11ooo11111ooo1oo", "20"), %21
  test("111111oo11o111ooo1o1ooo11ooo1o", "21"), %22
  test("11o1o1o11oo11o11oo111o1o1o11oo", "27"), %23
  test("oo111o1o11o1oo1ooo11o1o11o1o1o", "27"), %24
  test("1o1oo11111o1o1oo1o1o1111oo1o1o", "28"), %25
  test("QQooooQooooQQyQoyQQQyyyyQQoyoy", "15"), %26
  test("oQoooQooooQyoyQoyoyyyQQyQQQQoQ", "16"), %27
  test("yyyyyooyQyyyoyyQyyooyQoQoQQoQy", "17"), %28
  test("yyQoyQoyyQyQQoyooooyyQQyQyooQy", "24"), %29
  test("oQQooQoQyQQoyoQQoQyQyQyQoQoooo", "24"), %30
  test("oQQyQQyyQyQQoooyQQyyyQQQyyQQoy", "25"), %31
  test("WAk9iHI4jVDlStyudwTNqE138kwan2", "3"), %32
  test("c43fIu1Mlz0K9hEVOgGcUdbeB5ksa7", "3"), %33
  test("CAbYcW5VqHjzFdIkH_61PM0TsyRuie", "3"), %34
  test("jInQnUvSayrJTsQWujovbbqW0STvoj", "10"), %35
  test("iZDrvpUKgtj3FrZsZ4CLjrEgUdZzQG", "11"), %36
  test("ROgYUOu6er_DA7nB6UGquO1GUHC62R", "11"), %37
  test("Oh_be_a_fine_girl_kiss_me", "9"), %38
  test("8086_6502_6809_Z80", "11"), %39
  test("xcode_visualstudio_eclipse", "11"), %40
  test("word_excel_powerpoint_outlook", "9"), %41
  test("abcdefghijklmnopqrstuvwxyz0123", "1"). %42
```
Git Submoduleでgitプロトコルが使えない時の対処法


1. まずは```git submodule update```でとってきて失敗する
1. おそらくgitプロトコルが使えない場合がほとんどなので.gitmodulesをテキストエディタで開く
1. urlを直接編集してgitプロトコルをhttpsに変更する

自動で切り替えてくれるシステムでもあるのかと思っていたけど、意外とないんですね

# 追記
なんで切り替えシステムがないの？とgithubの勉強会で知り合った[Matthewさん](https://github.com/matthewmccullough github)に聞いてみたところ
「gitプロトコルのほうが早いのは事実だ。でもhttpsで通信しても殆ど差がなくなってきてるからhttpsがおすすめだね。特にdotfilesのようないろんな環境で通信しなきゃいけないような状況だとhttpsがお勧めさ。」
といってくださいました。

また、「subtree mergeなんて手法もあるよ〜」と教えてくださったので、機会があれば試そうと思います。
MySQLでINNER JOINして検索すると便利だなって話



studentsテーブルに
id, nameというアトリビュート（カラム）があったとして

student_scoresテーブルに
id, student_id, math, english, chemistry
アトリビュート（カラム）があったとする

```sql
select name, math, english, chemistry from student_scores inner join students on student_scores.student_id=students.id where math = 100 && english = 100 && chemistry =100;
```

これで、生徒テーブルと点数テーブルをひもづけて
全科目１００点の生徒の名前を特定できる


ここを参考にした
http://www.pursue.ne.jp/jouhousyo/SQLDoc/select22.html
JenkinsでAndroidでRobotiumで別ノード

Androidアプリの画面遷移とか簡単な操作を自動でやって、基本動作確認を楽にしよう！
という目論みで[Robotium](https://code.google.com/p/robotium/)でテストを書いて、Jenkinsで実行しようとしたら色々とはまったのでメモ。

# 前提

- JenkinsサーバーはローカルWindowsPC(x64)上にWindowsサービスとして構築
- マトリクスでOS4.0.3と4.2のエミュレーターでテストする
- そして何より俺はJenkins初心者だ！

基本的には、
**JenkinsにAndroidアプリのテスト環境を構築する** [その１](http://qiita.com/checkela/items/4b7d5e0bfa667e65eb49) [その2](http://qiita.com/checkela/items/366734f7e893ea6d0ab4)
を参考に初心者てきにJenkinsを構築しています。

# はまりポイントと作業の流れ

- エミュレーターがNo WindowだとRobotiumが実行出来ないよ！
- Windowありにしたら自PCだと邪魔だから別PCにSlave置いたよ！
- マトリクスが全部Slaveで実行できないよ！

# はまりポイントの説明

## エミュレーターがNo WindowだとRobotiumが実行出来ないよ！

Robotiumで書いたテストをNo Windowなエミュレーターでテストすると、

```
junit.framework.AssertionFailedError: Click can not be completed!
	at junit.framework.Assert.fail(Assert.java:50)
	at junit.framework.Assert.assertTrue(Assert.java:20)
	at com.jayway.android.robotium.solo.Clicker.clickOnScreen(Clicker.java:99)
	at com.jayway.android.robotium.solo.Clicker.clickOnScreen(Clicker.java:182)
	at com.jayway.android.robotium.solo.Clicker.clickOnText(Clicker.java:366)
	at com.jayway.android.robotium.solo.Solo.clickOnText(Solo.java:1028)
```

などと言ってテストがこけました。
最初、実機でテストしたりeclipse+エミュレーターでは上手く行くので困っていたんだけど、
RobotiumのGogoleGroupに以下の投稿が。

Robotium on Linux without video
https://groups.google.com/forum/#!topic/robotium-developers/5WR7IOiAVzM

Windowシステム入ってないLinux上での問題だと思うんだけど、多分これっぽいと思って
「Show emulator window」にチェックを入れて実行したところ無事テストが通るようになりました。

![window.png](https://qiita-image-store.s3.amazonaws.com/0/20435/5d2e0d35-9369-c0a4-4120-be24c0bb0d23.png)

これはUI操作を行うツールだと共通の問題かもしれないです。
（他のツールでJenkins構築したことはないので分からない）

<b>追記</b>
よくよく思い出してみたらこの手順には続きがありました。
WindowsサービスでJenkinsを実行している場合、Windowありのエミュレーターを直接起動できないので、チェックを入れたとしても実行時にエミュレーターの画面が表示されません。

このため、このときの手順としては、まずは同一PC上にSlaveを配置し、Window表示設定にチェックを入れて実行したところ、上手く行くようになりました。

## Windowありにしたら自PCだと邪魔だから別PCにSlave置いたよ！

無事にテストが通るようになりましたが、Windowありにしたことによって自動ビルドが走る度にエミュレーター画面が表示されるはめに。。
と言うわけで、ノードに別PCのSlaveを設定することにしました。

SlaveはLAN内の別PCに置くことにして、ちょこっとググってJNLPエージェント経由で接続できるようにしました。
この辺りの設定は詳しくない！

Jenkinsのプロジェクト設定で、
「プロジェクトの高度な設定 -> 実行するノードを制限」で作成したノードを設定したところ、
Slaveを配置したPC上でエミュレーターが起動してテストしているのが確認できました。

## マトリクスが全部Slave上で実行できないよ！

無事、自動UIテストが別PC上で実行されるようになったので、マトリクスで4.0.3と4.2のエミュレーターでテストするように設定を行いました。
これが出来ればかなり効率化できるぜしめしめと思っていた矢先、
Jenkinsのコンソール出力を眺めていたら、Slaveで実行されているのが1つのビルドだけだったことに気づきました。

```
上流プロジェクト"xxxx"の#5が実行　
元の原因: 
 ユーザーxxxxが実行
masterでビルドします。 ワークスペース:xxxx
```
masterでビルドされてる。。

Jenkinsの設定やconfig.xmlを眺めても他にそれらしい設定とかゴミ設定みたいなものはなくて困っていたところ、、
[JenkinsでiOSのビルドを行う時にハマるポイントとその解決法・](http://qiita.com/mokemokechicken/items/0e75cf8866d4943147f6)
の、[罠：マルチ構成プロジェクトで実行するノードを制限する](http://qiita.com/mokemokechicken/items/0e75cf8866d4943147f6#3-2)に行き当たりました。

こちらに従って、

>NodeLabel Parameter Plugin
>https://wiki.jenkins-ci.org/display/JENKINS/NodeLabel+Parameter+Plugin
>というものを使うと、「ビルドのパラメータ化」という項目が増え、そこにチェックを入れ、
>「パラメータの追加」→「Label」 を選択し、
>
>Name: LabelSelect
>Default Value: <制限したいノードのLabel> など

と言うやつを設定したところ、ようやく複数のビルドがSlaveで実行できるようになりました。


Jenkinsはもう少しちゃんと使いたいので、書籍を読んで出直そうと思ってます。
MySQLで生徒の中から自分の好みのスタイルの子を探す方法（メモ）



これでボンキュッボン（死語）な子のリストができる訳です

```sql

select id, family_name, first_name, B ,W ,H from students where B >= 80 && W <= 65 && 65 <= H <= 80;

```

比較演算子は試してない（h(ヒップ)の比較演算が正常に動くかは不明）

ユーザーのidから名前を特定してデバッグしたりするときに使ったり


追記

```sql

select id, family_name, first_name, B ,W ,H from students where B >= 80 && W <= 65 && H between 65 and 80;

```

という風に
where [attribute] between [A] and [B]
を使用すると可読性高くなりますね

kuchikiosさんありがとうございました！
Linuxでipアドレスが重複した時のメッセージ

`dmesg`と`/var/log/messages`に以下メッセージが出ます。

```bash:
[   75.816550] e1000: eth0: e1000_watchdog: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
[   75.817003] ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[   76.800009] eth0: duplicate address detected!
```
VisualStudioでPowershellをコンソールとして使う

Visual Studioの2012以降(2010では拡張機能として提供されている)からはExpress Editionを含む製品にNuGet Package Manager コンソールが搭載されている．これは，コンソールからパッケージを管理するためのものなのだが，Powershellコンソールの代替として利用が可能なので，コンソールからちょこっとコマンドをいじりたいときにも使える．意外に重宝するかも．

----
Powershellへの移行がはかどりますね
接続文字列を簡単に作る方法

データベースに接続する際に接続文字列が必要になる．これが意外に面倒で，タイムアウトの時間や認証情報，RDBMS毎のドライバが毎度違うので調べるのに手間がかかる．

そこで，よい方法を見つけたので覚書きがてら書いておく

step1:
    任意の名前のテキストファイルを用意する
step2: 
    ファイルの拡張子を*.udlに変更する
step3:
    ファイルをダブルクリックすると，データリンクプロパティのダイアログが出てくるので，必要な情報をセットして接続が成功するのを確認する
step4:
    テキストエディタにファイルを放り込んで，コピー＆ペースト

とっても簡単ですね
Passengerモジュールのパスを知る方法

本当は passenger-config コマンドあたりで教えてほしいところですが…

```shell-session
ruby -rphusion_passenger -e 'PhusionPassenger.locate_directories; puts PhusionPassenger.apache2_module_path'
```
もしくは少し短かくして

```shell-session
ruby -rphusion_passenger -e 'p=PhusionPassenger; p.locate_directories; puts p.apache2_module_path'
```
rbenv などで複数の ruby を使われてる場合は、 間違った ruby で実行しないよう気をつけてください。

追記: passenger-install-apache2-moduleで分かるようです

```shell-session
$ passenger-install-apache2-module --snippet
LoadModule passenger_module /usr/local/rbenv/versions/1.9.3-p448/lib/ruby/gems/1.9.1/gems/passenger-4.0.24/buildout/apache2/mod_passenger.so
PassengerRoot /usr/local/rbenv/versions/1.9.3-p448/lib/ruby/gems/1.9.1/gems/passenger-4.0.24
PassengerDefaultRuby /usr/local/rbenv/versions/1.9.3-p448/bin/ruby
```
環境変数PATHを共通化する。

Windowsで環境変数PATHを設定するのってすごく面倒なので、
VimとPowerShellとBatファイル、それぞれ共通のファイルを
読み込んでPATHを設定しようと思いました。

で、以下のコードを`.vimrc`や`Microsoft.PowerShell_profile.ps1`に書けばOK。
共通のファイルは1行ごとにPATHが書かれています。

__Bat ファイル__

```bat:
@echo off
setlocal enabledelayedexpansion
set PATH=
FOR /F %%i in (%HOME%\example.pathrc) do @set PATH=%%i;!PATH!
echo %PATH%
endlocal
```

__Vim script__

```vim:
if filereadable(expand('~/example.pathrc'))
  let $path = join(readfile(expand('~/example.pathrc')),';')
endif
echo $path
```

__PowerShell script__

```ps1:
if(test-path "$env:HOME\example.pathrc"){
  $env:path = [string]::join(';',(get-content "$env:HOME\example.pathrc"))
}
write-host $env:path
```
「第15回オフラインリアルタイムどう書くの問題」をPHPで解く

http://qiita.com/Nabetani/items/cba03c96d1ea55f6e861
http://nabetani.sakura.ne.jp/hena/ord15elebubo/

異星の電光掲示板。
解き方自体は前やった[エントロピー符号](http://qiita.com/rana_kualu/items/af8ab740a07d666f1f4c)と同じです。
しかし今回は、単純に「00」を詰めると「110111101110」みたいな一意にならない値が出てしまうので注意が必要です。
と思ったけど別に注意するようなことは全くなかった。

```php
<?php
	class ELEBUBO{
		
		/**
		* 異星の電光掲示板
		* @param String 「2ed8aeed/34b0ea5b」みたいな文字列
		* @return String 「LTRSUNTSJ」みたいな文字列
		*/
		public function get($input){
			// 入力を2進数に
			$input =explode('/', $input);
			$upper = sprintf('%032s', base_convert($input[0], 16, 2));
			$under = sprintf('%032s', base_convert($input[1], 16, 2));
			// 一列にする
			$string = '';
			for($key=0;$key<strlen($upper); $key++){
				$string .= $upper[$key] . $under[$key];
			}
			// 置換
			$search = ['00', '101110', '110111', '111011', '011110', '101101', '1101', '1110', '0111'];
			$replace = ['', 'T', 'U', 'N', 'S', 'Z', 'L', 'R', 'J'];
			$ret = '';
			do{
				foreach($search as $key=>$val){
					if(strpos($string, $val) === 0){
						$string = substr($string, strlen($val));
						$ret .= $replace[$key];
						continue 2;
					}
				}
			}while(strlen($string));
			
			return $ret;
		}
		
	}
	
	// 以下はテスト
	$test = [
		['2ed8aeed/34b0ea5b', 'LTRSUNTSJ'],
		['00000200/00000300', 'L'],
		['00018000/00010000', 'R'],
		['00002000/00006000', 'J'],
		['00000700/00000200', 'T'],
		['01400000/01c00000', 'U'],
		['00003800/00002800', 'N'],
		['000c0000/00180000', 'S'],
		['00003000/00001800', 'Z'],
		['132eae6c/1a64eac6', 'LRJTUNSZ'],
		['637572d0/36572698', 'ZSNUTJRL'],
		['baddb607/d66b6c05', 'LTJZTSSSN'],
		['db74cd75/6dac6b57', 'ZZZTJZRJNU'],
		['3606c2e8/1b0d8358', 'ZZSSLTJ'],
		['ad98c306/e6cc6183', 'UZZZZZZ'],
		['4a4aaee3/db6eeaa6', 'JJLLUUNNS'],
		['ecd9bbb6/598cd124', 'TSSZZTTRR'],
		['e0000002/40000003', 'TL'],
		['a0000007/e0000005', 'UN'],
		['c0000003/80000006', 'RS'],
		['40000006/c0000003', 'JZ'],
		['01da94db/00b3b6b2', 'TSUJLRSR'],
		['76eeaaea/24aaeeae', 'TRNNUUNU'],
		['1dacaeee/1566e444', 'NRJZUTTT'],
		['26c9ac60/6c6d66c0', 'JSZLRJZS'],
		['6c977620/36da5360', 'ZZLLTNZJ'],
		['069aeae6/0db34eac', 'SJSLTUNS'],
		['06d53724/049da56c', 'RRULRNJJ'],
		['069b58b0/04d66da0', 'RLRSLZJR'],
		['1b6eced4/11b46a9c', 'RZZTZNRU'],
		['522e8b80/db6ad900', 'JLLJNLJT'],
		['6546cdd0/376c6898', 'ZULSZRTL'],
		['4e6d5b70/6ad9d620', 'LNSSURST'],
		['37367772/65635256', 'SNSZNTNJ'],
		['25535d58/377669cc', 'LUUSLTUZ'],
		['0ae6a55d/0eacedcb', 'UNSUJUTJ'],
		['76762edc/23536a88', 'TZNZJNRT'],
		/**/
	];

	$elebubo = new ELEBUBO();
	foreach($test as $key=>$data){
		$answer = $elebubo->get($data[0]);
		if($answer !== $data[1]){
			print('えらー');
		}
	}
```

うーん置換のあたりが微妙。
preg_replace()とかでまとめてできないかと思ったけど無理だった。
かかった時間は45分くらい。

ところでBUBOって何ですかね。
fugitiveの:Gblameで更に過去にさかのぼる方法

`:Gblame` で `git-blame` の結果を表示できますが、ある行が変更されるその前の状態を表示したい場合は、その行にカーソルを移動させて `~` を押します。すると、その行を変更したcommitのsha1が012345だったとすると、 `git blame 012345^ -- file` を実行したような結果がvimdiffで表示されます。

ちなみに `~` は `[count]` を受け取るので `3~` は `git blame 012345^^^ - file` になります。また `-` は `git blame 012345 -- file` です。便利

### tips: 空白差分だけの変更を無視する

そもそも `~` が必要になる場面というのは、blameで得られた差分がインデントの変更みたいな、実質中身のない変更の場合のことも多いです。 `git-blame` は `-w` オプションでそういった空白のみの変更を無視してくれるので便利です。 `:Gblame w` で同様になります。 `:Gblame` を使うときはとりあえず `w` フラグを渡しとくといいかも知れません。

他のフラグや使い方については `:help fugitive-:Gblame` を参照してください。
delegateでモーダル画面間の値の受け渡し

いろいろなHPを参考にしても、なかなかうまくいかなかったコレ。
わかりやすく解説したいと思います！

#前提
・値をうけとるViewController -> もらう.h, もらう.m
・渡す値をつくるViewController -> つくる.h, つくる.m
・もしStoryboardをつかうなら、ViewControllerのひもづけをしておく

#つくる.hでdelegateの宣言

```objc

@protocol つくるDelegate;

@interface つくる: UIViewController{
//もともとあるやつ
}

@property (weak, nonatomic) id<つくるDelegate> delegate;

// イニシャライザ
- (id)init;

//「おくる」側で値をセットするための関数
-(void)セット;

@end //これももともとある

@protocol つくるDelegate <NSObject>

// 「もらう」で呼び出すためのメソッド「おくる」、ここでは送る値はNSString
- (void)おくる:(NSString*)str;
@end

```

#つくる.mでイニシャライズ＆値をセット

```objc

- (id)init
{
    if (self = [super init]) {
        // 初期処理
    }
    return self;
}

- (void)せっと {
 NSString *str = @"おくる値だよー";
    [self.delegate おくる:str];
}   

 ``` 
  を書き加えておきます。
この「せっと」はあるボタンを押したときのイベントにすることも可能です。
そこのあたりは適宜書き換えてみてください。ヘッダーもあわせるのを忘れずに。

#もらう.hでインクルード、デリゲートを追加

```objc
//#importがあるところに追加
#import "つくる.h"

@interface もらう : UIViewController<つくるDelegate>{
//もともとあるところに<>で追加！
}
```

#もらう.mにおくるメソッドと、つくる.mにうつるためのメソッドを追加
うつるためのメソッドは、Storyboardをつかう場合とそうでない場合の2通りあります！

```objc
- (void)おくる:(NSString*)str
{
 //受け取った値をlogに表示
  NSLog(@"%@", str);
   //「つくる」を閉じる
    [self dismissViewControllerAnimated:YES completion:NULL];
}

//Storyboardをつかわない編
 -(void)いどう{
// 遷移先の「つくる」のインスタンスを取得
    つくる *つくる = [[つくる alloc] init];
    つくる.delegate = self;
    [self presentViewController:つくる animated:YES completion:nil];

}

 //Storyboadをつかう編
- (void)いどう:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"つくるをひらく"]) {
//ここは、Storyboardで設定しなければいけないところ。
//ModalでViewController同士をつないで、そのModalの●を選んで、
//IDに「つくるをひらく」と入れた場合です。       

        つくる *つくる = segue.destinationViewController;
        つくる.delegate = self;   
    }
}
```
この移動のところがわりとみそかなって思っています。

いかがでしょうか。日本語の部分を適宜おきかえてくださいね。
誤りなどあれば訂正コメントください！
も、もしかしてiOSの投稿1000個目…！？
プログラミング始めました一日目


#include <iostream>
using namespace std;

int main() {
	int x;
	int y;

	cout << "整数値　x： ";
	cin >> x;
	y = x;

	for(int i = 2; i < x-1; i ++){
		//cout << "x/" << i <<" = " << i << "×" <<(x/i) << " + " << x%i << ";\n";
		if((x % i) < y){
			y = x%i;
		}
	}
	if(!(y == 0)){
		cout << x << "は素数です。YATTA!\n";
	}else{
		cout << x << "は素数じゃねえよ！ふざけんな！\n";
	}

	return 0;
}
vagrant-berkshelfでRictyフォントを自動生成する


プログラミング/開発に適したRictyフォントを自動生成するvagrant環境を作ってみました。  
そのまま使うと、生成するRictyフォントは、私の好みで「全角スペースを可視化しない(-z)」オプションがついています。
全角スペースを可視化したい場合は、後述の使い方欄を参考にしてください。

Rictyについては[こちら](http://save.sys.t.u-tokyo.ac.jp/~yusa/fonts/ricty.html)を参考にしてください。

## 前準備

- VirtualBoxのインストール

  - [ダウンロードサイト](https://www.virtualbox.org/wiki/Downloads)

- Vagrantのインストール

  - [ダウンロードサイト](http://downloads.vagrantup.com/)

- vagrant-berkshelfとvagrant-omnibusプラグインのインストール

  - 必要プラグインがないときは、vagrantセットアップ後、下記実行でインストール。

```
$ vagrant plugin install vagrant-berkshelf
$ vagrant plugin install vagrant-omnibus
```


## 使い方

- 下記コマンド実行で、VM起動～カレントディレクトリにRictyフォントを生成するところまで自動で行います。

```
$ mkdir ricty
$ cd ricty
$ git clone https://github.com/tarVolcano/vagrant-berks_ricty.git .
$ vagrant up
```

- 全角スペースを可視化する場合は、Vagrantfile内のrun_listで"ricty::non-display_em-space"の箇所を"ricty::default"に変更してから実行してください。

```ruby:Vagrantfile
    :
  config.vm.provision :chef_solo do |chef|
    chef.run_list = [
      "fix_resolv_conf",
      "ricty::default"                   # この行を追加して
      # "ricty::non-display_em-space"    # この行をコメントアウトする
    ]
  end
    :
```

## 環境

- Vagrant 1.3.5

- Virtualbox (ホスト：WinXP = 4.2.18 / MacOS X 10.9 = 4.3.2)


## 実行により作成されるゲスト環境について

- ゲストOS:CentOS 6.4

- vmメモリ:256MB

- hostname:create-ricty-vm

- vagrantBox名:centos-6.4

  - 上のboxがなければ、[ここ](http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130731.box)から自動ダウンロードします。
さくらVPS(CentOS 6.4)とGitHubを繋ぐ （さくらVPSからGitHubにデータをPush）  ( Webサーバー構築四苦八苦 5th Day, GitHub 編 )

# まずはGitHub側の設定

## リポジトリを作成

作成すると、リポジトリのページ内に、リポジトリのクローンURLが表示されます。
例: git@github.com:{hostname}/{project_name}.git #これあとで使います。

# 鍵

## サーバーでの鍵作成

```shell-session:/home/{hostname}/.ssh
$ ssh-keygen -r rsa
 # デフォルトの名前(id_rsa, id_rsa.pub)名前で作るといいです。そうじゃないと、git/configとかに鍵ファイルの指定が必要になります。

$ pbcopy < id_rsa.pub # 公開鍵の中身をコピーしておきます。
```

## GitHubでの鍵の設定

GitHub Webページの「User settings」「SSH Key」へ。
「Add SSH key」に進んでクリップボートにコピーした公開鍵を貼り付けます。


## 確認

サーバーに戻って作業します。
鍵の設定がうまくいっているか確認します

```shell-session
$ ssh -l git -i ~/.ssh/id_rsa github.com 
The authenticity of host 'github.com (192.30.252.130)' can't be established.
RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.252.130' (RSA) to the list of known hosts.
PTY allocation request failed on channel 0
Hi su3! You've successfully authenticated, but GitHub does not provide shell access.
                                                                                    Connection to github.com closed.
```

# Gitを使います

```pl
$ cd {project_name}
$ git init          # 初期化
$ touch README.md    

# .gitignoreに.DS_Store,database.ymlを追加
$ vim .gitignore     # Githubに上げたくないものを指定します。

## ファイルをコミット
$ git add .         # まずは全ファイルをあげます。
$ git commit -m "initial commit"         #コメントは適切なものを

## リモートのリポジトリを追加
$ git remote add origin git@github.com:{account_name}/{project_name}.git     # リモートリポジトリを追加
$ git remote    # 追加されたリモートリポジトリを確認
$ git push origin master     # データを送信します
````
catでヒアドキュメントなど

## catでファイルに書き込む

```sh:Terminal
$ cat <<'EOB' > file.txt
> aaa
> bbb
> ccc
> EOB
$ cat file.txt
aaa
bbb
ccc
```

単なるヒアドキュメントです。

## tmuxやscreenでコピーしたものをクリップボードにコピーする

```sh:Terminal
$ cat <<'EOB' | pbcopy
> (C-a ]とかする)
> EOB
```

別の方法考えた方が良いのでは……と思いつつ、面倒なのでこのままだったり。
Ubuntuなどの場合は`pbcopy`が無いので`xsel`とか使うと似たようなことが出来ると思います。
nginxで"client intended to send too large body"が発生した時の対策方法

nginx が稼働しているWebページで、フォームからファイルをアップロードしようとしたら、
 **"1 client intended to send too large body: 1367171 bytes"** というエラーが発生しました。

これは、nginx が POST の最大サイズを超えるデータが送られてきた場合に発生するエラーのようです。

http://wiki.nginx.org/HttpCoreModule#client_max_body_size
によると、nginx ではデフォルトで1MBまでのデータしか受け付けないようです。

nginx が1MBより大きなデータを受け取れるようにするには、nginx.conf で `client_max_body_size` ディレクティブを設定します。

`client_max_body_size` は `http`, `server`, `location`コンテキスト内で使用できます。

```nginx:nginx.conf
http {
    client_max_body_size 1048576; # default 1m

    server {
        client_max_body_size 100m;
        
        location ~ ^/upload/ {
            client_max_body_size 2g;
        }
    }
}
```
git ssh公開鍵認証が通すときのメモ


いつも忘れるんでメモっとく。

gitのホストが複数あったりして、
公開鍵の指定ディレクトリに入れたいのだけどってときに使える。


## 用意するもの
・ git コマンドライン
・ gitのホスト（以下 fugahoge.com）


## 公開鍵の作成

``` bash:command

# .sshへ移動
$ cd ~/.ssh/

# ドメイン名のフォルダ作成、移動 （ここに鍵を入れる）
$ mkdir fugahoge
$ cd fugahoge

# 確認
$ pwd
/Users/[USERNAME]/.ssh/fugahoge


# 鍵作成
$ ssh-keygen -t rsa -C "fugahoge.com"

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/[USERNAME]/.ssh/id_rsa): /Users/[USERNAME]/.ssh/fugahoge  # ←ここフルパスで書くこと ~/.ssh/だといかなかったかも？
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in fugahoge
Your public key has been saved in fugahoge.pub
The key fingerprint is:
XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX fugahoge
The key's randomart image is:'

# 鍵のアクセス権を600にしとく
chmod 600 ./


# コンフィグに接続先の設定をしとく
vim ~/.ssh/config

## 追加しとく
Host fugahoge.com
    HostName fugahoge.com
    Port 22
    User XX
    IdentityFile ~/.ssh/fugahoge 
```

## サーバ側に公開鍵を設置する（ここは割愛）
今回のディレクトリ例だと以下ディレクトリにできてるのでサーバのauthorized_keysに入れるか、
サービスならssh登録のとこに打ち込めばいいと思います。
/Users/[USERNAME]/.ssh/fugahoge.pub



## 接続

```bash:command

# ssh接続の確認
$ ssh fugahoge.com

# ssh認証通ったけどバックログではシェルにアクセス出来ません云々言われる
"Hi Name! You've successfully authenticated, but Backlog does not provide shell access." 

# 素直にgit clone
$ git clone XX@fugahoge.com:/path/to.git

"Cloning into 'リポジトリ名'…"
Checking connectivity... done

```

###余談

以前バックログとかBitBucketのメンテナンス時間と案件が切羽つまってる時がかぶったことがあって、
それからは自鯖にGitを設置するようにした。

メンテ時間に待ったは効かないと思うので（提供会社のある国の深夜帯に更新とか多いみたい）、
出来たら自鯖Gitを主体に下のような感じで構築できたらなって思います。

自鯖Git → post-receive PUSH → バックログ、Gitサービス

出来たら記事書きます。
SourceColon の実行が UnknownHostException で止まったときの対処

http://watermint.github.io/SourceColon/

gradlew が UnknownHostException で止まる。 

```
org.watermint.sourcecolon.org.opensolaris.opengrok.configuration.RuntimeEnvironmentTest > testConfigListenerThread                                             FAILED
    java.net.UnknownHostException at RuntimeEnvironmentTest.java:210
        Caused by: java.net.UnknownHostException at RuntimeEnvironmentTest.java:210
```
`hostname` で表示されるホスト名が解決できていなかったので /etc/hosts に追加。
Heredoc


This gives an error because there are spaces in front of terminating END


```ruby:erb1.rb
class Poem1
  def initialize
    @text = <<END
"Faith" is a fine invention
When Gentlemen can see
But Microscopes are prudent
           In an Emergency.
(Emily Dickinson 1830-1886)
    END
  end
  def recite
    puts @text
  end
end

poem1 = Poem1.new
poem1.recite
```

```terminal
➜  erb  ruby erb1.rb
erb1.rb:17: can't find string "END" anywhere before EOF
erb1.rb:3: syntax error, unexpected end-of-input, expecting tSTRING_CONTENT or tSTRING_DBEG or tSTRING_DVAR or tSTRING_END
```

In order to fix this problem, add - in front of starting END, like <<-END.

```ruby:erb2.rb
class Poem1
  def initialize
    @text = <<-END
"Faith" is a fine invention
When Gentlemen can see
But Microscopes are prudent
           In an Emergency.
(Emily Dickinson 1830-1886)
    END
  end
  def recite
    puts @text
  end
end

poem1 = Poem1.new
poem1.recite
```

```terminal
➜  erb  ruby erb2.rb
"Faith" is a fine invention
When Gentlemen can see
But Microscopes are prudent
           In an Emergency.
(Emily Dickinson 1830-1886)
```
オレオレ.gitconfig

自身の.gitconfigに書いているエイリアスに関して。

## Mercurial互換っぽいコマンド

昔、Mercurialから移行する際に、いきなりGitのサブコマンドを覚えるのがつらかったので、Mercurialっぽいエイリアスを書いたりしました。今はあまり使ってないですが、残っています。

```
[alias]
  backout = revert
  up = checkout
  update = checkout
  branches = branch -a
  forget = rm -r --cached
  rollback = reset --soft
  sum = show
  summary = show
  tags = tag
```

……branchesとtagsは未だに使ってるかも。

## オレオレエイリアス

単純なエイリアスたち。単純だけども多様してます。

```
[alias]
  cdi = diff --cached
  cdif = diff --cached
  cdiff = diff --cached
  ci = commit -v
  co = checkout
  cp = cherry-pick
  di = diff
  dif = diff
  sdi = diff --staged
  sdif = diff --staged
  sdiff = diff --staged
  st = status --branch --short
```

ステージングしたファイルを取り消すには……`git reset HEAD -- ファイル名`だ！なんて覚えてられないので以下を書いたりとか。

```
[alias]
  unstage = reset HEAD --
```

いい感じのコミットグラフをカラフルに表示してくれるやつ。

```
[alias]
  sl = log --all --branches --decorate --graph --oneline
```

同じコミットメッセージで、ファイルを追加してコミットし直すやつ。

```
[alias]
  amend = commit -a --amend --reuse-message=HEAD
```
Vim + tmux + Slimuxでインタラクティブなコーディング

# Vim + tmux + pry / R
rubyとRを統合しながら開発しているので、分析時に使っているRStudio的な開発をVimとtmuxでやりたい！と思ったので設定しました。

# + Slimux

今までは[jpalardy/vim-slime](https://github.com/jpalardy/vim-slime)を使っていたんですが、RStudioみたいに行単位で送りたいなー、と思って探していたら[epeli/slimux](https://github.com/epeli/slimux)に行き当たりました。（設定次第でvim-slimeでも出来るのかもしれませんが…）

vim-slimeよりもconfigurableな感じで使いやすいです。

[#409 - asciinema](http://asciinema.org/a/409)

```vim
NeoBundle 'epeli/slimux'

map <C-c><C-c> :SlimuxREPLSendLine<CR>j
vmap <C-c><C-c> :SlimuxREPLSendSelection<CR>
```

標準の設定では`map ...<CR>`ですが、僕は最後に`j`を付けてます。これでCtrl押しながらc連打で各行をtmuxの画面に送れます。RStudioで`cmd+enter`してるのと同じ感じですね。 -> 追記：初回設定時に毎回`j`が効いて鬱陶しいので回避方法募集中です。

`v}<C-c><C-c>`してやれば複数領域の実行も出来るので良いですね！
体感としてはRStudioで実行するよりも軽量なので気に入りました。

バッファ単位で送り先のtmux panelも変えられるので、僕はtmuxを縦に二分割して片方をpry、もう片方にRを起動してgvimから`Ctrl+c`しながらコーディングしてます。
特にRはデータを直接確認しながら作業をすることが多いので、いちいちRStudioに画面を切り替えることなくvimから全て実行できる環境は快適です。

作者に感謝！
[Slimux - tmux Plugin for Vim - Esa-Matti Suuronen](http://esa-matti.suuronen.org/blog/2012/04/19/slimux-tmux-plugin-for-vim/)

## 余談
僕はgvimをサブモニタに表示しながら使ってるんですが、
一般的にはtmuxのpanelを分割して使うものなんでしょうか。

何にせよvim, tmux, pryの組み合わせは便利です。
言葉だと余り便利さが伝わりにくいですが、僕は以下の動画を見て「使いたい！」と思いました。
[Velvet Pulse » Improve Your Ruby Workflow by Integrating vim/tmux/pry](http://velvetpulse.com/2012/11/19/improve-your-ruby-workflow-by-integrating-vim-tmux-pry/)
こっちもいい感じです。
[▶ LA Ruby Conf 2013 - Impressive Ruby Productivity with Vim and Tmux by Chris Hunt - YouTube](http://www.youtube.com/watch?v=vHdiXoHKSgU)
link_to_ifにブロック渡した時の挙動が欲しいのと違う

ので、

```application_helper.rb
module ApplicationHelper
  def link_to_if_with_block(condition, options = nil, html_options = nil, &block)
    if condition
      link_to(options, html_options, &block)
    else
      capture(&block)
    end
  end
end
```

ッテの書いた。

```hoge.html.haml
= link_to_if_with_block user_signed_in? user_path(current_user) do
  .image
    = user.image
  .name
    = user.name
```

こんな風に書ける。
Homebrew コマンドが優先的に実行されるようにデフォルトパスに/usr/local/binを追加する

OS X で Homebrew を利用している場合に、`/usr/local/bin` および `/usr/local/sbin` にあるコマンドを優先的に実行するためのメモ。

```bash
$ echo $PATH
/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
```

これを

```bash
$ echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin
```

に変更したい。対象は全てのユーザ。
そのためには、`/etc/paths` を編集します。

```bash
$ sudo vim /etc/paths
```
```text:/etc/paths
/usr/local/bin
/usr/local/sbin
/usr/bin
/bin
/usr/sbin
/sbin
```

`/etc/paths` 変更後、シェルを再起動すると、パスが変更されます。
Enumerable#inject のブロック内の制御にちょっと注意！


injectで割と以下の失敗をよくします。。。

## 誤
```rb:pry
2.0.0 (main)> (0..2).inject([]) {|ary, i| next if i == 1; ary << i}
```
```shell-session
NoMethodError: undefined method `<<' for nil:NilClass
from (pry):2:in `block in __pry__'
```

## 正
```rb:pry
2.0.0 (main)> (0..2).inject([]) {|ary, i| next ary if i == 1; ary << i}
```
```shell-session
=> [
    [0] 0,
    [1] 2
]
```
nthでjava.lang.IndexOutOfBoundsExceptionを出さないようにする


```clj:repl
=> (nth [1 2 3] 2)
3
=> (nth [1 2 3] 3)
IndexOutOfBoundsException   clojure.lang.PersistentVector.arrayFor (PersistentVector.java:107)
```

見つからなかった時のデフォルト値を与えてやればいい

```clj:repl
=> (nth [1 2 3] 3 nil)
nil
```
Grunt最初の一歩

## Grunt とは？
JavaScript開発でよく使うビルドツール。makeやrakeのJavaScript版です。
[Grunt: The JavaScript Task Runner](http://gruntjs.com/)にて公開されています。

### どうやって使うの？
コマンドラインから操作します。Node.jsのパッケージマネージャ(npm)を使ってインストールします。

## 事前準備
### Node.jsのインストール

#### Chocolatey 
Chocolateyを入れてないなら、コマンドプロンプトで以下のコマンドを実行しましょう。

```
@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%systemdrive%\chocolatey\bin
```

#### Node.js
続いて

```
cinst nodejs.install
```

ChocolateyでNode.jsをインストールするパッケージにはnodejsとnodejs.installがあります。
nodejsはNode.js本体のみインストールし、npm（node.jsのパッケージマネージャコマンド）をインストールしません。
nodejs.installを指定してください。

### grunt-cliのインストール

```
npm install -g grunt-cli
```
コマンドプロンプトを管理者権限で起動していないと上手くいかないかもしれません。

## 動かしてみます
今回はgrunt-contribe-concatというgruntのプラグインを使用してファイルを結合します。

### 作業ディレクトリを作成
作業用ディレクトリを作成し、移動します。ここでは仮にgeorgesとしましょう。

```
mkdir georges
cd georges
```

### packege.jsonの作成
package.jsonはnpm用のプロジェクト定義ファイルです。
Mavenのpom.xmlやbundlerのGemfileに相当します。

```
npm init 
```
を実行すると対話形式で作成できます。
今回はすべての問いにEnterのみで答えてデフォルトのファイルを作ります。

こんな感じです。

```js:package.json
{
  "name": "georges",
  "version": "0.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "BSD-2-Clause"
}
```

### インストール
プラグインをインストールします。

```
npm install grunt-contribe-concat
```

以下の警告が出ます。これらはプロジェクトの説明が不足しているため表示されています。gruntを動かすだけなら問題ありません。無視して進めます。

```
npm WARN package.json georges@0.0.0 No description
npm WARN package.json georges@0.0.0 No repository field.
npm WARN package.json georges@0.0.0 No README data
```

### Gruntfile.jsを作成
Gruntの設定ファイル、Gruntfile.jsを作ります。

```js:Gruntfile.js
module.exports = function(grunt) {
	grunt.initConfig({
		concat: {
			dist: {
				src: ['ge.txt', 'or.txt', 'ges.txt'],
				dest: 'georges.txt',
			}
		}
	});

	grunt.loadNpmTasks('grunt-contrib-concat');
};
```
initConfig の引数でタスクを指定します。
使用するプラグインをloadNpmTasksで読み込みます。

### 動かしてみる
作成したタスクを指定してgruntコマンドを実行します。

```
grunt concat
```

以下の表示が出れば成功です。

```
Running "concat:dist" (concat) task
File "georges.txt" created.
```

まだ結合する元ファイルが無いため作成されたgeorges.jsファイルは空です。

### 元ファイルを作成
結合元のファイルを用意します。UTF-8で作成しないと文字化けするので注意してください。

```text:ge.txt
　 _ 　∩
```

```text:or.txt
(　ﾟ∀ﾟ)彡　おっぱい！おっぱい！
```

```text:ges.txt
　⊂彡
```

### もう一度実行

```
grunt concat
```

georges.txtの中身が次のようになっていれば成功です。

```text:georges.txt
　 _ 　∩
(　ﾟ∀ﾟ)彡　おっぱい！おっぱい！
　⊂彡
```

## 今回使用したファイル
今回使用したファイルは[github](https://github.com/ledsun/SandBox/tree/master/JavaScript/georges)に公開しています。
PHP 5.5.5をソースからインストールする


php-build使えって話もありますが。。。

## 1. ソースをダウンロード & 解凍

http://www.php.net からソースをダウンロードして、tarとかで解凍

## 2. configure

インストールしたいモジュールは下記。

* fastcgi
* MySQLドライバ
* cURL
* zip
* mcrypt
* openssl
* GD
* freetype
* mbstring

```console
$ ./configure --with-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-curl \
--enable-zip \
--with-mcrypt \
--with-openssl \
--with-gd \
--enable-mbstring
```

## 3. make && make install

```console
$ make
$ sudo make install
```
Subscribe2のメールヘッダー（差出人や文字コード）をfunctions.phpに記述するだけで変更させる

メルマガプラグインで有名なSubscribe2の、送信するメールのメールヘッダーを変更します。
以下のソースでは、差出人（From）と文字コード（Content-type）を変更しています。
functions.phpに記述するだけです。

```functions.php
/* Subscribe2のメールヘッダーを変更する */
function change_s2_mail_header(){
	$fromName = "差出人のなまえなど";
	if ( function_exists('mb_encode_mimeheader') ) {
		$fromName = mb_encode_mimeheader($fromName);
	}
	$header['From'] = $fromName ." <". get_option('admin_email') .">";	//
	$header['Content-Type'] = "text/plain; charset=\"ISO-2022-JP\"";
	return $header;
}
add_filter('s2_email_headers','change_s2_mail_header');
```

Subscribe2のフック「s2_email_headers」をadd_filterに通してメールヘッダーの内容を変更しています。
差出人の変更はプラグインでも出来るようですが、
functions.phpで何とかしたかったのでちょっと試行錯誤してみました。

## きっかけと経緯
Subscribe2を導入してメール送信テストをしていましたが、
記事を更新したときに通知されるメールがどうもキャリアメール宛にうまく送信できずにいました。

あれこれ調べてみると、
手動で配信する「メールを送信」によるメール（こちらでは受信できた）と、
記事を公開したときに配信されるメール（設定ではプレーンテキストでの配信）の
メールヘッダーが微妙に違っていたのです。

「メールで送信」で送信したメールの文字コードがISO-2022-JPになっていたのに対して、
記事を公開したときに配信されるメールは、UTF-8となっており、
キャリアメールはどうやらUTF-8ではメールサーバーで弾いている？らしく届かなかったみたいです。
（どうしてキャリアメールだけ受信できなかったのかは原因がはっきりしていないのですが、
文字コードを変更したら受信できるようになりました。）

Subscribe2のソースを見ていると、文字コードを設定するところでbloginfo('charset')を利用しており、
メールヘッダーのフックがあったため、ここで差し替えが出来るかも！？
…と試行錯誤した結果が上記のソースコードです。

※ WP ver3.5以降は、bloginfo('charset')は常にUTF-8を返すとのことで、
設定画面から文字コードの変更は出来なくなっているようです。
Selenium2使ってみたら感動した！！

firefoxで以下URLにアクセスし、プラグインをインストールする。
http://www.seleniumhq.org/download/

赤い録画ボタンがあるので押してからfirefoxを操作するとどんどん記録されていく。
録画終了たものをファイルに保存して他の人にあげることも可能。
iOSの5と7ではうまくいくのにiOS6でだけNSDateFormatterで取得できる年がおかしい

2013年って指定しても2012となってしまう。
↓
YYYY → yyyy で解決(´・ω・`)

```diff
     NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
-    [formatter setDateFormat:@"YYYY-MM-dd"];
+    [formatter setDateFormat:@"yyyy-MM-dd"];
     NSDate *selectedDate = [formatter dateFromString:[NSString stringWithFormat:@"%4d-%02d-%02d", 2013, 11, 15]];
     NSLog(@"%@", [selectedDate description]);
```



参考
[NSDateFormatter show wrong year](http://stackoverflow.com/questions/12423179/nsdateformatter-show-wrong-year)
iOS6でUITableviewのscrollToRowAtIndexPath

## iOS6でtableのスクロール
viewDidLoadで行うと失敗するがこちらなら大丈夫（ただしスクロールするアニメーションがユーザーに見られる）

```objc
- (void)viewDidAppear:(BOOL)animated {

    [super viewDidAppear:YES];

    [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:moveIndex inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];

 }

```

## 別解

reloadDataを挟んでやる

[iOS 6 UItableview scrollToRowAtIndexPath not working anymore](http://stackoverflow.com/questions/12514770/ios-6-uitableview-scrolltorowatindexpath-not-working-anymore)
BSD lsでのSolarized

https://gist.github.com/tsuyoshicho/7467443

LSCOLORSのSolarized
ansiカラーでのdircolors設定を参考に設定作成。

大分手抜き

```
# light
setenv LSCOLORS gHfHfebebHfefebHbHgHgH
 
# dark
setenv LSCOLORS gAfAfebebAfefebAbAgAgA
```
Objective-CでDeferred/PromiseでMethod Chainを書くときのTips


はじめに
=======

「Objective-Cの文法とMethod Chainって致命的に相性悪いよね」というのを解消するTipsです。
さっき社内の後輩に教えてもらって感動したので投稿します。

問題点
=====
最近かじり始めたDeferred/PromiseをObjective-Cでも使いたいと探していて、とりあえず [CocoaPods](http://cocoapods.org/)でInstallできる

OMPromises [https://github.com/b52/OMPromises](https://github.com/b52/OMPromises) 

というのを使っていました。
Promiseの考え方は、Webのみならず、通信や非同期Methodが多用されるiOS/Androidアプリでもとても重宝しそうです。

で、このOMPromisesですが、動作上はとりあえず問題無さそうなのですが、JavaScriptのようにMethodChainを行おうとすると、こんな感じになります。

```objectivec
return [[[[self firstAPICall]     then:^id(YREModelUser *user)    {        user.name = name;        return [self secondAPICall:user];    }]     fulfilled:^(id result)    {        [self storeResult: result];    }]     failed:^(NSError *error)    {        NSLog(@"%@", error);        [self notifyError: error];    }];```

これがどうにも気持ち悪い。最初の `[[[[` っていうカッコは何だ！ 戦場ヶ原ひたぎじゃあるまいし。
この部分に処理を追加したり削除すると、最初の `[[[` の数も調整しないといけない。コンパイルエラーですぐにわかるから良いけど楽しくない。
やはり、ObjectiveCではMethodChainではなく、変数に代入して繋げていくしかないのかな、と思っていました。

Tips
----

その時、
**「BlocksをPropertyとして持たせると良いですよ」**
と教えてもらいました。

そう。Propertyは .(ドット) で繋げられるし、Blocksの呼び出しは （） で行けるので、この文法的なやるせなさを解消してくれるのです。


解法
-------

OMPromise Classに Category として幾つか機能を追加します。

```objectivec:OMPromise+MethodChain.h
#import "OMPromise.h"

typedef id   (^ThenHandler)(id result);
typedef void (^DoneHandler)(id result);
typedef void (^FailHandler)(NSError *error);

typedef OMPromise *(^ThenBlock)(ThenHandler thenHandler);
typedef OMPromise *(^DoneBlock)(DoneHandler doneHandler);
typedef OMPromise *(^FailBlock)(FailHandler failHandler);

@interface OMPromise (MethodChain)
@property (readonly) ThenBlock then2;
@property (readonly) FailBlock fail;
@property (readonly) DoneBlock done;
@end
```

```objectivec:OMPromise+MethodChain.m
#import "OMPromise+MethodChain.h"

@implementation OMPromise (MethodChain)
- (ThenBlock)then2
{
    ThenBlock block = ^OMPromise *(ThenHandler handler) {
        return [self then:handler];
    };
    return block;
}

- (FailBlock)fail
{
    FailBlock block = ^OMPromise *(FailHandler handler) {
        return [self failed:handler];
    };
    return block;
}

- (DoneBlock)done
{
    DoneBlock block = ^OMPromise *(DoneHandler handler) {
        return [self fulfilled:handler];
    };
    return block;
}
@end
```

`then2`とかいうやっつけな名前になっているのは、とりあえず目をつぶって下さい。
こうしておいて、 `#import "OMPromise+MethodChain.h"` としておくと、先ほどのコードが以下のようになります。


```objectivec
return [self firstAPICall]    .then2(^id(YREModelUser *user)    {        user.name = name;        return [self secondAPICall:user];    })     .done(^(id result)    {        [self storeResult: result];    })    .fail(^(NSError *error)    {        NSLog(@"%@", error);        [self notifyError: error];    });```


先頭の `[[[[` が無くなった！

・・まあ、ただそれだけです。でもこっちの方が書きやすいし、読み易いでしょ？（＾＾
ポイントポイントでこういう書き換えもありかなぁ、と思いました。

注意
===

たぶん、この書き換えで問題ないと思うのですが間違ってたらすみません。。
UINavigationControllerの時に最初の遷移で何故か画像にした戻るボタンが表示されない

そうなってしまう箇所すべてにカテゴリを仕込んだ


UIBarButtonItem+NaviBack.h

```objc
#import <UIKit/UIKit.h>

@interface UIBarButtonItem (NaviBack)
- (UIBarButtonItem *)setNaviBackButton:(UIViewController *)controller;
@end

```

UIBarButtonItem+NaviBack.m

```objc
#import "UIBarButtonItem+NaviBack.h"

@implementation UIBarButtonItem (NaviBack)
- (UIBarButtonItem *)setNaviBackButton:(UIViewController *)controller
{
    UIButton *customUIButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 55, 33)];
    [customUIButton setBackgroundImage:[UIImage imageNamed:@"navi_bar_back_button"]
                              forState:UIControlStateNormal];

    // handleBackという関数を必ず実装する必要がある
    [customUIButton addTarget:controller action:@selector(handleBack:) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:customUIButton];

    return backBarButtonItem;
}

@end

```

使い方

SampleViewController.m

```objc
#import "UIBarButtonItem+NaviBack.h"

...

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] setNaviBackButton:self];
}

// 戻るボタンを手動で組み込む用(必須)
- (void)handleBack:(id)sender
{
    UIViewController *parent = [self.navigationController.viewControllers objectAtIndex:0];
    [self.navigationController popToViewController:parent animated:YES];
}
```

参考

[ios7のnavigationbarをios6以前のデザインに合わせる方法](http://qiita.com/cyan_ishii/items/0babccb20c0f183b1c5f)
NavigationBarの色を統一したい

## appearanceで指定

```objc
NSDictionary *textTitleOptions = [NSDictionary dictionaryWithObjectsAndKeys:[UIColor darkGrayColor],  UITextAttributeTextColor,  [UIColor whiteColor],  UITextAttributeTextShadowColor,  nil];
[[UINavigationBar appearance] setTitleTextAttributes:textTitleOptions];
```

[iOS - Globally change navigation bar title color using appearance?](http://stackoverflow.com/questions/11004700/ios-globally-change-navigation-bar-title-color-using-appearance)
iOS7にしたらcellのインデックスが取れない問題が発生した

### 経緯
iOS5,6でつくっていたアプリでiOS7のときだけcellに設置したボタンのindexが取得できなくなっていた。

### 元々の実装
superviewを決め打ちだった。

```
UITableViewCell *cell = (UITableViewCell *) [[[(UIButton *) sender superview] superview] superview];
```

## 改修
while文ぶん回して解決

```
- (void)pushButtonOnCell:(id)sender
{
    UIView *view = [(UIButton *) sender superview];
    while (![view isKindOfClass:[UITableViewCell class]]) {
        view = [view superview];
    }
    UITableViewCell *cell = (UITableViewCell *)view;
    int              row  = [self.calendarTable indexPathForCell:cell].row;
    NSLog(@"row = %d", row);
}
```

## 参考記事
[indexPathForCell returns nil since ios7](http://stackoverflow.com/questions/18743099/indexpathforcell-returns-nil-since-ios7)
特定ドメイン宛のみメール送信許可 (postfix)

[参考](http://choice-site.com/2012/09/05/postfixで特定ドメイン宛のメールのみ、別のsmtpサーバか/)

hoge@allowdomain.co.jp だけ送信許可する場合の設定。

```diff:/etc/postfix/main.cf 
  #relay_domains = $mydestination
+ relay_domains = allowdomain.co.jp
+ relayhost = 11.22.33.44
+ default_transport = error: Local delivery only!
```

これで許可しないドメイン宛にメールを送信しようとしても、
`/var/log/maillog`に`error: Local delivery only!`のメッセージが出力されるだけになる。
Vagrant でマウントされるディレクトリのownerを調整する


　vagrant up 時に、ホストの Vagrantfile が存在する領域が自動的にVMの /vagrant にマウントされますが、そのディレクトリ群の owner が標準のvagrantのままだったので、変更する方法を調べました。

Vagrantfile の Vagrant.configureブロックの中に、

```
config.vm.synced_folder '.', '/vagrant', owner: '<ownerとしたいVM内のユーザ名>'
```

と記述して、vagrant up しなおす、あるいは vagrant reload をすると、指定したユーザがownerとなってマウントされます。

　また、グループも変更したければ、

```
config.vm.synced_folder '.', '/vagrant', owner: '<ownerとしたいVM内のユーザ名>', group: '<ownerとしたいVM内のグループ名>'
```

として、同様の手順を踏めば、変更できます。
git svnでgitコマンド単体でつくってしまったブランチをsvnのブランチにしたい

svnの案件やってると「svnとか遅くてやってらんない！」って気持ちになって、git-svnをつかってみたときに、うっかり```git svn branch```を使わずに```git co -b```してしまった時〜〜〜

### 手順
うっかりgitだけでブランチ作成

```shell-session
$ git co -b dev-branch
```

この後、なんらかの修正をしコミットしまくってしまった。

一度退避する


```shell-session
$ git co -b dev-branch-2
```

もとのブランチを消す

```shell-session
git br -D dev-branch
```

svnのブランチからローカルのブランチを作成

```shell-session
git co -b dev-branch remotes/svn/dev-branch
```

URLを確認

```
git svn info
```
目的のブランチに向いてるはず！

退避させて置いたブランチをmerge

```
git merge dev-branch-2
```

変更をsvnのブランチにpush(svn的なコミット)する

```shell-session
git svn dcommit -n
```
-nはドライラン

反映

```
git svn dcommit
```

あとは実際にsvnのsourceを確認して目的の変更があったら終わり！
Chaplin.js


BackboneのModel周りを使った、クラス間のデータの保持というのがよさそうだなと思っていたところに、下記のようなエントリを見つけた。


http://blog.fujimuradaisuke.com/post/64753754298/quipper-html5

> Chaplin.js
素のBackboneだと、ブートやインスタンス管理の仕組みを作るのが面倒。ここ一年でそれっぽいものを2度作ったので、もうやりたくなかった。 Chaplin.jsはレールがひいてあり、インスタンス管理も行き届いてる。 Brunchで雛形つくれるのもよかった。

> Chaplin.jsはなかなか良いです。もう素のBackbone.jsは書きたくない。


http://chaplinjs.org/

気になるので後で調べてみよう。

-

http://qiita.com/atskimura/items/60e9cc6638ca1d0754df

> Chaplin.jsはBackbone.jsをラップして作られたJavaScript MVCフレームワークです。
gitでsvn st -u相当のことをしたい

## 前提
gitとsvnの案件をいったり来たりしているときに、そういえばgitでsvn st -uってどうするんだろうと思って調べてみました。

### svn st -uって？
実行すると```svn up```したときに落ちてくるファイルも含めた、ファイルのステータスを表示してくれます。
他の人のコミットを反映するときに、どんな修正が反映されるのかわかって便利です。

## gitの場合
「これだ！」ってのがあまりわかってないのですが、自分の場合は以下を使っています。

### どのコミットがmasterに反映されるかを確認する

```shell-session
$ git checkout master
$ git fetch && git log ..origin/master
```

今のローカルのソースコードに適用されていない分のコミットをlogとして見ることができます。

### どのファイルが反映されるのかも知りたい
logだけだとどのファイルが変更されるかわからないのでオプションを指定します。

```shell-session
$ git fetch && git log --stat ..origin/master
```

これでどのファイルがどれくらい変更されているのかがわかります。

### 不安なのでファイルのdiffも見たい
普通にlogではなくdiffでよかったです。

```shell-session
$ git fetch && git diff ..origin/master
```

## 理想は変更されるファイル一覧だけ欲しい
「これだ！」ってやつがあれば教えてくれると助かります。

*追記：2013/11/15 12:24*

いきなり教えてもらえました！

```shell-session
git diff --name-only ..origin/master
```
RSpecでsessionを使用した処理のテスト(ログイン機能)


内容としてはajaxのテストを書こうとして、それにはsessionが必要というような場合です。（渡しの場合、ログインしていないとajax通信ができないという仕様でした。）

ここけっこう困って、前回こういったsessionを使うテストを実装した際には[grape](https://github.com/intridea/grape)というRails向けのREST APIのフレームワークを使っていたのでこれはまた別問題でした。（grapeはrackを使ってsession設定できます）
- - -
想定したアプローチは2つあって

* controller specを使ってテスト

* postで実際にログインさせてからテストを実行

1つ目はやってみたのですがテスト内ではsessionを使えたのですがアプリ内での引き継ぎができなくてうまくいきませんでした、が、ブログ書きながらちょろちょろ調べて見てると出来そうな雰囲気もあるのでまた次回試してみます。。

2つ目が今回の実装でやったのですが、挙動的にはこっちのほうがいいのかなと。

```ruby
require 'spec_helper'

describe CalendarController do
  before do
    @user = create(:user)
    post '/login', {:username => @user.name, :password => @user.password}
  end

  context 'create' do
    …
    it do
      xhr :post, 'hoge/fuga', {:hoge => 1, :fuga => 'fuga'}
      expect(response.body).to eq({:success => true, :data => {…}.to_json})
      response.code.should == "200"
    end
  end

end 
```

というような感じです。
実際のログインユーザーが行う処理という流れに沿っている分テスト的には良いかなと思いました。
xhrでajax通信を使ったgetやpostが行えます。その後に中身とステータスコード200をチェックしているというような形です。

　
ただ、普通にsession[:calendar_id]みたいなのを使いたいというような時は1つ目のアプローチが必要と思いますので、また解決し次第ブログに書きたいと思います。
Visual Studio の起動時にVMDebuggerのエラーが出る。

##概要
VIsual Studio 起動時に、エラーが出て困っていた。
エラー自体は、特にVisual Studio の動作自体には影響ないようだったが、削除しますか→はいとしても削除されないし、VMDebugger の再インストールも試したが効目がなかったため原因を調べ、解決した。

## 症状
VMWare Workstation を 9 から 10 に上げたところ、しばらくしてVIsual Studio の起動時にエラーが発生するようになった。
VMDebuggerの読み込みに失敗したというエラーで、
エラーコードは、80004005
原因不明のエラーとのことだった。

## 原因
VMDebuggerのログを調べたところ、
コマンドバーにボタンが追加できないというような趣旨のエラーが出ていた。
ツールバーを見てみたところ、空っぽのVMWareの項目を発見。
おそらく前バージョンを削除したときに空にしたものの項目自体が残ってしまい、項目が作成できなくなっているのではないかと推測。

## 解決法
カスタマイズ→ツールバーより、VMWareを削除して再起動した。
項目を削除したところ、エラーは発生しなくなりVMWareの中身も作成された。
sshトンネリングでDMZ内のmysqlにローカルから接続しちゃう

# やりたいこと

本番環境やステージング環境では、DMZ内にDBを設置するのが常套かと思います。このDBにローカルから直接接続して、手慣れたmysqlクライアントでデータ参照／操作したい場合のお話です。

## 前提環境
* 対象のDBに接続可能なappサーバにssh接続可能なこと
* DBはmysql（この投稿上では）

## 使えるmysqlクライアント
以下の手順説明ではクライアント側はmysqlコマンドを使いますが、基本的にどんなクライアントでも問題無いはずです。手元では [Navicast Essentials for MySql](http://www.navicat.jp/mysql/index.html)やrails consoleで接続して便利に使ってます。

## 手順
1. sshトンネリング接続を確立する

```zsh
$ ssh -o TCPKeepAlive=yes user@app.server -NfL 13306:10.0.0.123:3306
# 13306 : local側の空きポート番号
# 10.0.0.123 : appサーバから見たdbサーバアドレス
# 3306: dbサーバのmysql接続用ポート
```

1. mysqlに接続する@ローカル

```zsh
$ mysql -h 127.0.0.1 -P 13306 -p
# "localhost"ではなく127.0.0.1
# sshトンネリングで設定したポート番号に接続
```


## 問題点
* <del>サーバ側の設定次第ですが、何も操作しない時間がある程度経過すると、ssh接続を切断されてしまうので、その都度つなぎ直す必要が有ります。</del><br />
-> tsuyoshi_choさんにKeepAlive+ServerAliveIntervalを教えてもらって解消しました。ありがとうございます！
* 危ない技なので取り扱い要注意！