OmniAICreator/Qiita-1.07M huggingface dataset:
[Unity][C#]遅延評価

```csharp
public class Main : MonoBehaviour {
    
    void Start() {
        Hoge();
    }

    void Hoge() {
        StartCoroutine(CoHoge());
    }

    IEnumerator CoHoge() {
        Debug.Log("1");
        yield return 0;

        // 以降は1フレーム後に実行される
        Debug.Log("2");
        yield break;

        // 以降は実行されない
        Debug.Log("3");
    }

}
```
[MAMP]Apacheが起動しないときの手順



Apacheを再起動しようとしても、起動しない。。。

Apacheが起動しない原因は主に3つ。


####①ポート番号競合
####②モジュールエラー
####③設定ファイルの書き間違え


らしい。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10112045530

というわけで、しらみつぶしにいきます。

##①ポート番号の競合

WindowsではよくSkypeがポート80を占有してApacheが起動しないなんてことがあるらしいです。Macでの調べ方はターミナルで

```
$ lsof -i :80
```
を実行。(LISTEN)となっているプロセスがポートを読んでいます。
プロセスを削除するには、

```
$ open /Applications/Utilities/Activity\ Monitor.app
```

で、アクティビティモニターというアプリケーションを開きます。

![Screen Shot 2014-06-10 at 9.11.23 AM.png](https://qiita-image-store.s3.amazonaws.com/0/6702/8118e2d4-3a49-874b-6ae5-9d40f7fa1b50.png "Screen Shot 2014-06-10 at 9.11.23 AM.png")

指定したプロセスを終了するをクリックすれば、プロセスを終了できます。

あるいはコマンドラインから

```
$ kill プロセス番号
```
で終了可能です。


##②モジュールエラー

モジュールエラーを調べるためにはエラーログをみます。

```
$ vim /Applications/MAMP/logs/apache_error.log
```

を開いて、
`[error]`
となっている内容を参照してください。

##③設定ファイルの書き間違え

httpd.confや、その参照のconfファイルの構文に誤りが合る場合があります。

###①Syntaxエラー
　コメントアウトがコメントアウトされてない
###②Includeの参照先に指定ファイルがない。
　ファイル名の誤り。ディレクトリパスの誤り


が主な原因です。
MAMPのAcache構文チェック方法を調べたのですが、よくわからなかったので、
Macのデフォルトのapacheで強制的に調べます。笑

```
$ cd /etc/apache2/
$ sudo mkdir tmp
$ sudo mv httpd.conf /tmp
$ sudo cp /Applications/MAMP/conf/apache/httpd.conf
```

でデフォルトのhttpd.confを一旦避難させて、次にMAMPのhttpd.confを移動。
etcの編集はsudoで。

つぎに、apacheの構文をチェック。

```
$ apachectl configtest
Syntax error on line 120 of /Applications/MAMP/conf/apache/extra/httpd-ssl.conf
```

とかが出たらビンゴ。所定の箇所をチェックしましょう。
いくらリロードしてもCSSが更新されないときの対処法

## はじめに
* こんなん知ってるぜ！という人はたくさんいると思いますが、今日まで僕知らなくて「なんで？？」となったので書き残しておきます

## こんなときにやってみてください
* CSSが変更されているはずだが、ブラウザをリロードしたり再起動をしても古いスタイルがあたってしまうとき
* ちなみに、以下のような状況の場合です
 * サイト(サーバ)側のコードは新しくなっている
 * ページのソースを表示やFirebugsなどで見てみて、取得しているCSSが明らかに古いとき

## 対応

#### Windows環境

* Internet Explorer, GoogleChrome, Firefox共通
 * Ctrlキーを押しながらF5

#### Mac環境

* Safari
 * Command + R
* Firefox
 * Command + Shift + R
* Chrome
 * Command + R

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
npmがsudoでしか実行出来ない時の対処方

## 対処方
<pre>
$ sudo chown -R `whoami` /usr/local/lib/node_modules
</pre>

## 追記
* /home/ユーザ/tmpがrootで作成されている場合もエラーになるので，こちらも変更．

<pre>
$ sudo chown -R `whoami`  /home/`whoami`/tmp
</pre>
画像の読み込み


[サンプル](http://jsdo.it/matsui_q/AopZ)

#流れ
##1.LoadQueueインスタンスを作成
new LoadQueue(XMLHttpRequestの使用)

##2.ファイルの読込み後、呼び出す関数を決める
LoadQueueオブジェクト.addEventListener(イベント, リスナー関数)


##3.LoadQueueインスタンスに外部ファイルを読込む
LoadQueueオブジェクト.loadFile(読込みファイルのURL)

##まとめ
```
var file = "http://jsrun.it/assets/o/m/W/t/omWtt.jpg";
function initialize() {
    //1.LoadQueueインスタンスを作成
    var loader = new createjs.LoadQueue(false);
　　//2.ファイルの読込み後、呼び出す関数を決める
    loader.addEventListener("fileload", draw);
　　//3.LoadQueueインスタンスに外部ファイルを読込む
    loader.loadFile({src:file, data:myBitmap});
}
function draw(eventObject) {
	stage.update();
}
~~~

##位置調整を追加

~~~
function initialize() {
　　//Canvasの中央値を渡す
　　var myBitmap = new createjs.Bitmap(file);
　　myBitmap.x = canvasElement.width / 2;
　　myBitmap.y = canvasElement.height / 2;
}

function draw(eventObject) {
　　//画像の基準点を真ん中に設定
　　var instance = eventObject.item.data;
　　var myImage = eventObject.result;
　　instance.regX = myImage.width / 2;
　　instance.regY = myImage.height / 2;
}
~~~
CMakeのin-sourceとouf-of-sourceの違い


かなり勘違いしていたので，メモ．

## ディレクトリ構成（仮想）

```bash:パッケージ展開例
$ tar xzvf foo.tar.gz
$ cd foo
$ ls
CMakeLists.txt src/
```

## in-sourceのbuild方法

```bash:これはin-source
$ pwd
foo
$ ls
CMakeLists.txt src/
$ mkdir build
$ ls
CMakeLists.txt src/ build/
$ cd build
$ cmake ..
```

build directoryが`foo/`の中にある．

## out-of-sourceのbuild方法

```bash:これはout-of-source
$ pwd
foo
$ ls
CMakeLists.txt src/
$ mkdir ../build
$ ls
CMakeLists.txt src/
$ cd ../build
$ cmake ../foo
```

## summary

source treeは`foo/`以下全体．`foo/src/`では **ない** ．

- だから`foo/build`をbuild directoryにするとin-source．`foo/`以下なら，どこでもin-source．
- だから`foo/../build`をbuild directoryにするとout-of-source．`foo/`以下でなければ，どこでもout-of-source．
レプリケーションを始める


mysql 5.6 でやった。


## 1. Master に repl ユーザーを作成する 
以下の例では、repl ユーザーが192.168.1.1 ~ 254 からレプリケーション用の接続をできるようにしている。
レプリケーションなので、`ON *.*` で全データベース、全テーブルに対して許可している。

```MySQL
GRANT REPLICATION SLAVE 
  ON *.* 
  TO 'repl'@'192.168.1.0/255.255.255.0' 
IDENTIFIED BY 'xxxxx'
```

## 2. MySQL サーバの設定を変更する
Master に server-id と、bin_log の設定をする

```my.cnf
# Master
server-id = 10 
log_bin = /var/log/mysql/mysql-bin.log
```

Slave には Master とは違う server-id を設定する。
\# server-id はサーバ間で重複しないように設定する

```my.cnf
# Slave
server-id = 11
```

その後 Master、Slave 共に再起動する `service mysql restart`



## 3. Slave で CHANGE MASTER TO 〜 する
Slave に Master の場所を教える。 MASTER_LOG_FILE や MASTER_LOG_POS は、
mysqldump に含めるので、ここでは指定しない。

**※ Master_Log_File、Read_Master_Log_Pos が mysqldump から設定されるので、
dump を入れる前に実行しないといけません！**

root などでログインして以下を実行する。

```MySQL
CHANGE MASTER TO
  MASTER_HOST='192.168.1.xxx',
  MASTER_USER='repl',
  MASTER_PASSWORD='xxxxx'
```

## 4. Master で dump をとる 
--master-data=1 で MASTER_LOG_FILE、MASTER_LOG_POS が dump に含まれる。
--flush-logs で その時点のログを吐き出しておく。
--single-transaction で、dump が一貫性を保つようにする。dump が開始された以降の変更はふくまれなくなる。また、ロックされなくなるので、Master は止まらない。

```Shell
mysqldump -uroot -p --master-data=1 --single-transaction --all-databases --flush-logs > replication.mysqldump
```

そして、scp などで、Slave に dump をコピーする

## 5.Slave に dump を入れ、`SLAVE START` する

```Shell
mysql -uroot -p < replication.mysqldump
```

``` MySQL
START SLAVE
```
## 6. 確認する
1. Master で何か変更してみる `update members set name = 'hoge' where id = 1`
1. Slave で変更を確認する `select name from members where id = 1`
Vert.xでチャットサーバー

[Instan Vert.x](http://www.amazon.co.jp/Instant-Vert-x-Simone-Scarduzio-ebook/dp/B00ESX17RA/ref=pd_sim_kinc_2/377-6400425-9638145?ie=UTF8&refRID=1Z1PC90AV96NTGM6HGRF "Instant Vert.x")を読みながらサンプルコードを試してみる。
今回はChat Server。
本の中のコードはほとんどJavaScriptで書かれているのだけれども、Javaの方がAPIを追っかけやすいのとJava8の勉強をかけてJavaで再実装。
コードはこんな感じ。

```java

public class ChatServer extends Verticle {

  private static final String MESSAGE_BROADCAST_ADDRESS = "broadcast_address";

  public void start() {
    NetServer netserver = vertx.createNetServer();
    netserver.connectHandler((NetSocket socket) -> {
      InetSocketAddress remoteAddr = socket.remoteAddress();
      String addr = String.format("%s:%d", remoteAddr.getAddress(), remoteAddr.getPort());
      socket.write(String.format("Welcome to the chat %s!", addr));
      // コネクション1つにつき1つのハンドラを登録する。
      Handler<Message<String>> messageHandler = (event) -> {
        socket.write(event.body());
      };
      vertx.eventBus().registerHandler(MESSAGE_BROADCAST_ADDRESS, messageHandler);
      // ソケットからメッセージを受け取ったときにEventBusを通じてメッセージをpublishする。
      socket.dataHandler((Buffer data) -> {
        ZonedDateTime now = ZonedDateTime.now();
        String msg = String.format("%s<%s>: %s", now, addr, data);
        vertx.eventBus().publish(MESSAGE_BROADCAST_ADDRESS, msg);
      });
      // コネクションが閉じられたらEventBusから閉じられたコネクションのメッセージハンドラを取り除く。
      socket.closeHandler((Void event) -> {
        vertx.eventBus().unregisterHandler(MESSAGE_BROADCAST_ADDRESS, messageHandler);
      });
    });
    netserver.listen(1234);

  }
}
```

サーバーへの接続は
```
telnet localhost 1234
```
でできる。

closeハンドラの所は本に載っていなかったけど、実装しておいた。ソケットにつなぐたびにEventBusにハンドラを登録する仕組みなので、接続がとじられた時にハンドラを除く処理がないとリークするはず。

Clojureでも書いてみた。

```clojure

(ns chatsample-clj.core
  (:require [vertx.core :as vertx]
            [vertx.net :as net]
            [vertx.stream :as stream]
            [vertx.eventbus :as eb]))
(def ^:dynamic **broadcast-address** "broadcast-address")
(defn -connect-handler [sock]
  (let [message-handler (fn [event] (stream/write sock event))
        remote-addr (net/remote-address sock)
        addr-info (format "%s:%d"  (:host remote-addr) (:port remote-addr))
        data-handler (fn [data] (let [now (java.time.ZonedDateTime/now)]
                                      (eb/publish **broadcast-address**
                                                  (format "%s<%s> %s" now addr-info data))))]
    (eb/on-message **broadcast-address** message-handler)
    (-> sock
      (stream/write (format "Welcome to the chat %s" addr-info))
      (stream/on-data data-handler)
      (net/on-close #(eb/unregister-handler **broadcast-address** message-handler)))))
(defn init[]
  (let [server (net/server)]
    (-> server
      (net/on-connect -connect-handler)
      (net/listen 1234 "localhost"))))

```

ソースコードはこちらにもあります。
[Java版](https://github.com/jkugiya/vertx-chatsample)
[Clojure版](https://github.com/jkugiya/vertx-chatsample-clj)
Swiftに関するメモ その4 - 継承


* [
Swiftに関するメモ - 一覧](http://qiita.com/takkyun/items/f34abf857deed808c610)

https://developer.apple.com/swift/ より

[The Swift Programming Language (iBooks Store)](https://itunes.apple.com/us/book/the-swift-programming-language/id881256329?mt=11)をざっくり目を通してつらつらと。


# 継承

基本形：

```swift
class SomeClass : BaseClass {
  // クラスの実装
}
```

`:` に続けてベースクラスを指定する。Objective-C では `NSObject` が基底クラス (ルートクラス) になる前提のようなものがありますが、Swift にはそのようなクラスはないようです。

サブクラスからベースクラス (スーパークラス) にアクセスするのは `super` を利用します。

```swift
class SomeClass : BaseClass {
  init() {
    super.init()
    // do something
  }
}
```

`init` はインスタンスの初期化時に呼ばれる特殊なメソッド。コンストラクタと言ってよいのかな。

# オーバーライド

サブクラスではベースクラスのメソッドやプロパティを実装し直すことができ、オーバーライドと呼びます。

## メソッドのオーバーライド

Objective-C ではオーバーライドするメソッドについて特に宣言などは必要ありませんが、Swift では Java のように `override` と宣言する必要があります。

```swift
class BaseClass {
  func doSomething() {
    // なんかする
  }
}
class SomeClass : BaseClass {
  override func doSomething() {
    super.doSomething()
    // サブクラス側でなんかする
  }
}
```

`init` もメソッドだと思うのですが、override の宣言は必要ないようです。

## プロパティのオーバーライド

プロパティも同様にオーバーライドできます。

```swift
class BaseClass {
  var something : String
}
class SomeClass : BaseClass {
  var something : String {
    get {
      return super.something
    }
    set {
      let value = newValue ...... // do something ...
      super.something = value
    }
  }
}
```

read-only のプロパティをオーバーライドして read-write なプロパティとして宣言するのは可能ですが、read-write なプロパティを read-only なプロパティとしてオーバーライドはできないようです。

`willSet` や `didSet` のオーバーライドも可能です。ただし、原理的に定数なプロパティや read-only なプロパティに対して、それらは動作しないとのこと。

## 添字アクセスのオーバーライド

サブスクリプトも同様にオーバーライドできます。

```swift
class BaseClass {
  subscript(index: Int) {
    get {
      return ....
    }
    set(newValue) {
    }
  }
}
class SomeClass : BaseClass {
  override subscript(index: Int) {
    get {
      return super[index]
    }
    set(newValue) {
      super[index] = newValue
    }
  }
}
```

スーパークラスには `super[index]` のような形でアクセスします。

## @final

`@final` アトリビュートを宣言することで該当メソッド・プロパティなどのオーバーライドを禁止することができます。

```swift
class BaseClass {
  @final func doSomething() {
    // なんかする
  }
}
class SomeClass : BaseClass {
  override func doSomething() { // コンパイルエラー !!!
  }
}
```

クラス自体に `@final` をつけることもでき、その場合には該当クラスを継承することができなくなるようです。
filter_input_simple

# **これは何？**

**[filter_input](http://www.php.net/manual/ja/function.filter-input.php)** 関数の惜しいところを使いやすく、安全にした強化版です。

**ネストした配列をクエリストリングのまま扱います。**

# **[filter_input_array_recursive](http://qiita.com/mpyw/items/c39b9ee695a5c2e74627)** 関数との比較

|| **[filter_input_array_recursive](http://qiita.com/mpyw/items/c39b9ee695a5c2e74627)** | **[filter_input_simple](http://qiita.com/mpyw/items/5a7242269f51dfabc973)** |
|:--:|:---:|:---:|  
| パフォーマンス(初回コール時) | ○ | △ | 
| パフォーマンス(2回目以降) | ○ | ◎ |
| ネストした配列への対応 | ◎ | ◎ |
| ネストした任意の配列への対応 | ◎ | × |

# **関数の定義**

```php
<?php

/**
 * Differently from filter_input(), this treats nested array as string.
 * Not...
 *     $_POST['foo']['bar']['baz'] = 'value';
 * But...
 *     $_POST['foo[bar][baz]'] = 'value'; 
 * 
 * @param  int   $type    same as filter_input().
 * @param  array $name    same as filter_input().
 * @param  int   $filter  same as filter_input().
 * @param  mixed $options same as filter_input().
 * @return mixed          same as filter_input().
 */
function filter_input_simple($type, $name, $filter = FILTER_DEFAULT, $options = FILTER_REQUIRE_SCALAR) {
    static $vars;
    if (!$vars) {
        $vars = array(
            INPUT_GET    => filter_input(INPUT_SERVER, 'QUERY_STRING'),
            INPUT_POST   => file_get_contents('php://input'),
            INPUT_COOKIE => filter_input(INPUT_SERVER, 'HTTP_COOKIE'),
        );
        $s = array('&', '&', ';[; ]++');
        foreach ($vars as $t => $var) {
            $tmp = array();
            foreach (preg_split("@{$s[$t]}@", $var, -1, PREG_SPLIT_NO_EMPTY) as $i) {
                list($k, $v) = explode('=', $i, 2) + array(1 => '');
                $tmp[urldecode($k)] = urldecode($v);
            }
            unset($tmp['']);
            $var[$t] = $tmp;
        }
        $vars[INPUT_REQUEST] = $vars[INPUT_COOKIE] + $vars[INPUT_POST] + $vars[INPUT_GET];
    }
    $type = (int)$type;
    $name = filter_var($name);
    if (!isset($vars[$type][$name])) {
        return null;
    }
    return filter_var($vars[$type][$name], $filter, $options);
}
```

# **使い方**

```php:foo[bar][a]=str&foo[bar][b][c]=strのとき
var_dump(
    filter_input_simple(INPUT_GET, 'foo[bar][a]'), // string(3) "str"
    filter_input_simple(INPUT_GET, 'foo[bar][b]')  // null
);
```

```php:foo[bar][validated_float]=1,234.213のとき
var_dump(
    filter_input_simple(
        INPUT_GET,
        'foo[bar][validated_float]',
        FILTER_VALIDATE_FLOAT,
        array(
            'options' => array(
                'min_range' => 1234,
                'max_range' => 1235,
            ),
            'flags' => FILTER_FLAG_ALLOW_THOUSAND,
        )
    )
); // float(1234.213)
```
swiftでランダム変数

ほんと何番煎じかわからないけど、、
ランダム変数生成して判定するってのを書いてみました。


    class SecondViewController: UIViewController {
        @IBOutlet var message : UILabel
        @IBAction func actionButton(sender : AnyObject) {
            let randInt = arc4random_uniform(10);
            if(randInt <= 5) {
                message.text = "hoge"
            } else {
                message.text = "moge"
            }
        }   
    }


画面上にラベルとボタンを設置して
ラベル -> @IBOutlet var message : UILabel
ボタン -> @IBAction func actionButton
と、つなげる。

ボタンを押すと、0~10までのランダム変数がarc4random_uniform(10)で生成されて、
生成された変数の値が5以下であればhogeそうでなければmogeがラベルに表示される。

そんだけ。
ほとんどswift感ないけど、、、。
AWS EC2のSSH接続


* EC2のインスタンス作成
* インスタンス作成時にkey_pairも作成
* key_pair作成時に、ダウンロードしたPrivateKey（.pemファイル）を適当な場所に保存。

仮にPrivateKeyを.ssh/key_pari.pemとして保存したとする。

Securuity Groupsにsshのruleを追加する。

``` aws
ConnectionMethod :ssh
Protocol :TCP
From Port :22
Source :0.0.0.0/0
```

private keyの権限を変更

```cmd
chmod 400 .ssh/key_pari.pem
```

sshコマンド

```cmd
ssh -i .ssh/key_pair.pem ec2-user@xxx.xxx.xxx.xxx
```
xxx.xxx.xxx.xxx部分はインスタンスのPublic IP
vimrcを編集したら自動で反映する

表題どおりの件です。

##基本的な設定
ひとまず自分がvimrcの頭に記載している設定を掲載
詳細は下に

```vim:vimrc
" init all settings
set all&
" init autocmd
autocmd!
" set script encoding
scriptencoding utf-8
" tiny と small では これ以上 vimrc を読み込まない
if !1 | finish | endif
" This is vim, not vi.
set nocompatible
" syntax hilight
syntax enable
" auto reload .vimrc
augroup source-vimrc
  autocmd!
  autocmd BufWritePost *vimrc source $MYVIMRC | set foldmethod=marker
  autocmd BufWritePost *gvimrc if has('gui_running') source $MYGVIMRC
augroup END
```

[koara-local/dotvim](https://github.com/koara-local/dotvim)

##vimrcの再読み込み
少なくとも再読み込みに必要なのは以下の設定
vimrcと名前のつくファイルを更新したら、`source $MYVIMRC`　を実行

```vim:vimrc
" auto reload .vimrc
augroup source-vimrc
  autocmd!
  autocmd BufWritePost *vimrc source $MYVIMRC | set foldmethod=marker
  autocmd BufWritePost *gvimrc if has('gui_running') source $MYGVIMRC
augroup END
```
参考：
[Hack #74: 簡単にvimrcを編集する](http://vim-jp.org/vim-users-jp/2009/09/18/Hack-74.html)
[Vimでvimrcを編集しやすくする記述とvimrcのリロードでモードラインの設定が無視される問題](http://haya14busa.com/edit-vimrc-easily/)

普段gvimは使わないのでよく知りませんが、
gvimの場合は、sourceするだけでは反映されない設定があるようなので
tyruさんの、restart.vim あたりをつかうと捗るらしいです（要検証

[tyru/restart.vim](https://github.com/tyru/restart.vim)

参考：
[[vim]現在の状態を復元して gVim を再起動する](http://d.hatena.ne.jp/osyo-manga/20110601/1306896898)

###追記

```vim
:bufdo source $MYVIMRC
```
ですべてのバッファに更新を適用・・・できるように一瞬みえたのだけれども
カラーがおかしくなったりしてうまく動かない模様

いい方法があれば教えて下さい・・・

##再読み込み前に設定をリセット
ただこれだけだと、例えば `set expandtab` などをコメントアウトした場合に、
Tabが入力される状態に戻ってくれなかったりする。( `set noexpandtab`としないといけない )

ちょっとそれは面倒なので、再読み込みのたびに最初に設定をデフォルトに戻す。

```vim:vimrc
" init all settings
set all&
```

これで `set expandtab` をコメントアウトか削除するだけで、すぐにTabが入力される状態になった。
ついでにgroup設定のされていない `autocmd` もリセットしているけれども、必要性は不明

```vim:vimrc
" init autocmd
autocmd!
```

##ついでにすぐにvimrcを開けるようにする
自分は `,v` でvimrcを開くようにしています。

```vim:vimrc
" Edit vimrc
nmap ,v :edit $MYVIMRC<CR>
```
ubuntuでtelnetdをIPv4で上げる方法

ubuntuでtelnetサーバを立てる必要があったため、
何も考えずに以下のようにインストールしました。

```
apt-get install inetutils-inetd
apt-get install telnetd
```

で、telnetクライアントで接続してみるとConnection refusedと出て、うまくいかない。

netstat を見てみると、

```
tcp6       0      0 :::23                   :::*                    LISTEN
```

なんとtelnetの23番ポートはIPv6で待ち受けている！

そこで[公式マニュアル](http://www.gnu.org/software/inetutils/manual/html_node/Configuration-file.html)に従ってinetdの設定を変えて、telnetをIPv4で上げるようにする。

具体的には`/etc/inetd.conf`の`tcp`の部分を`tcp4`にすればOK

```
telnet          stream  tcp4    nowait  root    /usr/sbin/tcpd  /usr/sbin/in.telnetd
```

なんでデフォルトでIPv6なんだろう。。。
[車輪の再発明]固定長文字列の解析

お仕事ではまだまだ固定長文字列でやりとりすることが多いので
固定長文字列からデータを切り出すクラスを作成。

どのプロジェクトでも一生懸命ロジッククラスで文字列を切り出してるけどめんどくさいないんだろうか。。。

```java:FixedLengthStringParser.java
package tool;

/**
 * 固定長文字列パーサ
 */
public class FixedLengthStringParser {

	/** 固定長文字列 */
	private final String source;
	/** 現在位置 */
	private int position = 0;

	/**
	 * コンストラクタ
	 * @param source 固定長文字列
	 */
	public FixedLengthStringParser(String source) {
		this.source = source;
	}

	/**
	 * 次の文字列を切り出す
	 * @param length 長さ
	 * @return 切り出した文字列
	 */
	public String next(int length) {
		if (source == null) {
			return null;
		}
		if (length < 1) {
			return null;
		}
		if (position >= source.length()) {
			return null;
		}
		String ret = null;
		if (position + length > source.length()) {
			ret = source.substring(position);
			position += length;
			return ret;
		}
		ret = source.substring(position, position + length);
		position += length;
		return ret;
	}

	/**
	 * とりあえず動かす
	 * @param args
	 */
	public static void main(String[] args) {
		FixedLengthStringParser parser = new FixedLengthStringParser("abc123xyz");

		System.out.println(parser.next(3));
		System.out.println(parser.next(3));
		System.out.println(parser.next(0));
		System.out.println(parser.next(3));
		System.out.println(parser.next(5));
	}
}
```
Jenkins 用 .gitignore

Jenkins の設定を git で管理するため試行錯誤してできた .gitignore。
パスワード周りやビルドの成果物が入らないようにしているので、そのままでは使えないと思うけど参考までに。

```
# Jenkins

/.owner
/envInject.xml
/hudson.tasks.Mailer.xml
/identity.key
/jenkins.model.JenkinsLocationConfiguration.xml
/queue.xml
/secret.key*

/fingerprints/
/jenkins.security.RekeySecretAdminMonitor/
/logs/
/plugins/*/
/secrets/
/updates/

# Job

lastStable
lastSuccessful
nextBuildNumber

axis-*/
builds/
modules/
workspace*/
```
debian wheezy で docker

# DebianでDockerを使う話。

debianでDockerを使うための最低限のパッケージなど。

## 前準備

* Dockerにはカーネル 3.8以降が推奨されているので `wheezy-backports` からカーネルをインストールします。

```bash
$ sudo sh -c "echo deb http://ftp.jp.debian.org/debian wheezy-backports main | tee  /etc/apt/sources.list.d/wheezy-backports.list"
$ sudo apt-get update
$ sudo apt-get -t wheezy-backports install linux-image-amd64 -y
```

* インストールが終わったら、再起動かけます。

```bash
$ sudo reboot
```

## docker インストール

* 再起動が終わればdocker本体をインストール

```bash
$ sudo sh -c "curl -sSL https://get.docker.com/ | sh"
```

## docker 起動

```bash
$ sudo docker run -t -i debian:stable /bin/bash
```

## 補足1

* 公式のドキュメントにdebian8.0でのインストールドキュメントが出来たようです。  
https://docs.docker.com/installation/debian

## 補足2

* 現時点では非公式の方法となりますので、ご注意ください。

## 更新 2014-11-05

* 公式ドキュメントが更新されていたので、追従しました。
Application In Production!を表示させない方法

Laravel Homesteadを使った場合、Application In Production!の表示が出る場合があります。

この表示を出さないようにする方法になります。

# 方法

bootstrap/start.phpを以下のように編集します。


    $env = $app->detectEnvironment(array(
    
            'local' => array('*'),
            // 'local' => array('your-machine-name'),

    ));

この対処の詳しい説明は以下の「環境の設定」の項をお読み下さい。

http://laravel4.kore1server.com/docs/configuration
自分がやっている Ubuntu サーバーの最低限の設定

### IPV6 を塞ぐ

/etc/default/ufw を編集します。

```
IPV6=no
```

### 利用しないポートを閉じる

http(s) と ssh のポート（ここでは 37462）以外は閉じる。

```bash
sudo ufw default deny
sudo ufw allow http/tcp
sudo ufw allow https/tcp
sudo ufw limit 37462/tcp
sudo ufw enable
```

### ssh サーバーの設定

特定のユーザーが公開鍵認証でのみログインできるようにしてます。
もちろんポートも変えます（port 22 は頻繁にアタックされるので）。

```
# ポートを変える
Port 37462

# root ログインを禁止
PermitRootLogin no

# パスワード認証を禁止
PasswordAuthentication no

# PAM認証を禁止
UsePAM no

# 特定のユーザーのみログイン可能
AllowUsers user1
```

ログインユーザーの .ssh/authorized_keys に、接続する PC の公開鍵を追加することをお忘れなく。

### 残り

帯域制限とかファイルオープン数の上限を上げたりとかかな。
なんかあるかな？
express4でErrorが起きた後の制御の話

express は、`app.use()` や `app.VERB()` などを使って、
URLのパスに合わせて、必要なミドルウェアを設定していくが、
途中でエラーが起きた場合にcallback関数の第1引数に
`next(new Error("Error"))` とエラーを入れるようになっている。

ただ、エラーが起きた後に設定したミドルウェアの引数の数によって挙動が変わる。

```javascript:app.js
var app = require('express')();
var text = '';

app.use(function(req, res, next) {
  text = 'A'
  next();
});

app.use(function(req, res, next) {
  text += 'B'
  next(new Error("Error!"));
});

app.use(function(err, req, res) {
  text += 'C'
  res.send("RESULT 1:" + text);
});

app.use(function(err) {
  text += 'D'
  res.send("RESULT 2:" + text);
});

app.use(function(err, req, res, next) {
  text += 'E'
  res.send("Result 3:" + text);
});

app.listen(3000);
```

この場合、httpアクセスをした場合
結果は `Result 3:ABE` になる。

# なぜ実行されない関数があるのか

これは、途中でエラーが発生した場合に、このミドルウェアのcallbackの挙動が変わるため。

ミドルウェアは、`Layer` というlayerオブジェクトを積み重ねて、
httpリクエスト毎に処理が必要かどうかをチェックをしている。

```javascript:https://github.com/visionmedia/express/blob/4.4.1/lib/router/index.js#L369
proto.use = function(route, fn){
  // 省略…
  var layer = new Layer(route, {
    sensitive: this.caseSensitive,
    strict: this.strict,
    end: false
  }, fn);

  // add the middleware
  debug('use %s %s', route || '/', fn.name || 'anonymous');

  this.stack.push(layer);
```

`Layer` のコンストラクタはこんな感じ。

```javascript:https://github.com/visionmedia/express/blob/4.4.1/lib/router/layer.js#L14
function Layer(path, options, fn) {
  if (!(this instanceof Layer)) {
    return new Layer(path, options, fn);
  }

  debug('new %s', path);
  options = options || {};
  this.regexp = pathRegexp(path, this.keys = [], options);
  this.handle = fn;
}
```

`fn` が、`app.use()` などで慣例的に `req` や `res`や `next` を渡す関数を指していて、`layer.handle` に設定されている。

この関数がパスなどのマッチングに合わせて、順番に実行されていく。
実際にこれが実行されるのが以下になる。

```javascript:https://github.com/visionmedia/express/blob/4.4.1/lib/router/index.js#L247
      var arity = layer.handle.length;
      if (err) {
        if (arity === 4) {
          layer.handle(err, req, res, next);
        } else {
          next(err);
        }
      } else if (arity < 4) {
        layer.handle(req, res, next);
      } else {
        next(err);
      }
```

`err` が入っている場合は、引数が4つでなければ、`layer.handle()` が呼ばれずに`next(err)` が呼び出される。
なので、最初の例では `C` と `D` は呼び出されない。
linux グループの作成とユーザーの追加手順


```bash:グループ追加,グループにユーザーの登録
グループ「project」を追加
# groupadd project

ユーザー「sakura」をグループに追加
# gasswd -a sakura project

確認
# id sakura
uid=500(sakura) gid=500(sakura) 所属グループ=500(sakura),502(project)
```
ls でディレクトリの青色文字を見やすくする

背景が黒だと、青で表示されるディレクトリが見えにくいことがあります。
そういう時は LS_COLORS で色を変えてます。

```bash
export LS_COLORS='di=01;35'
```

di がディレクトリで、01 がボールド、35 が紫色。

他の色など詳しい事はこちらを参考に。
http://www.itmedia.co.jp/help/tips/linux/l0372.html
（Vagrantメモ）サーバー側のログの見方

#### よく見かけるこの画面。

![500](http://gyazo.com/db4c8cc10ac353a5292604755e556e2e.png)

正直これだけでは何も分からないので、 **エラーの詳細が書かれたログが見たいところ** 。

そこで自力で探してみたのだが、どうやら **/var/log/httpd/** 以下にログ系のデータがあるみたいだ。

```
access_log  error_log  vagrant-test-access_log	vagrant-test-error_log
```

それぞれを **cat** でチェックしてみた（ちなみに管理者権限でないとアクセスできないっぽい）印象では、 **vagrant-test-error_log** に一番いい感じのログが残っている。

それにしても、コマンドとかでもっと簡単に見れないものだろうか？
Swiftでジェネリックなremap関数を作る

やはりremap関数の汎用性は異常だと思います。
そこでとりあえずジェネリックな関数が欲しくなります。
ですが、どうやらC++のテンプレートとは違い、protocolに一工夫必要のようです。
//まあ、もうほとんどDouble決め打ちでいい気もしますが

```Swift
protocol FourArithmeticOperations {
    func +(lhs: Self, rhs: Self) -> Self
    func -(lhs: Self, rhs: Self) -> Self
    func *(lhs: Self, rhs: Self) -> Self
    func /(lhs: Self, rhs: Self) -> Self
}
extension Float: FourArithmeticOperations { }
extension Double: FourArithmeticOperations { }

func remap<T: FourArithmeticOperations>(value: T, #inputMin: T, #inputMax: T, #outputMin: T, #outputMax: T) -> T
{
    return (value - inputMin) * ((outputMax - outputMin) / (inputMax - inputMin)) + outputMin;
}

for i in 0...100 {
    let t = remap(Double(i), inputMin: 0.0, inputMax: 100.0, outputMin: 0.0, outputMax: M_PI * 2.0)
    let v = sin(t)
    println("i[\(i)] => \(v)")
}
```

こちらを参考にさせていただきました。
http://stackoverflow.com/questions/24046792/swift-generics-requiring-addition-and-multiplication-abilities-of-a-type
TOGAF9 トレーニングコースに参加しました

5/28-31の4日間、TOGAFトレーニングコースに行ってきました。面白かったです。

# TOGAFとは
[オープン・グループ・ジャパン](http://www.opengroup.or.jp/togaf.html) からの抜粋ですが、

>TOGAFとは、The Open Group Architecture Frameworkの略称で、グローバルなIT標準団体であるオープン・グループのアーキテクチャ・フォーラム（アーキテクチャ技術部会）が永年にわたり開発してきた、エンタープライズの経営意思に立脚したITシステム体系（ITアーキテクチャ）を策定するための手法およびツールです。

とあります。

講義内では上記の「エンタープライズの経営意思に立脚したITシステム体系」をEA(エンタープライズ・アーキテクチャ)と表現していたと思います。

例として出て来たのが、社内システムからはじまって、CRMとかSFAとか、航空管制システムとか社会インフラへのICT活用とかそういうものだったので、ま、複数の組織の利害が存在する（エンタープライジーとか軽ーく言ったりする）様な状況で問題となることがらを体系的に整理した上で、アウトプットとプロセスについて定義したもんだと受け止めました。

## 特徴
個人的に印象深かったTOGAFの特徴をば。

### ソフトウェアエンジニアリングの部分少なめ

簡単に言うと、そのコンポーネントは買うのか作るのかを決めるまで、がTOGAFにおけるアーキテクチャ設計です。どんなプロジェクト管理手法や開発手法を採用するのかも、定められていません。それよりも、そのコンポーネントが満たすべき要件や準拠すべき標準を定めることが主眼になります。

実際に開発する組織とは、「アーキテクチャ契約」と「要件の変更管理」で対話するイメージでした。

### ゴール指向

アーキテクチャの実現を強力に推進するための組織づくりや動機、目標の明文化のためのテクニック・プロセスにかなりの分量が割かれています。

実現までに長い期間がかかり、その間にキープレイヤーがいなくなるなんてことも容易に想像できるわけで、長く使われるシステムを構築、運用して行くためには、組織の中にアーキテクチャを維持管理していく仕掛けが必要というアプローチには納得感ありました。

また、最終的にシステムを開発・利用・運用するために必要なスキルセットを定義して、段階的にトレーニングを積ませながらアーキテクチャを徐々に実現して行く点も、現実的だなと思いました。

### エビデンス重視

多数のステークホルダーが関わる中で、アーキテクチャが各種の判断、例えば安全性やセキュリティ、ディペンダビリティにどう備え、合意を形成しているのか、についてしっかり記載しておくことが重視されていました。

これは、アーキテクチャの品質という側面以外に、インシデントやリコールといった事態が発生した時に、説明責任を果たすための大事な考え方だと説明を受けました。

# 良かったこと
## 経験豊富な講師陣

講師陣の方々がとても経験豊富な方々で、沢山の経験談を聞くことができました。
（最初入室した時、とても高齢の方に見えたので、だ、大丈夫かなと思ってしまいました。実際は私よりもバイタリティ溢れる方々で...本当に申し訳ございません）

大きなシステムを設計するという経験はなかなかできないので、自分が体験できないような事例に対して、実際どう考え、判断し、実行したか聞けるのはとても有意義でした。

もちろんその事例が、実際にTOGAFの概念ではどう説明できるのか、という形で講義が進みましたので、TOGAFトレーニングという意味でももちろん良かったです。

## 方向付けフェーズでのノウハウを知ることができた

組織を越えて長期間アーキテクチャを維持進化させて行く上で、経営陣やステークホルダーとどのような視点、運営方法で合意形成すべきか丁寧に述べられていたので、TOGAFと言わないまでも、小さなプロジェクトのスタート時に役に立ちそうでした。

特に開発リソースのAs-Is/To-Beについて認識をあわせた上で、どのようにリソースを調達、強化（エンジニアなら教育・訓練)していくかを、アーキテクチャの段階的な実装と同様に計画していく点が興味深かったです。

----
おまけ

# トレーニング内容
最後に、トレーニングの流れについてさくっと書いておきます。雰囲気だけでも。

## 1〜3日目
最初の３日間はみっちりTOGAFの概念を詰め込みます。

* 概論
* プロセス
* 技法、成果物について個別に深掘り

ボリュームが結構あるのでかなり駆け足なのですが、Q&Aやテストで疑問点を解消する形でした。

初日には懇親会もあり、そこでも活発に質疑がなされていました。
組織をまたぐシステムを設計する仕事に関わる人同士のつながりをつくる機会でもありましたね。

## 4日目
最終日は、TOGAF以外の関連技術の紹介と、認証試験でした。

* ArchiMate
* D-Case
* 演習
* 認証試験

試験... 文章問題が難しかったです。選択式なのですが、選択肢の中で完全な間違いはひとつだけなので、時間いっぱいまで悩みました。

# 参考
* [TOGAF](http://www.opengroup.or.jp/togaf.html)
* [TOGAF教科書（英語）](https://www2.opengroup.org/ogsys/jsp/publications/PublicationDetails.jsp?catalogno=I112)
Vue.js v0.10.5の変更点まとめ

https://github.com/yyx990803/vue/releases/tag/v0.10.5

バグフィックスのリリースです。


## Improvements


### mixinされたメソッドのpropertyもtrackingされるされるようになりました。

* https://github.com/yyx990803/vue/blob/894b5fd85f9b899467578d24465bd85fc025cad8/test/unit/specs/api.js#L473-L496 のspecをみるとわかりやすいです。


### v-styleが!importantを無視しないようになりました。

* https://github.com/yyx990803/vue/issues/278


### lazyオプションが子のVMで指定されていない場合は、親の値を継承するようになりました。

* https://github.com/yyx990803/vue/issues/284

* lazyオプションはinputで全てのinputイベント(キー入力)で反応するのではなく、changeイベント(enterキー押すかフォーカスが外れる)ときだけで反応するようになるオプションです。

* v-repeatのなかでinputにv-modelを使うと、inputは子のVMになってlazyオプションが継承されなかったのがlazyオプションが継承されるようになりました。


### v-onがsame originなiframeで動作するようになりました。

* https://github.com/yyx990803/vue/issues/290


## Fixed

### いくつかのAndroid 4.1のデバイスでのtransitonsの挙動が修正されました。

* https://github.com/yyx990803/vue/pull/249

* https://github.com/bpierre/vue/commit/057c0867c75b2f69a399234a874d226c7d6d76a6

* 上のコミットログをみると、Objectのpropertyの順番でwebkit prefixがついているのをvendor prefixなしより前にしないとうまく動作しないみたいでなかなか厳しい感あるbug fixです...

### attributeの名前に:が含まれていた場合でもパースできるようになりました。

* https://github.com/yyx990803/vue/pull/253

* xlink:href のような属性名を使用した場合にエラーになっていたのが、パースできるようになりました。


### v-partial内の不要なcloneNodeが削除されました。

* https://github.com/yyx990803/vue/pull/267
 

### 親のVMのtransitionが終了する前に子のVMが削除されてしまう問題を修正しました。

* https://github.com/yyx990803/vue/pull/276

* https://github.com/yyx990803/vue/pull/281

* transitionのenterとleaveが指定されている要素をv-componentなどで入れ替える際に、古い要素を削除した後に新しい要素をenterで指定されているアニメーションと共に表示していたため、leaveのアニメーションが表示されていませんでした。なのでleaveのアニメーションが終わったあとに要素を削除するようになりました。
 

### v-withは他のdirectivesよりも優先的に処理されるようになりました...？

* https://github.com/yyx990803/vue/issues/282

* v-withでcomputed propertyを使うとき(replace: trueであることも条件かも)、v-withを評価する段階ではまだcomputed propertyが準備出来ていなかったため親で指定された値をv-withの初期値として反映されなかったのが修正されました。(多分...。)


###  v-withでの循環的な更新が修正されました。

* https://github.com/yyx990803/vue/issues/282

* v-withと\$watchを一緒に使ったときに、ずっと繰り返し更新され続けたりwatchしている値とは違う値を更新した場合でも処理が走ったりと\$watchの挙動がおかしい問題が修正されました。
[Swift] ちょっとしたメモ


細かいところのメモをちょくちょく更新していこうと思います。

---------

## for文でindexも受け取る

for文普通に回すだけならとても手軽ですが、やはりindexがほしい場合があります。
そんなときはこんなふうに書きます。

```enumerate.swift
var someList: String[] = ["hoge", "fuga", "foo", "bar"]

for (index, value) in someList.enumerate() {
	println("index: \(index), value: \(value)")
}
```


## SwiftでなんちゃってSingletonクラス

[こちらの記事（Swift でシングルトン）](http://qiita.com/1024jp/items/3a7bc437af3e79f74505)を参考にしました。

記事によると、`static`の初期化は`dispatch_once`が使われているとのこと。

```singleton.swift
// なんちゃってSingletonクラスを定義
class SingletonClass {
	// クラス変数を定義（getterのみ）
	class var sharedInstance: SingletonClass {
		struct Singleton {
			static let instance = SingletonClass()
		}
		return Singleton.instance
	}

	// コンストラクタ
	init() {
		println("Singleton has been created!")
	}
}

// 使う
var s: SingletonClass = SingletonClass.sharedInstance
```


## メソッド定義で、ラベルと変数名を分ける

通常、メソッドは以下のように宣言、使用します。

```method.swift
func someMethod(hoge: String, fuga: Int) -> () {
	println("Arguments are \(hoge) + \(fuga)")
}

someClass.someMethod("sample", fuga: 5)
```

しかし、ラベルと変数名を分けて、以下のように宣言することもできます。
（そしてその場合、第一引数にもラベルを指定することができるようになります）

```method2.swift
func someMethod2(label1 hoge: String, label2 fuga: Int) -> () {
	println("Arguments are \(hoge) + \(fuga)")
}

someClass.someMethod2(label1: "sample", label2: 5)
```


## SwiftでSelectorを使う

Objective-Cで言うところの`@selector(hoge:)`です。
Swiftでは、なんのことはない、普通にStringを渡してやればいいようです。

```button.swift
var button = UIButton(frame: CGRectMake(0, 0, 150, 30))
button.addTarget(self, action:"doTouch:" forControlEvents: UIControlEvents.TouchUpInside)
```


## 演算子のオーバーロード（Operator functions）

Swiftには演算子のオーバーロードの仕組みがあります。
以下のように、`@infix`をつけて、関数名にあたるところに、オーバーロードしたい演算子を書きます。
そして演算子の左右にくる値を取り、実際の処理を行います。

```swift
// 例えばVector2Dを作る場合

struct Vector2D {
	var x = 0.0, y = 0.0
}

@infix func + (left: Vector2D, right: Vector2D) -> Vector2D {
	return Vector2D(x: (left.x + right.x), y: (left.y + right.y))
}
```


## クラス周りのメモ

### プロパティの変化を監視する（KVOのようなもの）

プロパティ定義の際に、`willSet`と`didSet`を入れ子にして定義する。

```swift
class SomeClass {
    var hoge: Int {
        willSet {
            // hogeがセットされる前に呼ばれる
            println("willSet was called.")
            println(self.hoge)
        }
        didSet {
            // hogeがセットされた直後に呼ばれる
            println("didSet was called.")
            println(self.hoge)
        }
    }
    init(hoge: Int) {
		// 初期化時は、上記の監視は呼ばれない
       self.hoge = hoge
    }
}

var someClass: SomeClass = SomeClass(hoge: 5)
someClass.hoge = 10
```


### クラスメソッドを定義する

クラスメソッドにしたいメソッドの宣言に、`class`キーワードを付ける

```class-method.swift
class SomeClass {
	// クラスメソッド定義
    class func doSomething() {
        println("hogehoge")
    }
}
```
Swiftで最低限の TableViewControllerを実装してみた。


ちなみに、Storyboardを使わない例です。
delegate = self しています。

```MyTableViewController.swift
import Foundation
import UIKit

class MyTableViewController :UITableViewController, 
                             UITableViewDelegate, 
                            UITableViewDataSource
{
    let TableViewCellIdentifier:String = "CELL"

    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        var myTableView:UITableView = 
            UITableView(frame: self.view.bounds, 
                        style: UITableViewStyle.Plain);
        
        myTableView.registerClass(UITableViewCell.self,
                                 forCellReuseIdentifier:TableViewCellIdentifier)
        
        myTableView.delegate = self;
        myTableView.dataSource = self;
        
        self.view.addSubview(myTableView)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    override func tableView(tableView: UITableView!, 
                            numberOfRowsInSection section: Int) -> Int {
        return 12;
    }

    override func tableView(tableView: UITableView!,
                           cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
    
        var cell:UITableViewCell = UITableViewCell(
                                    style: UITableViewCellStyle.Subtitle,
                                    reuseIdentifier:TableViewCellIdentifier )
        cell.textLabel.text = "Cell No. \(indexPath.row)"
        cell.detailTextLabel.text = "Subtitle No. \(indexPath.row)"
        return cell;
    }
}
```
DoctrineのDISTINCTは正しく動作しない

[DISTINCT](http://qiita.com/rana_kualu/items/f36d0351cd46f8212b49) / [LEFT JOIN](http://qiita.com/rana_kualu/items/42997ec06e02acceeb40)

```php
Doctrine_Query::create()->from('HOGE a')->distinct(true)->select('a.fuga');

// Expected result : SELECT DISTINCT fuga FROM hoge.
// Actual result : SELECT DISTINCT id, fuga FROM hoge.
```

見ての通り、発行されるSQLに勝手にID(主キー)が入るので正しく動作しない。
DISTINCTをselect()内に持ってきたとしても勝手に書き換えられるので駄目。

http://stackoverflow.com/questions/7188219/how-to-select-distinct-query-using-symfony2-doctrine-query-builder
http://www.developpez.net/forums/d793147/php/php-sgbd/orm/doctrine/doctrine-select-distinct/

回避方法は「GROUP BYを使え」らしい。
ふざけてるの？

```php
Doctrine_Query::create()->from('HOGE a')->select('a.fuga')->groupBy(a.fuga);

// SELECT id, fuga FROM hoge group by fuga.
```

一応想定と同じ結果は取得できるのだが、意味が全く異なるので正しい動作とは言いかねる。

結論
「DoctrineでDISTINCTするときは直接SQL書こう」

```php
Doctrine::getConnectionByTableName('HOGE')->execute('SELECT DISTINCT fuga FROM hoge')->fetchAll();
```

ところでDISTINCTよりEXISTSの方が早いという記事をよく見かけるんだけど、
結合しないfugaテーブルでEXISTSを使うにはどうすればいいんだろう？
上と左の合計(再帰)

本番で書いた汚いコードはこちら。http://qiita.com/cielavenir/items/ab6c3e9a482c7b42519e

本番中に再帰は考えていたものの、焦ってしまい実装に手が回らなかった。

律儀にclassとしたが、Rubyはmainインスタンスにインスタンス変数を追加できるので必要ではなかったかもしれない。

```hena22_rec.rb
#!/usr/bin/env ruby
#http://qiita.com/Nabetani/items/34bf2a05099a47e193b6
#http://nabetani.sakura.ne.jp/hena/ord22irrpas/
class Hena22
	def initialize(cells)
		@cells=cells
		@memo={}
	end
	def solve(x,y)
		return 0 if x<0||y<0
		return 1 if x==0&&y==0
		if @memo[[x,y]]
			return @memo[[x,y]]
		end
		cell=@cells.find{|e|e[:x1]<=x&&x<e[:x2] && e[:y1]<=y&&y<e[:y2]}
		if cell
			if cell[:x1]==x && cell[:y1]==y
				cells_for_val={}
				val=0
				(cell[:y1]...cell[:y2]).each{|_y|
					adjacent_cell=@cells.find{|e|e[:x1]<=x-1&&x-1<e[:x2] && e[:y1]<=_y&&_y<e[:y2]}
					if !adjacent_cell||!cells_for_val.include?(adjacent_cell)
						cells_for_val[adjacent_cell]=1 if adjacent_cell
						val+=solve(x-1,_y)
					end
				}
				(cell[:x1]...cell[:x2]).each{|_x|
					adjacent_cell=@cells.find{|e|e[:x1]<=_x&&_x<e[:x2] && e[:y1]<=y-1&&y-1<e[:y2]}
					if !adjacent_cell||!cells_for_val.include?(adjacent_cell)
						cells_for_val[adjacent_cell]=1 if adjacent_cell
						val+=solve(_x,y-1)
					end
				}
				return @memo[[x,y]]=val
			else
				return @memo[[x,y]]=solve(cell[:x1],cell[:y1])
			end
		else
			return @memo[[x,y]]=solve(x-1,y)+solve(x,y-1)
		end
	end
end

if $0==__FILE__
	STDOUT.sync=true
	while gets
		a,b=$_.chomp.split(':')
		column,row=a.split('x').map(&:to_i)
		cells=!b ? [] : b.split(',').map{|e|
			l,t,w,h=e.split('').map(&:to_i)
			#高さ/幅から端点の座標に変更
			{:x1=>l.to_i,:x2=>l.to_i+w.to_i,:y1=>t.to_i,:y2=>t.to_i+h.to_i}
		}
		puts '%02d'%[Hena22.new(cells).solve(column-1,row-1)%100]
	end
end
```
Gmailにopensslで接続してhtmlメールを送る


GmailをSMTPサーバとして利用する方法です。

- openssl s_client -connect smtp.gmail.com:465 -crlf -ign_eof
	- `-ign_eof`がないと、以下のエラーでRCPT TO後に死ぬ
	
>RENEGOTIATING
21874:error:1409E0E5:SSL routines:SSL3_WRITE_BYTES:ssl handshake failure:/SourceCache/OpenSSL098/OpenSSL098-50/src/ssl/s3_pkt.c:543:


- opensslでセッションを開始したあとの対話は以下のように進みます

```sh
EHLO localhost #ユーザー入力
250-mx.google.com at your service, [106.138.98.200]
250-SIZE 35882577
250-8BITMIME
250-AUTH LOGIN PLAIN XOAUTH XOAUTH2 PLAIN-CLIENTTOKEN
250-ENHANCEDSTATUSCODES
250 CHUNKING
AUTH LOGIN #ユーザー入力
334 xxxxxxx
xxxxxxxxxxxxxxxxx #ユーザー入力、認証(user)
334 xxxxxxx
xxxxxxxxxxxxxxxxx #ユーザー入力、認証(pass)
235 2.7.0 Accepted
MAIL FROM: <xxx@gmail.com> #ユーザー入力
250 2.1.0 OK fe3sm63961472pbd.66 - gsmtp
RCPT TO: <xxxx@example.com> #ユーザー入力
250 2.1.5 OK fe3sm63961472pbd.66 - gsmtp
DATA #ユーザー入力
354  Go ahead fe3sm63961472pbd.66 - gsmtp
Subject: test_html #ユーザー入力
Mime-Version: 1.0; #ユーザー入力
Content-Type: text/html; charset="ISO-8859-1"; #ユーザー入力
Content-Transfer-Encoding: 7bit; #ユーザー入力

<!DOCTYPE HTML>
<html lang="ja-JP">
<body>
<h1>はろーはろー</h1>
</body>
<html>
.

```

### はまったところ

- AUTH LOGINにより認証を行う
	- base64によるuser / pass の符号化が必要
	- `echo 'xxx@gmail.com' | openssl enc -e -base64`
	- passwordは、 __アプリケーション固有のパスワード__ が必要
		- [アプリケーション固有のパスワードを使用してログインする - Google アカウント ヘルプ](https://support.google.com/accounts/answer/185833)
		- 同様にbase64に符号化する

- `MAIL FROM:`, `RCPT TO:`のフォーマット
	- アドレスを<>で囲む必要がある。でないと、`555 5.5.2 Syntax error. `で死ぬ

- Mime-VersionとContent-Typeの指定
	- Content-Type: text/html
	

以下を参考にしました

- [How to send email using simple SMTP commands via Gmail? - Stack Overflow](http://stackoverflow.com/questions/11046135/how-to-send-email-using-simple-smtp-commands-via-gmail)
Jerseyで、MessageBodyProviderNotFoundExceptionが出ちゃった時。

もしくは、Jerseyで任意のオブジェクトをJSONで返却したいとき。

# 問題発生！
JerseyでListとかをJSONでレスポンスしたいときに以下のExceptionが出てしまう時があります。

```
javax.servlet.ServletException: org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/json
```

これの対処法をご紹介します。

# カスタムプロバイダーをつくろうよ！
JAX-RSのサンプルを[こちら](http://qiita.com/ukiuni@github/items/a516439b30c340703292)に記載しましたが、この一部が問題の解決方法です。カスタムプロバイダを作成すること。
デフォルトのJSONプロバイダだとListオブジェクトなどをJSON化することができないため、サンプルコード中の[JSONProvider.java](https://github.com/ukiuni/JAXRSInspect/blob/master/src/org/ukiuni/inspect/jaxrs/JSONProvider.java)を参考にして、カスタムプロバイダーを作成してください。サンプルではJSON変換のためにJSONICを使用しています。
コツは、[web.xml](https://github.com/ukiuni/JAXRSInspect/blob/master/WebContent/WEB-INF/web.xml)でプロバイダーを読み込めるようにすることです。
「ファイル名を指定して実行」で、よく使うやつ

よく使う順。一度起動しておくと、履歴に残ってくれるので便利。

* mstsc /v:192.168.1.1 IPアドレス指定でリモートデスクトップ
* shell:Recent 最近使った項目を開く
* shell:Downloads ダウンロードフォルダを開く
* cmd /k ipconfig ネットワーク設定を開く
* control コンパネを開く
* control netconnections ネットワーク接続を開く
* msinfo32 システム構成を開く
* appwiz.cpl コンパネの「プログラムと機能」を開く
* resmon リソースモニタを開く
* eventvwr イベントビューアを開く
Railsの小技：パーシャルのrenderにブロックを取れるの知ってた？


## 例えばこんなとき・・・

例えばこんなビューがあったとします。simple_formを使っているとこんなビミョーなマークアップ、ありがちな気がします。

```haml
// フォームの途中で・・・
= f.input :event_name

.row.message
  .col-md-3
  .col-md-9
    .hint
      %p イベント名はトップページのイベント一覧にも表示されます。

= f.input :event_type, as: :radio_buttons, item_wrapper_class: 'inline'

.row.message
  .col-md-3
  .col-md-9
    .hint
      %dl
        %dt 飲み会
        %dd 飲みに行く人数をあらかじめ決めて店を予約する必要があります。
        %dt 勉強会
        %dd 数人のスピーカーと、数人のLTを用意する必要があります。
        %dt もくもく会
        %dd 誰も一言も喋ることなく、もくもくと作業する場所を用意する必要があります。
```

以下のようなマークアップが重複していて嫌な感じがしますよね。DRYじゃなくて発狂しそうです。

```haml
.row.message
  .col-md-3
  .col-md-9
    .hint
      %p イベントの日付は開催日を入力してください。
```


## render layoutを使うとDRYに書ける

こんなパーシャルビューを用意しておいて、

```haml:_hint.html.haml
.row.message
  .col-md-3
  .col-md-9
    .hint
      = yield
```

こんな感じで使います。

```haml
// フォームの途中で・・・
= f.input :event_name

= render layout: 'hint' do
  %p イベント名はトップページのイベント一覧にも表示されます。

= f.input :event_type, as: :radio_buttons, item_wrapper_class: 'inline'

= render layout: 'hint' do
  %dl
    %dt 飲み会
    %dd 飲みに行く人数をあらかじめ決めて店を予約する必要があります。
    %dt 勉強会
    %dd 数人のスピーカーと、数人のLTを用意する必要があります。
    %dt もくもく会
    %dd 誰も一言も喋ることなく、もくもくと作業する場所を用意する必要があります。
```

重複がなくなってスッキリしますね。

## 引数も設定できる

以下のように書けばパーシャルビューに引数を渡すこともできます。

```haml
= render layout: 'hint', locals: { message_id: 'hoge' } do
```

「引数を渡したいときも、渡したくないときもあるんだよねー」という場合は、以下のようにパーシャルの方で制御するとNameErrorが発生せずに済みます。`local_assigns`を使うのがポイントです。

```haml:_hint.html.haml
:ruby
  data_message_id = (local_assigns.has_key? :message_id) ? message_id : nil

.row.message{data: {message_id: data_message_id}}
  // ...
```

ヘルパーで頑張ることもできますが、htmlのマークアップが絡んでくるところは、上手くパーシャルを使う方がスッキリすると思います。
vsftpd2.3.5でログインできない


vsftpd2.3.5でログインした際に、下記エラーで接続できない。

```
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
```

いろいろ調べたところ、homeディレクトリの書き込み権限をなくせばよいらしく、それだと意味がない。
リポジトリを追加して、vsftpdを入れて、confに設定を追加すれば良いらしい。

```
apt-get remove vsftpd
apt-get install python-software-properties
add-apt-repository ppa:thefrontiergroup/vsftpd
apt-get update
apt-get install vsftpd
```

再インストールして、```/etc/vsftpd.conf```に下記を追加。

```
allow_writeable_chroot=YES
```

無事にアクセスできるのを確認。

***
参考サイト

* [linux - vsftpd: refusing to run with writable root inside chroot - Stack Overflow](http://stackoverflow.com/questions/16102996/vsftpd-refusing-to-run-with-writable-root-inside-chroot)
Markdown をカンニングする方法

カンニングしたい Qiita の記事を開いて「編集リクエストを作成する」をクリックする。
(「編集リクエストを作成する」は記事のタイトルのすぐ下にあります)

そうすると Markdown の編集画面が開く。Markdown のソースが表示されるので参考にするか、テキストエディタ等にコピペしておく。

ブラウザの戻るボタンを押して、編集をキャンセルする。

以上 :thumbsup:
ActiveSupportのHash拡張であるslice, exceptがびっくりするぐらい便利


ActiveSupportによる既存Rubyクラスの拡張は人間をダメにするんじゃないかと思いますが、知っていると周りのプログラマに差をつけられるテクニックが満載だと思います。今回はHashの拡張メソッドの話。

## よくあるコード

```ruby
some_hash = {
  key_a: "some content",
  key_b: "some content",
  key_c: "some content"
}

# :key_aと:key_bを取り出したい
some_hash.select{|k, _| %i(key_a key_b).include? k} #=> {key_a: ..., key_b: ...}

# :key_cを除外したい
some_hash.reject{|k, _| k == :key_c} #=> {key_a: ..., key_b: ...}
```

いちいち「取り出したい」「除外したい」だけなのにブロックを使うのもおおげさな感じがします。

## ActiveSupport拡張を使うと・・・

```ruby
some_hash = {
  key_a: "some content",
  key_b: "some content",
  key_c: "some content"
}

# :key_aと:key_bを取り出したい
some_hash.slice(:key_a, :key_b) #=> {key_a: ..., key_b: ...}

# :key_cを除外したい
some_hash.except(:key_c) #=> {key_a: ..., key_b: ...}
```

こんなにシンプルに書けちゃいます。`!`をつけると破壊的なメソッドになります。

## その他の便利メソッド

### compact

```ruby
hash = { a: true, b: false, c: nil }
hash.compact # => { a: true, b: false }
hash # => { a: true, b: false, c: nil }
```

### reverse_merge

```ruby
options = options.reverse_merge(size: 25, velocity: 10)
# 以下のコードと等価
options = { size: 25, velocity: 10 }.merge(options)
```

以上、知っていると便利なActiveSupportによるHash拡張のご紹介でした。
App Transferするなら絶対に知っておいてほしいKeychainの話

## はじめに

Ａ開発者からApp TransferでＢ開発者にアプリを転送して、かつＢ開発者がアップデートをした場合、Keychainは空になります。Keychainは開発者固有です。

※ 開発者固有という言い方は語弊があると思いますが、書くのが面倒だったのでそういうことにします。

## キーチェンに認証情報が入っている場合

Ｂ開発者のKeychainを見に行くので、ログインなどが出来なくなります。

## Ａ開発者のKeychainは消えた？

消えていません。再度、App TransferしてＡ開発者がアップデートを行えば、Ａ開発者のKeychainが参照されます。

## なぜ

> Important: If you have recently received an app from another developer by way of the App Transfer process, the transferred App ID will now have your Team ID as the App ID prefix. If the previous version of your app was writing data to the keychain, submitting an app update with the new App ID will result in a loss of access to the previous keychain data. The keychain access will only be lost after an update to the app is released on the App Store
https://developer.apple.com/library/ios/technotes/tn2311/_index.html

## どうする

Keychainの共有は同じteam内でしか出来ませんので、メール認証などを導入するかNSUserDefaultなどに一時的においてやる必要があると思います。Keychainに入れていた情報をNSUserDefaultに移すのは注意が必要でしょう。

## 謝辞

上記情報は、FacebookのiOS Developers JAPANグループで質問して教えていただきました。誠にありがとうございました。

https://www.facebook.com/groups/ios.dev.jp/permalink/735691726452211/
Redshift でセッション内 timezone を指定するたった１つの冴えないやり方


## Redshiftのシステム時刻はUTC固定かつ(セッション内であっても)変更不可
```
mydb=# show timezone;
 TimeZone
----------
 UTC
(1 row)

mydb=# set session timezone='Asia/Tokyo';
ERROR:  tried to set timezone to Asia/Tokyo
DETAIL:  Not user settable.
mydb=# set local timezone='Asia/Tokyo';
ERROR:  tried to set timezone to Asia/Tokyo
DETAIL:  Not user settable.
```

## のはずなのだけど...
これを見て欲しい。

```bash
$ date ; psql -h redshift.somerandom.ap-northeast-1.redshift.amazonaws.com -U admin mydb -c "select now()"
2014年 6月 9日 月曜日 20時23分35秒 JST
              now
-------------------------------
 2014-06-09 20:23:38.011287+09
(1 row)

```
JSTになってますね！
## どうやってるの？
postgresユーザなら知ってる人もいるかもしれませんが、PGTZ環境変数を設定すると、timezoneが設定できてしまいます。

```bash
$ PGTZ="Asia/Tokyo" psql -h redshift.somerandom.ap-northeast-1.redshift.amazonaws.com -U admin mydb -c "select now()"
              now
-------------------------------
 2014-06-09 20:26:55.768399+09
(1 row)

$ PGTZ="America/New_York" psql -h redshift.somerandom.ap-northeast-1.redshift.amazonaws.com -U admin mydb -c "select now()"
              now
-------------------------------
 2014-06-09 07:27:04.316516-04
(1 row)

$ PGTZ="America/Los_Angeles" psql -h redshift.somerandom.ap-northeast-1.redshift.amazonaws.com -U admin mydb -c "select now()"
              now
-------------------------------
 2014-06-09 04:27:17.164795-07
(1 row)

```

pgAdmin3(そもそも古めのバージョンじゃないとダメですが)でも、下記のように起動するとJSTで使えます。

```
$ PGTZ='Asia/Tokyo' open /Applications/pgAdmin3.app/
```

## ところがどっこい
```
mydb=# select now() as time1 into newtable;
ERROR:  Column "time1" has unsupported type "timestamp with time zone".
```
ガーン、だな。"timestamp with time zone"なカラムが作成できないんじゃ、実質使い道がない。

**以上、ネタ投稿でした。**
グローバルオブジェクトの宣言

## 初めて見る宣言方法
javascriptにて、名前空間を定義使用とした際に、以下のようなグローバルオブジェクトの宣言がされているのをよく見かけた。

```
var objHoge = objHoge || {};
```

## 宣言を噛み砕くと
以下のような処理と同じであるらしい。

```
if(typeof objHoge === 'undefined'){
    var objHoge = {};	 // {}はオブジェクトを示す。
}
```
CircleCIはdb/schema.rbからdb:schema:loadでDBを作成する

CircleCIはmysqlを使って`rake db:create db:schema:load`からDB作成をするため、ローカルでsqliteを使っている場合にschema.rbの状態によってはDB生成が失敗する可能性があります。circle.ymlを書き換え`rake db:create db:migrate`に変更するか、ローカルをmysqlにしましょう。
Porboという開発用PSGIサーバを作った


# 概要

Mojoliciousに付随しているMorboのような開発用サーバが欲しかったので、
勉強がてらにPorboという開発用PSGIサーバを作った。
以下のような条件を全て満たす開発用サーバが欲しかった。

- シングルプロセスで複数のポートをListenできる(HTTP::Server::PSGIだとできない)
- SSLに対応している(Twiggyだと対応していない)
- Plack::Middlewareが使える(Morboだと使えない)

個人的にこれらの機能が備わっていると開発が捗る。

# Porboの中身

複数ポートをListenするからイベント駆動が必要そうだな、
ということでAnyEventを使用して書いた。
TwiggyやHTTP::Sever::PSGIを読んで、見よう見まねで作ったので、
AnyEventの仕様や動作などをまだよく理解できておらず勉強中。

テストはTwiggyのものを流用させていただき、
ひとまずテストが通るようになるまで修正をした。

コードレビューしていただける方、募集中です。
https://github.com/memememomo/Porbo



# 使い方


以下のコマンドでインストール。

```shell
$ git@github.com:memememomo/Porbo.git
$ cd Porbo
$ cpanm .
```

以下のコマンドで起動。

```shell
$ plackup -s Porbo --listen http://127.0.0.1:3000/ app.psgi
```


SSLを使用する場合は、認証ファイルなどを用意して、以下のように指定する。

```shell
$ plackup -s Porbo \
          --listen http://127.0.0.1:3000 \
          --listen https://127.0.0.1:3001 \
          --ssl-key-file server.key \
          --ssl-cert-file server.crt \
          app.psgi
```


とりあえずこれでドッグフードを食べながら改善していきたい。
Font Awesomeのアイコンはアイコンを被せて組み合わせられる

以外と使われていない機能だと思います。

Stacked Icons
http://fortawesome.github.io/Font-Awesome/examples/#stacked

```html
<span class="fa-stack fa-lg">
  <i class="fa fa-camera fa-stack-1x"></i>
  <i class="fa fa-ban fa-stack-2x text-danger"></i>
</span>
撮影禁止
```

組み合わせてみたサンプルです。
http://jsfiddle.net/X43Fq/
JavaでFizzBuzz、ラムダ使ってもっと短く（10行）

もっと短くできんものか・・・

```FizzBuzz.java
import java.util.Arrays;
import java.util.stream.IntStream;

public class FizzBuzz {
    public static void main(String... args){
        Object[][] o = {{15, "FizzBuzz"}, {5, "Buzz"}, {3, "Fizz"}};
        IntStream.rangeClosed(1, 100).mapToObj(x -> 
            Arrays.stream(o).filter(p -> x % (int)p[0] == 0).map(p -> p[1]).findFirst().orElse(String.valueOf(x))
        ).forEach(System.out::println);
    }
}
```