OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry PiをWindowsPCから操作する方法　【CUI・GUI】

# 概要
この記事は、WindowsOSのPCからRaspberryPiを操作するための方法に関しての備忘録です。
CUI(ターミナルでの文字入力で作業)での操作方法とGUI(デスクトップ画面が表示され、マウスの使える)での操作方法を順に紹介します。
用意したプログラムを走らせるだけならCUI操作で十分な場合が多いかと思います。しかしCUI操作に慣れてない場合や、officeソフトで文章を書いたりMinecraftのようなゲームをしたりとラズパイをPCらしく扱いたい場合はGUI操作が必要になります。

# 環境
- 操作するPCのOS: Windows7 professional
- ラズパイのVersion： Raspberry Pi 2B
- ラズパイのOS: Rasbian 8.0
- CUI操作のために使ったソフト: Tera Term

# CUI接続の方法
#### Rapberry Pi側の準備①　SSH接続を可能にする
1. ターミナルで、sudo raspi-configと入力し、設定画面を開く。そこには、8つの項目の番号付きリストが表示されている。
2. 5番目のInterfacing Optionsを選択する。すると、P1～P8の8つの項目が表示される。
3. P2のSSHがenableになっているかを確認し、なってなかったらenableにする。

#### Rapberry Pi側の準備②　IPアドレスの確認
1. ターミナルで、ifconfigと入力する。すると、接続環境に関する情報が出てくる。
2. wlan0のinet addr: XXX.XXX.XXX.XXXという項目の番号を確認し、控える。

#### WindowsPCでの操作
1. (未だインストールしていなかったら)TeraTermをインストールする。
2. TeraTermを起動する。すると、新しい接続の設定入力画面が出てくる。
3. ホスト(T):の入力枠に、上の操作で控えたwlan0のinet addrのXXX~の番号を入力する。
4. 接続設定画面のその他の項目はそのままで、OKボタンを押す。そのままと書いたが、具体的には以下の設定で上手く接続できた。TCP接続:22、サービス：SSH、SSHバージョン：SSH2、プロトコル：UNSPEC。(ちなみに、接続できないという表示が出たら、ラスパイ側で、「SSH接続を可能にする」操作を行うと、接続できるようになった。その理由の説明は、今の私には出来ない。)
5. SSH認証の画面が出てくるので、ユーザー名とパスフレーズを入力する。設定を変更していなかった場合、ユーザー名はpi、パスフレーズはraspberryのはずである。ユーザー名とパスフレーズは、sudo raspi-configで開ける設定画面で変更可能である。初回接続時や既知のアドレスリストに入力アドレスが無い場合、接続先が成りすましのサーバーである可能性を警告する警告文が共に表示される。正しくIPアドレスを入力してこの画面が表示されたのであれば、左下の続行のボタンを押して警告を消す。
6. するとターミナル(Windowsで言うコマンドプロンプト)が表示される。操作の方法は、「(Rasbian)Linuxコマンド」の入力で行っていく。

# GUI接続の方法
#### Rapberry Pi側の準備①　VNC接続を可能にする
1. ターミナルで、sudo raspi-configと入力し、設定画面を開く。
2. 5番目のInterfacing Optionsを選択する。すると、P1～P8の8つの項目が表示される。
3. P3のVNCがenableになっているかを確認し、なってなかったらenableにする。

#### Rapberry Pi側の準備②　ホスト名の確認
1. ターミナルで、sudo raspi-configと入力し、設定画面を開く。
2. 7番目のAdbvanced optionsを選択し、A2のHostnameを確認する。変更したければ変更する。

#### Rapberry Pi側の準備③　xrdpのインストール
1. ターミナルで、sudo apt-get install xrdpと入力し、xrdpをインストールする。

#### WindowsPCでの操作
1. リモートデスクトップ接続というプログラムを起動する。Windowsボタンを押すと出てくる「プログラムとファイルの検索」の入力ボックスに「リモート」と入力すればこのプログラムを見つけられる。あるいは、プログラム一覧の中のアクセサリ(電卓などが入っている)の項目の中にあるので、そこから指定する。
2. コンピューター名の入力画面が出てくるので、そこに上の操作で控えた「ホスト名」＋「.local」を入力する。ホスト名の最後に、.localを追加することを忘れないように注意する。
3. IDを識別できないなどの警告文が出てきても、正しくコンピュータ名を入力したのであれば、OKを押す。
4. すると、Login to xrdp　というウインドウが出てくる。ユーザー名とパスフレーズを入力する。ここで、入力を速やかに行わないと、接続が切断されてしまうので注意する。
5. 正しくユーザー名とパスフレーズを入力できると、「リモートデスクトップ接続」のウィンドウが表示される。初期設定では画面いっぱいのフルサイズになっているが、ファイルエクスプローラーと同様に、サイズを自由に変えられる。

#### リモートデスクトップのキーボードの設定
最後に、国内産PCを使っている場合、キーボードの設定を修正する必要がある。アルファベットの入力には問題ないが、「：」が、「Shift」＋「；」だったりと、国内産キーボードの印字と対応しておらず、不便である。
ターミナルで、以下のコマンドを入力すると、再起動の後、キーボード環境が国内産キーボードの印字と対応する。
cd /etc/xrdp/
sudo wget http://w.vmeta.jp/temp/km-0411.ini
sudo ln -s km-0411.ini km-e0010411.ini
sudo ln -s km-0411.ini km-e0200411.ini
sudo ln -s km-0411.ini km-e0210411.ini
sudo service xrdp restart

# 備考
上の操作で、CUI操作の場合に「IPアドレス」入力、GUI操作の場合に「ホスト名.local」の入力を行っているが、逆でも問題が無いはずである。憶測ではない原因の説明を、今の私は出来ないが、どちらかで上手くいかなかったとき、もう一方の入力を試すと上手くいくことがある。
electron-vueのルーティングで盛大にハマった


こちら（[ElectronでVue.jsを始める](http://qiita.com/SatoTakumi/items/fd79672d7eb8a9b4a0bb)）の記事を参考に、Electronアプリを作成。
しかし、helloページの追加ができずに苦戦した話です。

結果的に、routes.jsの初歩的なミスが原因でした。

2017/02/12時点ではelectron-vueが上記の記事の時点からアップデートされているらしく、`app/src`配下に`main`と`renderer`というディレクトリができている。
これのせいで色々と疑ってしまい、時間がかかってしまいました。

renderer配下のcomponentsにHello.vueを追加、routes.jsに

```javascript:routes.js
  {
    path: '/hello',
    name: 'hello-page',
    component: require('components/Hello')
  },
```
を追加したつもりが、動かない。
原因は

```javascript:routes.js
  {
    path: '*',
    redirect: '/'
  }
```
よりも下にhello-pageへのルーティングを書いてしまっていたからでした。

上から読み込んで当てはまった順にルーティングさせるのね。

```javascript:routes.js
export default [
  {
    path: '/',
    name: 'landing-page',
    component: require('components/LandingPageView')
  },
  {
    path: '/hello',
    name: 'hello-page',
    component: require('components/Hello')
  },
  {
    path: '*',
    redirect: '/'
  }
] 
```

結果的に、このようにしたところうまくいきました。

なんかこんなことでものすごく時間を使ってしまって恥ずかしい。。。
middleman v4 の collection と resources 機能を使ってみる

middlemn v4 では resources と collection というのが導入されたらしいのですが、[公式ドキュメント](https://middlemanapp.com/jp/basics/upgrade-v4/#コレクション)を見てもいまいち分かりにくいです。どうやらわざわざextension で manipulate\_resource\_list() を使わなくても手軽にリソース操作ができるっぽいですね。


### resources を使ってみる。

とりあえず、すべてのリソースに 'foo' というローカル変数を使えるようにしてみます。config.rb に


```ruby
resources.each {|res|
  res.add_metadata(locals: {foo: "YES! FOO!!!"})
}
```

と書くだけで、*.html.erb で

```ruby
foo? <%= foo %>
```

と使えるようです。確かに便利ですね。v3ではこれをするのには Middleman::Extension から派生させたクラスを作って manipulate\_resource\_list() を書いてそのクラスを Middleman::Extensions に register して activate して、、、という手順を踏まなければなりませんでしたから。

### collection を使ってみる
ドキュメントのタグの例題が分かりにくいので、ここでは、**「見てほしい記事に mitene: 100 とかフロントマターにつけて大きい順に表示する」**というのをやってみたいと思います。

config.rb:

```ruby
mitene = resources.select {|r| r.data.mitene }.sort_by {|r| r.data.mitene}.reverse

collection :mitene, mitene
```

というふうに、collection() を使って、あるシンボルに対して、**resources から始まるチェーンから作られたオブジェクト**を紐付けしてあげます。そうすると mitene.html.erb でそのシンボルを使って、

```erb
<h2>みてね！</h2>

<ul>
<% collection(:mitene).each do |res| %>
  <li><%= link_to(res.data.title, res) %></li>
<% end %>
</ul>
```

というふうに、集めておいたオブジェクトを呼び出せるようです。

また、config.rb:

```ruby
mitene = resources.select {|r| r.data.mitene }.group_by {|r| r.data.mitene }
collection :mitene, mitene
```

とハッシュにしてあげて

```erb
<h2>みてね！順</h2>
<ul>
<% collection(:mitene).sort_by {|r, v| r}.reverse.each do |key, items| %>
<li><%= key %>
  <ul>
    <% items.each do |res| %>
    <li><%= link_to(res.data.title, res) %></li>
    <% end %>
  </ul>
<% end %>
</ul>
```

と受け取ることも出来ます。

ちょっとリソースに手を加えたり、特定の条件のリソースを集めておいてテンプレートで使うということが手軽にできそうな感じです。

また分かり次第追記していきます。
JavaScript フィッシャー - イェーツのシャッフル

#Fisher-Yates Shuffle
ロナルド・フィッシャーさんおよびフランク・イェーツさんが考案したシャフルのアルゴリズムです。

##アルゴリズムのイメージ
くじ引きの箱の中から１つずつくじを引いて並べてシャッフルするイメージです。

「取り出す範囲(くじ箱の中)」と「結果の範囲(くじ箱の外)」の２つに分けて考えます。

##手順
* 取り出す範囲(箱の中)から取り出す値をランダムに１つ決定する。
* 末尾の値と交換する。末尾を結果の範囲(くじ箱の外)とする。
* くじ箱の外が新しくできたので、取り出す範囲(くじ箱の中)を１つ前に狭める。
* 上記３つの処理を先頭の値がくじ箱の外になるまで繰り返す。
* 値が不規則に並んでかえってくる

おわり


```js
//ソートされた配列
a = [1,2,3,4,5,6,7,8,9];

//取り出す範囲(箱の中)を末尾から狭める繰り返し
for(i = a.length -1;i>0;i--){
    //乱数生成を使ってランダムに取り出す値を決める
    r = Math.floor(Math.random()*(i+1));
    //取り出した値と箱の外の先頭の値を交換する
    tmp = a[i];
    a[i] = a[r];
    a[r] = tmp;
}
//結果を表示
console.log(a);
```
Spacemacsでさくっとタイムスタンプを打つ

Spacemacsを使っているとき、タイムスタンプを挿入したいなら、さくっと`user-init`に関数を定義すると良さそうです。

タイムスタンプを挿入する関数といえば、`org-time-stamp`が挙げられますが、表示形式が`<2017-02-13 Mon>`となります。時刻まで入れたいときは、手動で入力が必要で面倒です。もっと便利な関数がEmacsでは用意されていると思ったのですが、Spacemacsでは動かし方がわかりませんでした。

# Spacemacsに新しく関数を定義する
`$HOME/.spacemacs`の`dotspacemacs/user-init`に以下の関数定義を追加します。

```el
(defun my/insert-time-stamp ()
  "Insert TimeStamp"
  (interactive)
  (insert (current-time-string)))
```

<kbd>M-x</kbd> `my/insert-time-stamp`として呼び出すとカレントバッファに`Mon Feb 13 01:06:02 2017`が挿入されます。これで快適Emacsメモ生活が送れますね :tada:

# 補遺: 日付時刻フォーマット変更には`format-time-string`を使う
`current-time-string`の代わりに<a href="http://www.gnu.org/software/emacs/manual/html_node/elisp/Time-Parsing.html"><code>format-time-string</code></a>を使うと、日付時刻フォーマットを指定することができます。
PythonからC++のクラスを使ってみるテスト

#概要

C++でdllを作ってPythonから呼ぶ方式を試してみる。

pybind11を使う版もやってみた↓
http://qiita.com/tibigame/items/499a81f0e1cb47962b90

#環境

* Windows7(64bit)
* Anaconda (Python3.6 64bit)
* Microsoft Visual C++ 2015 Community

#dll作成の流れ

1. Visual C++ -> Win32コンソールアプリケーションを選んで ウィザードでdllを選択する。
2. ビルドはReleaseでx64を選択
3. 最初から開いているcppファイルにコードを記述
4. ビルド(F7)
5. 生成されたdllファイルをpythonコードがあるディレクトリにコピー

#C++コード
```c++:c++dll.cpp
#include "stdafx.h"

class ClassTest{
public:
	int a;
	int *b;
	ClassTest() {
	}
	ClassTest(int X) {
		a = X;
		b = new int;
		*b = X * 2;
	}
	~ClassTest() {
		delete b;
	}
	int calcA(int add) {
		return a + add;
	}
	int getB() {
		return *b;
	}
};
ClassTest **ClassTestArray;
// arrayNum個のクラスポインタ配列を確保する
extern "C" __declspec(dllexport) void initializeClass(int arrayNum) {
	ClassTestArray = new ClassTest*[arrayNum];
}
// 終了時に呼ぶ
extern "C" __declspec(dllexport) void exitClass() {
	delete[] ClassTestArray;
}
// index番目をXで初期化する
extern "C" __declspec(dllexport) void constructor(int index, int X) {
	ClassTestArray[index] = new ClassTest(X);
}
// index番目を破棄
extern "C" __declspec(dllexport) void destructor(int index) {
	delete ClassTestArray[index];
}
extern "C" __declspec(dllexport) int calcA(int index, int add) {
	return ClassTestArray[index]->calcA(add);
}
extern "C" __declspec(dllexport) int getB(int index) {
	return ClassTestArray[index]->getB();
}
```
#Pythonコード
```python:test.py
from ctypes import cdll
import ctypes

# 作成したdllの読み込み
dll = cdll.LoadLibrary('./c++dll.dll')
# dllの関数をセット
initializeClass = dll.initializeClass
exitClass = dll.exitClass
constructor = dll.constructor
destructor = dll.destructor
calcA = dll.calcA
getB = dll.getB
#関数を呼び出す
initializeClass(5)
constructor(0, 100)
print (calcA(0, 10))
print (getB(0))
destructor(0)
exitClass()
```
#結果
```text
110
200
```
かなり無理矢理関数化した感じだが、
コンストラクタで設定した100に
calcA()では10を足した110が
getB()では2倍にされた200が返っており期待通り。
ブランチの名前をミスったときの対処法

ローカルのブランチ名変えてから、リモートのブランチを消して、もう1回ブランチをプッシュすればOK。

# ローカルのブランチ名変更
ミスった名前の例：syaro
新たしい名前の例：sharo
`$ git branch -m syaro sharo`

# リモートのブランチ削除
`$ git push origin :syaro`

# 変更済みローカルブランチをプッシュ
`$ git push origin sharo`

これでOK
rex0220 テーマプラス・プラグイン

kintone 新テーマに対応したプラグインです。

- テーマに合わせて、ボタン・アイコン・イメージの色を設定します。
- ヘッダー部の色をアプリ単位に設定できます。

※IE、EDGE ブラウザについては、アイコン・イメージの色が変更されない箇所があります。

[rex0220 stores で、販売中です。](https://rex0220.stores.jp/)


# 新テーマ RED の表示例

一覧画面

![2017-02-13_00h41_04.png](https://qiita-image-store.s3.amazonaws.com/0/100572/30c88628-8f7e-b476-dbd0-3bef2d32c51e.png)

編集画面

![2017-02-13_00h41_18.png](https://qiita-image-store.s3.amazonaws.com/0/100572/ba4e1094-8f67-9ae5-7131-0059b39e9b01.png)

# 各テーマの表示例

![2017-02-13_00h53_45.png](https://qiita-image-store.s3.amazonaws.com/0/100572/944d8441-6477-59cb-48a7-99ec6bbaf30e.png)


# ヘッダー色の指定

アプリ単位に、ヘッダー色の指定出来ます。

- ヘッダー色のカスタム指定表示例

![2017-02-13_00h56_22.png](https://qiita-image-store.s3.amazonaws.com/0/100572/35eefde7-d7fd-fa47-a5c0-b550c5251691.png)


# プラグイン設定画面

- ヘッダー部の設定　「規定値」か「カスタム設定」を選択します。

- 「カスタム設定」の場合は、ヘッダー色を指定します。


![2017-02-13_00h56_04.png](https://qiita-image-store.s3.amazonaws.com/0/100572/5e8450ba-e474-a665-b12d-b14f240d8193.png)

# 注意事項


- 既に、JavaScript によるカスタマイズを行っているアプリの場合、処理が競合して、エラーになる場合があります。その場合は、該当するアプリでプラグインの使用を中止してください。

- IE、EDGE ブラウザについては、アイコン・イメージの色が変更されない箇所があります。
VSCode で内蔵ターミナルの背景を設定する

https://github.com/shalldie/vscode-background みたいにVSCode拡張を作ってみたいものですが、面倒だったので今後の課題ということで。

Mac版で(他のOSでも相応の場所があります) 
`/Applications/Visual\ Studio\ Code.app/Contents/Resources/app/out/vs/workbench/electron-browser/workbench.main.css`
の末尾に、

```css
.xterm{
  background-image: url('/path/to/image/path.jpg')!important;
  background-position: center center;
  background-repeat: no-repeat;
  background-attachment: fixed;
  background-size: cover;
}
```
と追記すると、
<img width="669" alt="スクリーンショット 2017-02-13 0.55.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/83044/3a872c21-1d6f-eb54-d6b6-e56b914437a2.png">
DockerでAlfrescoを起動して、Officeファイルプレビューまで

#AlfrescoのDocker imageを選択
[gui81/alfresco](https://github.com/gui81/docker-alfresco)がスター多いけど、
volumeマウントすると起動できない問題[(issue#7)](https://github.com/gui81/docker-alfresco/issues/7)で
つまづいたため、[webcenter/rancher-alfresco](https://hub.docker.com/r/webcenter/rancher-alfresco/)を使った。
（一応、空判定してからディレクトリをリネームすると使えるらしい）

普通に、docker run webcenter/rancher-alfrescoで起動できる。
（オプションは省略）

#Officeファイルのプレビューを表示するまで
そのままだとプレビューがつかえなかった。

[Alfrescoをインストール後やったこと](http://qiita.com/YoshikawaT/items/0e2eff5b14349198aea7)を参考にリネームと設定ファイル編集
これでいけるかと思ったらまだだめ。

docker exec -it [image] /bin/bash
で中に入って
alfresco.sh start libreoffice
を実行すると[could not be started]になる。

直接/opt/alfresco/libreoffice/scripts/ctl.shを実行してみると
どうやらライブラリが足りないらしい。

てなわけで、asset/setup/install_alfresco.shの中のapt-getしてるところに
libdbus-glib-1-2 libcairo2を足す。

これでプレビューできました。
問題を語れ

# 
[問題を語れ](http://tokyo.startupweekend.org/2010/11/10/your-solution-is-not-my-problem/
)、とある場所でその言葉に出会った。
以前、本業とは別に数人のチームでWebサービスを作る役割を担っていた時だ。

集団の中でコンセンサスを得るのは難しい、特に知り合って間もない場合は。
いつしか自分達が見知った情報で、自分たちの持てる技術で解決できる仮説を立てていた。

根源的な問題を語る障壁となるのはなんだろう、
それは自分達の弱みを晒すのを拒む無意識の心理的圧力もあるのかもしれない。
もしくはそもそもの問題を日常で感じずに済むことで思いつかないこともあるだろう。

生活、仕事、恋愛、家族、地域や人間関係、好奇心や人には言えない事、
息を悶えるような葛藤の中で問題を語り尽くし、
それに何重にも新たな層を重ねていく。
新たな層とは多様な観点での意見から生まれる。

その後ようやく解決法、そして事業継続性であったり、
或いは新規性といったある種の制約やバイアスを加えていく。
そしてリーンに市場の評価に晒された時に、それらはなんらかの指標としての結果を返す。
結果からその層を補正もしくは、方向転換していく。
そういったことを小刻みに進めることを見知った。

残念ながら、そのチームのサービスは凡庸でサービスといえないものになった。
出発点、割いた労力、またおそらく自分含め問題を語るには素直でなかった。

以上、日々の業務とは別にそういったことを忘れずにいたいなと思ったので、
文章にしてみました。
docker-composeでMySQLに接続する

# MySQLを利用したdocker-composeを書く

以下のような感じで書く。

``` docker-compose.yml
dbserver:
    build: ./mysql
    ports:
     - 3306:3306
    hostname: dbserver
    environment:
        MYSQL_DATABASE: order
        MYSQL_ROOT_PASSWORD: password
app:
    build: ./
    ports:
     - 8080:8080
    links:
     - dbserver
    volumes:
     - $PWD:/usr/src/app
    tty: true
```

# docker-compose up -d をする

```
$ docker-compose up -d
Recreating talk_dbserver_1
Recreating talk_app_1

$ docker-compose ps
     Name                   Command             State           Ports          
------------------------------------------------------------------------------
talk_app_1        python3                       Up      0.0.0.0:8080->8080/tcp 
talk_dbserver_1   docker-entrypoint.sh mysqld   Up      0.0.0.0:3306->3306/tcp 
```

# appに入ってMySQLに接続する

下の感じ。

```
$ docker exec -it talk_app_1 bash
python@9726b9fddf22:/mysql-connector-python$ mysql -h dbserver -P 3306 -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.17 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

# ちなみに

```
$ docker exec -it talk_dbserver_1 bash
root@dbserver:/# env
HOSTNAME=dbserver
TERM=xterm
MYSQL_VERSION=5.7.17-1debian8
MYSQL_DATABASE=order
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
SHLVL=1
HOME=/root
MYSQL_MAJOR=5.7
no_proxy=*.local, 169.254/16
affinity:container==aa15c60aa635af3cc91bcc6092b9d20f32dc3bc1d9b4557e8469c567c8c88173
GOSU_VERSION=1.7
MYSQL_ROOT_PASSWORD=password
_=/usr/bin/env
root@dbserver:/# hostname -i
172.17.0.2
```

ip直指定でも入れる。

```
$ docker exec -it talk_app_1 bash
python@9726b9fddf22:/mysql-connector-python$ mysql -h 172.17.0.2 -P 3306 -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.17 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
```
CSS3box-sizing プロパティ

width や height で大きさを指定したboxに
marginやborder、paddingを指定した時、
レイアウトが崩れたという経験はありませんか？

<img width="342" alt="スクリーンショット 2017-02-12 23.54.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/159314/ecac40f8-0574-642a-2055-2b490b8c7ae2.png">


```ruby:sample.css
  width: 300px;
  height: 100px;
  border: 10px;
```


そんな時は、ボックスサイズの算出方法を見直してみるといいかもしれません。

# 具体的にどこを見るの？？
``box-sizingプロパティ``を指定することで
ボックスサイズ(width, height) の算出方法を指定することができます。

初期値では``box-sizing: content-box；``となっています。

```ruby:sample.css
  width: 300px;
  height: 100px;
  box-sizing: content-box;
```

このcontent-boxとは、``パディングとボーダーを幅と高さに含めない状態``を指します。
言い換えると、heightやwidthの大きさとは別で、
marginやborder、paddingの大きさが含まれている状態です。


# んじゃ、どうすればいいの？？
box-sizingを``border-box``と指定してあげましょう。

もうお分かりかもですが、
border-boxは``パディングとボーダーを幅と高さに含める状態``を指します。


#まとめ
```
content-box：パディングとボーダーを幅と高さに含めない（初期値）
border-box ：パディングとボーダーを幅と高さに含める
```
いざって時に役にたつかもしれないハードウェア知識

# 背景

QiitaでFPGAの記事を読んでいて、FPGA内で完結する記事が多いなぁって感じたので、FPGAで外のデバイスと連携を行うときに、「あれ？ 上手くいかない。」 って場合に注意してみて欲しいことをまとめていこうと思います。



# Hardwareあれこれ

## FPGAもハードウェア

すごいざっくりいうとゲート回路の集まった「Hardware」です。
これらの論理素子を自由に接続できちゃうよっていう代物。


## 立ち上がり時間

JIS C 0161 の定義
>パルスの瞬時値が最初に規定した下限値に到達 し，その後規定された上限値に到達するまでの 時間間隔。

クロックを水晶振動子など外部から信号を入れている場合に、立ち上がり時間が想定以上に大きく周波数が安定しないってことがあったりなかったり。。。


## オーバーシュート アンダーシュート

電圧の立ち上がり時に規定値よりも大きい値になってしますことをオーバーシュート、
電圧が下ったときに規定値よりも小さい値になることをアンダーシュートと言います。

どういった状況で発生するのかというと、信号をLowからHighにしたときやスイッチを入れたり切ったりしたときに発生します。オーバーシュートの電圧がデバイスの瞬間耐圧電圧よりも大き場合にデバイスの破損の原因になります。コンデンサなどの場合は最悪爆発します。


## チャタリング

スイッチやリレーなどでON/OFFの切替え時に発生する信号ノイズ・・・
[wikipediaのチャタリング](https://ja.wikipedia.org/wiki/%E3%83%81%E3%83%A3%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0)に記載されている波形図のようになる現象です。
FPGAでスイッチを扱う際には必ずチャタリング除去回路をかますようにします。


## シミュレーションなどでわからない信号のデバッグ方法について

### マルチメーター

テスターって言ったほうが通じるかもしれないです。
電圧や電流を図れる測定器。回路がつながっているかなどの導通チェックもできる。
ホームセンターでも売っている。
ただ、制度がそこまで高いわけではないので、詳細に調べたい時はオシロスコープを使います。

### オシロスコープ

電圧の時間変化を計測するための測定器。
今回書いた内容の計測などではオシロスコープがあれば簡単に計測できます。
オシロスコープがあれば、だいたい事たります。一家に一台は欲しいです。

どこまで細かい時間を測定できるか(周波数帯域)、同時に測定できる信号の数(チャンネル数)などによって、価格も大きくかわります。
有名なオシロスコープメーカとしては[Tektronix](http://jp.tek.com/oscilloscope)などがあります。

### その他測定器

オシロスコープ以外だと
ロジックアナライザーやスペクトルアナライザーなどがありますが、まぁ普段は出番ないですw
興味があればどんなものかググってください。


# ハードウェアや計測器についての基礎知識が学べるサイト

ノイズについてなどのハードウェアの基礎知識は、電子機器・計測機器メーカなどの企業サイトに為になる情報が沢山公開してくれてます。

[NF回路設計ブロック 技術資料](http://www.nfcorp.co.jp/techinfo/index.html)
[村田製作所 ノイズの基礎知識](http://www.murata.com/ja-jp/products/emc/emifil/knowhow/basic)
[菊水電子 技術や規格について](http://www.kikusui.co.jp/knowledgeplazaindex_j.html)

や、[計測機器メーカ一覧](http://www.nisshin-sks.jp/comp02.htm)などの企業サイトも暇な時に見ると色々と勉強になるかもしれません。


# おわりに

FPGAなど触っていてシミュレーションだと上手く行っているのに、なぜちゃんと動作しないんだ！
ってありますよね。そんな時に、外部信号の影響を確認したら解決できた。
みたいにちょっとでも役に立てたらいいなと思います。

IoTが流行ってソフトフェアエンジニアもハードウェアを触る機会が増えていると思うので、エンジニアとしてソフトだけではなくてハードウェアの知識も増やして行きたいですね。
なぜ私のAngular CLIはカレントディレクトリにプロジェクトを作成してくれないのか？

Angularプロジェクトの雛形作成に、[generator-angular2-typescript](https://www.npmjs.com/package/generator-angular2-typescript)を使っていたのですが、最近Angular CLIに移行しました。

## 表題の件
Angular CLIでは、`ng new [プロジェクト名]`コマンドでプロジェクトの雛形を**<font color="Red">カレントディレクトリ</font>**に作成してくれるんですが、なぜかカレントディレクトリではなく**<font color="Red">ホームディレクトリ</font>**にしかプロジェクトを作成してくれない！という事態が発生しました。

### 開発環境
- OS:OS X EI Capitan(10.11.6) 
- angular-cli: 1.0.0-beta.28.3
- node: 6.2.1

## 解決
ググって出てきた[stackoverflowの記事](http://stackoverflow.com/questions/37228963/why-does-angular-cli-put-new-project-in-the-parent-directory)のおかげで解決しました。

>Do you have a package.json file in your home/user directory? I experienced this issue, then I removed package.json and that stopped it.

ホームディレクトリに置いてあるpackage.jsonが原因じゃない？package.jsonを削除すれば、カレントディレクトリにプロジェクトが作成されると思うよ〜みたいなことを言っていますね。

案の定ホームディレクトリにいつ作ったか覚えてないpackage.jsonが置いてあったので、削除したら無事カレントディレクトリにプロジェクトが作成されるようになりました。
DockerでXDebug使ってPHPデバッグする際はremote_connect_backが使えない

XDebugを使ってPHPのデバッグをする際、設定方法には2つある。

1. remote_hostをホストPCのIPアドレスに設定する
2. remote_connect_backをtrueにする

remote_connect_backを使えばホストPCのIPを入力せずとも、ホストPCとの連携が簡単に出来る。

> If enabled, the xdebug.remote_host setting is ignored and Xdebug will try to connect to the client that made the HTTP request.
https://xdebug.org/docs/all_settings#remote_connect_back

ところが、Docker上にインストールしたXDebugとの連携の場合は、こうはいかないらしく、remote_hostを設定しないと動かなかった。
理由は不明。
ともあれ、このことに気付くまでにえらく時間掛かってしまった。

必須項目は以下の通り。

1. Docker上のXDebugにはremote_hostを設定する。  
　→ホストPCのIPはipconfigなりifconfigなりで調べる。
2. docker-composeする際に、9000番ポートをexposeしておく。  
　→XDebugはデフォルトで9000番ポートを使うため。
3. volumesを設定する。
4. Netbeansの場合、実行環境を「ローカルWebサーバー」としておく。  
　→リモートで動いているように見せかけて「localhost」で動いているため？

Windowsのファイアウォールまで疑って、わざわざ9000番を空けても動かなかったので何で？！と思っていたのですが、こんなところに解決策があったとは。
調べても調べても全然出てこなかったので備忘録として。

あまりこの辺の記述が見当たらない辺り、Dockerをローカル開発環境として使う使い方は変わってるんですかねー。。。
ともあれ、これでようやくHyper-V+DockerでのPHP開発が出来るようになりました。
Rubyで実行時間計測をラップしたコードを書いてみた

Rubyでちょっとしたコードを書いた時、ふと、
「実行時間はどのぐらいかかっているんだろうか？」
と思うことがないでしょうか。

実行時間計測の方法自体は、既に先人の方々がまとめているため、リンクを紹介しておきます。

Rubyで処理の時間計測方法
http://qiita.com/yakiimo23/items/7293c7606c1d59501d89
Rubyでプログラムの処理速度を計測する
http://qiita.com/tamano/items/6317b26625651b4d0def
Rubyでベンチマークを取る方法
http://qiita.com/scivola/items/c5b2aeaf7d67a9ef310a

# やったこと
各やり方を比較してみると、
**「`Time.now`でやると、コードは簡潔に書けるが、ms単位でしか測れないため、短時間で実行が終わるコードには使えない。」**
**「`benchmark` を使うと、詳細な実行時間を取れるが、実行時間を表示するコードを書くのに数ステップ書かないといけない。」**(※)
ということがわかります。

というわけで、両者の短所を埋めるべく **「1ステップで書けて」「詳細な実行時間が取得できる」** ように、`benchmark`の利用部をラップしたコードを書いてみました。

(※)`benchmark`を使っても、短い時間で終わる処理の正確な実行時間は測れません。[こちらの記事の説明](http://qiita.com/scivola/items/c5b2aeaf7d67a9ef310a#%E8%AA%A4%E5%B7%AE%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)にもある通り、CPU時間が 0.01秒とかになるようなベンチマークテストをやっても、有効数字ゼロ桁の結果しか得ることができないのです。

# コード
```ruby:process_measure.rb
require 'benchmark'

def measure_do
  result = Benchmark.measure do
    yield
  end

  puts Benchmark::CAPTION
  puts result
end
```

# 使い方
使い方は簡単。
`require`していただいた上で、

```ruby:書き方
measure_do { __計測したい処理__ }
```

を書くだけです。
一応、使った場合のサンプルも載せておきます。

```ruby:sample.rb
require './process_measure.rb'

measure_do { 100000000.times { |i| a = i } }
measure_do { 1000000000.times { |i| a = i } }
```

```実行結果
$ ruby sample.rb
      user     system      total        real
  6.230000   0.020000   6.250000 (  6.276192)
      user     system      total        real
 12.550000   0.040000  12.590000 ( 12.642582)
```

# おわりに
やっていることは単純ですが、サンドボックス的なプロジェクトに置いておくと、
簡単に実行時間計測を書くことができて便利です。
Centos7 GAE/Go の VS Code開発環境セットアップメモ

クリーンインストール直後の状態を想定

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

```
sudo yum install -y epel-release
sudo yum install -y gcc libXScrnSaver git
```

# Google Cloud SDK のインストール

https://cloud.google.com/sdk/docs/quickstart-redhat-centos

# App Engine SDK for Go インストール

以下のドキュメント通りに行う
https://cloud.google.com/appengine/docs/go/download#go_linux

zipファイルのダウンロードが完了後、解凍しハードリンクを作成する

```
unzip go_appengine_sdk_linux_amd64-1.9.48.zip
cd go_appengine/goroot/bin/
ln goapp go
```

パスの設定を行う

```
echo 'export GOROOT=$HOME/go_appengine/goroot/' >> ~/.bashrc
echo 'export GOPATH=$HOME/go_appengine/gopath/' >> ~/.bashrc
echo 'export APPENGINE_DEV_APPSERVER=$HOME/go_appengine/dev_appserver.py' >> ~/.bashrc
echo 'export PATH=$PATH:$GOROOT/bin/' >> ~/.bashrc
```

これでgoコマンドが使えるようになる

# Visual Studio Code のインストール

https://code.visualstudio.com/Download

ファイルをダウンロード後インストール

```
sudo rpm -ivh code-[バージョン番号].el7.x86_64.rpm
```

インストールが完了したら

```
code
```

を実行するとVS Codeが起動する

# Delveをインストール

Golangのデバッガ
VS Codeではこれがないと実行できない(?)
以下を実行

```
go get -v -u github.com/peterh/liner github.com/derekparker/delve/cmd/dlv
```

# VS CodeのGo Pluginをインストール

VS Codeを起動する。
左のアイコンリスト一番下の、「拡張機能」をクリック
検索窓に「Go」を入力
検索結果の説明文が「Rich Go language support ...」の方の「Go」プラグインをインストール
インストール後、「再度読み込む」をクリックしてVS Codeを再起動

# Golangのプロジェクト作成

任意の場所に、「Hello」ディレクトリを作成
VS Codeの「ディレクトリを開く」で「Hello」ディレクトリを開く
左側の「HELLO」にマウスを合わせ、表示された新規ファイルアイコンをクリック
「main.go」を作成
上部に「The "golint" command is not available. ...」と表示されるので、「Install All」をクリック
インストールが終わったら準備完了

以下のコードを記述

```
package main

import "fmt" // 自動補完されるので記述しなくてもよい

func main() {
  fmt.Println("Hello Golang")
}
```

「Ctrl + s」で保存

F5キーを入力すると、上部に「環境の選択」と表示されることがあるので、その場合は「Go」と入力

アプリケーションの起動用設定ファイル「launch.json」が生成される

「Ctrl + F5」を入力して、実行する
msys2でlibgit2のビルドとgit2goのインストール

[MSYS2](http://www.msys2.org/)上でlibgit2をビルドし、git2goをインストールする方法いつも忘れるのでメモ。

# ビルド手順
## (1) ビルド環境の準備

```
$ pacman -S mingw-w64-x86_64-{gcc,make,cmake,pkg-config,glib2,curl,zlib,http-parser,openssl,libssh2}
```

## (2) libgit2のビルド

```
$ git clone https://github.com/libgit2/libgit2/
$ cd libgit2
$ git checkout v0.25.1
$ mkdir build && cd build
$ start cmake .. -G "MinGW Makefiles"  -DCMAKE_INSTALL_PREFIX=/mingw64/x86_64-w64-mingw32
$ cmake --build . --target install
```

1回目のcmakeの呼び出し時をstart経由にしているのは、cmakeはshがPATHに含まれているとエラーになるため。


## (3) git2goのインストール

```
$ PKG_CONFIG_PATH=/mingw64/x86_64-w64-mingw32/lib/pkgconfig/ go get gopkg.in/libgit2/git2go.v25
```

# 参考リンク
  * [CMake](https://cmake.org/)
  * [libgit2/libgit2](https://github.com/libgit2/libgit2)
  * [libgit2/git2go](https://github.com/libgit2/git2go)
Template Haskellを使って定数をコンパイル時に計算しておく

# 背景

Haskellでは、常に同じ値を返す定数関数であっても、評価されるたびに計算が行われるらしい（間違ったこと言ってたら指摘してください）。

プロジェクト・オイラーをやっていて、ふるいで作った素数表を使って素因数分解したいのだが、素因数分解は何回も行うので、そのたびにふるい関数が評価されて時間がかかるのを避けたい。定数は1回計算したら値を覚えておいてくれればいいのに。

# 解決法

Template Haskellを使うとコンパイル時に計算され、実行時間は一瞬になる。

```Haskell
module SlowSieve where

sieve :: [Integer] -> [Integer]
sieve [] = []
sieve (x:xs) = x : sieve [y | y <- xs, y `mod` x /= 0]

main = print $ sieve [2..100000]
```

```Haskell
{-# LANGUAGE TemplateHaskell #-}

import SlowSieve hiding (main)

main = print $( let x = sieve [2..100000] in [| x |] )
```

Template Haskellを使う場合はこのように別モジュールに分けないといけないらしい。

Template Haskellの機能はこのような定数計算のためだけにあるわけではなく、#defineのような（？）コンパイル時メタプログラミングができるらしい。

# 参考

- [Can Haskell programs be compiled such that the resultant binary already has all possible compile-time calculations already performed? : haskell](https://www.reddit.com/r/haskell/comments/1kpu1h/can_haskell_programs_be_compiled_such_that_the/)
- [performance - Why are (constant) expressions not evaluated at compile time in Haskell? - Stack Overflow](http://stackoverflow.com/questions/19259114/why-are-constant-expressions-not-evaluated-at-compile-time-in-haskell)
エンジニアの英語学習計画 ver1.0

突然だが英語を勉強したいと思うのでメリットとデメリットを書き出してみた。
案の定、デメリットがあまりなく学習計画を立ててみたので1ヶ月ほど運用して試してみたい。
アドバイス等あればコメント頂けると幸いです。

## 前提
### 目的
* めちゃめちゃハッキリした目的はあるが、今回は割愛

### 到達したいレベル
* 後述するリーディング・ライティング・リスニングのステップがストレスなくこなせるレベル
* つまり後述するメリットを享受できるレベル

### その他
* 日常英会話とかビジネス英語とかではなく(それも身に付けたいが)、今回はエンジニアとして英語を身につけたい
* 会話はwant、読み・書き・聴きはmustで欲しい
* 中高で英語学習したくらいで聴く・話すはほぼダメ、読む・書くはセンターで8割程度
* 大学ではほぼ英語やっていないのでTOEIC等ももちろん受けたことはない
* 1h/日を平均学習時間とする
* 期限なし(とりあえず1ヶ月)

## メリット
* 英語のドキュメントを読むことへの抵抗がなくなる
* StackOverFlow、外国人エンジニアのTwitterなど情報ソースの幅が広がる
* StackOverFlow、外国人エンジニアのTwitterなどで質問ができるようになる
* オープンソースのissue、pullRequest等を読むことでライブラリや最新技術への知見が深まると共にコミットメントできるチャンスが広がる
* 日本以外でも働くチャンスが増える
* 上記をメリットを享受できるとすれば結果的に技術力も向上する

## デメリット
* 学習コストを割くことになるので短期的には他のリソースを減らす必要がある(コードを書く、技術書を読む、遊ぶ、寝る、etc...)

## 学習方法
### リーディング
* ライブラリやサービス等、英語のドキュメントやREADMEを読む(Facebook/Flowとかまだ日本語訳がないものを訳してみたりしてアウトプットする)

### ライティング
* 英語のTwitterアカウントを作る
* 英語版Qiitaのようなサイトで情報発信をする

### リスニング
* TEDを聴く(マットカッツとか)
* Googleとかの動画を聴く(AngularとかAMPとかProgressibeWebAppについてのスピーチみたいなやつ)

### スピーキング
* 具体案がない
* DMMとか英会話
* 英語喋れる友達と話すとか

### +α
* Duolingoというアプリが結構いい感じなので中高レベルの英語はこれで復習する(1h/日とは別に往復1時間ほどある移動時間で)
UnityでAnimationInstancingを実現してみよう(1)

[UnityでAnimationInstancingを実現してみよう(2)](https://qiita.com/piti5/items/e957dc365e8d65b8c81a
)
[Github](https://github.com/piti6/UnityGpuInstancedAnimation
) (Unity 2017.1.3f1)

## きっかけ
最初Unityでオープンワールド的な何かを作ってみよう!と思って色々試していた最中、
アニメーションが付いているSkinnedMeshRendererが増えるほど、非常に重くなっていくのをみてユニティでのアニメーションとGPUとの関係を調べた結果、
**GPU Instancing用のシェーダーはアニメーションが付いているSkinnedMeshRendererはサポートしていない。**というのをみて、GPUでアニメーションインスタンシングを実現してみようと思いました。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/165110/0fcd2b0f-2f04-93e8-eaa1-1b282c277adc.png)
見えているモデルは少ないけど、アニメーション+NavMeshでCPUの負荷が相当かかってしまう。(パソコンがあまりに良くないのもありますが)

### UnityのGPU Instancing
ユニティ5.4から公式的にサポートし始めています。
前提としては、
![image](https://qiita-image-store.s3.amazonaws.com/0/165110/0b68bdd0-34c4-d3c2-92e8-bf0869378ffe.png)
そもそもGPU InstancingをサポートしているGraphicLibraryじゃないといけない。
使い方としては、簡単にInstance用シェーダーを追加しマテリアルに適用するだけでOKです。
![image](https://qiita-image-store.s3.amazonaws.com/0/165110/f1e46d8c-efdf-69d2-6203-2ecdd966a03a.png)
ですが、アニメーションをサポートしていない限り、効用性としては限定的なところ(背景、アニメーションがないアイテムオブジェクト等)にしか活用できないですね。

### UnityのGPU Skinning
基本的にユニティのSkinningはCPU上で行うようになってますが、PlayerSettingsのOther SettingsのRendering項目でGPU Skinningオプションを設定するのができます。
![image](https://qiita-image-store.s3.amazonaws.com/0/165110/62456342-0229-b9a5-bb7f-be1c57f60c2f.png)




## 適用したい方法
http://http.developer.nvidia.com/GPUGems3/gpugems3_ch02.html
GPU Gems3の Chapter2. Animated Crowd Renderingを使おうとしました。
アニメーションのボーンマトリクスをテクスチャーに保存し、Instanceシェーダーの頂点情報としてボーンのWeightとボーンインデクスを渡せばOKという感じですね。

### 適用可能なのかの検証作業
#### 1. Global Textureの設定は可能なのか

まずはマテリアル別にアニメーションテクスチャーを渡すのはあまりにやりたくないので、
シェーダー共通のテクスチャーの指定ができるのかを調べてみました。
![image](https://qiita-image-store.s3.amazonaws.com/0/165110/05156f14-ff1e-dd0d-6491-8cc3c84ccb1a.png)
よし。問題解決。

#### 2. 頂点ごとにカスタムな情報を渡すのが可能なのか

UnityではUNITY_DEFINE_INSTANCED_PROPというのを使ってInstanceごとに情報を渡すのが可能ですが、今回は頂点ごとに情報を渡したい感じだったので、
![image](https://qiita-image-store.s3.amazonaws.com/0/165110/9cc88a16-cc2e-eb84-c466-646f167ae7b4.png)
Vertexの情報として必要なのはボーンのインデクスとウェイトのペア。ユニティは一つの頂点で最大4個のボーンをBlendingできるので、 TexCoord2(float4)とTexCoord3(float4)を使えば大丈夫そうです。
足りなさそうだったら QualitySettingsのBlendWeightsを減らせばよさそうですね。

#### 3. ボーン情報の獲得
UnityのMeshからボーンの情報を獲得するのはこういう感じできれいにできます。

```C#
for (int i = 0; i < mesh.vertexCount; i++)
{
   var position = mesh.vertices[i];
   var weights = mesh.boneWeights[i];
   var boneIndices = new int[] { weights.boneIndex0, weights.boneIndex1, weights.boneIndex2, weights.boneIndex3 };
   var boneWeights = new float[] { weights.weight0, weights.weight1, weights.weight2, weights.weight3 };
}
```
## 問題点
問題点としては、既存のユニティのアニメーションコンポネントを使えなくなるのがあります。

## 結論
Animation InstancingをユニティのGPU Instancingにのせて実現するのは可能だと思われます。
実際ググってみたら、既にUnity上でAnimation Instancingを実現した動画が結構あったので、次回は二つのパートに分けて、アニメーションテクスチャーを作るところとシェーダーで適用するところを順番で書いていきたいと思います。
dlibの顔ランドマーク認識の結果をリアルタイムにmatplotlibで表示する

## 背景
リアルタイムにカメラ映像の処理結果を表示する場合には、OpenCVのimshowを使うことが多いですが、テキストの表示等は色々不便なのでmatplotlibで表示してみたら、意外と便利だったのでメモ書きです。
例えばdlibの顔認識結果を可視化すると下記のようになります。dlibにも独自GUIモジュールがありますが、一般的な表示処理ができるわけではないので使い勝手は良くないです。

<img width="480" alt="result" src="https://qiita-image-store.s3.amazonaws.com/0/139809/fc18355c-2562-b570-ffcd-e08b367d459c.png">


## 前提とか
macOS Sierraで、`brew install python3`でインストールしたPythonを利用。
下記ではdlibの認識結果を表示しているのでdlibをインストールしていますが、matplotlibでの表示には関係ありません。基本はOpenCVでキャプチャして、matplotlibで表示するだけです。

- OpenCVのインストール

```bash
brew tap homebrew/python
brew install opencv3 --with-python3 --with-ffmpeg --with-tbb --with-contrib

# 利用するPython環境からシンボリックリンクを貼る
cd /usr/local/lib/python3.6/site-packages
ln -s /usr/local/Cellar/opencv3/3.2.0/lib/python3.6/site-packages/cv2.cpython-36m-darwin.so cv2.so
```
- matplotlibのインストール

```bash
pip3 install matplotlib
```

- dlibのインストール

```bash
brew install boost
brew install boost-python --with-python3 --without-python
pip3 install dlib
```

## リアルタイム表示
plt.showの代わりにplt.pauseを使うと実現できるようです。
http://qiita.com/hausen6/items/b1b54f7325745ae43e47

## コード
リアルタイムにカメラ画像から顔認識→顔ランドマーク認識を行い結果をplotします。
https://gist.github.com/yu4u/18de62c37138ff60f6fcb4cfd5d03ad5

```py3
import cv2
import dlib
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import os

predictor_path = "shape_predictor_68_face_landmarks.dat"

# download trained model
if not os.path.isfile(predictor_path):
    os.system("wget http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2")
    os.system("bunzip2 shape_predictor_68_face_landmarks.dat.bz2")

cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(predictor_path)

fig, ax = plt.subplots()

while True:
    ret, frame = cap.read()
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    dets = detector(frame, 1)

    # for each detected face
    for d in dets:
        # draw bounding box of the detected face
        rect = patches.Rectangle((d.left(), d.top()), d.width(), d.height(), fill=False)
        ax.add_patch(rect)

        # draw landmarks
        parts = predictor(frame, d).parts()
        ax.scatter([point.x for point in parts], [point.y for point in parts])

        for k, point in enumerate(parts):
            ax.text(point.x, point.y, k)

        ax.imshow(frame)
        plt.pause(0.1)
        plt.cla()
```
Riot+SATで数独ソルバー

以前、ブラウザ内で動くSATソルバーを使ってパズルのソルバーを作っていましたが、じつは**表示＆入力部分**を作るほうが圧倒的に面倒だということもあって、しばらく放置していました。最近知ったRiotを使えば、このあたりの複雑性もなんとかなりそうだと思ったので、アルゴリズム自体に悩むことがほぼない数独で試作してみました（[https://jkr2255.github.io/js_puzzle_solvers/sudoku.html](https://jkr2255.github.io/js_puzzle_solvers/sudoku.html)）。

# 入力＆表示部分
今までは、「内部的な盤面データ」と「表示」を連動させる処理にてこずっていたのですが、Riotを使えば、内部用のデータを書き換えるだけで、あとは`.update`すれば表示は適宜書き換えてくれます。マス目自体は`<table>`で適宜CSSをかけて表現しています。

# ビルド方法
JavaScriptのビルドシステムを[browserify+rakeで組んでいた](http://qiita.com/jkr_2255/items/7e3f464721bb39c457da)のですが、Riotを加えるにあたってどうしようかなと悩みました。`riotify`という手も考えたのですが、コマンドラインコンパイラの`riot`に`-m`というオプションがあって、コンパイルを行うと以下のようなコードを吐きます。

```riot-m.js
(function(tagger) {
  if (typeof define === 'function' && define.amd) {
    define(function(require, exports, module) { tagger(require('riot'), require, exports, module)})
  } else if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
    tagger(require('riot'), require, exports, module)
  } else {
    tagger(window.riot)
  }
})(function(riot, require, exports, module) {
riot.tag2('tag-name', 'html', 'css', function(opts) {
 // 略
});
});
```

UMD的な形となっていて、「非同期RequireJS」「CommonJS（NodeやBrowserify）」「Riotを`<script>`で読み込んだブラウザ環境」のいずれにも対応できます。Riotコンパイラでここまで生成して、あとはBrowserifyに投げる、という形を取りました。

なお、この形でコンパイルされると、`require()`しても何も返ってきません。依存関係を明示するために`require()`だけ書いて、返り値は使わない、というちょっと見慣れない書き方となりました。

# アルゴリズム
数独ならそれ専門にアルゴリズムを考えてもそこまで手間はかからないのですが、[SATソルバーに丸投げ](http://qiita.com/jkr_2255/items/3330e62ae28662fd769d#%E8%A7%A3%E3%81%8D%E6%96%B9%E3%81%AE%E6%96%B9%E9%87%9D)すれば、本当に「数独の条件そのまま」を起こすだけで終わりです。あとは何も考えなくてもSATソルバーがすべて処理していきます。

なお、「全体で81個」ということが決まれば明らかだと、「同じ列に2個以下」など一部の条件を省略していたところ、ソルバーに3秒くらいかかってしまいました。サボらずに全部条件を開くと、数十ミリ秒まで高速化しました。

# 改良したい点

* 表出の数字と、ソルバーが埋めていった数字の区別
* 別解がある場合に、一意に決まる場所だけ埋めていく機能
AWS Step FunctionsのワークフローをGUIで描く

# はじめに
AWS Step FunctionsではワークフローをJSONで記述しグラフィカルに確認することができます。
しかし、意図した通りのワークフローをJSONで正しく記述するのはなかなか難儀です。

この課題を解決するAWS Step FunctionsのワークフローをGUIで描けるツールを公開しました。

- [AWS Step Functions Workflow Designer](https://github.com/sakazuki/step-functions-draw.io)

ExcelやPowerPointの図形を使う感覚で、ワークフローを作り、作ったワークフローからJSONをエクスポートすることができます。

- 2019/09/25追記  
  v0.4.0～インポートにも対応しました。2019/09にサポートされたMap Stateも対応済みです。

# 特徴
どんなものかは紹介動画をご覧ください
[![intro](https://img.youtube.com/vi/NrMcFdTdhhU/0.jpg)](https://youtu.be/NrMcFdTdhhU)

- [AWS Step Functions Workflow Designer](https://github.com/sakazuki/step-functions-draw.io)は、[draw.io](https://github.com/jgraph/draw.io)のプラグインとして作りました。
- [draw.io](https://github.com/jgraph/draw.io)はブラウザ上でフリーで使えるVisioライクの作図ツールです。
- [draw.io](https://github.com/jgraph/draw.io)の機能をすべて使えるので、作成したワークフローをライブラリに保存して部品として再利用することも簡単です。

# 最後に
現行は、AWS Javascript SDKのStepFunctionsがCORSに対応していないため、デプロイと実行はできません(メニューが無効になっているのはそのせいです)。
AWS developer forumでCORS対応のリクエストを出していますが、リクエストが実現されればデプロイと実行も実装予定です。

是非お試しください。フィードバックもお待ちしています。
Concourse CIをDocker for Macで動かしてdarwin workerを追加する


Docker for MacをつかってConcourse CIを動かすとtaskのplaftformがLinuxの場合上手く動かないらしい。
別途OS Xバイナリでworkerを動かしてやるとplatformがdarwinであれば動かすことができました。

基本以下の通りに行う。

* https://concourse.ci/docker-repository.html

つかったdocker-composeです。 port 2222を空けてます。


```docker-compose.yaml
concourse-db:
  image: postgres:9.5
  environment:
    POSTGRES_DB: concourse
    POSTGRES_USER: ${DATABASE_USER}
    POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
    PGDATA: /database

concourse-web:
  image: concourse/concourse
  links: [concourse-db]
  command: web
  ports: ["1111:8080", "2222:2222"]
  volumes: ["./keys/web:/concourse-keys"]
  environment:
    CONCOURSE_BASIC_AUTH_USERNAME: ${CONCOURSE_USER}
    CONCOURSE_BASIC_AUTH_PASSWORD: ${CONCOURSE_PASSWORD}
    CONCOURSE_EXTERNAL_URL: ${CONCOURSE_EXTERNAL_URL}
    CONCOURSE_POSTGRES_DATA_SOURCE: |-
      postgres://${DATABASE_USER}:${DATABASE_PASSWORD}@concourse-db:5432/concourse?sslmode=disable
      
concourse-worker:
  image: concourse/concourse
  privileged: true
  links: [concourse-web]
  command: worker
  volumes: ["./keys/worker:/concourse-keys"]
  environment:
    CONCOURSE_TSA_HOST: concourse-web
```

別途workerを起動します。

```
sudo concourse worker \                                19:32:34
                   --work-dir work \
                   --tsa-port 2222 \
                   --tsa-host localhost \
                   --tsa-public-key keys/worker/tsa_host_key.pub \
                   --tsa-worker-private-key keys/worker/worker_key
```

試しに用意したpipeline

```hello-darwin.yml
resources:
- name: every-1m
  type: time
  source: {interval: 1m}

jobs:
- name: navi
  plan:
  - get: every-1m
    trigger: true
  - task: say-hello
    config:
      platform: darwin
      run:
        path: echo
        args: ["Hello, world!"]

```

```
fly -t ${TARGET} set-pipeline -p hello-darwin -c hello-darwin.yml
```


# その他はまったこととか

workerはdarwinがいるから削って大丈夫だろうと思って、docker-composeのworkerを削ってたんですが、付属のResourceはLinuxのworkerがいないとダメだそうです。

参考: http://stackoverflow.com/a/39862784/1276598
JavaのPrivateメソッドやフィールドにアクセスする方法

主に自分が不甲斐ないせいでJavaを2週間くらい放置していたのですが、開発も佳境に突入しいざJUnitでテストすんべ！と奮い立ち、アクセス修飾子がPrivateのメソッドやフィールド変数を使おうとしても当然のごとく他クラスからは呼べないわけで（　＾ω＾）・・・

でもまぁいろいろ調べてみたらできちゃったのでメモっておきます。
よかったら肥やしにしてみてください。

使用環境：
OS:Windows 10
java ver：8
IDE:eclipse 4.6 Neon

## Jarファイルをダウンロードしよう
外部サイト（https://ja.osdn.net/projects/sfnet_junit-addons/releases/)
からjunit-addonsのJarファイルを入手します。

てきとーなローカルディレクトリに保存してください。

## Jarファイルを追加しよう
eclipseを起動し、[パッケージ・エクスプローラ]上で右クリックし、[ビルド・パス]→[ビルドパスの構成]→[javaのビルド・パス]から外部Jarを追加します。

![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/162354/04583f72-091a-0541-0c27-5d0cbdb37e5d.jpeg)


これで準備完了。

### ちなみにAPI仕様はどんな感じ？

http://junit-addons.sourceforge.net/junitx/util/PrivateAccessor.html

ふむふむ。

さっぱりわかんねぇ。

おしえてぐーぐるせんせー！

## ごちゃごちゃ動かす

テストプログラムを用意します。
まずはテスト対象のプログラムから。

```Sample.java
public class Sample {

//	privateなフィールド変数
	private int x = 10;

//	privateでstaticなフィールド変数
	private static int y = 20;

//	privateなメソッド
	private String testMethod(String x){

		return x;
	}

//	privateでstaticなメソッド
	private static String testStaticMethod(String y, String z){

		return y + z;
	}

}
```

次にJUnit用にクラスファイルを用意します。

```SampleTest.java
import static org.junit.Assert.*;

import org.junit.Test;

import junitx.util.PrivateAccessor;

public class SampleTest {

	@Test
	/**
	 * privateのフィールド、メソッドにアクセスするテスト関数
	 */
	public void privateGetField() throws Throwable {
		Sample sample = new Sample();

		try {

//			privateなフィールド変数にアクセスするためのメソッド。
//			第一引数:テスト対象クラスのインスタンス変数 第二引数:アクセスしたいフィールド変数名
			int x = (int)PrivateAccessor.getField(sample, "x");

//			アサーションにより実測値と期待値を比較
			assertEquals(x,10);

//			privateでstaticなフィールド変数も同様の手法でアクセスできる。説明省略
			int y = (int)PrivateAccessor.getField(sample, "y");
			assertEquals(y,20);


//			privateな関数にアクセスするためのメソッド。
//			第一引数:テスト対象クラスのインスタンス変数 第二引数:アクセスしたいフィールド関数名
//			第三引数:引数の型の配列 第四引数:引数の値の配列
			String method_x = (String)PrivateAccessor.invoke(	sample,
																"testMethod",
																new Class[]{String.class},
																new Object[]{"private_x"});
			assertEquals(method_x,"private_x");

//			privateでstaticな関数も同様の手法でアクセスできる。引数の型の数に応じて第三、第四引数を工夫すること
			String method_y = (String)PrivateAccessor.invoke(	sample,
																"testStaticMethod",
																new Class[]{String.class,String.class},
																new Object[]{"private_","static_y"});
			assertEquals(method_y,"private_static_y");


		} catch (NoSuchFieldException e) {

			e.printStackTrace();

		}finally{

		}
    }
}
```

## 実行

どや！

![2017y02m12d_220044187.jpg](https://qiita-image-store.s3.amazonaws.com/0/162354/c1fc5f43-d5d5-f551-db6a-6c7e0608cbf9.jpeg)

できた！

###　おまけ

privateなフィールド変数に値をセットすることもできちゃったり。

```SampleTest.java

//途中省略

	@Test
	/**
	 * privateなフィールド変数に値をセットする関数
	 */
	public void privateSetField(){

		Sample sample = new Sample();

		try {

//			第一引数：テスト対象クラスのインスタンス変数 第二引数：変数の名前
//			第三引数: セットしたい値
			PrivateAccessor.setField(sample, "x", 100);

//			セットできたか確認！
			int get_x = (int)PrivateAccessor.getField(sample, "x");
			assertEquals(get_x,100);

		} catch (NoSuchFieldException e) {

			e.printStackTrace();

		}finally{

		}
	}


```

おわりっ
DE0-Nanoでダブルパルス

DE0-Nanoでダブルパルスを出すVerilog HDLのリスト。
初学者ゆえ、よくわかっていないで書いている部分が多々あります。
「こういう書き方のほうがよい」等のアドバイスをいただけると助かります。

```verilog
module double_pulse(CLOCK, GPIO);

	input CLOCK;  // 50MHz. 1clock = 20nsec.

	output [33:0] GPIO;

	parameter [17:0] pulse_cycle = 199999;  // 200000*20nsec = 4000usec

	parameter [17:0] pulse1_start = 0;
	parameter [17:0] pulse1_width = 200;  // 200*20nsec = 4usec

	parameter [17:0] pulse_interval = 25000;  // 25000*20nsec = 500usec

	parameter [17:0] pulse2_start = pulse1_width + pulse_interval;
	parameter [17:0] pulse2_width = pulse1_width;

	reg [17:0] pulse_cycle_count = 0;
	reg pulse;

	always @(posedge CLOCK) begin

		if(pulse_cycle_count == pulse_cycle) begin
			pulse_cycle_count = 0;
		end

		else begin
			pulse_cycle_count = pulse_cycle_count + 1;
		end

	end

	always @(posedge CLOCK) begin

		if(pulse_cycle_count == pulse1_start) begin
			pulse = 1;
		end

		else if(pulse_cycle_count == pulse1_start + pulse1_width) begin
			pulse = 0;
		end

		if(pulse_cycle_count == pulse2_start) begin
			pulse = 1;
		end

		else if(pulse_cycle_count == pulse2_start + pulse2_width) begin
			pulse = 0;
		end

	end

	assign GPIO[0] = CLOCK;
	assign GPIO[1] = pulse;

endmodule
```
![DSC_0057.JPG](https://qiita-image-store.s3.amazonaws.com/0/14792/e98636d9-3c34-cf55-a3a6-da42a4ea112d.jpeg)

やっていることは単純にクロックでカウンターを回して周期をつくり、何クロック目でパルスをオン/オフするか条件分岐しているだけです。
だから分解能は20nsec。
どうにか工夫して10nsecまであげられないものでしょうか。
【PHP】クラス

PHPのクラスについての初学者向け記事です( 厂˙ω˙ )厂

## クラスとは
定数・変数・関数などを記述することができます。
複数の処理をまとめておく部屋、みたいな感じ。namespace(名前空間)と合わせて覚えるとよいです。

PHP書き始めた頃は「クラスって必要なの？ディレクトリと違うの？」と思っていたんですけど、規模が大きくなったりフレームワークを使ったりするには必要なんですよね。

[クラスの基礎](http://php.net/manual/ja/language.oop5.basic.php)

## 書き方

```php
<?php

class Hoge
{
	protected $hoge;
	
	public function __construct(string $hoge)
	{
		$this->hoge = $hoge;
	}
	
	・・・
	
	public function greeting(string $name)
	{
		echo 'Hello, '. $name;
	}
}
```

`class XX`という部分がクラス名です。（ここでは`Hoge`）

宣言の前に`protected`や`public`とついているのは、クラス外からのメソッドや変数へのアクセス権を表します。
`public` や `protected` の場合、クラス内ではお互いに `$this` を使って呼び出すことが出来ます。

`__construct()`メソッドは、クラスを呼び出すときに必ず最初に実行される処理です（コンストラクタと呼びます）。
コンストラクタに引数を設定することも出来ます。

上記では省略していますが、コンストラクタでセットした値（ `$this->hoge` )はクラス内のメソッドで使われます。

## クラスの呼び出し
クラスは、他の場所から呼びだして使うことが出来ます。

呼び出す際に新たにクラスのコピーを生成して使います。聞きなれない言葉ですが、コピーしたものを「オブジェクト」や「インスタンス」と呼び、コピーして生成することを「インスタンス化」と言います。

```php
$hoge_class = new Hoge('hoge');
echo $hoge_class->greeting('Tom'); // 'Hello, Tom'
```

`new` するとインスタンス化できます。 `$hoge_class` の中にHogeクラスのコピーが入ります。
`->` というアロー演算子でHogeクラスのメソッドを呼び出します。（publicの場合）

※アクセス権については、長くなるのでまた別記事で書ければと。。

## なぜクラスを書くのか
`require` や `include` を利用して別ファイルのメソッドを呼び出すことも出来ますが、どこから呼び出した何に使うメソッドなのかが視認しづらくなります。
設計の話も含んできますが、メソッドがどんな働きをするのか、どの部分に属しているかなどを示す手がかりになります。（と、私は認識しています。）

有名な設計の考え方である「オブジェクト指向」についても絡めたいのですが、かなーり深い話になるので参考リンクを。
オブジェクト指向って結局なんだ？！って悩んだ時に何度も読ませてもらった記事です。

[PHPオブジェクト指向入門（前半）](http://qiita.com/mpyw/items/41230bec5c02142ae691)

いつか自分の言葉でオブジェクト指向をまとめたい。。

## クラスの命名
クラス名の命名ルールは、プロジェクト内では統一するのが良いです。例えば、

* クラス名は大文字から始める
* 「HogeContoller」、「HogeModel」など機能名を持たせる
* 「Users」「Articles」など複数形にする

などです。フレームワークによってはルールに乗っ取らないと正しく動作しない場合もあるので注意が必要です。

クラス名の命名から少し外れますが、ルールがよくわからない場合はコーディング規約を参照してみましょう。
[psr-2](http://www.infiniteloop.co.jp/docs/psr/psr-2-coding-style-guide.html)に準拠することが多いです。
Laravelアプリをdeployerでデプロイ時にenvが読めなくなったら確認すること


ハマった際になかなか言及している記事に出会えなかったのでメモ。

## 検証環境
* Laravel 5.3.1
* PHP 7.0.1

## デプロイヤーが実行しているタスクを確認

Laravel向けのdeploy.phpを生成していくと、デフォルトで `artisan:config:cache` を実行しています。
これは設定を `/bootstrap/cache/config.php` にキャッシュして利用するもの。パフォーマンスを向上してくれます。

## プログラム内のenv()を確認

上記のキャッシュを利用すると、プログラム内で `env()` 関数で読めなくなります。

キャッシュファイルを利用する場合は、 `config()` を利用しましょう！

```php

// 修正前
$value = env('app.hoge');

// 修正後
$value = config('app.hoge');

```

どんな処理をしてくれてるかよく理解しようねというお話でした・・・。
RMagickのインストールで checking for wand/MagickWand.h... no となる対処法

本日（2017/02/12）現在、rmagickはImageMagickの7に対応していない（[Now RMagick 2.15.4 can&#39;t be built with ImageMagick 7.0.x · Issue #256 · rmagick/rmagick](https://github.com/rmagick/rmagick/issues/256)）。

macOSなら下記手順でImageMagickのバージョン6を明示的に指定すると、 `bundle install` が通った。

```
brew install imagemagick@6
brew link imagemagick@6 --force
```

## 参考文献

- [ruby - RMagick installation: Can&#39;t find MagickWand.h - Stack Overflow](http://stackoverflow.com/questions/39494672/rmagick-installation-cant-find-magickwand-h)
JenkinsにてiOSアプリのバージョン番号の末尾に文字列を追加するシェルスクリプト

iOSアプリの開発中に、しばしば特定用途向けのビルドを作成するのですが、後で端末にインストールされたアプリを見た時に「あれ？これは何用にビルドした奴だっけ？」となることがあります。

そこでJenkinsでiOSのアプリをビルドする直前に、バージョン番号の末尾に任意の文字列を追加するようにInfo.plistを書き換えるシェルスクリプトを考えました。
これをビルド前に実行すれば「1.20.0」などのバージョン番号の末尾に「1.20.0-Debug」のように文字列を追加できます。

```shell-session:
INFO_PLIST="MyProject/Info.plist"
VERSION_SUFFIX="-Debug"

ORIG_VERSION=`xmllint --xpath '/plist/dict/key[text()="CFBundleShortVersionString"]/following-sibling::string[position()=1]/text()' "${INFO_PLIST}"`
NEW_VERSION="${ORIG_VERSION}${VERSION_SUFFIX}"
plutil -replace 'CFBundleShortVersionString' -string "${NEW_VERSION}" "${INFO_PLIST}"
```

`INFO_PLIST`は各自の環境に合わせて変更してください。
`VERSION_SUFFIX`にバージョンの末尾に追加する文字列を指定します。パラメータビルドでパラメータとして与えてあげるのも便利です。
TensorFlow Introductionに関する覚え書き


[TensorFlow Introduction](https://www.tensorflow.org/get_started/)を読みながら調べたことを書き残しておきます。

Introductionに書かれているコードを全て繋ぎあわせると、以下のようになります。

```python
import tensorflow as tf
import numpy as np

# Create 100 phony x, y data points in NumPy, y = x * 0.1 + 0.3
x_data = np.random.rand(100).astype(np.float32)
y_data = x_data * 0.1 + 0.3

# Try to find values for W and b that compute y_data = W * x_data + b
# (We know that W should be 0.1 and b 0.3, but TensorFlow will
# figure that out for us.)
W = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
b = tf.Variable(tf.zeros([1]))
y = W * x_data + b

# Minimize the mean squared errors.
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)

# Before starting, initialize the variables.  We will 'run' this first.
init = tf.global_variables_initializer()

# Launch the graph.
sess = tf.Session()
sess.run(init)

# Fit the line.
for step in range(201):
    sess.run(train)
    if step % 20 == 0:
        print(step, sess.run(W), sess.run(b))

# Learns best fit is W: [0.1], b: [0.3]
```
https://www.tensorflow.org/get_started/



###  Broadcasting operation

```python
y = W * x_data + b
print(type(W)) # <class 'tensorflow.python.ops.variables.Variable'>
print(type(b)) # <class 'tensorflow.python.ops.variables.Variable'>
print(type(x_data)) # <class 'numpy.ndarray'>
print(type(y)) # <class 'tensorflow.python.framework.ops.Tensor'>
```

ここではtf.Variableとnumpy.ndarrayを掛けており、ギョッとするのですが、Tensorflowはnumpy-styleのブロードキャストをサポートするようです。詳しくは[Stackoverflow](http://stackoverflow.com/questions/37240715/tensorflow-implicit-broadcasting-in-element-wise-addition-multiplication)と[Glossary](https://www.tensorflow.org/resources/glossary)を見るとよいです。


### Convert numpy to tensor

tf.Variableとtf.constantにはnumpy.ndarrayオブジェクトを直接渡すことができます。

```python
import tensorflow as tf
import numpy as np

a = tf.Variable(np.arange(10))
c = (np.zeros(10))

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(sess.run(a)) # [0 1 2 3 4 5 6 7 8 9]
    print(sess.run(c)) # [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
```

[Quora](https://www.quora.com/Is-it-possible-to-initialize-tensors-in-TensorFlow-with-numpy)にて、TensorFlow team at Googleの方が

> Yes, the TensorFlow API is designed to make it easy to convert data to and from NumPy arrays:

と述べています。

### Convert tensor to numpy

tensorからnumpyに変換するには、Session.run か eval でOKです。

```python
import tensorflow as tf
import numpy as np

x = tf.zeros([10])

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    
    print(type(sess.run(x)))
    print(type(x.eval()))
```

なお、[APIドキュメント](https://www.tensorflow.org/api_docs/python/framework/core_graph_data_structures#Tensor.eval)を見る限り、x.eval() は sess.run(x) のシンタックスシュガーだと思ってよさそうです。
postgresql よく使うコマンド集

- postgresql操作(OSはCentOS7を想定)

| 操作 | コマンド |
|:--|:--|
|postgresqlインストール確認 | rpm -qa &#124; grep postgres |
|postgresql起動 | pg_ctl start -w  |
|postgresql起動確認 |  ps -ef &#124; grep postgres |
|postgresql停止 | pg_ctl stop -m fast  |
|postgresユーザのパスワード変更 | passwd postgres  |

- データベース操作

| 操作 | コマンド |
|:--|:--|
|データベースへ接続 | psql &lt;DB_NAME&gt; |
|データベースから出る | \q  |
|データベース一覧表示 | \l  |
|データベースの切り替え | \connect &lt;DB_NAME&gt;  |
|データベースの作成 | create database &lt;DB_NAME&gt;;  |

- スキーマ操作

| 操作 | コマンド |
|:--|:--|
|スキーマ作成 | create schema &lt;SCHEMA_NAME&gt;; |
|スキーマ確認|select current_schema;|
|スキーマ一覧|\dn|
|スキーマ変更|set search_path to &lt;SCHEMA_NAME&gt;;|

- テーブル操作

| 操作 | コマンド |
|:--|:--|
|テーブル一覧表示(viewやsequenceも含む) | \d |
|テーブル一覧表示|\dt|
|テーブルのスキーマの詳細を表示|\d &lt;TABLE_NAME&gt;|
|テーブルの作成|create table &lt;TABLE_NAME&gt; (&lt;column_name&gt; &lt;column_type&gt;);|
|テーブルの作成例| create table people (name VARCHAR(255));|


- 参考
  - postgresql起動・停止 http://ossfan.net/manage/postgresql-11.html
  - コマンド一覧 http://dev.classmethod.jp/server-side/db/postgresql-organize-command/