OmniAICreator/Qiita-1.07M huggingface dataset:
Go導入（＋AWS SDK for Go）メモ


備忘録です

## gvmを導入
[moovweb/gvm](https://github.com/moovweb/gvm) Go Version Manager

```bash
bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
```

Go1.5以上をインストールするには1.4が必要

```bash
gvm install go1.4
```

## gbを導入
[gb](https://getgb.io/) A project based build tool for the Go programming language

## AWS SDK for Go
[aws/aws-sdk-go](https://github.com/aws/aws-sdk-go)

gb-vendorを使ってパッケージをvendorディレクトリに保存

```bash
gb vendor fetch -tag v1.1.9 github.com/aws/aws-sdk-go
```

$HOME/.aws/credentialsにAWSへのアクセス情報を記述

```
[default]
aws_access_key_id = ACCESS_KEY
aws_secret_access_key = SECRET_KEY
```

プロファイル名を指定して使用する。credentials.NewSharedCredentialsの第1引数はcredentialsファイルのパス。指定しなければデフォルトパスを参照する。

```go
creds := credentials.NewSharedCredentials("", "default")
credValue, err := creds.Get()
if err != nil {
	fmt.Println(err)
	os.Exit(1)
}
```

## S3からバケット一覧を取得

```go
s3c := s3.New(session.New(&aws.Config{
	Region: aws.String("us-east-1"),
	Credentials: creds,
}))

var params *s3.ListBucketsInput
resp, err := s3c.ListBuckets(params)

if err != nil {
	fmt.Println(err.Error())
	return
}
fmt.Println(resp)
```
GitHub (including Enterprise) 初期設定方法


# 登録するアカウント

|項目|設定値|
|:--|:----|
|名前|nippon-taro|
|メールアドレス|nippon-taro@company.jp|

# 設定コマンド(Linux側で実施)
公開鍵と秘密鍵を作成

```command
git config --global user.name "nippon-taro"
git config --global user.email "nippon-taro@company.jp"

ssh-keygen -t rsa -b 4096 -C "nippon-taro@company.jp"
cat ~/.ssh/id_rsa.pub
```

以下2ファイルが作成される。説明は以下のとおり。

|ファイル|種別|説明|
|:-----|:---|:---|
|id_rsa.pub |公開鍵　|人に見せてもOK|
|id_rsa　| 秘密鍵 |人に見せちゃダメ絶対|


# GitHubへ公開鍵を登録
catで開いたファイルを貼り付ける

![スクリーンショット 2016-03-09 23.58.28.png](https://qiita-image-store.s3.amazonaws.com/0/75761/04d76669-b95e-c438-0b5d-9391b3d74c70.png "スクリーンショット 2016-03-09 23.58.28.png")

SSH keys -> New SSH key の順番にクリックする
![スクリーンショット 2016-03-10 00.06.12.png](https://qiita-image-store.s3.amazonaws.com/0/75761/5695577d-15b1-68dd-9f66-af0f8c89e88f.png "スクリーンショット 2016-03-10 00.06.12.png")

キーの入力画面が表示される。
Titleは自分が好きに名前をつける事ができる。
Keyにcatで開いたファイルを貼り付ける。
![スクリーンショット 2016-03-10 00.06.35.png](https://qiita-image-store.s3.amazonaws.com/0/75761/8052bd13-6101-83c2-62f2-d86f6e2f1c9b.png "スクリーンショット 2016-03-10 00.06.35.png")



#設定(Linux側で実施)
```command
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
ls -al ~/.ssh

#登録する設定がGitHubの場合(@以降はgithub.com)
ssh -l git -i ~/.ssh/id_rsa nippon-taro@github.com

#登録する設定がGitHub Enterpriseの場合(@以降はカンパニードメイン)
ssh -l git -i ~/.ssh/id_rsa nippon-taro@company.jp
```
html li リストマーク（・）消す方法

#HTMLにおけるli要素のリストマーク（・）を消す方法

cssにて

```css
ul {
  list-style: none;
}
```

※li要素に対しても有効

参考：[http://cafe.76bit.com/creative/web-design/2259/【css3】リストマーク（list）をあっという間に消す方/](http://technicalbook.jp/webdeveloper/%E3%80%90css3%E3%80%91%E3%83%AA%E3%82%B9%E3%83%88%E3%83%9E%E3%83%BC%E3%82%AF%EF%BC%88list%EF%BC%89%E3%82%92%E3%81%82%E3%81%A3%E3%81%A8%E3%81%84%E3%81%86%E9%96%93%E3%81%AB%E6%B6%88%E3%81%99%E6%96%B9/)
dhcpd initscript 覚書

``/etc/default/isc-dhcp-server`` のコメント行の和訳。

## isc-dhcp-server 起動ファイル

``/etc/init.d/isc-dhcp-server`` から読み込まれます。

dhcpd の設定ファイルのパスを指定します(既定値: ``/etc/dhcp/dhcpd.conf`` )

```bash
DHCPDv4_CONF = /etc/dhcp/dhcpd.conf
DHCPDv6_CONF = /etc/dhcp/dhcpd6.conf
```

dhcpd の PID ファイルのパスを指定します(既定値: ``/var/run/dhcpd.pid`` )

```bash
DHCPDv4_PID = /var/run/dhcpd.pid
DHCPDv6_PID = /var/run/dhcpd6.pid
```

dhcpd の起動オプションを指定します。
ここではオプション ``-cf`` や ``-pf`` を使用しないでください。
代わりに設定オプション ``DHCPD_CONF`` / ``DHCPD_PID`` を使用してください。

```bash
OPTIONS = ""
```

DHCP サーバー(dhcpd)が、どのインターフェース上で
DHCP 要求を処理するかを指定します。
複数のインタフェースを指定する場合はスペースで区切ります。

```bash
INTERFACESv4 = "eth0 eth1"
INTERFACESv6 = "eth0 eth1"
```
Go言語でhttpサーバー2


###HTMLファイルを外に出して表示

```main.go
package main

import (
	"log"
	"net/http"
	"path/filepath"
	"sync"
	"text/template"
)

type templateHandler struct {
	once     sync.Once
	filename string
	templ    *template.Template
}

func (t *templateHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	t.once.Do(func() {
		t.templ = template.Must(template.ParseFiles(filepath.Join("templates", t.filename)))
	})
	t.templ.Execute(w, r)
}

func main() {
	http.Handle("/", &templateHandler{filename: "chat.html"})
	if err := http.ListenAndServe(":8080", nil); err != nil {
		log.Fatal("ListenAndServe:", err)
	}
}
```

```templates/chat.html
<!DOCTYPE html>
<html>
<head>
  <title>Chat</title>
</head>
<body>
 Let's chat tempate
</body>
</html>
```

```Bash
go run main.go 
```
VS Code 0.10.10の新機能（変更点）

# はじめに
2016年3月初めにVS Code 0.10.10がリリースされます。[Build 2016](https://build.microsoft.com/) 前の最後のフルイテレーションで、多くの変更点があるようなのでまとめておきます（私が使っていない技術は省略しているのであしからず）。

## Salsa JavaScriptのデフォルト有効化

[以前の記事](http://qiita.com/YuichiNukiyama/items/9ccbee8e449c3e9023d9) で紹介した、Salsaが既定で有効化されました。セットアップが少々面倒だったので、便利になてよかったです。なお、0.10.10の段階では、TS1.8.2の機能を使って型の推測等を行っています。

## デフォルトLinterの提供中止

VS CodeのデフォルトLinterが廃止になりました。好きなLinterを使ってねということだと思います。Linterを使いたい方は、アドオンなりを使用して、自分で設定する必要があります。公式サイトに **esLint** の設定方法が掲載されていたので手順を載せておきます。

 1 esLintのグローバルインストール
 　1.1 `npm install -g esLint` を実行するだけです。 
 2 VS CodeにESLintエクステンションをインストール
　2.1 コマンドパレットを開く。
　2.2 `install ext` を入力
　2.3 ESLintを入力してインストール
 3 esLintを初期化
　3.1 `eslint --init`を実行
 4 設定ファイルの作成
　4.1 サンプルが上がっていました（[egamma/.eslintrc.json](https://gist.github.com/egamma/65c0e2a832393e3b625a)）。とりあえずこれから始めたら良いと思います。

## タブ⇔スペース変換

VS Codeにタブ⇔スペース変換の機能が追加されました。今まではエクステンションをインストールしないと使えなかったため、便利になりました（以前、[エクステンションを作成する方法の記事](http://qiita.com/YuichiNukiyama/items/3b928a67248fe5c9a5ba)の題材をタブ⇔スペース変換で書きましたが、このとき作ったものはもはや無用の長物ですね。。。）。

変換機能の使い方は至ってシンプルで、コマンドパレットに、**Change Indentation Size** / **Change Indentation To Spaces** / **Change Indentation To Tabs** のいずれかを入力するだけです。

## そのほか

### C#のサポート
C#のサポートが外されました。引き続き使いたい方はエクステンションを追加してください。

### Code Folding
ソースコードが折りたためるようになりました。ユーザーボイスで最も投票が多かったようです。地味ですがあると便利ですよね。

### 定義をサイドで開く
`Ctrl+K F12`で定義をサイドに開くことができます。個人的にはGo to DefinitionやPeek Definitionなど前からあったものを使うので、不要です。

### Working Fileのクイックオープン
現在開いているファイルをコマンドパレットに`~` + ファイル名で切り替えられるようになりました。`ctr + tab`で十分なのでは？と思いますが、とりあえず追加されています。

### エクステンションリコメンデーション
コマンドパレットに`ext recommend`と入力すると、使っているVS Codeに基づいておすすめのエクステンションを勧めてくれます。どういう原理なのか気になる。

### End of Line
設定に`files.eol`が追加されました。Windowsだと`\r\n`、Linuxだと`\n`がデフォルトです。Windows環境で作ったものをLinuxにもっていくときに使えるかもしれません。

## 参考
[0.10.10 (February 2016)](https://code.visualstudio.com/Updates)
Memcached, MongoDB, Redis, DynamoDB 簡易比較

# NoSQLの特徴
一般に”Not only SQL”と解釈される。SQLを否定するノーSQLの意味ではない。
固定されたスキーマに縛られない。
水平スケーラビリティが確保しやすい事が多いこと、トランザクションを利用できないものが多い。



# NoSQL比較表
単純比較している情報が見つからなかったため情報を集めて作成。
（そのため、謝りがあればご指摘いただければ幸いです）

|                  | Memcached                | MongoDB                      | Redis               | Amazon DynamoDB | 
|:-----------------|:-------------------------|:-----------------------------|:--------------------|:----------------| 
|データモデル      | Key Value                | ドキュメント指向             | Key Value           | Key Value       |
|種別              | 揮発性                   | 永続性                       | 揮発性&永続性 ※1    |永続性           |
|レプリケーション  | なし                     | 対応                         | 対応                |自動対応                |
|シャーディング    | なし                     | 対応                         | 対応                |自動対応                |
|マルチコア        | 対応                     | MongoDB 2系:非対応/3系:対応  | 非対応 ※1           |-                |


揮発性&永続性 ※1
ディスクに書き込み，永続化させる機能も持ち合わせている。

非対応 ※1 
1スレッドでループ処理を行うので、マルチコアのサーバの場合に全てのCPUリソースを使い切らない。

# 主な特徴

## Memcached
キャッシュストレージとしての用途からGETやSET等のシンプルな操作が可能。
LRU（Least Recently Used）順に古いデータを自動削除する。
ディスクI/Oは一切行わない。
データベースやOSの再起動でデータが消去される。

## MongoDB
32bitでは2.5GBの制限がある。
（もろもろ情報を追記予定）

## Redis
コマンドで削除するか，timeoutを設定しない限りは削除されない。（古いデータを自動削除されない。）
ノードを追加してデータを再配置し、スケールアウトすることができる

## Amazon DynamoDB
テーブル作成後のインデックスの変更が行えない。
トランザクションは無いが、代替で対応している人もいる。
http://www.slideshare.net/itoyusaku/dynamodb
Eclipseの日本語化

# プラグインダウンロード
Eclipseの日本語化プラグインのPleiadesを使います。
[Pleiadesのサイト](http://mergedoc.osdn.jp/index.html#/pleiades.html)からプラグインをダウンロードします。

サイトの「Pleiades プラグイン・ダウンロード」の「最新版」のリンクをクリックします。
pleiades.zipをダウンロードして展開します。

「features」フォルダ、「plugins」フォルダの2つあることを確認します。
![スクリーンショット 2016-03-09 23.11.25.png](https://qiita-image-store.s3.amazonaws.com/0/96493/f9f7c600-4837-185e-e1cd-4c60153eb7f1.png)

Finder > アプリケーション > Eclipse 右クリック「パッケージの内容を表示」 を開く
Contents > Eclipse を開き、ここでも「features」フォルダ、「plugins」フォルダの2つあることを確認します。
（/Applications/Eclipse.app/Contents/Eclipse です。）

![スクリーンショット 2016-03-09 23.20.35.png](https://qiita-image-store.s3.amazonaws.com/0/96493/e76f6705-74c1-6176-1bb9-ba06763b1101.png)

# プラグインの配置

ダウンロードした部分から必要なものをEclipse下にあるそれぞれのフォルダの中へ追加します。上書きはしないように気をつけて下さい。

ダウンロードしたpleiades.zipの「features」フォルダの中身をコピーし、Eclipse下にある「features」フォルダの中へ貼り付けます。

同じように
ダウンロードしたpleiades.zipの「plugins」フォルダの中身をコピーし、Eclipse下にある「plugins」フォルダの中へ貼り付けます。

# eclipse.iniの編集

/Applications/Eclipse.app/Contents/Eclipse/eclipse.ini
を開きます。
最下部に以下を追記します。

```
-Xverify:none
-javaagent:../Eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
```

アプリケーション再起動で完了です。

以上
dhcpd.conf 覚書

``/etc/dhcp/dhcpd.conf`` の日本語訳。

## dhcpd.conf

ISC dhcpd 用のサンプル設定ファイル

**注意:** ``/etc/ltsp/dhcpd.conf`` が存在する場合は、 ``/etc/dhcp/dhcpd.conf`` の代わりに ``/etc/ltsp/dhcpd.conf`` が設定ファイルとして使用されます。

全ネットワーク共通のオプションを定義します。

```bash
option domain-name "example.org";
option domain-name-servers ns1.example.org, ns2.example.org;

default-lease-time 600;
max-lease-time 7200;
```

``ddns-updates-style`` パラメータは、リース確認時に
サーバが DNS 更新を試行するかどうかを制御します。
既定の動作はバージョン 2 パッケージの動作です。

```bash
# 'none' - DHCP v2 からは DDNS をサポートしていません。
ddns-update-style none;
```

当該 DHCP サーバーがローカルネットワークの公式 DHCP サーバーである場合 
``authoritative`` ディレクティブのコメントを解除してください。

```bash
authoritative;
```

DHCP ログメッセージを別のログファイルに送信します。
(リダイレクトを完了するために ``syslog.conf`` を調整する必要があります。)

```bash
log-facility local7;
```

下記のサブネットではサービスは提供されません。
しかし下記の宣言は、 DHCP サーバーが
ネットワークトポロジを理解するために役立てられます。

```bash
subnet 10.152.187.0 netmask 255.255.255.0 {
}
```

下記は基本的なサブネット宣言です。

```bash
subnet 10.254.239.0 netmask 255.255.255.224 {
  range 10.254.239.10 10.254.239.20;
  option routers rtr-239-0-1.example.org, rtr-239-0-2.example.org;
}
```

下記の宣言により、 BOOTP クライアントは動的アドレスを取得できます。
しかし推奨しません。

```bash
subnet 10.254.239.32 netmask 255.255.255.224 {
  range dynamic-bootp 10.254.239.40 10.254.239.60;
  option broadcast-address 10.254.239.31;
  option routers rtr-239-32-1.example.org;
}
```

内部サブネットの設定が少し異なるネットワークです。

```bash
subnet 10.5.5.0 netmask 255.255.255.224 {
  range 10.5.5.26 10.5.5.30;
  option domain-name-servers ns1.internal.example.org;
  option domain-name "internal.example.org";
  option subnet-mask 255.255.255.224;
  option routers 10.5.5.1;
  option broadcast-address 10.5.5.31;
  default-lease-time 600;
  max-lease-time 7200;
}
```

特別な設定オプションを必要とするホストは、
``host`` ステートメントに列記することができます。
アドレスが指定されていない場合、(可能な場合に限り)アドレスは動的に割り当てられます。
しかしホスト固有の情報は依然として ``host`` 宣言から取得されます。

```bash
host passacaglia {
  hardware ethernet 0:0:c0:5d:bd:95;
  filename "vmunix.passacaglia";
  server-name "toccata.example.com";
}
```

ホストに固定 IP アドレスを指定することもできます。
固定 IP アドレスは動的なアドレス割当てが可能なアドレスの範囲に含めないでください。

固定 IP アドレスが指定されているホストは、 
BOOTP または DHCP を使用して起動することができます。
固定アドレスが指定されていないホストは、 DHCP でのみ起動することができます。
ただし、サブネット上に ``dynamic-bootp`` フラグを設定した 
BOOTP クライアントが接続されている場合を除きます。

```bash
host fantasia {
  hardware ethernet 08:00:07:26:c0:a5;
  fixed-address fantasia.example.com;
}
```

クライアントのクラス宣言に基づいてアドレスの割り当てを実行することができます。
下記の例では、特定のクラスに属するすべてのクライアントが ``10.17.224/24`` サブネット上のアドレスを取得し、
クラスに属さないクライアントは ``10.0.29/24`` サブネット上のアドレスを取得します。

```bash
class "foo" {
  match if substring (option vendor-class-identifier, 0, 4) = "SUNW";
}

shared-network 224-29 {
  subnet 10.17.224.0 netmask 255.255.255.0 {
    option routers rtr-224.example.org;
  }
  subnet 10.0.29.0 netmask 255.255.255.0 {
    option routers rtr-29.example.org;
  }
  pool {
    allow members of "foo";
    range 10.17.224.10 10.17.224.250;
  }
  pool {
    deny members of "foo";
    range 10.0.29.10 10.0.29.230;
  }
}
```
MacからUbuntuへリモートデスクトップ

MacにもUbuntuにも標準でリモートデスクトップの機能が付いているので設定

#Macから接続
finder → ⌘(command) + k → vnc://IPアドレス

これでアクセス可能

#Ubuntu側の設定
端末上で、```vino-preference```で設定可能
"このマシンへの接続を毎回確認する"は解除しないと、いちいちUbuntu側で承認しないといけなくなる

versionが違うって怒られる場合は、以下をUbuntu側の端末で入力

```
settings set org.gnome.Vino require-encryption false
```
Gradle で動的にタスクを定義する (環境ごとのビルド構成定義に便利！)


Gradle でタスクを定義するといえば

```build.gradle
task buildAll() {
    ...
}
```

という風に記載すると思いますが，動的に定義する方法です．基本的にリファレンスそのままですが，自分が触ってみてハマったところについても言及しつつ…

```ruby:build.gradle
["Foo", "Bar", "Buz"].each { name ->
    task "build$name" << {
        println "$name"
    }
}
```

これで `gradle tasks` をすると，以下のように出てきます．

![Screen Shot 2016-03-09 at 10.55.47 PM.png](https://qiita-image-store.s3.amazonaws.com/0/26613/afa7d103-376a-76bf-ea21-db3d3e68073e.png "Screen Shot 2016-03-09 at 10.55.47 PM.png")

実行したら，こんな感じになります．

![Screen Shot 2016-03-09 at 10.59.33 PM.png](https://qiita-image-store.s3.amazonaws.com/0/26613/15a4726e-fd71-721f-7daf-3df48eb6cfeb.png "Screen Shot 2016-03-09 at 10.59.33 PM.png")


上記の例では配列で Foo, Bar, Buz を宣言していましたが，設定ファイルなどで定義して，環境ごとの設定ファイルを見るディレクトリを指定する，といった使い方が出来そうです．

# 動的に定義したタスク間の依存
動的に定義したタスクの間で依存を定義することも出来ます．

```ruby:build.gradle
task common {
    println 'common'
}

["Foo", "Bar", "Buz"].each { name ->
    task "copy$name"(type: Copy) {
        from "src/$name/resources"
        into "build/src/$name/resources"
    }

    task "zip$name"(type: Zip, dependsOn: "copy$name") {
        from task["copy$name"]
        baseName "dist-$name"
        destinationDir file(buildDir)
    }

}
```

これを実行したら以下のようになります．
![Screen Shot 2016-03-09 at 11.10.49 PM.png](https://qiita-image-store.s3.amazonaws.com/0/26613/afe8376d-68b6-94fc-7077-cc4859bef4f0.png "Screen Shot 2016-03-09 at 11.10.49 PM.png")

現在はすべて UP-TO-DATE ですが… zipFoo は copyFoo に，zipBuz は copyBuz に依存していて，copy タスクは common に依存しています．

# タスク内容を実行フェーズで実行するとうまくいかないことがある．

見出しの通りですが，

```ruby:build.gradle
task "copy$name" << {
    copy {
        from somewhere
        into another
    }
}

task "zip$name"(type: Zip) {
    from tasks["copy$name"]
}
```

上記のように，copy$name のアウトプットが出来る場所が実行フェーズにならないとわからないような場合，zip$name が依存する copy$name は常に UP-TO-DATE になってしまいます．しかも，`outputs.upToDateWhen {false}` にしても効かない！ので気をつけてください．
Phalcon の volt に number_format を追加

はじめまして、ゆめみ城田です。
Qiita 初投稿になります。

今日は Phalconフレームワーク の標準テンプレート、
volt を採用した際、number_format関数 が無くて驚いた時の対処を書きます。

PHPの代表的なテンプレートエンジン Smarty や twig には
number_format関数 が標準で用意されています。

#### Smarty

```
# $money = 1000; であるとき

{$money|number_format} 円

# 出力結果
1,000 円
```

#### twig

```
{{ money|number_format }} 円

# 出力
1,000 円
```

しかし、
volt には number_format がありません。。

volt でもこのようなことができないか、
twig のように書いてみたのですがやはり動きませんでした。

しかし、
下記のようにDIコンテナに volt を入れる部分で
number_format関数 を指定すれば使えることがわかりました。

* bootstrap スクリプトなどで

```
$di = new \Phalcon\DI\FactoryDefault();

$di->set('view', function() {
    $view = new \Phalcon\Mvc\View();
    $view->setViewsDir($templatesPath);
    $view->registerEngines([
        ".volt" => function($view) {
            $volt = new \Phalcon\Mvc\View\Engine\Volt($view);
            $volt->setOptions([
                'compileAlways' => TEMPLATE_COMPILE_ALWAYS,
            ]);

            // 下記のようにPHP関数を追加します
            $volt->getCompiler()->addFunction('number_format','number_format');

            return $volt;
        }
    ]);

    return $view;
});
```

* volt 側

```
{{ number_format(money) }} 円
```

今回の number_format関数 に限らず、
柔軟に追加していけそうです。
CentOS7 yum-update後の再起動でkernel panic　intel_pstate=disabledの指定で解消

# 事象
古めのisoイメージからインストールしたVMware仮想マシンのCentOS7でyum updateでアップデートしたところ、kernelの更新も入ってしまったようで、再起動時にintel_pstate_cpu_initあたりの処理でkernel panicが発生して起動できない状態になってた。結構前から知られているものかもしれないけど、解消できたので一応メモ。

## 更新前後のバージョン
更新前：CentOS Linux (3.10.0-123.el7.x86_64)
更新後：CentOS Linux (3.10.0-327.10.1.el7.x86_64)

## 参照させて頂いたページ
http://deph.eek.jp/wp/archives/1128
ほぼ上記のページの事象と同様っぽい。
解決方法ではBIOSでの設定変更かGRUBに`intel_pstate=disable`を設定の2通り。
ただ仮想マシンのBIOSではIntel Dynamic Power Technologyとかの項目は見つからず…
とりあえず、GRUBの起動時の設定に`intel_pstate=disable`して起動を試してみると起動できたので、これで解消できた。

## GRUB2の設定変更
grubの設定変更についてはRedHatの次のページを参照しました。
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sec-Customizing_GRUB_2_Menu.html


### 起動時
GRUB 2 ブートメニューで「e」キーでカーネルパラメータの編集へ。
linux16 行の`intel_pstate=disable`最後に追加


### 毎回の起動のためのGRUBの設定変更
1. /etc/default/grubのGRUB_CMDLINE_LINUXへ「intel_pstate=disable」を追加

```lang:/etc/default/grub(変更前）
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/swap nomodeset crashkernel=auto  vconsole.keymap=us vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos/root rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
```

```lang:/etc/default/grub(変更後）
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/swap nomodeset crashkernel=auto  vconsole.keymap=us vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos/root rhgb quiet intel_pstate=disable"
GRUB_DISABLE_RECOVERY="true"
```

2. `grub2-mkconfig`コマンドで`grub.cfg`ファイルの再構築

```
# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-327.10.1.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-327.10.1.el7.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-123.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-123.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-4bef92630b694f3989e7bc51bf2fdf58
Found initrd image: /boot/initramfs-0-rescue-4bef92630b694f3989e7bc51bf2fdf58.img
done
```

GRUBの`grub.cfg`再構築後も一応再起動で無事起動できることを確認。

***
こんな感じですかねー
初投稿なので、書き方など不慣れなのでご指摘頂けると良いかもしれません。
次はVagrantやServerspecのことやりたいです。
openssl コマンドと csplit コマンドでサーバが返す証明書を分割する

次のようにします。

```sh
openssl s_client -connect example.com:443 -showcerts < /dev/null |
  csplit -k -f cert - '/^-----BEGIN CERTIFICATE-----/' '{*}'
```

`cert00` `cert01` `cert02` みたいなファイルがカレントディレクトリに保存されます。`cert00` はゴミで、それ以外が証明書です。

`cert01` や `cert02` の中身を見てみると `-----END CERTIFICATE-----` 以降にゴミがついているのですが・・`openssl` コマンドに食わす分には問題ありません。

```sh
openssl x509 -in cert01 -noout -subject
# subject= /CN=example.com

openssl x509 -in cert02 -noout -subject
# subject= /C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X1

openssl verify -verbose cert02
# cert02: OK

openssl verify -untrusted cert02 cert01
# cert01: OK

openssl verify -CAfile <(cat /etc/pki/tls/certs/ca-bundle.crt cert02) cert01
# cert01: OK

cat cert02 cert01 | openssl verify
# stdin: OK
```
Swift extensionを使う

extensionの使い方について記載

拡張したいクラス名をextensionで指定、
追加したい機能を定義します。
（以下の例では文字数の取得関数をlengthで定義しています。）

```swift:String+Util.swift
extension String {
    func length()->Int {
        return self.characters.count
    }
}
```

実行コード

```swift
let str:String = "0123"
let num:Int = str.length()
print(num) //4
```

以上
[Kotlin]ことりんという言語に触れてみる


# Kotlin(ことりん)とは

Kotlinとは、Javaをプラットフォームとしたプログラミング言語です。
（2016/2/15にkotlin 1.0がリリースされました）

ことりんファイル(.kt)は、javaファイル(.java)と同様に
コンパイルするとクラスファイル(.class)が作成されるため、[JavaVM](http://e-words.jp/w/JVM.html)上で動作できます。
つまり、ソースコードがKotlinであろうがJavaであろうが、
JavaVM側から見れば同等なので、どちらのコードを利用しても大丈夫だということです。

これまでのJavaのコードを書き換える必要がなく、一部Kotlinを採用することができます。

```kotlin
fun main(args: Array<String>) {
    println("Hello, world!")
}

```

## Kotlinの概要

> [Kotlin（コトリン）](https://kotlinlang.org/docs/reference/)はIntelliJ IDEAなどのIDE（Integrated Development Environment：統合開発環境）で有名なJetBrains社により開発が行われている、産業利用を目的としたプログラミング言語です。KotlinはJVM（Java Virtual Machine：Java仮想マシン）上で動作する、いわゆる「JVM言語」です[1]。そのためかどうか、同じJVM言語であるScalaやGroovyを強く意識した造りになっています。KotlinはJavaよりも簡潔で安全な記述を私たちプログラマに可能ならしめます。

> from:[プログラミング言語Kotlin 解説](https://sites.google.com/site/tarokotlin/chap1/sec11)


調べてみればわかると思いますが、ことりんちゃんはSwiftに非常によく似た言語仕様になっています。（愛着を込めてことりんちゃんと呼びます）


言語比較をしているQiitaの記事がこちらです。
 [SwiftでAndroidアプリを作る!!?](http://qiita.com/shoma2da/items/31edef012f224f99323c)
  [Android開発を受注したからKotlinをガッツリ使ってみたら最高だった](http://qiita.com/omochimetaru/items/98e015b0b694dd97f323)

上記で書かれているように、結構似てます。
Javaの経験があってSwiftしたい・・・って人は、ことりんちゃんから入ってみるとSwiftの学習にもとっつきやすいかもしれないです。

## Kotlinは簡潔な言語
> 他のモダンな言語が備えている機能、例えば型推論や関数リテラル、クロージャなどをKotlinも備えています。そのため、Javaで記述するとまだるっこしく冗長になりがちなコードがすっきりとし、生産性や可読性の向上につながります。

# ことりんちゃんに触れてみ
試しにことりんちゃんを愛でたい。。という人は公式がWebベースのIDEを提供してくれています。

-> [http://try.kotlinlang.org/](http://try.kotlinlang.org/)

まずは触れてみてはいかがでしょうか。
XCode で サブプロジェクト として追加したプロジェクトもメインプロジェクトの Podfile で管理したいのでやってみた

※とりあえず試しただけなので間違いがあるかも知れません。もし、間違いがあれば教えて頂けると嬉しいです。

## やりたいこと

- まず、メインのプロジェクト(メインプロジェクト)を作る
- 次に、メインプロジェクトに対して、サブのプロジェクトを追加する(サブプロジェクト)
- できれば、メインのプロジェクトは Empty Project にしたかった(ダメだった)
- そのうえで、メインのプロジェクトの xcworkspace から全部管理したい
- つまり、 Podfile を1つにまとめたい

## なんでこんなことがやりたいのか

- Git で全部一元管理したかった(リポジトリの節約と Issue をまとめたかった)
- Podfile が分散してほしくなかった(各サブプロジェクト及びメインプロジェクトで各々のPodfileを持ちたくなかった)
- サブプロジェクトのパスを AppCode で直接開くと Git 無いよ！的に言われるの回避したかった
- あとは、疲れてたので、なんとなく

## 出来たのか？

＼とりあえずは！／
ʕ•̫͡•ʕ•̫͡•ʔ•̫͡•ʔ•̫͡•ʕ•̫͡•ʔ•̫͡•ʔ.

が、メインプロジェクトを Empty にしておくことが出来なかった…

## 最終的な構成

- メインプロジェクトの名称を `xcodeprojtest` とした
- サブプロジェクト1つ目の名称を `firstApp` とした
- サブプロジェクト2つ目の名称を `secondApp` とした

```
├── Gemfile
├── Podfile
├── Pods/*.*
├── dummy/
├── firstApp/
│        ├ firstApp/*.*
│        └ firstApp.xcodeproj
├── secondApp/
│        ├ secondApp/*.*
│        └ secondApp.xcodeproj
├── xcodeprojtest.xcodeproj
└── xcodeprojtest.xcworkspace
```

## Podfile

最終的には以下の状態になった。

```
workspace 'xcodeprojtest.xcworkspace'

# target 'dummy' do
# end

target 'firstApp' do
        xcodeproj 'firstApp/firstApp.xcodeproj'
        pod 'EAIntroView', '~> 2.8.0'
end

target 'secondApp' do
        xcodeproj 'secondApp/secondApp.xcodeproj'
end
```

どうやら、 `xcodeproj` を target の中で指定すると読み込んで正しく target を見つけてくれるらしい。

`xcodeproj` を指定しない場合は、 `[!] Unable to find a target named firstApp` となりエラー。

## 簡単な手順

1. メインプロジェクト( `xcodeprojtest` )作る
2. メインプロジェクトを開いた状態で
3. サブプロジェクト( `firstApp` or `secondApp` )作る
4. 保存の際に `Add to: ` にて、 `xcodeprojtest` を指定する
5. Podfile を前述のように記載する
6. `pod install` で、後はいつもどおり

前述の `Podfile` の例のとおりなら、 firstApp では EAIntroView が使えるが、 secondApp 及び xcodeprojtest では使えない状態となる。

## 出来なかったこと

1. メインプロジェクトを Empty Project として準備
2. サブプロジェクトを準備
3. Podfile を前述に倣い準備
4. `pod install` すると、 `Unable to find a target named` となる

どうやら、メインプロジェクトに最低1つは target が存在しないとダメらしい。

Empty だったメインプロジェクトの Project Setting から Targets にてターゲットを追加したら `pod install` が通った。

逆に、 Targets を全て削除すると、サブプロジェクトの状態と Podfile の記載があっていても `pod install` は前述のエラーとなった。

## 最後に

リポジトリの節約なんか考えずに、1 Project, 1 Repository でも良いんじゃないかって気がする。

ウィンドウいっぱい開くことになるけど、まぁ XCode ならタブでなんとかなる(よね？)だろうし。

AppCode は、もうウィンドウいっぱいとか気にしないことに…

色々試してみたけど、もはやなぜこんな事を試してみたのかすら自分でも不思議になってきた。
gitbookを使ってみてわかったこと

# gitbook
[TRPGリプレイのテンプレート](https://www.gitbook.com/book/tsuyoshicho/trpgepubtemplate/details)なるものを作ってみました。

* その実装として[とあるCC-BY-NC-SAなライセンスのリプレイを移植してみました](https://www.gitbook.com/book/tsuyoshicho/whenscarleticemelted/details)

# 得られた知見
* gitbook.com自体で、エディット/CI/デプロイできること、閲覧統計とかあって、環境としてかなりの機能があると思う。(比較対象がないけど)
    * というか、なぜかUSやCanada、FranceからViewがある...
* Markdownは技術的なほぼプレーンなテキストにはいいけど、装飾とか表現力はちょっと厳しい
* Asciidocはデフォルトで多少は装飾的にいけるけど、なによりクラスをなんとかいけるのがいい
* gitbookとgithubの連携はかなり自動化されているけど、要素が(unixコマンド的に)個別の要素として独立しているので、後からのリカバリや変更ができた(ちょっとミスってたので)
* 作業スタートは、どちら向きでも可能たぶん
    * ローカル作成/gitリポジトリ化(`gitbook init`と`git init`)->github->gitbookでも
    * gitbook->githubへエクスポート(githubのインポーターへURLもって行ってくれる)でも
* gitbookのローカルは`gitbook serve`で随時監視してくれるので、draft作業がかなりはかどる
* ちゃんとブランチ管理すると、編集に便利というのがよくわかる。あとちょっとしたgitのエラーはどうやってリカバるか考えることで、gitの練習にも良い
 * とはいえ、個人的には製本したりするようなものだとアセットはそれなりに、とかブランチはそこまでしないよな、などもあるので小説とかはSVNでもいいとは思ってますが(分散VCSでないので、いざって時のことは若干アレだけど)。
* なので、Qiitaの投稿のシリーズとかあったらbookにするのもいいかも。
* 文章書きとして、エディタ(草稿)->Word他(スペルチェック、構造整理)->`pandoc input.docx/odt -t asciidoc output.adoc` -> gitbookとデータをもっていって、あとは推敲と編集、改訂という流れがよさそう
* プラグインが色々あり、凝ったものも作れそう(web向けのサービス連携系も多いが)
    * その中で図版を入れるに良いので、PlantUMLのプラグインを入れた
        * が、図中の日本語(ソース文書はUTF-8)が化けるので、プラグインにIssueを上げた
    * AutoCoverというのもあり、これはPDF(とEPUBも?)の表紙を生成する。
        * Windowsだとプラグインのコンパイルにpython2系が必要なのが依存関係にあるので、ちょっと手を出してない(masterだけ有効にした)
* 初期gitbookはPDFが鬼門だったぽいが、現在は綺麗なもの。またgitbook-pdfは不要になった。
* また、生成にcalibreのebook-convertを使うけど、Windowsでもchocolateyからのインストールだけでパス通って、(latexとかなしで)生成できるので便利
* CSSがモジュールにはしてあるけど、いろいろ厳しいのでSCSS化頑張ろう -> やりました
    * sass(scss)のテストは[SassMeister](http://www.sassmeister.com/)が便利でした。
    * 比較的構造が明確な書籍文書は、scssなんかの構造化cssと相性がよかったです。
Vagrant + CppUTestからC言語開発環境の構築


##前書き
最近はC言語は使ってませんでしたが使うことになりました。
もう、テスト無しでは開発なんてできない体だから作りました。

##前提
* chefのDKは入っている。
* OSはubuntu
* 自分が使用する限定的な条件で作成する。


##手順
とりあえず、cookbookを作ります。

```ruby:cmd
$ knife cookbook create CppUTest -o ./
```

そして、CppUTest/recipes/default.rb（ほぼエントリポイント）を開きます。

ここでやることは以下です。

1. CppUTestのコンパイルに必要なモジュールのインストール（automake、autoconf、libtool） 
1. CppUTestのリポジトリをcloneする
1. Makefileの自動生成
1. コンパイル
1. lib、includeの配備

想定外だった手順が以下

1. apt-getのアップデート 
1. g++のインストトール

g++は単なる忘れてただけだけど、apt-getはもう少しやりようがある気がする。
で、完成したdefault.rbが以下リンク先
[リンク](https://github.com/kaepa3/CppUTest_Recipe/blob/master/recipes/default.rb)

Vagrantfileにレシピを読み込むように追加して

```ruby:cmd
vagrant up --provision
```

で終わり。
Python + OpenCV で雑コラ動画を作成する①  顔認識

#0. はじめに
諸事情により動画の顔部分を別の顔に差し替える必要が出来たのですが、ググってもそれらしいソフトウェアが見つからないので、pythonの勉強がてら作成してみます。

ざっくりと方針としては
・動画内の顔を各フレームで認識する
・認識した顔の上に指定した画像を上書きする
ということをしたいと思います。

python3.5 + OpenCV3 を利用します。

#1. 環境構築
以下のサイトを参考にeclipse + Anacondaで環境を構築しました。
特に特筆すべきことはしてないのでこれだけで

eclipse + pydevインストール
[EclipseとPydevでpython開発環境を整えてみる](http://d.hatena.ne.jp/white_wheels/20100305/p3)

Anaconda + OpenCVインストール
[Python 環境のインストール](http://www.habe-lab.org/public_wiki/doku.php/python:install)

#2. 顔認識
まずははじめの一歩として単一の画像ファイルを読み込み、画像内の顔を認識し、矩形で囲んで出力します。
基本的には以下の記事を参考にPython3.5+OpenCV3用に書きなおしただけです。
[python+OpenCVで顔認識をやってみる](http://qiita.com/wwacky/items/98d8be2844fa1b778323)

流れとしては
・画像の読み込み
・顔認識のためにグレースケールに変換
・顔を認識
・認識した画像を矩形で囲む
・結果画像をファイル出力
という感じです。

認識対象はよく使われるという[Lennaの画像データ](https://ja.wikipedia.org/wiki/%E3%83%AC%E3%83%8A_(%E7%94%BB%E5%83%8F%E3%83%87%E3%83%BC%E3%82%BF))を用います。

```python:face_recognaize.py
#coding=utf-8

import cv2

# 認識対象ファイルの指定
image_path = "target/Lenna.png"
# 認識対象ファイルの読み込み
image = cv2.imread(image_path)

# グレースケールに変換
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 顔認識用特徴量のファイル指定
cascade_path = "haarcascades/haarcascade_frontalface_alt.xml"
# カスケード分類器の特徴量を取得する
cascade = cv2.CascadeClassifier(cascade_path)
# 顔認識の実行
facerecog = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1))

#　認識した顔を囲む矩形の色を指定。ここでは白。
color = (255, 255, 255) 

if len(facerecog) > 0:


    # 認識した顔全てを矩形で囲む
    for rect in facerecog:

        # 認識結果を表示
        print ("認識結果")
        print ("(x,y)=(" + str(rect[0]) + "," + str(rect[1])+ ")" + \
            "  高さ："+str(rect[2]) + \
            "  幅："+str(rect[3]))

        cv2.rectangle(image, tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]), color, thickness=2)

# 認識結果の出力
cv2.imwrite("result/Lenna_result.png", image)
 
```


#3. 結果
**コンソール出力**
認識結果
(x,y)=(215,201)  高さ：175  幅：175

**出力画像**
![Lenna_result.jpg](https://qiita-image-store.s3.amazonaws.com/0/3099/77e2ce8a-5837-f560-2c6b-b81c0f21388e.jpeg)



うまくいきました。
認識結果の座標は認識した部分の左上の角になるようです。

#4. 最後に
とりあえずPython3.5 + OpenCV3の動作確認と、顔の認識ができることを確認できました。
続きは次回に。
[Python + OpenCV で雑コラ動画を作成する② 静止画コラ作成](http://qiita.com/k_sui_14/items/bb9dc8395da85400e518)
JFoenix で Material design を JavaFX に適用する

# 背景
Material design はアプリだけでなく Web サイトでも使われていて、最近では大分見慣れてきた感があります。せっかくなのでデスクトップアプリでも Material design を取り入れてみたいところです。
今回は JFoenix という OSS を導入してみます。

## [Material design](https://www.google.com/design/spec/material-design/introduction.html) とは
Google が発表した新しいUIデザインのガイドラインで、Android OS 5.0 以降の標準 UI として採用されています。

----
# JFoenix とは
JavaFX アプリケーションの見た目を Material design に変更できる UI ライブラリです。

1. [公式サイト](http://jfoenix.com/)
2. [GitHub Repository](https://github.com/jfoenixadmin/JFoenix)

## 特徴
マイグレーションコストが低いです。
基本的な JavaFX の Control を継承して作られているので、FXML ファイルを書き換えれば導入することができます。

## ライセンス
元々 LGPL だったのが、最近 Apache version 2 に変更されました。企業でも使いやすくなっています。

## Control クラス
標準の Control クラスに 「JFX」 の prefix がついた形で命名されています。
(ex) Button → JFXButton

テキストエディタで置換する場合は defaultButton 等のプロパティを書き換えないよう注意してください。

[現在用意されている Control (GitHub Repository)](https://github.com/jfoenixadmin/JFoenix/tree/master/src/com/jfoenix/controls)

----
# 導入
## ライブラリをダウンロード
http://www.jfoenix.com/download/jfoenix.jar

## プロジェクトのライブラリフォルダに配置
今回は libs 以下に置きます。

## build.gradle の dependencies に下記を追加

    compile fileTree(dir: 'libs', include: '*.jar')

## FXML に下記の import を追加

    <?import com.jfoenix.controls.*?>

## FXML の Control クラスを対応する JFoenix のクラスに置換
ほとんどのクラスは頭に JFX を付けるだけで置き換え可能です。

----
# デモ
試しに下記の JavaFX アプリケーションに JFoenix を導入してみました。

## 導入前
いかにもなデスクトップアプリの見た目です。
![導入前](https://qiita-image-store.s3.amazonaws.com/0/102004/cc7fe57f-641d-37af-1fe0-31526aa09e5c.png)

## 導入後
このような感じで、やや平面的な見た目になりました。
![導入後スクリーンショット1](https://qiita-image-store.s3.amazonaws.com/0/102004/45d1e85f-4c64-1262-3593-a22246f6a7c3.png)

TextField にフォーカスが当たると下線が太くなります。
![導入後スクリーンショット2](https://qiita-image-store.s3.amazonaws.com/0/102004/dda87bb5-ecc1-501e-8bcf-e8beba36a29b.png)

Button をクリックすると、ちゃんと Ripple 効果が出ます。
![導入後スクリーンショット3](https://qiita-image-store.s3.amazonaws.com/0/102004/b73360cc-a20b-2974-b6ee-aadbbf105027.png)

## 変更差分
前述の通り、 build.gradle と FXML ファイルの修正だけで適用できました。

1. [変更差分全体](https://github.com/toastkidjp/search_app_widget/commit/500920d5ede6e2129be97ad9f8c7f234052df563?w=1)
2. [元のコードリポジトリ](https://github.com/toastkidjp/search_app_widget) 


----
# 備考
Toolbar や Toggle 、Snackbar等の、標準では用意されていない Control も揃っています。

----
# 2016/09/03 追記
OpenJDK9のEarly Access版を入れてみたところ、下記のエラーが発生しました。

```
java.lang.NoClassDefFoundError: com/sun/javafx/css/converters/PaintConverter
        at com.jfoenix.controls.JFXTextField$StyleableProperties.<clinit>(JFXTextField.java:212)
        at com.jfoenix.controls.JFXTextField.<init>(JFXTextField.java:163)
```

同名のクラスは、 JavaFX9 だと ```javafx.css.converter.PaintConverter``` にあるようです。
http://download.java.net/java/jdk9/jfxdocs/index.html

ちょっとこれはどうしようもないので、対応を待つかプルリクエストを送るしかなさそうです。
Raspbianで/etc/modprobe.d/alsa-base.confがないとき

Raspberry PiとjuliusやらmecabやらでBDレコーダーとTVを声で操作できるリモコンを作ろうとした際に詰まったので書いておきます。

詰まったのは、RaspberryPiに接続したUSBマイクの優先度を上げようとした時です。

参考にさせていただいた[ページ](http://qiita.com/t_oginogin/items/f0ba9d2eb622c05558f4)には


>USB入力を優先させるため、/etc/modprobe.d/alsa-base.confを書き換えます。
>/etc/modprobe.d/alsa-base.conf
>:
>\# Keep snd-usb-audio from beeing loaded as first soundcard
>options snd-usb-audio index=-2
>: 
>となっているところを
>/etc/modprobe.d/alsa-base.conf
>: 
>\# Keep snd-usb-audio from beeing loaded as first soundcard
>\#options snd-usb-audio index=-2
>options snd-usb-audio index=0
>: 
>に変更します。

とありますが、alsa-base.confがみつからない...

私の環境では/etc/modprobe.d/直下には
```ipv6.conf        raspi-blacklist.conf    fbdev-blacklist.conf  libpisock9.conf```
の4ファイルのみでした。
alsa-base.confを新規作成してそれっぽくしてみたらシステムからマイクが見えなくなる始末...

解決法としてこちらの[ページ](http://ezzep.blogspot.jp/2012/12/raspberry-pijulius.html)を参考に環境変数をいじりました。

```
$arecord -l
**** ハードウェアデバイス CAPTURE のリスト ****
カード 1: Device [USB PnP Sound Device], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
```
で表示されるカードとデバイスの番号(ここではカードが1、デバイスが0)を使って環境変数ALSADEVを設定します。

```
export ALSADEV="plughw:1,0"
```

export ALSADEV="plughw:(カード番号),(デバイス番号)"で設定できます。
これで任意のデバイスの優先度を上げることが出来ました。
CentOSのSSHポートを変更する


##手順

1. `/etc/ssh/sshd_config`でポート番号の変更
2. `/etc/sysconfig/iptables`で開けるポートの追加
3. 各サービスリスタート

この流れになります


## `/etc/ssh/sshd_config`でポート番号の変更


さっそく編集していきます

この`Port`という文字の後ろに追加したいポート番号を記述します

※まずは22番ポートを閉じずに30000番を有効にします、完璧にログイン出来るのを確認しないとミスって入れなくなるのは痛いので…

```p:/etc/ssh/sshd_config
# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options change a
# default value.
Port 22        #もともとのポート番号
Port 30000     #追加したポート番号
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
```


##`/etc/sysconfig/iptables`で開けるポートの追加

sshd_configだけではなくiptablesの設定も変更します
CentOS6の初期設定はこんな感じになっていると思います

```php:/etc/sysconfig/iptables
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

COMMIT
```

ここに新たに設定したSSHのポートを追加します

こんな感じ

```php:/etc/sysconfig/iptables
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 30000 -j ACCEPT

COMMIT
```

1行追加しました


##各サービスリスタート

設定を反映します

```
sudo service iptables restart
sudo service sshd restart
```


これでssh接続が30000番ポートで行えるようになったのではないでしょうか

30000ってのはテキトーなので各自他人にわかりづらい番号に変えてください
以上です
Socket.ioを使ってサーバからクライアントに動画再生を制御する

#Socket.io
ネットワークで繋がった複数のタブレット(client)に対してPC(server)から動画再生の命令を出すテストをしてみた。
githubのexample/chatを参考にすると分かりやすい。[chat app](https://github.com/socketio/socket.io/tree/master/examples/chat)

##structure
画像添付。無駄なファイルがあるけど気にしない。
<img width="1156" alt="Screen Shot 2016-03-09 at 22.09.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/53282/de1457cc-ed0d-5d54-53bb-8fd7d02e3ad6.png">

##run app
ターミナルでchatディレクトリに移動後、下記コマンドとたたく。
```
node server.js
```

##code
###html
```html:index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <h1>frontapp/index.html</h1>
  <!-- put video for prototype -->
  <video id="video-player" width="640" height="480" controls>
    <source src="assets/test_movie.mp4" type="video/mp4">
  </video>
  <button id="client-trigger">push push here</button>

  <!-- need to import socketio.js -->
  <!-- also need to import main.js for front dev -->
  <script src="/socket.io/socket.io.js"></script>
  <script src="/frontapp.js"></script>
</body>
</html>
```

###js
```js:frontapp.js
(function(){

  var socket = io();
  setEventListener();

  // store video dom element in application
  var video = document.getElementById('video-player');
  // damn easy method to start play movie
  function playMovie(targetMovie) {
    targetMovie.play();
  }

  // set event listener
  function setEventListener() {
    document.getElementById('client-trigger').addEventListener("click", function(){
      video.play();
      console.log('hi there from client trigger');
    });
  }

  // listen socket
  socket.on('player trigger', function(data){
    //playMovie(video);
    video.play();
    console.log('hi there from server');
  });

})();
```

```js:server.js
// Setup basic express server
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('../..')(server);
var port = process.env.PORT || 7000;

server.listen(port, function(){
  console.log('Server listening at port %d', port);
});

// Routing
app.use(express.static(__dirname + '/myapp'));

// connection established..
io.on('connection', function(socket) {
  var socketself = socket;
    setInterval(function() {
      console.log('7000 from server.js');
      // and send trigger
      socketself.broadcast.emit('player trigger', {
        trigger: 'triggervaluemaybe'
      });
    }, 5000);
});
```

##problems
クライアント側で動画読み込みエラーが起きるとアプリが動かない。
読み込み出来てからサーバにemitさせるとすると、クライアント側もサーバにメッセージを送る必要があるかもしれない。

##next
タブレットの再生する動画を次々に変えたい場合は、
1. サーバからクライアント端末に動画を転送する
2. クライアント端末がxhrを使ってバイナリデータを取得する
上記二つがぱっと思いつく。

再生トリガーを送る前の準備でまだいくつか調べないといけなそう。
VMware製品へのDROWN脆弱性の影響情報

## 概要

VMware社からナレッジ「[VMware KB: VMware response to OpenSSL security issue CVE-2016-0800, aka DROWN (2144474)](https://kb.vmware.com/kb/2144474)」が発行されており、VMware製品はこの脆弱性の影響受けないとされている。

## 詳細

VMware製品への影響や対策は、[ナレッジベース](http://kb.vmware.com/)および[セキュリティアドバイザリ](https://www.vmware.com/security/advisories/)で確認する。以下に確認できた範囲で情報をまとめる。

### 背景

2016年3月1日に、National Vulnerbility Databaseに[CVE-2016-0800](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-0800)が登録されている。
JVNにも「[JVNVU#90617353: SSLv2 の暗号通信を解読可能な脆弱性 (DROWN 攻撃)](http://jvn.jp/vu/JVNVU90617353/)」として掲載されている。

### VMware社からの発信情報

DROWN脆弱性のVMware製品への影響については、VMware社からナレッジが発行されている。

* [VMware KB: VMware response to OpenSSL security issue CVE-2016-0800, aka DROWN (2144474)](https://kb.vmware.com/kb/2144474)

これによれば、この脆弱性はSSLv2を使用する製品に影響する。しかし...

> VMware products do not use SSLv2 and they are not affected by CVE-2016-0800.

...VMware製品はSSLv2を使用せず、したがって影響を受けない。


### 関連ナレッジの和訳

現在のところ、関連ナレッジの和訳はない。

## 参照

本脆弱性の内容。

* [NVD - Vulnerability Summary for CVE-2016-0800](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-0800)
* [JVNVU#90617353: SSLv2 の暗号通信を解読可能な脆弱性 (DROWN 攻撃)](http://jvn.jp/vu/JVNVU90617353/)

VMware社からの発信情報。

* [VMware KB: VMware response to OpenSSL security issue CVE-2016-0800, aka DROWN (2144474)](https://kb.vmware.com/kb/2144474)

VMware社のナレッジやセキュリティアドバイスは、随時更新されるので、適宜、原文を確認されたい。

----

本ページ内容は筆者が参照の便のためにある持点でまとめた個人的なメモです。内容を保証するものではなく、また筆者の所属組織等とは一切かかわりがありません。
空前絶後のgit merge！gitにサンシャイン池崎を降臨させる

普段は
------------


````
$ git merge upstream/master
Already up-to-date.
$
````

No YEAH.

ローカルブランチを指定すると…
------------

```
$ git merge upstream/master master
Already up-to-date. Yeeah!
$
```


**YEEEEEEEEEEEEEEEEEEEEEEEAH!!!!!!!!!!!!!!!!!!!!!!**
初心者python(v3.5.1)環境構築編(Mac)

Macには既にpython2.7.10がデフォルトでインストールされていますが、python3系統や実行環境を整理したいのでpyenv-virtualenvを選択しました。

今回はpythonの勉強なので開発環境を詳しく説明しません。後々説明します。

#実行環境
OS X El capitan v10.11.3
Home-brew導入済み

#目標

- pythonの文法の理解
- いろんなモジュールを使う
- 数学の基本(微分積分学、線型代数学)をpythonを使って勉強
- 応用(統計、機械学習、自然言語処理など)の勉強

#そもそもPythonってなに？
プログラミング言語の一つで、いろんな環境(linux,windows,os xなど)で使用することができます。
pythonのコードは見やすく、文法もわかりやすいです。
自然言語処理や機械学習など情報科学を勉強するのに特化しています。(Rubyでもできますが)
特に理系の学生さんにオススメの言語です。

注意：pythonにはバージョン２系統と３系統があります。２系統で実行できても３系統では実行できないなどありますので注意してください。

#環境構築

はじめに`brew update`をする

```
$ brew update
```

ターミナルを起動し以下のコマンドを実行する

```
$ brew install pyenv-virtualenv
```

pyenv-virtualenvを使うのに必要なpyenvなども自動的にインストールしてくれる。

そのあと~/.bash_profileを編集します。
`$ vim ~/.bash_profile`
以下の内容を追加します。(既に何か書かれている場合は、消さずに追加してください)

```vim:~/.bash_profile
export PYENV_ROOT=/usr/local/var/pyenv↲
if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi↲
if which pyenv-virtualenv-init > /dev/null; then eval "$(pyenv virtualenv-init -)"; fi↲
```

ここに書いてある内容は`brew install pyenv-virtualenv`をインストールしている時に表示されています。

内容を反映させます。

```
$ source ~/.bash_profile
```

次に、今回勉強するpython(v3.5.1)をインストールします。

```
$ pyenv install 3.5.11
```

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

```
$ pyenv versions
```

3.5.1が表示されていれば大丈夫です。
バージョンの左に`*`が表示されているのは現在使用しているものです。

今回勉強する環境を構築します。

```
$ pyenv virtualenv 3.5.11 samplepy3.5.1
```

構築できているか確認します。

```
$ pyenv versions
```

samplepy3.5.11が表示されていれば大丈夫です。

今回作業するディレクトリを作成します。

```
$ mkdir -p ~/work/samplepy3.5.11
$ cd ~/work/samplepy.3.5.11
$ pyenv local samplepy3.5.11
```

すると

``
(samplepy3.5.11)$
``

と表示されます。

ここで現在のpythonのバージョンを確認します。

```
(samplepy3.5.11)$python --version
python 3.5.11
```

と表示されていれば完了です。

このディレクトリで作業するときは(v3.5.11)に自動で切り替わります。

ちなみにホームディレクトリに戻って`python --verison`をしてみると(v2.7.10)になっていることがわかります。

今後このディレクトリでpythonの勉強をしていきます。
dockerを試す: PythonのWebアプリのコンテナイメージを自作

dockerで自作のPython Webアプリを動かすまでの流れ
※事前にdocker環境を準備する前提

dockerイメージは全てdockerfileで記述する方が理想的だが、手動でセッティングしたイメージで作成してみる。


##1) ベースとなるイメージをpullして起動

`docker run -t -i centos /bin/bash`

-i -tオプションと/bin/bashは、標準入力で起動したコンテナへログインするため。
centosをベースにする。

このコマンドでcentosコンテナに入れる
※exitで出ると、コンテナが停止してしまう。

コンテナ内でpython -Vコマンドでpythonがすでにインストールされている事を確認。


##2) サンプルWebアプリを作成

コンテナ内の任意の場所でサンプルWebアプリを作成

```
vi sampleweb.py
```

```
import SimpleHTTPServer
SimpleHTTPServer.test()
```

##3) 編集したコンテナイメージを保存（commit）

起動中のコンテナをdocker commitコマンドで、docker imageとして出力できる。


```
docker commit [編集したコンテナID] [保存するコンテナ名]
```

例）

```
docker commit aeijdire845 simpleweb
```

##4) コンテナを起動時にWebアプリを起動する

ここでハマった。
linuxであればrc.localにコマンドを記述すれば、起動時に意図するコマンドを実行してくれるかと思いきや、コンテナでは反映されない模様。
dockerfileのENTRYPOINT（またはCMD）で記載が必要。
ここまできてdockerfileでやり直しかと思ったが、3までで作成したイメージをベースにENTRYPOINTだけ追加すればよい。

例）

```
from simpleweb

ENTRYPOINT python /home/hoge/simpleweb.py
```

※ENTRYPOINTの後に実行したいコマンドを記載。

引き続き作成したdockerfileをもとにdocker buildでイメージ作成

```
docker build -t [イメージ名]:[タグ名] [Dockerfileのあるディレクトリパス]
```

例）

```
docker build -t simpleweb2:latest ./
```

##5) ポートフォワード設定してコンテナを起動する

Webアプリなので外部からコンテナ内のWebアプリへアクセスできるようオプション設定して起動する必要がある。

```
docker run -p 80:8000 simpleweb2
```

-pオプションで、[外部ポート]:[コンテナ内ポート]でポートフォワードを指定する。
例では外部から80でアクセスすると、コンテナ内の8000に接続される。
2で作成したWebアプリは8000で待ち受けるのでこのように設定。


##6) 接続確認

ローカルからであれば http://localhost/、外部IPがあればそのIPに指定してアクセスすると、Directory listingが応答される。
Nexus7(2012)にKali Linuxをインストールする

# Nexus7(2012)にKali Linuxをインストールする

まず、Kali-v1.2.1-sfx.exeでのインストールはサポートされなくなっていました。

以下の方法で、マルチブートさせる手順が主流の様子。やってみる。
root化するので、Nexus7のOSのバージョンは4系がいいかも。5系だとが面倒。

flashbootが使えるようになっていれば[OSの入れ替え](http://yosshi.snowdrop.asia/2015/05/23/nexus7-2012%E3%82%924-4-4%E3%81%AB%E3%82%82%E3%81%A9%E3%81%99%EF%BC%81/)は簡単にできます。

## 対象と説明
- 対象＝Nexus 7 2012 Wifi Tablet

> (PC)...パソコン(Windowsを想定root化ツールが・・・)
> (PC→TB)...パソコンで操作。タブレット(Nexus7)にアクション
> (TB)...タブレット(Nexus7)で操作

## 手順
1. (PC)adbを使えるようにしておく
1. (PC)flashbootを使えるようにしておく
1. (PC→TB) [bootloaderをunlockにする](http://yosshi.snowdrop.asia/2015/05/23/nexus72012%E3%81%AEbootloader%E3%82%92unlock%E3%81%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)
1. (PC→TB) [Nexus 7 2012 LollipopのZIP(nethunter-grouper-lollipop-3.0.zip)](https://www.offensive-security.com/kali-linux-nethunter-download/)をダウンロードしてNexus7に置いとく
1. (PC→TB) [cm-12.1-20160110-NIGHTLY-grouper.zip](https://download.cyanogenmod.org/?device=grouper)をダウンロードしてNexus7に置いとく
1. (PC→TB) [Root]化する.... http://www.wugfresh.com/nrt/ ツールはWindowsで動作させる。
1. (TB) Google PlayStoreでMultiRomをインストール
1. (TB) MultiRomで必要なファイルをセットアップ。起動時にRoot化許可しますか？の窓が閉まるのが早いので注意
1. (TB) 再起動しMultiRomが起動するのでAbout BootでCancelする。放置するとすぐにAndroidが起動するので注意
1. (TB) MultiRomが起動したらMISCを選択
1. (TB) REBOOTTO RECOVERYを選択してTWRPを起動する
1. (TB) TWRPが起動したらAdvanceを選択
1. (TB) MultiROMを選択
1. (TB) Add ROMを選択
1. (TB) Nextを選択
1. (TB) ZIP fileを選択
1. (TB) cm-12.1-20160110-NIGHTLY-grouper.zip を選択
1. (TB) インストールが終わったら右下の戻るボタンで一つ画面を戻る
1. (TB) List ROMsを選択
1. (TB) cm-12.1-20160110-NIGHTLY-grouper.zipを選択
1. (TB) Flash ZIPを選択
1. (TB) nethunter-grouper-lollipop-3.0.zipを選択
1. (TB) 色々聞いてくる。とりあえず、全部チェックしてインストール。90%辺りで止まったように時間がかかるが我慢
1. (TB) 成功おめでとうメッセージが出たらreboot


## 理解用のメモ
- FastBootモードからよばれるSTARTのブートローダにmultiRomを入れてOSを選択できるようにする。
- RecoveryModeからよばれるリカバリ用のOSにTWRPをインストールする。
- TWRPで、マルチブートさせる別のOSをインストールさせることができる。
- bootイメージ(add boot)にCyanogenmodを使って、中身(flash image)をkali linux nethunterにする
Nested ESXi上でのvSphere FTの設定

# 概要

[Nested ESXi](http://qiita.com/tsukamoto/items/ee448e0f13e4ae4a534d)上でvSphere FTを利用するには、対象仮想マシンに追加の詳細設定が必要になる。

# 詳細

[Nested ESXi](http://qiita.com/tsukamoto/items/ee448e0f13e4ae4a534d)上でvSphere FTを利用するには、対象仮想マシンに追加の詳細設定が必要になる。

    replay.supported = "true"
    replay.allowFT = "true"
    replay.allowBTOnly = "true"

詳細設定は「仮想マシンの設定の変更＞VMオプション＞詳細＞パラメータの構成」から行う。

# 参照

* [How to Enable Nested vFT (virtual Fault Tolerance) in vSphere 5 | virtuallyGhetto](http://www.virtuallyghetto.com/2011/07/how-to-enable-nested-vft-virtual-fault.html)
* [Enable VMware Fault Tolerance in nested environments | vcloudnine.de](https://www.vcloudnine.de/enable-vmware-fault-tolerance-in-nested-environments/)
Windows環境でのMySQL日本語文字化け対処法

## 概要  
MySQLの学習を始めたが、いきなり日本語が文字化けして躓いた。
早速、インターネットで調べて検索上位の対処法を試したがうまく行かず、心が折れかけていたところで解決できた。  

## 環境  
Windows8  
MySQL5.6.20(XAMPP)  

## 対処法  
`my.ini`ファイルを探す。
自分の場合はここにあった。`C:\xampp\mysql\bin`  
`my.ini`ファイルを適当なエディタで開いて[mysqld]、[mysql]の末尾を以下のようにする。

```my.ini
[mysqld]
...
character-set-server=utf8
[mysql]
...
default-character-set=cp932
```

どうやら検索上位に表示されたのはMacOS、LINUX向けの対処法でWindowsではコマンドプロンプトの文字コードがcp932なのでこれに合わせる必要があった。

## 参考  
[https://teratail.com/questions/26559](https://teratail.com/questions/26559)
SwiftでUIActivityIndicatorViewを使う


使い方はとてもシンプル。
定義もこれだけ。

```
import Foundation
import UIKit

//
//  UIActivityIndicatorView.h
//  UIKit
//
//  Copyright (c) 2005-2015 Apple Inc. All rights reserved.
//

public enum UIActivityIndicatorViewStyle : Int {
    
    case WhiteLarge
    case White
    case Gray
}

@available(iOS 2.0, *)
public class UIActivityIndicatorView : UIView, NSCoding {
    
    public init(activityIndicatorStyle style: UIActivityIndicatorViewStyle) // sizes the view according to the style
    public init(frame: CGRect)
    public init(coder: NSCoder)
    
    public var activityIndicatorViewStyle: UIActivityIndicatorViewStyle // default is UIActivityIndicatorViewStyleWhite
    public var hidesWhenStopped: Bool // default is YES. calls -setHidden when animating gets set to NO
    
    @available(iOS 5.0, *)
    public var color: UIColor?
    
    public func startAnimating()
    public func stopAnimating()
    public func isAnimating() -> Bool
}
```

## コードで使う場合
生成して破棄まで1つのメソッド内で行う場合、プロパティに持ちたくないと思うのでこんな風に使う。デフォルトで `hidesWhenStopped = true` となっているので `stopAnimating()`を呼ぶだけで隠れる。

```
// 生成
let indicator = UIActivityIndicatorView(activityIndicatorStyle: .Gray)
indicator.center = CGPointMake(view.bounds.midX, view.bounds.midY)
// または UIActivityIndicatorView(frame: CGRectMake)の後、Styleを設定
view.addSubview(indicator)

// スタート
indicator.startAnimating()
refresh(completionHandler: {
	// ストップ
	indicator.stopAnimating()
	indicator.removeFromSuperview();
})
```

## xibで使う場合
上記と同じ要領でxibで使うとアニメーション後もUIActivityIndicatorViewが残る。
xibで生成する場合とコードで生成する場合とでhidesWhenStoppedのデフォルト値が変わることが原因。Hides When Stoppedにチェックを入れて使いましょう。
![Screen Shot 2016-03-09 at 9.24.07 PM.png](https://qiita-image-store.s3.amazonaws.com/0/29186/1985176f-0bdf-530b-c59d-d0d23a440c66.png "Screen Shot 2016-03-09 at 9.24.07 PM.png")

xibで生成する場合は `@IBOutlet` で接続しているのでプロパティとしてクラス内のどこからでも操作可能となる。
powershellでエクセルのシートを削除する

解説しているところが見つからなかったのでメモ

```
# Excelオブジェクト作成
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$excel.DisplayAlerts = $false

# エクセルを開く
$book = $excel.Workbooks.Open("C:\work\work1.xls")

#hogeシートを削除
$excel.worksheets.item("hoge").delete()

# 上書き保存
$book.Save()

# 閉じる
$excel.Quit()

# プロセスを解放する
$excel = $null
[GC]::Collect()
```
[ROS]複数のlaunchを同時に実行する

## はじめに
ROSにはlaunchというしくみがあり，複数のノードをまとめて実行することができます．変数もそこで設定できたりします．とっても便利です．
システムが大きくなるにつれて，起動すべきlaunchファイルも増えていきますが，includeタグを使えば，複数のlaunchを１つのlaunchにまとめることもできます．
しかし，これでは１つのターミナル上に全てのノードが展開されてしまいます．ROS_INFOなどが見難くなったり，(検証したわけではありませんが)挙動が遅くなったりしそうです．

なので，ひと手間かかるのですが，なんとか１コマンドで複数のlaunchを実行する方法を見つけました．


## シチュエーション
ROSのプロジェクトってこんな感じになると思います．
ここで，a.launch, b.launch, c.launchを同時に複数のターミナルで実行することを考えます．
commonはROSのパッケージである必要はありません．

```
catkin_ws
├── build
├── devel
└── src
    ├── common
    │   ├── bashes
    │   │   ├── a.launch.bash
    │   │   ├── b.launch.bash
    │   │   └── c.launch.bash
    │   └── executions
    │       └── exe.bash
    ├── pkg_a
    │   ├── CMakeLists.txt
    │   ├── launch
    │   │   └── a.launch
    │   ├── package.xml
    │   └── src
    │       └── いろいろプログラムある
    ├── pkg_b
    │   ├── CMakeLists.txt
    │   ├── launch
    │   │   └── b.launch
    │   ├── package.xml
    │   └── src
    │       └── いろいろプログラムある
    └── pkg_c
        ├── CMakeLists.txt
        ├── launch
        │   └── c.launch
        ├── package.xml
        └── src
    　       └── いろいろプログラムある
```

## やりかた

### 1. ターミナルプロファイルの設定

ターミナルの編集→プロファイルから新規を作成します．
プロファイル名をなんか適当に決めます(ここでは，roslaunchとします)．
デフォルトと違うところは，「タイトルとコマンド」タブで設定する「コマンドの実行が完了した時」を「端末を終了する」から「端末を開いたままにする」とします．
背景とか色はご自由にどうぞ．


### 2. x.launch.bashの作成

ちょっと遠回りなのですが，分けて実行したいlaunchファイルを実行するbashを作成します．
つまりここでは，common/bashesに

```bash:a.launch.bash
#!/bin/bash
roslaunch pkg_a a.launch
```
を作ります．
もちろんただのbashなので，launchに設定したいargとかがあれば，

```bash:b.launch.bash
#!/bin/bash
roslaunch pkg_b b.launch use_gui:=true
```
のようにできます．
```c.launch.bash```も同様に作ります．
もちろん全て実行可能にしておきましょう．

### 3. exe.bashの作成
これを実行することで，```a.launch.bash```，```b.launch.bash```，```c.launch.bash```が同時に複数のターミナルで実行されるようにします．

具体的には，

```bash:exe.bash
#!/bin/bash
tab="--tab-with-profile=roslaunch --command "
window="--window-with-profile=roslaunch --command "

cd $HOME/catkin_ws/src/common/bashes
gnome-terminal \
  $tab './a.launch.bash'\
  $tab './b.launch.bash'\
  $tab './c.launch.bash'
```
とします．

あとは，

```
$ ./catkin_ws/common/executions/exe.bash
```

のコマンド１つで複数のlaunchが同時にバラバラのターミナルで実行できます．

## 最後に

結局ROSかんけーないやん，というツッコミはナシでおねがいします．．．
Cannot start session without errorsのエラーがphpMyAdminで発生したら

phpMyAdminにアクセスした際に、Cannot start session without errorsが
出た際の対応をメモ。

phpinfoを表示させ
session.save_pathを確認する。

session.save_path　/var/lib/php/session
であったのであれば、

```:コマンド
ls -l　/var/lib/php/
```
でsessionフォルダのアクセス権を確認する。

```:コマンド
drwxrwx--- 2 root apache 4096  3月  3 16:07 session
```

となっていたので、nginxでサーバを動かしている時は、

```:コマンド
chown -R root.nginx /var/lib/php/session
```

を打つ。
これでphpMyAdminのエラーが復旧する。