OmniAICreator/Qiita-1.07M huggingface dataset:
geometry > sub-triangles > Triangular van der Corput列 > v0.1 > for文のネスト

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
```

参考1: [Basu and Owen, SIAM J. NUMER. ANAL. 53, 743-761, 2015](http://epubs.siam.org/doi/abs/10.1137/140960463?journalCode=sjnaam)
参考2: http://statweb.stanford.edu/~owen/pubtalks/mcm2017-annotated.pdf
(p15あたりから)

QMC(Quasi Monte Carlo)法で使ったことがあるvan der Corput列。
Basu and Owen(2015)によって、Triangular van der Corput列が研究されていることを知った。

手順の概要は参考1に記載されている。

インデックスに基づき三角形を４当分していき、該当の三角形のcentroidを結果として使う。

### code v0.1

ネスト方式での実装

```subtriangle_171014.py
import numpy as np

# on Python 3.5.2

# v0.1 Oct. 14, 2017
#   - add get_centroid()
#   - loop until two depths
#   - add get_subvertices()


def get_centroid(vertices):
	inA, inB, inC = vertices
	return (inA + inB + inC) / 3


def get_subvertices(outer, didx):
    # outer: vertices of original triangle
    # didx: [0..3]
    #
    # Reference: Basu and Owen, SIAM J. NUMER. ANAL. 53, 743-761, 2015
    #
    inA, inB, inC = outer
    if didx >= 4:
        return 0, 0, 0  # error
    if didx == 0:
        resA = (inB + inC) / 2
        resB = (inA + inC) / 2
        resC = (inA + inB) / 2
    if didx == 1:
        resA = inA
        resB = (inA + inB) / 2
        resC = (inA + inC) / 2
    if didx == 2:
        resA = (inB + inA) / 2
        resB = inB
        resC = (inB + inC) / 2
    if didx == 3:
        resA = (inC + inA) / 2
        resB = (inC + inB) / 2
        resC = inC
    return resA, resB, resC

# regular triangle
pA = np.array([1, 0])
pB = np.array([-1, 0])
pC = np.array([0, 2])

# loop
for d1 in range(4):
    s1A, s1B, s1C = get_subvertices([pA, pB, pC], didx=d1)
    cntrd = get_centroid([s1A, s1B, s1C])
    print(cntrd)
    for d2 in range(4):
        if d2 == 0:
            continue
        s2A, s2B, s2C = get_subvertices([s1A, s1B, s1C], didx=d2)
        cntrd = get_centroid([s2A, s2B, s2C])
        print(cntrd)

```

```txt:run
$ python3 subtriangle_171014.py 
[ 0.          0.66666667]
[-0.25        0.83333333]
[ 0.25        0.83333333]
[ 0.          0.33333333]
[ 0.5         0.33333333]
[ 0.75        0.16666667]
[ 0.25        0.16666667]
[ 0.5         0.66666667]
[-0.5         0.33333333]
[-0.25        0.16666667]
[-0.75        0.16666667]
[-0.5         0.66666667]
[ 0.          1.33333333]
[ 0.25        1.16666667]
[-0.25        1.16666667]
[ 0.          1.66666667]
```

### 本来の式

本来は以下の式に基づく。

```math
T(d1, d2) = (T(d1))(d2)
```
d2は0以外。

与えられたインデックスを元にd1, d2の値を求めて、逐次T()を計算していけばいいはず。
Visual Studio for MacからのiPhone実機デバッグがうまくいかないときに確認するポイント

VS for MacからのiPhone実機デバッグをしようとしたところ、いくつかハマったのでその回避策やチェックポイントをまとめます。

実機デバッグにおいて起こり得るエラーやその対策を網羅しているわけではないので、この記事を読んでいる方の手元で起こった事象と合致するものがあればラッキーくらいのテンションで読んでいただけると幸いです。


# 実機デバッグの方法

僕は以下の環境で試しました。

* Visual Studio Community 2017 for Mac (Preview): Version 7.3 Preview (7.3 build 692)
* Xamarin.iOS
Version: 11.4.0.84 (Visual Studio Community)
* Xcode: Version 9.0 (9A235)
* iPhone: iPhone5

大まかな手順としては、Xcode　からプロビジョニングプロファイルを実機に登録して、VS for Macでそのプロビジョニングプロファイルを使い回すイメージです。

そのため、最初に Xcode を起動することになると思います。

時期的に比較的近い記事だとこちら、

[#013 Xamarin を iPhone で動かしてみる](http://kikuzo.hatenablog.jp/entry/2017/02/19/220520)

書籍だと

[『基礎から学ぶ Xamarinプログラミング』](https://www.amazon.co.jp/%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B6-Xamarin%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E8%A5%BF%E6%9D%91-%E8%AA%A0/dp/4863542240/ref=sr_1_3?ie=UTF8&qid=1507946230&sr=8-3&keywords=xamarin)

に手順が説明されています。

# つまずいたこと
## Xcode と VS for Mac （で作成したプロジェクト）でバンドル識別子を合わせる
まず Xcode バンドル識別子に対応するプロビジョニングプロファイルを実機に配置するので、VS for Mac で異なるバンドル識別子を設定している状態だと信頼されている状態にならず実機デバッグできません。

ソリューション名（プロジェクト名）だけ合わせても自動的にバンドル識別子まで合致するとは限りません。

### Xcode
<img width="1289" alt="xcode-bundleid.png" src="https://qiita-image-store.s3.amazonaws.com/0/46547/724e94f6-c771-f7ae-f5e2-acf37ac85c59.png">

### VS for Mac
<img width="1391" alt="vs4mac-bundleid.png" src="https://qiita-image-store.s3.amazonaws.com/0/46547/8a9e0059-9c98-2016-e2e7-4fcc0dd7dc0d.png">

## 実機のアーキテクチャに合ったビルドオプションを設定する
VS for Mac からアプリの配置時に次のようなエラーが出る場合がありました。

```
iOS Failed to find matching arch for 64-bit Mach-O input file
```
そのときはプロジェクトのオプションを次のように設定してみてください。

<img width="955" alt="ios5.png" src="https://qiita-image-store.s3.amazonaws.com/0/46547/912e620a-2943-0716-a35b-7c3d1efcaa96.png">

## アプリが信頼された状態になっているか確認する
VS for Mac からアプリの配置時に次のようなエラーが出る場合がありました。

<img width="600" alt="スクリーンショット 2017-10-14 10.19.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/46547/c1bf703f-7a0e-5c27-cd98-c4fef46b6ad8.png">

アプリケーション出力では

```
Could not find developer tools for this 10.3.3
```

これは僕の場合、実機のアプリを消したり入れたりして信頼された状態にしていなかっただけでした。

実機の「設定」→「一般」→「デバイス管理」→「自分のデベロッパーID」でデバッグ対象のアプリを信頼した状態に設定してください。

<img src=https://qiita-image-store.s3.amazonaws.com/0/46547/cd370ad3-a39c-fe41-8015-3576e53e70b3.png width="320px">



## ネットに接続する
実機の検証はネットに接続されていないと進みません。

WiFi しか接続できない端末の場合は特に接続状況を確認してみてください。


## その他
プロジェクト名にハイフンやアンダースコアが入っている場合も要注意です。

[XamarinでiOSの実機デバッグをする方法](https://qiita.com/ikuhanaRock/items/e0cce00223068a26eee9)
GoでXMLにもJSONにもできる構造体を作る

goの構造体のタグは、スペース区切りで複数つけることができる。
これを利用して、encoding/xmlのMarshalにも、encoding/jsonのMarshalにも対応した構造体を作ることができる。

## 例

```go
package main

import (
	"encoding/json"
	"encoding/xml"
	"fmt"
)

type Foo struct {
	XMLName xml.Name `json:"-"`
	Aaa     []string `xml:"aaa" json:"aaa"`
	Bbb     []string `xml:"bbb" json:"bbb"`
}

func main() {
	foo := Foo{
		XMLName: xml.Name{"", "foo"},
		Aaa: []string{
			"12345", "67890",
		},
		Bbb: []string{
			"ABCDE", "FGHIJ",
		},
	}
	fmt.Println(foo)

	x, _ := xml.MarshalIndent(foo, "", "  ")
	fmt.Println(string(x))

	j, _ := json.MarshalIndent(foo, "", "  ")
	fmt.Println(string(j))
}
```

実行結果:

```
$ go run xml.go 
{{ foo} [12345 67890] [ABCDE FGHIJ]}
<foo>
  <aaa>12345</aaa>
  <aaa>67890</aaa>
  <bbb>ABCDE</bbb>
  <bbb>FGHIJ</bbb>
</foo>
{
  "aaa": [
    "12345",
    "67890"
  ],
  "bbb": [
    "ABCDE",
    "FGHIJ"
  ]
}
```

## 解説

### 複数のタグ

見ての通り、構造体タグは複数個指定することができる。

```go
`xml:"aaa" json:"aaa"`
```

簡単なマッピングであれば、1つの構造体定義を使いまわしてxml表現およびjson表現を設定できる。

### タグの設定は必要なの？

構造体にタグを設定していない場合、Marshal時の表現名は構造体と完全一致になる。

Goではpublicプロパティは名称の先頭が大文字にしなければならないという制約がある。この挙動で困る場合は明示的にタグを書くと良い。

### XMLNameってなんぞ

XMLにはルート要素があり、ルート要素に名前を持っている。(この場合だと `foo` )
これをencoding/xmlでは `XMLName` という特殊な名前の構造体要素に当てはめるようにしている。型はxml.Nameの実体である必要がある。

一方で、JSONの場合この概念は不要なので、タグで `json:"-"` を指定することで無視させている。(ハイフン一文字だと要素を無視する意味になる)


## まとめ

似たような感じで、DBでの保存形式を構造体のタグで表現するORマッパーがあるかもしれない。
その場合も、１つの構造体で定義することができると思う。
GPUでディープラーニングやるならAWSよりFloydHub

Udacityの[Deep Learning Nanodegree Foundation](https://www.udacity.com/course/deep-learning-nanodegree-foundation--nd101)
のコースで[FloydHub](https://www.floydhub.com/)という便利なサービスが紹介されていました。ディープラーニングのHerokuだそうです。

GPUが使えるプランも月額14ドルからなので、手軽にGPUでディープラーニングを始めることができます。
TensorFlowとKerasがデフォルトですが、他にもPyTorchやChainerなどメジャーなフレームワークはだいたい使えるようになっています。

##### **2017/10/18 追記**
この記事を書いた直後に、KaggleのKernelについての記事が投稿されています。Kaggleのデータセットに限って言えば、Kernelを使う方が簡単そうです。
[パワーアップしたKernelでKaggleに飛び込もう - Qiita](https://qiita.com/jagainu/items/2a1e3779f944588d29de)

## FloydHubのいいところ

### 起動が簡単
floyd-cliというコマンドラインツールが用意されていて、それを使うとコマンドラインから簡単に環境を起動することができます。
例えばGPUの環境でJupyter NotebookからPyTorchを使用したい場合は、

```
floyd run --gpu --env pytorch-0.2 --mode jupyter
```

と打ち込むだけでJupyter Notebookのサーバーが起動して、少し待っているとブラウザも自動的に表示されます。
SSHでホストに接続してJupyter Notebookを起動するという作業が必要がないので、すぐに使い始めることができます。

floyd-cli自体のインストールも簡単で、普通にpipでインストールするだけです。

```
pip install floyd-cli
```


### 同じNotebookでCPUとGPUを使い分けることができる
Jupyter Notebookで作業をしている場合、GPUインスタンスを使っていても計算をしていない時間が長くなります。
できればNotebookを編集している時は単価の安いインスタンスを使って、計算を実行するときだけGPUインスタンスを利用できるといいんですが、AWSだとインスタンスごとにデータを持つのでなかなか面倒です。
FloydHubでは同じデータでCPUのみの環境とGPUの環境を簡単に切り替えることができるので、無駄にGPUを使うことがなくなります。


### データセットをダウンロードしなくてもいい
ディープラーニングでは巨大なデータセットを扱うことが多いので、そのダウンロードにかなりの時間がかかることがあります。
FloydHubではよく使われるデータセットが用意されていて、起動時にマウントすることができるのでダウンロードや解凍する手間を省くことができます。
例えばKaggleの[Dogs vs. Cats](https://www.kaggle.com/c/dogs-vs-cats-redux-kernels-edition/data)のデータセットを使いたい場合は、

```
floyd run --data fastai/datasets/cats-vs-dogs/2:/data --mode jupyter
```

と打ち込めば、/dataディレクトリにデータセットがマウントされます。


### 料金が事前に決まっている
AWSは使った分だけ後から請求されるので、インスタンスを停止するのを忘れてしまうと大変なことになります。
ディープラーニングに使うGPUインスタンスは1時間100円ぐらいからなので、例えば１ヶ月立ち上げっぱなしにしていると100円×24時間×30日＝72,000円もかかってしまいます。
FloydHubは月額の料金が決まっていてその範囲内だけ使用できるという契約になっているので個人で利用するには安心です。
足りなくなればPowerupsというのを購入すれば後から時間を追加することもできるようになっています。

[Pricing | FloydHub](https://www.floydhub.com/pricing)


## FloydHubのイマイチなところ

### 使える環境が決まっている
FloydHubではあらかじめいくつかのDockerイメージが用意されていてその中から選ぶことしかできません。
ハードウェアはGPUあり・なしの２種類だけです。
[List of Available Environments - FloydHub Documentation](https://docs.floydhub.com/guides/environments/)

ただし、floyd_requirements.txtというファイルに必要なパッケージを書いておけば起動時に追加のパッケージをインストールしてくれるので、ほとんどの場合は問題ないと思います。


### 環境が残らない
起動するたびに新しい環境が作られるので、起動後にインストールしたパッケージなどは残りません。毎回インストールするか、それが面倒ならfloyd_requirements.txtに書いておく必要があります。


## 参考リンク
[とりあえずFloydhubで遊んでみた - Qiita](https://qiita.com/pytry3g/items/682edf2dcafd6cce5ce6)
Angular tips(4)

# Angular 復習(Angular4～)

## @Input、@Output

### 1. @Input

@Inputは、親コンポーネントが、子コンポーネントにデータを渡すための
デコレータである。

子コンポーネントのクラスに@Inputデコレータを付けた変数を用意し、親コンポーネントHTMLの子コンポーネントセレクタの[変数名]に値を代入する。
これにより、item変数に値が入り、子コンポーネントの画面に反映することができる。

子コンポーネントクラス

```
@Component(
    selector: 'stock-order',
    templete: `<ul><li>{{item.price}}</li><li>{{item.qty}}</li></ul>`,
)
export class ItemComponent{
    @Input item: Order;
}
```

親コンポーネントhtml

```
<stock-order [item]="selected"></stock-order>
```

### 2. @Output

@Outputは、@Inputとは逆に子コンポーネントから親コンポーネントにデータを渡すためのデコレータである。
子コンポーネントに、EventEmiter<?>オブジェクトを生成し、emit()メソッドをコールすることで、親コンポーネントに通知する。
親コンポーネントでは、子コンポーネントセレクタでイベントバインディング構文を`(定義した子コンポーネント@Output変数)="親コンポーネントfunc($event)"`という形で追加、親コンポーネントfunc($event)内で親コンポーネントの画面に反映をする。つまり、親コンポーネントにイベントとして通知される。

子コンポーネント

```
@Component(
    selector: 'stock-order',
    templete: `<ul><li>{{item.price}}</li><li>{{item.qty}}</li></ul>`,
)
export class ItemComponent{
    @Input  item : Order;
    @Output editedItem: EventEmiter<Order>;

    submit(){
        this.editedItem.emit(this.item);
    }
}
```

親コンポーネント

```
@Component(
    selector: 'order',
    templete: `<h1>{{price}}</h1><stock-order ></stock-order>`,
)
export class OrderComponent{
    price: int;
    onEdited(item: Order){
        price = item.price;
    }
}
```
CentOS6.9、Apache2.2 に PHP7.0を導入しLaravel5.5を動かすメモ

更新中

# 目標
Laravel 5.5 アプリをステージングサーバへデプロイする

# 環境
CentOS6 が入っているVPS
(Apache 2.2 はインストールされていた）

# やったこと
## PHP7.0 インストール
下記を参考に以下のコマンド
https://qiita.com/ozawan/items/caf6e7ddec7c6b31f01e

```bash:yumリポジトリ追加
sudo yum install epel-release
sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
```

```PHPインストール
sudo yum install --enablerepo=remi,remi-php70 php php-devel php-mbstring php-pdo php-gd php-xml php-mcrypt php-pecl-zip
```

## Composer インストール
下記を参考にシェルにて以下のコマンドを実行
https://getcomposer.org/download/

```
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
mv composer.phar /usr/local/bin/composer
```

## Laravel インストール
公式ドキュメントの通り
https://readouble.com/laravel/5.5/ja/installation.html

```
composer global require "laravel/installer"
```

下記でプロジェクトができる

```
~/.composer/vendor/bin/laravel new jikken
```
適当にPATH設定。

これで、ローカルで作業したものをcloneすれば構築したステージングサーバで動く（はず。）
Python パッケージ作成: __init__.py の __all__ を手作業でメンテナンスしたくない

# ```import *``` と ```__init__.py``` の ```__all__``` の関係

「[Python チュートリアル](https://docs.python.jp/3/tutorial/index.html)」の「[6.4.1. パッケージから * を import する](https://docs.python.jp/3/tutorial/modules.html#importing-from-a-package)」を読むと、```__init__.py``` 中に ```__all__``` という変数を定義することで、```from some_package import *``` とした場合に読み込まれるモジュールを制御できることが分かります。

例として、以下のパッケージ構成で考えます。

```
some_package/__init__.py
some_package/hoge.py
some_package/piyo.py
some_package/fuga.py
```

次のように ```some_package/__init__.py``` に ```__all__``` を定義します。

```python:some_package/__init__.py
__all__ = ['hoge', 'piyo']
```

この場合に ```from some_package import *``` とすると、```some_package.hoge``` と ```some_package.piyo``` はインポートされますが、```some_package.fuga``` はインポートされません。

# ```import *``` でパッケージ内の全モジュールをインポートさせたい

細かく制御したい場合は ```__all__``` に手作業でモジュール名を指定すれば良いのですが、```from some_package import *``` としたときに「パッケージ内の全モジュールをインポートさせたい」「パッケージ内にモジュールを増やしたときに手作業で ```__all__``` に追加するのは面倒」という場合もあると思います。

そういう場合は、```__all__``` を以下のように定義しておくことで、自動的に追従することができます。

```python:some_package/__init__.py
import os, glob

__all__ = [
    os.path.split(os.path.splitext(file)[0])[1]
    for file in glob.glob(os.path.join(os.path.dirname(__file__), '[a-zA-Z0-9]*.py'))
]
```

# 他の人が作ったパッケージの場合

他の人が作ったパッケージの場合は、上記のように対応できないかもしれません。そのときは以下のような関数を作成し、```import_submodules(some_package)``` とすることで対応できます。

```python
import os, glob, importlib

def import_submodules(module):
    files = glob.glob(os.path.join(os.path.dirname(module.__file__), '[a-zA-Z0-9]*.py'))
    names = [os.path.split(os.path.splitext(file)[0])[1] for file in files]
    submodules = [importlib.import_module('.'.join([module.__name__, name])) for name in names]
    return submodules
```
HAProxyのバージョンの確認方法

### versionの確認方法

```
$ /usr/local/haproxy/sbin/haproxy -v
```

> HA-Proxy version 1.5.3 2014/07/25
> Copyright 2000-2014 Willy Tarreau <w@1wt.eu>


--- 

（参考） 
OS起動時にinit.d経由で、haproxyが起動するので、その設定をみると、

```
$ cat /etc/init.d/haproxy
```

> ・・・略
> start() {
>   /usr/local/haproxy/sbin/\$BASENAME -c -q -f /etc/\$BASENAME/\$BASENAME.cfg

 - start()関数内に、上記のhaproxyの実行パスが書いてある。
Ruby クイズ 5問 (初級)

# 問題

## Q. puts と p の違いは？

## A.

## Q. exit と exit! の違いは？

### A.

## Q. メソッド名のビックリ ( ! ) は何を表す？

### A.

## Q. メソッド名のクエスチョン ( ? ) は何を表す？

### A.


## Q. インスタンスメソッドとクラスメソッドの違いは？

### A.

# 参考

- [rubyのprint / puts / p の違い - Qiita](https://qiita.com/shoma2da/items/b2c92c6556858a4722b3)
- [Ruby の exit と exit! の違い - Qiita](https://qiita.com/siman/items/c9eb9641a6183ee23b7c)
- [破壊的メソッド名には!をつけなければならない…なんて、誰が言ったの？ - Qiita](https://qiita.com/tadsan/items/7baab2605a4d8ac1858e)
- [Rubyで使われる記号の意味（正規表現の複雑な記号は除く） (Ruby 2.4.0)](https://docs.ruby-lang.org/ja/2.4.0/doc/symref.html)
- [Rubyのクラスメソッドとインスタンスメソッドの例 - Qiita](https://qiita.com/tbpgr/items/56eb65c0ea5882abbb07)

# 解答例

<details>
 1. puts は出力用 / p はデバッグ用
 2. exit! は例外をキャッチさせない
 3. 要注意であることを示すことが多い
 4. 状態 ( true / false ) を問うために使われることが多い
 5. 状態を持つメソッドと持たないメソッド
</details>











<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
View四隅の座標の取得

# 親Viewを基準としたViewのX,Y座標 (OSX)
NSImageViewのview、
``@IBOutlet weak var view: NSImageView!``
の上下左右端の座標を取得する。

## X座標
・左端　``view.frame.origin.x``
・右端　``view.frame.origin.x + view.frame.size.width``

## Y座標
・上端　``view.frame.origin.y``
・下端　``view.frame.origin.y + view.frame.size.height``

##そのた
参考：[How get bottom y coordinate]("https://stackoverflow.com/questions/17332622/how-get-bottom-y-coordinate "How get bottom y coordinate")
実際にやってみるとy座標はウィンドウの下端が基準になっているようだが、iOSだと上端基準なのか？
LINQ to Wikiで C# .NET環境でWikipediaの記事を取得する

#はじめに 


LINQ to Wikiとは、Mediawiki APIをラップしているライブラリで.NET環境でLinqを駆使したエレガントな記述でWikipediaの記事を取得できます。
LINQ to WikiはNugetマネージャーからインポートできます。

#サンプルコード 
何はともあれコードを見てみましょう。
以下のコードは作者のgithubの.docに書いてあるサンプルコードを日本語版wiki用に書き直したものです。

このコードでは"ヒガンバナ"の記事を取得してコンソールに出力しています。

```
using System;
using System.Collections.Generic;
using System.Linq;
using LinqToWiki.Generated;
using LinqToWiki;


Wiki wiki = new Wiki("LinqToWiki.Samples", "https://ja.wikipedia.org", "/w/api.php");
			
PagesSource<Page> pages = wiki.Query.allpages()
							        .Where(X => X.prefix == "ヒガンバナ")
									.Pages;

IEnumerable<string> articles = pages.Select(
											page =>
											page.revisions()
												.Select(r => r.value)
												.FirstOrDefault()
										   ).ToEnumerable();

Console.Write(articles.FirstOrDefault());

```

LINQ特有のワンライナーな書き方なので面食らうかもしれませんが、一つずつ見ていきましょう。

--
これでWikiPedia日本語版の情報を持ったWikiオブジェクトを生成しています。
第一引数はUser Agent、第二引数はWikipedia日本語版のURL,第三引数はMediaWiki APIのパスです。

```
Wiki wiki = new Wiki("LinqToWiki.Samples", "https://ja.wikipedia.org", "/w/api.php");
```

 
 
　

wikiクラスからはログインや編集など様々な操作を行えますが、記事や画像を取得したい時はQueryプロパティを使います。
Wikipediaの全ページのタイトルから"ヒガンバナ"を含む記事を全て取得します。

```
PagesSource<Page> pages = wiki.Query.allpages()
							     	.Where(X => X.prefix == "ヒガンバナ")
									.Pages;
```
　
　
更に続きます。
ちょっとゴチャゴチャしてますね。
ここでやっている事は先程取得したpagesから **各記事の最新バージョンを抜き出して IEnumerable\<string\>にまとめる**という操作です。

pageオブジェクトのrevisions()には記事のバージョン差分が入っています。
revisions()で取得できる最初の要素が最新の記事なのでこれをFirstOrDefault()で指定します。
最後にToEnumerable()する事で見慣れたIEnumerable\<string>に出力する事ができます。




```
IEnumerable<string> articles = pages.Select(
											page =>
											page.revisions()
												.Select(r => r.value)
												.FirstOrDefault()
										   ).ToEnumerable();
```

最後に取得した記事の最初の要素を出力しましょう。
https://ja.wikipedia.org/wiki/ヒガンバナ
と同じ内容の文章が出力されるはずです。
articlesの後続の要素には「ヒガンバナ科」とか「ヒガンバナ属」の記事も含まれています。

```

Console.Write(articles.FirstOrDefault());

```
Ruby の exit と exit! の違い

`exit` は例外処理を記述すれば処理を続行出来る。 `exit!` は例外処理を一切行わずプログラムを終了する。

```rb
def proc_exit
  puts "proc_exit"
  exit
rescue SystemExit
  puts "rescued a SystemExit exception"
end

def proc_exit!
  puts "proc_exit!"
  exit!
rescue SystemExit
  puts "rescued a SystemExit exception"
end

proc_exit
proc_exit!
```

出力

```
proc_exit
rescued a SystemExit exception
proc_exit!
```


## 参考サイト

https://docs.ruby-lang.org/ja/latest/method/Kernel/m/exit=21.html
簡易JSONパーサ

# 概要
Qiitaにまともな記事を書く志はないです.
TL;DR
JSON のSAXっぽいパーサってないよな.
こういうの好きだなカスタマイザブルで, SAXて男のコだよな.
~~[RapidJSON](http://rapidjson.org/)~~？知らんがな.

我慢できない人はこちら->[GitHub](https://github.com/taqu/cppjson)
これ自体はどうでもいい, 次のプロジェクトに使うための副産物でしかない.
# 環境
おそらくどうとでも. 動かなかったら頑張れ.
# 実装の概要
[JSON](http://www.json.org/)見ながら頑張る.
ECMA-262は見てない.
# まとめ
サーバ・クライアント間のプロトコルに使われることがあるけれど,
IDLなりSchemaがないと本当に無駄作業に悩まされるなと思います, まる.
ECMA Scriptで扱いが楽というだけであって, あらゆる通信規約として優秀, というわけではないよね, せめてサーバ・クライアント間でSchemaを共有できる仕組みがないと.

効率に関しては, [miloyip's nativejson-benchmark](https://github.com/miloyip/nativejson-benchmark)は必読として,
[A Branchless UTF-8 Decoder](http://nullprogram.com/blog/2017/10/06/)
[SJSON: A succinct representation for JavaScript object notation documents](http://ieeexplore.ieee.org/document/7829787/)
できることはあるのではないかな.
【Vue.js 2.5】v-model の dynamic type binding on <input>を試してみた


Vue.js 2.5でサポートされた、v-modelの「dynamic type binding on <input>」をjsFiddleで試してみました
[[Vue 2.5] dynamic type binding on <input>] (https://jsfiddle.net/Lyri_m/77w0pukz/)

type属性に指定できる値を列挙してselectで選択、その値でinputのtypeにバインドしてます
バインドできるのが変数名「type」だけだったのでおかしいなと思っていたのですが、早速2.5.1で修正されましたね……

参考：
[Release v2.5.0 Level E · vuejs/vue · GitHub] (https://github.com/vuejs/vue/releases/tag/v2.5.0)
[Vue 2.0 Hello World - JSFiddle] (https://jsfiddle.net/chrisvfritz/50wL7mdz/)　こちらからforkしました
[\<input>－HTML5タグリファレンス](http://www.htmq.com/html5/input.shtml)
自作ScriptableObjectのAssetファイルを出力させるエディタ拡張

# 自分でScriptableObjectを作るときに.assetファイルを作るのがめんどくさい
というわけで作りました。

1．ScriptableObjectを継承したクラスを「SelectScript」に入れる
2．吐き出したいResources以下のPathを指定
3．CreateAssetで指定の場所に.assetファイルが出力されます

![ScriptableObjectCreator.jpg](https://qiita-image-store.s3.amazonaws.com/0/138731/a6f3debc-fda3-519c-deb6-3e40baf3fd11.jpeg)


[こちら](https://github.com/JohnnyBoss1206/ScriptableObjectCraator)からDLできます
よかったらどうぞ
Angular2~でBootstrap3を使う手順

# AngularでjQueryとBootstrap3を使う手順

* [ベースはAngular CLIで新規生成したコード](https://angular.io/guide/quickstart)
* jQueryはVSCodeで補完できるようにする

## あらかじめ
* node.js、npmがインストールされていること

## 手順

- モジュールをインストール
 
```shell-session:at-project-home
npm install bootstrap --save
npm install jquery --save
npm install @types/jquery --save-dev
```
 
- .angular-cli.jsonを修正

```json:.angular-cli.json
{
      ...

      "styles": [
        "../node_modules/bootstrap/dist/css/bootstrap.min.css",
        "styles.css"
      ],
      "scripts": [
        "../node_modules/jquery/dist/jquery.min.js",
        "../node_modules/bootstrap/dist/js/bootstrap.min.js"
      ],

      ...
}
```

- jQueryインポートして使う

```ts:app.component.html
import { Component, AfterViewChecked  } from '@angular/core';
import * as $ from 'jquery';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements AfterViewChecked {
  title = 'app';
  ngAfterViewChecked() {
    $('div.error').each((idx, elem) => elem.setAttribute('style', 'color:red;') );
  }
}
```

これだけ
---
http://deanmalone.net/post/using-jquery-from-angular2/
https://stackoverflow.com/questions/30623825/how-to-use-jquery-with-angular

---
IoT用モバイルバッテリーの比較・検証

`I wrote it in English in the comment section.`

#◆はじめに
自律走行ロボ(RaspberryPi3)の電源をいかに確保し、再充電機構含め、長時間駆動をいかに実現するかを思案した。
オフグリッド化を目的とした検証のため、USB入力 及び USB出力のみに限定し、縛りとしてコンセントを内蔵するバッテリーは最初から検証対象から除外するものとする。
何種類もメーカーと機種を変え、動作を検証してみたため下記に残す。
先達の諸兄がすでに検証しているとは思うが、当方は少し細かめに検証してみたつもり。
ごちゃごちゃと書かない。簡潔にまとめる。
下記以外にこれぞ、という現状入手可能なバッテリがあれば是非ご教示いただきたい。

clsesさんが別の機器で既に検証をされている、が、自分と少し前提が違い、コンセントからの入力ON/OFFを試行いただいている。
https://qiita.com/clses/items/3aec1b0bf975f614723c

#◆検証対象のモバイルバッテリー
| № |製造<br>リージョン|メーカー|製品名・型式|容量|サイズ(縦×横×高さ)<br>重量|備考|
|:-:|:-----|:------|:----------|--:|:------------------------|:---|
|１|日本|ELECOM|DE-M04L-3015|3,000mAh|27×90×26<br>78g|まとめて充電対応(充電と放電の同時対応)を公称|
|２|中国|Sharllen|B01M3VOELN|10,000mAh|135.5×73.2×19.3<br>212g|Qi放電／充電の両方に対応|
|３|中国|Xiaomi|PLM02ZM|10,000mAh|130×71×14.1<br>250g|IoT対応を公称|
|４|豪州|plus us|LIFE CARD|1,500mAh| 85×53×3.95<br>52g|超薄型・小型・軽量|
|５|台湾|ADATA|A10050|10,050mAh|100x60x22<br>220g|充電と放電の同時対応を公称|

#◆検証結果
|№|要件|DE-M04L-3015|B01M3VOELN|PLM02ZM|LIFE CARD|A10050|備考|
|:-:|:---|:--------:|:--------:|:-----:|:-------:|:----:|:----------------------------------------|
|１|小型であること|◯|✖|✖|◎<br>極限の小ささ|△<br>容量の割には小さい|大きさを重視するなら断然LIFE CARD|
|２|200mA～の出力量で安定的に継続出力されること|◯|◯|◯|◯|◯|当然の結果|
|３|10mA～100mAの微電流による出力中にスリープへ移行しないこと|✖<br>30秒ごとに充電と放電を繰り返し無限ループするが不具合ではなさそう<br>10mA未満では発生してない|◯|✖|✖|✖|機種によって閾値に細かな差有り|
|４|25μA～999μAの微電流による出力中にスリープへ移行しないこと|✖|✖|✖|✖|✖|
|５|たとえスリープに移行したとしても、接続機器が電力消費を開始した時にハードウェアボタンなどの特別な操作無しにスリープが自動的に解除されること|◯|✖|✖|✖|✖|これが✖だとオフグリッド化する際は致命的<br>ひとたびスリープに入ると人力で起動しなくてはならない<br>ハードウェアボタンの押下不要は大きなアドバンテージ|
|６|放電中に充電ケーブルを接続し給電を開始したとき、出力側が瞬断しないこと|◯|✖|✖|✖|◯||
|７|放電中に充電ケーブルを抜いたとき、出力側が瞬断しないこと|◯|✖|✖|✖|✖||
|８|放電／充電が同時に可能であること<br>（本当の意味での「同時」であること）|△<br>ケーブルは同時接続可能だが本当の意味での放電／充電の同時実施はされない<br>バッテリ残量がゼロになったときに初めて放電を止めて充電モードへ切り替わる|◯<br>入力電流1,800mAの場合、充電1,500mA/放電300mA前後に電力が案分される|✖|✖|◯<br>入力電流1,800mAの場合、充電1,500mA/放電300mA前後に電力が案分される|B01M3VOELNとA10050は可能だが、バッテリ側のメス端子に抜き差しした場合のみ正常動作する<br>また、入力電流が1,500mA未満だと出力電圧がとてつもなく不安定になるため注意|
|９|調達しやすい市販の5.0Vモバイルバッテリであること|◯|◯|◯|◯|◯||

#◆終わりに
モバイルバッテリ単独では充電と放電を繰り返すことによる無限駆動は困難だが、補助電源を組み合わせればある程度は実現できそうだ。
自身がイメージする自律走行ロボの用途には「ELECOM DE-M04L-3015 3,000mAh」が一番目的に合いそう。
唯一、№８の要件のみがネックだが補助電源にて対応する。
よって、最低限必要な駆動時間を鑑み、ワンサイズ大きい「ELECOM DE-M01L-6030 6,000mAh」をさらにひとつ調達することとする。
金が・・・
FuelPHP上のRedisで配列を使う

FuelPHPでRedisを使う場合、基本的にCoreのRedis_Dbを使う事になると思いますが、
MGETなどの可変長のデータを取り扱いたいときに配列がサポートされていないので今一使い辛いです。

他のredisライブラリを使うなどの方法があると思いますけど今回Coreを拡張してみます。
拡張のやり方自体は[日本語サイト](http://fuelphp.jp/docs/1.8/general/extending_core.html)参照

拡張対象の関数

```php:fuel/core/classes/redis/db.php 
	/**
	 * @param   $name
	 * @param   $args
	 * @return  $this|array
	 * @throws  \RedisException
	 */
	public function __call($name, $args)
	{
		// build the Redis unified protocol command
		array_unshift($args, strtoupper($name));
		$command = '*' . count($args) . CRLF;
		foreach ($args as $arg) {
			$command .= '$' . strlen($arg) . CRLF . $arg . CRLF;
		}
		// add it to the pipeline queue
		$this->queue[] = $command;
		if ($this->pipelined)
		{
			return $this;
		}
		else
		{
			return $this->execute();
		}
	}
```

主にredisサーバに送るデータを作ってる前半箇所を弄ります。

```php
		array_unshift($args, strtoupper($name));
		$command = '*' . count($args) . CRLF;
		foreach ($args as $arg) {
			$command .= '$' . strlen($arg) . CRLF . $arg . CRLF;
		}
```

##実装
拡張内容としては配列だった場合に配列を含めた要素をカウントしつつ配列そのものをデータとして使います。

```php:fuel/app/classes/redis/db.php
	public function __call($name, $args)
	{
		// build the Redis unified protocol command
		$values = $args[0];
		$name = strtoupper($name);
		array_unshift($args, $name);
		$cnt = is_array($values) ? count($values) + 1 : count($args);
		$command = '*' . $cnt . CRLF;
		if (is_array($values)) {
			$command .= '$' . strlen($name) . CRLF . $name . CRLF;
			$args = $values;
		}
		foreach ($args as $arg) {
			$command .= '$' . strlen($arg) . CRLF . $arg . CRLF;
		}
…
	}
```

__callではなくそれぞれのredisコマンドに合わせて関数を作れば、
\$key=>\$valueに対応することでMSETとかもつかいやすくなるかと思います。

```php:fuel/app/classes/redis/db.php
        public function mset($args)
        {
                $cnt =  count($args) * 2 + 1;
                $command = '*' . $cnt . CRLF;
                $command .= '$' . 4 . CRLF . 'MSET' . CRLF;
                foreach ($args as $key => $value) {
                        $command .= '$' . strlen($key) . CRLF . $key . CRLF;
                        $command .= '$' . strlen($value) . CRLF . $value . CRLF;
                }

                // add it to the pipeline queue
                $this->queue[] = $command;
                if ($this->pipelined)
                {
                        return $this;
                }
                else
                {
                        return $this->execute();
                }
        }

```

##簡単な解説
FuelPHPのRedisはライブラリなどは使わずにソケット通信で実現しているので、
プロトコルに合わせた文字列を作る必要があります。
プロトコルっていうと何か凄く難しい印象があるけど、
Redisのプロトコルを調べてみたら[日本語マニュアル](http://redis.shibu.jp/hacker/protocol_spec.html)の説明にある通り思ったより簡単でした。
Coreの実装を見るとプロトコルに合わせた文字列を作って送っているのがわかります。
FuelPHPのクイックインストール実行時に構文エラー

[日本語サイト](http://fuelphp.jp/docs/1.8/installation/instructions.html)に習ってFuelPHPをクイックインストールしようとしたが下記エラーが出てインストールが出来ませんでした。

```
[root@localhost ~]# curl get.fuelphp.com/oil | sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   239  100   239    0     0     33      0  0:00:07  0:00:07 --:--:--    51
sh: 行 1: 予期しないトークン `newline' 周辺に構文エラーがあります
sh: 行 1: `<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">'
```

wgetで一回oilファイルをダウンロードしてからshで叩いたら無事インストール出来ました。
インストールが出来ればoilファイル自体は消してOK
NetworkManager dnsmasq exited with error: Network access problem (address in use, permissions)の修正

# Overview

以下のように、/var/log/syslogがエラーで溢れているのを治す。

```
Oct 12 09:52:32 myhost NetworkManager[817]: <warn>  [1507769552.4205] dnsmasq[0xcd4ab0]: dnsmasq exited with error: Network access problem (address in use, permissions) (2)
Oct 12 09:52:32 myhost NetworkManager[817]: <warn>  [1507769552.6835] dnsmasq[0xcd4ab0]: dnsmasq exited with error: Network access problem (address in use, permissions) (2)
Oct 12 09:52:32 myhost NetworkManager[817]: <warn>  [1507769552.9465] dnsmasq[0xcd4ab0]: dnsmasq exited with error: Network access problem (address in use, permissions) (2)
Oct 12 09:52:33 myhost NetworkManager[817]: <warn>  [1507769553.1983] dnsmasq[0xcd4ab0]: dnsmasq exited with error: Network access problem (address in use, permissions) (2)
```

# 対処方法

```
$ sudo dpkg-reconfigure resolvconf
```

```/etc/NetworkManager/NetworkManager.conf
[main]
plugins=ifupdown,keyfile,ofono
-dns=dnsmasq
+#dns=dnsmasq

[ifupdown]
managed=false
```

## 以下はダメだった

```
sudo apt-get remove --purge network-manager network-manager-*
sudo apt-get install --reinstall network-manager
```

で、network managerの再installでは解決しなかった。
なお、上を試してしまうと、DNSを引けなくなるので、以下のような対処も必要になった。。。

```/etc/resolvconf/resolv.conf.d/head
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN

nameserver 8.8.8.8
```

以下も試していた。

```
sudo rm /etc/resolv.conf
sudo ln -s /run/resolvconf/resolv.conf /etc/resolv.conf
sudo resolvconf -u
sudo service network-manager restart
```
VirtualBox上のFedoraにGuestAdditionsをインストール

VirtualBox上のLinuxにGuestAdditionsをインストールしようとしても大抵手を加えないとインストールできないのでfedoraで実際できた手順をメモ。

##環境
- Windows10(ホストOS)
- VirtualBox 5.1.28 r117968 (Qt5.6.2)
- Fedora26(ゲストOS)

##手順

```
su -
yum update kernel*
```
ここで一回再起動
どうやらkernelが古いと失敗する事があるみたいです。

```
yum install -y kernel-devel
export KERN_DIR=/usr/src/kernels/4.13.5-200.fc26.x86_64
cd /run/media/{User}/VBOXADDITIONS_5.1.28_117968/
./VBoxLinuxAdditions.run
```
(4.13.5-200.fc26.x86_64とVBOXADDITIONS_5.1.28_117968は実際に存在するディレクトリに置き換え)

これで無事インストール出来ました。
GuestAdditionsの入れ方を調べると他の幾つかのパッケージが必要って書いてありますけど、
その辺はfedoraのOSインストールした段階で既にインストールされていました。
Android 初心者: チェックボックスはこう動く

onCreateメソッドはアプリが起動したときに呼び出され、その内部の処理が実行される。 
onClickメソッドなどはイベントに対応して呼び出される。 onClickは特定のボタンがクリックされたときに呼び出され、内部の処理が実行される。

checkBoxのチェックに対応して処理するときには何が起こっているか？ onCreate下にあるので、アプリが起動したときに処理が実行される。 
まず、checkBoxのインスタンスが生成され、（もともと定義されている）setOnCheckedChangedListenerメソッドが実行される。 これはcheckBoxがチェックされたかどうかを常に監視状態にしておくメソッド。 つまり、アプリ起動直後からチェックボックスの状態を監視し続けるようにする。 setOnCheckedChangedListenerの引数には、CompoundButton.OnCheckedChangeListenerクラスのインスタンスが入る。 CompoundButton.OnCheckedChangeListenerのonCheckedChangedメソッドをオーバーライドして、好きな処理を実行させる。
fatal error: 'openssl/aes.h' file not found

https://github.com/AugurProject/augur-core/ をMacでビルドしようとしたところ scrypt のコンパイルでコケた。

```
$ pip install scrypt # 失敗
...
    scrypt-1.2.0/libcperciva/crypto/crypto_aes.c:6:10: fatal error: 'openssl/aes.h' file not found
    #include <openssl/aes.h>
             ^~~~~~~~~~~~~~~
    1 error generated.
    error: command 'clang' failed with exit status 1
```

```bash
$ mdfind -name aes.h -onlyin /usr/local/Cellar/openssl/
...
/usr/local/Cellar/openssl/1.0.2h_1/include/openssl/aes.h
/usr/local/Cellar/openssl/1.0.2i/include/openssl/aes.h
/usr/local/Cellar/openssl/1.0.2j/include/openssl/aes.h
/usr/local/Cellar/openssl/1.0.2k/include/openssl/aes.h
/usr/local/Cellar/openssl/1.0.2l/include/openssl/aes.h
```

`aes.h` は brew で入れた openssl ディレクトリに存在した

## Solution

環境変数でリンカにオプションを渡したらうまくいった(よくある解決法だった)

```bash
env LDFLAGS="-L$(brew --prefix openssl)/lib" CFLAGS="-I$(brew --prefix openssl)/include" pip install scrypt
```
Mac/EclipseでBoost Pythonを使う(python3.x) その1

# MacでBoost Pythonを使おう
## 今の開発環境
- Mac OS High Sierra (10.13)
- XCode 9.0.0 (High Sierraにアップグレードしたらこうなった)
- homebrew
- Eclipse oxygen (+CDT)
- (c++11か、それ以上)
- python 3.6

今回は、pythonで10000x10000行列を扱うようなコードを書きたかったということで上司に相談したらboost pythonをおすすめしてくれたので、自宅にboost pythonを入れることにしました。

## 色々な問題に直面
### boost周り
- いろんなバージョンが散らばっていた(笑う)

### python周り
- いろんなバージョンのpythonを入れまくっててあれこれ散逸していた
- デフォルトが3系だと思い込んでいたけど、実は2系だった
- 3系も3.3, 3.5, 3.6などなどあれこれ散らばってた
- そもそもpythonたちの場所を知らなかったり(>_<)
  - boost-pythonでコードを書くときpythonのinclude pathが必要

### クロスコンパイラ周り
- boost-pythonは、dylibでビルドしてはいけなくて、必ずクロスコンパイラを使ってsoでビルドしないといけないが、そもそもクロスコンパイラなんてどこにあることすら知らなかった

## 一つずつ潰していく
### まずはなんとなく最新のboostとboost-python入れるところから
Macのhomebrewあると、たったの数行でboostとboost-pythonを入れることができます。

```console
brew install boost
```
これやると、ビルド済みのboostがインストールされます。
普通のboostはこの状態で使えるようになっちゃいます。(なんと便利!)

そして、こんな勢いでboost-pythonも入れちゃいます。

```console
brew install boost-python
```

python3系のみ使いたいときは、次のようにします。

```console
brew install boost-python --with-python3 --without-python
```

### python 3.6をpython3.xのデフォルトに設定しよう(pyenvでインストールしたもの)
- ごちゃごちゃあるpythonたちのバージョンを調べよう
  * pyenvで次のように調べられます 

  ```console
  pyenv versions
  ```
　  そうすると、次のような画面が出ます。

  ```console
  system
* 3.5.0 (set by /Users/xxx/.python-version)
  3.6-dev
  3.6.3
  anaconda-2.1.0
  anaconda2-2.4.1
  ```
バージョンを書き換えるには、次のようにします。
`/Users/MIN/.pyenv/version`を開くとデフォルトのバージョンが書かれているので、これを好きなバージョンに書き換えれば、バージョンの設定を変えることができます。

### pythonたちのすみか
なんとなく`/usr/local`にみんな集まってるっぽかったんで、

```console
find /usr/local -name pyconfig.h
```

やりました。
最初は何も考えずboost、boost-pythonのパスだけincludeしてコード書いたんですが、そうしたら"pyconfig.hがない"と怒られたので、それで調べたわけです。

### 最後に、クロスコンパイラー
普通macの動的ライブラリは`.dylib`という拡張子でビルドされますが、boost-pythonの場合はクロスコンパイラでビルドして、拡張子が`.so`のライブラリを作らないといけません。
それでEclipseでクロスコンパイラを選んでプロジェクトを作ろうとしたら、クロスコンパイラの選択画面が出てきました。
クロスコンパイラなんか、そもそもどこにあるかすらわからない!!!
ということで今回インストールしました。

- macportsで簡単に入れられることを知る
  - 参考になったのは次のqiita: [OSX の gcc を変更した話](https://qiita.com/Hiroki11x/items/261612c142da176bbba5)
  - 普通に[macportsホームページ](http://qiita.com/us10096698/items/54195e60b7afb60105ef)でpkgダウンロードしてインストールします
  - しかし、これでは`port`というコマンドが使えません。次のパスを追加する必要があります。

```console
export MANPATH=/opt/local/man:$MANPATH
```

私は~/.bash_profileに追記しちゃいました。
リフレッシュするときは`source ~/.bash_profile`します。

そして、```$ sudo port selfupdate```してあげてから、"OSX の gcc を変更した話"を参考にしてgccを入れます。
私はgcc 7を選びました。

ここまでやると、やっとEclipseでboost-pythonコードが書けるようになります!
(これに1週間以上かけました、実はT_T)
テストコードについては、「その２」で紹介します。
機械学習を一から学ぶときやってはいけないこと

または、いかに私は心配するのをやめてそこらへんで提供されているAPIを使うことを考え始めたか。

*警告: 本記事は機械学習について解説するものではありません。失敗した人間の残したポエムです。*

# 「やりたいこと」を決めずに始める
一般に（と、私が思っているだけかもしれませんが）、とりあえず「こういうのがやりたいなー」というのを決めて学習を始めるのは良いこととされています。
しかし、機械学習においては（これから機械学習をガチで研究すると心に決めているのでもなければ）、これは「良いこと」ではありません。**ただの必須事項です**。

「機械学習」というのは非常に範囲の広い言葉です。
というか、特に数年前から流行って多方面で利用されている Deep Learning に限ってなお滅多クソに広いです。
しかも界隈は略語まみれで、ある略語を調べようとすると略語が出てきて、それを調べようとするとまた、という無限ループは日常茶飯事です。
**自分を見失わないように、目標を立てておきましょう**。

# サンプルコードから始める
**死にます**。
非常にありがたいことに、世の中には（それこそQiitaを漁れば）無数のサンプルコードが転がっています。
しかし、この分野は非常に若いのです。枯れる気配はまだまだありません。
また、マジでゼロから書くと凄まじく厄介な界隈でもあるので高レイヤのライブラリが活発に開発されています。

ということはつまり**使えない/参考にするのが限度なコードが山ほどあります**。
ぶっちゃけ一昔前 jQuery が流行りだした頃のコードの切れ端たちなんてマシな部類です。アレはダメなやつ見たらすぐわかりますしね。

# 開発環境から準備する
**死にます**。
Jupyter Notebook とか平気でガンガン出てきますが、**ぶっちゃけ無視したほうがいいです**。
**そんなもんよりまず基本的な概念を勉強するべきです**（とはいえ、Pythonなりなんなり、使う言語に慣れるという意味で有用なのは間違いありません）。
特に**DockerやVagrantでガンガンコンテナ化してやるぜ！みたいなのは死にます**。低レベルな部分に触りに行くことも珍しくないので、**環境準備するならむしろハード買いましょう**。

# AMD
**死にます**。~~死んでばっかだな~~
流石に私みたいにAPUで機械学習やるぞ！とか思っちゃうおバカはそうそういないと思いますが、ほんっとうに**理不尽かつ意味不明な死に方をします**。
それこそ **Windows Me じゃねーんだぞ！！** と叫びたくなることうけあいです。
徹夜でコードを仕上げ、朝コード流し、出社し、昼休みにリモートでつなごうとしたら落ちていて入れず、夜ログを見たら変な死に方をしていた日にはキレそうになります。

もしもあなたの開発機がAMDなら、諦めてIntel機にNVIDIAのグラボ載せたのを買うかクラウドにガンガン金をつぎ込む覚悟をしましょう。
**札束重要です。さもないと時間が消し飛びます。**

# 片手間+期間を区切る（～3ヶ月）
**間に合いません**。~~やっと死なないのが出てきた~~
もし仕事をしているなら、とりあえず**一週間有給とって金と時間つぎ込めば、運が良ければスタートラインには立てるよね！ぐらいの気合を入れましょう**。
さもなくば、たっぷりと時間を掛けて基礎固めから入るべきです。

どういうことかというと、機械学習というものは非常に学習コストが高い領域です（よね？）。
あなたが学ぶべきものは、1に機械学習の基礎概念、2に信号処理（これはものによってはある程度無視できるかも）、3にライブラリ、4にライブラリ、5にライブラリです。**概念レベルの話がわからないと困る上に、ライブラリも覚えることがいっぱいです**。
機械学習を学ぶことと比べられるのは、たぶんLoLやCivにハマることぐらいのもんでしょう。そのぐらい時間泥棒です。
~~なまじ楽しいから手に負えない~~

# 「やりたいこと」から始める
これに限っては賛否両論ある気がします。ただ、私はこれで死にました。
Qiitaでもなんでもかまいません。そこら中にある「Deep Learning やってみた！」だの「Deep Learning ハンズオン」だのを探してみましょう。

やたらめったら MNIST の手書き数字なるものが出てきますね？
ここからはじめてください。大抵のライブラリは**最悪でも MNIST の手書き数字だけはお手軽に書けるようにできています**。
もしあなたが「うーん、でも俺自炊した本を OCR したいんだよねー」とか考えていたとしても（って、こんなこと考えるの私ぐらいですかね）、**まずは MNIST からはじめてください。これが Hello World です。**

# さいごに
私はすっかりへし折れてしまいましたが、機械学習は楽しいですよ！
でも、**「楽しい」は「大変ではない」ではありません**。
**応用の利く楽しい領域だからこそ、無理のない方法で学びましょう**。

あと、ほんとに**札束と時間重要です**。
それから、**可能なら信号処理を勉強しつつ、たっぷり一年は掛けるぐらいの気持ちではじめましょう**。もちろん、お試しレベルなら別ですよ！
pythonでntpclientを利用して時刻取得

# やりたいこと
`ntp`プロトコルで時刻を取得のみしたい（同期は不要）

`ntpdate` コマンドで、`ntpdate -q`で時刻同期はせずに取得できるものの、
日付 月 時刻 で年が表示されなかったことと、時刻以外の情報も表示されていて、bashで解析するのは少し難しい...

`ntp`のプロトコルがあるってことは、クライアントのサンプルとかあるんじゃ？と思って調べてみたら、大好きなpythonで`ntplib`という
モジュールの中に`ntplib.NTPClient`とどんぴしゃであった！

# 試した環境
- Ubuntu 14.04
- Python 3.6.2

# ntplibのインストール
pip使ってインストール！

`$ (sudo) pip install ntplib`

# ソースについて
`ntplib.NTPCLIENT`で、インスタンス生成
そして、`request(ntpservername)`でntpサーバへ問い合わせ
ctime(res.tx_time)にて、いったんctime形式でパースしたものを
datetime型に変換

これで日付型で扱えるので、あとは煮るなり焼くなりするだけ
今回は自分が求めるフォーマットでprintしてます。
gitにも同じコード挙げてます

最初の投稿時ではclass化もしておらず、エラー処理もなかったのですが、
class化 + エラー処理を付け加えました。
また出力フォーマットも引数で柔軟に対応できるようにしてます。

`https://github.com/komorin0521/python_sandbox/tree/master/python3`


## ソース(v.1.1.0): 2017年10月14日更新
```py3
#!/usr/bin/env python3

import datetime
from time import ctime
import sys

# please install module using pip-
# (sudo) pip install ntp lib
import ntplib

__author__ = "oomori"
__version__ = "1.2.0"

class MyNTPClient(object):
    def __init__(self, ntp_server_host):
        self.ntp_client = ntplib.NTPClient()
        self.ntp_server_host = ntp_server_host

    def get_nowtime(self, timeformat = '%Y/%m/%d %H:%M:%S'):
        try:
            res = self.ntp_client.request(self.ntp_server_host)
            nowtime = datetime.datetime.strptime(ctime(res.tx_time), "%a %b %d %H:%M:%S %Y")
            return nowtime.strftime(timeformat)
        except Exception as e:
            print("An error occured")
            print("The information of error is as following")
            print(type(e))
            print(e.args)
            print(e)
            sys.exit(1)

def main():
    ntp_client = MyNTPClient('ntp.nict.jp')
    print(ntp_client.get_nowtime())

if __name__ == "__main__":
    main()
```
# 参考
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&cad=rja&uact=8&ved=0ahUKEwiPqOXx5-3WAhUIoJQKHVfBDWAQFgg2MAI&url=https%3A%2F%2Fstackoverflow.com%2Fquestions%2F12664295%2Fntp-client-in-python&usg=AOvVaw2KL0LzfRzflf2OcLcCPWPW
- https://stackoverflow.com/questions/10256093/how-to-convert-ctime-to-datetime-in-python
知られざるtmuxの機能（choose-mode）

# TL;DR

- tmux2.6 でchoose-treeの画面にプレビューが出るようになったよ
- (自分は知らなかったが)choose-treeでいろいろ出来て便利だよ

# chosee-treeとは

`prefix`+`s`で出てくるこんな画面

![2017-10-13-231931_1055x248_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/34727/61a83cc2-a160-3988-14d5-e759c75fed97.png)

これが、2.6ではこんな感じになりました。

![2017-10-13-232048_1907x1036_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/34727/90578020-9d3e-01c8-6b46-75f3a4935d44.png)

すごーい！（↑この記事が伝えたことの90% ↓以下蛇足）

あと`prefix`+`s`だとsessionの一覧しか出てこないのだが、`prefix`+`w`だとpaneも木構造で表示してくれる。

# 出来ること

`prefix`+`s`は`choose-tree -s`の、`prefix`+`w`は`choose-tree -w`のkey bindになっている。
このchoose-treeのmanページを見てみると、以下のようになっている。

```
choose-tree [-Nsw] [-F format] [-f filter] [-O sort-order] [-t target-pane] [template]
```

### `-Nsw`
`s`と`w`は上記で説明したように、sessionだけか、paneまで出すかになっている。デフォルトだと、`w`の模様。
`N`はpreviewを表示するかどうかのフラグ

### `-F`
表示するフォーマットを指定出来る。
`choose-tree -F '#S'`とするとセッション名だけ表示される。

### `-f`
listからフィルタリングしてくれるらしい。
書き方が分からない…

### `-O`
listのソート

`index`、`name`、`time`を指定出来る

### `-t`
`choose-tree`を開くpaneを指定出来る。
イマイチ使いどころが分からない

### `[template]`
choose-treeで選択したwindowやpaneを使って実行するアクションを指定できる。
デフォルトでは`switch-client -t '%%'`となっていて`%%`になっているところが選択したものに置き換えられる。

## 一覧で出来ること
リスト一覧を表示しているときも以下のKeyを使うことが出来る

Key|Function
---|---
                   Enter | Choose selected item
                   Up    | Select previous item
                   Down  | Select next item
                   <     | Scroll list of previews left
                   >     | Scroll list of previews right
                   C-s   | Search by name
                   n     | Repeat last search
                   t     | Toggle if item is tagged
                   T     | Tag no items
                   C-t   | Tag all items
                   :     | Run a command for each tagged item
                   f     | Enter a format to filter items
                   O     | Change sort order
                   v     | Toggle preview
                   q     | Exit mode

特に`C-s`で検索したり、`:`でtmuxのコマンドをそのペインで実行したり出来るのは便利。
pecoみたいなインタラクティブサーチ（というかフィルタリング）が出来たらより便利なのだが。おそらく`f`がそれに当たるのだが、まだやり方が分からない…

あと似たようなものに`choose-client`や`choose-buffer`がある。
`choose-buffer`はbufferにコピーをリストから選択出来る。
`choose-client`は選択したクライアントをデタッチ出来る。（どう使うのだろう？）
# まとめ

- たまにmanページを見ると勉強になる
[AWS][Python3]SESでIAM認証情報を変換してSMTP 認証情報を取得する


## SESをSMTPを利用して送信したい
SESを利用するならばboto3を利用するのが一番簡単かと思いますが,
ローカル開発環境ではMailHog等の開発用SMTPサーバを用いて動作確認を行なっている環境で
汎用的なsmtplibをテスト・本番で利用したいというのがそもそものはじまり

## SMTPを利用するには
通常のsmtp同様以下のような形で行えます

```py3:email.py
def send_mail(self, host, user, password, msg):
  smtp_con = smtplib.SMTP_SSL(host=host)
  smtp_con.ehlo()
  smtp_con.login(user, password)
  result = smtp_con.send_message(msg=msg)
  smtp_con.close()
 ```
が、ここで渡すpasswordが曲者  
以下のリンクを見るとわかりますが
通常boto3などのAPI経由であれば、パスワードにはIAMの`AWS_SECRET_ACCESS_KEY`を用いるが
SMTP認証情報には`AWS_SECRET_ACCESS_KEY を Amazon SES SMTPパスワードに変換したもの`を利用する必要があります
[Amazon SES SMTP 認証情報の取得](http://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/smtp-credentials.html)

新たにSMTP認証情報を持つIAMユーザを作る方法もありますが
今回は`AWS_SECRET_ACCESS_KEY->SMTPCredentials`の変換を行います

## Amazon SES SMTP Credentialsを python3 で生成する
実際に利用したコードがこちら
keyにAWS_SECRET_ACCESS_KEYを渡してあげればSMTP認証に利用できるパスワードが返却される

```py3:aws_ses_hash.py
def hash_smtp_pass_from_secret_key(self, key):
    message = "SendRawEmail"
    sig_bytes = bytearray(b'\x02')

    h = hmac.new(key.encode(), message.encode(), digestmod=hashlib.sha256)
    digest = h.hexdigest()

    sig_bytes.extend(bytearray.fromhex(digest))

    return base64.b64encode(sig_bytes).decode()
```

___
ちなみにpython2であれば以下が参考になります
[■\[tips\]\[aws\]\[python\]\[ruby\] Amazon SES SMTP Credentialsをpythonやrubyで作ってみる](http://d.hatena.ne.jp/asakawajunya/20140307/1394201842)
Cookieを操作するjs.cookie.jsでフォームの状態を保存／復元を簡単にする

## js.cookie.jsとは
`js.cookie.js`は、`jquery.cookie.js`から発展したプロジェクト
発展プロジェクトなので機能的にはほぼ同等だが使い方（取得や保存など）が異なる。

`jquery.cookie.js`の情報がたくさんあるのに
`js.cookie.js`の情報が極端に少ない！ということでメモ書き

今回参考にしたのはこのサイト：http://illbenet.jp/view/51

## リポジトリ
https://github.com/js-cookie/js-cookie
>**JavaScript Cookie**  
A simple, lightweight JavaScript API for handling cookies

こちらからダウンロード可能ですが今回はCDNを利用していきます

##　必要なライブラリ
今回の目的であるフォームの保存／復元を簡易的にするには以下ライブラリを利用する必要があります

| ライブラリ名    | 使用用途    |
|:------------- |:--------------- |
| jquery.js     | js.cookie.jsが依存しています |
| underscore.js | form情報をシリアライズしてCookie保存する際に利用します |
| js.cookie.js  | 今回の主役 |

## ソース
### スクリプトの読み込み
必要なライブラリを記述していきます。
今回は簡単に全てCDN版でいきます

```html
<script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/js-cookie/2.1.4/js.cookie.min.js"></script>
```

### フォーム送信時のフック
フォームの情報保持をsubmitのタイミングで行うため、フック関数を用意
ドメインや保持期間は適宜変更してください
基本的にはformのセレクタとCookies.set(〜)の部分の変更で動きます

```js
$('#form').submit(function(){
    // form data to array
    var data = _.chain($('#form').serializeArray())
        .map( function(i) { return [i.name, i.value]; } )
        .object().value();
    Cookies.set('COOKIE_NAME', data, { expires: 7, path: '/', domain: 'localhost' });

    return true;
})
```

### フォームの復元
保存した情報を元にフィームの復元を行います

```js
$(function(){
    var opt = Cookies.get('COOKIE_NAME');
    var dataObj = JSON.parse(opt);

    $.each(dataObj, function(name, value) {
        var selector = $.format("input[name='%s']", name);
        
        //form部品に応じて処理を追加してください radioボタン等は追記必要かと思います
        if(selector.prop("type") === "checkbox"){
            selector.prop('checked',true);
        }
        else{
            selector.val(value);
        }
    });
});
```

## まとめ
基本的にFormに依存するわけではないのでFormのセレクタや部品処理を適宜加えてあげれば利用できるかと思います。  
※radioボタンの処理を記述してないのはめんどくさかったからですごめんなさい
MailHogを利用してメール送信テスト環境をdockerコンテナ上に作る

## MailHogについて
簡易SMTPサーバーの１種で開発時のメールテストに活用できます。
Docker Hubでコンテナ公開もされているため
導入も非常に簡単です。
[GitHub](https://github.com/mailhog/MailHog)
[Docker Hub](https://hub.docker.com/r/mailhog/mailhog/)
>今回はあくまで既存dockerプロジェクトにSMTPサーバを追加する形でいきます
`docker run`にて挙動確認をしたい方は配布元のドキュメントを確認してください

## 導入方法
`docker-compose.yml`へコンテナを追記

```yaml:docker-compose.yml
mailhog:
  image: mailhog/mailhog
  ports:
    - "8025:8025"
```
`ports`に設定している`8025`はMailHogのデフォルトHTTPポートです。
もしホスト端末からコンテナ上のMailHogへSMTPテストを行う場合は
`ports` へ `- " 1025:1025"`を追記してください

| service     | default port |
|:------------|-------------:|
| HTTP server |         8025 |
| SMTP server |         1025 |

build後、`http://localhost:8025`へアクセスするとこんな画面が表示される
![2d0659dc-aa77-7b14-9804-8d3380759a49.png](https://qiita-image-store.s3.amazonaws.com/0/28599/138b2f12-45a3-e874-8e6b-805f02f39245.png)


あとはMailHogコンテナに対しメールを送信すればこちらの画面で確認できるらしい


##メールテスト
同確のためSMTP通信が正常に通るか簡単なプログラムでチェックします

```py3:smtp_sample.py
import smtplib
from email.mime.text import MIMEText
def test_mail(fromaddr, toaddr, subject, msg):

    m = MIMEText(msg)
    m['Subject'] = subject
    m['From'] = fromaddr
    m['To'] = toaddr

    s = smtplib.SMTP(host="mailhog", port=1025)
    s.sendmail(fromaddr, toaddr, m.as_string())
    s.close()

    return "done"
```
受信メールが一覧で表示されます
![22c03870-9b77-0ff5-5499-db36277354d4.png](https://qiita-image-store.s3.amazonaws.com/0/28599/b3bc3a77-78c1-eb72-9d10-f470dadc69b9.png)

ソースやヘッダー情報等もブラウザ上から確認できます。
![f5455a56-3179-3e58-989a-2ff6852e4bb2.png](https://qiita-image-store.s3.amazonaws.com/0/28599/aa669004-4ddc-e90c-0be8-e676ba87af44.png)



##Jimでfailure_test
Jimによる異常系のテストもできるようです。
利用するには`docker-compose.yml`の`mailhog`部で以下を追記します

```yaml:
command: -invite-jim -jim-accept=0.5
```
上記の場合50%の確率でメール送信が成功します。（他にも通信速度等も設定可能）
**マニュアル上は`MailHog 〜`にてオプション設定と書いてありますがDocker上でそれを書くと動作しません**

各種オプションは以下から確認してください
[Introduction to Jim](https://github.com/mailhog/MailHog/blob/master/docs/JIM.md)

また設定値はブラウザからも確認可能
![18dcb8e8-c234-6df8-ad0c-71387607ca45.png](https://qiita-image-store.s3.amazonaws.com/0/28599/05000cde-0a70-1d57-0c98-d17ac6da8335.png)


##その他
デフォルトではメールはメモリ上に保存されるので、
コンテナの再起動などを行うと受信したメールは消えます。
 

____
##参考記事
>[Qiita: MailHogでメール送受信のテストをする](http://qiita.com/hideji2/items/1919d5759cf42146f919)
opencsvでcsvファイル出力

いっちばん単純な形。
このままの形で使うことは無いと思いますがベースにはできるかな？

opencsv.jarのバージョン4.0、javaのバージョンは1.7です。

```CsvOutput.java
package com.test;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import com.opencsv.CSVWriter;

public class CsvOutput {

	public static void main(String[] args) throws IOException {

		CSVWriter csvw = null;
		try {
            //インスタンス生成
			csvw = new CSVWriter(
	               new FileWriter(new File("c:\\test", "test.csv"))
	                , ",".charAt(0)
	                , "\"".charAt(0)
	                , "\"".charAt(0)
	                , "\r\n");
            //Stringの配列が1行分のデータになる
	        List<String[]> outStrList = new ArrayList<String[]>();
            //配列の数には項目数を定義
            //実際はこんな風にべた書きはしないと思うけど・・・
	        String[] outStr = new String[2];
	        outStr[0] = "酒を飲み過ぎ";
	        outStr[1] = "ゲロを吐く";
	        outStrList.add(outStr);

	        //書込み
	        csvw.writeAll(outStrList);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
                        // 最後はクローズする
			if (csvw != null) {
				csvw.close();
			}
		}
	}
}
```

・出力結果
```test.csv
・出力ファイル内容
"酒を飲み過ぎ","ゲロを吐く"
```