OmniAICreator/Qiita-1.07M huggingface dataset:
Swift 1.1 で シングルトン


iOS 開発でシングルトンを利用するシチュエーションとしては、クライアント MVC の Model層 のデータを複数画面(複数Controller)で共有したり、複数画面(複数Controller)で横断的に利用するマネージャー的なクラスで、といったところでしょうか。

> かつ、インスタンスとして状態を保持したい場合。Java(Android)等と同じノリでいいのか分かりませんが..

例えば Swift `1.1` だと次のように実現できます。

```swift:
class SomeSingletonClass {
  var name: String?
  
  class func getInstance() -> SomeSingletonClass {
    struct Static {
      static let instance = SomeSingletonClass()
    }
    return Static.instance
  }
  
  // インスタンス変数 name の値を出力
  func print() {
    if let name = self.name {
      println(name)
    }
  }
}

// それぞれでシングルトンインスタンスを取得
let some1 = SomeSingletonClass.getInstance()
let some2 = SomeSingletonClass.getInstance()

// some1 の方を変更
some1.name = "山田"

// some2 の方を出力
some2.print() // => 山田
```

### 補足

ちなみに Swift `1.2` 以降だと、もっと簡単に書けるらしい..
⇒ [SwiftにおけるSingletonパターン実装方法がBeta4でついに完成！？](http://qiita.com/takabosoft/items/dad6836506e72b000bed)

## 追記(2015.06.11)

例として `Person` クラスを管理するマネージャクラス（`PersonManager`）をシンクグルトンで実装してみた。

このマネージャークラスのインスタンスを取得（`PersonManager.getInstance()`）すれば、どの画面(Controller)からも同じインスタンスにアクセスできる。

```swift:
// Person クラスの定義
class Person {
  var name: String
  var age: Int

  init(name: String, age: Int) {
    self.name = name
    self.age = age
  }
}

// PersonManager クラス（Person を管理するマネージャークラス）の定義
class PersonManager {

  var people: [Person] = []

  class func getInstance() -> PersonManager {
    struct Static {
      static let instance = PersonManager()
    }
    return Static.instance
  }

  func register(person: Person) {
    people.append(person)
  }

  func getPerson(index: Int) -> Person {
     return people[index]
  }

  func getPeople() -> [Person] {
    return people
  }
}

// マネージャークラスのインスタンス(シングルトン)を取得
let personManager = PersonManager.getInstance()

// マネージャーへ Person を追加
personManager.register(Person(name: "山田", age: 32))
personManager.register(Person(name: "高橋", age: 25))

// マネージャから Person を取得
for person in personManager.getPeople() {
  println(person.name) // => 山田 高橋
}
```

## 追記(2015.06.22)

上記でクラスメソッドにしている箇所(`class func getInstance(){..}`)は、他のソースのサンプルを見る限り、次のようにクラス変数(変数名は`sharedInstance`)とするのが慣例のようだ。

```swift:
//..

class var sharedInstance : SomeSingletonClass {
  struct Static {
    static let instance = SomeSingletonClass()
  }
  return Static.instance
}

//..
```
GoでlocalhostのWebサーバーに本番用のホスト名でHTTPリクエストする

こんにちは、@ono_matopeです。

GoでHTTPサーバを開発する際、通常はlocalhostで適当にサーバを起動し、

```go
resp, err := client.Get("http://localhost:8080/hello")
```

など、ホスト名にローカルアドレスを指定したHTTPリクエストを発行してテストをしていることと思います。（net/http/httptestを使った場合も基本的には同じ）

ですが、例えば `http://matope.github.com` のように、URLホスト名の一部がパラメータであるなどの理由によって、localhost以外のホスト名でHTTPサーバをテストしなければいけないことがあります。こんな時にどうしてますか？hosts? dnsmasq? つらいですね。

実はGoであれば、ほんの少しのコード追加で、ローカルのサーバーに任意のホスト名でHTTPリクエストを発行することができます。

```go
	new_addr := "localhost:8080"

	var localDial = func(network, addr string) (net.Conn, error) {
		return http.DefaultTransport.(*http.Transport).Dial(network, new_addr)
	}

	var localDialTLS = func(network, addr string) (net.Conn, error) {
		return http.DefaultTransport.(*http.Transport).DialTLS(network, new_addr)
	}

	client := &http.Client{
		Transport: &http.Transport{
			Dial:    localDial,    //replace Dial
			DialTLS: localDialTLS, //replace DialTLS
		},
	}

	resp, err := client.Get("http://username.example.com/hello")
```

ご覧の通り、http.Transport構造体のDial(とDialTLS)関数を書き換え、HTTPリクエストによるDialをすべて`localhost:8080`に上書きしています。これにより、HTTPレベルでは

```
GET /hello HTTP/1.1
Host: username.example.com
```

と、本番用のホスト名でありながら、TCPレベルではlocalhostにリクエストを発行することに成功します。両レイヤーが綺麗に分離されたGoの標準ライブラリは本当に素晴らしいです。
これでかっこいいサブドメインのテストもhosts不要でらくちんですね。


（note: 上の例ではDial関数本体はhttp.DefaultTransport.Dial関数を使っていますが、これではDefaultTransportのDial関数をlocalDialに変更した場合、たぶん無限再帰呼び出しになってしまうので、下の方がいいかもしれません）

```go
	var localDial = func(network, addr string) (net.Conn, error) {
		return (&net.Dialer{
			Timeout:   30 * time.Second,
			KeepAlive: 30 * time.Second,
		}).Dial(network, "localhost:8080")
	}
```
Akka で TCP Echo Server

[前回はTCPクライアント側を書いた](http://qiita.com/castaneai/items/d2746523d51cd73d6aaf)ので次はサーバー側を．

## 要点

- `bind`に成功したら `Bound(localAddress)` メッセージが来る
- 新しい接続を `accept` したら `Connected(remote, local)` メッセージが来る
- `Connected`後は `sender()`で接続主のアクターが取れる
- 接続主のアクターに `Register`メッセージを送って データのやり取りを行う `Handler` を登録する
- データ受信すると `Handler`に`Received(data)` メッセージが来る

## 受け取ったデータをそのまま返すだけのサーバー

```scala:EchoServer.scala
import java.net.InetSocketAddress

import akka.actor.{ActorSystem, Props, ActorLogging, Actor}
import akka.io.{IO, Tcp}

/**
 * 接続されたクライアントとデータのやり取りを行うHandler 
 */
class Handler extends Actor {
  import Tcp._

  def receive = {
    // 受け取ったデータをそのまま送信主に返す
    case Received(data) => sender() ! Write(data)
    case PeerClosed => context stop self
  }
}

/**
 * クライアントの接続を受け入れるサーバー
 */
class Server(bindAddress: InetSocketAddress) extends Actor with ActorLogging {
  import Tcp._
  import context.system

  IO(Tcp) ! Bind(self, bindAddress)

  def receive = {
    case Bound(localAddress) =>
      log.info("bound on {}...", localAddress)

    case Connected(remote, local) =>
      log.info("accepted peer: {}", remote)
      val handler = context.actorOf(Props[Handler])
      sender() ! Register(handler)

    case CommandFailed(_: Bind) =>
      log.error("bind failed")
      context stop self
  }
}

/**
 * メイン関数
 */
object EchoServer {
  def main(args: Array[String]): Unit = {
    val system = ActorSystem("MySystem")
    val bindAddress = new InetSocketAddress("localhost", 12345)
    system.actorOf(Props(classOf[Server], bindAddress))
  }
}
```
XAMPP(MAC)にSmartyを入れたらエラーが出ました。

PHPsmarty初めて触ってます。

環境MAC(Vr10.10.3)
smartye(smarty-3.1.24)でインストール後、下記URLの通りに行ってみたところ、
※フォルダーは、画像の通りです。
![スクリーンショット 2015-06-10 22.30.19.png](https://qiita-image-store.s3.amazonaws.com/0/80428/4adcd2fb-8abd-4df5-a2a4-5856d3e2460b.png)

http://d.hatena.ne.jp/language_and_engineering/20130107/SmartyPHPTemplateEngineIntroduction

以下のエラーが出て、smartyeが動きませんでした。

Fatal error: Uncaught --> Smarty: Unable to load template file 'sample.tpl' <-- thrown in /Applications/XAMPP/xamppfiles/htdocs/smarty_test/libs/sysplugins/smarty_internal_template.php

お分かりになるかた、ご教授願いします。
ssh接続の基本(公開鍵認証方式)

今回は、サーバーへの公開鍵認証方式ssh接続の流れを書きます。(ほぼ備忘録)
目標は複数のサーバーに自由にssh接続できること。

流れは以下にのようになります。

1. rsaキー作成
1. id_rsa.pubの受け渡し
1. id_rsa.pubをAuthorized Keysへ登録
1. ssh config編集
1. 使い方

##環境
クライアント: OSX 10.10.3 Yosemite
サーバー:Debian8(ConoHa VPS)

``` js:/etc/ssh/sshd_config
//サーバーはパスワード認証、公開鍵認証できる状態にしておいてください。
//ファイル内のどこかにある項目
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      %h/.ssh/authorized_keys
PasswordAuthentication yes
//総当たりを防止のため、公開鍵認証で接続できる事が確認できしだい変更した方が良いです。
PasswordAuthentication no
//今回はrootで接続する事を確認しますが、終わったらnoに変更した方が良いです。
//(ユーザを新規に作って、そのユーザで操作する。)
PermitRootLogin  no
```
#rsaキー作成
まず、**クライアント**でrsaキーを作ります。
念のため、作った秘密鍵は他のユーザに読まれないように権限を変えてください。

``` js:terminal(クライアント)
$ pwd
  /Users/"ユーザー名"
$ cd ./.ssh  //フォルダが無い場合は作る。
$ ssh-keygen -t rsa 
//-中略- 画像参照
$ ls
id_rsa , id_rsa.pub
$ chmod 400 id_rsa //read権限があれば問題ないです。
```

![rsa作成画面](https://qiita-image-store.s3.amazonaws.com/0/82224/a35ff0d6-c892-d9a4-a4e7-5c3358742da5.png)

1つの接続に1つのキーを作るため、ファイルの名前は任意のものに変えた方がいいです。
(変えないと上書きされます。) 
```
※追記(2015/8/30) 
公開鍵(id_rsa.pub)を複数のサーバで使えば一つの秘密鍵(id_rsa)で全部にログインできます。
```

#id_rsa.pubの受け渡し
scpを使い、先ほど作った**id_rsa.pub**をサーバーへと送ります。
送り方はセキュアに渡せればなんでもいいです。("公開"鍵なので平文でもいいですが念のため)
※秘密鍵(id_rsa)を渡さないように注意

``` js:terminal(クライアント)
$ pwd
  /Users/"ユーザ名"/.ssh
$ scp ./id_rsa.pub root@aaa.bbb.ccc.ddd:/home/"サーバー側のユーザ名"/.ssh/id_rsa.pub
```
#id_rsa.pubをAuthorized Keysへ登録
``` js:terminal(サーバー)
$ pwd
  /Home/"ユーザ名"/.ssh
$ cat ./id_rsa.pub >>  ./authorized_keys //authorized_keysに追記します。
//以後このファイルに公開鍵を追記していけば問題ないです。
$ rm ./id_rsa.pub //いらないので消しておく
```
#ssh config編集
``` js:terminal(クライアント)
$ pwd
  /Home/"ユーザ名"/.ssh
$ vim config //emacs,nanoお好きなエディタで...
  Host Myserver_hoge //任意の名前
        HostName  aaa.bbb.ccc.ddd //サーバーのipアドレス ipv4/6
        port 6022 //ssh用のポート番号
        IdentityFile ./id_rsa //先ほど作った秘密鍵のファイル
        User hoge //ログインする名前

  Host Conoha_root //ConoHaのrootの例
        HostName  aaa.bbb.ccc.ddd
        port 6022
        IdentityFile ./id.pem //ConoHaのサーバーを立てた際にDLしたroot用ファイル
        User root
//書いておいてなんですが、rootではログインできない用にしておくべきです。(設定は上記の環境を参照)
```

#使い方
毎回　秘密鍵を指定したり、アドレスを打ったりしなくてもいいので便利です。

``` js:terminal(クライアント)
$ pwd
  /Home/"ユーザ名"/.ssh
$ ssh Myserver_hoge
$ ssh Conoha_root
```

##参考
[Debian 8 Jessie : SSHサーバー : SSH 鍵認証 ： Server World](http://www.server-world.info/query?os=Debian_8&p=ssh&f=4)
PostgreSQLのpg_dumpでスキーマのみバックアップする方法


pg_dumpを利用してバックアップをする場合、バックアップ時間の短縮・バックアップファイル容量の削減のために、Temporary的に利用するテーブルはスキーマのみをバックアップしたい場合がある。

その場合は、下記のように２回にコマンドを分けることでできる。(一回のコマンドではできないはず)

### １．データ・スキーマ両方取得したいテーブル群をdump

「-T」を指定することで、特定のテーブルをdump対象から除外できるので、tmp系以外をdumpする。(ワイルドカード指定可能)

```
pg_dump -U [ユーザID] -d [DB名] -h [host名] -T 'tmp*' > dump.sql
```
※ スキーマのみ取得したいテーブルは「tmp」から始まるものとする。

### ２．スキーマのみ取得したいテーブル群をdump

「-t」を指定することで、特定のテーブルのみをdump対象にできる。
さらに、「-s」を指定することで、スキーマのみをdump対象にできる。ここでtmp系のみをdumpする。

その際「>>」で先ほど出力したファイルに追記出力する。

```
pg_dump -U [ユーザID] -d [DB名] -h [host名] -t 'tmp*' -s >> dump.sql
```

これでtmp系テーブルはスキーマのみ、それ以外のテーブルはデータを含んだ形のバックアップファイルが作成できる。

※　上記手順は、どちらが先でも問題なし
PHPでユークリッドの互除法

#PHPでユークリッドの互除法

```php


echo '44と11の最大公約数は？';
var_dump(euclidean(44,11));
echo '<br>';
echo '44と13の最大公約数は？';
var_dump(euclidean(44,13));
echo '<br>';
echo '44と28の最大公約数は？';
var_dump(euclidean(44,28));
echo '<br>';
echo '44と44の最大公約数は？';
var_dump(euclidean(44,44));
echo '<br>';

function euclidean($x, $y) {
    if ($y == 0) {
        return $x;
    }
    return euclidean($y, (int)$x % $y);
}


```
Swift2のOptional Pattern


Swift2で新しく下記のような書き方ができるようになりました。

```swift
let someOptional: Int? = 42

// enumeration case pattern
if case .Some(let x) = someOptional {
    print(x)
}

// optional pattern （結果は上のenumeration case patternと同じ)
if case let x? = someOptional {
    print(x)
}
```

これは下記のシンタックスシュガーとのこと。

```swift
let someOptional: Int? = 42

switch (someOptional) {
case .Some(let x):
    print(x)
default:
    break
}
```

### メリット
1行でパターンマッチができるようになります。

```swift
let abc = (1, 2, 3)

if case (1, let y, let z) = abc {
    print("\(y), \(z)")
}
```

forでも使用できます。

```swift
let profiles = [("Frodo", 50), ("Aragorn", 78), ("Legolas", 2931), ("Boromir", 40)]

for case let (name, 0...100) in profiles {
    print("\(name) is young.")
}
```

guardでも使用できます。

```swift
let someOptional: Int? = 42

guard case let x? = someOptional where x > 100 {
    return
}

print(x)
```

ついでに複数まとめて書くこともできます。(ifでも可)

```swift
let someOptional: Int? = 42
let something: String? = "Hello World"

guard case let x? = someOptional where x > 100,
      case let str? = someThing where str.hasPrefix("Hello") else {
    return
}

print("\(x) : \(str)")
```

便利そうですね。
Linuxでのパーミッションメモ

よくわからなくなって、そのたびに調べてしまうので、個人的メモも兼ねてまとめておきます。

# それぞれのパーミッションが果たす機能
## 下位9ビット（上位3ビットごとに、オーナー、グループ、その他のパーミッション）

|八進数表記|英字表記|ファイルの場合|ディレクトリの場合|
|:----:|:----:|----|----|
|4|r|ファイルの中身を読める|ディレクトリの**ファイル一覧を**読める|
|2|w|ファイルに書き込みできる|ディレクトリ内のファイルの作成・削除・パーミッション変更などが可能|
|1|x|ファイルの実行が可能|ディレクトリ内のファイル・サブディレクトリの**中身**にアクセスできる|

### 注意点

* オーナー、グループの順に該当するかチェックしていく（オーナーのほうがパーミッションが厳しいと、本人はアクセスできないけど第三者なら、ということもありうる）
* ファイルの削除可否は、**ファイル側の**権限としては設定不可能
* あるディレクトリを読み書きするには、ルートからすべての実行権限が必要

## 上位3ビット（特殊権限）

|八進数表記|名前|英字表記|ファイルの場合|ディレクトリの場合|
|:----:|:----:|:----:|----|----|
|4000|setuid|オーナーの実行ビットがs[^1]|実行ファイルを、オーナーの権限で実行|効果なし[^2]|
|2000|setgid|グループの実行ビットがs[^1]|効果なし[^2]|中に作られるディレクトリ・ファイルのグループを、親のグループに設定|
|1000|スティッキービット|その他の実行ビットがt[^1]|効果なし[^2]|オーナーあるいはグループが一致しない場合、rootを除いて中のファイルの削除ができない|

# 数値の早見表
Linuxでは上述のように、特殊ビットを組み合わせることがあまりないので、普通のビットの組み合わせだけ一覧にしてみます。

|合計値|英字表記|
|----|----|
|7|rwx|
|6|rw-|
|5|r-x|
|4|r--|
|3|-wx[^3]|
|2|-w-[^3]|
|1|--x|
|0|---|

# `chmod`の使い方
コマンドとしての[chmod(1)](http://linuxjm.osdn.jp/html/GNU_fileutils/man1/chmod.1.html)では、英字表記と数値表記の両方を使えますが、英字表記でないとできないこともあります。

* 英字表記: 現在の状態から変更する分だけ指定できる
* 数字表記: 変更後の値を決め打ちにするしかない

## ディレクトリだけ実行ビットを立てたい
よくある需要で、「ディレクトリだけ実行ビットを立てたい」というのがあります。Unixコマンドに慣れていれば`find . -type d -print0| xargs -0 chmod ...`というように始めてしまうかもしれませんが、じつは再帰実行向けの特殊パーミッションとして、大文字の`X`があります。`chmod -R g+X dir`のように書くと、dir以下のディレクトリだけ実行パーミッションを付けてくれます。

##システムコールとしての`chmod`
プログラムから[chmod(2)](http://linuxjm.osdn.jp/html/LDP_man-pages/man2/chmod.2.html)のような関数・メソッドを呼ぶ場合、引数の指定には注意が必要です。うっかり、普通の整数として「666」のように書いてしまうと、それは**10進数**の値なので、8進法で書きなおせば`1232`、つまり`-w--wx-wT`というめちゃくちゃなパーミッションになってしまいます。これを避けるためには、

* 頭に0を付けた8進数リテラルで書く[^4]（8進数であることが役に立つ、数少ない場面の1つだと思います）
* （言語機能で対応しているなら）パーミッションごとの定数や、英字表記で書く
* 8進法文字列で書いておいて、JavaScriptであれば`parseInt(値,8)`[^4]、PHPであれば`octdec`のような関数で8進法の数値に変換する

など、ひと手間必要です。


[^1]: それぞれ、実行ビットが立っていない場合は大文字になりますが、Linuxでは（表にあるように）実行ビットなしで特殊ビットだけ設定しても何の変化もありません。
[^2]: あくまでLinux限定の話です。他のUnix系ではそれぞれ特有な動作をすることがあります（特に、スティッキービットの元来の機能はファイルに付与するものでした）。
[^3]: 「書けるけど読めない」というのは、普通のファイルだと追記もできないことになりますが、ディレクトリやデバイスファイルなどには[有用な例もある](http://unix.stackexchange.com/questions/22577/write-access-without-read-access)とのことです。
[^4]: JavaScriptのstrictモードでは、8進法の数値リテラルや文字列の暗黙的な8進法解釈が禁止されているので、`parseInt`で8進数を明記して呼び出す必要があります。
Xcode7時代のObjective-C

Swift2の発表で活気付く中、Objective-Cもひっそり進化しています。
iOSアプリは何個か作ってきたけど、**急にSwiftに移行するのは……**という方！
Xcode7で使えるようになったモダンな文法をちょっとだけ採用してみませんか？
**きっと手元のコードが美しく、保守しやすくなりますよ！**

# 新しく使えるようになった文法
新しく使えるようになった……と、いっても２つだけです(´・ω・｀)

* Generics
* Nullability Annotation

# Generics
**(1) 　ArrayやDictionaryに追加するオブジェクトの制限**
特定クラスのインスタンスだけをArrayやDictionaryに追加したいケースで有益です。
今までのObjective-Cでは、こんなコードを書いてインスタンスの型チェックを行う必要がありました。


```objc
if ([[hoge class] isSubclassOfClass:[NSObject class]]) {
    // NSObjectのサブクラスだったらArrayに追加
    [array addObject:hoge];
}
```

Genericsを使うとArrayやDictionaryの宣言時に格納する型を指定できます。

```objc
// Arrayに格納できるのはNSStringだけ！
NSMutableArray<NSString*> *array = [NSMutableArray array];

// NSStringなので格納できる
[array addObject:@"波動拳"];

// NSStringではないのでコンパイル時にエラー
[array addObject:[[NSObject alloc]init]];
```

Dictionaryでも同じことができます。

```objc
NSMutableDictionary<NSString*, NSObject*> *dic = [NSMutableDictionary dictionary];
[dic setObject:[[NSObject alloc] init] forKey:@"hoge"];
```

※Dictionaryの場合、Keyに指定する部分を”KeyType:クラス型”にするらしいが、なぜかコンパイルエラーになる……。
[Using Swift with Cocoa and Objective-C](https://developer.apple.com/library/prerelease/watchos/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html)

**(2) Genericsを用いたクラス設計**
もちろん、ArrayやDictionaryだけでなくクラス作成時にもGenericsは使えます。
変数やメソッド引数の型を流動的に変更したい……なんてときに便利ですね。

```objc
// Tに相当するクラス型をインスタンス生成時に指定します
@interface MyLogic<T> : NSObject

@end
```

外部から与えるクラス型に制限を付けることもできます。

```objc
// NSStringクラスのサブクラスだけ許容します
@interface MyLogic<T:NSString *> : NSObject

// 引数の型がインスタンス生成時に決まるメソッド
- (void)myMethod:(T)arg;

@end
```

このあたりの仕組みを上手くつかってやると

```objc
// NSStringクラスのサブクラスだけ許容します
MyLogic<NSString*> *hoge = [[MyLogic alloc] init];
// メソッドの型はNSString
[hoge myMethod:@"昇竜拳"];
```

みたいなことができます。

# Nullability Annotation
難しく書いていますが、SwiftのOptionalとほぼ同じでしょうか？
変数やメソッド定義時にnilが代入されうるかどうか定義できるようになりました。

```objc
// nilを許容するプロパティ
@property(nonatomic, strong) __nullable NSString *nilOK;
// nilを許容しないプロパティ
@property(nonatomic, strong) __nonnull NSString *nilNG;
```

ちなみに以下のコードでも同じ意味になります。

```objc
// nilを許容するプロパティ
@property(nonatomic, strong, nullable) NSString *nilOK;
// nilを許容しないプロパティ
@property(nonatomic, strong, nonnull) NSString *nilNG;
```

また、nonnull限定ですが以下のようにマクロを使った範囲指定も可能です。

```objc
NS_ASSUME_NONNULL_BEGIN
@property(nonatomic, strong) NSString *nilNG1;
@property(nonatomic, strong) NSString *nilNG2;
NS_ASSUME_NONNULL_END
```

それぞれ値を入れてみます。

```objc
self.nilOK = nil;
// こちらだけコンパイル警告が表示されます
self.nilNG = nil;
```

__nonnull属性を付けると、nil代入時に警告してくれます。

メソッド定義でも同じですね。

```objc
// nilを受け取らず、nilを返却しないメソッド
- (__nonnull NSString*)nonnullMethod:(__nonnull NSString*)string;
```

これもnilを指定して実行すると警告してくれます。

この仕組みを使うと、変数やメソッドの仕様(nilを許容するかどうか)を開発者に分かりやすく伝えることができます。

**「このメソッドの戻り値は、nilを返す可能性あるからチェックが必要だね！」**
**「このメソッドは、nilを受け付けないから実行前に確認を……」**

なんてのが阿吽の呼吸で伝わると素晴らしいと思います。
有効活用するとみんな幸せになれそうです。
.gitignore に設定を追加して反映させる

# .gitignore に追加しても反映されない！

既に Git 管理しているファイルを、新たに `.gitignore` に追加しても ignore してくれません。残念。

そこで参考記事 「[.gitignore の設定を反映させる](http://qiita.com/Potof_/items/c75eba9cfa72819506de)」 によると

```
$ git rm -r --cached .
```

となってますが、全ファイルを実行するため正直ちょっとコワイです((((；ﾟДﾟ))))ｶﾞｸｶﾞｸﾌﾞﾙﾌﾞﾙ

# じゃあどうするか！

単純にファイル指定しましょう。

## 1.  `.gitigonore` にファイル名を追加

```
$ vi .gitignore
*.swp
/path/to/file.txt # 追加
```

## 2. キャッシュ削除 
```
$ git rm --cached /path/to/file.txt
```

## 3. まとめて `commit` & `push`
```
$ git add .gitignore
$ git commit -m "add file to .gitignore"
$ git push origin master
```

以上です。簡単ですね！
Akka で TCP接続

意識の高いTCPクライアント・サーバーを作りたいと思っていたら「[Akka](http://akka.io)が良い」というのをどこかで見たので入門！．

## 要点

- `IO(Tcp)`でTCP接続するためのアクターを取得できる（TCPマネージャと呼ばれる）
- TCPマネージャに`Connect`メッセージを送るとTCP接続が確立

## localhost:80 に接続するだけのサンプルコード

```scala
import java.net.InetSocketAddress
import akka.actor.{Props, ActorSystem, ActorLogging, Actor}
import akka.io.{Tcp, IO}

class Client(remoteAddress: InetSocketAddress) extends Actor with ActorLogging {
  import Tcp._
  import context.system

  // サーバーに接続する
  IO(Tcp) ! Connect(remoteAddress)

  // 受け取ったメッセージを処理する
  def receive = {
    case Connected(remote, local) =>
      log.info("{}に接続しました", remote)
    case CommandFailed(_) =>
      log.error("接続に失敗しました")
      context stop self
  }
}

object ConnectTCP {
  def main (args: Array[String]): Unit = {
    // アクターシステム作成
    val system = ActorSystem("MySystem")
    val remoteAddress = new InetSocketAddress("localhost", 80)
    // 新しいClientアクターをシステムに追加
    system.actorOf(Props(classOf[Client], remoteAddress))
  }
}

```

## 出力結果

```
[INFO] [06/10/2015 20:11:03.884] [MySystem-akka.actor.default-dispatcher-2] [akka://MySystem/user/$a] localhost/127.0.0.1:80に接続しました
```

## 参考ページ
[Using TCP — Akka Documentation](http://doc.akka.io/docs/akka/2.3.11/scala/io-tcp.html)
Macでprotoc-gen-docを使う

protoc-gen-docのインストール&実行メモです

## protoc-gen-docとは
この記事を読んでる人には不要かもしれませんが、protoc-gen-docについて軽く説明しておきます。
https://github.com/estan/protoc-gen-doc
protoc-gen-docとは、ProtocolBuffersの定義ファイル(.proto)からドキュメントを生成してくれるプラグインです。

https://code.google.com/p/protoc-gen-docbook/
ちなみに似たようなprotocプラグインにprotoc-gen-docbookというのがありますが、名前のとおりDocbook形式(PDF)しか出力できない模様。
protoc-gen-docbookは使っていないので、嘘ついてるかもしれません。

## 前提（環境）
| 項目 | 説明 |
|----|-------------------------|
| OS | MacOSX Yosemite 10.10.3 |
| 検証日時 | 2015.06.10              |

## インストール
Macにインストールする場合はソースからビルドする必要があります。ビルドにはQt5が必要。（これが若干つらいw）

以下インストール手順です。

```shell-session
$ brew install qt5
$ git clone https://github.com/estan/protoc-gen-doc.git
$ cd protoc-gen-doc
$ PROTOBUF_PREFIX=/usr/local/Cellar/protobuf/2.6.1 qmake
$ make && make install
```

protobufのプレフィクスはバージョンに合わせて変えてください。

## 実行
protocの使い方は知ってる前提で。
[README](https://github.com/estan/protoc-gen-doc/blob/master/README.md)にも書いてるんですが、以下のような形でオプション指定すると使えます。

`--doc_out=<出力形式>,<出力ファイル>:<出力ディレクトリ>`

```shell-session
$ mkdir docs
$ protoc --doc_out=html,index.html:docs proto/*.proto
```

.protoファイルの指定とかは適宜変えてください。

出力例は以下にありますね。いい感じです。
https://rawgit.com/estan/protoc-gen-doc/master/examples/doc/example.html

## Ex
### Q.最終更新日がわからない
A. sed芸を使う

```shell-session
NOW=`date`
sed -i -e "s/<\/body>/<p><hr\/>Last Update: ${NOW}<\/p><\/body>/g" docs/index.html
```

おわり
Vimで複数ファイルの文字コードを一括置換する

* カレントディレクトリからサブフォルダ全てのtxtファイルを全て開くオプション

```lang:vim
:args **/*.txt
```

* ファイルの文字コード、フォーマットを指定して、読み直すオプション

```lang:vim
:e ++ff=unix ++enc=utf-8
```



# 上記を組み合わせて文字コードと改行コードを一括で置換します。


１. カレントディレクトリからサブフォルダ全てのtxtファイルを全て開く

```lang:vim
:args **/*.txt
```
２. 開いたファイルのリストをargsとして登録する

```lang:vim
:args
```
３. リスト全てに対して文字コード、改行コードの変更を実施

```lang:vim
:argdo e ++ff=unix ++enc=utf-8 | update
```

ちなみに改行コード「^M」を消したい場合は以下のようにすればできます

```lang:vim
:argdo % s/^M//g | update
```

※ 「^M」を入力するにはCtrl+Vを押してからCtrl+Mを押します
PhpStormでPHPクラスの完全修飾名を書く

最近のPHPでは、深い名前空間に入ったクラスの完全修飾名を **文字列として** 指定する必要があることが多々あります。

```php
return [
    'container' => [
        'module1' => [ 'class' => '\hoge\fuga\some\ModuleOne' ],
        'module2' => [ 'class' => '\hoge\fuga\another\ModuleTwo' ],
        // ... more
    ]
]
```

PHP5.5 以上なら `Module::class` でもいいし、Yii2 のコンポーネントなら `Module::className()` として、あとは PhpStorm の自動インポートで `use` を補ってもらうという手もあります。

```php
use hoge\fuga\some\ModuleOne;
use hoge\fuga\another\ModuleTwo;

return [
    'container' => [
        'module1' => [ 'class' => ModuleOne::class ],
        'module2' => [ 'class' => ModuleTwo::class ],
        // ... more
    ]
]
```

が、これには2つの罠があります

- 記述箇所がPHPで実行されなければなりません。つまりYaml等ではアウトです。
- Yii 方式の場合は autoloader が動いてしまい、該当する *.php が実行されてしまいます。(訂正)

もし autoloader が動いてしまうと、最初に設定ファイルを読み込んだら、アプリケーションで使うクラスを全てロードするまで待たされたうえ、自分の機能に来る前にメモリをだいぶ削られているかもしれません。レスポンスが終わるまで全く使わないクラスを読み込んでいるかもしれないのです。(純粋に ::class だけ使っているうちは起きないはずです / 訂正)

というわけで、 **PHPクラスの完全修飾名を文字列として** 簡単に得る方法を。

![スクリーンショット 2015-06-10 19.52.38.png](https://qiita-image-store.s3.amazonaws.com/0/11525/c247ab83-6a14-1f61-3f8a-1ab9bc22d53a.png)

ここを右クリックして「Copy Reference」はいこれだけ。

`\League\Flysystem\AwsS3v3\AwsS3Adapter` がクリップボードに入ります。あとは、たとえばこういうところにペタっと貼り付け。

```yaml
app:
  filesystem:
    adapter:
      class: '\League\Flysystem\AwsS3v3\AwsS3Adapter'
      credentials:
        key: ...
        secret: ...
      region: ...
      version: ...
```

かんたん
git mv で fatal: destination exists と言われる解決方法。

git mv コマンドを実行したら `fatal: destination exists,`というエラーが出ました。

# git mv でエラー
git mvでエラーがでました。

```bash:存在するというエラー
git mv hoge.html piyo.html

fatal: destination exists, source=hoge.html, destination=piyo.html
```
対象ファイルが存在するエラーとあります。

# 同じファイルが存在するか調べる
調べたら`git mv`しようとした先に既に同じ名前のファイルが存在しました。

つまりそもそも`git mv`しなくてよかったのです(☝ ՞ਊ ՞)
MySQL で FIFO っぽいことを実現したい

というよりは「最新○件を残してあとは消すクエリが欲しい」としたらこうやれば良さそう。

例えば、こういうテーブルがあって

```sql
CREATE TABLE `test` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `k` varchar(127) NOT NULL,
  `v` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx` (`k`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```

こういうデータがあったとする

```
mysql> SELECT * FROM test;
+----+------+-------+
| id | k    | v     |
+----+------+-------+
|  1 | key2 | value |
|  2 | key3 | value |
|  3 | key1 | value |
|  4 | key2 | value |
|  5 | key3 | value |
|  6 | key1 | value |
|  7 | key2 | value |
|  8 | key3 | value |
|  9 | key1 | value |
| 10 | key2 | value |
| 11 | key3 | value |
| 12 | key1 | value |
| 13 | key2 | value |
| 14 | key3 | value |
| 15 | key1 | value |
| 16 | key2 | value |
| 17 | key3 | value |
| 18 | key1 | value |
| 19 | key2 | value |
| 20 | key3 | value |
| 21 | key1 | value |
+----+------+-------+
21 rows in set (0.00 sec)
```

これの k = key1 のなかで id が大きい方3件を残して消したい場合、こういうクエリを発行すると良い。

```sql
DELETE FROM test WHERE k = 'key1' AND id NOT IN (
  SELECT id FROM (
    SELECT id FROM test WHERE k = 'key1' ORDER BY id DESC LIMIT 3
  ) t
)
```

すると、いい感じに消えてくれる。

```
mysql> SELECT * FROM test WHERE k = 'key1' ORDER BY id DESC;
+----+------+-------+
| id | k    | v     |
+----+------+-------+
| 21 | key1 | value |
| 18 | key1 | value |
| 15 | key1 | value |
| 12 | key1 | value |
|  9 | key1 | value |
|  6 | key1 | value |
|  3 | key1 | value |
+----+------+-------+
7 rows in set (0.00 sec)

mysql> DELETE FROM test WHERE k = 'key1' AND id NOT IN (SELECT id FROM (SELECT id FROM test WHERE k = 'key1' ORDER BY id DESC LIMIT 3) t);
Query OK, 4 rows affected (0.00 sec)

mysql> SELECT * FROM test;
+----+------+-------+
| id | k    | v     |
+----+------+-------+
|  1 | key2 | value |
|  2 | key3 | value |
|  4 | key2 | value |
|  5 | key3 | value |
|  7 | key2 | value |
|  8 | key3 | value |
| 10 | key2 | value |
| 11 | key3 | value |
| 13 | key2 | value |
| 14 | key3 | value |
| 15 | key1 | value |
| 16 | key2 | value |
| 17 | key3 | value |
| 18 | key1 | value |
| 19 | key2 | value |
| 20 | key3 | value |
| 21 | key1 | value |
+----+------+-------+
17 rows in set (0.00 sec)

mysql> SELECT * FROM test WHERE k = 'key1' ORDER BY id DESC;
+----+------+-------+
| id | k    | v     |
+----+------+-------+
| 21 | key1 | value |
| 18 | key1 | value |
| 15 | key1 | value |
+----+------+-------+
3 rows in set (0.00 sec)
```

（なんだかへんてこなクエリになってる（サブクエリの中にサブクエリが入ってる）のは、MySQL が WHERE IN で使ったサブクエリの中で LIMIT が使えないという制約があるからである。ポスグレとかはそのままいけるかも？）
Ruby on Rails 環境構築

##1. 必要なパッケージのインストール

yumで必要なパッケージをインストールしていく

```lang:command
$ yum update
$ yum install gcc-c++ glibc-headers openssl openssl-devel readline libyaml-devel readline-devel zlib zlib-devel libxml2 libxslt libiconv
```
gitは必須です

```lang:command
$ yum install git
```

##2. rbenvのインストール

rbenvとは、rubyのバージョン管理を簡単にするパッケージです。
gitで公開されているので、cloneします。

```lang:command
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
```

.bash_profile に下記を追記し、パスを通しましょう

```lang:.bash_profile
export RBENV_ROOT="~/.rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init -)"
```

##3. ruby-buildのインストール

ruby-build は ruby のインストールを簡単にしてくれるパッケージです。
これもgitで公開してくれているので、cloneします。

```lang:command
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

##4. rubyのインストール

いよいよ ruby のインストールです

公開されているrubyのバージョン一覧を確認します。

```lang:command
$ rbenv install -l
```

ここで install なんてないよーってエラーが出たら、ruby-buildが正しくインストールされていない場合があります。
3.をもう一度確認してください。

ちゃんとインストールしてるのにできないよー！！って方は、下記のコマンドを打ってみてください。

```lang:command
$ ~/rbenv/plugins/ruby-build/install.sh
```

rubyのバージョンを確認したら、インストールを行いましょう。
今回は、ruby 2.2.0 をインストールしてみます。

```lang:command
$ rbenv install -v 2.2.0
```

インストールした ruby を使用するように設定します。

```lang:command
$ rbenv rehash
$ rbenv global 2.2.0
```

ちゃんと設定されているか確認します。

```lang:command
$ rbenv -v
```

##5. railsのインストール

いよいよ rails のインストールをしましょう。

```lang:command
$ gem update --system
$ gem install --no-ri --no-rdoc rails
$ gem install bundler
```

ここでnokogiriのエラーが出てはまりました。
下記の方法で解決
[Ruby on Rails nokogiriエラーでbundle installできない](http://qiita.com/s_makinaga/items/4e04ac652b6b38ec63e9)

インストールできたか確認します。

```lang:command
$ rails rehash
$ rails -v
```
CentOS ifconfig 使えない！？

##1. 環境とか

* CentOS 7

##2. ifconfig が not found

ipアドレスを調べるために ifconfig 打ってみる

```console:command
$ ifconfig
-bash: ifconfig: command not found
```

え！？not found！？

いろいろ調べてみると、net-tools系のコマンドは標準でインストールされなくなったらしい。

##3. 解決方法

net-toolsのyumパッケージが残っているので、yumを使ってインストールする

```console:command
$ yum install net-tools
```

インストール後、再度コマンドを叩いてみる

```console:command
$ ifconfig
```

無事にIPアドレスを調べることができた

久しぶりにLinux触ったら、わけがわからないよー！

##4. ちなみに

ifconfig の代わりとなった新しいコマンドは下記です。

```console:command
$ ip addr show
```

覚えないとな、、、
ｃで隣接リスト

入門データ構造とアルゴリズムから

```c

#include <stdio.h>
#include <stdlib.h>

// A structure to represent an adjacency list node
struct AdjListNode
{
	int dest;
	struct AdjListNode* next;
};

// A structure to represent an adjacency list
struct AdjList
{
	struct AdjListNode *head;  // pointer to head node of list
};

// A structure to represent a graph. A graph is an array of adjacency lists.
// Size of array will be V (number of vertices in graph)
struct Graph
{
	int V;
	struct AdjList* array;
};

// A utility function to create a new adjacency list node
struct AdjListNode* newAdjListNode(int dest)
{
	struct AdjListNode* newNode =
		(struct AdjListNode*) malloc(sizeof(struct AdjListNode));
	newNode->dest = dest;
	newNode->next = NULL;
	return newNode;
}

// A utility function that creates a graph of V vertices
struct Graph* createGraph(int V)
{
	struct Graph* graph = (struct Graph*) malloc(sizeof(struct Graph));
	graph->V = V;

	// Create an array of adjacency lists.  Size of array will be V
	graph->array = (struct AdjList*) malloc(V * sizeof(struct AdjList));

	// Initialize each adjacency list as empty by making head as NULL
	int i;
	for (i = 0; i < V; ++i)
		graph->array[i].head = NULL;

	return graph;
}

// Adds an edge to an undirected graph
void addEdge(struct Graph* graph, int src, int dest)
{
	// Add an edge from src to dest.  A new node is added to the adjacency
	// list of src.  The node is added at the begining
	struct AdjListNode* newNode = newAdjListNode(dest);
	newNode->next = graph->array[src].head;
	graph->array[src].head = newNode;

	// Since graph is undirected, add an edge from dest to src also
	newNode = newAdjListNode(src);
	newNode->next = graph->array[dest].head;
	graph->array[dest].head = newNode;
}

// A utility function to print the adjacenncy list representation of graph
void printGraph(struct Graph* graph)
{
	int v;
	for (v = 0; v < graph->V; ++v)
	{
		struct AdjListNode* pCrawl = graph->array[v].head;
		printf("\n Adjacency list of vertex %d\n head ", v);
		while (pCrawl)
		{
			printf("-> %d", pCrawl->dest);
			pCrawl = pCrawl->next;
		}
		printf("\n");
	}
}

// Driver program to test above functions
int main()
{
	// create the graph given in above fugure
	int V = 5;
	struct Graph* graph = createGraph(V);
	addEdge(graph, 0, 1);
	addEdge(graph, 0, 4);
	addEdge(graph, 1, 2);
	addEdge(graph, 1, 3);
	addEdge(graph, 1, 4);
	addEdge(graph, 2, 3);
	addEdge(graph, 3, 4);

	// print the adjacency list representation of the above graph
	printGraph(graph);

	return 0;
}
```
実行結果
```
Adjacency list of vertex 0
 head -> 4-> 1

 Adjacency list of vertex 1
 head -> 4-> 3-> 2-> 0

 Adjacency list of vertex 2
 head -> 3-> 1

 Adjacency list of vertex 3
 head -> 4-> 2-> 1

 Adjacency list of vertex 4
 head -> 3-> 1-> 0
```
Ruby on Rails nokogiriエラーでbundle installできない

##1. 環境たち

下記環境でRuby on Railsの環境を構築中

* CentOS 7
* rbenc 0.4.0
* ruby 2.2.0
* rails 4.2.1

##2. nokogiriエラー

```lang:command
$ bundle install --path=~/sample/vendor/bundle
```
bundle install時にエラーが発生

```lang:error
Gem files will remain installed in /var/www/demo/vendor/bundle/ruby/2.2.0/gems/nokogiri-1.6.6.2 for inspection.
Results logged to /var/www/demo/vendor/bundle/ruby/2.2.0/extensions/x86_64-linux/2.2.0-static/nokogiri-1.6.6.2/gem_make.out
An error occurred while installing nokogiri (1.6.6.2), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.6.6.2'` succeeds before bundling.
```

##3. 解決方法

nokogiriはシステムのライブラリを使用するように設定する

```lang:command
$ bundle config build.nokogiri --use-system-libraries
```

また、システムには下記のライブラリがインストール済みである必要がある

* libxml2-devel
* libxslt-devel 

再度bundle install

```lang:command
$ bundle install --path=~/sample/vendor/bundle
```

うまくいきました
CoffeeScriptとかJavascriptとかで、省力化とかに使えるメソッドのエイリアスを作る

#こーゆーの、すき
[console.log を短く書くために（IE8+ 対応）](http://qiita.com/k_ui/items/c7d348075f0e76d3e930)という記事がQiitaにあって、大変面白かったので、下記みたいに一般化してみた。で、あー、こーゆーのすきー、って感じでゆるりと見ていた。まあ、たいていの場合bindで済むんだろうけど、Mathなんかも嘘メソッドの実装ありそうだしな。「?nternet ?xplorer 6」とかな。冤罪だったらごめん。でも、そーゆー可能性は少なくないので、リンク先で学んだ書き方は、大変安心感がある。あ、でも、**ログ以外の時は、空の関数返しちゃいかん気もするな……**。まあしかし、rootとかroot.methodとかが存在しないって、それは嘘過ぎるだろ。と無責任に締めていたのだが、ちょっと反省した。まあ、consoleじゃない時は、TypeError例外投げとこう。っとおもってちょっと書いたが、考えてみたら、rootが未定義だったらそれが何を意図して渡されたのか、分かんないや。丁寧にやりたい人は、rootも文字列で引き渡して、evalで評価して下さい。で、それならconsoleを意図していて未定義なら空の関数を返し、そうでないならTypeErrorで綺麗ですね。私はやらないです。ログに警告くらいです。

まあ、そういう危険なものだとしても、タイプ数減らすのには貢献するし、「alias」と名付けておくと可読性も上がるので、これで良いかな、と思う。

```coffeescript
alias = ((root,method) ->
  if not (root?[method]?)
    console.warn 'alias is danger!'
    return ->
  if not (root[method].bind?)
    return -> Function.prototype.apply.call(root[method], root, arguments)
  root[method].bind(root)
)

log = alias(console,'log')
fl = alias(Math,'floor')

log fl 5.23
```
FacebookのリアルタイムアップデートAPIを利用する手順

## はじめに

Graph APIだとデータを取得する場合、リクエストを投げる必要があるのでデータ量が増えてくるとAPIリミットが気になってきます。そこで「Facebook側で変更があったら変更を通知してくれる」仕組みが欲しくなります。

Facebookではこれを実現するのに、「Receiving API Updates in Real-Time」という仕組みがあります。
Receiving API Updates in Real-Time https://developers.facebook.com/docs/graph-api/real-time-updates/v2.3

今回はFacebookページのデータをリアルタイムに取得するための手順をまとめました。

## 1. 開発用のFacebookアプリを作成
事前に開発用のFacebookアプリが必要なので作成しておきます。こちらの記事がわかりやすいです。
facebookのアプリIDの作り方 ｜ アメブロカスタマイズ　初心者にもできるアメブロカスタマイズ！ http://simpleworks.jp/blog/facebook/7373

## 2. Facebookページに1で作成したアプリをリアルタイムアップデート用に追加
次に対象のFacebookページにリアルタイムアップデートを取得するアプリを追加する必要があります。

* 追加するエンドポイントは以前は`{page_id}/tabs`でしたが、version2.2以上では`{page_id}/subscribed_apps`です。
* `{page_id}/subscribed_apps`にPOSTすると追加されます。
* 結果を確認する時は`{page_id}/subscribed_apps`にGETリクエストするとリアルタイムアップデートを取得しているアプリの一覧が以下のように表示されます。(リアルタイムアップデートを利用している他アプリも表示される場合があります)

![スクリーンショット 2015-06-10 15.07.06.png](https://qiita-image-store.s3.amazonaws.com/0/33823/cf283eea-6121-4360-f46c-4c67c694a41d.png)

* 登録するには`publish_pages`パーミッションを取得した対象のFacebookページのページアクセストークンが必要なので、別途ユーザーがログインしたらページアクセストークンを取得する実装が必要になります。

## 3. 受信用のコールバックURLを用意
次にFacebookからの更新を受け取るコールバックURLを用意します

* Facebookからアクセスできる必要があるので、もちろんローカル環境のURLは不可
* 今回は`https://test.developer.jp/realtimeupdate/`という架空のURLを設定するものとする。

## 4. リアルタイムアップデートで取得するデータ(Subscribe)を設定
次に実際にリアルタイムアップデートで取得するデータ(Subscribe)の内容を設定します

* この設定には1で作成したアプリのIDとアプリのトークンが必要
* アプリのトークンはFacebookが提供している以下のサイトで調べます
Access Token Tool 
https://developers.facebook.com/tools/accesstoken/

```
{アプリID}/subscriptions
```

* 上記のエンドポイントへ以下のパラメータを指定してPOSTする

```
object: page
callback_url: https://test.developer.jp/realtimeupdate/
fields: feed
verify_token: 任意の文字列
```

* 今回はページのfeed(タイムラインの投稿)のみを取得対象にしたが、他にもユーザーのデータを取得することも可能
* 詳しくは公式サイトに記載されているので興味ある方はぜひ
Receiving API Updates in Real-Time https://developers.facebook.com/docs/graph-api/real-time-updates/v2.3

### 5. Subscribeを認証する
* 4でSubscribeを追加・変更した場合、指定したコールバックにFacebookから以下の認証用の文字列がGETリクエストで届く

```
hub.mode -> 'subscribe'
hub.challenge -> ランダム文字列
hub.verify_token -> 4の手順時に自分で設定したトークン値
```

- 認証のため、以下の処理を行う
 - hub.verify_tokenが自分が設定したトークンと等しいか
 - 等しい場合、hub.challengeの値をそのままレスポンスとして返す

```php
例: PHPの場合
if ($_GET['verify_token'] == 設定したトークン) {
  echo $_GET['hub_challenge'];
  return
} 
```

これでFacebook側に受信サーバーが認証され以降アップデートを受信できる。ちなみにアップデートはPOSTで送信されてくるのでPOSTリクエストを受信できるようにしておく必要はあり。

逆にSubscribeを解除する場合は、`{アプリID}/subscriptions`へDELETEリクエストすればOK
sqlalchemyでテーブルを動的に取得

# sqlalchemyでテーブルを動的に取得

試したバージョン。

```
In [1]: import sqlalchemy

In [2]: sqlalchemy.__version__
Out[2]: '1.0.5'
```

`sqlalchemy.Table()` にMetadataとかengine渡してやると、sessionにそのまま渡せる `Table` オブジェクトが取得できるらしい。

`{ <テーブル名>: sqlalchemy.Table }` のdictにしてモジュール広域に配置してみる。

```py:dbs.py
# -*- coding: utf-8 -*-

import sqlalchemy
import sqlalchemy.ext.declarative
Base = sqlalchemy.ext.declarative.declarative_base()

url = 'mysql://root@127.0.0.1/employees?charset=utf8'

engine = sqlalchemy.create_engine(url, echo=False)
tables = { name: sqlalchemy.Table(name, Base.metadata, autoload=True, autoload_with=engine)
        for name in engine.table_names()
    }

globals().update(tables)

Session = sqlalchemy.orm.sessionmaker(bind=engine)
session = Session()
```

`employees` テーブルから全件取得。（mysqlのサンプルのやつ）

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

import dbs

for x in dbs.session.query(dbs.employees):
    print x
```


## あんま動的なのもどうかと

TODO: 静的なclassの形に書き出すようにするといいかもしれない。

動的にテーブル舐めて、こういう形に吐き出すとか。

```py:こういう形
class Student(Base):
    __tablename__ = 'students'

    id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
    name = sqlalchemy.Column(sqlalchemy.String(255))
    kana = sqlalchemy.Column(sqlalchemy.String(255))

    def __repr__(self):
        return '<name=%s, kana=%s>' % (self.name, self.kana)
```
Node.jsで$.extendを使いたい!!!

$.extendさんには、散々お世話になりましたが、Node.jsじゃjQueryが使えません(サーバーサイドでは）。

extendモジュールなら、jQueryの$.extendと同じように使えます

#インストール

````js

npm install extend
````

使い方はjQueryと同じ🎶

````js
//fooをbarにコピーして、barのほうだけ値をいぢる

var extend = require("extend");
var foo = {a:1,b:2}
var bar = extend({},foo);

bar.a=2;

console.log(foo,bar)


結果：{ a: 1, b: 2} { a: 2, b: 2}

````
[ドキュメントはここ](https://www.npmjs.com/package/extend)
MonoDevelop で Unknown ToolsVersion '12.0' が出る場合


とりあえず *.csproj を開いて、以下のようにToolsVersion="4.0" に変更したら開けるようになる。

```
<Project ToolsVersion="4.0" DefaultTargets= ...
```

参考:
http://forums.xamarin.com/discussion/10460/any-workaround-for-this-error-unknown-toolsversion-12-0
コネクションプーリングライブラリ　BoneCP検証

参考URL：
http://jolbox.com/ 
http://netbuffalo.doorblog.jp/archives/4550713.html
http://atsuyama.blog.jp/archives/51340124.html
https://github.com/wwadge/bonecp
http://kielczewski.eu/2014/05/database-connection-pooling-with-bonecp-in-spring-boot-application/

BoneCPの設定値を調べるのは下記。ソースのコメントを見るのが早い
https://github.com/wwadge/bonecp/blob/master/bonecp/src/main/java/com/jolbox/bonecp/BoneCPConfig.java#L3


#概要
コネクション・プーリングが50倍早くなるという噂のBoneCPの検証を行う。50倍早くなるのならば導入メリットがかなり大きい。
単純比較での早くなるのは、検証結果が出ているので、今回は実環境、実構成での導入時に負荷テストをして優位性があるのかが知りたい。


#構成は下記
　SpringMVC + MyBatis + BoneCP
　SpringMVC + MyBatis + DBCP

#やりたいこと
　SpringMVC + MyBatisへの導入の方法
　BoneCPの設定項目調査
　サンプルアプリの作成
　Jmeterを使用しての負荷テスト（JDBCとBoneCPの両方で行い比較）


#検証の項目
　・DBCPとBoneCP両方の負荷テストを行い速度比較
　　段階的に負荷を増やしていくとどうなるか
　・DBCPとの機能の違いはあるのか
　　トランザクション使えるよね
　　→問題なし


#考察
　検証結果よりBoneCPの方がDBCPと較べて、1.3～1.4倍早くなることがわかる。
　乗り換えも設定ファイルの入れ替えのみで可能なので楽
　懸念事項でDBCP機能との違いは今のところ見当たらない。（BoneCPの方がより高機能）



#検証結果
####１リクエストの中で１００回selectを行うパターン

スレッド数：100
Ramp-Up期間：1
ループ回数：100

●DBCP
![image](https://qiita-image-store.s3.amazonaws.com/0/21343/edd0b176-8f7e-93cf-876f-be1d4238bab7.png)

●BoneCP
![image](https://qiita-image-store.s3.amazonaws.com/0/21343/e661c832-242a-3b2d-494e-39080dc7d84c.png)


------------------------------------------------
####１リクエストの中で１００回selectを行うパターン
スレッド数：500
Ramp-Up期間：1
ループ回数：20

●DBCP
![image](https://qiita-image-store.s3.amazonaws.com/0/21343/305a475e-ab44-58b5-b360-975098aacc0a.png)


●BoneCP
![image](https://qiita-image-store.s3.amazonaws.com/0/21343/a982956a-3a3f-c9c0-91b5-96f9fca1a298.png)


------------------------------------------------
####１リクエストの中で１００回selectを行うパターン
スレッド数：1000
Ramp-Up期間：1
ループ回数：10

●DBCP
![image](https://qiita-image-store.s3.amazonaws.com/0/21343/e0b2e4ab-2301-a017-029b-10c7c9e38eb3.png)


●BoneCP
![image](https://qiita-image-store.s3.amazonaws.com/0/21343/4b872059-6e45-6546-8819-b1d93ebed962.png)



＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
####１リクエストの中でselect,insertをそれぞれ１回行うパターン
スレッド数：1000
Ramp-Up期間：1
ループ回数：10

●DBCP
![image](https://qiita-image-store.s3.amazonaws.com/0/21343/00d1370a-268d-da56-5e07-410ba9139173.png)


●BoneCP
![image](https://qiita-image-store.s3.amazonaws.com/0/21343/d29c61ab-e4ea-6ad6-8ffe-421f109dc3c7.png)
これから作りたい Package リスト

- [x] [2016/08/03 追記] 元の記事を書いてから、1年ほど経過したが、作ってみたいPacakge は全部つくった。思ったよりも色々できた。DONE!

自分がつくりたい Package のアイデアを dump しておく。
目的は、自分の不満解消と、Atom や CoffeeScript の理解の為。

お勉強になる、面白いから、というのが一番の理由。

## vim-mode を外部 Package から拡張する。

以前作った[vim-mode-visual-block](https://atom.io/packages/vim-mode-visual-block) では Dirty ながらそういうことをやっている。

[vim-operator-user](https://github.com/kana/vim-operator-user) や、[vim-textobj-user](https://github.com/kana/vim-textobj-user) の様なものを作ることで、[vim-textobj-function](http://github.com/kana/vim-textobj-function) 等を **外部 Package** として作れるようにしたい。

vim-mode 側の変更も必要になるかもしれない。

* [x] [2016/08/03 追記] [vim-mode-plus](https://atom.io/packages/vim-mode-plus) をつくってプラグンの仕組みもつくった。

## vim-smalls の移植

自作の [vim-smalls](https://github.com/t9md/vim-smalls) を Atom に移植したい。
Vim はジャンプターゲットのキャプションをオーバラップさせられないので(バッファを書き換えない方法が無いわけではなさそうだけど。。)、一時的にバッファを書き換える力技でやっていたが、Atom は別のアプローチが可能なはず。[jumpy](https://atom.io/packages/jumpy) が参考になりそう。
Vim の実装ではバッファを書き換える都合上できなかったが、Atom では バッファを書き換えなくてよいので、結果、Pane にまたがってジャンプ先を選択できるはず。それができたら便利だな。。

* [x] [2015/07/16 追記] [smalls](https://atom.io/packages/smalls) をつくった。

# vim-choosewin の移植？

自作の [vim-choosewin](https://github.com/t9md/vim-choosewin) の機能を何らかの形で。。
vim-smalls の機能の一部にするか、役割的には Pane の選択なので、既につくった [paner](https://atom.io/packages/paner) の機能として取り込むか。。
vim-choosewin は大掛かりなので、もう少し minimal なものにしたい。

* [x] [2015/08/03 追記] [choose-pane](https://atom.io/packages/choose-pane) をつくった。

# vim-textmanip の移植？

自作の [vim-textmanip](https://github.com/t9md/vim-textmanip) の機能を何らかの形で。。
ないとどうにもならん、というほど困るものでもないが、textmanip の置き換えモード(replace mode)は、テキストで図を各時等、すごく楽だった。
あと、duplicate line も上方向にやりたいとか、block 単位で移動したいとか、、色々。
CoffeeScript の勉強になりそうなので。

* [x] [2015/08/03 追記] [vim-mode-plus-move-selected-text](https://atom.io/packages/vim-mode-plus-move-selected-text) をつくった。vim-mode-plus のプラグインパッケージとして実装。

## Grammar scope ベースでの移動(Motion)

vim-mode の Motion の拡張になるかもしれないが、単機能、小物パッケージとして。
Atom では 各単語 Grammar 解析され、相応の css class が設定されているので、**次のstring** に移動、とか出来れば便利なんじゃないか。。
ワンキーで、次の string に飛べるとか。。
[expand-selection](https://atom.io/packages/expand-selection)が参考になるかもしれない。。。
検索していて、aki77 さんの [expand-region](https://github.com/aki77/atom-expand-region/blob/master/lib/expand-region.coffee) ってのも発見した。。これも参考になるかもしれない。

* [x] [2015/06/14 追記] [goto-scope](https://atom.io/packages/goto-scope) をつくった。
* [x] [2015/08/03 追記] goto-scope は unpublish した。より better な機能を vim-mode-plus のモーション moveByScope として実装した。

## Emacs の kill-ring 的なやつ

既に幾つか Package があるようだ。
SelectList から選ぶ機能は必要なくて、貼り付けキーを連打すると、過去の clipboard の内容が順番に貼り付くようにしたい。
paste した範囲が、Selection のハイライトで視覚的に分かるようにしたい。

* [x] [2015/06/15 追記] [clip-history](https://atom.io/packages/clip-history) をつくった。

## Incremental Search 的なやつ

Emacs での、Incremental Search からの moccur みたいな流れが恋しい。
Search word をカーソル下から pick して検索候補として fill みたいなこともしたい。
[incremental-search](https://atom.io/packages/incremental-search) では search word の fill はやっていた。が、色々エラーがでて不満だったが、最近 メンテナを別の人が引き継いでいた。。なので、これを拡張する(PR)道もある。。

* [x] [2015/07/09 追記] [isearch](https://atom.io/packages/isearch) をつくった。
* [x] [2016/08/03 追記] isearch は unpublish した。 vim-mode-plus に組み込みのインクリメンタルサーチ機能に改善して取り込んだ。
chef実践入門　実機にて実施メモ（3） vagrantでChefSoloを利用する設定

[Chef実践入門](http://www.amazon.co.jp/dp/477416500X "Chef実践入門") 第5章のvagrantによるクックブック開発環境の構築　を実機にて検証したメモ
***ローカルからknife-solo コマンドを使ってクックブックを適用するのではなく、Vagrantでプロビジョニングする時に自動でクックブックを適用する設定。***

#0.環境前提
MacOSX , vagrant ,virtualboxインストール済み

#1.vagrantでChefSoloを使う設定を行う

##1.vagrant-omnibus のインストール

```bash:
vagrant plugin install vagrant-omnibus
vagrant plugin list
```

##2.Vagrantfileを以下に設定

```ruby:Vagrantfile
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "centos6.5"
config.vm.box_url = "http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.5-i386_chef-provisionerless.box"

config.vm.network "private_network", ip: "192.168.33.10"

# vagrant-omnibusの有効化
config.omnibus.chef_version = :latest

# Chef solo の設定
  config.vm.provision :chef_solo do |chef|
    # クックブックの配置場所
    chef.cookbooks_path = "./chef/cookbooks"
    # Attributeの定義
    chef.json = {
      nginx: {
        env: "ruby"
        },
        fluented: {
          installer: "rpm"
        },
        mysql: {
          server_root_password: 'rootpass'
        }
    }
    #適用するクックブックの定義 (まだクックブックがないので一旦コメントアウト）
    #chef.run_list = %w[
      #recipe[yum-epel]
      #recipe[nginx]
      #recipe[mysql]
      #recipe[fluented]
    #]
  end
end
```

#2.Vagrant起動時にプロビジョニングを実施

```bash:
vagrant up --provision
```

＊起動後にプロビジョニングを実行する場合は以下コマンド

```bash:
vagrant provision
```
Zabbix 2.0 でアイテムキーを作成する

#経緯
`system.run` のアイテムキーで `find` コマンド使ってファイル数等を集計して監視していたのですが、ファイル数が多いと `find` の結果が返ってくるまでのタイムラグで監視の遅延が発生していたので、アイテムキーを自作して監視方法を変更しました。

#環境
* CentOS 5.7 64bit
* Zabbix Server 2.0
* Zabbix Agent 2.0.8

#監視要件
* 監視対象ディレクトリに15分以上存在するファイルがあった際にアラートを上げる

#監視方法
##変更前
* `system.run` のアイテムキーで `find` コマンド使ってファイル数等を集計

##変更後
* 監視対象サーバのスクリプトにて監視対象ディレクトリのファイル数をカウントし、その結果をZabbixで取得

#手順
## 1. スクリプトの作成
####1.1. ディレクトリのファイル数を取得してファイルに吐き出すスクリプトを作成

```bash:file_check.sh
#!/bin/sh

QUEUE="<監視対象ディレクトリ>"
WAIT_TIME="15"

rm -f /tmp/queue.wait

for QUEUE_WAIT_DIR in `echo ${QUEUE}`
do
        QUEUE_WAIT_NUM=`find ${QUEUE_WAIT_DIR} -type f -mmin +${WAIT_TIME} | wc -l`
        if [ -e ${QUEUE_WAIT_DIR} ] ; then
          echo "${QUEUE_WAIT_DIR} ${QUEUE_WAIT_NUM}" >> /tmp/queue.wait
        fi
done
```

####1.2. cronに作成したスクリプトを登録

```shell-session:crontab
$ crontab -e
* * * * * <作成したスクリプト> > /dev/null 2>&1
```

## 2. zabbix-agentd.confへのパラメータ追加
####2.1. 下記パラメータを最終行に追加

引数付きパラメータについては[こちら](https://www.zabbix.com/documentation/2.0/jp/manual/config/items/userparameters)を参考にして下さい。
下記の`queue.size`と`queue.wait`がキーの名前となります。
監視対象ディレクトリ内のファイル数の数値だけを取得します。

```shell-session:zabbix_agentd.conf
# vim /etc/zabbix/zabbix_agentd.conf
UserParameter=queue.wait[*],grep $1 /tmp/queue.wait | cut -f 2 -d " "
```

####2.2. zabbix-agentプロセスの再起動

```shell-session
# service zabbix-agent restart
```

## 3. アイテムとトリガーの作成
####3.1. ZabbixサーバのGUIからこんな感じでアイテムを作成する
![WS000365.png](https://qiita-image-store.s3.amazonaws.com/0/79134/f1076bc7-0fb9-760d-3f95-c93f8ec0217a.png)

####3.2. 続いてトリガーを作成する
![WS000366.png](https://qiita-image-store.s3.amazonaws.com/0/79134/1f9a53b3-dc5c-f127-3114-a41fab56ed22.png)

####3.3. 条件式について
* いつもトリガーの条件式の書き方忘れてしまうので書いておきます。

```shell-session
{テンプレート名:queue.wait[＜監視対象ディレクトリ＞].count(#2,0,gt)}>0

```
上記は、直近2回の計測で監視対象ディレクトリにファイルが1つでもある状態が1回でもあったらトリガーを発動させます。

```shell-session:書式
{テンプレート名：アイテム名.count(直近何回から取得するか, 値, "gtとかeqとか")}>回数
```

###以上！

#後記
Zabbix難しいです。
もっと色々できるのに全然活用できてないので精進します！
こんなまどろっこしいやり方やってる時点であれな感じですね！
Universal AnalyticsのMeasurement Protocolにトライする

#なんとなくのイメージ
通常ページなら「[http://www.google-analytics.com/collect](http://www.google-analytics.com/collect)」、SSLページなら「[https://ssl.google-analytics.com/collect](https://ssl.google-analytics.com/collect)」にPOSTまたはGETでリクエストを投げつける。

投げつけた時のパラメーターを使って計測やデータの取得ができる（っぽい）。

#やるべきこと
必要な値をPOSTまたはGETで投げれるように値を設定する。

#とりあえずURLを作ってみた
##参考にしたもの
[【GoogleAnalitycs】ガラケーでユニバーサルアナリティクスのページビューカウントを取得する【ガラケー】](http://qiita.com/_shogo_/items/20e67c111068decf20aa)

##URLサンプル
上の記事に紹介されているPHPで出力されたURLを一部改変しただけ。
```
http://www.google-analytics.com/collect?v=1&tid=【UA-xxxxx-x】&cid=6bc1a344-e53c-4ec7-84b7-a29e2a050256&t=pageview&dh=【ドメイン名】&dl=&dr=&dp=/?SID=fooooooo&dt=PageTitle
```
ガラケーであろうとも「UA-」で良いらしい。

試しにcurlしてみる。
```
curl "http://www.google-analytics.com/collect?v=1&tid=【UA-xxxxx-x】&cid=6bc1a344-e53c-4ec7-84b7-a29e2a050256&t=pageview&dh=【ドメイン名】&dl=&dr=&dp=/?SID=haaaaa&dt=PageTitle"
```

![スクリーンショット_061015_050711_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/23936/e4796b89-8ac0-3ecd-58e7-3411bb2fe2be.jpeg)
アナリティクスでアクセスが記録された。

#パラメータいろいろ
ここから先は[Measurement Protocol Parameter Reference](https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters?hl=ja)のサンプルをざっくり和訳したものです。
##一般設定
|パラメータ名|パラメータ|概要|サンプル|
|:--|:--|:--|:--|
|プロトコルのバージョン|v|Measurement Protocolのバージョン。<br/>この値は1で固定。|v=1|
|トラッキングID|tid|GoogleAnalyticsのトラッキングID|tid=UA-123456-1|
##ユーザー系
|パラメータ名|パラメータ|概要|サンプル|
|:--|:--|:--|:--|
|クライアントID|cid|ユーザーを識別するためのID|cid=35009a79-1a05-49d7-b876-2b884d0f825b|
##トラフィック系
|パラメータ名|パラメータ|概要|サンプル|
|:--|:--|:--|:--|
|リファラー|dr|リファラー|dr=http%3A%2F%2Fexample.com|
|キャンペーン名|cn|カスタムキャンペーン名|cn=%28direct%29|
##ヒット系
|パラメータ名|パラメータ|概要|サンプル|
|:--|:--|:--|:--|
|計測タイプ|t|計測するタイプ|t=pageview|

##E-commerce系
|パラメータ名|パラメータ|概要|サンプル|
|:--|:--|:--|:--|
|トランザクションID**(必須)**|ti|トランザクションに必要なユニークID|ti=OD564|
|収入|tr|売上金額合計|tr=1547|
|送料|ts|注文に対する送料|ts=350|
|税|tt|注文に対する課税額|tt=1120|
|商品名|in|商品の名前|in=Shoe|
|商品単価|ip|商品1つあたりの価格|ip=350|
|商品数|iq|その商品の購入数|iq=4|
|SKU|ic|SKUまたは商品の固有番号|ic=SKU47|
|商品カテゴリ|iv|商品のカテゴリ|iv=Blue|
|通貨単位|cu|通貨単位|cu=EUR|





（文章はここで途切れている）
wafでstatic library (.a)を一緒にビルドする

## まとめ

`bld.program` に対して、`stlib` と `stlibpath` を指定してやればOKです（公式ドキュメントに書いてあるんですが、ググラビリティに少し貢献しようかなと思い、メモがてら書いておきます）

## 例

ローカルにある `libstlib1.a` と `libstlib2.a` を一緒にビルドしたいとすると、

```py:wscript（一部抜粋）
def build(bld):
     bld.program(
        source = 'foo.cpp',
        target = 'foo',
        stlib = [
            'stlib1',
            'stlib2',
            ],
        stlibpath = ['ライブラリのパス'],
        includes = ['.']
    )
```

例えばこんな感じで書けばOK。`stlib = ['libstlib1', 'libstlib2']` のように、libから始めるとコンパイルにコケるので注意

## 参考

- 公式ドキュメント [The Waf Book](https://waf.io/book/)