OmniAICreator/Qiita-1.07M huggingface dataset:
第23回オフラインリアルタイムどう書く を C++ で解く

ひねりなくC++で解いてみました。
もう少し工夫をしたかったのですが、途中でもたついたら、ここに到達するだけで１時間を消費してしまいました。

お題は[こちら](http://qiita.com/Nabetani/items/7ba11167ea28c929fcf2)です。


```cpp
#include <iostream>
#include <sstream>
#include <string>
#include <algorithm>

struct Cell
{
    int value;
    int length;

    Cell() : value(0), length(0) {}
};

int get_length(Cell table[5][5], int row, int col)
{
    if(table[row][col].length == 0)
    {
        table[row][col].length = 1;

        if((row > 0) && (table[row][col].value < table[row - 1][col].value))
        {
            table[row][col].length = std::max(get_length(table, row - 1, col) + 1, table[row][col].length);
        }

        if((row < 4) && (table[row][col].value < table[row + 1][col].value))
        {
            table[row][col].length = std::max(get_length(table, row + 1, col) + 1, table[row][col].length);
        }

        if((col > 0) && (table[row][col].value < table[row][col - 1].value))
        {
            table[row][col].length = std::max(get_length(table, row, col - 1) + 1, table[row][col].length);
        }

        if((col < 4) && (table[row][col].value < table[row][col + 1].value))
        {
            table[row][col].length = std::max(get_length(table, row, col + 1) + 1, table[row][col].length);
        }
    }

    return table[row][col].length;
}

std::string solve(const std::string& input)
{
    Cell table[5][5];
    for(int row = 0; row < 5; ++row)
    {
        for(int col = 0; col < 5; ++col)
        {
            table[row][col].value = input[row * 6 + col] - '0';
        }
    }

    int length = 0;
    for(int row = 0; row < 5; ++row)
    {
        for(int col = 0; col < 5; ++col)
        {
            length = std::max(get_length(table, row, col), length);
        }
    }

    std::ostringstream oss;
    oss << length;

    return oss.str();
}

void test(const std::string& input, const std::string& expected)
{
    std::string actual = solve(input);
    if(expected == actual)
    {
        std::cout << "." << std::flush;
    }
    else
    {
        std::cout << "\ninput: " << input << ", expected: " << expected << ", acutal: " << actual << std::endl;
    }
}

int main(int argc, char* argv[])
{
    /*0*/ test( "01224/82925/69076/32298/21065", "6" );
    /*1*/ test( "03478/12569/03478/12569/03478", "10" );
    /*2*/ test( "09900/28127/87036/76545/87650", "10" );
    /*3*/ test( "77777/77777/77777/77777/77777", "1" );
    /* ... */
    /*50*/ test( "02489/77571/84873/03879/84460", "7" );

    std::cout << std::endl;

    return 0;
}
```
[PHP] runkit を使って time() のような環境に依存する値を返す組み込み関数が埋め込まれたコードを変更せずにテストする

PHP の標準関数のスタブする方法はないか探していたところ [runkit](https://github.com/zenovich/runkit) というものが見つかりました。機能が強力であるため黒魔術的な紹介をされていることが多いのですが、現実というのは残酷なもので黒魔術に頼らないといけない場面もあるのではないかなと思います。

例えば下記のように `time()` が直接埋め込まれたメソッドがあったとします。現在のタイムスタンプが指定の値を超えていたら `true`、超えていなかったら `false` を返すメソッドです。

```Event.php
<?php

class Event{
  public function isFinished(){
    if(1404408309 <= time()){
      return true;
    }else{
      return false;
    }
  }
}
```

既に存在するコードに手を入れずにテストを行えるようにするため、テストコード側で runkit の `runkit_function_redefine` 関数を使って `time()` が固定値を返すようにします。意図した固定値を返させるようにすることで、`true` と `false` のどちらのパターンも一応テストできるようになりました。

```EventTest.php
<?php

require_once 'Event.php';

class EventTest extends PHPUnit_Framework_TestCase{
  public function testIsClosedReturnsTrue(){
    runkit_function_redefine('time', '', 'return 1404410000;');
    $event = new Event();
    $this->assertTrue($event->isFinished());
  }
  public function testIsClosedReturnsFalse(){
    runkit_function_redefine('time', '', 'return 1404400000;');
    $event = new Event();
    $this->assertFalse($event->isFinished());
  }
}
```
【未解決部あり】express+ejsで配列をクライアント側のjsに渡す方法

express+ejsでオブジェクトを含む配列をクライアント側のjsに渡す方法に嵌ったのでメモ。

サーバー側のコードがこれ。普通にキーと値（配列）をejsテンプレートにセットにすればいい。

```js:test

var roominfo = function(roomname){
this.roomname=roomname;
};

room_info_array= new Array(1);
room_info_array[0]=new roominfo("room");

app.get("/", function(req, res){
res.render('login',{room_info:room_info_array});
});
```
クライアント側がこう。

```js:test
<script type="text/javascript">
var data = <%- JSON.stringify(room_info) %>
</script>
```
ポイントは<%- %>にすること。<%= %>ではない。後者だと渡した値を勝手にエスケープ処理してしまってオブジェクトとして認識してくれない。

この部分は解決したんだけど、まだ実現できていないことがある。

Socket.ioのconnection内で代入した値をテンプレートに渡せない。

```js:test
io.sockets.on('connection', function(socket) {
//この中でroom_infoの値を操作して、新しく"/"にアクセスして来たクライアントにroom_infoの値を渡したいが、nullになる。
});
```
expressを使って渡そうとするのがそもそも間違いなのかな？　普通にクライアントに配列渡すメソッド定義すればやりたいことは実現できると思うけど・・・・
[Swift] UIActionSheetの簡単なサンプル

## できること
ボタンを押すとUIActionSheetを表示して、選んだボタンのindexとタイトルを取得するだけです。

## ソース
```ViewController.swift
import UIKit
 
class ViewController: UIViewController, UIActionSheetDelegate {
    @IBAction func tapButton(sender : AnyObject) {
        var sheet: UIActionSheet = UIActionSheet()
        let title: String = "Please choose a plan"
        sheet.title  = title
        sheet.delegate = self
        sheet.addButtonWithTitle("Cancel")
        sheet.addButtonWithTitle("A plan")
        sheet.addButtonWithTitle("B plan")
        sheet.addButtonWithTitle("C plan")

        // キャンセルボタンのindexを指定
        sheet.cancelButtonIndex = 0

        // UIActionSheet表示
        sheet.showInView(self.view)
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }
 
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
 
    func actionSheet(sheet: UIActionSheet!, clickedButtonAtIndex buttonIndex: Int) {
        println("index %d %@", buttonIndex, sheet.buttonTitleAtIndex(buttonIndex))
    }
}
```
rails4でupdated_atを更新せずにupdateする -> update_columnを使う

あんまり使いませんが、updated_atを更新せずcallbackやvalidationを行わないで特定カラムをただただ上書きしたい時に使います。

ここに書いてある通りの内容です。

http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-update_columns

```rb
image = Image.first
puts image.updated_at # updated_atが

image.update_column(:optimized, true)
puts image.updated_at # 更新されていない

image.update_attribute(:optimized, true)
puts image.updated_at # 更新されている
```

管理画面でupdated_atをソート表示に利用しているような時、updated_atが更新されたら困るケース等で使えます。
くねくね増加列

携帯だけで書いた下書き：http://ideone.com/36z2ZE

メモ化再帰にもっていけたのは「長くなるように、増え続けるように」(140805追記)のおかげだと思っています。

```rb:hena23.rb
#!/usr/bin/env ruby
#http://qiita.com/Nabetani/items/7ba11167ea28c929fcf2
#http://nabetani.sakura.ne.jp/hena/ord23snakemoinc/
class Hena23
	def initialize(a)
		@a=a
		@memo={}
	end
	def dfs(x,y,nprev)
		return 0 if x<0||@a[0].size<=x || y<0||@a.size<=y || @a[y][x]<=nprev
		return @memo[[x,y]]||=[[-1,0],[1,0],[0,-1],[0,1]].map{|_x,_y|
			dfs(x+_x,y+_y,@a[y][x])+1
		}.max
	end
	def run
		@a.size.times.lazy.map{|y|
			@a[0].size.times.lazy.map{|x|
				dfs(x,y,-1)
			}.max
		}.max
	end
end

if $0==__FILE__
	STDOUT.sync=true
	while gets
		p Hena23.new($_.chomp.split('/').map{|e|e.split('').map(&:to_i)}).run
	end
end
```
「プログラムでシダを描画する」をPythonで描画する - 再帰なし+ジェネレータ版 -

「プログラムでシダを描画する」にようやく参加できた!

@noc06140728 さんのコードをベースに作成しました。ありがとうございます。

##変更点
* 再帰をなくしてジェネレータだけを使用
* 画像に濃淡を持たせた
* 関数をパラメータを各々ひとまとめにした

##出力結果
![fern.png](https://qiita-image-store.s3.amazonaws.com/0/48174/8c321f5f-7b03-b6c9-2278-58d3a870f6b0.png)

##コード

```python

# coding: utf-8
import random

N = 1000000

WIDTH = 500
HEIGHT = 500

fern = [
    [1.0, [+0.836, +0.044, 0.0, -0.044, +0.836, 0.169]],
    [0.3, [-0.141, +0.302, 0.0, +0.302, +0.0141,0.127]],
    [0.3, [+0.141, -0.302, 0.0, +0.302, +0.141, 0.169]],
    [0.3, [0.0, 0.0, 0.0, 0.0, 0.175337, 0.0]],
]

p_table = []


def W(n,v):
    c = fern[n][1]
    return (c[0] * v[0] + c[1] * v[1] + c[2], c[3] * v[0] + c[4] * v[1] + c[5])
 

# Python 2.7 には itertools.accumulate がないので以下から借用して簡略化
# http://docs.python.jp/3.3/library/itertools.html#itertools.accumulate 
def accumulate(iterable):
    it = iter(iterable)
    total = next(it)
    yield total
    for e in it:
        total = total + e
        yield total

        
def g(v, n):
    it = 0
    while it < n:
        it += 1
        yield v
        r = random.random()
        for i, p in enumerate(p_table):
            if r < p:
                v = W(i,v)
                break;
                
                
if __name__ == '__main__':
    # 確率の値ををならす
    p_total = sum(f[0] for f in fern)
    p_table = [a/p_total for a in accumulate([f[0] for f in fern])]
    
    # 点の軌跡を溜めておくバッファ
    acc = [0] * 3 * WIDTH * HEIGHT
    # 最初の点
    v = (0.0, 0.0)
    acc_max = 1
    for p in g(v, N):
        x, y = (int((p[0] + 0.5) * WIDTH), HEIGHT - int(p[1] * HEIGHT))
        if x >=0 and x < WIDTH and y >= 0 and y < HEIGHT:
            acc_index = x + y * HEIGHT
            acc[acc_index] += 1
            if acc[acc_index] > acc_max:
                acc_max = acc[acc_index] 
    
    from math import pow
    from PIL import Image
    im = Image.new("RGB", (WIDTH, HEIGHT), (255, 255, 255))
    pix = im.load()
    
    for i in xrange(WIDTH * HEIGHT):
        #if acc[i]:
        # 暗いところを持ち上げる
        d = int(pow(float(acc[i]) / float(acc_max),1.0/15.0) * 255.0)
        pix[i % WIDTH, i / WIDTH] = (0, d, 0)
            
    im.show()

```

##まとめ
楽しかった!
rsync問題集

1. rsync: Failed to exec README: No such file or directory (2)

>
解決策
-e "ssh"を追加
http://ubuntuforums.org/showthread.php?t=1790737

2. rsync: failed to set permissions on "/to/the/path/.": Operation not permitted (1)

>
解決策
-aを-rlOtにする
参考：[rsync: failed to set times on “<dir path>”](http://superuser.com/questions/200012/rsync-failed-to-set-times-on-dir-path)
分岐予測がハズれると

「[Non-classical processor behavior: How doing something can be faster than not doing it](http://blogs.msdn.com/b/oldnewthing/archive/2014/06/13/10533875.aspx)」に、CPUの分岐予測の影響について、マイクロベンチマークの結果が載っていました。

この実験では、分岐予測がハズれやすいケースでは、
そうでない場合と比較して **6.5倍** もの時間がかかることが示されています。
CPUの種類は記載されていませんが、最近のものであれば大体同じような傾向になりそうです。

実際のプログラムでこんなに極端な差が出ることはほとんどないでしょう。
気になるのなら、コンパイラが分岐命令を出力しているかどうか、逆アセンブルでもするしかないですね。

この記事では、プログラム中の
```if (array[i] < boundary) count++;```
を
```count += (array[i] < boundary) ? 1 : 0;```
に変更して問題を解決していました。
カウントアップの命令が変わるせいか、
古いコードでのもっともよいケースよりは遅くなりますが、
実行時間は安定します。
monacoind を Homebrew でインストールする


細かい話は後にして，まずは手順を手短に．

```sh
brew tap altcoins-tools/altcoins-tools
brew install monacoin
```

`/usr/local/bin/monacoind` がインストールされます．

OSX Mavericks では bitcoind を始め各種 *coind でビルドが通らない状態が続いていますが，この Formula には回避のためのパッチが当ててあります．パッチの内容については， `brew edit monacoin` などして確認して下さい．

ビルドできなかった場合には，直して https://github.com/altcoins-tools/homebrew-altcoins-tools/pulls に投げ込んでください．レビューの上，反映します．
rubyでカジュアルにスクリーンショットをとる

`gem install 'rbscreenshot'`

```rb:ss.rb
require 'rbscreenshot'
RbScreenShot.take 'http://matome.naver.jp/'
```

![1404631613.png](https://qiita-image-store.s3.amazonaws.com/0/19168/20acfaa5-e3a9-7702-3bb8-ca9f98d913e0.png)

中身はただのCapybaraとPoltergeistです :)

ソース: https://github.com/kaiinui/rbscreenshot
QNAP SystemsのNAS TS-220のFTP(proftpd)設定をいじくる場合の覚え書き（危険なのでこのまま試さないでください）


# DISCLAIMER
まず、officialかつ最新の情報を確認してください。

Running Your Own Application at Startup　http://wiki.qnap.com/wiki/Autorun.sh

以下、自分用のメモの散逸を防ぐため、もしくは誰かのヒントになればと文書化しました。
また、実際の設定はセキュリティの問題などがあり、そのまま公開できないので、適当に編集してあるため、 __このままでは正しい動作はしない可能性が高いです。__ 

このメモを試したのはQNAP Systems IncのTS-220というNASです。
http://www.qnap.com/jp/index.php?lang=jp&sn=699&c=328&sc=601&t=610&n=18427

ソフトウェアのバージョンはQTS 4.0 (中身はLinuxで```uname -r```すると2.6.33.2というバージョンが返ってきます。）

# そもそも
QNAPのNASのOSは、サービスの設定を再起動の度に初期化してしまうようです（自分はまだ試していないが、次のサイトなどに記載があります。 http://motd.jugem.jp/?eid=188 ただこれは古いバージョンの話かもしれません。)
だからsshやtelnetで接続して設定を変更しても、再起動するとオジャン。逆に考えれば、どんだけいじってめちゃめちゃにしても再起動すればそれなりに動く（かもしれない）というfool proofになっています。（現在のQTS 4.0でもそうかどうかは保証できません）

なので、設定をいじる場合には

1. 初期化されない領域を確保
1. 設定ファイルを初期化されない領域にコピー
1. 設定ファイルのコピーを変更して（バージョン管理しとくべき）、元の設定ファイルに上書きする
1. サービスを再起動またはreconfigして動作を確認
1. 設定ファイルを、初期化されない領域にあるものに差し替えるshellスクリプトを作成
1. NASの起動時に実行されるコマンドをサービス毎に指定できる```/etc/config/qpkg.conf```にftp用の項目を追加する

# それでは順を追って

## 初期化されない領域を確保

```
mkdir -p /share/MD0_DATA/.dpkg/autorun
```

## 設定ファイルを初期化されない領域にコピー

```
NOW=`date +%Y%m%d-%H%M%S`
cp /etc/config/proftpd.conf /share/MD0_DATA/.dpkg/autorun/proftpd.conf.$NOW.backup
cp /etc/config/proftpd.conf /share/MD0_DATA/.dpkg/autorun/proftpd.conf
```

## 設定ファイルのコピーを変更して（バージョン管理しとくべき）、元の設定ファイルに上書きする

```
vi /share/MD0_DATA/.dpkg/autorun/proftpd.conf
cp /share/MD0_DATA/.dpkg/autorun/proftpd.conf /etc/config/proftpd.conf
```

## サービスを再起動またはreconfigして動作を確認

再起動

```
/etc/init.d/ftp.sh restart
```

reconfig (設定のreload）

```
/etc/init.d/ftp.sh reconfig
```

## 設定ファイルを、初期化されない領域にあるものに差し替えるshellスクリプトを作成

```
vi /share/MD0_DATA/.dpkg/autorun/setupftp.sh
```

内容

```{bash}
#!/bin/sh
cp /etc/config/proftpd.conf /share/MD0_DATA/.dpkg/autorun/proftpd.conf.`/bin/date +%Y%m%d%H%M%S`.boot.backup
cp /share/MD0_DATA/.dpkg/autorun/proftpd.conf /etc/config/proftpd.conf
/etc/init.d/ftp.sh restart
```

実行可能なパーミッションの設定

```
chmod +x /share/MD0_DATA/.dpkg/autorun/setupftp.sh                                                                                                         
```

## NASの起動時に実行されるコマンドをサービス毎に指定できる/etc/config/qpkg.confにftp用の項目を追加する

```
[autorun]
Name = autorun
Version = 0.1
Author = kgbu
Date = 2014-07-06
Shell = /share/MD0_DATA/.qpkg/autorun/setupftp.sh
Install_Path = /share/MD0_DATA/.qpkg/autorun
QPKG_File = autorun.qpkg
Enable = TRUE
```

# どんなことがしたかったか

注意！）以下の変更は他のサービスとの整合性を考えれば実施すべきではなく、たまたまFTPサーバーとしてだけ運用するケースだったので実施した。

+ Umaskが000なのが気持ち悪かったので、変えたかった。(それをいうならRootLogin onも変えたいですが）ただ、これを変えた場合に、他のサービスとの整合性が保たれるかは疑問です。
+ FTPの特権ユーザー（例えば __ftpadmin__ ）が、他のユーザーのディレクトリの内容を読み書きできるようにしつつ、他のユーザーはchroot(proftpdの場合はDefaultRootの設定)されたままにしたかった。これはFTPの特権ユーザーの属するgroupをDefaultRootで独自の設定にして、ホームディレクトリの設定(/etc/passwd)を変更することで実現できる。

```
DefaultRoot ~ ftpadmin
DefaultRoot /share
```

ところで、このNASのproftpdでは、chroot(DefaultRootを指定)した場合、ログインしたディレクトリは書き込みができない。ログインディレクトリを/etc/passwdをいじっていろいろ設定してみたがダメだった。
この件については以下のサイトでも指摘されていました。
http://www.big-55.com/2013/02/qnap_ftps%E3%81%A7%E5%A4%96%E9%83%A8%E3%81%8B%E3%82%89%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9_proftpd-conf%E3%82%92%E3%81%84%E3%81%98%E3%82%8B/
[Swift] while文とdo-while文の違い

Apple公式ドキュメントの"The Swift Programming Language" の "A Swift Tour"だと、whileとdo-whileのちがいがわかりにくかったので覚書です

# while文とdo-while文のちがい
* while文は、条件式が偽だと１回も実行されない
* do-while文は、条件式が偽だとしても必ず１回は実行される。

# while文 実行例
```swift:WhileSample.swift
var n = 10
while n < 1 {
    println("value \(n)")
    n++
}
```
### 実行結果
なし
（１回もprintlnが実行されない）

# do-while文 実行例
```swift:DoWhileSample.swift
var m = 10
do {
    println("value \(m)")
    m++
} while m < 1
```
### 実行結果
value 10
（plintlnが1回だけ実行される）

# まとめ
* while文とdo-while文のちがいが出るのは、条件式がはじめから偽の場合のみ。
* なので、"The Swift Programming Language"のサンプルコードのような、条件式が1回以上真になるコードだと結果が全く同じになっていしまい、ちがいが分かりにくい。
* do-while文の使いドコロの説明はこちらがわかりやすかったです[do..while文 - 繰り返し処理 - C言語 入門](http://www.cppdrive.jp/cstart/for/index4.html)

# 参考：The Swift Programming Languageのサンプルコード
## while文 実行例
```swift:WhileSample2.swift
var n = 2
while n < 100 {
    println("value \(n)")
    n = n * 2
}
```
### 実行結果
value 2
value 4
value 8
value 16
value 32
value 64

## do-while文 実行例
```swift:DoWhileSample2.swift
var m = 2
do {
    println("value \(m)")
    m = m * 2
} while m < 100
```
### 実行結果
value 2
value 4
value 8
value 16
value 32
value 64
VagrantをGWにしてホストから直接Dockerる

# 鳥頭なのでポート番号を覚えられません

少し語弊があると思いますが、ポート番号自体を覚えられないのではなく、その場で決めた特殊なポート番号が覚えられません。
今どきは1024以下に関わらずなんからの定番ポート番号があります。1521,3000,5432,8080などなど。
これらは事実上のwell-knownポートであり、このサービスはこの番号というのが体に染みついています。特に8080とかはブラウザデバッグするときアドレスとセットで勝手に体が入力してしまう程度に末端神経が毒されています。
何が言いたいのかというと、あるサービスに対してポートフォワードしたとき、そのポート番号をブラウザなりに打ち込んだりするときに少し間が開いてしまいなんか気持ち悪いというだけの話です。


## 動作を想定している環境

「[VagrantとDockerを使って環境に依存せずにChefのお勉強がしたい](http://qiita.com/pepepe/items/1eea80b11f7439fdc44c)」で書いたのですが、ぼくは仕事の都合上windowsをキープしないといけません。しかし家での開発はmacでやっています。なので、開発環境をそろえるために仮想環境を用意しているのですが、仮想環境の構築も両環境で統一したいのです。
なので、host -> box(vagrant) -> dockerという３段重ねで環境を作っています。
で、開発中のサービスはdocker上にあります。vagrantはお利巧なので、ポートフォワードなんておしゃれな事をやってくれますが、残念ながら冒頭で書いた通り僕の指がそのお利巧さについていけていません。

## だからvagrantをルーターにした

解決策は簡単です。vagrantをルーターにしちゃえばいいだけです。
vagrantで仮想マシンのプロビジョニング時にeth0とdocker0間でパケットをガバガバに転送するようにします。

```shell-session:provision.sh
# ホストから直接dockerコンテナにアクセスできるようにする
sed -ir 's/net\.ipv4\.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf

iptables --flush
iptables --table nat --flush
iptables --delete-chain
iptables --table nat --delete-chain

iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE
iptables --append FORWARD --in-interface docker0 -j ACCEPT

iptables --table nat --append POSTROUTING --out-interface docker0 -j MASQUERADE
iptables --append FORWARD --in-interface eth0 -j ACCEPT

service iptables save
service iptables start
```

んでもってwindowsやmacのルーティング設定を変更します。
`route -p add 172.17.0.0 mask 255.255.255.0 192.168.10.10`
こうするとこんな感じのネットワークになります。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/35642/b21fdfed-b2d1-6bb1-9776-94ed3f4430ed.png)

ホストから172.17.0.0へのパケットはvagrantがGWになり、vagrantが責任を以てdockerに届けてくれます。

## テスト

まずvagrant上でコンテナを起動させます。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/35642/9e80b981-7266-32b7-241a-440d5a664b70.png)

現在のコンテナIDは`945d898e8ead`のようなので、これのIPを調べます。
`docker inspect 945 | jq ".[0].NetworkSettings.IPAddress"`

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/35642/20667e1d-f1ac-0ea4-6488-c28c21e8ca83.png)

今のIPは172.17.0.2だそうです。sshしてみます。クライアントはホスト上のcygwin-sshです。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/35642/cd0bfac7-5fb7-a62e-5fa7-1f562cd90a22.png)

直接無事sshできました。ポート番号も22のままなので-pオプションも不要です。
Gitのコマンドによる、ブランチ削除・追加・リモートプッシュ

#Git忘備録 その１  

今週業務ではまったGit操作をまとめます。
  
##ブランチの削除
`git branch -d <ローカルブランチ名>
git push origin :<リモートブランチ先>`

ブランチのプッシュは、  
`push 接続先 <ローカルブランチ先>:<リモートブランチ先>`
が基本みたい。
これを解釈すると、
接続先のリモートブランチ先にローカルブランチの内容をプッシュする。
ということになる（みたいです）。

とすると、リモートブランチ先に空のブランチをプッシュすることで、
リモートブランチ先が空となり、なくなる。
と解釈してます。

##ブランチの新規追加とリモートへのプッシュ
`git branch <ローカルブランチ>
git checkout <ローカルブランチ>
git push origin <ローカルブランチ>:`
originはリモートの接続先を指しています。

`git branch <ローカルブランチ>`
でローカルにブランチを新規作成。

`git checkout <ローカルブランチ>`
で作成したローカルブランチを使用。

`git push origin <ローカルブランチ>:`
で作成したローカルブランチをリモートにプッシュします。
ここでも、プッシュの概念が出てきます。
今回は、リモートのプッシュ先を空欄にすることで、
新規に追加することができる（と思ってます）。

もし、違っていたりしたら、有効な考え方があってたら、コメントください。
【Unity】SendMessage怖い、専用アトリビュート作ったらどうだろう？【結局微妙】

# はじめに

はじめに断っておきますが、結論は微妙です。
SendMessage怖いですね！

# SendMessageというメソッド

SendMessageというメソッドがあります。

同じオブジェクトについている他のコンポーネントのメソッドを呼び出したり、あるgameObjectに付与されている任意のコンポーネントのメソッドを呼び出せます。

呼び出すためにメソッドの名前を文字列で指定します。こんな感じです。

```csharp:メッセージを受ける側
using UnityEngine;

public class Receiver : MonoBehaviour
{
	public void ReseiveMessage ()
	{
		Debug.Log ("receive");
	}
}
```

```csharp:メッセージを送る側
using UnityEngine;

public class Sender : MonoBehaviour
{
	[SerializeField]
	GameObject anotherReceiver;

	void Start ()
	{
		// (1) 同じGameObjectについている
		// ReceiverのReseiveMessageを呼び出す
		SendMessage ("ReseiveMessage"); 

		// (2) インスペクターから設定した、
		// anotherReceiverという名前のGameObject、
		// これについているReceiverクラスに送る
		anotherReceiver.SendMessage ("ReseiveMessage"); 
	}
}
```

"receive"って二回表示されると思います。

* [Component.SendMessage(1の例)](http://docs.unity3d.com/ScriptReference/Component.SendMessage.html)
* [GameObject.SendMessage(2の例)](http://docs.unity3d.com/ScriptReference/Component.SendMessage.html)


# SendMessage怖い

SendMessage、あまり書かないようにしています。めちゃめちゃ怖いです。

なぜ怖いか例を上げて説明します。先ほどのコードのReceiverクラス、ReseiveMessageってなっています。これ間違えていますね。きっと、ReceiveMessageとしたかったのでしょう(わざとですよ！)

さて、修正しましょう。ReceiverクラスのReseiveMessageというメソッドをReceiveMessageに直して、めでたしめでたし。とはなりません。

Senderクラスの呼び出し側も修正しなくてはいけません。いけないのですが、うっかり修正し忘れてしまうこともありますよね。
その場合、SendMessage経由のメソッドは呼ばれません。

メソッド名を変更する場合、IDEのリファクタリング機能を用いてそのメソッドを呼び出している箇所を一括で変更することが可能です。それを使わなくともメソッド名を変えた場合、コンパイルエラーになって、変わったメソッドを呼び出す箇所で「そんなメソッドないよ」とIDEが注意してくれます。注意されている箇所を直せばいいですね。

ところが、SendMessageなどのメソッド名を引数に渡している場合、その文字列がリファクタリング機能で変更されないし、コンパイルエラーにもならないため間違いに気づくことができません。

これは非常に怖いですね。


# とりあえずAttributeを作ってつけます？

さきほどの問題は、「このメソッドはSendMessage経由で呼ばれている」ということが伝われば、ある程度解決します。メソッド名を変更する際「このメソッド名を変えたら、SendMessage呼び出し箇所のメソッド名文字列も変えないと！」って気づけますから。

Attributeを作ってみます。

```csharp:
using System;

[AttributeUsage(AttributeTargets.Method)]
public class CalledFromSendMessageAttribute : Attribute { }
```

これをSendMessageメソッドで呼ばれるメソッドに付けます。

```csharp:
using UnityEngine;

public class Receiver : MonoBehaviour
{
	[CalledFromSendMessage]
	public void ReceiveMessage ()
	{
		Debug.Log ("receive");
	}
}
```

このようにすれば、Receiverクラスを読む人に「ReceiveMessageメソッドはSendMessage経由で呼ばれるから、メソッド名を変えたら気をつけないといけないな！」と伝えることが可能ですね。


# 実は落とし穴だらけ

先ほどのアトリビュートを使う方法。
これは、「ルールをチーム全体で徹底しないと不具合をふせげない」という大きい落とし穴があります。

例えば、新しく加わったメンバーが`CalledFromSendMessage`というアトリビュートがついても、その意味がわからずうっかりメソッド名を変えてしまうかもしれません。


例えば、うっかりSendMessage経由で呼ぶメソッドに、`CalledFromSendMessage `アトリビュートを付け忘れてしまうかもしれません。

それに送る側がメソッド名を打ち間違えることは、どうしようもできません。

先ほどの`CalledFromSendMessage`を作って運用することで、事故を防げることはあるかもしれませんが、事故を完全になくすことはできませんね。


# 結論
専用アトリビュートを作っても、微妙！

[RequireComponent](http://docs.unity3d.com/ScriptReference/RequireComponent.html)と[GetComponent<T>](http://docs.unity3d.com/ScriptReference/Component.GetComponent.html)メソッド使いましょう！

あとどっちにせよ、タイポは気をつけましょう。
あとSendMessageを受信できるコンポーネントが複数ある場合にも注意が必要。
git statusで表示されるtypechangeとは


``git status`` をしたときに、こんな表示がありました。

```shell-session
% git status
On branch master
Your branch is up-to-date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        typechange: foo/bar/baz/hoge.rb

no changes added to commit (use "git add" and/or "git commit -a")
```

ちなみに、 ``git status -sb`` を使っている場合、以下のようになります。

``` shell-session
% git st
## master...origin/master
 T foo/bar/baz/hoge.rb
```

[What does "T" mean in "git status"? (it isn't in the man page) - Stack Overflow](http://stackoverflow.com/questions/8691199/what-does-t-mean-in-git-status-it-isnt-in-the-man-page)

``man git-diff-files`` をみてみます。

``` shell-session
% man git-diff-files
…
       --diff-filter=[(A|C|D|M|R|T|U|X|B)...[*]]
           Select only files that are Added (A), Copied (C), Deleted (D), Modified (M), Renamed (R), have their type (i.e. regular file, symlink, submodule,
           ...) changed (T), are Unmerged (U), are Unknown (X), or have had their pairing Broken (B). Any combination of the filter characters (including none)
```

要は普通のファイルがシンボリックリンクになったり、同じファイル名で種類が変わるとtypechangeとなるようです。
Rails+Hamlで設定すべきHamlオプションまとめ

Rails+Hamlで開発を行なう場合、以下の2点の設定を検討すべきです。

```rb:config/initializers/haml.rb
Haml::Template.options[:attr_wrapper] = '"'  # タグの属性値を「"」で囲む（デフォルトは「'」）
Haml::Template.options[:ugly] = true         # インデント等の扱いを各環境下で統一する（後述）
```

## uglyオプションについて

uglyは、ひとことでいうとHaml→HTML変換時のインデント等の扱いを定めるオプションです。
ドキュメントには以下のようにあります。

> If set to true, Haml makes no attempt to properly indent or format the HTML output. This significantly improves rendering performance but makes viewing the source unpleasant.
> 
> Defaults to true in Rails production mode, and false everywhere else.

Railsのproduction環境ではugly: trueになるのですが、developmentではfalseです。
これは、production/development環境下でインデントの扱いが変わることを意味します。

なにが問題かというと、インデントの有無でデザイン上にスペースが表れたり表れなかったりします。
development上でSCSSでデザインしていても、productionに上げるとデザインが微妙に変わってしまいます。

なので、uglyオプションはdevelopment/production両方でtrueになるように設定することを検討した方がいいでしょう。

## 参考

- [Class: Haml::Options — Haml Documentation](http://haml.info/docs/yardoc/Haml/Options.html#autoclose-instance_method)
- [Tadas Tamošauskas : Why you should start using Haml's ugly mode in development today](https://coderwall.com/p/tashig)
Bashメモ

## mount
mount -t vboxsf -o uid=xxx,gid=xxx,dmode=0777,fmode=0777 name /dir/name

## prompt
export MYSQL_PS1="(\u@\h) [\d]> "
[git-prompt](https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh)
source ~/.git-prompt.sh
GIT_PS1_SHOWDIRTYSTATE=true
export PS1='\[\033[32m\]\u@\h\[\033[00m\] : \[\033[33m\]\W\[\033[31m\]$(__git_ps1)\[\033[00m\] \$ '

##Bash基礎##

参考資料[bash 超プログラム術](http://www.nurs.or.jp/~sug/soft/super/bash.htm)
###存在チェック###
>
-e | -a 存在チェック（whatever file or directory)
-f ファイル存在チェック
-d フォルダー存在チェック
例: [ファイルの存在を確認する方法](http://akitosblog.seesaa.net/article/185918359.html)

###サイズチェック
>
-s ファイルサイズ > 0

###文字列チェック
>
-n str  strがnullではない（長さが０より大きい）
-z str  strがnullである（長さが0）

###複数行入力
http://stackoverflow.com/questions/10969953/how-to-output-a-multiline-string-in-bash

>
cat << EOF
EOF
read -d '' help <<- EOF
EOF

下記のも参考できる
[Bashメモ](http://qiita.com/inouet/items/0de194f11865bc21dc0a)
[bash による初歩のプログラミングの続編](http://www.ibm.com/developerworks/jp/linux/library/l-bash2.html)
[Bash スクリプトを書くための小技集](http://iishikawa.s371.xrea.com/note/bash-script.html)

###実行ファイルのdirectory
echo $(cd $(dirname $0);pwd)
第23回オフラインリアルタイムどう書く「くねくね増加列」の実装例と若干の解題


* 問題 http://nabetani.sakura.ne.jp/hena/ord23snakemoinc/
* 解答リンク集 http://qiita.com/Nabetani/items/7ba11167ea28c929fcf2
* イベント http://yhpg.doorkeeper.jp/events/12339

## 計算量の少ない実装の例

まずは、問題作成用に書いたもの。

```ruby
# ruby 2.1.2p95
def solve(s)
  cells=["/"]*6+s.chars+["/"]*6 # "/" は番兵
  (?0..?9).each.with_object( {} ){ |digit, length|
    cells.size.times do |pos|
      next unless cells[pos]==digit
      neis=[-6,-1,1, 6]
        .map{ |d| d+pos }
        .flat_map{ |x|
          c=cells[x]
          /\d/===c && c < digit ? [length[x]] : []
        }
      length[pos] = ( neis + [0] ).max + 1
    end
  }.values.max.to_s
end

$stdout.sync=true
DATA.map do |line|
  num, src, exp = line.split(/\s+/)
  actual = solve( src )
  ok = actual==exp
  p [ num, src, exp, actual ] unless ok
  ok
end.all?{ |x| x }.tap{ |x| p x }

__END__
0 01224/82925/69076/32298/21065 6
1 03478/12569/03478/12569/03478 10
2 09900/28127/87036/76545/87650 10
50  02489/77571/84873/03879/84460 7

```

再帰しない動的計画法で、マス目の数字が小さいものから順に処理する。
`  cells=["/"]*6+s.chars+["/"]*6 # "/" は番兵`
とある部分は邪悪な感じだけど

* もともと入力にある `/` を左右の番兵として活かす。
* 上下に番兵がいないので、`["/"]*6` で追加する。

ということ。
`each_with_index` のなかの `times` のなかの `flat_map` のなかに `〜?〜:〜` があって、ちょっとよろしくない感じ。

## 計算量を気にしない実装の例

一方。
次にお見せするのは当日書いたもの。

```ruby
# ruby 2.1.2p95
def max_len( s, pos )
  cur = s[pos]
  cx, cy = pos.divmod 5
  neipos = [[-1,0],[1,0],[0,-1],[0,1]].map{ |dx,dy|
    x = cx+dx
    y = cy+dy
    (0...5)===x && (0...5)===y ? x*5+y : nil
  }.select{ |x| x && cur<s[x] }
  1+( neipos.map{ |x| max_len( s, x ) }.max || 0 )
end

def solve(s0)
  s = s0.scan( /\w/ ).to_a
  25.times.map{ |pos|
    max_len(s,pos)
  }.max.to_s
end

$stdout.sync=true
DATA.map do |line|
  num, src, exp = line.split(/\s+/)
  actual = solve( src )
  ok = actual==exp
  p [ num, src, exp, actual ] unless ok
  ok
end.all?{ |x| x }.tap{ |x| p x }

__END__
0 01224/82925/69076/32298/21065 6
1 03478/12569/03478/12569/03478 10
2 09900/28127/87036/76545/87650 10
50  02489/77571/84873/03879/84460 7
```

こちらは再帰呼び出しによる深さ優先探索。
メモ化も何もせずに全探索。

計算量のオーダーとしてはひどいものだと思うけど、5×5 とわかっているのでこれでよい。

`[ ].max` は nil なので、
`(array.max || 0)` は、array が空っぽなら 0、array の中身があったら最大値。
という計算になる。`||` は便利だね。

## 解題

前回( http://nabetani.sakura.ne.jp/hena/ord22irrpas/ )はメモ化つき再帰だったので、今回はメモ化つき再帰じゃない方の動的計画法 と思って出題したつもり。

今回の問題をメモ化つき再帰で書くことはできるし、前回の問題を メモ化つき再帰じゃない方の動的計画法 で書くこともできるけどね。

## 宣伝

CodeIQ にも、狭義単調増加列 にからめた問題を出してます。
https://codeiq.jp/ace/nabetani_takenori/q957
こちらもよろしく。
SwiftでObjective-Cのインスタンス生成メソッドobjectWithXXXの置き換え


# 内容

Objective-Cでインスタンスを生成する`objectWithXXX`のようなクラスメソッドはSwiftだと`Class(XXX:XXX)`となる。
これは自作クラスでも適用される模様。

# NSDateの例

`NSDate`の`dateWithTimeIntervalSince1970:`の場合、それぞれ以下のようなコードになる。


```Objective-C:Objective-C
NSDate * date = [NSDate dateWithTimeIntervalSince1970:0];
```

```Swift:Swift
let date:NSDate = NSDate(timeIntervalSince1970:0)
```


# 自作クラスの例

Objective-Cで自作したクラスのクラスメソッドでも同様の対応は行われる。
`TestClass`で`+(TestClass*)testClassWithData:(TestData*)data`を用意すると以下のようになる。

```Objective-C:Objective-C
TestClass * test = [TestClass testClassWithData:data];
```

```Swift:Swift
let test:TestClass = TestClass(data:data)
```
elscreen使用中にカレントバッファをkillすると入れ替わり先のバッファが別スクリーンで開いているバッファになってしまう問題への対処

# tl;dr

* 修正パッチを当てたelscreenを使えばOK
    * https://github.com/emacs-jp/elscreen
    * 基本的なパッチはこれ https://github.com/emacs-jp/elscreen/commit/39f0868d699e8d83eddd65522d9b28b463fdfbde


# 環境

* Xubuntu Linux 14.04
* Emacs 24.3+1-2ubuntu1 (Ubuntuレポジトリのもの)
* elscreen
    * 1.4.6-5.1 (Ubuntuレポジトリのもの)
    * emacs-jpのこのバージョン https://github.com/emacs-jp/elscreen/tree/d67ded50eb84580b7ad21d018111176ab8f3e120

# 問題

例えば、以下のようなスクリーン構成だったとする。現在開いているスクリーンは1番。

    [0- *scratch*] 
    [1+ a.txt] 

で、スクリーン1で`b.txt`を開く。

    [0- *scratch*]
    [1+ b.txt]

ここで、`kill-buffer`コマンドでカレントバッファ(`b.txt`)を閉じる。この時、`a.txt`が代わりに表示されることを期待するが、結果は

    [0- *scratch*]
    [1+ *scratch*]

こうなってしまう。

スクリーン0で`*scratch*`ではなく別のバッファを開いている場合、そのバッファに切り替わる。

また、スクリーンが1枚しかない場合、期待通り`a.txt`が表示される。

# 原因

elscreenは現在のスクリーン表示状況に合わせてタブやメニューを表示している。その表示を随時更新しているのが、`post-command-hook`に仕掛けられた`elscreen-run-screen-update-hook`関数である。

この関数が実行する関数の中でも、`elscreen-tab-update`関数および`elscreen-menu-bar-update`関数が悪さをしているせいで、上記の問題が発生している。

具体的には、上記の関数が中で呼び出している`elscreen-get-screen-to-name-alist`関数が"Window History"を書き換えるという副作用を持っているせいで、上記の問題が引き起こされたようだ。

最近のEmacsはウィンドウ毎に表示したバッファの履歴を管理しているらしい。これをWindow Historyという。

http://www.gnu.org/software/emacs/manual/html_node/elisp/Window-History.html

`kill-buffer`や`bury-buffer`でカレントバッファを非表示にした場合、次に表示するバッファはWindow Historyを元に決定されるとのこと。 なので、`elscreen-get-screen-to-name-alist`がWindow Historyを書き換えると`kill-buffer`時の挙動が変化してしまう。

`elscreen-get-screen-to-name-alist`関数は中で`elscreen-save-screen-excursion`マクロを使って副作用をキャンセルしようとしている。 そこで、このマクロを書き換えて、Window Historyを復元してやればよい。
jMockit 1.9にしたらえらく変わってた

jMockit0.x系から、jMockit1.9に乗り換えようと思ったら、以下のような記述でコケる

```java
@MockClass(realClass=Hoge.class) // MockClassアノテーション廃止されてるせいで、コンパイラーさんがOKOKO
public class HogeMock {
}
```
```java
Mockit.setUpMock(HogeMock.class); // ここでいねーよってコンパイラーさんがOKOKO

new Expectations() {
    Fuga fuga;  // これではMock化してくれないっぽい？
    {
        this.fuga = new Fuga(); // 動かすとMockじゃないってJVMがOKOKO
    }
};
```

どうやら、基本的にMockUp使えってことらしくて、Expectitionsはテストクラスのフィールドやメソッドの引数にMockedアノテーション付ける以外にはダメっぽそう。

TestNG+jMockit+EclEmmaな環境だと、EclEmma2.3.1とかにしてしまうだけで、jMockitとぶつかって、テストの起動でコケてくれるので、jMockitのバージョンを上げるか、EclEmmaを2.2系に戻すほかないけど、Java8対応とかするにはEclEmma2.3.1にしないとダメなので、jMockitをバージョンアップするしかないという…
まぁ、今どきJava6って、いい加減にやばいんじゃない？セキュリティとかセキュリティとかセキュリティとかセキュリティとか...大事すぎることなので、4回言いました。
EloquentでPrimary KeyをComposite keyで指定した場合の問題

LaravelのOR MapperであるところのEloquentでは以下のようにPrimary Keyを指定できる。

```php
protected $primaryKey = ['foo_id', 'bar'];
```

ところが、SeederとかでModel::createとかでデータを突っ込もうとすると以下の様なエラーに出会うことがある。

```
PDO::lastInsertId() expects parameter 1 to be string, array given
```

[Laravel seed table with composite primary key](http://stackoverflow.com/questions/24152048/laravel-seed-table-with-composite-primary-key)によれば、"Eloquent does not support composite keys"だそうで、以下のようにやればとりあえずエラーは回避できる。

```php
$data = [
          [
                'foo_id' =>1,
                'bar'    =>'abc',
          ],
          [
                'foo_id' =>2,
                'bar'    =>'def',
          ]
        ];
DB::table('tablename')->insert($data);
```

ただしこれだとテーブル名をかなかくちゃいけないので嫌な感じなので、モデルクラスから名前を取りたい。モデルから名前を取る方法として"[Can't get Eloquent model's table name without an instance of the model](https://github.com/laravel/framework/issues/1436)"を読むと、`getTable`というメソッドがあるが、インスタンスメソッドなのでインスタンスを生成しないと取得できない。こうすれば取れるけどイケてない感じがあって

```php
$table = with(new Model)->getTable();
```

以下の様な方法が書かれている。クラスメソッドつくる。結局は一旦オブジェクト生成してるのであんまり変わらないんだけど、とりあえず。

```php
class BaseModel extends Eloquent {
    public static function getTableName()
    {
        return with(new static)->getTable();
    }
}

class User extends BaseModel {
}

User::getTableName();
```
Docker上でCentOSを動かす


![docker_logo.png](https://qiita-image-store.s3.amazonaws.com/0/45249/63102bca-140a-25bb-0f49-c1971bd50b0d.png "docker_logo.png")

CoreOSのDocker上でCentOSを動かしてみる。
CoreOS環境の準備については[こちら](http://qiita.com/mattuso/items/64bd747ec16f70ea988f)。

## 環境について

Docker: 1.0.0
CoreOS: 353.0.0

なお、CoreOSのバージョンは`/etc/os-release`に記載してある。

```
core@core-01 ~ $ cat /etc/os-release

NAME=CoreOS
ID=coreos
VERSION=353.0.0
VERSION_ID=353.0.0
BUILD_ID=
PRETTY_NAME="CoreOS 353.0.0"
ANSI_COLOR="1;32"
HOME_URL="https://coreos.com/"
BUG_REPORT_URL="https://github.com/coreos/bugs/issues"
```

## Docker Image の取得

`docker pull`コマンドでimageを取得する。
今回はCentOSの最新バージョンを取得している。

```bash
core@core-01 ~ $ docker pull centos:latest

Pulling repository centos
0c752394b855: Download complete
511136ea3c5a: Download complete
34e94e67e63a: Download complete
```

取得したイメージは`docker images`コマンドで確認できる。

```bash
core@core-01 ~ $ docker images

REPOSITORY     TAG            IMAGE ID       CREATED        VIRTUAL SIZE
centos         latest         0c752394b855   3 weeks ago    124.1 MB
```

## コンテナ（仮想マシン）を起動する

取得したコンテナは`docker run`コマンドで起動する。

```bash
core@core-01 ~ $ docker run centos /bin/echo ok

ok
```
これは「 *centos* というコンテナで `/bin/echo ok` というコマンドを実行する」という意味になる。

今度は起動したコンテナの中に入るために、-i と -t オプションで入出力できるようにして /bin/bash を起動する。

```bash
core@core-01 ~ $ docker run -i -t centos /bin/bash

bash-4.1# exit
```

exitで抜けるとコンテナは終了する。

今度は -d オプションでコマンドを実行したままにする。

```bash
core@core-01 ~ $ docker run -i -t -d centos /bin/bash

330ec265ad9dcb22ef21d1cf63470d07ef39907bdd759fb2a8e0c1a6350ea0c3
```

起動しているコンテナは`docker ps`コマンドで確認できる。

```bash
core@core-01 ~ $ docker ps

CONTAINER ID  IMAGE          COMMAND    CREATED         STATUS         PORTS  NAMES
330ec265ad9d  centos:latest  /bin/bash  42 seconds ago  Up 41 seconds         lonely_rosalind
```

コンテナの操作を行うときは "CONTAINER ID" か "NAMES" で行うが、"NAMES"は指定がない場合にはランダムに設定される。
指定したい場合には`--name="<コンテナ名>"`オプションが必要。

## コンテナに接続する

コンテナに接続するには`docker attach`コマンドを使用する。

```bash
core@core-01 ~ $ docker attach 330ec265ad9d

bash-4.1#
```

接続したコンテナから抜けるには`ctl+p``ctl+q`を押す。
※`exit`すると終了する。

## コンテナを削除する

実行中のコンテナを削除する場合には`docker kill`コマンドを使用する。

```bash
core@core-01 ~ $ docker kill 330ec265ad9d

330ec265ad9d
```

`docker ps`コマンドで確認してみる。

```bash
core@core-01 ~ $ docker ps

CONTAINER ID  IMAGE          COMMAND    CREATED         STATUS         PORTS  NAMES
```

起動されているコンテナがいなくなっているから削除されたっぽい。

次は`docker commit`などをやってみることにする。
[baserCMS]DB設定ファイルを環境別に用意しなくて済む方法


baserCMSのインストール時に生成される database.php にはDBへの接続設定が記載されます。
環境別にファイルを用意しても良いけれども、どうせなら git や subversion に入れちゃってひとつのファイルで済ませたい！という方のためへ。

## サーバ環境から判断して接続内容を切り替えさせる
サーバの「HTTP_HOST」の値で設定内容を書換えるやり方があります。

### 本番環境への影響を少なくするため
デフォルトの接続情報を本番環境用とし、開発環境、ステージング環境（デモ環境）は個別に切り分けるように記述すると良いです。

```php:database.php
<?php
//
// Database Configuration File created by baserCMS Installation
//
class DATABASE_CONFIG {
public $baser = array(
	'datasource' => 'Database/BcMysql',
	'persistent' => false,
	'host' => 'localhost',
	'port' => '3306',
	'login' => 'ACCOUNT',
	'password' => 'PASSWORD',
	'database' => 'DB_NAME',
	'schema' => '',
	'prefix' => 'mysite_',
	'encoding' => 'utf8'
);
public $plugin = array(
	'datasource' => 'Database/BcMysql',
	'persistent' => false,
	'host' => 'localhost',
	'port' => '3306',
	'login' => 'ACCOUNT',
	'password' => 'PASSWORD',
	'database' => 'DB_NAME',
	'schema' => '',
	'prefix' => 'mysite_pg_',
	'encoding' => 'utf8'
);
	
	public function __construct() {
		// Staging
		if (strpos($_SERVER['HTTP_HOST'], '.STG_HOST_NAME') !== false) {
			$this->baser['host'] = 'localhost';
			$this->baser['login'] = 'ACCOUNT';
			$this->baser['password'] = 'PASSWORD';
			$this->baser['database'] = 'DB_NAME';

			$this->plugin['host'] = 'localhost';
			$this->plugin['login'] = 'ACCOUNT';
			$this->plugin['password'] = 'PASSWORD';
			$this->plugin['database'] = 'DB_NAME';
		}
		// Develop
		if (strpos($_SERVER['HTTP_HOST'], '.DEV_HOST_NAME') !== false) {
			$this->baser['host'] = 'localhost';
			$this->baser['login'] = 'ACCOUNT';
			$this->baser['password'] = 'PASSWORD';
			$this->baser['database'] = 'DB_NAME';

			$this->plugin['host'] = 'localhost';
			$this->plugin['login'] = 'ACCOUNT';
			$this->plugin['password'] = 'PASSWORD';
			$this->plugin['database'] = 'DB_NAME';
		}
	}
	
}
```

HTTP_HOSTで分岐させることで幾つも設定を持たせておくことができますね。
HTTP_HOST自体は phpinfo() とかで確認すると良いです。

SQLiteの場合とかでも使えるんじゃないでしょかね。

## 参考情報
- [SERVER_NAMEとHTTP_HOSTの違い:phpspot開発日誌](http://phpspot.org/blog/archives/2006/05/server_namehttp.html)
[baserCMS]フォームへのURLをSSLのリンクにする


こんな場面で使える小技。

* フォームへのリンクをSSLにしたいけど、デモ環境やステージング環境でも同じソースを使いたいとき

```php
<?php
$linkOptions = array();
if ($_SERVER['SERVER_NAME'] == 'DOMAIN' || $_SERVER['SERVER_NAME'] == 'www.DOMAIN') {
	$linkOptions = array('ssl' => true);
}
?>
<?php $this->BcBaser->link('お問い合わせ', '/contact/', $linkOptions) ?>
```

## 付随情報
### baserCMSでフォームをSSL稼働させる方法

* 「システム設定」でSSL URLを設定する
 * /admin/site_configs/form

* メールフォーム設定の「SSL通信」を「利用する」に設定する
 * /admin/mail/mail_contents/edit/ID


また、テーマ（ビュー）側でのリンク表記には baser関数を利用する。

#### なぜ？
こんなリンクがあって、テーマ内でそのまま書いてる場合、SSL領域内でも相対移動となりSSL環境内での移動となってしまうから。

```HTML
<a href="/about/">HOGE</a>
```

このように関数を利用しましょう。

```php
<?php $this->BcBaser->link('HOGE', '/about/') ?>
```

こうすることで、SSL領域外へ移動する際に自動で絶対パスに書換えてくれて便利ですよ。
Docker v1.1.0 の rpm を作る

Docker v1.1.0 がリリースされましたが、まだ（2014/07/06 02:20現在） EPEL の rpm は v1.0.0 です。
なので、EPEL の SRPM をいじって v1.1.0 の rpm を作れるようにしてみました。
いずれ EPEL の rpm も v1.1.0 になると思いますので、それまで待った方がよいと思います。
EPEL の独自パッチなどを適当にごにょごにょしているので、動作保証はできませんが、自己責任で試したい方はどうぞ。

## 準備

依存関係ものをインストールする必要がありますが、 golang 関係で EPEL にもないものが必要になるため、適当に Fedora 用のを使ってビルドしました。

```
sudo yum install rpmdevtools
sudo yum install glibc-static pandoc device-mapper-devel
sudo yum install golang-github-godbus-dbus-devel
sudo yum install golang-googlecode-sqlite-devel
sudo rpm -Uvh ftp://fr2.rpmfind.net/linux/fedora/linux/development/rawhide/x86_64/os/Packages/g/golang-googlecode-net-devel-0-0.14.hg84a4013f96e0.fc21.noarch.rpm
sudo rpm -Uvh ftp://fr2.rpmfind.net/linux/fedora/linux/development/rawhide/x86_64/os/Packages/g/golang-github-gorilla-context-devel-0-0.24.gitb06ed15.fc21.noarch.rpm
sudo rpm -Uvh ftp://fr2.rpmfind.net/linux/fedora/linux/development/rawhide/x86_64/os/Packages/g/golang-github-gorilla-mux-devel-0-0.14.git136d54f.fc21.noarch.rpm
sudo rpm -Uvh ftp://fr2.rpmfind.net/linux/epel/6/x86_64/golang-github-kr-pty-devel-0-0.15.git3b1f648.el6.x86_64.rpm
sudo rpm -Uvh ftp://fr2.rpmfind.net/linux/fedora/linux/development/rawhide/x86_64/os/Packages/g/golang-github-kr-pty-devel-0-0.20.git67e2db2.fc21.noarch.rpm
sudo rpm -Uvh ftp://fr2.rpmfind.net/linux/fedora/linux/development/rawhide/x86_64/os/Packages/g/golang-github-coreos-go-systemd-devel-2-1.fc21.noarch.rpm
sudo rpm -Uvh ftp://fr2.rpmfind.net/linux/fedora/linux/development/rawhide/x86_64/os/Packages/g/golang-github-syndtr-gocapability-devel-0-0.7.git3c85049.fc21.noarch.rpm
```

## 手順

1. ``rpmdev-setuptree``
2. ``cd ~``
3. ``rm -rf rpmbuild``
4. ``git clone -b v1.1.0 https://github.com/comutt/docker-SRPM.git rpmbuild``
5. ``cd rpmbuild``
6. ``rpmbuild -bb SPECS/docker-io.spec``
7. ``sudo rpm -Uvh RPMS/x86_64/docker-io-1.1.0-1.el6.x86_64.rpm``
8. ``sudo /etc/init.d/docker restart``
ag(The Silver Searcher)で検索しpecoで更に絞り込みvimで該当行を開く

![agvim.mp4.gif](https://qiita-image-store.s3.amazonaws.com/0/5391/5c56756d-5d67-14a8-e104-09882b921aaa.gif)


# 環境
 - zsh
 - [ag(The Silver Searcher)](https://github.com/ggreer/the_silver_searcher)
 - [peco](https://github.com/peco/peco)
 
# 設定
```zsh:zshrc
function agvim () {
  vim $(ag $@ | peco --query "$LBUFFER" | awk -F : '{print "-c " $2 " " $1}')
}
```

# 使い方
```
agvim 検索文字
```
で検索し、pecoの画面で選択しenter
# agのほかに
[pt(The Platinum Searcher)](https://github.com/monochromegane/the_platinum_searcher)や`git grep`を使いたい場合は`ag $@`の部分を`pt $@`や`git grep -n $@`とすればOK
[baserCMS]CPIサーバへのインストール留意点


~~通常状態のままインストールすると文字化け地獄に入るので以下に注意する。~~
DBがUTF8になったから気にしなくて良いです。
※数年前に契約したとか古いサーバだと注意（2017/07 時点）

## php.ini を作成して以下に配置する（必須ではない）
■ /conf/php.ini
　→ 公開側ドキュメントルート（/html/）の上の階層に設置する
　→ /conf/ ディレクトリは必要であれば作成する

```php.ini
post_max_size = 128M
upload_max_filesize = 100M
```

■ 以下は必要であれば追記

```php.ini
register_globals = Off
magic_quotes_gpc = Off
```

```php.ini
date.timezone = 'Asia/Tokyo'
```

※以下は、DBがUTF8になったので気にしなくて良いです。古いときは使いましょう。

```php.ini
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = pass
mbstring.http_output = pass
mbstring.input_encoding = pass
mbstring.output_encoding = pass
mbstring.substitute_character = none
```


## .htaccess に追記する
■ /.htaccess と /app/webroot/.htaccess に追記する

Rewriteを有効にするには .htaccess に Options +FollowSymLinks を追記する必要があります。
※ Options +FollowSymLinks の記述がないと Internal Server Error で残念

```.htaccess
AddHandler x-httpd-php5630 .php
suPHP_ConfigPath /usr/home/ACOUNT_NAME/conf/php.ini
Options +SymLinksIfOwnerMatch
```

### マネージドプラン、CHMシリーズなどは記述する内容が変更

FollowSymLinksの記述だとInternal server error。
http://chmz.document.secure.jp/other/Tips-htaccess/

```
Options +FollowSymLinks
　　↓
Options +SymLinksIfOwnerMatch
```

※2015年9月以降に契約したCPI共有サーバーの場合は以下

```.htaccess
Options +FollowSymLinks
```

■ PHPを5.3で動かしたい場合は以下を記載
※2015/06/22 時点: 利用できるphpのデフォルトは5.5.16です。

```.htaccess
AddHandler x-httpd-php536 .php
```

- PHPのご利用について | PHP | Online Help for ControlPanel http://acesr.document.secure.ne.jp/tools/php/


## MySQL：DBの文字コード照合順序を変更する
■ 必要であれば utf8_general_ci に変更する


## インストール時
■ DBの接続先が「localhost」では繋がらない場合は以下に変更する
　→ 127.0.0.1


## パーミッション関連
■ index.html と index.php が共存している場合
　→ index.html に対して 755 を与える
■ PHPファイル
　・604 or 644
■ PHPファイルが含まれるディレクトリの場合
　・705 or 755

※ 上記以外の場合は500エラー（Internal Server Error）となる


## 付随情報
以下はbaserCMSを利用する際に、併せて利用する場面が多そうなこと。


### .htaccess によるSSLへのリダイレクト対応

CPIサーバでは RewriteCond %{HTTPS} なんとか が有効にならないため、ポート番号で判別する。
http://wataame.sumomo.ne.jp/archives/5121

```
# フォームへのアクセスを HTTPS へリダイレクト
RewriteCond %{SERVER_PORT} ^80
RewriteCond %{REQUEST_URI} ^(/contact/|/inquiry).*$
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
```


### CPIでの html を php として実行する方法
AddHandler に拡張子を追記する。

```.htaccess
AddHandler x-httpd-php5630 .php .html .htm
```

■ phpが5.5の場合 => 2015/06/22 時点: 未確認
■ phpが5.3の場合

```.htaccess
AddHandler x-httpd-php536 .php .html .htm
```


### Basic認証用パスワード生成
CPIではパスワードの暗号化形式が違うため、自分でパスワードを生成する。
Terminal を開いて以下のコマンドでパスワードを生成する。

```Terminal
$ htpasswd -nbm USER_NAME PASSWORD
```

```htaccess
<Files ~ "^\.(htaccess|htpasswd)$">
deny from all
</Files>
AuthUserFile /home/ACOUNT_NAME/html/.htpasswd
AuthGroupFile /dev/null
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user
order deny,allow
```

> ※POINT
AuthUserFile に記載するパスは DOCUMENT_ROOT のパスに当たるが、頭の /usr は削除する
UnityでAndroidビルドエラー

<B>7/28追記  Unity4.5.2で以下の問題は対応されました。
それ以前のバージョンを使用している場合のみの対処法となります。</B>

# 1. 概要
  最近Android SDKを更新したり、新規インストールしてからビルドすると
ビルドエラーで実機転送が出来なくなったという話をチラホラ聞くようになったので
それの対処案の備忘録。
（この話、ADT 22になった時もあったよなぁ…）


# 2. 原因
  <blockquote class="twitter-tweet" lang="en"><p>とりあえず、最新のAndroidSDK(ADT 23)でUnityビルドこけるのはSDK/tools/zipalign.exeをUnityが参照してたけどそれがなくなったのでエラーはいてた。</p>&mdash; リラ@考える黒いクマさん (@relzx) <a href="https://twitter.com/relzx/statuses/483815897950191616">July 1, 2014</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


# 3. 対策
<B>7/7追記  最新のSDKフォルダ内のbuild-tools\android-4.4Wに
zipalign.exe が移動していたのでそちらから持ってくるのが一番早そうです。</B>

以下以前の情報…
  さて、対策として一番手っ取り早いのは更新前のr22のtoolsフォルダからzipalign.exeを持ってくれば
良いのですが、かなり難しいので以下のリンクからr22のzipを落としてきてその中のtoolsフォルダ内の
zipalign.exe をコピーしちゃいましょう。

【Win版のAndroid SDK r22パス】
http://dl.google.com/android/android-sdk_r22-windows.zip

【Mac版のAndroid SDK r22パス】
http://dl.google.com/android/android-sdk_r22-macosx.zip


# 4.そもそも…
<blockquote class="twitter-tweet" lang="en"><p>Unity4.5からModuleManager入ってその辺り対応出来るようになったはずだけど、今のところ更新は来てない。さてさて…</p>&mdash; リラ@考える黒いクマさん (@relzx) <a href="https://twitter.com/relzx/statuses/483816167002226688">July 1, 2014</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

Unity 4.5からSDKが頻繁に更新されるものについてはモジュール化して、アプリ本体をアップデートしなくても
アドオン更新だけで済む仕組みが追加されました。
【参考リンク】
・本家ブログ(英語)
  http://blogs.unity3d.com/2014/05/27/module-manager-in-4-5/
・日本語での解説記事(8.の項目)
  http://terasur.blog.fc2.com/blog-entry-795.html

でも実際は…
公式フォーラムにて4.5.2としてリリースされる告知がなされているようで？
http://forum.unity3d.com/threads/unity-patch-releases.246198/


うーん、個人的には新機能お披露目かと思ってたのでガッカリ…。

以上です。
【解決方法不明】Elasticsearchで2階層以上のAggregationを投げ続けると、落ちる

Groovyでバッチ処理をしている最中に遭遇。

原因も解決方法もあまり突き詰めて調べてはいないですが、とりあえずメモ程度に残しておきます。

Aggregationの返すべき結果行数が多く、一度に返せない場合にはページング処理のようなことをしなければならず、連続してクエリを投げ続けることになりますが、その際には気をつけたほうがいいと思います。

連続してクエリを投げ続けていると、前触れなくクラスタの一部のノードのCPU使用率が100%に張り付いて、<code>No node available Exception</code>が発生してしまいます。

その後は1時間ほど待ってみましたが、結局、手動で再起動するまではElasticsearchへの接続はできませんでした。

解決方法は不明なので、ElasticSearchが落ちた場合、バッチ側でElasticsearchが再起動するまで待機するようにして処理しました。
ビルドインサーバーに他のPCからアクセスできない


開発中はビルドインサーバーを立ち上げている。

```php
$ php artisan serve
```

デフォルトの起動では外部ネットワークからアクセスできず、デバッグできなかったりする。
（IEでのチェックとか）

以下のようにすれば外部から接続できる

```php
$ php artisan serve --host 0.0.0.0
```
Secrosで機密情報を一括管理

プロジェクトをデプロイする際、機密情報をどのように管理するかは重要ですね。[Secros](https://github.com/pandora2000/secros)というgemを使えば機密情報を一箇所に集めて必要なメンバーにのみアクセスさせることが出来ます。

# 機密情報用のプロジェクトの作成

[Secros](https://github.com/pandora2000/secros)は、機密情報用のディレクトリのテンプレートをコマンドラインから生成できます

```bash
$ secros my_secret_dir
$ cat my_secret_dir/secrets.yml
values:
files:
```

`secrets.yml`というファイルと、`files`というディレクトリが出来ます。例えば以下のように`secrets.yml`を編集して、

```yaml
values:
  aws_secret_key: abcdefg1234567
files:
  ssh_key: id_rsa
```

`files`の配下に`id_rsa`を配置します。この様にすることで機密情報を文字列かファイルの形で集約することが出来ます

#機密情報にアクセス

Rubyからは以下のように上記の機密情報にアクセス出来ます。

```rb
Secros.new('my_secret_dir').values[:aws_secret_key] # == 'abcdefg1234567'
Secros.new('my_secret_dir').files[:ssh_key] # == 'my_secret_dir/files/id_rsa'
```
Rails3.2にTurnip Capybara Poltergeistを導入してみる

## 前提条件
OS X 10.9.3

### Rails3.2にシンプルなBDD環境を整えてみたので備忘録

poltergeist では phantomjs が必要になるようなので brew でインストール

```lang:shell
$ brew install phantomjs
```

Rspecは、２系を選択

```lang:Gemfile
group :development, :test do
  gem 'rspec-rails', '2.14'
  gem 'capybara'
  gem "poltergeist"
  gem 'turnip'
end
```

gem を bundle install して、rspecの初期化を実行する。
feature ファイルと Steps ファイル用のディレクトリを作成

```lang:shell
$ bundle install --path vendor/bundler
$ bundle exec rails generate rspec:install
$ mkdir features
$ mkdir steps
```

.rspec に、パラメーターを追加

```lang:.rspec
-r turnip/rspec
```

spec_helper.rb の "RSpec.configure do |config|"の前あたりに Turnip 関連のファイルをロード

```lang:spec/spec_helper.rb
# Turnip settings
Dir.glob("spec/**/*steps.rb") { |f| load f, true }

require 'capybara/dsl'
require 'capybara/rspec'
require 'capybara/poltergeist'
require 'turnip'
require 'turnip/capybara’

# web driver
Capybara.register_driver :poltergeist_debug do |app|
  Capybara::Poltergeist::Driver.new(app, :inspector => true)
end
```

テストファイルが hogehoge.feature であればテストの実行コマンドは以下のように

```lang:
$ bundle exec rspec -r turnip/rspec spec/features/hogehoge.feature
```

Driverに poltergeist を使う場合は、使いたい箇所で　current driver に設定する

```lang:hogehoge_steps.rb
# encoding: utf-8
Capybara.current_driver = :poltergeist_debug

step 'there is a monster' do
  visit '/monsters'
  page.driver.save_screenshot('/your/evidence/ss_00001.png')
end
```
サムネイルがlightbox系のプラグインで拡大されない時に

## 状況
　Easy Fancyboxなどのプラグインを入れても、ちゃんと拡大されない。困った。

## 原因
　サムネイルの出力を単純化し過ぎている可能性がある。例えば、以下のような書き方。

```lang:example-before.php
  <?php the_post_thumbnail('large'); ?>
```

　これでは、<img>タグ内の属性を細かく指定できない。
## 解決策
　とりあえず、出力することをやめて、画像へのパスを変数として取得することを考える。このために、the_post_thumbnail関数の使用から、get_post_thumbnail_id関数の使用に変更する。
　変数として取得した後は、それぞれの必要な所で出力すればいい。下の例では、jQueryプラグインのlightboxに合わせた書き方をしている。
　ちなみに、jQueryプラグインではなく、WordPressプラグインのEasy Fancyboxをする際に、data-lightbox="<?php echo $image[0]; ?>"を取り除いてしまうと、上手く表示されないという現象が起こった。Easy Fancyboxは、Lightboxの対抗馬であるFancyboxに依存しているはずなのだが…。

```lang:example-after.php
  <?php $image = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'full' ); ?>
  <a href="<?php echo $image[0]; ?>" data-lightbox="<?php echo $image[0]; ?>" title="<?php the_title(); ?>">
  <img src="<?php echo $image[0]; ?>" alt="<?php the_title(); ?>" />
  </a>
```

## 参考

[ jquery - Open div inside a custom post-type with Fancybox - WordPress Development Stack Exchange](http://wordpress.stackexchange.com/questions/29887/open-div-inside-a-custom-post-type-with-fancybox)

[Lightbox](http://lokeshdhakar.com/projects/lightbox2/)