OmniAICreator/Qiita-1.07M huggingface dataset:
[読書メモ]学習する組織 - 第８章「自己マスタリー」

# なんの本か？
ざっくりすぎて何も言ってないのと、同じレベルのことを言うと組織力を強化するためには学習を続けることが必要ですよという話です。
なんの本なのかについてのよりちゃんとした記述は、全体を読んでからまとめる時に書きます。

# なんで読んだのか？
組織力強化について、自分なりに思いを巡らし始めていた。
そんな時に横山さんに推薦されて面白そうだったから。


# 学習する上で重要な要素（自己マスタリー）
本書の中では5つの重要な要素が述べられています。しかし、今回は以下に絞ろうと思います。

- 自己マスタリー

## 自己マスタリーとは？
```定義
継続的に自分の個人ビジョンを明確にし、それを深めること。自分にとって本当に大切なことを明確にし、自分の最高の志に仕える人生を送ること。
```
自己マスタリーを自分の人生に一体化させると、以下の二つのことが起こる。
1. 常に自分にとって何が大切かを明確にしようとする。
2. 常に今の現実をよりはっきりと見る方法を学ぶ。

ビジョン（本当に自分にとって大切なもの（目的地））と現在の自分の状況の間には創造的緊張が生まれる。
この理想と現実の乖離（創造的緊張）こそが、真の創造的エネルギーである。
つまり目的地と自分の現在のレベルの間にあるギャップがあり、そのギャップの解決に向けて人は学習をする。

### 成長を阻害するものたち
#### 感情的緊張
現実と理想のギャップに立ち向かう時、悲しみ、落胆、絶望、心配などの気持ちや感情をもたらすことはよくある。
「あんなに頑張ってもまだまだ届かない。」
「どうせ自分には無理なんだろう。」
と言った感情である。
これら往往にしてが成長を阻害する要因となる。

これらは、感情的緊張と呼ばれるものである。
そして、これらは創造的緊張そのものではないと言うことを認識することが大切である。

この症状が現れると、対処法としては以下の二つが考えられる。
1. 現状をよくする。
2. 理想を引き下げる。

しかし、理想を引き下げるのは危険である。
なぜなら、理想を引き下げて安堵したとしても、それは根本的な解決ではない（つまり、自分の到達したい目標ではない）ためである。さらには目標のなし崩しに繋がる危険もあるためである。
イギリスの小説家・サマセットモームが言うところの __「月並み人間だけが常に最高の自分でいられる」__ と言う状態になってしまう。

#### 構造的対立
自分たちの潜在意識下にある自分に対する限界、これがより大きな成長阻害要因である。
自分の達成しようとする目標に対して、「まさか、そんなことができるはずがない」とか「自分には価値がない」などと言った意識の奥深いことで思ってしまっている感情。
これが、自分が目標に向かって進む過程で発生する。

この対立の影響は「本当にその目標を望んでいるのか」と疑問を持ったりして、自分にストップをかけてくる。

#### 構造的対立を克服するためには？
真実に忠実である必要がある。
構造的対立では、無意識のうちに成長阻害要因に引っ張られて、目的への歩みを止める結果になってしまっていた。
なぜ物事が現状のようになっているかについての持論を絶えず疑うこと、そうすることで自分の行動の根底にある構造的対立がよく見えるようになる。

```構造的対立とその結果を見つめた例
「私が今諦めようとしている理由は、誰も私を認めてくれないからだ」
```

認識できると言うことは、対処もできると言うことになる。
Vue.jsでSPAサイトを作成するチュートリアル【5.  JS編】

Vue.jsを使い始めていろいろできることが多くなってきたので、整理する意味も兼ねてチュートリアルにまとめます。
今回はコーポレートサイトを想定して作成していきます。
※記事が長くなったのでチュートリアルを分割しました。


## 目次

* [表示編](https://qiita.com/buchiya4th/items/cff0b2ab9ebd550c4e0f)
* [ルーター編](https://qiita.com/buchiya4th/items/f154191c8157bbd2239a)
* [コンポーネント編](https://qiita.com/buchiya4th/items/d5a62722f1fc26230df0)
* [CSS編](https://qiita.com/buchiya4th/items/6f5db9f58ee66982438e)
* JS編 ←イマココ
* [ライブラリ編](https://qiita.com/buchiya4th/items/b4814c0018f9311af461)
* [メタ編](https://qiita.com/buchiya4th/items/dd8f16dfcd296bd247bb)
* [ビルド編](https://qiita.com/buchiya4th/items/71649f8fbd2f72b9e6e7)


## 前提

* タスクは`npm scripts`で一限管理
* コマンドは`yarn`を使用
* `vue-cli`の`webpack-simple`を使用


## バージョン

* "vue": "^2.5.11"
* "webpack": "^3.6.0"
* "eslint": "^4.17.0"


## ESLint

ESLintを設定していきましょう。
今回はeslint-config-standardを採用します。

必要なパッケージを追加します。

```bash
$ yarn add eslint eslint-plugin-vue eslint-config-standard eslint-plugin-standard eslint-plugin-promise eslint-plugin-import eslint-plugin-node
```

設定ファイルを追加します。

```txt:.eslintrc
{
  "extends": [
    "standard",
    "plugin:vue/essential"
  ],
  "rules": {
  }
}

```

無視したいファイル群は/vendorにまとめて.eslintignoreファイルを作成して指定すると無視できます。

```txt:.eslintignore
/src/js/vendor/**/*.js

```

参考：[Configuring ESLint](https://eslint.org/docs/user-guide/configuring)


VSCodeを使用している人は、以下を参考にVeturとESLintをインストールして設定すると良いみたいです。

参考：[Visual Studio Code で使う | eslint-plugin-vue を作っている話](https://qiita.com/mysticatea/items/860ce3bf0ff387f166ac#visual-studio-code-%E3%81%A7%E4%BD%BF%E3%81%86)

VSCode以外の人は、各自で使用しているテキストエディタでの設定を調べてみてください。

ESLintはCLIで監視してエラーを表示させることもできますが、集中したい部分に集中できなくなる場合もあるので、個人的にはテキストエディタでの表示が好みです。
しかし、機械的に変換できるエラーは自動的に修正することもできるので、その機械変換させるコマンドはnpm scriptsに記述しておいて使いたい時に実行するようにしましょう。

```js:package.json
{
  // 省略
  "scripts": {
    "eslint": "eslint src --fix",
  // 省略
}
```

これで以下をCLIで実行すれば不要なカンマやセミコロン等を機械的に削除してくれます。
ひとまず、今まで書いたものでエラーが出ているものを一通り確認し、機械的に変換してくれそうなところが以下で変換できれば成功です。

```bash
$ yarn eslint
```

まだテキストエディタで赤くなってエラーになっているところがないか確認し、どんどん潰していきましょう。

以下のようなエラーがどうしても消えない場合があると思います。

```
'app' is assigned a value but never used src/main.js
```

上記は無視しても動作上問題なさそうですが、気になる人は以下の参考にしてみてください。

参考：[【Vue.jsエラー】hogehoge is assigned a value but never used](https://qiita.com/miyamotok0105/items/2c316f9ac3f7e7a67729)

<!--
## Jestの追加


```bash
$ yarn add -D jest vue-test-utils jest-vue-preprocessor babel-jest vue-jest babel-plugin-dynamic-import-node
```

```js:package.json
{
  // 省略
  "scripts": {
    "test": "jest"
  // 省略
  },
  // 省略
  "jest": {
    "moduleFileExtensions": [
      "js",
      "json",
      "vue"
    ],
    "moduleNameMapper": {
      "^@/(.*)$": "<rootDir>/src/$1"
    },
    "transform": {
      "^.+\\.js$": "<rootDir>/node_modules/babel-jest",
      ".*\\.(vue)$": "<rootDir>/node_modules/vue-jest"
    },
    "mapCoverage": true
  }
}

}
```

-->

## まとめ

Vue.js自体がJSなので「JS編ってなんだか気持ち悪いなぁ」とは思いながらJSファイルに関する内容をまとめるところに落ち着きました。
快適な開発環境を構築してストレスがかからず品質を担保できるようにしましょう。
（本当はテスト系ツールも書きたかったんですが、まだ導入していないので導入方法がわかれば掲載しようと思っています。
AssemblyScriptでホスト側のJS関数を呼び出すにはどうすればいい？

Q.AssemblyScriptでホスト側のJS関数を呼び出すにはどうすればいい？

A. こうする

ホスト側

```typescript
function consoleLogString() {
  alert('test!!');
}

// コンパイル時に引き渡すオブジェクト
// envというプロパティにエクスポートしたいものを入れる
const exportToWasm = {
  env:{
    consoleLogString:consoleLogString
  }
};


WebAssembly.instantiateStreaming(fetch("./wa/test.wasm"),exportToWasm).then(mod => {
  const test = mod.instance.exports.test;
  test();
});


```

AssemblyScript(test.ts/test.wasm)側

```typescript
// インポートする関数定義
declare function consoleLogString() : void;

export function test():void {
  consoleLogString();
}
```

以上
機械学習論文読みメモ_116


[Augmented Reality Meets Computer Vision: Efficient Data Generation for Urban Driving Scenes](https://arxiv.org/abs/1708.01566)
Deep learningの利用には大量のラベル付きデータが必要である。
そこでvirtually rendered 3D worldを用いたシミュレーションによるデータ生成が考えられている。
しかしこれに関しても結局人手によるコンテンツ作成が必要であって高コストである。
本論ではこれらに代わり、現実と人工のデータを組み合わせる事でinstance segmentationやobject detectionの学習を行う手法を提案する。
この手法では、シーンの全ての物体が等しく重要な訳ではないことに注目する。
この事を利用しつつ、現実の画像をAugmented Realityの技術を用いて仮想の物体を追加する。
これにより、現実のバックグラウンド画像の上に複雑な物体を増やしていく事が可能になる。
これにより効率よく人工データを作成する事が出来る。

[MegDet: A Large Mini-Batch Object Detector](https://arxiv.org/abs/1711.07240)
CNN-basedのobject detectionはバッチサイズとして２を選択するのが一般的であった。
一方で画像分類などではバッチサイズは256が選択されるのが一般的で対照的になっている。
小さいバッチサイズを用いた時の問題は、学習時間が長くなる事、BNを適用する際に
統計量が上手く推定出来ないこと、バッチ内においてimbalancedな分布になる事。
本論では上記問題に対処する大きなバッチサイズの学習を可能にする手法を提案した。
大きなバッチサイズを利用する事の問題としては、learning rateを大きくしなければモデルの
精度を維持出来ない問題がある事である。
しかしlearning rateを大きくすると収束性に問題がある。
本論では、learning rateを適応的に変える事で対応する。
具体的にはgradientの分散を維持する事、小さいrateから開始して少しづつ増やす、
Warp up戦略を用いた。
またBNの問題に関してはcross GPUでの処理スキームを提案する事で、大きなバッチサイズでの
BNを実現し、統計量推定の精度を改善した
結果、本手法はMS COCO2017で一位を達成した。

[Semantic Change Detection with Hypermaps](https://arxiv.org/abs/1604.07513)
異なった時間に撮られたあるシーンの画像に対してその違いを、その意味を含めて検出する。
これはdisaster detectionなどにおいて、変化が検出された場所においてそれがどのような変化であるか人が判断するのが難しい場合があるため、重要である。
本論ではこの問題に対して、semantic change detectionと呼ばれる手法を提案する。
この手法ではCNNの抽出特徴とchange detectionの組み合わせにより、変化点検知と、その変化内容の
意味的のclassificationを行う。
特にCNNを用いた特徴抽出に関して、従来手法である各層の特徴を組み合わせるhyper columnを
改良したhyper map特徴を用いる。
またマルチスケールの入力を用いる事で性能を改善した。
Graphvizを使ってPHPで簡単にツリー構造を描画する

# Graphvizとは
ファイル構造とかクラスの継承関係などを見える化するのに便利なツールです。本来DOTという言語で書かれたものをビジュアライズさせるツールだそうです。

[Graphvizとdot言語でグラフを描く方法のまとめ](https://qiita.com/rubytomato@github/items/51779135bc4b77c8c20d)

# 必要なものをインストール
そんな便利なGraphvizを今回はPHPから扱いたいと思います。
Graphviz自体とそれをPHPから使うためのパッケージを[PEAR](http://pear.php.net/package/Image_GraphViz)からインストールします。

```bash
$ brew install graphviz
$ pear install Image_GraphViz
```

#　サンプルコード
例としてA-Zの文字列を二分木しました。階層ごとにフォントを小さくしてます。

```php
<?php

require_once 'Image/GraphViz.php';

$a = range('A','Z');
$font_size = 20;
$file_name = 'data.png';

$g = new Image_GraphViz();

// ノードの登録
for ($i=0; $i < count($a); $i++) {
	$g->addNode(
		$a[$i],
		[
			'fontsize' => $font_size*(0.8**(strlen(decbin($i+1))-1)),
			'shape' => 'box'
		]
	);
}

// エッジの登録
for ($i=0; $i < count($a); $i++) {
	if ($i != 0) {
		$g->addEdge(
			[
				$a[floor(($i-1)/2)] => $a[$i]
			],
			[
				'label' => $a[floor(($i-1)/2)].'_'.$a[$i]
			]
		);
	}
}

// PNGで出力
file_put_contents($file_name,$g->fetch('png'));
```

ノードを登録し、それらをエッジで結ぶように書くだけ。実にシンプルです。

## 出力結果
![data.png](https://qiita-image-store.s3.amazonaws.com/0/203213/6b39e57e-7d25-039c-1af3-fdc8df043075.png)
Ubuntu でコマンドラインから JUnit を使う

普段は Java をあまりやらないのですが、少しだけ JUnit が使いたかったので、さくっと使える方法をメモ。

「Ubuntu で」と言っておきながら、確認環境は「Bash on Ubuntu on Windows」の「Ubuntu 16.04.3 LTS」ですが、本物でも大丈夫だと思います。

# 1. JUnit 3

## 1.1. インストール

```shell
sudo apt install junit
```

## 1.2. コンパイル

```shell
javac -cp ./:/usr/share/java/junit.jar TestClassName.java
```

本当は jar を環境変数 CLASSPATH に追加するのが良い。

## 1.3. 実行

```shell
junit TestClassName
```

`java なんちゃら`でも実行できるけどこっちの方が便利。

# 2. JUnit 4

## 2.1. インストール

```shell
sudo apt install junit4
```

## 2.2. コンパイル

```shell
javac -cp ./:/usr/share/java/junit4.jar TestClassName.java
```

jar に長いバージョン名を付けなくても大丈夫。

## 2.3. 実行

```shell
java -cp ./:/usr/share/java/junit4.jar org.junit.runner.JUnitCore TestClassName
```

JUnit 4 の方には `junit4` コマンドなるものはないみたい少し残念…。
自作しようと思えばすぐできそう？

# 3. その他参考

- 「[JUnit4メモ(Hishidama's JUnit4 Memo)](http://www.ne.jp/asahi/hishidama/home/tech/java/junit/junit4.html)」
    - JUnit 3 と JUnit 4 の違いなど
Swift UICollectionViewにおいてCell選択時に色を変える設定

通常UICollectionViewのCellはタップ（選択）されてもCELLの色は変わりませんが、下記設定にて可能となる。
１、選択されたCellの色を変える設定
  タップしたときの背景色
  cell.selectedBackgroundView = dateManager.cellSelectedBackgroundView(UIColor.lightGrayColor())

２、セルをタップしている間は色を変え、離したら元の色に戻る処理。
    func collectionView(collectionView: UICollectionView, didHighlightItemAtIndexPath indexPath: NSIndexPath) {
        let cell = collectionView.cellForItemAtIndexPath(indexPath)!
        cell.backgroundColor = UIColor.clearColor() // タップしているときの色にする
    }
func collectionView(collectionView: UICollectionView, didUnhighlightItemAtIndexPath indexPath: NSIndexPath) {
        let cell = collectionView.cellForItemAtIndexPath(indexPath)!
        cell.backgroundColor = UIColor.darkGrayColor()  // 元の色にする
    }
CakePHP＋SmartyでのpostLink使用上の注意

#はじめに
私のような人が今後出ないようにメモしておきます。
ちなみに私はPHPはほぼ初心者なので、上級者の方はこんなことでは躓かない…のかもしれません。

#確認ダイアログを出した上で選択されたレコードを削除して」と言われたので…
CakePHPには[FormHelper::postLink()メソッド](https://book.cakephp.org/2.0/ja/core-libraries/helpers/form.html)というものがあります。
参考になる記事は[こちら](http://note.onichannn.net/archives/865)。
その記事の中で以下の通り例があったわけです。

```postlink.php
<?php echo $this->Form->postLink('Submit', array('controller' => 'Hoges', 'action' => 'complete'), array('data' => $data)); ?>
```

第2引数で、連想配列でControllerとActionを指定、第3引数ではFormのデータおよびaタグのattributeをやはり連想配列で指定するようになっています。
というわけで以下みたいに作ったところ…PhpStorm上でエラー発生。

```postlink.tpl
{$this->Form->postLink('削除',
array('controller' => 'ProgressList', 'action' => 'delete'),
array('data' => $project_id, 'class' => 'btn2', 'style' => 'background: red; font-weight: normal; text-decoration: none'), 
'削除してよろしいでしょうか？')}
```
まぁこれは理由は簡単で、Smartyのtpl内ではPHPの関数がそのまま使えないんでエラーになってしまっていたわけです（私はしばらく気が付きませんでしたが）
気を取り直して、array関数を使っていたところをリテラルで書き直して、これでいける…と思いきや、第3引数から作られるはずのhidden属性のinputタグが作られない…。

```postlink.tpl
{$this->Form->postLink('削除',
['controller' => 'ProgressList', 'action' => 'delete'],
['data' => $project_id, 'class' => 'btn2', 'style' => 'background: red; font-weight: normal; text-decoration: none'], 
'削除してよろしいでしょうか？')}
```
[ここの説明](http://note.onichannn.net/archives/853)だと、第3引数にdataというキーの連想配列のレコードを作っておくとhidden属性のinputタグが作られるはずなのに…。
頭を抱えること小一時間、記事を読んでようやく第3引数にはdataというキーで**Formデータを格納しなくてはならない**ことにようやく気付く。
そしてようやくたどり着いたのが↓

```postlink.tpl
{$this->Form->postLink('削除',
['controller' => 'ProgressList', 'action' => 'delete'],
['data' => ["project_id" => $project_id], 'class' => 'btn2', 'style' => 'background: red; font-weight: normal; text-decoration: none'], 
'削除してよろしいでしょうか？')}
```
#まとめ
すげー時間かかった…。
とりあえず次回同じことでハマらないようにしたいです…。
[メモ] swapファイルの作り方

# swapファイルの作り方

AWS の EC2 で t2.micro 使っていて、ついビルドしようとしたらメモリが少し足りなかったので、インスタンスタイプ変えるのもありですけど swapファイル追加しちゃおうという時のメモです。

## 1. swapファイルの作り方

```
# swapon -s
# dd if=/dev/zero of=/swapfile bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 15.7361 s, 68.2 MB/s
# chmod 600 /swapfile
# mkswap /swapfile
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=20d6eaf0-adca-41a7-b8bd-0f03d7bbbfaf
```

## 2. swapファイルの追加

```
# swapon /swapfile
# swapon -s
Filename                                Type            Size    Used    Priority
/swapfile                               file            1048572 0       -1
```

## 3. swapファイルの削除

```
# swapoff /swapfile
```

## 4. /etc/fstabの場合

```
/swapfile        swap        swap    defaults        0 0
```
既存のIAM Userをterraformの管理下へ

# TL;DR

* 既存AWSアカウントに複数のIAM Userがいるのでterraformの管理下におきたい（という話を聞いたので書いた）
* terraform import でちまちまやるとtf戻しもめんどくさい（そりゃそうですね） 
* [terraforming](https://github.com/dtan4/terraforming) 万歳

# 作業

* [dtan4/terraforming: Export existing AWS resources to Terraform style (tf, tfstate)](https://github.com/dtan4/terraforming)
* 詳細はリンク先参照。とても素晴らしいツールをありがとうございます
* docker を使うととても簡単なので使いましょう
* `docker pull quay.io/dtan4/terraforming:latest`
* 走らせるときはaliasにしておくのが楽です。丸コピーして .bashrc にでもどうぞ

```sh
alias terraforming='docker run --rm --name terraforming -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY -e AWS_REGION=$AWS_DEFAULT_REGION quay.io/dtan4/terraforming:latest terraforming'
```

* 走らせる前に環境変数をエクスポートしておきましょう
* セキュリティが気になるなら専用のROロールを用意するとか、環境変数に依存しないやりかたを考えるとかしてください

```sh
export AWS_DEFAULT_REGION=
export AWS_SECRET_ACCESS_KEY=
export AWS_ACCESS_KEY_ID=
```

* お試し

```sh
$ terraforming iamu
resource "aws_iam_user" "terraform" {
    name = "terraform"
    path = "/"
}

resource "aws_iam_user" "test01" {
    name = "test01"
    path = "/"
}
```

* リダイレクトで適当なファイルに送ればOK
* iam系のコマンドをそれぞれファイルに吐けばそれだけでいったん管理は出来る、はず
* あとは分割するなりディレクトリわけるなり、目的に応じた管理単位にすればいいと思います

# 蛇足

元々はユーザ名でリソース管理するのは大変って話だったので、簡素化するための案を１つ書いておきます。

前述のとおり、terraforming で出力した tf データは値は正しいのですが、terraform で実際にリソースを管理するための参照形式にはなっていません。なので、どのみち手を入れることになります。というわけで。

```sh
$ tree iam
iam
|-- test01
|   `-- iam.tf
`-- test02
    `-- iam.tf
```

こんな感じで１ユーザ１ディレクトリ１tfファイル、リソースの名前（nameじゃなくてリソースタイプの次のところの）はthisとかに固定すると楽かなって。

```iam/test01/iam.tf
resource "aws_iam_user" "this" {
  name = "test01"
  path = "/"
}

resource "aws_iam_user_policy_attachment" "test-attach" {
    user       = "${aws_iam_user.this.name}"
    policy_arn = "${aws_iam_policy.policy.arn}"
}

// その他関連リソース
```

前述のように管理体として、iam ディレクトリ、ユーザ名ディレクトリ、にしておいて、[こんな感じのコマンド](https://github.com/terraform-aws-modules/terraform-aws-vpc/blob/master/.circleci/config.yml#L21)でぶん回せば、管理しやすいのではないか、と思いました。
LaravelにAspectMock

# 追記

```
laravel/framework (v5.5.33 => v5.5.39)
```

にして

```
goaop/framework (2.1.2 => 2.2.0)
```

になったらエラーが出るようになりました。

```
PHP Fatal error:  Uncaught RuntimeException: You need to provide valid cache directory for Go! AOP framework
```

[GoAOP deprecated StreamMetaData->source](https://github.com/Codeception/AspectMock/issues/146)

```
goaop/framework
```

2.2.0からエラー

cacheDirが必須になっていた。
これを追加してもエラーなので

```
"goaop/framework": "2.1.2",
```

で戻してインストールを行えば良い。

[こっち](https://github.com/goaop/framework/issues/363)でデフォルト値（/tmp）を設定するかもしれない。

# 使い方

[AspectMock](https://github.com/Codeception/AspectMock)

## インストール

```
composer require codeception/aspect-mock:* --dev
```

## 設定

```php:tests/autoload.php
<?php

require_once __DIR__ . '/../vendor/autoload.php';

$kernel = \AspectMock\Kernel::getInstance();
$kernel->init([
    'debug' => true,
    'includePaths' => [
        __DIR__.'/../app',
        __DIR__.'/../vendor/laravel',
    ],
    // 'cacheDir' => '/tmp',// goaop/framework 2.2.0から必須
]);
```

```diff:phpunit.xml
- bootstrap="vendor/autoload.php"
+ bootstrap="tests/autoload.php"
```

```php:tests\TestCase.php
use AspectMock\Test as AspectMockTest;

～～～～～～～～～～～～～～～～～～～～～～～～～～～～

protected function tearDown()
{
    AspectMockTest::clean(); // remove all registered test doubles
}
```

## 使い方

```php
use AspectMock\Test as AspectMockTest;
```

### モック

```php
$test = AspectMockTest::double('Namespace\User', ['getName' => 'user_name']);

// 実行後に以下で呼び出し確認もできる。（@expectedExceptionを使う場合は確認できないのでtrycatchを使って確認する）
//    $test->verifyInvoked('getName');
//    $test->verifyInvokedOnce('getName');
//    $test->verifyNeverInvoked('getName');
//    $test->verifyInvokedMultipleTimes('getName',1);
//    $test->verifyInvokedOnce('getName', ['argument']);
//    $test->verifyInvokedMultipleTimes('getName', 2, ['argument']);
```

### モック結果を引数によって分ける

```php
$test = AspectMockTest::double('Namespace\User', ['getName' => function ($argument) {
    // $argumentを判定して結果をreturnする
    // return __AM_CONTINUE__ とすれば元のメソッドの動作を行う
}]);
```

### 順番に返り値を設定する

```php
$mock_index = 0;
$test = AspectMockTest::double('Namespace\User', ['getName' => function ($argument) use (&$mock_index) {
    $return_list = ['first', 'second', 'third'];
    return $return_list[$mock_index++];
}]);
```

### PHPの標準関数のモック

```php
namespace demo;
AspectMockTest::func('Namespace', 'time', 'now');
$this->assertEquals('now', time());
```

第三引数がresultOrClosureとなっていたのでクロージャも設定可能

```php
AspectMockTest::func('Namespace', 'date', function ($argument) {
    if ($argument === 'Y-m-d H:i:s')
    {
        return '2019-01-01 00:00:00';
    }
    if ($argument === 'Y')
    {
        return '2019';
    }
});
```

**第一引数はnamespaceであることに注意。クラス名までは設定しないこと。**

## 参考
http://blog.a-way-out.net/blog/2014/12/10/aspect-mock/
reduceを使ってpairの配列を連想配列にする

ES6以上が対象です。

# 概要
例えば[slackのchannel一覧](https://api.slack.com/methods/channels.list)など、同じ構造の連想配列が配列として帰ってくる場合があります。

```js
[
  {
    id: '2',
    name: 'hoge',
    ...,
  },
  {
    id: '5',
    name: 'fuga',
    ...,
  },
  {
    id: '0',
    name: 'foo',
    ...,
  }
];
```

このときに、ある`name`は存在するか、対応する`id`は何かを知りたい場合、一々配列を全部調べる必要があります。
なので、この配列から必要な部分を取り出して連想配列にします。結果として、以下のような連想配列を得ます。

```js
{hoge: "2", fuga: "5", foo: "0"}
```

# 方法
[reduce](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)を使います。
reduceは左の要素から順に関数を適用できるので、それぞれの要素ごとにnameをkey、idをvalueとして代入してます。

```js
const array = [
  {
    id: '2',
    name: 'hoge'
  },
  {
    id: '5',
    name: 'fuga'
  },
  {
    id: '0',
    name: 'foo'
  }
];

const result = array.reduce((ary, {id, name}) => {
  ary[name] = id;
  return ary;
}, {});
console.log(result); // {hoge: "2", fuga: "5", foo: "0"}
```

`ary[name] = id;`を`ary[id] = name;`とすると、idからnameが検索できるようになります。
VagrantでUbuntu仮想環境を作成したときの備忘録

#背景
世間ではクローリングやスクレイピングが流行っているらしいじゃないか。どれどれやってみるか・・
ということで参考書にある通り下記の環境を作ることにした。

ホストＯＳ：windows10
ゲストＯＳ：Ubuntu
仮想化技術：VirtualBox+Vagrant

#流れ
1.自前のPCが仮想化技術についていけるかを確認。
2.Hyper-Vを停止する。
3.VirtualBoxをインストール。
4.Vagrantをインストール。
5.Ubuntuのイメージファイル的なものを下記コマンドで取得

```cmd
vagrant box add ubuntu/trusty64
```

これは仮想環境立ち上げるフォルダとは別なところにストックされている。次回同じ名称の環境を立ち上げると参照されるので、無駄にダウンロードはされない。

6.初期化をする

```cmd
vagrant init ubuntu/trusty64
```
こうすると実行したディレクトリにvagrantfileたるものが生成される。実態はRubyで書かれているようだ。
このvagrantfileをvagrantさんは読み込んで環境の設定をVirtualBoxにお願いしてくれる。

7.設定

```ruby
Vagrant.configure("2") do |config|
　config.vm.box = "ubuntu/trusty64"
　config.vm.box_check_update = false
　config.vm.network "forwarded_port", guest: ポート番号, host: ポート番号
　config.vm.provider "virtualbox" do |vb|
　　vb.memory = "1024"
　end
end
```

上から、デフォルトの環境は「ubuntu/trusty64」ですよ。今度vagrant upっていったらこれにしてねの意味。
ボックスのアップデートを毎回確認するかしないか。(私はネット難民なのでfalseだけど非推奨)
ゲストＯＳとホストＯＳのポート共有。フォワードマッピングっていうのかな。
最後はメモリー量指定。他にもいろいろあるからコメントブロック読んで頑張ろう。

8.仮想環境立ち上げ

```cmd
vagrant up
```

9.仮想への接続

```cmd
vagrant ssh
```

10.pythonのバージョン確認

```cmd
python -V
python3 -V
```
入っているけどだまされちゃいけない・・・これにはバグがあるかもしれないのだ。
↓これがうまくいけばいいのだが

```cmd
python3 -m venv scraping
```

↑うまくいかない場合はもしかすると、ＯＳにもともと入っているpythonにはensurepipというものが入っていないのが原因かもしれない。だからこっちを入れろということだ→python3.4-venv

```cmd
sudo　apt-get install -y python3 python3.4-venv
```

sudoっていのは管理者に格上げってこと。vagrantで作成した環境はvagrantっていうユーザーで入ることになるが、このユーザーはsudoコマンドを許可されているので(そーゆう環境にしてくれてるんだろうと想像)のでできるみたい。aptっていのはゲストＯＳ自体のパッケージ管理ソフトって感じかな？
そのあと勢い余ってこんなことはしない事。

```cmd
sudo　python3 -m venv scraping
```

こうして作られた仮想環境は、なにかと管理者権限を要求してくる。それってもう仮想環境の意味ないかも。
仮想環境をホームディレクトリに作ること(管理者権限いらないとこ)。ホームディレクトリは 単にこうすると行ける。

```cmd
cd
```

そもそもホームディレクトリっていうのは、ユーザー固有のものにするっていう思想らしい。そのユーザーは配下のディレクトリに対してすべての操作が可能。ほかのユーザーは書き込めない。

vagrantユーザーは、デフォルトでは

>　/home/vagrant

がホームディレクトリと呼ばれるものになる。
仮にrinrenというユーザーが登録されていたとしたら

>　/home/rinren

というディレクトリがある事になる。
それで話は戻って、これをホームディレクトリで実行すると
↓

```cmd
python3 -m venv scraping
```

/home/vagrant/scraping

というディレクトリ(仮想環境)が出来上がる。
この仮想環境に入るには

```cmd
. scraping/bin/activate
```

その状態で確認してほしい

```cmd
which python
```

どこのpythonを実行する気でいるか結果が返ってくる。
その結果が、仮想環境の配下なら成功だ。
仮想環境抜けるには

```cmd
deactivate
```

ssh終了するには

```cmd
exit
```

仮想環境閉じるには

```cmd
vagrant halt
```

仮想環境削除するには

```cmd
vagrant destroy
```

管理者権限の事とかディレクトリの事とかlinux系は初めてだったから。疲れた。windowsしかやってこなかった事を後悔・・・
PCがスマホを認識しなくなった時の対策

PCにスマホ（私の場合Android）をUSB接続して、仮想マシン（私の場合VMware）でXamarinやAndroid Studioを使ってアプリを開発し実機テストしたりすると思うのですが、VMwareでゲストOSを起動してからスマホをUSB接続するとホストOSでもゲストOSでもスマホを認識しなくなりませんか？
解決するためにUSBを挿し直したり、スマホのUSB設定をMTP→充電のみ→MTPに切り替えてみたりしますが全然認識してくれず、しかたなく放置しているとWindows UpdateでOSに大きな変更があった後、いつの間にか認識するようになっていたなんてことが続いていました。ですが、最近スマホアプリの開発に力を入れてきた関係でそんな悠長なことは言ってられなくなりました。
そこで、海外サイトをググってみたところ「[USBDeview](https://nirsoft.net/utils/usb_devices_view.html)」なるものを見つけました。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/132879/8820a489-2e8c-95dc-7dab-27deb2c89fc8.png)
一覧の該当行を右クリックすると以下のようなメニューが出ます。
![無題22.png](https://qiita-image-store.s3.amazonaws.com/0/132879/aea824f1-7ba7-e938-5f77-2400fe9d8784.png)
人によっては「Disable+Enable Selected Devices」などやってみると認識するようになるかもしれませんが、私の場合、全然ダメでした。
（くれぐれも自己責任でお願いしたいのですが）そこで最後の手段として「Uninstall Selected Devices」を行いました。
そしてPCをシャットダウン、スマホを再起動、一晩寝て、PC起動、スマホをUSB接続とやってみたところUSBドライバが再インストールされ認識するようになりました！！
これでスマホアプリの開発ができるぞ！
皆さんもPCがスマホを認識しなくなって困ったときは一度挑戦してみてはいかがでしょうか。

##追記 2018/2/10
上記の翌日、USB接続してみたところ何故か認識しなくなりました。
再度USBDeviewで「Uninstall Selected Devices」を行ったのですが駄目でした。
半分諦めかけたのですが、とあるサイトにスマホのシステムアプリのデータを消去すれば認識するようになると記載されていましたので、早速やってみたところ認識しました！
手順は以下の通りです。（自己責任でお願いします）
1. Androidスマホで[設定]-[アプリ]を開く
2. 右上の点３つのアイコンから[システムを表示]をタップ
3. 「シェル」「システムUI」「キーチェーン」「スケジュールに沿って電源ON／OFF」「ストレージの設定」「設定」など（※どれが本当に必要なのか不明）の[ストレージ]-[データを消去]、[キャッシュを消去] 実行
4. スマホを再起動
5. PCにUSB接続すると認識

##追記 2018/2/16
後日、再び認識しなくなる事態が発生。上記の方法を試しても解決しない。
調べていたところAirDroidアプリでWifi接続できることが判明。
また、XamarinはXamarin Live Playerアプリで同じくWifi接続できることが判明。
急場をしのぐことができました。

##追記 2018/4/22
Xamarin Live PlayerではXamarin.Androidは動作しませんし、私の環境だけかもしれませんがXamarin.FormsでMainActivity.csのOnCreateを通ってくれない事象が発生したりといまいち使い勝手がよくありませんでした。ですがGoogle Playで見つけた「[Android用のUSBドライバ](https://play.google.com/store/apps/details?id=com.hexamob.drivers&hl=ja)」をインストールしたところ、PCが再びスマホを認識するようになりました。
PS.小鳥さん情報サンキュー！
WordPressの投稿一覧画面に最終更新者追加

## やりたいこと

Wordpressに作成者はあるが更新者がない。
設定にないのでプラグインを用いて追加する。

## 完成イメージ
![wp01.png](https://qiita-image-store.s3.amazonaws.com/0/230829/f82ceec6-37c5-9a21-a03a-65d0df9b36a9.png)

## 手順
1.WordPressフォルダにある【\wp-content】に適当なフォルダを作成
2.以下のplugin.phpファイルを作成
3.WordPressでプラグイン->インストール済みプラグイン->最終更新者追加に進み有効化にする
4.投稿一覧で最終更新者が追加されているのを確認

```php:plugin.php
<?php
/*
Plugin Name: 最終更新者追加
Author: h2
Version: 1.0.0
Author URI:
*/

add_filter( 'manage_posts_columns', 'itsg_add_custom_column' );
add_action( 'manage_posts_custom_column' , 'itsg_add_custom_column_data', 10, 2 );

function itsg_add_custom_column( $columns ) {
    $columns['modified'] = '最終更新者';
    return $columns;
}

function itsg_add_custom_column_data( $column, $post_id ) {
    switch ( $column ) {
        case 'modified' :
            $post = get_post( $post_id );
         // ここで表示項目調整
        echo the_modified_author(); 
        break;
    }
}
```

## プラグインの内容

WordPressの機能は既存に用意されているフック(add_filterやadd_action)して機能追加する。
以下のサイトを参考に今回、投稿(post)の一覧画面にフックして機能追加を行った。

## 参考サイト

https://www.itsupportguides.com/knowledge-base/wordpress/wordpress-how-to-add-last-modified-column-to-page-and-post-lists/
メモ：herokuでrailsを動かそうとした時のエラー対応


### 開発環境

+ macOS 10.13.3
+ ruby 2.3.3

### railsをローカルで動かそうとした場合
```
$ bundle install

An error occurred while installing sqlite3 (1.3.13), and Bundler cannot continue.
Make sure that `gem install sqlite3 -v '1.3.13'` succeeds before bundling.
```
以下を実行しても効果なし

```
$ brew install sqlite3
```
```
$ bundle install --path vendor/bundle
```

brewでインストールするsqlite3のバージョンが高すぎるようなので、一旦brewからは削除

```
$ brew uninstal sqlite3 
```
何度かエラーが出るがメッセージにあるコマンドを打てばいずれ削除出来る
削除が終わった後、gemからsqlite3をインストール

```
$ sudo gem install sqlite3 -v "1.3.13"
```

bundle installする前に、オプションを設定して実行

```
$ sudo ARCHFLAGS="-arch x86_64" bundle install --path vendor/bundle
```

以上でエラーが出ずに通るようになった

### herokuでrailsを動かそうとした時

herokuではrailsはpostgresqlで動かす必要があるのでGemfileでpgを追加しておくが、うまく動かない場合
```
$ brew install postgresql
```

/usr/local/Cellar/postgresql/XX.X（バージョン）/bin/pg_configの存在を確認
 
```
$ bundle config build.pg --with-pg-config=/usr/local/Cellar/postgresql/XX.X/bin/pg_config
$ ARCHFLAGS="-arch x86_64" bundle install --path vendor/bundle
```

herokuでApplicationErrorが起きている場合、gemで入れるpostgresqlのバージョンを変更する
1.0.0 → 0.2

以上で正常に動作する事確認

参考サイト

[Webサービスをすぐに動かせる！HerokuでRailsアプリを公開する方法【初心者向け】](https://techacademy.jp/magazine/6401#sec3)
[【Rails】Heroku上でApplication Error(H10 App crashed)【PostgreSQL】](https://qiita.com/totto357/items/1a6b88db8d2775540e1b)
[Error with sqlite3 when running bundle install
](https://stackoverflow.com/questions/27945123/error-with-sqlite3-when-running-bundle-install?rq=1)
「機械学習のライブラリ dlib」の記事を改訂しました。


[機械学習のライブラリ dlib](https://qiita.com/nonbiri15/items/9561c8194ba0b2041bd0) の記事を、執筆当初に比べて大幅に加筆しました。

また、dlib を利用する顔関連のオープンソースについての記事も増やしています。


- [顔画像認識についてのリンク](https://qiita.com/nonbiri15/items/92a5a65a3cf5513f51e4)
- [顔向き推定について調査中](https://qiita.com/nonbiri15/items/f6910a993457a1862632)
- [dlibベースの顔照合プログラム face_recognition ](https://qiita.com/nonbiri15/items/f95b5fb01ae38980c9ce)
Visual Studio Code を使った Javaプログラム事始め

publickeyさんの記事「[無償のコードエディタVSCode、実行中のJavaアプリのコードを動的に書き換えて修正できる「Hot Code Replacement」（ホットコード置換）を実現](http://www.publickey1.jp/blog/18/vscodejavahot_code_replacement.html)」に触発されて[VSCode](https://code.visualstudio.com/)を使ってみた。

# 環境
- Windows 10
- JDK 1.8.0_151

# 前準備
## インストール
https://code.visualstudio.com から Stable Build をダウンロード/インストールする。現時点はバージョン1.19。

## Java開発環境の設定
- 拡張機能(Ctrl+Shift+X)ビューを開く
- Java Extension Packをインストール(Debugger for Java, Laguage Support for Javaもインストールされる)
![screen0.png](https://qiita-image-store.s3.amazonaws.com/0/23573/df420d47-58c4-51c9-e869-f612936efc26.png)
- 設定画面(Ctrl+,)を開き、*java.home*を自分の環境に合わせて設定しておく。

# プログラムの実行
## Hello, World!
まずは、Hello, World!を書いてみる。
- ファイル-フォルダを開く
- 新規ファイルを選択
- 右下の言語モードの選択でJavaを選択。文字コード・改行コードはお好みに
![screen1.png](https://qiita-image-store.s3.amazonaws.com/0/23573/cb761478-9913-8779-5c76-1d2415fad6b1.png)
- main, sysoutなどの*template*が用意されているようだ。
![screen2.png](https://qiita-image-store.s3.amazonaws.com/0/23573/5a242b61-9d65-bcf1-c8fa-830544913282.png)
- 名前を付けて保存(Ctrl+Shift+S)する。*Classpath is incomplete. Only syntax errors will be reported* の警告は取り敢えず無視。
- デバッグの開始(F5) でプログラムを実行できるが、初回は*launch.json*ファイルが作成されるのでもう一度F5で実行する。
- 以下のようにデバッグビューが開き、コンソールに実行結果が表示される。
![screen3.png](https://qiita-image-store.s3.amazonaws.com/0/23573/365f5a63-c845-80e5-ad97-c0e3c4da0321.png)

## 日本語の表示(文字化けへの対応)
当然の事ながら、日本語も問題なく表示される…と言いたいところだが、そんなに甘くは無かった。デフォルトのままだと以下のようにコンソール表示が文字化けする。

![screen4.png](https://qiita-image-store.s3.amazonaws.com/0/23573/8f9d09ea-24fc-d2de-3079-d9c7a9ba41fc.png)

これに対応するには、設定画面を開き*java.jdt.ls.vmargs*に**-Dfile.encoding=utf8**を追加する。JVMの引数なので順番や文字コードを*UTF-8*にしても大丈夫と思ったのだが、もとの値の最後に**-Dfile.encoding=UTF-8**のように追加してもダメだった。*"java.jdt.ls.vmargs": "-noverify  -Dfile.encoding=utf8 -Xmx1G -XX:+UseG1GC -XX:+UseStringDeduplication"* のように追加すれば文字化けは解消できた。
![screen5.png](https://qiita-image-store.s3.amazonaws.com/0/23573/d263f99a-c773-7f28-1daf-e0db5545a704.png)

## Hot Code Replacementの実験
### 設定の変更
*Hot Code Replacement*はデフォルトでoffになっているので、設定画面で**"java.debug.settings.enableHotCodeReplace": true**の設定を加えておく。
### プログラムの修正
*Hot Code Replacement*を試すためにプログラムを以下のように修正。

```java:Test.java
public class Test {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++)
            sayHello();
    }

    private static void sayHello() {
        System.out.println("こんにちは世界！");
    }
}
```
### プログラムの実行
*sayHello()*メソッドを呼び出す所にブレークポイントを設定しておき、デバッグを開始する。
- ブレークポイントで停止
- *sayHello()*メソッドの書き換え。保存
- 続行(F5)
を繰り返すと、プログラムの再起動無しに*sayHello()*メソッドの処理が置き換えられていることが確認できる。
![screen6.png](https://qiita-image-store.s3.amazonaws.com/0/23573/cd6ff7c6-283d-09fe-1f9f-ae8570a50787.png)

# まとめ
VSCodeを使って、Javaプログラムの*Hot Code Replacement*を確認することができた。
最終的に、*VSCode*でJavaを開発するために加えた設定は以下のようになる。

```javascript
{
    "java.home": "JDKのパスを設定",
    "java.jdt.ls.vmargs": "-noverify  -Dfile.encoding=utf8 -Xmx1G -XX:+UseG1GC -XX:+UseStringDeduplication",
    "java.debug.settings.enableHotCodeReplace": true,
}
```
コンソールが文字化けには、デフォルトで対応していて欲しいものだがちょっとした設定を加える事で対応できたので良しとしよう。

機能的には普段使っている*Eclipse*と比較すると物足りないが、何よりこの動作の軽さは魅力的である。*Spring Boot*にも対応しているとのことなので機会があれば試してみよう。
列挙型について考察

恥ずかしながら今まで仕事でプログラムを書いていて列挙型というものを使ったことがない。(業務上のソースで見たこともない。)

列挙型の使い勝手を調べてみてよさそうなら今後チャンスを見計らって列挙型を使ってみようと思う。

## とりあえず書いてみる

例えば下記のようなステータスを定数で管理している場合

```java:定数クラス
public static int STATUS_STOPED = 0;  //停止済み
public static int STATUS_STARTING = 1;//起動中
public static int STATUS_STARTED = 2; //起動済
public static int STATUS_STOPPING = 3;//停止中
public static int STATUS_ERROR = 9;   //エラー発生
```

列挙型で書き換えるとこんな感じになる

```java:列挙型
    public enum Status {
        STOPED,   // 停止済
        STARTING, // 起動中
        STARTED,  // 起動済
        STOPPING, // 停止中
        ERROR     // エラー
    };
```

<dl>
<dt>定数</dt>
<dd>「STATUS_STOPED」という定数は「0」という値を格納していてそれは「停止済」を表す。
と3つの情報を紐づける必要がある。</dd>
<dt>列挙型</dt>
<dd>「STOPED」という値は「停止中」を表す。
と2つの情報を紐づけるだけでいい。
</dd>
</dl>
この紐づけを間違ってしまうと大変なことになるので紐づけが単純って意味で使いやすいかもしれないですね。

## DBに格納してみる

では上記のステータスをDBに格納するとなればどうだろう？
DBでステータスを保持する際に文字型で格納するイメージはないので「ステータス」という整数型のカラムを用意して格納するとする。
<dl>
<dt>定数型</dt>
<dd>int型で定義しているのでそのまま格納すればOKでしょう。<dd>
<dt>列挙型</dt>
<dd>当然、そのままはDBに格納できない。
数値型に変換する必要がある。数値が定義された順で連番で良ければ下記のコードでOK。

```
        System.out.println(Status.STOPED.ordinal());    // 0
        System.out.println(Status.STARTING.ordinal());  // 1
        System.out.println(Status.STARTED.ordinal());   // 2
        System.out.println(Status.STOPPING.ordinal());  // 3
```

連番ではなくて決まっている数値(エラーは9にしなければならない)という制約があるならこうする必要がある。

```java:列挙型
    public enum Status {
        STOPED(0),
        STARTING(1),
        STARTED(2),
        STOPPINMG(3),
        ERROR(9);

        int id; // 各ステータスを数値で表現
        Status(int id){
            this.id = id;
        }

        public int getId() {
            return this.id;
        }
    }
```

こんな風に定義して呼び出し側では

``` java:呼び出し側
Status.STOPED.getId();
```

こうすれば数値として扱えるようになる。
・・・結局「STOPED」は「0」を表していて「停止中」を意味するって3つの情報が出てきました。
しかも数値で扱えるようにするためだけにフィールド、コンストラクタ、フィールドのゲッターの3つを用意する必要がある。
ここまでするのならそれに見合うメリットがないとちょっと使いずらいですね。。。
</dd>
</dl>

## メソッドの引数として渡してみる

上記のステータスを引数として受け取るメソッドを考えてみる

<dl>
<dt>定数

```java:引数が定数

    /**
     * 引数のステータスの値に応じて処理を行う
     * @param status 停止済(0)or起動中(1)or起動済(2)or停止中(3)orエラー(9)<br>
     *               上記以外の数値が渡されるとIllegalArgumentExceptionを発生させる
     */
    private void doProcess(int status) {

        List<Integer> statusList = Arrays.asList(0,1,2,3,9);

        // ステータスが不正
        if(!statusList.contains(status)){
            throw new IllegalArgumentException("ステータスが許容値の範囲外です。(status:"+status+")");
        }
        // do something
    }
}
```

<dd>ステータスを表す値としては停止済(0)、起動中(1)、起動済(2)、停止中(3)、エラー(9)の5通りしか意味を持たないが、定数の場合はint型なので5や-1などほかの数値を渡してもエラーにならない。(が、これらの数値が渡ってくると動作が保証できなくなる。)よってメソッドの中で0,1,2,3,9以外の値が渡されたら例外を返すなどの入力チェックが必要となる。
そのことを利用者にも伝えなければいけないのでjavadocに書くことも増える。</dd>
</dt>
<dt>列挙型</dt>

```java:引数が列挙型

   /**
     * 引数のステータスの値に応じて処理を行う
     * 
     * @param status
     */
    private void doProcess(Status status){

        // do something 
    }
```
メソッドに渡せる値の範囲が制限されるので入力チェックが不要になり、コメントにもアレコレ注意事項を書く必要がありません。
列挙型を使うと宣言部が少し複雑になりますがメソッド内が完結になるのはいいですね。


## まとめ

* メソッドの引数に使わないかつ、DBに連番ではない整数型で格納する必要があるなら定数

* それ以外なら列挙型

という使い分けがいいのかなと思いました。
すべてのケースで列挙型でもいいと思いますが1番目くらいのユースケースなら手軽な方でいいのでは？という感想です。

仕事でも使えるケースがありそうなので取り入れてみたいと思います！
.htaccess で URLの正規化（www削除）ができなくて泣きを見た話

## いきなり結論から
VPSでバーチャルホストを設定するときは、*.confファイルに `ServerAlias` もちゃんと書こうね！

``` *.conf
<VirtualHost *:80>
    ServerName sample1.net
    ServerAlias www.sample1.net ← これ大事
    DocumentRoot /var/www/sample1.net
</VirtualHost>
```

そしてこうだ！！

``` .htaccess
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.sample1\.net
RewriteRule ^(.*)$ http://sample1.net/$1 [R=301,L]
```


## どういうこと？
タイトルのままなんですが、一つのVPSサーバーで複数サイトを運営しており、その中の一つをSSL化した際、.htaccessを使ってURLの正規化（http → https）をやってたら、wwwも無くしてという話になりました。

いろんなサイトの .htaccessの書き方を見てやってみました。

``` .htaccess
RewriteEngine On

# httpsに統一
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

# wwwなしに統一
RewriteCond %{HTTP_HOST} ^www.sample1\.net
RewriteRule ^(.*)$ http://sample1.net/$1 [R=301,L]
```

うーん、うまくいかない。。

## 起こったこと

以下のことが起こりました。

- http://sample.netに アクセスすると、  https://sample.netにリダイレクトされる ← OK
- https://www,sample.net にアクセスすると 「この接続ではプライバシーが保護されません」画面になる ←？？
  - それでも閲覧を進めると、同じVPS上でメインで公開されているサイトAの画面が表示される（URLは https://sample.net のまま） ← ？？？

## やったこと

.htaccessの記述順が影響しているのではと思い、httpsとwww削除の記述を入れ替えて見ましたが、変わりありませんでした。

.confファイルの記述が間違っているのかと思い、同じVPS上で正しく表示されている.confファイルと見比べて見ましたが、特に変わったところは見つかりませんでした。。。

## ひょっとして、www付きのURLが紐づいてないんじゃね？

あーでもない、こーでもないと2~3時間がすぎました。。

https://sample.net　はOKで、https://www.sample.net だとダメ。
www付きは同じVPS上の違うドメインの画面が表示されてしまう。
もしかして、www付きのドメインが紐づいてない？？

### .confファイルに ServerAlias を追加
`ServerAlias` は `ServerName` 以外のホスト名でもアクセスを受け付けたい場合に記述します。
なくても動いていたので、そのままにしてましたが、もしやこれが原因なのでは？と思い、以下のように修正しました。

``` *.conf
<VirtualHost *:80>
    ServerName sample1.net
    ServerAlias www.sample1.net ← 追加
    DocumentRoot /var/www/sample1.net
</VirtualHost>
```

.htaccessは特にいじらず、再度  https://www.sample.net にアクセスすると・・・。
できた！！！

無事、wwwなしURLにリダイレクトできました。

知ってる人からしたら、当たり前のことかもしれませんが、これだけのために泣きを見てしまったので、備忘録と自分への戒めとして残します。

もし同じことでなハマってる人の助けになれば幸いです・・・。
Macの空きディスク容量を増やす

仕事でいろいろ作業をしているといつのまにやらキャッシュやらなんやらでディスク容量が圧迫されていきます。

気づけば残りディスク容量が **1GB** を切って `docker pull` が途中で失敗するなんてこともしばしばです。

どうにかして空き容量を増やそうと思い、Macのシステム情報でストレージの管理の項目を見ていると `Library` ディレクトリがやたら太っていることに気づきます。ですが`Library` ディレクトリを直接削除しに行くというのは結構勇気が要ります。中を見てみると `homebrew` や `yarn`、とくに `docker` のコンテナで容量を食っていることがわかりました。

そこでキャッシュを作成するアプリケーションにはアプリケーションで対処して貰おうと思い試してみました。

参考値として試す前のディスク容量をあげます。

空きディスク容量：**2.63GB** 

## homebrew

Macを利用しているとお世話になる `homebrew`。 インストールしたりアップデートしたりするとそれなりにキャッシュが貯まっていきます。古いバージョンのキャッシュは全て消してしまいましょう。

以下のコマンドで消すことが出来ます。

```bash
$ brew cleanup -s
```

キャッシュを消した結果は以下です。

空きディスク容量：**7.5GB** 

5GB弱食ってたようです。

## yarn

JavaScriptのパッケージ管理ソフトの `yarn` も結構キャッシュを貯め込みます。`yarn install` を行うとユーザディレクトリ以下のグローバルキャッシュにため込むとのことです。

https://yarnpkg.com/lang/ja/docs/cli/cache/

そのキャッシュも消してしまいましょう。消すためのコマンドは以下です。

```bash
yarn cache clean
```

キャッシュを消した結果は以下です。

空きディスク容量：**8.7GB**

`homebrew` ほどではありませんが、1.2GBほど食っていたようです。

## docker

本命の `docker` です。開発で `Dockerfile` などを作成するときの試行錯誤で残ってしまったコンテナやイメージが沢山存在します。

dockeｒにはそういった使っていないコンテナやイメージなどを一括で削除してくれるコマンドがあります。そのコマンドを叩いて不要な者を消してしまいます。

https://docs.docker.com/engine/reference/commandline/system_prune/

```bash
docker system prune -f
```

不要なコンテナ等を消した結果は以下です。

空きディスク容量：**16GB**

7GBほど削除できました。やはり `docker` はディスクをかなり食います。

## まとめ

以上やったことをまとめてみました。結果 **13GB** ほど空き容量を増やせました。後他にも見てみたら `Evernote` とか `Dash` とかもかなり容量を食っていたのですが、さすがに怖くて消せませんでした。AndroidとかiOSまわりも消したらスッキリしそうです。

コマンドで消せるのが理想なのですが、そういうものばかりではないのが辛いところです。もう10GBほど何かしらの手段で空き容量を広げたいところです。
【SQL】演算子

勉強したことのメモ( ・∇・)

#演算子
・算術演算子の利用
→選択列リストに演算子
→insert文に演算子
→update文に演算子

・特殊な演算子の利用
→case演算子

<font color="Fuchsia">★</font>演算子　一覧

|演算子|組み合わせ| 結果 |
|:---|------------:|:------------:|
|+|数値 + 数値|数値の足し算|
||日付 + 数値|日付を指定日数進める|
|-|数値 - 数値|数値の引き算|
||日付 - 数値|日付を姉弟日数戻す|
||日付 - 日付|日付の引き算|
|*|数値 * 数値|数値の掛け算|
|/|数値 / 数値|数値の割算|


例 : Purchaseテーブル

|id|day| contents | money|
|:---|------------:|:------------:| :------------:|
| 01 | 2018-02-01  |文房具|1000|
| 02 | 2018-02-02  |食費|2000|
| 03 | 2018-02-03  |食費|500|
| 04 | 2018-02-04  |光熱費|10000|
| 05 | 2018-02-04  |文房具|3000|
| 06 | 2018-02-05  |食費|2000|

##選択列リストに演算子
・selectの指定リストに演算子を使うことが可能。

```sql
select day, contents, money * 1.08 as 消費税含めた金額
from Purchase
```

##insert文に演算子
リテラルに演算子を使うことが可能。

```sql
insert into Purchase
(money)
values (100 * 2)
```

##update文に演算子
リテラルに演算子を使うことが可能。

```sql
update Purchase
set money = money * 1.08
```

##case演算子

値に応じて好きな値へ変換する。

```sql
select contents, money,
case contents when '食費' then '生活費'
              when '光熱費' then '生活費'
              else 'その他'
end as 分類
from Purchase money > 0
```

以上！
Vimでカーソルキー入力時にABCDが出力されてしまう

**<font color="red">当記事では根本的な問題解決には至れていません</font>**

# Vimでカーソルキー入力時にABCDが出力されてしまう
以下のブログ等、ちょいちょいみなさんを悩ます現象のようです。
[Vimで方向キー入力時にABCDが記述されるエラー対処](http://vdeep.net/vim-abcd)

私も年末に`.vimrc`を色々いじっていたら、気付いたら当事象に陥ってしまいました。上記ブログ等を参考にさせてもらって解決を試みましたが、私の環境での事象を解決することはできませんでした。でも、私は意識が高いので、『インサートモードでカーソルキーを使うのは甘え』と自らを誤魔化してこの問題を放置していました。


# 悔い改める
> 志低ければ、怠惰に流れる。
> - 松下幸之助 -

というわけで、意識が高いどころか意識が低いことを指摘されてしまったので、原因の究明を行いたいと思います。
って言うか、インサートモードでもカーソルキーで移動したいし！

# 原因の特定
## 犯人探し①
まずは`.vimrc`をリネームしてスッピンのvimの状態で動作確認してみました。インサートモードに入ってカーソルキーを押してもちゃんとカーソルが移動する！AとかBとか出てこない！
ひとまず`.vimrc`の設定であることは確定しました。

## 犯人探し②
あとは`.vimrc`の中身を全部コメントアウトし、少しずつコメントを外していくという地道な作業。結局犯人は以下の記述でした。

``` VimL:.vimrc
" NORMALモードに戻るときにIMEをOFFにする
function! ImInActivate()
  call system('fcitx-remote -c')
endfunction

" ★こいつが犯人らしい★
inoremap <silent> <C-[> <ESC>:call ImInActivate()<CR>
" ★これも試してみたけどダメだった★
inoremap <silent> <ESC> <ESC>:call ImInActivate()<CR>
```

インサートモード状態で、全角入力状態で`Ctrl + [`を押してインサートモードを抜ける際に、全角入力をOFFにするための記述です。

# 暫定対応
[以下のようにしてみました](https://github.com/louvre2489/dotfiles/blob/master/.vimrc)。これだと問題の事象は発生しませんでした。

``` VimL:.vimrc
" NORMALモードに戻るときにIMEをOFFにする
function! ImInActivate()
  call system('fcitx-remote -c')
endfunction

" ★これらはOKだった★
inoremap <silent> jj <ESC>:call ImInActivate()<CR>
inoremap <silent> っｊ <ESC>:call ImInActivate()<CR>
inoremap <silent> <C-j> <ESC>:call ImInActivate()<CR>
```

# まとめ
冒頭にもあるとおり、原因の特定には至れませんでした。絶対的なvim力不足です。いつか原因究明ができた時には当記事にコメント追記したいと思います。
ひとまず、『`Ctrl + [`とか普段使わんし！』と自分を誤魔化しつつ(実際あんまり使ってない)、上記３つのマッピングでしばらくはしのいでいこうかと思います。
グラデーションをInspectorで作成する[Unity]


Particleの`Color Over Liftime`等でグラデーションを設定するのに使うツールですが，こちらはMonoBehaviourを継承したクラスでも使うことができます．

![スクリーンショット 2018-02-06 23.24.16.png](https://qiita-image-store.s3.amazonaws.com/0/113504/40c2b1b6-b9e1-6a33-fece-dd2d46ec83c6.png "スクリーンショット 2018-02-06 23.24.16.png")

# サンプル　Imageの色を変える

![gradient.gif](https://qiita-image-store.s3.amazonaws.com/0/113504/3fc6e18a-6258-69b0-b5f6-f5b57f916fb9.gif "gradient.gif")

```cs
public class GradientTest : MonoBehaviour {

	public Gradient gradient;

	[Range(0, 1)]
	public float time = 0;

	void OnValidate(){
		this.GetComponent<Graphic> ().color = gradient.Evaluate (time);
	}
}

```


`Gradient`クラスの変数を宣言することでInspectorに表示されます．
AnimationCurveと同じ様に，`Evaluate`に0~1の値を渡すことによって色を取得することができます．

GradationMapに使われることが多いようですが，Timelineとかと組み合わせても面白い表現ができるかもしれません．


# 参考
https://docs.unity3d.com/jp/540/ScriptReference/Gradient.html
Cygwin環境構築メモ

備忘用。

##cygwinインストール
色々纏めてインストール。
モノは[こちら](https://cygwin.com/setup-x86_64.exe)

```dosbatch:dosプロンプトで
setup-x86_64.exe ^
   --root c:\cygwin ^
   --local-package-dir %CD% ^
   --site http://ftp.iij.ad.jp/pub/cygwin/ ^
   --quiet-mode ^
   --packages gcc-core, git, libiconv, libiconv-devel, make, vim, gnupg, wget, x86_64-w64-mingw32-gcc
```

```shell:以下、cygwinのコンソール内で
## MinGWでビルドしてcygwin1.dllなしで実行できるようにする
$ x86_64-w64-mingw32-gcc sample.c
```

##apt-cygのインストール
apt-cygはパッケージ管理用のツール。
アプリケーションが簡単にインストールできるようになります。
Cygwinを立ち上げて、以下のコマンドでGitHubからスクリプトをダウンロードできます。

```shell
# ↓正規版。開発終了したらしい。
wget https://raw.githubusercontent.com/transcode-open/apt-cyg/master/apt-cyg
# 参照：https://github.com/transcode-open/apt-cyg/blob/master/status.md

# しょうがないから、一番commitが活発らしい↓を導入するといいかも
# https://github.com/kou1okada/apt-cyg
wget https://raw.githubusercontent.com/kou1okada/apt-cyg/master/apt-cyg
```

・実行権限をつけてPATHの通っている場所に置く

```shell
chmod 755 apt-cyg
mv apt-cyg /usr/local/bin/
```

・国内のリポジトリから更新するようにする

```shell
apt-cyg -m ftp://ftp.iij.ad.jp/pub/cygwin/ update
```

・apt-cygのプロキシ設定

InternetExplorerを立ち上げる　→　「ツール」　→　「インターネットオプション」　→　「接続」　→　「LANの設定」　→　「詳細設定」
の設定と同様に `c:\etc\wgetrc` の以下を設定する。
※wgetの設定をすると、apt-cygも使えるようになる

```shell
# ↓コメント(#)をとる
#https_proxy = http://username:password@proxyhost:port
#http_proxy = http://username:password@proxyhost:port
#ftp_proxy = http://username:password@proxyhost:port
```


##vimインストール

```shell
apt-cyg install vim
```

##curl / unzip インストール

```shell
apt-cyg install curl unzip
```

##gcc環境整備
```shell
apt-cyg install gcc-core
apt-cyg install gcc-g++
```

## ping文字化け対策
```shell
apt-cyg install libiconv libiconv-devel inetutils  # 必要なパッケージのインストール
git clone http://github.com/vmi/cocot
cd cocot
./configure && make && make install
```

##.bashrc
```shell
alias ll='ls -l --color=auto'
alias ping='cocot ping'
alias javac='javac -J-Dfile.encoding=UTF-8'
alias java='java -Dfile.encoding=UTF-8'
```

##inetutils ( telnet )
```shell
apt-cyg install inetutils
```

##expectインストール (Tclインストール・最新化済前提)
```shell
apt-cyg install expect
```

##git
```shell
apt-cyg install git
```

##（メモ）特定キーワードを持つファイル名のEXCELを現在パスにコピー
```shell
for a in <keyword>; do find <path> -name "*$a*.xlsx" | xargs -i cp {} . ; done
```

##（メモ）JSON整形
```shell
echo '{"key1": "value1", "key2": {"key3": "value3"}}' | python -m json.tool
```
OpenCVインストール時のエラー

##環境
Python 3.5.2
Anaconda

##エラー内容
import cv2　をしたときに
ImportError: DLL load failed　がでる．

##解決策
https://stackoverflow.com/questions/43184887/dll-load-failed-error-when-importing-cv2
ここのソリューションの一つ
python3.dllをダウンロードしてAnaconda3に入れたら無事にできました．
時間かかったー
Pathの問題やVisual Studioの有無とか検証したけどこれは分らなかった．．

追記：OpenCV便利ですねー．インストール面倒すぎて諦めようかと思いましたが
　　　皆さん頑張ってください．
WordPress File Uploadでアップロード・パスを指定する

[WordPress File Upload](https://ja.wordpress.org/plugins/wp-file-upload/)で、アップロードをすると、 /wp-content/uploads/*.png みたいなパスにアップロードされてしまい、フォルダ分けができていなかったので、パスを指定したかったのですが、あまり情報が見当たらなかったのでメモしておきます。

ショートコードを入力する際に、`[wordpress_file_upload uploadpath="/folder_name"]`とすればOKでした。

`./folder_name`や`/folder_name`、`/folder_name/`ではうまくいかなかったはず。

設定画面の base_pathだか、base_urlだったかには、何も入力していません。
ファイルシステムとは

## 一言でいうと
「ツリーのファイル構造を、1列のバイナリデータ上で管理する仕組み。」

記憶装置が持っている機能で、データを保存したり、どこにどんなデータがあるかを管理したりする。

## ファイルシステムの種類
win10の場合「NTFS」
linuxの場合「ext4」

※ デファクトスタンダード
【Xcode】iTunes ConnectへのアップロードでMissing 64-bit supportエラーになったときの対応方法

## iTunes Connectへのアップロードでエラー

開発しているアプリをiTunes Connectにアップロードしようとしたら `iTunes Store Operation Failed` とエラーになりました。

![64bitError01.png](https://qiita-image-store.s3.amazonaws.com/0/38924/5e9930b7-d0e7-8370-c4b8-26ece86727c5.png)


エラーメッセージには、つぎのように書いてあります。
 
> Missing 64-bit support. iOS apps submitted to the App Store must inclued 64-bit support and be built with the iOS 8 SDK or later. We recommend using the default "Standard Architectures" build setting for "Architectures" in Xcode, to build a single binary with both 32-bit and 64-bit support.

どうやら、 『App Storeに申請するには、64-bitをサポートしていないとダメよ。Xcodeの `build setting` の `Architectures` を `Standard Architectures` にしてね（意訳）』とのことです。

それならそうしましょうというわけで、さっそくXcodeの設定を見てみました。

## 64-bit対応の設定

![64bitError02.png](https://qiita-image-store.s3.amazonaws.com/0/38924/c9677784-4909-373e-2531-726eb7fdf6e8.png)


すると、 `build setting` の `Architectures` は `Standard architectures` になっています。ねんのため、 `Valid Architectures` も確認しましたが、 `arm64` がふくまれています。

おかしいなあと思って調べてみると、stack overflowで[Xcode Missing 64-bit support with standard architectures enabled](https://stackoverflow.com/questions/32514787/xcode-missing-64-bit-support-with-standard-architectures-enabled "Xcode Missing 64-bit support with standard architectures enabled")という記事を見つけました。

> To enable 64-bit support:
> You need to add "arm64" under "Valid Architectures" and set "Architecture" as "Standard Architecture" as shown in attached screenshot.
> Also make sure to turn "Build Active Architectures Only" to NO.

Answerには、このように書かれています。

> `Valid Architectures` に `arm64` を追加して、 `Architecture` は `Standard Architecture` にするんだよ。

ふむふむ、ここまでは対応している。

> あと、 `Build Active Architectures Only` は `NO` にしてね。

むっ！　 `Build Active Architectures Only` は `NO` に！

もしかしてこれのせいか！？　と思って確認してみると、 `Debug` は `NO` ですが、`Release` が `YES` になってるではありませんか。

![64bitError03.png](https://qiita-image-store.s3.amazonaws.com/0/38924/460b395d-b7a6-07a7-b4d0-d2ee7efc4b7c.png)


というわけで、  `Build Active Architectures Only` の `Release` も `YES` に変えてArchiveしました。すると、Validateで無事にOKとなりました。バンザーイ。

64-bit対応してねというエラーが出たら、  `Build Active Architectures Only` の設定も確認してみてください。

## Build Active Architectures Onlyってなに？

無事に解決しましたが、 `Build Active Architectures Only` ってなんだろう？　なぜその設定を `NO` にしたら解決したのだろう？　と疑問に思ったので調べてみました。

ヘルプによると `Build Active Architectures Only` とはつぎのような設定だそうです。

> If enabled, only the active architecture is built.

アクティブなアーキテクチャーだけでビルドしてくれるそうです。ということは、おそらく32-bitのアーキテクチャーがアクティブになっていたために、32-bitでビルドしてしまったということなのでしょう。

ひとつ疑問は解消しました。しかし、この設定にどのような意味があるのか？　また、どのような使い道があるのか？　この疑問は残ります。

さらに調べてみると、こちらの[iOSのビルド高速化 7つの方法](https://qiita.com/hi-ro-to/items/55d7e188ddee95bcfc31 "iOSのビルド高速化 7つの方法")という記事にその答えが書いてありました。

> XcodeのTarget→Build Setting→Build Active Architecture OnlyでDebugだけYESにしましょう。
> これをすると、ビルドしたい端末に最適なアーキテクチャでのみビルドしてくれます。
> NOにすると、すべてのアーキテクチャでビルドして全最適化を行われます。
> 不要なアーキテクチャのビルド分時間がかかるということです。
> ※Releaseでは必ずNOにしましょう。

なるほど、そういうことなんですね。しかも、 `※Releaseでは必ずNOにしましょう` というありがたい注釈つきです（もうすこし早く、この記事に出会いたかった）。

これですべての謎が解けました。よかったよかった。

Xcodeの設定がわかっていないと、今回のようにハマることがあります。すこしずつでも設定を理解していかないといけませんね。
こういうのはバグの元

思わずやってしまいがちな、バグの元になる行動と考え方を紹介します。

- プログラムは想像どおりに動くと思っている。

- 想定しないケースはとりあえず適当にリターンとかしとく

- 正常系のテストしかしない

- 他の人が自分の書いたソースを見ることを想像しない

- どっかのサイトにあったソースをコピペ

- ライブラリのドキュメントを見ない

- DRYを意識しない

- 既存のソースを読まずに「たぶんこう動くだろう」という想像だけ

- テスト環境と本番環境の違いを意識しない

- よくわらかないけど、こうしたら動いた→完成

- バグ対応の時、バグの原因を取り除かずに発生したところを封じるだけ
Pandoc のバージョンアップで表が壊れて焦った話

# 背景

普段は Emacs の Org-mode を利用してドキュメントを作成している。

そして、Pandoc を利用して Markdown や ReStructuredText などに変換を行っている。

Markdown は Qiita の投稿に利用し、ReStructuredText は Sphinx のビルドに利用している。

あまり意識することはないが、Pandoc にはお世話になっている。

何気なく Ubuntu のシステムアップデートをしたら、Sphinx のビルドが失敗するようになった。

エラーメッセージを見ると Org-mode から変換した表が壊れているようだ。

何が原因を、どんな変更が行われたのを調査結果を記録する。

# 結論

時間のない人向けに結論を書いておくと、pandoc のオプションには以下のオプションを追加することで回避できる。

  - 「–columns=NUMBER」

# 最新の Pandoc

Pandoc の最新(2018/02 時点) は、以下である。

  - <https://github.com/jgm/pandoc/releases/tag/2.1.1>

# リファレンスを参照

> –wrap=auto|none|preserve
> 
> Determine how text is wrapped in the output (the source code, not the rendered version). With auto (the default), pandoc will attempt to wrap lines to the column width specified by –columns (default 72). With none, pandoc will not wrap lines at all. With preserve, pandoc will attempt to preserve the wrapping from the source document (that is, where there are nonsemantic newlines in the source, there will be nonsemantic newlines in the output as well). Automatic wrapping does not currently work in HTML output.
> 
> –columns=NUMBER
> 
> Specify length of lines in characters. This affects text wrapping in the generated source code (see –wrap). It also affects calculation of column widths for plain text tables (see Tables below).

# 参考情報

  - <https://pandoc.org/MANUAL.html>
  - <https://github.com/jgm/pandoc/issues/3171>
(全俺感動)(Jupyter) 紙のノートを超えた Jupyter Notebook を使う方法

# やりたいこと

Jupyter を利用しているのを見る機会があり、感銘を受けたので使い方を調査することにした。

やりたいことは、以下である。

  - Jupyter を使って、ドキュメント内で Python のコードも実行したい。
      - 書きながら考える＆考えながら書く

Qiita の記事はローカルで編集を行い、Sphinx でドキュメント化している。そこで、jupyter で作成したファイルも、この中に組み込むことをゴールとする。詳しくないが、Jupyter を使うために Markdown にもチャレンジしていく。

# jupyter とよく使うライブラリのインストール方法

jupyter は、pip コマンドでインストールする。

``` bash
sudo -H pip install jupyter
```

あと、よく使うライブラリもインストールしてくおくこと

``` bash
sudo -H pip install numpy
sudo -H pip install matplotlib
```

# jupyter の起動方法

端末でコマンドを実行すると、ブラウザが起動し jupyter の画面が開く。

``` bash
jupyter notebook
```

ポート番号を変更したい場合は、以下のようにオプションを指定して実行すること。

``` bash
jupyter notebook --port=18888
```

さらに prefix を追加したい場合については、要動作確認

  - <http://jupyter-notebook.readthedocs.io/en/stable/public_server.html#running-the-notebook-with-a-customized-url-prefix>

# jupyter の使い方のメモ

  - Shift + Enter  
    下にセルを追加
  - Ctrl + Enter  
    セル内のプログラムを実行

# Emacs でも jupyter ファイルを編集する方法

package-install で ein を導入する。

# jupyter でプレゼン資料を作る方法

<https://qiita.com/cvusk/items/d425751ba663dc8c6517>

``` bash
sudo -H pip install RISE
sudo -H jupyter-nbextension install rise --py --sys-prefix
sudo -H jupyter-nbextension enable  rise --py --sys-prefix
```

  - 見出しの二階層目をスライドに設定
      - (スクリーンキャプチャを追加)

# Sphinx に jupyter ファイルを組み込む方法

``` bash
sudo -H pip install nbsphinx
```

Markdown の見出しがないと、Sphinx に組み込む際にエラーになる。

# 今後に向けて

  - prefix をつける方法を動作確認
  - jupyter の一括実行と一括リセットのショートカットを調べる

# 参考記事

  - <http://pod.hatenablog.com/entry/2017/08/06/220817>
  - <https://qiita.com/y__sama/items/17aedf0c05187edd61c3>