OmniAICreator/Qiita-1.07M huggingface dataset:
個人的iptables設定メモ

後々スクリプトにしたりするためのメモ

#参考
[ArchWiki](https://wiki.archlinuxjp.org/index.php/%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AA%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88%E3%83%95%E3%83%AB%E3%83%95%E3%82%A1%E3%82%A4%E3%82%A2%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AB)
[Man page of iptables](https://linuxjm.osdn.jp/html/iptables/man8/iptables.8.html)
[Man page of iptables-extension](https://linuxjm.osdn.jp/html/iptables/man8/iptables-extensions.8.html)

###rootかチェック
```lang:iptables.sh
if [ `whoami` != 'root' ]; then
    echo 'plz execute as root user'
fi
```

###初期化
```lang:iptables.sh
iptables -F
iptables -X
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

iptables -N TCP
iptables -N UDP
```

###接続確立済み
```lang:iptables.sh
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
```

###ループバック
```lang:iptables.sh
iptables -A INPUT -i lo -j ACCEPT
```

###INVALID状態の接続
```lang:iptables.sh
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
```

###ICMPエコー
参考ページではACCEPTだけど、個人的にDROPがいいので変更。
つまり書かなくてもいい気が。

```lang:iptables.sh
iptables -A INPUT -p icmp --icmp-type 8 -m conntrack --ctstate NEW -j DROP
```

###TCP・UDPの新規接続要求
それぞれ、TCPテーブル、UDPテーブルに渡す。
SYNフラグがないTCP新規接続はないらしい。

```lang:iptables.sh
iptables -A INPUT -p udp -m conntrack --ctstate NEW -j UDP
iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP
```

###接続拒否するTCP、UDPパケットへの対応
ポートが開いてなかったTCPパケットにはTCPRESETを返す。
UDPはICMP port unreachableメッセージを返す。
のが、LinuxでRFCに従った動きと記載されているが、DROPでいい気もする。
拒否するようなパケットを送ってきた奴なので、アドレスを保存しておく。

```lang:iptables.sh
iptables -A INPUT -p udp -m recent --set --name UDP-PORTSCAN -j DROP
iptables -A INPUT -p tcp -m recent --set --name TCP-PORTSCAN -j DROP
```

###TCP・UDP以外のパケットへの対応
上と同様にREJECTがRFCに従った動きみたいだが、DROPでいい気がする。

```lang:iptables.sh
iptables -A INPUT -j DROP
```

##TCPテーブル
###SSH
ブルートフォース対策があるので、そちらのテーブルにとばす。そのテーブルの中身は別途記載。
また、SSHのポートは変更してるので気を付ける。

```lang:iptables.sh
iptables -N IN_SSH
iptables -A TCP -p tcp --dport 22 -m conntrack --ctstate NEW -j IN_SSH
```
###HTTP(S)
```lang:iptables.sh
iptables -A TCP -p tcp --dport 80 -j ACCEPT
iptables -A TCP -p tcp --dport 443 -j ACCEPT
```

##攻撃対策
###ポートスキャン
例ではTCPRESET、ICMPでREJECTしているがDROPにした。

```lang:iptables.sh
iptables -I TCP -p tcp -m recent --update --seconds 60 --name TCP-PORTSCAN -j DROP
iptables -I UDP -p udp -m recent --update --seconds 60 --name UDP-PORTSCAN -j DROP
```
###SSHブルートフォース
接続の記録名が統一されてなかったので修正した以外は例そのまま。
10秒以内に3回、1800秒以内に4回以上接続を試みた場合DROPする。
rttlオプションをつけることで、送信元アドレスを偽装してもTTLで判断するらしい誤検知こわいがアリか。

```lang:iptables.sh
iptables -A IN_SSH -m recent --name SSH-BF --rttl --rcheck --hitcount 3 --seconds 10 -j DROP
iptables -A IN_SSH -m recent --name SSH-BF --rttl --rcheck --hitcount 4 --seconds 1800 -j DROP
iptables -A IN_SSH -m recent --name SSH-BF --set -j ACCEPT
```

##保存する
```lang:iptables.sh
iptables-save > /etc/iptables/iptables.rules
```

とりあえず参考サイト分終わり。
DDoSへの対策をそのうち調べて更新する。

おしまい。
Unity5.3.3p1からAssetBundleのmainassetが取得できない？

最近、Unity4で作成したプロジェクトをUnity5に移行する作業をしているのですが、Unityのバージョンが進めば進むほどUnity4で動作していたものが動かなくなっていくケースが増えています。

標題の件は、既に非推奨となったBuildpipline.AssetBundleで作成したAssetBundleをUnity5.3.3p1以降のUnityでロードした際に発生しました。
非推奨とは言ってもまだBuildpipline.AssetBundleを使用すればアセットバンドルの作成は可能なので（Unity5.3.4p3までは動作していることを確認）、今のところBuildpipline.AssetBundlesに置き換えていません（修正規模が大きいため）。
http://docs.unity3d.com/ja/current/ScriptReference/BuildPipeline.BuildAssetBundle.html

そのためか、Uniyu5.3.3f1まではUnity4と変わりなかったAssetBundleの読み込みでおかしな現象が発生するようになりました。

具体的にはAssetBundleのmainassetの取得が、サーバからロードした直後の１回は取得できるのですが、2回以上取得すると以降nullが返ってくるのです。
既にロード済でローカルに有るAssetBundleから取得すると、最初からnullです。
プロジェクトに何の変更も加えず、作業するUnityのバージョンを5.3.3f1に戻すだけでmainassetは取り放題になるため、ここで何らかの手が入ったようです（リリースノートからは読み取れず…）

mainassetがnullではまともに動作しないプログラム設計になっているので、これを取れるようにしました。
参考：
http://answers.unity3d.com/questions/951531/no-assetbundlemainasset-with-buildingassetbundles.html

```csharp:mainasset取得のサンプル1
assetBundle.LoadAsset(assetBundle.GetAllAssetNames()[0]);
```

これで取れたかのように見えました。
…がしかし、あるprefabをAssetBundle化したら、GetAllAssetNames()[0]にシェーダなどが入っていたりする場合があり、mainassetとの動きの違いが出てしまいました。

そこで書いたのが以下のコード。

```csharp:mainasset取得のサンプル2
  public static T Mainasset<T> (this AssetBundle assetBundle) where T : Object
    {
        T bundleGo = null;
        foreach( var assets in assetBundle.GetAllAssetNames() )
        {
            if (assets != null) {
                bundleGo = assetBundle.LoadAsset<T> (assets);
                if (bundleGo != null) {
                    break;
                }
            }
        }
        return bundleGo;
    }
```

ただこれ欠点があり、GetAllAssetNames()した際に、指定した型と同じ型のassetが、出て欲しいassetよりも上の方に有ると読めない…
もっとスマートな解決方法が有ると思いますが、とりあえずはこんな感じで乗り切ってます。

…え？「全てUnity5で書き直せばこんな変なことで悩まないだろう」って？
そうですねぇ…（白目）
ridgepoleの初期設定と使い方

初めてridgepoleを使おうと思ったが初期設定が書いてあるサイトがなかなか見当たらなかったので作成.
おかしな点があればコメントか編集リクエストお願します.

## ridgepoleとは
railsでは通常はmigrateファイルによってDBのスキーマを管理している.
が追加/削除/リネームが結構面倒くさい.
そこで毎回migrateする必要がなくなり、ファイルを書き直すだけで簡単にスキーマの管理ができるGemであるridgepoleを使おうということである.


## DB作成
```
rake db:create
```

## Gemfile
```gemfile
gem 'ridgepole'
```
してbundle install

## ridgepole.ymlの作成
config/ridgepole.ymlを新規作成する
ファイル名、階層は自由(config配下であることは必須？)

```config/ridgepole.yml
adapter: mysql2
encoding: utf8
database: ????????
username: ????????
password: ????????
```

## Schemafileを作成

他の人はdbディレクトリの中に作ったりしてる.
自分はconfig直下に作った.

config/Schemafile

```
create_table "articles", force: true do |t|
  t.string   "title"
  t.text   "content"
  t.integer  "status"
  t.datetime "created_at"
  t.datetime "updated_at"
end
```

## ridgepoleコマンド
```
ridgepole -c config/ridgepole.yml --apply -f config/Schemafile
```
ridgepole -c (dbの設定ファイルのpath) --apply -f (Schemafileのpath)

でSchemafileの内容を反映できる.

## ridgepole導入後
今後はmigrateコマンドを一切使わないので
rails g modelやrails g scaffoldなどmigrateが必要なコマンドを実行する場合は最後に「--skip-migration」を付ける.(rails g controllerはmigrate不要だったはず)

```
rails g scaffold Article content:text --skip-migration
rails g model Article --skip-migration
```
余計なmigrateファイルがあるとエラーになるので間違えて生成した場合は rm -rfで削除する

## デプロイしたら

```
bundle exec　ridgepole -c config/ridgepole.yml -E production --apply -f config/Schemafile
```
bundle execつけないと

```
-bash: ridgepole: コマンドが見つかりません
```
か

```
ridgepole: command not found
```
になる

## 参考サイト
[ridgepoleの初期設定と使い方](http://chmod.tech/?p=915)
GCPでUbuntu 16.04 (xenial) LTSを起動する

2016-04-21に[xenial (Ubuntu 16.04)がついに出た](http://news.softpedia.com/news/ubuntu-16-04-lts-xenial-xerus-officially-released-available-for-download-now-503251.shtml)ので、記念カキコ。

# 重要なポイント

イメージのIDが `/ubuntu-os-cloud/ubuntu-1604-xenial-v20160420c` という表現なので、人に優しい設計です。これが、某IaaSのようにランダムなIDだと多くの人は困るわけです。

## gcloud コマンド実行例

```
gcloud compute instances create "xenial" \
 --zone "asia-east1-a" --machine-type "n1-standard-1" \
 --network "default" --maintenance-policy "MIGRATE" \
 --scopes default="https://www.googleapis.com/auth/devstorage.read_only","https://www.googleapis.com/auth/logging.write","https://www.googleapis.com/auth/monitoring.write","https://www.googleapis.com/auth/cloud.useraccounts.readonly" \
 --image "/ubuntu-os-cloud/ubuntu-1604-xenial-v20160420c" \
 --boot-disk-size "10" --boot-disk-type "pd-ssd" --boot-disk-device-name "xenial"
```

ここで `--image "/ubuntu-os-cloud/ubuntu-1604-xenial-v20160420c"` とあるように、IDから一目で種別とバージョンが分かるのは便利ですね。日付でバージョニングされているOSの場合は、その部分を変更していくだけで簡単に最新版のOSイメージの利用が可能になりますね。
IoTCore リモートディスプレイ

リモートディスプレイの手順です。（[元ネタ](https://developer.microsoft.com/en-us/windows/iot/win10/remotedisplay)）

#前提
*Raspberry Pi 2
*Windows 10 IoT Core 10.0.14322.1000

#リモートサーバーを有効化
Remote Serverページの、「Enable Windows IoT Remote Server」をチェックします。
![20160423S.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/1a6dacd4-04a1-920c-d580-84412402262b.png)

#Windows IoT Remote Clientをインストール
[ココ](https://www.microsoft.com/store/apps/9nblggh5mnxz)にアクセスして、StoreからWindows IoT Remote Clientをインストールします。
![20160423T.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/1b237852-3563-897e-0bb2-2e5f6e32d5b5.png)

#リモートサーバーに接続
IPアドレスを入力し、「Connect」をクリックします。
![20160423U.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/04933153-8d87-6dee-ac76-83d7411d7d70.png)

出た♪
![20160423V.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/4ea12ddd-996b-07c6-0cbe-2803eff587e5.png)
RaspberryPiでスクリーンショットを撮る

#はじめに

![RetroPieWebsiteLogo.png](https://qiita-image-store.s3.amazonaws.com/0/95484/254140bd-1397-5f29-47bd-60ccfae88e9a.png)
その筋では有名な[RetroPie](https://retropie.org.uk/)をRaspberryPi3で試しに動かしてみた。
せっかくなので、画面のスクリーンショットをraspi2pngで取得できるようにしてみた。

#raspi2pngの導入

[Minecraft Piのスクリーンショットをraspi2pngで撮ってみた](http://153.127.251.244/blog/2015/04/11/minecraft-pi%E3%81%AE%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%E3%82%92raspi2png%E3%81%A7%E6%92%AE%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F/)を参考にビルドして導入した。

スクリーンショットのファイル名が"日付+時刻.png"になるようなスクリプトを作ったので参考に。

```shell-session:scshot.sh
#!/bin/sh
/home/pi/raspi2png-master/raspi2png -p /home/pi/RetroPie/screenshot/$(date +%m%d%Y_%H%M%S).png
```

#スクリーンショットをsambaで取得できるようにする
/etc/samba/smb.confに以下の設定を追加して、「\\retropie\screenshot」でファイルを取得できるようにする。
事前にpathに指定するディレクトリは作成しておくこと。
RetroPie関係のファイルは/home/pi/RetroPie以下に集まっているので、そこに「screenshot」などの名前でディレクトリを作成しておくと良いと思う。（どこでもいいので、迷ったら）

```
[screenshot]
comment = screenshot
path = "/home/pi/RetroPie/screenshot"
writeable = yes
guest ok = yes
create mask = 0644
directory mask = 0755
force user = pi
```

#さいごに

上記スクリプト(scshot.sh)を実行すると、スクリーンショットが\\retropie\screenshotに出力されるので、簡単に取得できるようになる。
![03272016_113324.png](https://qiita-image-store.s3.amazonaws.com/0/95484/8b240169-fdf6-0a40-f65e-cc1f2a70cb43.png)
IoTCore アプリケーションを自動起動させる

アプリケーションを自動起動させる方法です。

>Visual Studioのソリューションエクスプローラでプロジェクト右クリックの配置だと、配置が簡単。

#前提
*Raspberry Pi 2
*Windows 10 IoT Core 10.0.14322.1000
*Visual Studio 2015 14.0.25123.00 Update 2

#アプリパッケージを作成
プロジェクトを右クリック -> ストア -> アプリパッケージの作成 をクリックします。
![20160423J.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/2bb8f4b9-ff59-2db6-acce-887d741dcf6c.png)

「いいえ」を選択して、「次へ」をクリックします。
![20160423K.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/3715ad20-ab36-5be4-621a-431684fcdd74.png)

必要なアーキテクチャを選択して、「作成」をクリックします。
>Releaseビルドだと、何故かインストール後に実行できない

![20160423L.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/6df4a043-c552-2a23-9914-ea90efe5d874.png)

「閉じる」をクリックします。
![20160423N.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/0310c292-5406-b2bf-a1fe-eb64c86c5411.png)

アプリパッケージが出来上がり。
![20160423O.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/16d0723c-ec52-a43c-05d4-36ee50ded329.png)

#アプリパッケージをデバイスにインストール
App Managerページで、App package, Certificate, Dependencyを参照設定して、「Go」をクリックします。
![20160423P.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/8f8cddb9-5f9c-1fe0-d91c-84c74324056e.png)

ページの最下行に「Done!」と表示されればオッケー。
![20160423Q.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/652cf21b-a6e9-afaf-41fd-34014c7cf71a.png)

#アプリケーションを自動起動
App Managerページで、「Set as Default App」をクリックします。
>あらかじめ、再生ボタン(?)でアプリが動くことを確認しておく。
>起動しないアプリを自動起動してしまうと死

![20160423R.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/45052141-e724-aba6-5eab-ea2f305200fe.png)
Cloud9でMongodbを起動

この通り
https://community.c9.io/t/setting-up-mongodb/1717

~/workspaceから以下を実行

```
$ mkdir data
$ echo 'mongod --bind_ip=$IP --dbpath=data --nojournal --rest "$@"' > mongod
$ chmod a+x mongod
$ ./mongod
```

アクセスできるか確認

```
$ mongo
```
IntelliJ IDEA 2016.1 EAP へのアップグレードでつまづいたこと

OSX 10.11でIntelliJを15から2016にアップグレードしようとしたら、ずっとスタート画面が表示されたまま起動しない問題に遭遇しました。

下記リンクによると2016以降のIDEAではJava8が必須であり、jdkのパス等を設定するファイルが正しく作られないかもしれないからその場合は自分で指定する必要があるよというようなことが書いてありました。
https://intellij-support.jetbrains.com/hc/en-us/articles/206544879-Selecting-the-JDK-version-the-IDE-will-run-under

IDEAの設定ファイル`/Users/me/Library/Preferences/IntelliJIdea2016.1/options/jdk.table.xml`
を見ると確かにjdk1.7に関する設定しかないようだったので、1.7となっている部分を1.8に置換して、パスの値もjdk1.8用に(例:`/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home`)するなど適当に修正してみました。Android関連の設定にもjdk1.7を指定してる部分がありましたがこれも1.8にしました。
これでもうまくいかなかったためキャッシュ`/Users/me/Library/Caches/IntelliJIdea2016.1`を削除してIDEAを再起動したら動きました。
Swift デバイスのモデル名を取得する

デバイスのモデル名を取得する方法についてです。
Appleからメソッドが用意されておらず頑張るしかありません。
デバイスからモデルのIDは取得できるためIDから変換してやります。

- iPhone8,1 → iPhone 6
- iPhone8,2 → iPhone 6s Plus

[GitHub](https://github.com/hideyukitone/DeviceInformation)で公開していますのでご自由にお使いください。

DeviceInformation.modelNameでモデル名が取得できます。

こちらでも公開しております。
http://hideyukitone.com/swift-deviceinformation/
GoのWebフレームワークのGoji (goji.io) をGAEで動かす

GoのWebFrameworkの `goji` が新しくなってたみたいなので、GAEで動くコードを書いてみた。

古い(？)Goji
https://github.com/zenazn/goji

新しいGoji
https://github.com/goji/goji

かなりコード変わっているので互換性はないっぽい。今回は新しいGojiを使ってコードを書いてみる。

```go
package main

import (
    "encoding/json"
    "fmt"
    "io"
    "net/http"

    "goji.io"
    "goji.io/pat"
    "golang.org/x/net/context"
)

func init() {
    mux := goji.NewMux()

    mux.HandleFuncC(pat.Get("/"), index)
    mux.HandleFuncC(pat.Get("/hello/:name"), hello)
    mux.HandleFuncC(pat.Get("/article"), article)

    http.Handle("/", mux)
}

func index(c context.Context, w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "index page")
}

func hello(c context.Context, w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, %s!", pat.Param(c, "name"))
}

type Article struct {
    Title   string `json:"title"`
    Content string `json:"content"`
}

func article(c context.Context, w http.ResponseWriter, r *http.Request) {
    article := Article{
        Title:   "title",
        Content: "hello world",
    }
    response, _ := json.Marshal(article)
    io.WriteString(w, string(response))
}
```

下記コマンドで実行する。

```sh
$ goapp serve
```

こんな感じで動く。

![image](https://qiita-image-store.s3.amazonaws.com/0/45283/fe9b6cc9-1d48-8334-7e79-75ee8f44b5c8.png)

http://localhost:8080

![image](https://qiita-image-store.s3.amazonaws.com/0/45283/7abfca66-73c6-48b0-849c-68496bd13aa6.png)

http://localhost:8080/hello/unko

![image](https://qiita-image-store.s3.amazonaws.com/0/45283/ef17218b-f7c9-e014-b1bc-55f8a3e352df.png)

http://localhost:8080/article

![image](https://qiita-image-store.s3.amazonaws.com/0/45283/47c4e2f0-b0c5-ef18-3973-840e8b38e7d4.png)

ログもこんな感じ。

![image](https://qiita-image-store.s3.amazonaws.com/0/45283/9b7ff9d1-5a59-ce6e-3915-ef95e4982e0e.png)

今回書いたサンプルコードはこちらにおいておきます。
https://github.com/funnythingz/try-gae-go
Ubuntu 14.04から16.04への更新でハマった場合の対処法 (Ubuntu)

手違いで更新に失敗して、力技で更新をかけたので、ハマった部分について書いておきます。力技が多いため、update-manager -dやdo-release-updateで更新し、問題が起こらなかった場合には、参考にならない部分も多いと思います。

# ブートできる環境からブートできない環境を更新したい

chrootを使う方法が簡単で良いと思います。chrootのやり方は、あちこちに乗っているので割愛。

# ダウンロードが遅い
日本のミラーを使いましょう。以下は一例。

```diff:/etc/apt/sources.list
-deb http://archive.ubuntu.com/ubuntu xenial main
+deb http://jp.archive.ubuntu.com/ubuntu xenial main
```

# intelのマイクロコードがアップデートされない
アップグレード時にrestrictedレポジトリが外されるため、再度有効にしましょう。

# 更新が保留になる
Holdしたパッケージがある場合は、パッケージをunholdしましょう。全てのパッケージをunholdするコマンドは以下に。

```shell-session
dpkg-query -W --showformat='${Package} install\n' | dpkg --set-selections
```

パッケージ構成の変更に追従するために、apt-get upgradeではなくapt-get dist-upgradeを使いましょう。

# 起動時にカーネルパニックする

原因は不明ですが、[upstartだと起動できる場合があります](http://ubuntuforums.org/showthread.php?t=2305360&s=e6928b9deea846d45eab0f1558c5ac79&p=13406069#post13406069)。通常の手順でカーネルパニックが起きる場合は、ブートローダーのAdvanced options for Ubuntuから、upstartで起動してみましょう。
リカバリーモードはsystemdのみしか用意されていないため、upstartでリカバリーモードに入るためには、`e`でコマンド編集に入り、カーネルオプションの後ろに` init=/sbin/upstart`を追加する必要があります。

# telinitもしくはrunlevelが見つからなくて起動できない
他の環境からchrootして、upstart-sysvパッケージをインストールしましょう。

単独の環境で復旧を行う場合は、リカバリーモードからrootシェルに入り、ルートファイルシステムをrwでremountして、`dhclient eth0`(または`eth1`)でネットワークを有効にして、upstart-sysvパッケージを入れましょう。

# grub2がMBRを読めない?
~~GPTしか認識しないように見えますね。ブートローダーのコマンドラインで`insmod msdospart`と入力すればMBRを認識出来るようにできるはずですが、それも上手く動いていない気がします。調査中。~~

chroot環境で更新したのが原因かもしれません。実環境でgrub2を再インストールすると良いかも。
Docker Composeの使い方メモ

KitematicでWordPressとmysqlのコンテナをさくっと作れると思ったけど、以下の様なMySQL Connection Errorが出て使えなかったので、代わりにDocker Composeを使用。

```
Warning: mysqli::mysqli(): php_network_getaddresses: getaddrinfo failed: Name or service not known in - on line 10
Warning: mysqli::mysqli(): (HY000/2002): php_network_getaddresses: getaddrinfo failed: Name or service not known in - on line 10
MySQL Connection Error: (2002) php_network_getaddresses: getaddrinfo failed: Name or service not known
```

#Docker Composeインストール
```
curl -L https://github.com/docker/compose/releases/download/1.3.2/docker-compose-`uname -s`-`uname -m` > docker-compose
sudo cp docker-compose /usr/local/bin/
sudo chmod +x /usr/local/bin/docker-compose
```

#ymlファイル作成
作成したファイルは、WrodPressのローカルファイルを置きたいところ同じディレクトリに置けばOK。


```yaml:docker-compose.yml
wordpress:
  image: wordpress:latest
  volumes:
    - src:/var/www/html
  links:
    - db:mysql
  ports:
    - 80:80
  environment:
    WORDPRESS_DB_PASSWORD: password
db:
  image: mysql:latest
  environment:
    MYSQL_ROOT_PASSWORD: password
```

#Docker Composeの実行
docker-compose.ymlを置いたディレクトリで以下のコマンドを実行。

```
docker-compose up
```

#WORDPRESS_DB_HOSTの設定
KitematicのWordpressのコンテナの設定のEnvironment Variablesで以下を追加。

```
WORDPRESS_DB_HOST: [mysqlのコンテナ名]
```
client is newer than server (client API version: 1.23, server API version: 1.22) と言われたときに対応する方法

Docker swarmを使っていてサーバー側とクライアント側のAPIのバージョンが違う場合に

>client is newer than server (client API version: 1.23, server API version: 1.22)

と出力されて動かない場合は、クライアント側のバージョンを環境変数に指定して実行します。

```file:サーバーとクライアントのバージョンが違う状況
$ docker -H 192.168.yy.zz:2378 version
Client:
 Version:      1.11.0
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   4dc5990
 Built:        Wed Apr 13 18:38:59 2016
 OS/Arch:      linux/amd64

Server:
 Version:      swarm/1.1.0
 API version:  1.22
 Go version:   go1.5
 Git commit:   HEAD
 Built:        <unknown>
 OS/Arch:      linux/arm
```

上が docker クライアント      API Version 1.23
下が docker サーバー(swarm)   API Version 1.22
です。

DOCKER_API_VERSIONの環境変数を指定します。
DOCKER_API_VERSION=1.22 docker version

```file:バージョンを環境変数で指定した状況
$ DOCKER_API_VERSION=1.22 docker -H 192.168.yy.zz:2378 version
Client:
 Version:      1.11.0
 API version:  1.22
 Go version:   go1.5.4
 Git commit:   4dc5990
 Built:        Wed Apr 13 18:38:59 2016
 OS/Arch:      linux/amd64

Server:
 Version:      swarm/1.1.0
 API version:  1.22
 Go version:   go1.5
 Git commit:   HEAD
 Built:        <unknown>
 OS/Arch:      linux/arm
```

API Version が同じになりました。
KiCadのグランドビア

下に書いたような面倒なことをしなくても簡単にグランドビアが打てるようになったそうです。[こちら](http://gsmcustomeffects.hatenablog.com/entry/2017/07/27/031836)

グランドビアとは多層のプリント基板の層間のグランドパターンをつなぐ配線(ビア)のことで、基盤が安定して動作するための必要なものです。KiCadの使い方でよく紹介されるグランドビアを打つ方法は少々面倒で、ビア同士を配線でつなぐ作業が必要になり、ビアの位置を修正する際に面倒でした。KiCadのビアを打つ機能を利用せずに、フットプリントとして登録し、それを配置することで上記の面倒な手間は回避できるのですが、ありま知られていません。オリジナルの方法は[こちらの記事](http://usbhobby.sblo.jp/article/99924905.html)にあり、以下はその焼き直しですが、準備作業の簡便化をしています。また、元の記事では、パッドコネクションの制御がされていないため、グローバルの設定と連動していました。今回は、ビアはsolidに固定してあるので、より望ましいパターンになります。当然ですが、ガーバーデータにした際は、旧来の方法でも今回の方法でも同等の出力になります。

1. フットプリントライブラリを作ります。例えば[チュートリアルの7.1章](http://docs.kicad-pcb.org/ja/getting_started_in_kicad.pdf)
2. 下記の内容のファイルを上で作成したmyfootprint.prettyの下にvia.kicad_modとして保存します。サイズの0.6とドリルの0.3は基盤屋の仕様に合わせてください。
3. 必要な所に必要なだけ配置してください。(viaあるいはmyfootprint:viaで参照できます)

```kicad:via.kicad_mod
(module via (layer F.Cu) (tedit 56E6D402)
  (fp_text reference "" (at 0 0.5) (layer F.SilkS) hide
    (effects (font (size 0.127 0.127) (thickness 0.03175)))
  )
  (fp_text value "" (at 0 -0.5) (layer F.Fab)
    (effects (font (size 0.127 0.127) (thickness 0.03175)))
  )
  (pad "" thru_hole circle (at 0 0) (size 0.6 0.6) (drill 0.3) (layers *.Cu)
    (solder_mask_margin -0.000001) (clearance -0.000001) (zone_connect 2))
)
```

How to place ground-via easily in KiCad　.
1. Create your footprint library (see section 7.1 in [the tutorial](http://docs.kicad-pcb.org/en/getting_started_in_kicad.pdf))
2. Place via.kicad_mod under myfootprint.pretty created in 1. You cam modify size (0.6) and drill (0.3) according to your design rule.
3. Place vias where you want. (refer by "via" or "myfootprint:via")
プロジェクトマネジメントしていますか？PMBOKとBABOKの話し

# それってプロジェクトマネジメントできてる？
PMBOKの認知度はかなりあるかと思いますが、プロジェクトを回すための先人の教えですね。PMBOKの解説はいろいろとあるので譲るとして、ここでは雑談的な内容です。

プロジェクトには様々な立場の人が携わり、おのおのが自分の立場で意見を主張しています。そしてプロジェクトの成否や進行はQCDに基いて判断されます。ただ、いままで関わってきたプロジェクトの多くではコストや納期に対して厳しく見られることが多いですが、品質に関してはけっこう厳しく言う人がいないんですよね。せいぜいバグゼロにしろって言うぐらいで、バグゼロにするためにはどういう事をするべきかを示してくれません。
正直言ってソフトウェアプロジェクトにおいて品質が一番大事です。どの程度の品質レベルにおいて開発するかで終結に至るまでのプロセスや判断基準、採用する技術も大きく変わってきます。当然それはコストと納期に影響します。とはいえ無制限というわけにもいかないのでバランスを取りましょうということになるはずです。なのに品質の話は一切せずにコストと納期を先に決めてしまうなんて、一体どういったことでしょう？

# プロジェクトマネジメントの知識体系
おのおのの立場でスケジュールがどうの、減価償却だどうの、でも品質のことを気にする人が居ないなんていう状態はあるべき姿ではないですよね。
そこでPMBOKです。
スコープ管理、リスク管理、要員管理、コミュニケーション管理、調達管理といった内容をプロセスとしてまとめあげて体系化されています。やることが多くて大変だぁ～とは思いますが、プロジェクトをマネジメントするということは、様々な要因が絡むわけです。

# PMBOKとBABOKのスコープの違い
いろいろなBOKがありますが、PMBOKと一緒に取り組みたいのがBABOKです。
PMBOKはプロジェクト運営に関わるすべての知識体系として、上流工程の要求分析やコスト、品質、リスク、ステークホルダーといったマネジメントも含みます。
対してBABOKも上流工程の知識体系ですが、プロジェクトの運用といった部分には興味がなく、ビジネスの観点として必要な「ニーズ」に対してどのような「価値」を提供するかといった部分が焦点でしょう。プロジェクト運用について興味が無いというのはまぁ嘘でして、ビジネスを達成するための監視や妥当性確認の一部として見られますよね。

しかしながらPMBOKの第5版ではBABOKの内容も取り入れられ、スコープマネジメント、タイムマネジメント、コストマネジメント、ステークホルダーマネジメントといったプロセスが増えています。プロジェクトの運用には欠かせないということですね。
じゃぁBABOKはどうなの？というと、第3版でさらなるビジネスの発展を目指し、ニーズを実現するだけではなく、ニーズを自ら発掘しイノベーションを起こそうよという内容に改定されています。

# BOKを勘違いして取り組まない
PMBOKもBABOKも、書いてある内容をそのままと取り入れるものではありませんね。
ともに世界レベルの知見の集まりなので使わない手はありませんが、あくまでもガイド＝手引書の立場で、それぞれのプロセスを実現するための手法については一部を挙げつつも、それを使えばいいということではありません。ツールなんて日々新らしいものが出てくるものです。ガイドではあるべき姿を示しているわけで、それを実現する手段は別の話しでしょう。
【Dropbox】kobitoデータをクラウド上で管理する


端末のリプレースなどの時に、kobitoのデータをいちいち移行するのが面倒なので、
クラウド上で管理してみることにしました。
ちょっとネットで検索してみたところ、Dropboxを使って実現できそうだったのでやってみました。
結構便利だったので、キュレーションします。

-
# 1.検証環境
今回、検証した環境は下記になります。
恐らくバージョンが異なっても同じようにできると思います（多分）。

- MacBook Air (11-inch, Early 2015)
- Kobito バージョン 2.3.5 (2030500)

-
# 2.手順
## 2.1.kobito configファイルの退避
以下のコマンドを実行して行いますが、事前にkobitoは終了してから実施してください。

````コマンド
$ cp -p ~/Library/Containers/com.qiita.Kobito/Data/Library/Kobito/* /Users/User/Desktop/kobito_bkup
````

## 2.2.kobito configファイルをDropbox上に格納
後続手順でハードリンク作ることになるので、Dropbox上の格納先は任意で構いません。

````コマンド
$ mv ~/Library/Containers/com.qiita.Kobito/Data/Library/Kobito/* ~/Dropbox/Kobito/
````

## 2.3.Dropboxのファイルをハードリンクとして配置
シンボリックリンクは使えないようなので、ハードリンクを使用します。

````コマンド
$ cd ~/Library/Containers/com.qiita.Kobito/Data/Library/Kobito/
$ ln ~/Dropbox/Kobito/Kobito.db-wal Kobito.db-wal
$ ln ~/Dropbox/Kobito/Kobito.db-shm Kobito.db-shm
$ ln ~/Dropbox/Kobito/Kobito.db Kobito.db
````
windows環境でのdocker-composeによるrailsチュートリアルの補足

# docker-compose の railsチュートリアルをウィンドウズでやろうとしたら・・・

## tutorial for rails on docker-compose
[tutorial : docker-compose and rails](https://docs.docker.com/compose/rails/)

これを見て比較的簡単にrails環境がウィンドウズでも作れるなと思いきや、落とし穴が。

## 問題

~~このコマンド、docker-compose runのライブコマンドが使用できない・・・・~~
~~これ自体はrailsプロジェクトを作成するコマンドですが、ここで躓きました。~~

後日、色々試しているとこのコマンドで行ける場合がありましたので修正します。

```
※これでエラーが出る場合
docker-compose run web rails new . --force --database=postgresql --skip-bundle

↓
↓
※こちらで対処
docker-compose run -d web bundle exec rails new . --force --database=postgresql --skip-bundle

```

これで無事 new コマンドが実行できました。




## 下記は現状どうかわかりませんが参考に残しておきます。

	実行すると　-d flag　optionをつけてくれと言われますが、
	それをしても該当フォルダにrailsプロジェクトが作成されず、さらにゴミ（？）コンテナが生成されてしまいます。

	で、docker-composeのgithub issueを見ていくと

	[https://github.com/docker/compose/blob/1655be6c5bcbc35d2a34bd4c464b8a91981aaa42/compose/cli/main.py#L550](https://github.com/docker/compose/blob/1655be6c5bcbc35d2a34bd4c464b8a91981aaa42/compose/cli/main.py#L550)

	にて

	```
	        if IS_WINDOWS_PLATFORM and not detach:
	        raise UserError(
	            "Interactive mode is not yet supported on Windows.\n"
	            "Please pass the -d flag when using `docker-compose run`."
	        )
	```

	とのこと。


	## 解決方法

	ライブコマンドは使うな（使えない by windows)

	ただし、docker-composeがバージョンアップされれば？　期待しますが。

	さしあたって、ライブコマンド以外は途中までチュートリアル通りやって、最後らへんの

	docker-compose up を 

	```
	docker-compose up -d
	```

	　で実行してから、

	```
	docker exec -it **コンテナ名前 bin/sh
	```

	でコンテナの中に入って普通に

	```
	rails new . --force --database=postgresql

	```

	と

	```
	rake db:create
	```

	を実行するのが良策だと思います。

	## 最後に

	ちなみにdockerサイトのチュートリアルはマックだとスムーズにいけます。

	ウィンドウズ・・・・・

	※ 間違い、こういう方法でいけるよというのを、ご指摘いただければありがたいです。
Windows標準機能だけでsnmpgetする（PowerShell）

# やりたいこと
Windowsで、Net-SNMP等SNMPのツールが入っていない環境でもsnmpgetのテスト
が出来ないかと思って調べていると「olePrn.OleSNMP」というCOMオブジェクト
を利用すると出来そうなことがわかりました。

　参考：[スクリプト Network Device discovery via PowerShell (SCOM)](https://gallery.technet.microsoft.com/scriptcenter/Network-Device-discovery-3a057882)

これを使って、複数の機器にsnmpgetしていき、sysnameがとれたかどうかの
結果一覧を取得をしてみます。
今回はPowerShellを使いますが、おそらくVBSでも可能だと思います。


# コード
```ps1:snmpgettest.ps1
# テストする対象のIPアドレス。ここでは配列で定義。
$targetip =@(
    "192.168.0.1",
    "192.168.0.2",
    "192.168.0.3",
    "192.168.0.4",
    "192.168.0.5"
)

# SNMPコミュニティ名
$community = "public"
$resluts = @()

foreach($ip in $targetip) {
    $snmp = new-object -ComObject olePrn.OleSNMP 
    # SNMP接続
    # open("IPアドレス","コミュニティ名","リトライ回数","タイムアウト")
    $snmp.open($ip, $community, 2, 1000) 
 
    try {
        # sysnameを取得
        $sysname = $snmp.Get(".1.3.6.1.2.1.1.5.0")
        $result  = $true
    } catch [Exception] {
        # 応答がない場合（IP不到達、コミュニティ名誤り、OID誤り）
        $sysname = $null
        $result  = $false
    } 
    
    $obj = New-Object PSObject -Property @{
        ip      = $ip;
        sysname = $sysname;
        result  = $result
    }
    $resluts += $obj
}

# 結果の表示
$resluts | Format-table -Property ip, sysname, result -AutoSize

```

# 結果例

```text:結果例
ip          sysname  result
--          -------  ------
192.168.0.1 router1    True
192.168.0.2 router2    True
192.168.0.3           False
192.168.0.4 Server1    True
192.168.0.5 Server2    True
```
できました。

# 補足
SNMPのバージョンは v1 のようです。
![Image2.png](https://qiita-image-store.s3.amazonaws.com/0/113577/16958929-f75a-aaf0-7739-eaed744fb1ff.png)
pythonでjsonの型を動的に読み込む

pythonではjsonモジュールはパッケージ同梱ですが、yamlモジュールはサードパーティ製です。
現在作成しているプログラムでは、環境の違いを吸収するため

1. もしyamlモジュールがあり、yamlのconfigファイルがあればそれを読む。
2. ダメならjsonでの読み込みを試みる。
3. それでもだめなら例外を挙げる

という挙動を採用しています。
yamlとjsonは似たインターフェイスを持っているので、以下のように全く同じように扱ったのですが、

```py3
try:
    import yaml
    with open("config.yaml") as y:
        config = yaml.load("config.yaml")
except ImportError:
    import json
    try:
        with open("config.json") as j:
            config = json.load(j)
    except AttributeError:
        logger.error("please set config file in json or yaml !!")
        raise


# 以下でconfigの値を使用する… 
```

ここに落とし穴がありました。
yamlの場合、keyの型を自動的に推測して読み込んでくれるのですが、jsonは必ず`str`にします。
つまりコンフィグファイルが以下のような内容だった場合

```config.yaml
1: "hoge"
key: "fuga" 
```

```config.json
{
    "1": "hoge",
    "key": "fuga"
}
```

いずれの場合も`config["key"]`で`"fuga"`にアクセスできますが、`"hoge"`の方はjsonならば`config["1"]`, yamlならば`config[1]`でアクセスしなくてはなりません。

これを避けるには`json.load()`時にフックとして関数を与えます。

```py3
def jsonkeys_to_int_always(x): # keyの型をすべてintにできるときはこちらでOK
    if isinstance(x, dict):
            return {int(k):v for k,v in x.items()}
    return x

def jsonkey_to_int_when_possible(x): # yamlと同様の挙動をさせたいときはこちら
    d = {}
    if isinstance(x, dict):
        for k,v in x.items():
            try:
                k = int(k)
            except ValueError:
                pass
            d[k] = v
        return d

config = json.load("config.json", object_hook=jsonkeys_to_int_when_possible)
```

[yamlの中で値を指定する](http://pyyaml.org/wiki/PyYAMLDocumentation#YAMLtagsandPythontypes)ことで、違いを吸収することもできる様ですが、詳しくは知りません。
【mac】zipファイル操作コマンド


##解凍
**unzip [解凍したいファイル名]**

```ruby:hoge.zipを解凍する場合
unzip hoge.zip
```
指定のファイル名を解凍する。
パスワード付きの場合は、パスワードの入力が求められる。

##ファイルの圧縮
**zip [圧縮時のファイル名] [圧縮したいファイル名]**

```ruby:hoge.txtをhoge.zipに圧縮したい場合
zip hoge.zip hoge.txt
```
ファイルを圧縮する。

##ディレクトリを圧縮
**zip -r [圧縮時のファイル名] [圧縮したいフォルダ名]**

```ruby:hogedirフォルダをhogedir.zipに圧縮したい場合
zip -r hogedir.zip hogedir/
```

フォルダを圧縮する。

##パスワード付きでファイルを圧縮
**zip -e [圧縮時のファイル名] [圧縮したいファイル名]**

```ruby:hoge.txtをps_hoge.zipに圧縮したい場合
zip -e ps_hoge.zip hoge.txt
```
パスワード付きでファイルを圧縮する。
コマンド実行時に、パスワードの入力が求められるので、設定したいパスワードを入力する。

##パスワード付きでフォルダを圧縮
**zip -e -r [圧縮時のファイル名] [圧縮したいフォルダ名]**

```ruby:hogedirをps_hogedir.zipに圧縮したい場合
zip -e -r ps_hogedir.zip hogedir/
```
パスワード付きでフォルダを圧縮する。
コマンド実行時に、パスワードの入力が求められるので、設定したいパスワードを入力する。

##ディレクトリを特定のファイル（フォルダ）を除外して圧縮
**zip -r [圧縮時のファイル名] [圧縮したいファイル名] -x "\*[除外したいファイル（フォルダ）名]\*"**

```ruby:hogedirをnode_modulesと.gitを除外してhogedir.zipに圧縮したい場合
zip -r hogedir.zip hogedir/ -x "*node_modules*" -x "*.git*"
```
これで、hogedir内のnode_modulesは除外されて、hogedir.zipに圧縮される。
例のように、-xのパラメータは複数指定可能。
xパラメータの指定文字列は、前後に"*"がつくので要注意！！
node-redことはじめ

#PM2
どうもWindowsでPM2を動作させるときは、clusterモードしか受け付けないようだ。forkモードで動作すると必ず失敗する。ログを見ると、「Error: EBADF: bad file descriptor, uv_pipe_open」とあるので、そもそもダメなのかもしれない。Nodistをインストールしている場合、起動パスとしては以下のようになる。引数で名前を指定しないと、スクリプトの名前になるようだ。

```
pm2 start "C:\Program Files (x86)\Nodist\bin\node_modules\node-red\red.js" -i max -- -v
pm2 info red
```

#Nodeの作成
## npm packaged nodesのインストール
Nodeは以下のサイトにどんどん登録させている模様。インストールするためには、ドキュメント以下に自動作成される.node-redフォルダ内に移動してからインストールする。グローバルでインストールしてもOK。インストールした際は再起動しよう。
http://flows.nodered.org/

```
cd $HOME/.node-red
npm install <npm-package-name>
```

##独自nodeのインストール
.jsや.htmlファイルをnodesディレクトリに設置することでインストールができるらしい。

## flowの作成
最初のflowの作成を公式サイトを参考に作ってみる。
基本的にはパレットにあるやつをワークスペース（右側）にドラッグすればよい。サイドバーはCtrl+スペースキーで出てくる。ちなみにNodeにはスイッチのようなものがついていて、明示的に機能のON/OFFができるようになっている。

1. Injection Node　：　flowの中にメッセージを入れるノード
2. Debug Node　：　デバッグメッセージをサイドバーに表示するノード
3. Function Node : JavaScriptを使ってメッセージの操作ができるノード
4. それぞれをつなぐ
5. Deployを押す
6. Injection Nodeの左のボタンを押す

これらのノードは実態はJSONで記載されていて、Import -> Clipboardに直接JSONを入力することで生成することもできるようだ。

<img width="341" alt="first_flow.png" src="https://qiita-image-store.s3.amazonaws.com/0/51703/dda7ea56-94a5-e825-a1b5-03f7f0f2a54e.png">
Clojureのデータ構造をシリアライズしてファイルに書き出す


ニューラルネットのモデルをディスクに保存したいという、モチベーションでした。
ただ、少し状況が特殊なのは、ニューラルネットのモデルパラメータをプリミティブのfloat配列で表現していることです。
最初に一般的なデータ構造の保存の方法を見なおした後に、float配列等のプリミティブに対応したデータ構造を保存する方法を見ていきましょう。

## データ構造を保存

一般的な状況であれば、次のような方法で読み書きができます。

```clj:save
(defn save [obj path] (spit path (pr-str obj)))
(save {:a 123 :b "qwerty" :c [1 2 3] :d '("x" "y" "z")} "tmp.txt")
```

```clj:load
(defn load [path] (clojure.edn/read-string (slurp path)))
(load "tmp.txt") ;=> {:a 123, :b "qwerty", :c [1 2 3], :d ("x" "y" "z")}
```

シンプルでいいですね。
しかし、次のようにfloat-arrayなどのプリミティブには対応できません。

```clj:float-array
(save (float-array (range 10)) "tmp2.txt")
(load "tmp2.txt") ;=> ERROR
```
ここで、tmp2.txtの中身を見てみると、`#object["[F" 0x2457b2d4 "[F@2457b2d4"]`といった内容が記載されていました、見えてはいけなさそうな箇所が剥き出しですね。
これでは`read-string`が使えないわけです。

## シリアライズしてデータ構造を保存

さて、ここから本題ですが、先に簡潔に流れを説明すると、1.シリアライズして、2.ファイルに書き出す、だけです。
[この投稿](http://stackoverflow.com/questions/23018870/how-to-read-a-whole-binary-file-nippy-into-byte-array-in-clojure?answertab=active#tab-top)が良い方法を示しています、[ptaoussanis/nippy](https://github.com/ptaoussanis/nippy)を使うと簡単そうですね。

ちなみに、この方法を使う似たような動機だと、ゲームのセーブデータを作成したい場合や、通信越しにオブジェクトのやり取りをしたい場合などがあるようです。
また、シリアライズ/デシリアライズ自体については解説されてる資料が多々ありますので、この記事では省きます。

最初に、依存関係を示します。
`[com.taoensso/nippy "2.11.1"]`を`project.clj`に追加してください。

そして、requireします。

``` clj:dependencies
(ns my-ns (:require [taoensso.nippy :as nippy]))
```

次のようにすることでシリアライズして保存できます。

```clj:シリアライズして保存
(defn save [obj target-path]
  (with-open [w (clojure.java.io/output-stream target-path)]
    (freeze-to-out! (java.io.DataOutputStream. w) obj)))
```

もしシリアライズのみを行いたい場合であれば、`freeze`が使えます。

また、次のようにすることで読み込みます。

```clj:読み込み
(defn load [target-path]
  (with-open [w (clojure.java.io/input-stream target-path)]
    (thaw-from-in! (java.io.DataInputStream. w))))
```

こちらも単にデシリアライズしたい場合には`thaw`が使えます。

では、定義した関数を試してみましょう。

```clj:シリアライズの後に保存して読み込み
(save (float-array (range 10)) "tmp.txt")
(load "tmp.txt") ;=> #object["[F" 0x428cf9b8 "[F@428cf9b8"]
(seq (load "tmp.txt")) ;=> (0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0)
```

バッチリですね！
Rippleの技術 レッジャー、コンセンサスのプロセス

以下に移行しました<br><a href="http://block-chain.jp/tech/ripple-ledger-consensus-process/" title="Rippleの技術 レッジャー、コンセンサスのプロセス">Rippleの技術 レッジャー、コンセンサスのプロセス</a>
Learn Git Branching をやってみる

LearnGitBranching

Gitのテストサイトを見つけてテストしていたら、
ブランチスパゲティというのではまりました。
具体的には、そこまででまだでてきてないrebase -iやcherry-pickを使わないと
解けないように見えました。

あらためてみていたら、本家っぽいGithubで日本語対応できているようなので、
そちらであらためてトライしてみようと思います。

[Learn Git Branching](http://pcottle.github.io/learnGitBranching/)
->右下の地球儀マークから、日本語レポジトリを選ぶと、日本語になります。
MacからsshでRaspberry pi 3に接続するも、WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! が出る時の解決方法

# 現状

Mac（Terminal）→→[ssh]→→Raspberry pi 3 Model B(Raspbian jessie)
で接続するもつながらない。

↓これがでる。

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:*****.
Please contact your system administrator.
Add correct host key in /Users/***username***/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /Users/***username***/.ssh/known_hosts:6
ECDSA host key for ***.***.***.*** has changed and you have requested strict checking.
Host key verification failed.
```

# 解決方法

**`sudo`**
すると良い。

`sudo ssh username@***.***.***.***`
※Raspbianの初期usernameはpiなので、

`sudo ssh pi@***.***.***.***`で可能。


他に解決としては
`/Users/***username***/.ssh/known_hosts`
の中に対象のIPがあるので、消しても良い。

ただ、今回は、接続先の物体が分かっているので、別にセキュリティ云々は良いかなと思い、`sudo`しただけで解決したので、ここに簡単にメモっておく。
因果推論まわりサーベイ (LiNGAM含む)



[2005, 清水]
日本語
http://www.ar.sanken.osaka-u.ac.jp/~sshimizu/papers/BSJ2012_Tutorial_final_web.pdf
http://www.slideshare.net/sshimizu2006/icalingam

Rパッケージ
https://sites.google.com/site/dorisentner/publications/VARLiNGAM

データ
1. 
cd workspace/VARLiNGAM/
mkdir data
cd data
wget http://www.insead.edu/facultyresearch/faculty/personal/imihov/documents/mmp.zip
[](
*wgetのプロキシ設定は~/.wgetrc ¥
プロキシ環境下なら以下の行を足す ¥
http_proxy=http://proxy01.y.ecl.ntt.co.jp:8080/ ¥
)

unzip mmp.zip
してもエラーが出る
End-of-central-directory signature not found
-> zipファイルが壊れてる？

http://www.insead.edu/
ディレクトリ名imihovからおそらくILIAN MIHOV教授と推測
個人ページのpathが変わってるらしい
personal websiteは以下
http://faculty.insead.edu/ilian-mihov/
ここにzipファイルのリンクあり
http://faculty.insead.edu/ilian-mihov/research
 [DATA: Download a zipped file with the RATS program, data files, an overall indicator, and a readme file].
クリックでダウンロード
mv ~/Downloads/mmp.zip ./
unzip unzip mmp.zip 
解凍成功

grep PGDP data/MP/Requests/*
data/MP/Requests/MMP.rat:*  1) This program runs base VARs (GDPM, PGDPM, PCOM, TR, NBR, FFR)
data/MP/Requests/MMP.rat:     GDP PGDP PCOM TR NBR FFR
data/MP/Requests/MMP.rat:* Interpolated monthly variables: GDP and PGDP
Binary file data/MP/Requests/Newgdp97.wk1 matches

MMP.ratがデータファイルらしい
wk1形式なのでOpenOffice等Lotusファイルを読み込めるアプリをインストールして開く
ここのinstallationをクリック
http://www.openoffice.org/download/index.html
手順通りにインストール (1分程度)

Newgdp97.wk1がGDPMとPGDPMのデータ
Newdata1.wk1がNBREC、TRES、FYFF、PSCCOMのデータ

データの形式については論文p.18の真ん中あたり
Our study is based on Bernanke and Mihov’s 1998 data set, which consists of 6 monthly time series US data (1965:1-1996:12)6, three of which are policy vari- ables: TR𝑡: total bank reserves (normalized by 36-month moving average of total reserves); NBR𝑡: nonborrowed reserves and extended credit (same normalization); and FFR𝑡: the federal funds rate. The other three variables are non-policy macroeconomic variables: GDP𝑡: real GDP (log); PGDP𝑡: the GDP deflator (log); and PSCCOM 𝑡: the Dow-Jones index of spot commodity prices (log). An important underlying assumption in the structural VAR model is that each variable is affected by an independent shock. Since nonborrowed reserves are part of total reserves, it is likely that a shock affecting NBR𝑡 is correlated with a shock affect- ing TR𝑡. To render our independence assumption more plausible, we replace TR𝑡 with BR𝑡 ≡ (TR𝑡 − NBR𝑡).

US data (1965:1-1996:12)
との記載があるので２つのwk1ファイルからその部分だけ抜き出して横に結合
./data/myData.csvにcsvファイルとして保存
* colname, rownameともになし

R
> source("sourcedir.R")
> source("main1.R")
> main1("macro","./data/myData.csv",boot_sd = FALSE,  boot_irf = FALSE, subsamples=TRUE)

2. Compustat database
http://www.spcapitaliq.com/our-capabilities/our-capabilities.html?product=compustat-research-insight#
こっちは買わなきゃいけないみたい
情報はここ
https://editorialexpress.com/cgi-bin/conference/download.cgi?db_name=ICEEE2011&paper_id=83
dnu restore で Only 'http' and 'https' schemes are allowed. が発生した時の修正箇所

[Your First ASP.NET 5 Application on a Mac](http://docs.asp.net/en/latest/tutorials/your-first-mac-aspnet.html)
のチュートリアルをやってたら、`dnu resotre`がエラーでつまづいた。

エラー発生した際のバージョンは以下の通り

```bash
% dnu --version
Microsoft .NET Development Utility
 Version:      1.0.0-rc1-16609
 Type:         CoreClr
 Architecture: x64
 OS Name:      Darwin
 OS Version:   10.11
 Runtime Id:   osx.10.11-x64
```

エラー内容は、

```bash
% dnu restore
...(省略)
Restore failed
Only 'http' and 'https' schemes are allowed.
Parameter name: requestUri
...(省略)
```

`project.json`とか確認したけど、`http://`とか`https://`の記述がない。。。
で、`dnu`のバージョンかなとか思ったり、`dnu`のヘルプをみたところ、`feeds`というのを発見!!
dnuのfeedsを確認してみる。

```bash
% dnu feeds list
Feeds in use:
    https://www.myget.org/F/aspnetvnext/api/v2/
      Origin: /Users/user/.config/NuGet/nuget.config
    ttps://www.nuget.org/api/v2/
      Origin: /Users/user/.config/NuGet/nuget.config
    https://api.nuget.org/v3/index.json [Disabled]
      Offical NuGet Source, enabled by default

NuGet Config files in use:
    /Users/user/.config/NuGet/nuget.config
```

あっ、これだ。ttps:ってなってるのが原因じゃん。
`vi /Users/user/.config/NuGet/nuget.config`とかで`nuget.org`のvalueを修正して、再度、

```bash
% dnu restore
...(省略)
Restore complete, 32197ms elapsed

NuGet Config files used:
    /Users/user/.config/NuGet/nuget.config

Feeds used:
    https://www.myget.org/F/aspnetvnext/api/v2/
    https://www.nuget.org/api/v2/

Installed:
    52 package(s) to /Users/user/.dnx/packages
```

無事成功で解決。
"dyld: lazy symbol binding failed"→いったんmysql gem 削除→再インストールに失敗の流れ

２度同じことがあったのでメモ。

まずこれが発生。rake db:renewをしようとしたら発生。
[rails環境でのMysqlのdyld: lazy symbol binding failed: Symbol not foundエラー](http://qiita.com/RyogaBarbie/items/37e3e60e922e842e20ce)

恐る恐る、既存のmysql gemを削除。
```$ gem uninstall mysql2```


再インストール。
```$ gem install mysql2```
↓
ERROR!!!!!!

```
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.
```

対処。
[gem mysql2 インストールエラー](http://qiita.com/MasatoYoshioka@github/items/b148eb68e4a5c5f9b0f2)
vim-clang でC/C++のコードを補完する(入力時に自動表示)．

# はじめに
素人です．Vim でC/C++のコードを補完する手順をメモしておきます．[C/C++の補完プラグインをclang_completeからvim-clangに乗り換えた](http://qiita.com/koara-local/items/815b08ff5c6673d8a5c6)の記事を主に参考にさせていただきました．

構文解釈には高速と言われるC++コンパイラclang派生のclang-formatを利用し，Vim側からvim-clangを経由させて使用するようです．

# clangのインストール
当たり前ですが，これが入っていないとモジュールがないって怒られます．

```bash
sudo apt-get clang-3.5
sudo apt-get clang-format-3.5
```

# プラグインのインストール
vim-clangを経由して候補を検索します．自動補完はneocompleteを使います．
neocompleteを使って非同期で表示させるので，vimprocを使います．念の為，書いておきます．

```vim
NeoBundle 'Shougo/neocomplete.vim'
NeoBundle 'Shougo/vimproc.vim', {
			\ 'build' : {
			\ 'windows' : 'make -f make_mingw32.mak',
			\ 'cygwin' : 'make -f make_cygwin.mak',
			\ 'mac' : 'make -f make_mac.mak',
			\ 'unix' : 'make -f make_unix.mak',
			\ },
			\ }
NeoBundle 'justmao945/vim-clang'
NeoBundle 'Shougo/neoinclude.vim'
```

# .vimrcの設定

[C/C++の補完プラグインをclang_completeからvim-clangに乗り換えた](http://qiita.com/koara-local/items/815b08ff5c6673d8a5c6)を盛大に真似させて頂いております．感謝です．

```vim
" 'Shougo/neocomplete.vim' {{{
let g:neocomplete#enable_at_startup = 1
if !exists('g:neocomplete#force_omni_input_patterns')
	    let g:neocomplete#force_omni_input_patterns = {}
endif
let g:neocomplete#force_overwrite_completefunc = 1
let g:neocomplete#force_omni_input_patterns.c = '[^.[:digit:] *\t]\%(\.\|->\)'
let g:neocomplete#force_omni_input_patterns.cpp = '[^.[:digit:] *\t]\%(\.\|->\)\|\h\w*::'
"""}}}

" 'justmao945/vim-clang' {{{

" disable auto completion for vim-clanG
let g:clang_auto = 0
let g:clang_complete_auto = 0
let g:clang_auto_select = 0
let g:clang_use_library = 1

" default 'longest' can not work with neocomplete
let g:clang_c_completeopt   = 'menuone'
let g:clang_cpp_completeopt = 'menuone'

if executable('clang-3.6')
    let g:clang_exec = 'clang-3.6'
elseif executable('clang-3.5')
    let g:clang_exec = 'clang-3.5'
elseif executable('clang-3.4')
    let g:clang_exec = 'clang-3.4'
else
    let g:clang_exec = 'clang'
endif

if executable('clang-format-3.6')
    let g:clang_format_exec = 'clang-format-3.6'
elseif executable('clang-format-3.5')
    let g:clang_format_exec = 'clang-format-3.5'
elseif executable('clang-format-3.4')
    let g:clang_format_exec = 'clang-format-3.4'
else
    let g:clang_exec = 'clang-format'
endif

let g:clang_c_options = '-std=c11'
let g:clang_cpp_options = '-std=c++11 -stdlib=libc++'

" }}}
```

# おわりに
force_omni_input_patterns の規約を理解していませんが，とりあえずこれでそれっぽく補完されているので，良しとしておきます．．

# 参考文献
- http://d.hatena.ne.jp/osyo-manga/20131219/1387465034
- http://qiita.com/koara-local/items/815b08ff5c6673d8a5c6
- https://github.com/Shougo/neosnippet.vim/issues/198
Docker公式イメージのMySQLで文字コードを指定する

# Docker公式のMySQLイメージを使用
Docker Composeを使ってDocker公式のMySQLイメージを利用したら文字コードでハマった。
下記構成でDocker Compose利用時、アプリサーバとMySQLサーバの文字コードが相違した。

```yaml:docker-compose.yml
version: '2'
services:
  db:
    image: mysql:5.5
    volumes:
      - data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: 'password'
    ports:
      - 3306
  cache:
    image: memcached:1.4
    ports:
      - 11211
  rails:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/opt/rails
    ports:
      - "3000:3000"
    environment:
      RAILS_ENV: local
      DATABASE_URL: mysql2://root:password@db:3306
      CACHE_SERVER: cache:11211
    links:
      - db
      - cache
volumes:
  data:
    driver: local
```

# 発生した文字コード相違問題
こんな感じで相違していた。
* Rails: utf8
* MySQL: latin1

エラーメッセージが発生してRailsが起動しない！
`charset: utf8, collation: utf8_general_ci (if you set the charset manually, make sure you have a matching collation)`

# my.cnf編集させなくてもイケるんじゃね
色々とググッてみたらmy.cnfを編集しなくてはいけないという記載をよく見た。
そんな面倒なことあるか！？
とりあえずDocker公式のMySQLレポジトリへ飛んだ。
[Docker公式MySQLレポジトリ](https://hub.docker.com/_/mysql/)

そしたらこんな記載が・・・！
```
Configuration without a cnf file
Many configuration options can be passed as flags to mysqld. This will give you the flexibility to customize the container without needing a cnf file. For example, if you want to change the default encoding and collation for all tables to use UTF-8 (utf8mb4) just run the following:
```

そんで下記のようなコマンド例もちゃんと書いてある！
```
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
```

# 解決方法
docker-compose.ymlを下記のように編集した。

```yaml:docker-compose.yml
version: '2'
services:
  db:
    image: mysql:5.5
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    volumes:
      - data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: 'password'
    ports:
      - 3306
  cache:
    image: memcached:1.4
    ports:
      - 11211
  rails:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/opt/rails
    ports:
      - "3000:3000"
    environment:
      RAILS_ENV: local
      DATABASE_URL: mysql2://root:password@db:3306
      CACHE_SERVER: cache:11211
    links:
      - db
      - cache
volumes:
  data:
    driver: local
```

具体的にはdbにcommandを追加して、コマンドラインで文字コードの設定を渡すようにした。
「第７章」Apache SolrのSampleプログラム実行

#Solr サンプルプログラムの実行

##サンプルデータの登録
Solrインストールフォルダに移動してSolrを起動します。
`bin/solr start`

![image](https://qiita-image-store.s3.amazonaws.com/0/85145/4d4a2db4-9c6a-370a-df1a-7d6a9d299daf.png)

※solrの停止コマンドは？
`bin/solr stop -all`

![image](https://qiita-image-store.s3.amazonaws.com/0/85145/92d489c2-11b4-ed41-baac-73d28fa1d4a5.png)

Linuxでは通常、postコマンドを使うみたいなんですが、Widowsだと使えない...
でもWindows用にpostツールが用意されているそうです。
[Post Tool - Apache Solr Reference Guide - Apache Software Foundation](https://cwiki.apache.org/confluence/display/solr/Post+Tool#PostTool-Windows)

というわけで言われるがままにそこに書いてあるコマンドを実行してみます。

**[結果]**
core/collectionが必須ですと怒られます。
`SimplePostTool: FATAL: Specifying either url or core/collection is mandatory.`

![image](https://qiita-image-store.s3.amazonaws.com/0/85145/1afad515-350f-a52b-7ac4-8b7b5cf0e780.png)

coreを作らないといけないみたいですので、まずは「D:\Software\solr-6.0.0\bin」フォルダに移動し、下記のコマンドを実行します。
`solr create -c collection1`

![image](https://qiita-image-store.s3.amazonaws.com/0/85145/e0ea3f7f-7adf-06c4-0917-1a6802aefd44.png)

そのうえで、「D:\Software\solr-6.0.0\example\exampledocs」フォルダに移動し、core/collectionを指定してサンプルドキュメントを登録します。
`java -Dc=collection1 -jar post.jar *.xml`

![image](https://qiita-image-store.s3.amazonaws.com/0/85145/214688f3-1ef0-192e-806f-b7a936c34e05.png)

登録できました。

##サンプルデータの検索
管理画面から簡単な検索を実行することができます。
①　左のメニューのセレクトボックスから「Collection1」(Solrのコア名)選択。
②　その下のメニューの「Query」をクリック。
③　右の入力フォーム「qの部分」に適当な検索語を入力し、フォームの下部にある「Execute Query」ボタンをクリック。
すると、JSON形式の検索結果がフォームの右側に表示されます。

![json.png](https://qiita-image-store.s3.amazonaws.com/0/85145/8a6a5c58-85eb-1e6e-b00a-a76d1d2b59b4.png)

以上が、Solrの起動と、付属のサンプル・データを使った登録と検索の手順です。
Amazon Linux上から、Google Driveに直接CSVファイル等を保存するために、Amazon LinuxにGoogle Driveをマウントする

Amazon LinuxでGoogle Driveをマウントできると、CSVを保存したり、すでに保存してあるHTMLを参照して、Emailが送れたりできて便利です。

[FUSE filesystem over Google Drive](https://github.com/astrada/google-drive-ocamlfuse)を使って、FUSEファイルシステムによりGoogle Driveをマウントしてみます。

# インストール手順

[Installation](https://github.com/astrada/google-drive-ocamlfuse/wiki/Installation)のInstalling with OPAM on AWS Linuxを参考にしてインストールします。

## パッケージのインストール

まず、リポジトリを足して、yumで各種必要なものをインストールします。

```
sudo wget http://download.opensuse.org/repositories/home:ocaml/CentOS_7/home:ocaml.repo -P /etc/yum.repos.d/

sudo yum install opam ocaml gcc gcc-c++ m4 make ocamldoc sqlite-devel libcurl-devel fuse fuse-devel zlib-devel ocaml-camlp4-devel ncurses-devel -y
```

## google-drive-ocamlfuseのインストール

次に、OCaml Package Managerの初期設定をして、その後、google-drive-ocamlfuseをインストールします。
何か聞かれたら、はい、と適切に答えてください。

```
opam init

opam install google-drive-ocamlfuse
```

## Google Cloud Console で OAuth2 の認証情報を取得

[Authorization](https://github.com/astrada/google-drive-ocamlfuse/wiki/Authorization)のAlternative authorization modeを参照しながら、Google Cloud ConsoleでOAuth2のClinet IDとClient Secretを取得します。

>You can create OAuth2 credentials from the Google APIs Console. Here you can find how to create a new application and here how to set up OAuth 2.0 credentials. When activating APIs, you must select the Drive API. When creating a new client ID, you must select "Installed applications" as Application type and "Other" as Installed application type (Redirect URI should be urn:ietf:wg:oauth:2.0:oob). Check that Drive API is among the Enabled APIs of your Developers Console.

Client IDとClient Secretを使って、認証を通しておきます。

## OAuth2の認証情報を使って、google-drive-ocamlfuseを設定する

Client IDを**xxx.apps.googleusercontent.com**、secretを**yyy**として、以下を実行します。
（パスが通ってないかもしれないので、一度ログアウトしてからログインするとかするといいです)

```
google-drive-ocamlfuse -headless -id xxx.apps.googleusercontent.com -secret yyy
```

すると、あるURLにアクセスしろといわれるので、Google Cloud Consoleでログインした状態のブラウザで、アクセスします。

![image](https://qiita-image-store.s3.amazonaws.com/0/30079/76964fe4-a8fb-15f7-3a00-7bad508a54f7.png)

許可するとTokenが表示されるので、Please enter the verification code: のあとに貼り付けて、エンターをおします。
Access token retrieved correctly.と出たら完了です。

## マウントするフォルダを作り、マウントする

```
mkdir ~/google-drive
google-drive-ocamlfuse /home/ec2-user/google-drive
```

lsやfindなどで中身をみてマウントできていれば完了です。
GCE(Google Compute Engine)を使ってみたい！〜index.htmlを探す編(ごめんなさい、改訂版)〜


[以前書いた記事](http://qiita.com/haradahirokikiki/items/473504c3fb9a8f5387af)でubuntuでnginxを入れた場合のindex.htmlの置き場所を探す旅に出かけました。
見つけたものはindex.htmlでしたが、このindex.htmlを変更してもトップページに変更がすいませんでした...

# なにが間違っていたか
index.htmlを見つけたことには間違いありません。が、このindex.htmlを編集しても、ページが変わりませんでした。ここのindex.htmlは、自分が探していた「ここをいじったらページが変わる場所」ではなかったです。
ここにルートを設定することで、このindex.htmlが使えるページになるようです。
とはいえ、上記Qiitaで書いた場所に「index.htmlがデフォルトである」と書いてあるものをよく見ました。場合によっては違うこともあるみたいです。

# 本当のindex.htmlを探す
## nginx設定ファイルで、ルートディレクトリを設定する `root` を見つける！
この記述を見つけられれば、どこのhtmlを変更すればページが変化するのかを特定できます。
nginxの設定ファイルは `/etc/nginx/nginx.conf` に配置されています。この中を見てみると、rootの情報は何も書かれていない！が、

```
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
```
こんな記述を発見。
 `/etc/nginx/conf.d` 以下の全ての.confファイルをincludeします、と、 `/etc/nginx/sites-enabled` 以下の全てをincludeしますという意味ですね。

* `/etc/nginx/conf.d/` 以下のファイルを見てみる → なんにもない！
* `/etc/nginx/sites-enabled` 以下を見てみる →  `defalt` というファイルを発見！中身を見てみます。

### /etc/nginx/sites-available/default を見てみる
 `root /var/www/html;` 
こんな記述が！完全にここにあるindex.htmlが探してたやつだ！！
ここのindex.htmlを変更したら、TOPも変更されました。
 
最初に変更していたindex.htmlへrootを向けるように変更しておきます。
 `root /usr/share/nginx/html;` 
に変更しました。
これで自分の好きなところにindex.htmlをおいて、HPを公開することができそうです！！

### 疑問
ローカルでhtmlを作成してから、それをどうやってCGE上に持ってくるのでしょうか？調べます！　

## 参考文献

* http://qiita.com/syou007/items/3e2d410bbe65a364b603