OmniAICreator/Qiita-1.07M huggingface dataset:
[SharePoint] Microsoft SharePointに関する情報源リンク集

QiitaにSharePointの情報があまりにも少ないので、まずは簡単なリンク集を貼ります。

他にもありがたい情報源がありましたら教えてください。

# [SharePoint Maniacs](http://sharepointmaniacs.com/)

http://sharepointmaniacs.com/

設定情報やニュースなどなど。お世話になっております。

# [新卒管理者の奮闘BLOG](https://office365blog-public.sharepoint.com/)

SharePoint(Office365)を使いこなしてます。

# [Japan SharePoint Support Team Blog](http://blogs.technet.com/b/sharepoint_support/)

http://blogs.technet.com/b/sharepoint_support/

設定やエラーに関する情報があります。

# [TechNet 自習書](https://technet.microsoft.com/ja-jp/sharepoint/jj899797)

https://technet.microsoft.com/ja-jp/sharepoint/jj899797

自習書です。SharePoint Server 2013を一から始めたいときに。

# [MSDN](https://msdn.microsoft.com/en-us/library/dn833469.aspx)

https://msdn.microsoft.com/en-us/library/dn833469.aspx

一応MSDNです。リファレンス的な情報にあたりたいときに。

# [SharePoint Designer 2013](https://www.microsoft.com/en-us/download/details.aspx?id=35491)

https://www.microsoft.com/en-us/download/details.aspx?id=35491

SharePointで何かちょいと凝ったするときには必携です。

Service Pack 1もありますので、こちらもインストール必須です。Office 365は、SP1入りじゃないと接続できません。

SharePoint Designer 2013 Service Pack 1 32ビットエディション
https://www.microsoft.com/en-us/download/details.aspx?id=42015

SharePoint Designer 2013 Service Pack 1 64ビットエディション
https://www.microsoft.com/en-us/download/details.aspx?id=42009
RubyでGmailを使ってメールを送信する

# はじめに
メールをプログラムから送りたいってよくありますよね :bulb: 
そのときいつも問題になるのはSMTPサーバです。

そんなとき、Rubyから天下のGmailを使えば超ミラクル簡単にメールを送信することができます :dancers: :dancers: :dancers: 

# アプリパスワードの取得
Googleの2段階を設定してるとそのままパスワードを使うことはできません。
アプリパスワードというものを発行すればパスワードで認証できるようになります。

https://security.google.com/settings/security/apppasswords

こちらのサイトで端末を適当に「Ruby」とかにしといてパスワードを生成してください。

# gmail gemのインストール
Rubyにはメールクライアントがいくつかありますが、Gmailだけを使うなら[dcparker/ruby-gmail](https://github.com/dcparker/ruby-gmail)というgemが便利です。
メール送信だけじゃなく受信とか検索もできます。

```bash
gem install ruby-gmail
```

# メールを送信する
次のプログラムでメールを送信できます。
詳しい説明は書きませんがフィーリングでなんとかなると思います。

```rb
require "gmail"

USERNAME = "hogehoge@foobar.com"
PASSWORD = "アプリパスワード"

gmail = Gmail.new(USERNAME, PASSWORD)

message =
  gmail.generate_message do
    to "foobar@hogehoge.com"
    subject "題名"
    html_part do
      content_type "text/html; charset=UTF-8"
      body "<h1>Email from Ruby!!</h1>"
    end
  end

gmail.deliver(message)
gmail.logout
```

詳しくは[README](https://github.com/dcparker/ruby-gmail)を読んでください！
内部では[mikel/mail](https://github.com/mikel/mail) gemを使ってるので、メッセージの設定方法(`to`とか`subject`とか)はこっちをみたほうがよさそうです。
リーダブルコードを読んだ

今回読んだ本
[リーダブルコード](http://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655/ref=sr_1_1?ie=UTF8&qid=1447764060&sr=8-1&keywords=%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89)

## 読みやすさの基本定理がわかる

**コードを綺麗に保つことでバグの発見や、開発の効率化が望める**
**また他のプログラマとの共有も容易になる**
**常に一歩下がってこのコードは理解しやすだろうかと自問自答して考える**

## 名前について
短いコメントのようなもの（名前に情報を埋め込む)

  - 明確な単語を選ぶ
  - 汎用的な名前を避ける
  - 抽象的な名前よりも具体的な名前を選ぶ
  - 長い名前を避ける
  - 不要な単語を投げ捨てる（ConverToStringをToStringの様に）
  - 限界値にはminとmaxを使う
  - 範囲を指定するときにはfirstとlastを使う
  - 排他的範囲にはbeginとendを使う


## コードの美しさに気を配る
見た目が美しいコードのほうが使いやすい

  - 一貫性のある簡潔な改行位置
  - メソッドを使った整列
  - 縦の線をまっすぐにする
  - 個人の好みより一貫性

## コメントの書き方
  コメントは書き手の意図を読み手に知らせる情報である

  - 自分の考えを記録する
  - コードからすぐわかることを書かない
  - ひどい名前はコメントをつけずに名前を変える
  - コードの欠陥にコメントをつける(TODO)
  - 読み手の立場になって考える(前もって予測する)
  - 動作を正確に伝える
  - コードの意図を書く
  - それやこれなどの代名詞は避ける


## ロジックの単純化を行う
単純なロジックになることで問題点の改善などがしやすく理解しやすくなる

  - 単純な条件を先に書く
  - 関心を引く条件や目立つ条件を先に書く
  - 巨大な式を分割する
  - 論理式を綺麗に書き直す
  - 変数が多いと追跡するのが難しくなる
  - 変数を頻繁に変更されると現在の値を把握するのが難しくなる
  - スコープを単純にする
  - 汎用的なコードを作る
  - 一度に１つのタスクを適用する
  - ライブラリを活用する
  - 短いコードを書く
  - 重複コードを削除する
  - 未使用な機能や無用の機能を削除する
　

## テストについて
  - テストを読みやすくする
  - 最小のテストを心がける
  - テストを読みやすくするとテスト以外のコードも読みやすくなる
  - 他のプログラマが安心してテストを追加変更できるようにする
  - エラーメッセージを読みやすくする
  - テストしやすいコード設計する
  - テストに名前をつける


## 自身が良いコードを書くためのプロセスについて

実際に書き他の方の意見を聞き、その都度改善しどのようにしたら綺麗なコードが書けるか覚える。身につける。（体に覚えさせる）これができると当たり前になると思う。

今後もプログラマである以上、多数のプログラマとプロジェクトを回していくと思うし、運用などにも関わると思う。その際に見やすく、バグが発見しやすく、カスタマイズしやすいようなコードを書けるよう自身でも綺麗なコード、読みやすいコード意識して書いていければと思う。
Gitをこれから覚える人にオススメしたい使い方参考サイト一覧

## Gitとは
[分散型バージョン管理システム](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0)

## 出来ること
[図で見るgitでできること](http://qiita.com/kyanro@github/items/4a3e4db3ee96e16c5d1f)

## SVNとの違い
[SVNからGitに移行して分かった、今すぐSVNを捨てるべき3つの理由](http://catcher-in-the-tech.net/806/)

## コマンドリファレンス
- **[イメージで理解するGitコマンド事始め](http://kinokoru.jp/archives/1017) (オススメ)**
- [役立つコマンド一覧](http://uguisu.skr.jp/Windows/git.html)
- [よくあるパターン別コマンド一覧](https://github.com/mollifier/github-practice)

## 実践できる練習サイト
#### [LearnGitBranching](http://k.swd.cc/learnGitBranching-ja/)
JavaScriptで作られた、Git練習用サイト
`まずはここから - gitの基本的なコマンド群をほどよいペースで学ぶ` を全て出来ればOK
余裕のある人は全レベル制覇してほしい！

## よくわからないからもっと詳しく教えて
#### [サルでもわかるGit入門](http://www.backlog.jp/git-guide/intro/intro1_1.html)
猿でもわかるように説明している
[メモ] Digispark(ATTiny85) Arduino開発環境で、Lチカ

## 動機
ebayでDigispark(互換品?)が$2くらい。やすい...(けど届くのに時間がかかる...)
Arduino開発の気分をあじわおう。


環境: Windows7 64bitで、こちらのDigistumpのwikiページ http://digistump.com/wiki/digispark/tutorials/connecting を参考にしています。

## 手順概要
a. Arduinoソフトウェアをインストール
b. Digisparkのボードパッケージ（Digistump AVR Board)をインストール
c. Windows7用のドライバをインストール
d. Lチカコード作成・書き込み・実演


## 手順詳細
### a. Arduinoソフトウェアをインストール
1. Arduinoのソフトウェアをダウンロード(Ver.1.6.6)
2. https://www.arduino.cc/en/Main/Software から、"Windows ZIP file for non admin install"版をダウンロード => `arduino-1.6.6-windows.zip`
3. 適当な場所に解凍 C:\Dev\arduino-1.6.6\
 
### b. Digisparkのボードパッケージ（Digistump AVR Board)をインストール
1. `arduino.exe` 実行
2. [ファイル]=>環境設定(CTRL+Comma)で、**環境設定**メニューを開いて、
3. `Adittional Boards Manager URLs:` に `http://digistump.com/package_digistump_index.json`を追加して、`[OK]`を押す。.. カンマ(,)区切りで複数入れられる
4. [ツール]=>マイコンボード: "Arduino/Genuino Uno"=> `ボードマネージャー...`を選択。
5. **Type**のドロップダウンメニューから`Contributed`を選択。するのだが、初回時でないので、一回ボードマネージャーのウィンドウを閉じて、もう一回開く。
6. `Contributed`をえらぶと、`Digistump AVR Boards by Digistump`というのがあるのでそこをクリック、`[インストール]`ボタンが出るので押して、インストールが終わったら`[閉じる]`。
7. [ツール]=>マイコンボード:から、<font color='red'>**Digispark (Default - 16.5mhz)** </font>を選択

### c. Windows7用のドライバをインストール
1. デバイスマネージャで、認識されなかったので、ドライバの更新をする。![DigisparkDriver0.png](https://qiita-image-store.s3.amazonaws.com/0/75594/cf23a448-9643-d574-9944-bd74236b5a85.png)
2. `Digistump AVR Boards`パッケージをインストールすると、
`%USERPROFILE%\AppData\Local\Arduino15\packages\digistump\tools\micronucleus\2.0a4` あたりにinfがあるのでそいつを指定して手動でドライバをいれる。
![DigisparkDriver.png](https://qiita-image-store.s3.amazonaws.com/0/75594/1aff2f23-2e37-ee96-d50f-3deeaf4f6ce9.png)
3. で、Windowsが認識するハズ

### d. Lチカコード作成・書き込み・実演
- http://digistump.com/wiki/digispark/tutorials/connecting#your_first_upload からサンプルコードを拝借
<br>これをこぴぺする。

```c:first_upload
// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(0, OUTPUT); //LED on Model B
  pinMode(1, OUTPUT); //LED on Model A   
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(0, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(1, HIGH);
  delay(1000);               // wait for a second
  digitalWrite(0, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(1, LOW); 
  delay(1000);               // wait for a second
}
```
<!-- ![DigisparkDriver2.png](https://qiita-image-store.s3.amazonaws.com/0/75594/95705689-d3b8-cb48-6b31-adb50a730562.png)-->

![DigisparkDriver3.png](https://qiita-image-store.s3.amazonaws.com/0/75594/6a1d396b-3188-25c5-278e-8213515e72c3.png)


- 検証: ボタンを押してビルド　（CTRL+R)
- マイコンボードに書き込む: (CTRL+U)
 - 1. ボタンを押す前に、Digisparkをはずす。
 - 2. ボタンを押す
 - 3. Digisparkを取り付ける。
 - 4. 書き込み後5秒後くらいにLEDが点滅し始める

=> 2箇所ある`delay(1000)`の`1000`を、100、250、500とかに変えてみると点滅のタイミングが変わる。
Go でパラメタライズドテストをする

## 忙しい人のための結論

Go はそもそもテストコードを書くのにテスティングフレームワークを使わないのが文化として根付いているし、パラメタライズドテストも普通にループ処理で実現する。

## Go でパラメタライズドテスト

先日、[TDDBC 仙台 5 に行ってきた](http://a-suenami.hatenablog.com/entry/2015/11/15/154907)のだけど、その課題に Go で挑戦してみたときにテストをパラメタライズしたくなった。

で、それってどうやるんですかって[Twitterで聞いてみた](https://twitter.com/a_suenami/status/665705912376541184)ら、どうやら（予想通りと言えば予想通り）普通にそのための構造体を作ってループで処理するしかないっぽい。

つまりこんな感じになる。

```go
// test code
func TestAdd(t *testing.T) {
    params := []struct {
        a int
        b int
        expected int
    }{
        { a: 1, b: 1, expected: 2 },
        { a: 1, b: 2, expected: 3 },
        { a: 2, b: -3, expected: -1 },
    }

    for _, p := range params {
        expected := p.expected
        actual := Add(p.a, p.b)

        if p.expected != actual {
            t.Errorf("Expected: %v, Actual: %v", expected, actual)
        }
    }
}
```

```go
// product code
func Add(a int, b int) int {
    return a + b
}
```

## 途中で落ちた場合

多くのテスティングフレームワークでは 1 テストケース 1 アサーションが推奨されていて、テストケース内にアサーションが複数あった場合に前のアサーションが失敗するとそれ以降のアサーションは評価されない。

上記の Go のテストでも途中で落ちた場合にそのような挙動になるとあまり嬉しくないのだけど実際はどうなるのか。

こんな感じに変更して試してみた。

```go
params := []struct {
    a int
    b int
    expected int
}{
    { a: 1, b: 1, expected: 2 },
    { a: 1, b: 2, expected: 2 }, // miss!
    { a: 2, b: -3, expected: 1 }, // miss!
}
```

結果はこんな感じ。

```
--- FAIL: TestAdd (0.00s)
        sum_test.go:24: Expected: 2, Actual: 3
        sum_test.go:24: Expected: 1, Actual: -1
FAIL
exit status 1
FAIL    sum_test       0.007s
```

2 つ目のテストケースで終わらず 3 つ目のテストまで実行され 2 つとも落ちている。
`t.Errorf` 内のメッセージやその一部をパラメータに含める等の工夫をすればテスト失敗時の情報量もリッチにできるし、パラメタライズドテストとして問題なく使っていけそうな気がする。
MongodbのWindowsインストールとサービス設定とRobomongo

MongoDBをインストールし、自動で起動するようにWindowsにサービス設定する方法をメモしておきます。
ついでにMongodb用のGUIツール「Robomongo」もインストールします。

#インストール環境

* OS：Windows8.1 64bit
* DB：MongoDB 3.0.7
* GUIツール：Robomongo 0.8.5

#本体インストール

- [ ] 下記サイトから環境にあった最新版をダウンロード
  [MongoDB本家サイト(英語)](https://www.mongodb.org/)
<br />

- [ ] ダウンロードしたmsiファイルをインストール
 独自の場所にインストールする場合は「Customize」を選択する事。
<br />

- [ ] 以下のディレクトリを手動で作成
 ``＜インストールディレクトリ＞\data
 ＜インストールディレクトリ＞\logs``
<br />

- [ ] 以下のディレクトリをWindows環境変数Pathに追加設定
 ``＜インストールディレクトリ＞\bin``

#Windowsサービス登録

- [ ] 設定ファイル作成
 <br />
 下記フォルダに「mongodb.conf」ファイルを作成する。
 <br />
 ``＜インストールディレクトリ＞\mongodb.conf``

```yaml:mongdb.conf
systemLog:
   destination: file
   path: ＜インストールディレクトリ＞\logs\mongodb.log　　　←ファイル名まで記述
   logAppend: true
storage:
   dbPath: ＜インストールディレクトリ＞\db
net:
   bindIp: 127.0.0.1
   port: 27017
setParameter:
   enableLocalhostAuthBypass: false
```
<br />

- [ ] MongodbのコマンドでWindowsサービス登録<br />
 下記コマンドを**管理者**でDOS窓を開いて実行します。<br />
 ``mongod.exe --config "＜インストールディレクトリ＞\mongod.cfg" --install --serviceName MongoDB``<br />
 ※configファイルへのパスは絶対パスで行う事<br />
 ※参考：https://docs.mongodb.org/manual/tutorial/install-mongodb-on-windows/
<br /><br />
- [ ] サービス起動<br />
 初回は<br />
 ``コントロールパネル⇒管理ツール⇒サービス⇒MongoDB``<br />
 からサービスを起動する。2回目起動からは自動で実行されるはず。
 ![image1.png](https://qiita-image-store.s3.amazonaws.com/0/96681/4107974e-fb7b-2adc-70eb-f02df6fa7eb1.png)


#Robomongoインストール

- [ ] 下記サイトから環境にあった最新版をダウンロード
 ``http://robomongo.org/``
 <br />

- [ ] ダウンロードしたexeファイルをインストール
 <br />
- [ ] DB作成
 1. robomongo.exeを起動すると「MongoDB Connections」が開くので「Create」リンクをクリックする。 <br />
![image2.png](https://qiita-image-store.s3.amazonaws.com/0/96681/a153ad37-7cba-b5f8-80ff-54dfe82de72d.png)
 1. DB名を入力して「Save」ボタン押下 <br />
![image](https://qiita-image-store.s3.amazonaws.com/0/96681/c6a6431a-a467-928f-2313-d7e85452fda0.png)
 1. DB完成。 <br />
![image3.png](https://qiita-image-store.s3.amazonaws.com/0/96681/4ffe12d0-62bc-e290-5231-6caaa834ae1e.png)
【コピペで使える】jQueryでインクリメンタルサーチ


Railsでインクリメンタルサーチを作った時のコードを使いやすく切り出してみました。

※インクリメンタルサーチ: 入力のたびに自動的に検索をする検索方法 (例: Google検索)

## 何ができるの？
• テキストボックスに入力があった時にコールバック関数を呼び出す
• サーバーへの負荷を抑えるために入力をやめるまで検索をしない

## 前提

* 検索自体はサーバー側で行う
* jQueryを利用している

## コピペ用コード

```javascript:isearch.js
var ISearch = ISearch || {};

ISearch.setup = function(textfield, callback, options) {
	var timer = null, lastInput = '';

	wait = 500;
	minLength = 0;
	if (options !== undefined) {
		wait = options.wait;
		minLength = options.minLength;
	}

	textfield.on('keyup', function() {
		var input = $.trim($(this).val());
		if (lastInput !== input && input.length >= minLength) {
			clearTimeout(timer);
			timer = setTimeout(function() {
				callback(input);
			}, wait);
		}
		lastInput = input;
	});
};
```

## 使い方

```javascript:app.js
var textfield = $('#search'); // <input type="text" id="search">

// 例: 本の検索
ISearch.setup(textfield, function(input) {
	$.get("search_book", { q: input }
	).done(function(books) {
		$("#books").html(books);
	});
});

// 入力待機時間を1秒に変更
ISearch.setup(textfield, function(input) {
	// search
}, { wait: 1000 });

// 3文字以上入力されるまで検索しない
ISearch.setup(textfield, function(input) {
	// search
}, { wait: 1000, minLength: 3 });

```
msys2(pacman)の不具合がMacTypeを停止することで解消した

要約
MacTypeを動かしていると、msys2のpacmanでのアップデートが上手くいかなかった。
MacTypeを止めれば上手く行った。

経緯
msys2をインストール、update-coreを実行、上手く行かず。
キーの初期化など色々試すが上手く行かず。
http://github.com.proxy.parle.co/Alexpux/MSYS2-packages/issues/375
↑の最後の３行にある通りMacTypeを停止すると上手く行った。
理由は不明。MacType特有の干渉なのかどうかも不明。
取り急ぎ書いておく。駄記事ご容赦。
[小ネタ]yumでupdate出来ないのはversionlockが悪かった話

とあるサーバーでとあるパッケージだけyum updateができず、なんでやーとなった話です。

# 結論

+ 誰かがyum pluginのversionlockを導入し、対象のrpmのバージョンのロックを指定していたために発生していた
+ versionlockが導入されている場合、yumコマンド実行時に`Loaded plugins:  versionlock`と表示されるのでその場合、本事象を疑ったほうが良い

# 事象
 
 + `yum update hoge`と実行してもパッケージのupdateができない
 + `yum search hoge`しても検索できない
 + ただし、他同様のサーバー環境では`yum search hoge`とすると該当するのが存在する。また同様に`yum install hoge`でインストール可能

# 解決するまで

問題を整理するために他の環境でyumを使っときと問題の環境でyumを実施した時の差分を検証してみたのですが、その際に少し違いが

```bash
# yum installできる環境
$yum search hoge
Loaded plugins: fastestmirror, security

# yum installできない環境
$yum search hoge
Loaded plugins: priorities, update-motd, upgrade-helper, versionlock
```

!?

何かyumのLoaded pluginsが違う。。。
vesionlockとかあやしすぎる。。。

ということで確認。

[yum plugin 「versionlock」の導入](http://kajuhome.com/yum_versionlock.shtml)

[yumのまとめ - 3.yumプラグインの説明とインストール手順](http://yatmsu.hatenablog.com/entry/20081119/1227069838)

なるほど。` /etc/yum/pluginconf.d/versionlock.list`というファイルにパッケージとバージョンを書いておくとそれで固定されると。

というわけで問題のサーバーで確認するとビンゴでupdateできないパッケージのバージョン情報がロックされており、それが原因でyum installができませんでした。

versionlockしている場合でも、`yum search`は出来るようにするとか`yum install`とした時もversionlockによって出来ません、みたいなメッセージが出てくれれば良いのですが、何もメッセージが出ない（あたかもリポジトリに対象パッケージが内容に見える）のではまると中々分かりにくそうな印象。。。

試してないですが、debug実行すると何かでるのかなぁ。。。
Parse X509 certificate in Swift 2.0


## Parse X509 certificate in Swift 2.0
X509の証明書をSwiftでパースしました．

## 事前準備
- DERフォーマットの証明書を用意しておく
- `{Project Name}/Resources/mykey.der` として保存しておく

## Parse.swift
```swift:X509Parser.swift
import Foundation
import Security

class X509Parser {
    func parse() {
    	// converting der file to secCertificate type
        let secCertificate: SecCertificate = getSecCertificate()
        // converting SecCertificate to SecTrust
        let secTrust: SecTrust? = getSecTrust(secCertificate)
        
        // Sample: extracting public key
        let publicKey: SecKey? = SecTrustCopyPublicKey(secTrust!)
        print(publicKey)
    }

    func getSecCertificate() -> SecCertificate {
        let path: String = NSBundle.mainBundle().pathForResource("mykey", ofType: "der")!
        let key: NSData = NSData(contentsOfFile: path)!
        let secCertificate: SecCertificate = SecCertificateCreateWithData(kCFAllocatorDefault, key)!
        return secCertificate
    }

    func getSecTrust(secCertificate: SecCertificate) -> SecTrust? {
        var secTrust: SecTrust?
        SecTrustCreateWithCertificates(secCertificate, SecPolicyCreateBasicX509(), &secTrust)
        return secTrust
    }
}

```

## 使い方
プロジェクトをシングルページアプリケーションを選択して作成後，事前準備を行い，コードをコピペすれば動くと思います．
行数書いてないのにSwiftのコードを書くの疲れる...

## 公開鍵以外の情報について
[Apple > Security Framework Reference > Certificate, Key, and Trust Services Reference](https://developer.apple.com/library/ios/documentation/Security/Reference/certifkeytrustservices/)
MacOSX > ターミナル: tcpdumpでUDP受信できない / Unityソフト: UDP受信できる > vmnet1を使う

```txt:動作環境
UDP送信: CentOS 6.5 (IP: 192.168.10.8)
UDP受信: MacOS X 10.8.5 (IP: 192.168.10.4)
```

## 問題

CentOSからMacOS XへのUDP送信を行い、MacOS X側でキャプチャしようとした。

MacOS X側 (rootにて)ではターミナルで以下を実行。

```
# tcpdump -In udp portrange 6000
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on en0, link-type IEEE802_11_RADIO (802.11 plus radiotap header), capture size 65535 bytes
```

CentOS側

```
$ echo "test" | nc -w 1 -u 192.168.10.4 6000
nc: Write error: Connection refused
```

失敗する。

一方で、MacOSXでターミナルではなく、Unityで作ったUDP受信プログラムでは受信が成功する。

MacOSXのfirewallは切れた状態。


##対応策

[superuser](http://superuser.com/questions/1001997/capturing-incoming-udp-packet-fails)にて詳細を書いているが、VMware Fusion関連で何か起きているようだ。

CentOS 6.5はMac OS X上のVMware Fusionで動かしている。

MaC OS X側のネットワークとしては、en0, vmnet1, vmnet8があり、en0では失敗するが、vmnet1やvmnet8でUDP通信する場合は成功する。

例としてvmnet1での通信例

CentOS側

```
$ echo "test" | nc -w 1 -u 172.16.173.1 6000
$
```

Mac OS X側では以下となり、受信が成功している.

```
# tcpdump -n udp portrange 6000
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on en0, link-type EN10MB (Ethernet), capture size 65535 bytes
07:28:39.958576 IP 192.168.10.8.59866 > 172.16.173.1.6000: UDP, length 5
```
技術英語 > to narrow the gap between rich and poor. / narrowing down these options

@ LOE > June 8, 2012
http://loe.org/shows/shows.html?programID=12-P13-00023
> to narrow the gap between rich and poor.

<hr>
narrowで思い出すのは

> narrowing down these options

会議英語関連の本に掲載されていたもので、選択子の絞り込みの場面で使われていた

<hr>
関連して思い出したのは

http://eow.alc.co.jp/search?q=near-sighted&ref=sa
> near-sighted
> 2. 〈主に米・軽蔑的〉近視眼的な、目先のことしか見えない、目先のことばかり考える、短絡的な、先見の明のない
Perl6 Cookbook 一時変数を使用しないで変数の値を交換する

一時変数を使わずに、変数の値を交換する。

Perl6の環境構築についてはこちら。
[Perl6導入とHello, world! - Qiita](http://qiita.com/B73W56H84/items/2153e6211ed617b4605d)

# スカラーの値の交換
##### Perl5
```pl
use v5.18;

my ( $a, $b, $c ) = qw( あ い う );
say $a, $b, $c; #=> あいう


( $a, $b, $c ) = ( $b, $c, $a );
say $a, $b, $c; #=> いうあ
```
##### Perl6
```pl
use v6;

my ( $a, $b, $c ) = < あ い う >;
say $a, $b, $c; #=> あいう


( $a, $b, $c ) = $b, $c, $a ;
say $a, $b, $c; #=> いうあ
```

# 配列の値の交換
##### Perl5
```pl
use v5.18;

my @array = ( 6 .. 9 );
say @array; #=> 6789

@array[0,1,2,3] = @array[2,3,1,0];
say @array; #=> 8976
```
##### Perl6
```pl
use v6;

my @array = 6 .. 9;
@array.join.say; #=> 6789

@array[0,1,2,3] = @array[2,3,1,0];
@array.join.say; #=> 8976
```

# ハッシュの値の交換
##### Perl5
```pl
use v5.18;

my %hash = (
'大空' => 'あかり',
'瀬名' => '翼',
);
say %hash;

@hash{'大空', '瀬名'} = @hash{'瀬名', '大空'};
say %hash;
```
##### Perl6
```pl
use v6;

my %hash = '大空' => 'あかり',
           '瀬名' => '翼';
%hash.kv.join.say;

%hash{'大空', '瀬名'} = %hash{'瀬名', '大空'};
%hash.kv.join.say;
```

# 参考や注釈

* [1.3. Exchanging Values Without Using Temporary Variables](http://docstore.mik.ua/orelly/perl/cookbook/ch01_04.htm)
* [class Array](http://doc.perl6.org/type/Array)
* [class Hash](http://doc.perl6.org/type/Hash)
* [Generic swap - Rosetta Code](http://rosettacode.org/wiki/Generic_swap#Perl_6)


* [PHP:listを使って配列の順番を任意に入れ替える - Qiita](http://qiita.com/qube81/items/aab9803c64a1068c769b)
ターミナルから直接Dashを開いて素早くドキュメントを引こう

　DashはAPIドキュメントのブラウザ及びコードスニペットマネージャです。多くの言語・フレームワークに対応しており、一度ドキュメントをダウンロードすればオフライン環境でもドキュメントを読むことが可能になります。

　ところで、調べたい事項が出てくるたびにいちいちDashを立ち上げるor起動しっぱなしのDashのウィンドウを切り替えて、検索ワードを入力する必要はありません。

　カスタムURLスキーマを使いターミナルから直接、Dashを起動し、調べたい事柄を引くことができます。ターミナルで下記のように入力することで、Dashが起動し対象を引くことが可能です。例を示します。

```:(例1)stringを引く
open dash://string
```

```:(例2)Java8のStringを引く
open dash://java8:String
```

```:(例3)Node.jsのfsを引く
open dash://nodejs:fs
```

```:(例4)Unity3DのVector3を引く
open dash://unity3d:Vector3
```

　基本形式は

```
open dash://{query}
```

　です。また下記のようにキーワードを含めることで、対象の言語・フレームワークを定めることが可能です。

```
dash://{keyword}:{query}
```

　Unity(ゲームエンジン)はunity3dでしたね。では.NET Frameworkのキーワードはなんでしょう？答えは、「net」です。この各言語・フレームワークのキーワードは、メニューのDash > Preferences > Docsetsから、確認することが可能です。また変更することもできます。

参考:

[The "dash://" Custom URL Scheme(公式サイトのガイドより)](https://kapeli.com/dash_guide#dashURLScheme)

関連:

* [Dasj(公式ページ)](https://kapeli.com/dash)
* [Dash(Mac App Store)](https://itunes.apple.com/us/app/dash/id449589707?ls=1&mt=12)
* [Dashを入れてみたらjQueryやらのドキュメントを見るのが想像以上に快適だったよ。](http://ginpen.com/2013/06/17/start-dash/)
phpenvによる複数バージョン下でmemcachedをセッションハンドラとして利用する

PHPを使った開発現場ではphpenvなどを使って複数のバージョンでの動作検証を行うこともあるかと思いますが、Apache上で動作させるためには`libphp5.so`などをPHPのバージョンごとにビルドしないといけなくて辛いです。

同様に、memcachedをPHPのセッションハンドラとして設定する場合にも、memcachedのPHPエクステンションをバージョンごとにビルドする必要があります。

`libphp5.so`の生成に関しては情報が充実していたので、サクっといけるかとおもいきや、意外とハマってしまった上に、ネット上の解決策がほとんどなかったのでメモ。

#実行環境
CentOS 6.6
phpenvは既にインストール済みであるとします。

#libmemcachedのソースを取得
memcachedの`2.2.0`を使用するので、libmemcachedは`1.0`以降でなくてはいけません。普通に`yum install libmemcached`すると`0.31`が入ってしまうので、ソースコードを取得して手動でビルドします。

```console
$ cd /tmp
$ wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz
$ tar -zxvf libmemcached-1.0.18.tar.gz
$ cd libmemcached-1.0.18
# ./configure --without-memcached && make && make install
```

特に問題が発生しなければ`/var/local/lib/`配下にlibmemcachedがインストールされるはずです。`g++`が必要なので、`g++ command not found`とか言われたら`yum install gcc-c++`してください。

#memcachedのソースを取得
memcachedの`2.2.0`でmemcached.soを生成します。今回はPHPのバージョン`5.6.15`に対して生成してみます。事前に`5.6.15`はphpenvでインストールしておいてください。

```console
$ cd /tmp
$ wget http://pecl.php.net/get/memcached-2.2.0.tgz
$ tar zxvf memcached-2.2.0.tgz
$ cd memcached-2.2.0
$ phpenv local 5.6.15
$ phpize
# ./configure --with-php-config=/home/hogehoge/.phpenv/versions/5.6.15/bin/php-config --disable-memcached-sasl
# make
# make install
```

configureのオプションに`--disable-memcached-sasl`を指定していますが、これはmemcachedでSASL認証を使用しないという宣言をしています。SASL認証を必要とする場合には他にも設定が必要になりますが、今回は範囲外になりますので記述しません。

##./configureに失敗する場合
```console
checking for libmemcached location... configure: error: memcached support require libmemcached. Use --with-libmemcached-dir=<DIR> to specify the prefix where libmemcacached headers and library are located
```

のようなエラーが発生して`Makefile`が生成されない場合には、`libmemcached-devel`が存在しない可能性があります。別途インストールすることをおすすめします。

##makeに失敗する場合
```console
/tmp/memcached-2.2.0/php_libmemcached_compat.h:56: error: expected ‘=’, ‘,’, ‘;’, ‘asm’     or ‘__attribute__’ before ‘php_memcached_instance_st’

~以下省略~
```
のようなエラーが発生して`make`が正常に終了できない場合には、libmemcachedのバージョンが古い場合があります。上記手順の通りに`1.0`以上のlibmemcachedを使用することをおすすめします。特にmemcachedのバージョンが新しい場合に発生しているようです。

#PHPの設定ファイルからmemcached.soを読み込む
先ほどの`make install`で`/home/hogehoge/.phpenv/versions/5.6.15/lib/php/extensions/fugafuga/`配下に`memcached.so`が生成されていますので、それぞれのバージョンのPHP設定ファイルからmemcached.soを読み込みます。

```ini:/home/hogehoge/.phpenv/versions/5.6.15/etc/conf.d/memcached.ini
; Enable memcached extension module
extension=memcached.so

; ----- Options to use the memcached session handler

; Use memcache as a session handler
session.save_handler=memcached
session.save_path="127.0.0.1:11211"
```

これでそれぞれのバージョンのPHPでmemcachedをセッションハンドラとして利用できるようになるはずです。念のため、`5.6.15`でmemcachedモジュールが有効になっているか確認してみます。

```console
$ phpenv local 5.6.15
$ php -m | grep memcached
memcached
```

良さそうですね。

#備考
結構作業が前後したりしたので順番通りにやっても動かないかも。。
何か不具合あったらコメントください。

#参考
http://qiita.com/hokutoasari/items/f5d7daa53db5b9540310
http://stackoverflow.com/questions/24407095/error-when-installing-pecl-memcached
https://enlook.wordpress.com/2011/07/27/howto-enabling-memcached-extension-on-php/
VirtualBoxのNATアダプタでホストからゲストに通信する方法

SSHで接続する際の設定を残します。

# 1.条件
VirtualBox：5.0.10 r104061
ゲストOS：Ubunts 14.04
ホストOS：OSX 10.11.1

# 2.手順
1. VirtualBoxで対象のシステムの[設定] -> [アダプタX] 画面で[ポートフォワーディング(P)]を選択します。 
<img width="801" alt="スクリーンショット 2015-11-18 1.33.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/82043/1826a292-ade6-9201-cdfc-e016b688bd87.png">　　

2. SSHであれば以下のように設定します。
<img width="801" alt="スクリーンショット 2015-11-18 1.34.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/82043/662d1786-ccde-0dfb-996a-4191ac3ed14f.png">
ホストポートは既存のサービスとかぶらなければなんでも良いようですが、ユーザ権限だとウェルノンポートはバインドできないので、ハイポート(1024以上)を指定するのが良いようです。
　  
3. Terminalから以下でログインすることができます。
`$ ssh -p 9999 XXXXX@localhost`　　

通常のWeb接続であれば上記のポート80のほか、HTTPS(443)も追加すればOKです。
Slackの使い方(基本編)

#Slackの使い方(基本編)

##はじめに
Slackを使うことになったので使い方や見方を簡単にまとめておきます。

今回は一番使うであろう画面です。

##ナビゲーション
###トップページ
![slack_top.png](https://qiita-image-store.s3.amazonaws.com/0/98727/2faa6cb9-112f-2510-840f-217926ac3a61.png)

###チーム名
![slack_teamname.png](https://qiita-image-store.s3.amazonaws.com/0/98727/d87a724d-4b58-ef84-fe9c-57a908703ce4.png)
赤枠のモザイクがかけてあるのがチーム名です。
クリックすると個人設定やチームの切り替えができます。

###ユーザー名
![slack_username.png](https://qiita-image-store.s3.amazonaws.com/0/98727/088ae743-ba93-a373-0105-a40c948ac61c.png)
自分のユーザー名です。

###チャンネル
![slack_channellist.png](https://qiita-image-store.s3.amazonaws.com/0/98727/f9a26eab-283a-fbe5-6572-8692eb1ba185.png)
チャンネル一覧です。
ここには自分が参加しているチャンネルのみ表示されます。
チャンネルとは話題ごとに作るのがいいと思います。

暗くなっているチャンネル名はミュートしているチャンネルです。

チャンネルにはpublicとprivateが設定できます。
publicなチャンネルは参加していなくても見ることができますが、privateなチャンネルは参加していないと、存在を知ることもできません。
publicなチャンネルは削除可能ですが、privateなチャンネルは削除不可のようです。

###ダイレクトメッセージ
![slack_directmessagelist.png](https://qiita-image-store.s3.amazonaws.com/0/98727/3b9aa175-e43f-7908-c850-d64cb1ef59ce.png)
ダイレクトメッセージを送れる相手です。
他には見えないやり取りをすることができます。

オンラインのメンバーは左に緑色の丸がつきます。

###招待
![slack_invitePeople.png](https://qiita-image-store.s3.amazonaws.com/0/98727/b2bd05f3-cc51-294e-e21b-e8e78667af20.png)
チームに他のメンバーを招待できます。

###検索
![slack_search.png](https://qiita-image-store.s3.amazonaws.com/0/98727/5740c5e5-4cf7-c3f2-ec96-27e4a0420099.png)
チャンネルやユーザー名、チーム名などの検索ができます。

##メイン
勝手にそう思っているだけでメインかはわかりません。

###インフォメーション
####チャンネル名
![slack_channelname.png](https://qiita-image-store.s3.amazonaws.com/0/98727/d3dc301a-711c-5522-cb24-d746624ced17.png)
今のチャンネル名が表示されています。
クリックするとチャンネルの設定ができます。

####メンバー数
![slack_channelMember.png](https://qiita-image-store.s3.amazonaws.com/0/98727/92043c7d-14cb-b3a3-3b15-7c340fe1ba02.png)
現在のチャンネルに参加しているメンバーが表示されています。

####情報ボタン？
![slack_channelInfo.png](https://qiita-image-store.s3.amazonaws.com/0/98727/61daa449-f16c-1c72-d6ea-9eed05fa3653.png)
クリックするとチャンネルの情報などが表示されます。

####検索
![slack_searchwindow.png](https://qiita-image-store.s3.amazonaws.com/0/98727/2065b517-5b72-3914-647f-e59d57f8062a.png)
ログ検索ができます。
結構詳細な検索ができるみたいですが、無料プランだと過去10000件のみのようです。

####Mentions
![slack_mentions.png](https://qiita-image-store.s3.amazonaws.com/0/98727/36eaa739-d964-16f9-0313-93cc429e7e99.png)
自分宛てに来た@付きのメッセージを一覧で確認できます。

####Star
![slack_stars.png](https://qiita-image-store.s3.amazonaws.com/0/98727/0181efae-b5f3-3c2c-fdc3-81b29e24f669.png)
スター付けしたメッセージを一覧で確認できます。

####その他
![slack_other.png](https://qiita-image-store.s3.amazonaws.com/0/98727/02da0711-85bf-8d98-7959-7258a3e8aecf.png)
その他幾つかのメニューが見れますが詳細は省きます。

###メッセージ
![slack_message.png](https://qiita-image-store.s3.amazonaws.com/0/98727/e4c0a9a9-c532-a135-3aad-528cc4158990.png)
チャンネルに書き込んだ内容などはここに表示されます。

##おわりに
画像ばかりで見づらい気もしますがトップ画面はだいたいこんな感じです。

何かあれば追記が別記事で対応します。
RubyでZipファイルを解凍するときのサンプルコード

# コード内容
sample.zip内のファイルをすべて、outディレクトリに解凍する。
## サンプルコード
sample.rb

```ruby
require 'zip'

dest = 'out/'

Zip::File.open('sample.zip') do |zip|
  zip.each do |entry|
    p entry.name
    # { true } は展開先に同名ファイルが存在する場合に上書きする指定
    zip.extract(entry, dest + entry.name) { true }
  end
end
```

## ソース
https://github.com/ogontaro/howtocoding/tree/master/ruby/ファイル操作/Zipファイルを解凍する
## ドキュメント
rubyzipのドキュメント
http://www.rubydoc.info/github/rubyzip/rubyzip/master/frames
## 補足
### Zip解凍中に"ディレクトリが存在しない"とエラーが発生する現象の対応
rubyzipがZipファイルの解凍時にディレクトリ作成よりも
ファイル出力を先に実行する場合がある。
対応策をsample_bugfix.rbに記載した。
JsonArray -> csvにさくっと変換

ただのメモ。

# install jq

```shell-session
$ brew install jq
```

v1.5以上が入っていればOK

# convert

```shell-session
$ echo '[[1,2,3],[4,5,6]]' | jq -r '.[] | [.[] | tostring] | join(",")'
```

要素をstringに変換して、joinで結合するだけ。
パッケージの圧縮を高速化

## 標準がzstdになってた
(2022/9/27追記)
圧縮アルゴリズムがzstdに変わり、デフォルト設定でpigzより早いらしく、この記事は意味をなさなくなった。デフォルト設定はこんな感じ。

```
COMPRESSZST=(zstd -c -z -q -)

PKGEXT='.pkg.tar.zst'
```

## yaourtやめてtrizenにした話
(2019/03/26追記)
yaourtは開発がストップしていて移行を考えていたところ、ちょっと試してみた結果、trizenが割と使い勝手が一緒そうなので移行しました。ただこれ系のAURヘルパー、大体仕組みは同じっぽくて、以下で話したことはtrizenでも通用するので、特に書き換えずに残しておきます。

#### yaourtが開発終了した話
[Requesting official statement from developers · Issue #382 · archlinuxfr/yaourt](https://github.com/archlinuxfr/yaourt/issues/382)

#### AURヘルパー一覧
[AUR ヘルパー - ArchWiki](https://wiki.archlinux.jp/index.php/AUR_%E3%83%98%E3%83%AB%E3%83%91%E3%83%BC)

## モチベ
ArchLinuxのyaourtはAURと呼ばれる、ユーザが登録するリポジトリからアプリを簡単にインスコできるツール。AURあたまおかしいほど何でもあるので(factorioというアルファ版ゲームのデモが直接インスコできたり)、ArchLinuxを使うモチベの1つになっていたりする。

ただyaourtは「パッケージの圧縮」という、良く分からないステージでやたら時間を食うパッケージが結構あり、気になってTwitterで文句言ったら早くする方法を教えてもらった話。

## yaourtの仕組み
このyaourt、そもそも独自のパッケージを手元の環境で作り、それをpacmanに食わせるのを自動で行うだけのツール、らしい。この独自パッケージを作るのにmakepkgというツールを使う。このmakepkgというツールがデフォルトでxzで圧縮しようとするのが問題のようだ。

makepkgはもともと配布するためのパッケージを作るツールなので、xzという高圧縮(かつCPUを馬鹿食いする)形式を使うのは大変正しいのだが、yaourtではぶっちゃけ自分で食わせるだけなのでこんなの時間の無駄でしかない。

## makepkgの設定をいじる
そこでmakepkgの設定を変更する。`/etc/makepkg.conf` で圧縮形式と圧縮に使うコマンドの変更ができる。

ここで圧縮しないことも可能だが、yaourtはデフォルトで/tmpを作業ディレクトリとして使い、ArchLinuxでは/tmpはメモリに展開されることが多いので、ここでは殆どCPUを使わないgz形式を、マルチコアで高速に圧縮可能なpigzを使って圧縮する設定にしてみる。

```
COMPRESSGZ=(pigz -c -f -n)

PKGEXT='.pkg.tar.gz'
```

の2行を変更すれば良い。体感値では1分とか掛かってた処理が数秒で終わるようになった。なお、もちろんpigzのインスコが必要なので忘れないように。勿論pigzのインスコが面倒とかならCOMPRESSGZを書き換えなければ良い。お好みにあわせてどうぞ。

ちなみに更に低スペックなマシンならlzo形式とかを検討してもいいかもしれない。なんか設定ファイルみたらCOMPRESSLZOとかCOMPRESSLRZとかあったのでできそう。
僕がよく使うMac/Chromeのデフォルトショートカット集

実際に触って試しながら読んでみてください。
取り敢えずコレ使いこなせると１日が１０分くらい伸びるかもしれない。
アプリの操作に関してはWindowsも大体おんなじですって！（Command→Ctrlとかになる）

##Macの操作

###アクティブなウィンドウ以外最小化
`Command` + `Option` + `H`

###アプリの強制終了操作画面を出す
`Command` + `Option` + `Esc`

###アクティブなアプリの全ウィンドウを俯瞰
`Ctrl` + `↓`

###今開いてるアプリを俯瞰（※F3キーと一緒）
`Ctrl` + `↑`

###IME（キーボードの変換）の切り替え
`Command` + `Space`

###アクティブなウィンドウの最大化/最大化解除
`Command` + `Control` + `F`

###最大化しているアプリ（画面）の移動
`Ctrl` + `→` or `←`

###アクティブなウィンドウの切り替え（順番）
`Command` + `Tab`

###アクティブなウィンドウの切り替え（逆順）
`Command` + `Shift` + `Tab`

##GoogleChrome等のアプリ操作

###初回は名前を付けて保存、２回目以降上書き保存
`Command` + `S`

###ひとつ前の操作を取り消し
`Command` + `Z`

###最新の状態に更新
`Command` + `R`

###取り消した操作を戻す
`Command` + `Shift` + `Z`

###現在開いているアプリやタブを閉じる
`Command` + `W`

###現在開いているウィンドウ（アプリ）を閉じる
`Command` + `Q`

###新しいタブを開く
`Command` + `T`

###新規作成/新規窓で開く
`Command` + `N`

###検索
`Command` + `F`

###拡大
`Command` + `+`（ `Shift` + `;` ）

###縮小
`Command` + `-`

###今開いてるタブを切り替え（順番）
`Ctrl` + `Tab`

###今開いてるタブを切り替え（逆順）
`Ctrl` + `Shift` + `Tab`


***

取り敢えずこんなもんでしょうか。
思い出したら追記します。
Mac OS XへのGitインストール方法（2015年版）

OSXのバージョンによってGitのインストール方法が異なり、検索しても古い情報ばかり出てくるようです。2015年時点（Mavericks (10.9)以降）の最新情報は以下のとおり。


1.ターミナルで「git」と入力
  
![cmd.png](https://qiita-image-store.s3.amazonaws.com/0/22455/6061ae1f-01d0-dcd2-818e-0f0e14ac6a4e.png)
　  

2.以下のダイアログが出たら「インストール」を実行
<img width="400" alt="dialog.png" src="https://qiita-image-store.s3.amazonaws.com/0/22455/087c2682-194e-a8fd-60a9-b27a447a69a1.png">

以上

※ Command Line Toolsが必要なのは以前から変わりないものの、そのインストールがいつのまにか簡単になっていたようです。

※ Gitを最新版に更新するには従来どおりHomebrewなどが必要です。
「あれvectorの中身がみんな同じになっちゃったんですけど」

「あれvectorの中身がみんな同じになっちゃったんですけど」

STL(Standard Template Library)のstd::vetctorを使いはじめた状況で生じがちなシーンだ。

C/C++のはまりどころ
文字列を渡している気になっているのは、文字列の先頭アドレスを渡しているにすぎない。char name[20]で静的に確保された領域の場所は、同じままなので、同一のアドレスがそのつど渡されている。
そのため、for文でそのつど値を設定したつもりが、最後にその領域に書き込まれた値だけが表示される結果になっている。
std::string 型を使って、以下のように書けば、目的の動作をする(2015/11/18　修正)。



```.cpp:bug_vector.cpp
#include <iostream>
#include <string>
#include <vector>
#include <stdio.h>

int main(int argc, char* argv[]){
	std::vector<int> nums;
	for (int i = 0; i < 5; i++){
		nums.push_back(i);
	}
	for (int i = 0; i < 5; i++){
		std::cout << nums[i] << std::endl;
	}

	std::vector<char*> names;
	for (int i = 0; i < 5; i++){
		char name[20];
		sprintf(name, "file%04d.txt", i);
		names.push_back(name);//渡しているのは文字列の入っているメモリの先頭アドレス。
	}
	for (int i = 0; i < 5; i++){
		std::cout << names[i] << std::endl;//受け取ったアドレスにある文字を終末記号まで表示。
	}


	std::vector<std::string> fnames;
	for (int i = 0; i < 5; i++){
		fnames.push_back("file" + std::to_string(i) + ".txt");
	}
	for (int i = 0; i < 5; i++){
		std::cout << fnames[i] << std::endl;
	}
	exit(0);
}
```

```.txt:実行結果.txt
0
1
2
3
4
file0004.txt
file0004.txt
file0004.txt
file0004.txt
file0004.txt
file0.txt
file1.txt
file2.txt
file3.txt
file4.txt
```


問題の残るらしいコード(2015/11/17時点の初出コードから抜粋。) 
このコードを書いたときには、fnameという変数で作ったオブジェクトが、fnameというローカル変数が書き換えられても
vetctorの中に残っているものだと思い込んでいる。
言語仕様・STLの仕様からみてどうなのかを、このコードを書いた人は理解していない。


```.cpp:bug_vector2.cpp
#include <iostream>
#include <string>
#include <vector>
#include <stdio.h>

int main(int argc, char* argv[]){
	std::vector<std::string> fnames;
	for (int i = 0; i < 5; i++){
		std::string fname = "file" + std::to_string(i) + ".txt";
		fnames.push_back(fname);
	}
	for (int i = 0; i < 5; i++){
		std::cout << fnames[i] << std::endl;
	}
	exit(0);
}
```
プロセス・スレッドにCPUアフィニティを設定する方法

とある実験をするのにスレッドに対してCPUアフィニティを設定する必要があったので、メモ。
## CPUアフィニティとは
プロセス・スレッドはOSによってどれかのCPUコア上で実行される。CPUアフィニティを設定することで、その実行されるCPUコアを任意に制限・指定することができる。

## プロセスにCPUアフィニティを設定
LinuxはCPUアフィニティを設定するための関数[sched_setaffinity](http://linuxjm.osdn.jp/html/LDP_man-pages/man2/sched_setaffinity.2.html)が用意されている。
### 一応、例

```c

#define _GNU_SOURCE
#include <sched.h>

int main() {
  pid_t pid;
  cpu_set_t cpu_set;
  int result;

  pid = getpid;
  CPU_ZERO(&cpu_set);
  CPU_SET(2, &cpu_set);

  result = sched_setaffinity(pid, sizeof(cpu_set_t), &cpu_set);
  if (result != 0) {
    // エラー
  }

  // 処理

  return 0;
}
```
cpu_set_t構造体はCPU集合を表している。
CPU_ZERO関数でcpu_set_t構造体を初期化してから、CPU_SET関数で実行するCPUコアを指定する。4コアのCPUであれば0から3までの値を第一引数に指定する。詳しくは[マニュアル](http://linuxjm.osdn.jp/html/LDP_man-pages/man3/CPU_SET.3.html)を参照。

[sched_setaffinity](http://linuxjm.osdn.jp/html/LDP_man-pages/man2/sched_setaffinity.2.html)関数の引数は順に、プロセスID、cpu_set_tのデータサイズ、cpu_set_tのポインタ。

第一引数はgetpid関数を使うなりすればよい。
第二引数は基本的にsizeof(cpu_set_t)。
第三引数はCPU_SETで指定したcpu_set_t構造体変数のポインタを指定する。

## スレッドにCPUアフィニティを設定
上の方法だとプロセス自体に設定されるので、スレッド単位でアフィニティ設定をしたいのであれば少しだけ違う。

環境によっては[pthread_setaffinity_np](http://linuxjm.osdn.jp/html/LDP_man-pages/man3/pthread_setaffinity_np.3.html)で可能である。プログラム例は[マニュアル](http://linuxjm.osdn.jp/html/LDP_man-pages/man3/pthread_setaffinity_np.3.html)に載っているので省略。

上の関数が使えない場合は、sched_setaffinity関数の第一引数にスレッドIDを渡すことで設定できる。
gettid関数が使える環境であるならば、gettid関数で取得したpid_t構造体変数をそのまま投げればよい。

gettid関数が使えないのであれば、システムコールを直接呼んでスレッドIDを取得する。
### システムコールを使ってスレッドIDを取得して、CPUアフィニティを設定する時の例
```c

#include <sched.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>


pid_t gettid(void) {
  return syscall(SYS_gettid);
}


void* thread_main(void* args) {
  pid_t pid;
  cpu_set_t cpu_set;
  int result;

  pid = gettid;
  CPU_ZERO(&cpu_set);
  CPU_SET(2, &cpu_set);

  result = sched_setaffinity(pid, sizeof(cpu_set_t), &cpu_set);
  if (result != 0) {
    // エラー
  }

　// 処理

  return NULL;
}


int main() {
  pthread_t p;
  pthread_create(&p, NULL, thread_main, NULL);

  // 処理

  return 0;
}
```

## まとめ
* [sched_setaffinity](http://linuxjm.osdn.jp/html/LDP_man-pages/man2/sched_setaffinity.2.html)
* [pthread_setaffinity_np](http://linuxjm.osdn.jp/html/LDP_man-pages/man3/pthread_setaffinity_np.3.html)
* [CPU_SET](http://linuxjm.osdn.jp/html/LDP_man-pages/man3/CPU_SET.3.html)
* [SYSCALL](http://linuxjm.osdn.jp/html/LDP_man-pages/man2/syscall.2.html)

間違ってるところがあればご指摘お願いします。
[python][meta] pythonの型は型と言うのか

# pythonの型とC言語の型

pythonの型といえば、数値型、シーケンス型、インスタンス型、などなど
宣言がいらないのであまり意識はしないが、型というものは存在する。

一方、C言語で方といえばint型、char型、float型、などなど
こっちは型宣言やら型変換やら意識しないといけないので嫌でも覚える。

さて、この２つを比べた時、同じ「型」と呼ぶのに違和感を覚えないだろうか。
pythonの型はオブジェクトで、データの格納とその処理方法の両方を担う。
一方C言語の型は単純にデータを格納するだけ。
おかげでメモリの削除なんかを手動でやるはめになったりする。

「pythonのは○○型オブジェクトを省略しているだけだろ」と言われればそうなのかもしれないが、
ここまで扱いが異なる両者を同じ名前で呼ぶのはちょっと違和感。

この辺りをうまいこと表現する名前はないものだろうか。
同じ型と呼ぶなら「変数」と「インスタンス」も呼び方変えなくてよかったような。
そもそも、全部オブジェクトなら○○型って分ける必要ってあるの？

つまりは、C言語だけ書ける後輩にpythonを教える時に戸惑ったというお話。
データ分析におけるワークフローツール


はじめまして、普段はサービス開発やら収集したデータをごちゃごちゃ整形したりしているakito1986です。
この記事は[IDCフロンティア Advent Calendar 2015](http://qiita.com/advent-calendar/2015/idcfrontier)の7日目の記事です。
さてあれよあれよという間に7日目もあと残すところ一時間！
担当した日に公開しないとあまり意味がないと思い、さっと書けそうで最近興味があり必要性を感じているワークフローについて調べたことを書きます。

# はじめに
冒頭に書いた`収集したデータをごちゃごちゃ整形`の部分の話。
サービス事業者でエンジニアをしていると、「このデータとこのデータをがっちゃんこして、こういう形式のデータにして欲しい」と頼まれることが多いのではないでしょうか？

私も頼まれることがあり、「定期的に送られてくるCSVをテーブルにインポートしてクエリで集計してその結果を出力するだけでいいんでしょ？」という最初は軽い気持ちで引き受けたのですが、実際にやってみると、

- CSVファイルが送られてこない
- CSVファイルが送られてきても中身は空
- 送られてこないCSVファイルがあると、集計結果が異常になる
- 中間テーブル作成用のクエリが失敗すると、集計結果が異常になる

という問題が発生しました。
最初は`cron`で十分だろうと思っていましたが、各Jobが独立していれば`cron`で十分だと思いますが、各Jobが依存している場合は`cron`では不十分で、「依存関係にある前のJobが全て成功したらこのJobを実行する」、ということが制御できるツールが必要となります。

そこで他の人はどうしているんだろうと思い調べたのが、ワークフローツールです。

# 使えそうなワークフローツール
ちょっと時間がなくなってきたので、以下に使えそうなワークフローツールと説明されているリンクを記載します。

## Azkaban
https://azkaban.github.io/

もともとはHadoopのJobを管理するためのツールだったようですが、普通にあるコマンドを一つのJobとして扱うことができるようです。
最近Version3.0が出ました。

[インストールの仕方から簡単な使い方まで](http://sstd-bigdata.blogspot.jp/2014/09/azkaban.html)

## Luigi
https://github.com/spotify/luigi

こちらももともはHadoopのJob管理をするために作られたツール。
以下のTreasureDataさんのLuigiの運用の記事が興味深い。

[Luigi によるワークフロー管理](http://qiita.com/k24d/items/fb9bed08423e6249d376)

## Airflow
https://github.com/airbnb/airflow

Airbnb社が開発したデータフローツール。
Jobの定義はpythonスクリプトで書く。
ユーザー管理やタスクの実行時間の計測やクエリでタスクの実行結果を確認できたりで便利そう。

# おわりに
冒頭の部分と「はじめに」が長くて肝心の中身が薄くなってしまいました^^;
Azkaban, Luigi, Airflowは実際に構築して触っているので別の機会にその結果と、実際のデータ活用でワークフローツールをどのような構成で利用しているかをご紹介できればと思います。

おしまい。
PsySHって知ってる？私は感動した。


##はじめに
皆さんこんにちは。
皆さん`REPL`使ってる方が多いと思います。
`Ruby`の`irb`とか`pry`とかが有名ですね。
私は`PHP`をよく書きますが、昨年まで`PHP`の`REPL`使いたいなーと思ってました。
`PHP`使いの人はもう既にご存知の人が多いかと思いますが、`PsySH`を知って感動したので、そのお話をしたいと思います。

## REPLって
[はてなキーワード](http://d.hatena.ne.jp/keyword/REPL)によると、

>Read-eval-print loopの略
>字のごとく読んで評価して表示して繰り返す。対話型評価環境を指す。ただし、インタープリタと同義ではない。
>多くの関数型言語やスクリプト言語では利用出来る。

とのことです。

デバッグだったり、ちょっとした試しコードを書きたい場合などに、コンソール上でささっとリアルタイムにコードを実行出来るのが特徴です。
`PHP`の従来の方法だと、`PHP5.1`以降から`PHP -A`で対話的に利用できるシェルを実行できる機能があったみたいです（当時は知らなかったw）。
自分は`Ruby`で`irb`と`pry`であるのを知っていて実際に使っていたので`PHP`でも使いたいなーと思っていた次第です。

## PsySHのインストール
![Psysh](http://www.engineyard.co.jp/blog/images/blog-images-jp/2014/06/install.png)

公式サイトは[こちら](http://psysh.org/)。

インストールは簡単に出来ました。
`composer`で入れればすぐです。

```bash
$ php composer.phar require psy/psysh
$ ./vendor/bin/psysh
```

## 使い方
これは実際に起動するとなんとなくわかると思います。
わかりやすい`gif`が参考記事に載せられていたので引用させて頂きます。

![gif](http://www.engineyard.co.jp/blog/images/blog-images-jp/2014/06/psysh.gif)


対話的に`PHP`コードを実行できるので、直接入力して実行すれば結果を返してくれます。
ちなみに、ここではセミコロンを打たなくても実行できます！エラーが出ません！これは良い！
関数を試しに使ってみたいという場合などに私はよく使います。一時的なテストファイルを作成しないでも結果がみれるのは便利ですね。
使ってみるとはまると思いますよ。

## PsySHの特徴
PsySHは以下のような機能を持っているようです。
(実際に動かしたこと無い機能もあります;)
・docコマンド：ドキュメント表示
・listコマンド：コンテキスト内の変数・関数の一覧表示
・showコマンド：読み込み済みのコード表示
・wftコマンド：例外の情報表示

## おわりに
もし`PHP`を使っていて、まだ`PHP -A`でデバッグしている方がいらっしゃいましたら、是非こちらを試してみてください。
ちなみに、`Laravel5`には標準で組み込まれているようなので使ってみてください。
当時の自分は使って感動しましたw
何か便利機能があれば教えて頂ければと思います。

## 参考資料
今回は以下の記事を参考にさせて頂きました。ありがとうございました！
[PHPのちょっとしたデバッグを簡単に。PsySH の使い方](http://qiita.com/godgarden/items/adc4cbda88c5a55a832c)
[ENGINE YARD BLOG](http://www.engineyard.co.jp/blog/2014/php-psysh/)
mail()関数に渡す本文の改行コードはCRLF?LF?


## 疑問に思ったきっかけ

[![Phalcon とメールとテンプレートと](http://image.slidesharecdn.com/phalcon-151124121135-lva1-app6891/95/phalcon-1-638.jpg?cb=1448367180)](http://www.slideshare.net/Yuhshi/phalcon-55459391)

<div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/Yuhshi/phalcon-55459391" title="Phalcon とメールとテンプレートと" target="_blank">Phalcon とメールとテンプレートと</a> </strong> from <strong><a href="//www.slideshare.net/Yuhshi" target="_blank">Yuhshi</a></strong> </div>

[PHP BLT](http://phpblt.connpass.com/event/21929/)というイベントでの発表の一つ
大枠はPhalconの話であるが、メール送信時の改行コードの扱い方についての話があった。

以前、mail()関数を使ってメール送信で問題が起こり、同じような方法で回避した覚えがある。
気になったので調べてみようと思った。

## まずはマニュアルを見てみる
[PHP: mail - Manual](http://php.net/manual/ja/function.mail.php)

```
bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )
```

> #### message

> 送信するメッセージ。

> 改行コードは CRLF (\r\n) となります。各行の長さは 70 文字を超えては いけません。 



> #### additional_headers（オプション）

> メールヘッダの最後に挿入される文字列。

> 通常、これは追加のヘッダ（From、Cc、Bcc）のために用いられます。 複数のヘッダを追加する場合は CRLF（\r\n）で区切ります。 外部からのデータを用いてヘッダを組み立てる際には、想定外のヘッダが注入されることを防ぐための処理が必要です。 

このように、ヘッダも本文もCRLFで改行をするようにと書いてある。

## 実装を見てみる

PHP5系と7.0.0とで大きな違いはないため、7.0.0のソースを見てみます
[mail.c at php-7.0.0](https://github.com/php/php-src/blob/php-7.0.0/ext/standard/mail.c)

sendmailコマンドのプロセスを立て、それに対してヘッダ・本文の情報を出力している(399行目から)

```c:part-of-mail.c
		fprintf(sendmail, "To: %s\n", to);
		fprintf(sendmail, "Subject: %s\n", subject);
		if (hdr != NULL) {
			fprintf(sendmail, "%s\n", hdr);
		}
		fprintf(sendmail, "\n%s\n", message);
		ret = pclose(sendmail);
```
To や Subject、additional_headersの後、messageの前後の改行はLFである。
つまり複数のadditional_headersや複数行のmessageの改行をCRLFにすると、LFのみとCRLFが混ざった文字列をsendmailコマンドに渡すことになる。

## 実践

LFのみで改行した場合、CRLFで改行した場合の2通りを試してみた。

### 検証環境
PHP : 5.5.29
MTA : Postfix 2.6.6

### LFのみで改行

```php:mail-lf.php
<?php
mail(
    'to@example.com',
    'Test Subject',
    "row1\nrow2\nrow3",
    "From: from@example.com\nX-Mailer: hoge mail",
);
```

```received-email-source
To: to@example.com
Subject: Test Subject
X-PHP-Originating-Script: 5000:mail-lf.php
From: from@example.com
X-Mailer: hoge mail

row1
row2
row3
```

LFのみで改行して、特に問題は見られない

### CRLFで改行

```php:mail-crlf.php
<?php
mail(
    'to@example.com',
    'Test Subject',
    "row1\r\nrow2\r\nrow3",
    "From: from@example.com\r\nX-Mailer: hoge mail",
);
```

```received-email-source
To: to@example.com
Subject: Test Subject
X-PHP-Originating-Script: 5000:mail-crlf.php
From: from@example.com
X-Mailer: hoge mail

row1

row2

row3
```

CRLFで改行をすると、本文に余計な改行が入る。
ヘッダは問題なし

LFのみで改行するほうが正しいのでは？

## 考察とまとめ

マニュアルには次のような記述がある。
> #### 注意:

> メッセージが受信されなかった場合には、LF（\n）のみを使ってみてください。 Unix の MTA の中には、自動的に LF を CRLF に変換してしまう もの (有名なところでは、» qmail など) があります（もし CRLF を利用していた場合、CR が重複してしまいます）。 ただし、これは最後の手段です。というのも、これは » RFC 2822 に違反しているからです。

MTAによって、改行コードを変えるなどの対応が必要な場合があるらしい。
今回、Postfixでしか検証をしていない。他のMTA、例えばSendmailであれば結果は違うかも？
要検証

sendmailコマンドを使わずに、PHPからSMTPのリクエストを送信するような場合にはCRLFで改行する必要はあると思う。
sendmailコマンドを使う(mail()関数を使う)場合には、改行が意図した通りになされているか確認したほうが良い。


もっと時間のある時に、詳細に調べたい。
Mathematicaでマンデルブロー集合

```mathematica
MandelbrotSetPlot[]
```

![MandelbrotSetPlot--color.png](https://qiita-image-store.s3.amazonaws.com/0/6117/1babe665-de9a-f83a-3cc9-b496292e1a47.png)


以上。

簡単すぎます。

[MandelbrotSetPlot](https://reference.wolfram.com/language/ref/MandelbrotSetPlot.html) は [Mathematica 10からの新機能](https://www.wolfram.com/mathematica/new-in-10/enhanced-visualization/plot-the-mandelbrot-set.html)ですが、自力で実装しようと思うとけっこう大変な描画プログラムもコマンド一発で済んでしまうとは…。

これだけだと淋しいので、応用として内部だけ黒く塗りつぶしたマンデルブロー集合を高解像度で描いてみます。

```mathematica
MandelbrotSetPlot[ColorFunction -> (If[#3 == 1, Black, White] &), 
 Frame -> False, ImageResolution -> 1000, ImageSize -> 2000]
```

![mandelbrot_1000.png](https://qiita-image-store.s3.amazonaws.com/0/6117/aad51ac0-610c-df9b-ecba-c5c050967794.png)

ここまで高解像度だと生成にちょっと時間がかかります（約20秒）。


マンデルブロー集合とは毛色が違って、もっとMathematicaプログラムで描いた感があるフラクタルも今後どしどし更新していきます！
【備忘録】Python3でのreload

Python3で読み込んだモジュール（loadしたモジュール）を再読み込みするためには、imoortlibモジュールのreloadを使います。

例えば、

```
>>> import importlib
>>> importlib.reload(foo)
```

とすると、foo.pyが再度読み込まれます。

再ロードされた際には、グローバル変数などは はそのまま残ります。
関数などの再定義を行うと、すでに定義されているものを上書きします。

以前に使われていたimpモジュールはPython3.4からは非推奨のようです。
「The imp package is pending deprecation in favor of importlib.」だそうです。
CoprにあるFedora用パッケージのインストール - Neovimを事例として -

まとめ
======

* FedoraやRHEL/CentOS用のRPMパッケージの入手先としてCoprというものがある。
* Coprには比較的新しいソフトウェアのRPMパッケージが置かれていることもある。
* [Neovim](https://neovim.io/)や[Atom](https://atom.io/)のRPMパッケージも存在する。
* 自己責任で使いましょう。

前置き
======
普段使いのOSとして[Fedora](https://getfedora.org/)を選んでいる方の中には「ソフトウェアの新しいバージョンを使いたい」という方も多いのではないでしょうか。Fedoraで提供されるRPMパッケージは、比較的新しいバージョンが採用されています。

しかしながら、新しいソフトウェア自体は（まだ）Fedoraの公式パッケージとして提供されていないケースも多々あります。例えば、2015-11-02バージョン0.1.0がリリースされた[Neovim](https://neovim.io/)は、2015-12-07現在では[Fedoraの公式パッケージとしては存在していません](https://admin.fedoraproject.org/pkgdb/packages/neovim%2A/)。

使いたいと思ったソフトウェアがFedoraのリポジトリーにパッケージが存在しないときは、ソースコードを取得して自分でビルド/インストールすれば良いのですが、ソフトウェアを使いたいだけなのにビルド環境を整えたりすることは（ある意味では）本末転倒ですね。そのようなときは、[Copr](https://copr.fedoraproject.org/)でRPMパッケージを探してみましょう。

注意点
------

CoprにあるRPMパッケージは、Fedora公式パッケージではありません。ユーザーが独自に作成しているRPMパッケージです。そのため、もしかしたら品質が悪いかも知れません。（悪意の有無はともかくとして）何らかの悪影響を及ぼす可能性もあるかもしれません。

Coprにあるパッケージのインストール
==================================

Fedora 23にNeovimをDNFでインストール
------------------------------------

[NeovimのWikiでも紹介されている方法](https://github.com/neovim/neovim/wiki/Installing-Neovim#fedora-2122)です。Fedora 23では次のようにしてNeovimをインストールすることができます。

```shell-session
# dnf -y install dnf-plugins-core
# dnf -y copr enable dperson/neovim
# dnf -y install neovim
```

必要に応じてsudo(8)を使いましょう。

その他にあるパッケージの一例
----------------------------

[Atomのパッケージ](https://copr.fedoraproject.org/coprs/mosquito/atom/)や[数日おきに更新されているらしいVimのパッケージ（vim-latest）](https://copr.fedoraproject.org/coprs/lantw44/vim-latest/)などもあります。vim-latestはEPEL 7向けにもビルドされているので、RHEL/CentOS 7でも新しいVimを手軽に使うことができそうです。

おまけ
======

Coprでパッケージを配布しよう
----------------------------

実際のところ、Coprは「パッケージのビルドシステム兼DNF/Yumリポジトリー」です。自分用に調整したRPMパッケージをCoprに置いておけば、いつでもインストールすることができます。RPMパッケージを作成することができる方は、Coprを使ってDNF/Yumリポジトリーを作成しておくと便利です。バックアップにもなりますし。

自分用RPMパッケージの作り方は、「[nginx.orgのrpmをカスタマイズしてfedora coprでビルド・配布するのを試してみた](http://qiita.com/hnakamur/items/336758b1d9564b759d49)」が参考になります。
秋月電子で買えるパーツでESP-WROOM-02のArduino開発環境セットアップ

何番煎じかわかりませんが……
上海Espressif社製のWiFiチップESP8266EXと32MbitのEEPROM、アンテナをモジュール化したESP-WROOM-02(以下Wifiモジュール)がいろいろなところで販売されています。
今回は秋月で買えるモジュールと周辺部品を使い、Arduino IDEの環境でプログラムできるようにセットアップしていきます。

##必要なもの

* [ESP-WROOM-02 DIP化キット](http://akizukidenshi.com/catalog/g/gK-09758/)
* [超小型USBシリアル変換モジュール](http://akizukidenshi.com/catalog/g/gM-08461/)
* [カーボン抵抗(炭素皮膜抵抗) 1/4W 10kΩ (100本入)](http://akizukidenshi.com/catalog/g/gR-25103/)
* [3.3Vレギュレータ](http://akizukidenshi.com/catalog/g/gI-09261/)
* [電源アダプタ(5Vとか12V)](http://akizukidenshi.com/catalog/g/gM-08331/)
* [ブレッドボード用DCジャックDIP化キット](http://akizukidenshi.com/catalog/g/gK-05148/)
* [ブレッドボード](http://akizukidenshi.com/catalog/g/gP-00285/)(大きめのものが使いやすいです)
* [タクトスイッチ](http://akizukidenshi.com/catalog/g/gP-03647/)
* あとはLチカ用にLEDとか?

##ハードウェアのセットアップ
Wifiモジュールにピンヘッダをハンダ付けし、ブレッドボード上でこのように配線します。
RSTに繋がるSWはリセットスイッチ、IO0のSWはSerial Download ModeとFlash Boot Modeの切り替え用です。IO0のSWを押しながらリセットスイッチを押すとFlash Boot Modeで起動します。
電源はUSBから供給できる電流だと足りないらしいので今回は別電源を使っています。
![ESP8266.png](https://qiita-image-store.s3.amazonaws.com/0/103148/5c0dbdd8-8bf0-24be-9830-c968b875b25f.png)


##ソフトウェアのセットアップ
ソフトウェア側では、Arduino IDEのボードライブラリの中にESP8266 Arduino Core Libraryを導入します。

まずArduinoの公式サイトからArduino IDEをダウンロード・インストールします。
[Arduino - Software](https://www.arduino.cc/en/Main/Software)
Arduino IDEを起動し、「環境設定(Preferences)」メニューから設定画面を開き、"Additional Board Manager URL:"に以下のURLをコピペし、OKで閉じます。
http://arduino.esp8266.com/stable/package_esp8266com_index.json
![Arduino_Preferences_2.png](https://qiita-image-store.s3.amazonaws.com/0/103148/1817b69a-6946-acaa-c59a-293dbb4d86ed.png)


次に「ツール」メニューから「ボード」、「Boards Manager」を開きます。
ボード情報のダウンロードが終わると、"ESP8266 by ESP8266 Community"という項目が出るのでそこを選択して"Install"。
![Arduino_Manager.png](https://qiita-image-store.s3.amazonaws.com/0/103148/0f4a6415-c9d4-00af-70cd-07433e4ce7d4.png)

「ボード」メニューを開くと"ESP8266 Modules"の項目が増えているはずです。これでArduino Coreの導入は完了です。

##ATコマンドで操作してみる / Lチカさせてみる
ここからは~~飽きた~~調べるとすぐに出てくるので割愛します。
注意すべきなのは、今回の配線ではIO0 SWを押しながらRST SWを押すとUART Downlaod Mode、RST SWだけ押すとFlash Boot Modeで起動することです。
ATコマンドで起動する場合はFlash Boot Mode, Arduino IDEからスケッチを書き込む場合はUART Download Modeで起動しないといけないので気をつけてください。
phpのThriftクライアントひな形生成の際のオプション

# オプション
* :inlined
* :server
* :autoload
* :oop
* :rest

このなかでも自分が使った「inlined」と「oop」についてメモ。
使用したバージョンはApache Thrift v0.9.3。

# :inlined
Thriftライブラリに依存しないファイルを生成してくれる。
このオプションを使うと、gen-phpiフォルダが作られてそのなかに生成されたファイルが入れられる。(このオプションのない場合は、gen-phpフォルダが作られる。)

このオプションを使って生成すると、クライアントの呼び出し方が変わるので注意が必要。

```php:inliendオプションなし
$socket = new TSocket();
$transport = new TBufferedTransport($socket, 1024, 1024);
$protocol = TBinaryProtocol($transport);
$client = new TestClient($protocol);
```

```php:inliendオプションあり
$socket = new TSocket();
$client = new TestClient($socket);
```

inlinedオプションありで生成したコードを使って、オプションなしのときの呼び方をすると、
「Call to undefined method TBinaryProtocol」のエラーが出て「write()」メソッドがないと怒られる。

# :oop
TBaseを継承するオブジェクトの形式でファイルが生成される。オプションを使わない場合に比べてコードが短くなる。
動作における差があるのかどうかは調べきれてません。パフォーマンスとか違うのかな？


# 参考
- Thrift 0.9.1で、PHPオブジェクトのシリアライズと復元を行う
http://symfoware.blog68.fc2.com/blog-entry-1285.html?
- Thriftでphpの雛形を生成するときのオプションについて
http://symfoware.blog68.fc2.com/blog-entry-323.html
- thrift/TestClient.php at master · apache/thrift · GitHub https://github.com/apache/thrift/blob/master/test/php/TestClient.php