OmniAICreator/Qiita-1.07M huggingface dataset:
TensorFlowを使ってみる 〜その１〜 インストール（Mac）

TensorFlow のインストールから ”Hello World” を表示するまでの手順を記載します。
環境は Mac（10.11.6) になります。

## TensorFlow
https://www.tensorflow.org/

TensorFlowは、Google社の数値計算用のオープンソースソフトウェアライブラリです。
１つのAPIで、デスクトップ、サーバー、又はモバイルデバイスの１つ以上の 
CPU または GPU に計算を展開する事が出来ます。
又、Pythonのバージョンは Python 2.7、Python 3.3+ をサポートしています。

## インストール

インストールの方針を下記となります。

- TensorFlow は 仮想環境にインストール
- 仮想環境は Virtualenv で作成
- 仮想環境で利用する Python は pyenv でインストールしたものを利用

以下、順を追ってインストールしていきます。

### pyenvインストール

1：pyenv をクローン

```
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
```

2：環境変数を設定（~/.bash_profile）
.bash_profile に以下の内容を追記します。
※ファイルが無ければファイル自体も作成

```
export PYENV_ROOT=$HOME/.pyenv
if [ -d "${PYENV_ROOT}" ]; then
export PATH=${PYENV_ROOT}/bin:$PATH
eval "$(pyenv init -)"
fi
```

3：ターミナルを再ログインする

4：pyenv のバージョンを確認

```
pyenv --version
```
パスが通っているかの確認も含めて、バージョンを確認します。
→ バージョンが表示されればOK

5：pyenv の Python(3.5.2) をインストール

```
sudo pyenv install 3.5.2
```
※少し時間がかかります

※下記エラーが発生する場合

```
/bin/sh: line 1: 23566 Trace/BPT trap: 5       ./Programs/_freeze_importlib ./Lib/importlib/_bootstrap_external.py Python/importlib_external.h
make: *** [Python/importlib_external.h] Error 133
```

以下のコマンドを実行する事で解消できました。

```
xcode-select --install
```

### virtualenv インストール

```
sudo pip install virtualenv
```

### 仮想環境作成

virtualenv で仮想環境を作成する
・Pythonは、pyenv の Python(3.5.2) を指定
・フォルダ名は "venv_tf"
・独立環境とするため "--no-site-packages" を指定

```
# 環境指定
virtualenv -p ~/.pyenv/versions/3.5.2/bin/python3.5 venv_tf --no-site-packages
```
> --no-site-packages：インストール済みモジュールを全て外した状態で仮想環境が作成される（デフォルト）

### 仮想環境へ TensorFlowをインストール

仮想環境が起動している状態で TensorFlow をインストールします。
※起動中は仮想環境をインストールしたフォルダ名が表示されます。

1：仮想環境起動
以下コマンドで仮想環境を起動

```
cd venv_tf
source bin/activate
```

2：TensorFlowインストール（Version r0.12）

```
(venv_tf) pip install --upgrade https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-0.12.1-py3-none-any.whl
```

3：インストールしたパッケージを確認

```
(venv_tf) pip freeze
```
> ※インストールされるパッケージ
numpy==1.11.3
protobuf==3.1.0.post1
six==1.10.0
tensorflow==0.12.1

### Hello World 実行

1：venv_tf の直下に 以下のソースファイル(hello.py)を配置

```
import tensorflow as tf
import multiprocessing as mp

core_num = mp.cpu_count()
config = tf.ConfigProto(
    inter_op_parallelism_threads=core_num,
    intra_op_parallelism_threads=core_num )
sess = tf.Session(config=config)

hello = tf.constant('hello, tensorflow!')
print(sess.run(hello))
```

2：コード実行

```
(venv_tf) python hello.py
```

3：実行結果確認

```
(venv_tf) b'hello, tensorflow!'
```

### 仮想環境停止
※仮想環境を停止する場合は、以下のコマンドを実行します。

```
(venv_tf) deactivate
```

以上、今回は Mac環境で仮想環境を使った TensorFlow のインストールを行いました。
Rubyを使うなら知っておくべき！おすすめライブラリ10選

※こちらの記事は、プロスタ編集部が現在大変人気の高いRubyの文法記事を公開することで、皆様の学習にお役に立ちたい意図で投稿しております。

参考サイト：[Rubyを使うなら知っておくべき！おすすめライブラリ10選](http://programming-study.com/technology/ruby-library/)


#Rubyを使うなら知っておくべき！おすすめライブラリ10選


Rubyでプログラミングする際に、何もかも自分で作成すると大変です。
そこで非常に役立つのが再利用可能な形でプログラムをまとめたライブラリです。
この記事ではおすすめのruby ライブラリを紹介します。

##おすすめライブラリ10選

###1.paranoia

https://github.com/rubysherpas/paranoia

DBのレコードを論理削除する機能をサポートします。
削除処理を実施するときに、あらかじめ論理削除用に追加した列(deleted_at)に
日時を追加するという動作をしてくれます。

###2.Devise

https://github.com/plataformatec/devise

Deviseはログイン認証機能を提供します。ユーザーログイン機能を簡単に実装する
機能を提供しれくれるものです。DBに保村するパスワードを暗号化する機能や
パスワードのリセット、ログインデータの保存、セッション情報の削除、
ログイン失敗によるアカウントのロックなどログイン認証に必要な機能を提供してくれます。

###3.PaperClip

https://github.com/thoughtbot/paperclip
画像ファイルに特化したアップロード機能を提供します。アップロードした画像に対して様々な処理を実行することができます。画像保存先の指定、
画像サイズのリサイズの実行や複数のバージョンの保存などです。

###4.Ransack

https://github.com/activerecord-hackery/ransack
検索機能を簡単につくることができます。完全一致だけではなく値が含まれるのかなどのあいまい検索など簡単に実装できます。小規模サイトの場合はこの検索機能で十分です。

###5.kaminari

https://github.com/amatsuda/kaminari
ページングをサポートします。デザインのカスタマイズも簡単にできることが特徴です。
ページングとはWEBサイトでよく見かける<< 1 2 ... 98 >> などのリンクのことです。
他にページャー、ページネーションとも呼ばれています。

###6.ThinReports

https://github.com/thinreports/thinreports
帳票を作成できます。また、PDF出力の機能も提供しています。


###7.factory_girl_rails

https://github.com/thoughtbot/factory_girl_rails
テストデータを生成することができます。

###8.better_errors

https://github.com/charliesome/better_errors
エラー画面を見やすくしてくれます。まずエラーメッセージの画面自体を見やすくします。 また、エラーメッセージ自体もわかりやすく必要な情報を表示し、ブラウザからデバックも可能です。

###9.Guard

https://github.com/guard/guard
自動テスト機能を提供します。ファイルの変更を検知してテスト処理を実行します。
この動作を利用して自動テストをおこないます。

###10.Rubocop

https://github.com/bbatsov/rubocop
コーディング規約のチェックをおこないます。設定ファイルを編集することで独自のコーディング規約とすることもできあす。
スクラムをざっくり説明するときのスライド

# このドキュメントは
「スクラムを始めるぞ！」というチームに対し

- スクラムとは
    - 何のためで
    - どんな役割があり
    - 何をやるのか

をスクラムマスターがざっくり説明するための資料

---
## 参考にすべき書籍
- [スクラムガイド(2016年版)](http://www.scrumguides.org/docs/scrumguide/v2016/2016-Scrum-Guide-Japanese.pdf)
    - たった17ページ。無料。
    - スクラムの大元
- [エッセンシャルスクラム](https://www.amazon.co.jp/dp/B00MB6GO7E)
    - 過去のスクラムの経験や例を元に、実践的なプラクティスの紹介

---
# スクラムは何のためのものか
---
## 向いている対象
- **物事を予期できない**
    - ユーザーに出してみるまで何がウケるか分からない、等
- **検証が可能**
    - 数値を計測する等の方法によりそれが良かったのか悪かったのか検証可能

---
## 思想
設計段階から全てを見通すのは無理
少しずつ作って、検証と適応を繰り返す

- スクラムの核心
    - 透明性
        - 今何が起きているかチームの皆が知れる
    - 検査
        - 作ったもの・作り方を評価する
    - 適応
        - 検査に従ってより良いやり方を探索する

---
# スクラムの3つの役割
![image](https://qiita-image-store.s3.amazonaws.com/0/61079/eaba33cb-f5c2-3ab1-3f72-070587b8de50.png)

---
## プロダクトオーナー（PO）
プロダクトの価値の最大化に責任を負う

- プロダクトがどのような価値を持つか
    - 最後には PO が決めるべき
- 各価値の重要度の決定
- 各価値（機能）のチームへの共有

---
## スクラムマスター(SM)
プロセスの責任者、スクラムのコーチ

- スクラムを使ってどう仕事を進めるか
- チームのスクラム的な教育
- スクラムイベント(会議等)のファシリテーション
- 障害の除去

---
## 開発チーム
プロダクトを作成する人々

- エンジニアから、テスターなども含む
    - 一通りチーム内で作れる人材が揃っている
- 自己組織化
    - やり方は自分たちで考える
- 3〜9人程度

---
# 使うツール
![image](https://qiita-image-store.s3.amazonaws.com/0/61079/f38f0ec4-e0f8-9568-aef3-3059116881ff.png)

---
## プロダクトバックログ (PB)
価値を届けるフィーチャー（機能等）等を集めたもの
各フィーチャー等をプロダクトバックログアイテム(PBI)と呼ぶ

- 優先度順に並んでいる
- 操作できるのは PO のみ

---
## スプリントバックログ
1スプリント（後述する仕事の時間単位）毎に行うバックログアイテムをタスクに分解したもの

- そのスプリントのゴールを達成するための道筋
- 各タスクは工数見積もりを行う
- 開発チームが操作する

---
## 完成の定義
PBI の完成の定義の認識を合わせることが重要
例えば

- リリースされていること
- コードレビューが完了していること
- ユニットテストが書かれていること

等。全ての PBI について満たしておきたい条件は予め完成の定義に含めておきたい。
完成の定義はプロダクトのフェーズによって変化していく。

---
# スクラムイベント
![image](https://qiita-image-store.s3.amazonaws.com/0/61079/4a98445e-202c-0806-d0ec-ec7ee12e015b.png)

---
## スプリント
お仕事をする一区切りの時間

- 1週間〜1ヶ月の固定期間
- スプリント毎に何かしら価値を届けるべき
    - ユーザーが◯◯できるようになる、等

---
## スプリントプランニング
今スプリントで何をするのか計画

- 何を成し遂げるか（スプリントゴール）
    - PO: PB から作るべき PBI を選択
- どうやって成し遂げるか
    - 開発: 各 PBI をスプリントバックログに移す
    - 開発: 各 PBI をタスクに分解
    - PO と開発チームでゴールについて合意

---
## デイリースクラム
毎日15分、進捗を検査・適応・再計画

- 昨日やったこと
- 今日やること
- スプリントゴールの障害になっていること

---
## スプリントレビュー
スプリントの終わりの、成果物の検査・適応

- 成果物をデモ
- うまく行ったこと、うまく行かなかったこと、解決方法
- 次に何をするかを皆で議論
- PB、今後のスケジュール予測等を修正

---
## 振り返り
スプリントの終わりの、プロセスの検査・適応

- 人・関係・プロセス・ツール について議論
- うまく行ったこと、改善が必要なもの、対応策

---
## プロダクトバックログリファインメント
PO による PBI の詳細化と優先順位の調整

- ロードマップやビジョンから PBI に
- 直近でやるもの：詳細に。まだ先のもの：アバウトに。
- 重要な PBI ほど上にくるよう並び替え

---
# 最後に
この資料ではスクラムの思想の深いところや、実際のプラクティスの詳細については書いてありません。
冒頭で上げた資料を読むことをお勧めします。
SDカードへのUbuntuイメージファイル焼き込みとバックアップ

イメージファイルダウンロード
--------------------

### ダウンロード

下記よりUbuntu-16.04のイメージ（ubuntu-16.04-preinstalled-server-armhf+raspi3.img.xz）をダウンロード
[ARM/RaspberryPi - Ubuntu Wiki](https://wiki.ubuntu.com/ARM/RaspberryPi)

### 解凍
```sh-session
$ xz -dv ubuntu-16.04-preinstalled-server-armhf+raspi3.img.xz
```


焼き込み
--------------------

### マウントしたSDカードの特定

下記により、SDカードを特定（下記だと`/dev/disk2`）

```sh-session
$ diskutil list
...

/dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *32.0 GB    disk2
   1:               Windows_NTFS                         74.0 MB    disk2s1
   2:                      Linux                         1.7 GB     disk2s2
   3:                      Linux                         29.6 GB    disk2s3
   4:                       0xA0                         608.7 MB   disk2s4
```

### 焼き込み

```sh-session
$ diskutil unmountDisk /dev/disk2
$ sudo dd if=ubuntu-16.04-preinstalled-server-armhf+raspi3.img of=/dev/rdisk2 bs=1m
```

バックアップ
--------------------

```sh-session
$ sudo dd if=/dev/disk2 of=backup.img
```
GoでMySQLにCA証明書を使ってアクセスする

このようにすれば接続できる。

```go
package main

import (
	"crypto/tls"
	"crypto/x509"
	"database/sql"
	"errors"
	"io/ioutil"

	"github.com/go-sql-driver/mysql"
)

func registerTlsConfig(pemPath, tlsConfigKey string) (err error) {
	caCertPool := x509.NewCertPool()
	pem, err := ioutil.ReadFile(pemPath)
	if err != nil {
		return
	}

	if ok := caCertPool.AppendCertsFromPEM(pem); !ok {
		return errors.New("Failed to append PEM.")
	}
	mysql.RegisterTLSConfig(tlsConfigKey, &tls.Config{
		ClientCAs:          caCertPool,
		InsecureSkipVerify: true, // 必要に応じて
	})

	return
}


func main() {
  registerTlsConfig("/path/client-ca.pem", "custom")
  if err != nil {
    panic(err)
  }
  db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/database?tls=custom")
}
```

# 解説

go-sql-driver/mysqlの[RegisterTLSConfig](https://godoc.org/github.com/go-sql-driver/mysql#RegisterTLSConfig)にRootCAとキーペアを使用して接続するサンプルコードがある。今回はこれを修正してCA証明書を用いてMySQLにアクセスできるようにした。
C++プログラマだけど、Intel RealSense SDKを使って笑顔度を判定したい（絶望しかけた編）

[この](http://qiita.com/mine820/items/fd6f22ae69f0ba93dba2)続きです。
先に結論を書きますと、うまくいってませんでしたが、何とか回避方法を見つけました。

#サンプルをビルドする
とりあえず「C:\Program Files (x86)\Intel\RSSDK\sample\face\FaceTracking」をビルドしてみる。
が、いろいろ足らなくて、プロジェクトが開けない。

#プロジェクトを作る
くじけて、別のところに位置からプロジェクトを作成し、必要なファイルをコピーしてみる。
プロジェクトはWin32コンソールアプリで作成する。

#インクルードパスとかライブラリパスとか
RealSenseのインクルードファイルやライブラリファイルを使用するため、

・インクルードパス
　C:\Program Files (x86)\Intel\RSSDK\include
・ライブラリパス
　　C:\Program Files (x86)\Intel\RSSDK\lib\win32　（32bitの場合）
　　C:\Program Files (x86)\Intel\RSSDK\lib\x64　（64bitの場合）

を設定してみる。
もちろんライブラリファイルとして、
　libpxc_d.lib　libpxcmd_d.lib　（デバッグ）
　libpxc.lib　libpxcmd.lib　（リリース）
も指定する。

#ビルドしてみる
とりあえずこれでビルドしてみるが、インクルードファイルがないとか言われる。
んなあほなと確認してみると、確かに
・pxcfacemodule.h
・pxcfacedata.h
・pxcfaceconfiguration.h
がない。
似たような名前の
・pxcvideomodule.h
とかはある。

それっぽいファイルはないかと探してみると「include\RealSense\Face」に
・FaceModule.h
・FaceData.h
・FaceConfiguration.h
というファイルがある。これは怪しい。

ファイルの中身を確認にすると．．．namespace名が！！！
「Intel::RealSense::Face」だと？
しかもクラス名も
・PXCFaceModule　→　FaceModule
・PXCFaceData　→　FaceData
・PXCFaceConfiguration　→　FaceConfiguration
だと？？

恐る恐るヘルプを見ていると．．．PXCがない方で書かれている！！

#対応策
これで何とかなります。

・ヘッダファイル名を変更する
　　pxcfacemodule.h　→　RealSense/Face/FaceModule.h
　　pxcfacedata.h　→　RealSense/Face/FaceData.h
　　pxcfaceconfiguration.h　→　RealSense/Face/FaceConfiguration.h

・typedefを追加する
　　typedef Intel::RealSense::Face::FaceData PXCFaceData;
　　typedef Intel::RealSense::Face::FaceConfiguration PXCFaceConfiguration;
　　※なぜかPXCFaceModuleは宣言されている
Rancherのストレージについて

Rancher Meetup #3で Rancherのストレージについて登壇したので、それの抜粋転記です。

*`以下の資料は Rancher 1.6 系の資料となっておりKubernetesベースのRancher2.0とは全く違うものです。ご注意ください。`*

【会場変更 →渋谷】Rancher Meetup Tokyo #3 - connpass
https://rancherjp.connpass.com/event/45768/
![image](https://qiita-image-store.s3.amazonaws.com/0/15176/c15f03d3-85f7-0412-2ce2-5856996ff392.png)

元のスライドはこちら。
Rancher Meetup Tokyo#3 Storageについて
http://www.slideshare.net/ttyno/rancher-meetup-tokyo3-storage

------
# 1. Dockerで困ること
インフラ的にDockerで困ること2つ

1. データストアであるストレージで困る
2. ネットワークで困る

# 2. なぜこのお題に？

Dockerは気軽に作って壊してをするので、永続的なデータストレージが必要です

# 3. 皆さんいろいろ工夫されているようです

1. NFSサーバーを各ホストからマウントし て、VolumeコンテナをNFSに配置する。
2. DBだけは、オンプレにしています。 
3. KubernetesのPersistentVolumeを利用

しかし、これらを使うとRancherの管理外 に出てしまうので痛し痒しです。 Rancherでなんとかできないでしょうか

# 4. Rancherの考えるストレージとネットワーク
Rancherは個別機能をDockerコンテナにして提供 
![image](https://qiita-image-store.s3.amazonaws.com/0/15176/bfeb319c-11c7-aeda-036c-e4a5f3567971.png)
※他にもスケジューラーや、ヘルスチェックなどがありま す。


# 5. Rancherのボリュームプラグイン
現在、カタログから選択できるのは以下の3つ
![image](https://qiita-image-store.s3.amazonaws.com/0/15176/f3123f82-2fde-0bfe-d7bf-f6f12e34c4d4.png)
- Rancher EBS
- Rancher EFS
- Rancher NFS

# 6. Rancherからだとどうなる？
 Rancherから Docker Volumeプラグイン経由で利用します 
※注:Docker v1.2 で実装(Experimental) されているプラグインではないです。 Legacy Pluginになります。

# 7. Rancherのボリュームプラグインについて
それぞれ以下のようなものです
![image](https://qiita-image-store.s3.amazonaws.com/0/15176/37b0dc21-6b60-80f4-bf59-2b8d2dccda3a.png)

# 8. Dockerのデータ管理方法
その前にDockerのストレージ プラグインの仕組みについて
Dockerでのデータ永続化方法はいくつかあります
![image](https://qiita-image-store.s3.amazonaws.com/0/15176/b95e591c-f6fb-8a78-cbd9-3ed11bc4267c.png)


# 9. Dockerのデータ管理方法
Dockerのデータ管理方法は以下
![image](https://qiita-image-store.s3.amazonaws.com/0/15176/ebdd95df-78d6-d346-0acf-03d8eba42d4f.png)

# 10. Data ボリュームプラグインの仕組み
ボリュームプラグインの仕組みの詳細は以下のようになっています
![image](https://qiita-image-store.s3.amazonaws.com/0/15176/17d99f3d-6dce-9243-79bd-c14111f296ac.png)

参照：Dockerのボリュームプラグインとストレージドライバ
http://knowledge.sakura.ad.jp/knowledge/5021/

# 11. Rancherで使うのは、Data ボリュームプラグイン
Rancherから使う場合はこんな感じ
![image](https://qiita-image-store.s3.amazonaws.com/0/15176/ecfda9b0-6fec-8744-3cab-69c7e171782c.png)


## 12. (1)カタログからインフラコンテナをデプロイ
Rancherストレージコンテナをカタログからデプロイすると以下のように
![image](https://qiita-image-store.s3.amazonaws.com/0/15176/77b64976-3d06-1af2-a4d0-e87560c0675a.png)


## 13. (2)ボリュームを作成
volume-driverを指定して、
rancher volume create NewVolume --driver rancher-nfs
やUIからボリュームを作成します。
![image](https://qiita-image-store.s3.amazonaws.com/0/15176/23dc7378-8e78-c8ab-bf2e-32afd09685f8.png)


## 14. (3)コンテナを作成
コンテナを作成します。
-v でボリュームをオプションで指定するか、
docker-composeに書きましょう。
![image](https://qiita-image-store.s3.amazonaws.com/0/15176/6ce65709-816b-31a6-6304-eccf99f87a7b.png)


# 15. Rancherでのボリューム作成手順
1. NFSなどのインフラ側を準備
2. Rancherのカタログの「ライブラリ」から必要なサービ スを起動(例：Rancher NFS)
3. ボリュームを作成 Rancherコマンドでも、UIからでも。 
4. コンテナからマウント -v オプションでも、Composeでも。 

# 16. まとめ

- Dockerプラグイン機構を利用
- Rancherでのボリューム管理はRancherから可能
n.n.n 形式のバージョンをソートする

`-V` オプションの無い、sort でバージョンをソートする。

```
sort -t '.' -k1,1n -k2,2n -k3,3n
```

`.` dot を区切り文字として、1,2,3 番目のフィールドを数字でソートする。
AWS EC2のメモリ利用率をCloudWatchに追加する

EC2を立ち上げ後、デフォルトではメモリ利用率はCloudWatchに監視追加できません。
そのため、必要なパッケージをインストールし、CloudWatchモニタリング用スクリプトを設置してCronを仕掛ける必要があります。
Cronを実行するとただちCloudWatch側に反映するので比較的簡単です。
※AWSのアクセスキーID、シークレットキーの取得は別途行ってください。

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

```
$ sudo yum -y install perl-DateTime perl-Sys-Syslog perl-LWP-Protocol-https perl-Digest-SHA
```

## CloudWatchモニタリング用スクリプトの格納場所を作成

```
$ sudo mkdir /usr/local/cloudwatch
$ cd /usr/local/cloudwatch
$ sudo wget http://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.1.zip
$ sudo unzip CloudWatchMonitoringScripts-1.2.1.zip
$ sudo rm CloudWatchMonitoringScripts-1.2.1.zip
```

## スクリプトの設定

```
$ cd aws-scripts-mon
$ sudo cp awscreds.template awscreds.conf
$ sudo vim awscreds.conf
```

### 「awscreds.conf」に、以下を記載
- AWSAccessKeyId=[アクセスキーID]
- AWSSecretKey=[シークレットキー]
※アクセスキーID、シークレットキーの取得は別途行ってください。

## Cron登録

```
$ crontab -e
```

### 以下をcrontabに登録
`*/5 * * * * /usr/local/cloudwatch/aws-scripts-mon/mon-put-instance-data.pl --mem-util --mem-used --mem-avail --from-cron`


## AWSコンソールからCloudWatchで確認する
AWSコンソールでCloudWatchを選択すると、メトリクスの中に「Linuxシステム」の欄が追加されていることがわかる。
![20161207_aws_ec2_memory_metrix.png](https://qiita-image-store.s3.amazonaws.com/0/2567/c2fe63fc-2459-8fa4-0e87-3b98df6b3d8b.png)


「Linuxシステム」－「InstanceId」をドリルダウンすると、「MemoryUtilization」、「MemoryUsed」、「MemoryAvailable」の項目が取れていることがわかる。
これらを組み合わせてグラフを作成し、ダッシュボードに表示できる。
![20161213_aws_ec2_memory_5stack.png](https://qiita-image-store.s3.amazonaws.com/0/2567/764cbe1a-393c-d06a-0a12-5fba4529a252.png)

## まとめ
メモリ監視でアラームを追加したり、ほかにもDisk容量監視も同じ要領で追加できます。

### Disk容量監視は以下のcronを追加するだけ
`*/5 * * * * /usr/local/cloudwatch/aws-scripts-mon/mon-put-instance-data.pl --disk-space-util --disk-path=/ --from-cron`

## 参考にしたサイト
[AWS EC2でメモリ利用率をCloud Watchで監視する](http://qiita.com/masarufuruya/items/212adbfb285476683c47)
[AWS EC2でメモリ利用率とディスク容量をCloudWatchで監視する](http://wannabe-jellyfish.hatenablog.com/entry/2016/12/14/215432)

上記のサイトだと、パッケージperl-Digest-SHAが入っていないエラーが発生したので下記サイトを参考にエラーを取り除いた。
[RedmineとGitを連携させる（認証統合）](http://d.hatena.ne.jp/torutk/20130117/p1)
phpmigで生成されるMigrationクラスを拡張する


## はじめに
### そもそも、なぜ[phpmig](https://github.com/davedevelopment/phpmig)を使うのか？
いくつかの理由があります。

- フレームワークのmigrationツールが存在しない、もしくは貧弱
- [doctrine](http://www.doctrine-project.org/)を使ってない
  - doctrine使っていれば、[doctrine migrations](https://github.com/doctrine/migrations) を使うほうがいい

### どうせ使うなら、使い勝手を良くしたい
マイグレーションツールとはいえ、実装があるので、コードはなるべく短くしたい。
Migrationクラスを独自の抽象クラスに差し替えることができれば、色々便利な関数作ってコードを短くできそう。

## 独自の抽象クラスを作成
下記のように、`Phpmig\Migration\Migration`クラスを継承した抽象クラスを作ります。

```php
// extension/AbstractMigration.php

use Phpmig\Migration\Migration;

abstract class AbstractMigration extends Migration
{
}

```

## 作ったクラスはbootstrapファイルにて、requireする

```php
// phpmig.php
require __DIR__. '/extension/AbstractMigration.php';
```

## カスタムテンプレートの作成
下記のようにカスタムテンプレートを作成。
`extends AbstractMigration`により、既定クラスを独自のものに差し替える。


```php
// template/migration_class.php

<?= "<?php ". PHP_EOL; ?>


class <?= $className ?> extends AbstractMigration
{
	/**
	 * Do the migration
	 */
	public function up()
	{
	}

	/**
	 * Undo the migration
	 */
	public function down()
	{
	}
}
```

## カスタムテンプレートの適用
bootstrapファイルにて、`$container['phpmig.migrations_template_path']`にテンプレートファイルのパスをセットします。

```php
// phpmig.php
$container['phpmig.migrations_template_path'] = __DIR__. '/template/migration_class.php';
```

## generate
generateコマンドにて、ファイルを生成すると、下記のようになります。

```bash
$ phpmig generate example
+f ./migrations/20170113094237_example.php
```

```php
<?php 


class Example extends AbstractMigration
{
	/**
	 * Do the migration
	 */
	public function up()
	{
	}

	/**
	 * Undo the migration
	 */
	public function down()
	{
	}
}
```

## おわりに
phpmigは、それほど活発に開発が行われているオープンソースソフトウェアではありません。
物足りないところは、Pull Request出して自分たちで使いやすくしていきましょう。

先日、立て続けに２つPull Request出して、mergeしてもらいました。
気になる方は、[こちら](https://github.com/davedevelopment/phpmig/pulls?utf8=%E2%9C%93&q=is%3Apr%20author%3Aimunew%20)を参照ください。

ではでは。
xamarinサンプルやってみた。

* ButtonXaml
* https://developer.xamarin.com/samples/xamarin-forms/ButtonXaml/

￼
アクティブな構成が云々の警告出てます。
￼![ButtonXaml_–_ButtonXamlPage_xaml_cs_–_Xamarin_Studio_Community.png](https://qiita-image-store.s3.amazonaws.com/0/23424/7f5cabf4-b79b-307a-dc5e-fb91844193a2.png "ButtonXaml_–_ButtonXamlPage_xaml_cs_–_Xamarin_Studio_Community.png")

よくわからんけど、赤枠のところのようにMixed Platformにしたら警告消えました。
![ButtonXaml_Android_–_Xamarin_Studio_Community_と_サンプルやってみた。.png](https://qiita-image-store.s3.amazonaws.com/0/23424/0a51796c-d8b0-8ce9-86a2-4e465fe1c2c3.png "ButtonXaml_Android_–_Xamarin_Studio_Community_と_サンプルやってみた。.png")

ちなみに構成に関しては、以下のようなサイトがヒットしました。
今後しっかり理解しないといけないでしょうね。
[アクティブな構成内で](http://kuxumarin.hatenablog.com/entry/2016/12/01/Xamarin.iOS_%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%A7_%22%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%81%AA%E6%A7%8B%E6%88%90%E5%86%85%E3%81%A7%E3%83%97%E3%83%AD)
プロキシ内/外両方のGitリポジトリにアクセスする設定

# 背景

GitHubやBitBucketなどのGitリポジトリに、プロキシ経由でアクセスしたいとします。

```txt
MyPC ---> Proxy ---> GitHub
```

この場合、通常`git config`でプロキシの設定を行います。

```sh
git config --global http.proxy http://proxy.example.com:8080
git config --global https.proxy http://proxy.example.com:8080
```

しかし、この設定をすると、gitがプロキシを使おうとするため、
プロキシを使わない内部のGitリポジトリにアクセスできなくなります。

```txt
MyPC ---> Proxy --✕-> MyRepo (見つからない）
```

ほんとうはこうなって欲しいわけです。

```txt
MyPC --+--> Proxy ---> GitHub
       |
       +--> MyRepo 
```

社内に、GitBucket等で構築したGitリポジトリが存在する場合、
こういう状態になると思います。

# 設定方法その１ リポジトリURL毎にプロキシ設定する（オススメ）

リモートリポジトリ（GitHub, BitBucket等）のURL毎にプロキシを設定します。

```bash
git config --global http.https://github.com/.proxy http://proxy.example.com:8080
git config --global http.https://bitbucket.org/.proxy http://proxy.example.com:8080
```

これで、~/.gitconfigに以下のように追記されます。

```ini
[http "https://bitbucket.org/"]
    proxy = http://proxy.example.com:8080
[http "https://github.com/"]
    proxy = http://proxy.example.com:8080
```

この状態だと、登録したリポジトリであれば、何もしなくてもgit cloneできました。
また、プロキシを経由したくないリポジトリもふつうにgit cloneできました。

プロキシ経由で使いたいリポジトリはほぼ決まっていることが多いと思います。
その場合は、この設定が簡単です。

# 設定方法その２ ローカルリポジトリにプロキシ設定する

ローカルリポジトリの`.git/config`にプロキシを設定します。

## git clone

最初にcloneする際は、環境変数を一時的に設定して、git cloneします。

```sh
# 一時的にプロキシ設定をします
set http_proxy=proxy.example.com:8080 & set https_proxy=proxy.example.com:8080

# この状態でクローンします
git clone https://github.com/xxx/myrepo.git
```

これでプロキシ経由でcloneできると思います。
## git config --local

ローカルリポジトリにプロキシの設定を追加します。
--globalではなく、--localとするところがポイントです。

```sh
# cloneしたローカルリポジトリに移動します。
cd myrepo

# ローカルリポジトリにプロキシの設定を追加します。
git config --local http.proxy http://proxy.example.com:8080
git config --local https.proxy http://proxy.example.com:8080
```
これで、このローカルリポジトリで作業する場合は
プロキシが使用されるようになります。

# おわりに

ほとんどの場合は「その１」のやり方で良いと思います。
プロキシを使うことが稀である場合なら、globalな設定をしない「その２」も
良いかと思います。
SwiftとJavascriptの変数宣言の比較


Swift愛好会にはJavascripterもけっこういるので小ネタを（Swifter目線）。

# Swiftの変数

まずSwiftではこう。

```swift
let hoge // 再代入不可の変数
var fuga // 再代入可能な変数
```

`let`は英語の"let x be 3"で「xを3とする」なので定数を割り当てるイメージでしょうか。
`var`はたぶんvariableで変数そのままですね。

# Javascriptの変数（ES6）

Javascriptではこう。

```javascript
const hoge // 再代入不可の変数
let fuga   // 再代入可能な変数
```

`const`はconstantで定数でそのまま。
`let`は前述の通りですが「xを3とする」を変数xに代入するというイメージで使ってるのでしょうか

ややこしいですねw

さらにややこしいのがJavascriptには `var` まである（ES6以降は使わなくなると思うが）。

```javascript
var piyo   // ES6以前からあった変数宣言。スコープがブロック単位じゃなくて関数function単位。今更だけどまじかよ。
```

（Javascriptの変数のスコープがブロックになってくれたのはちょっとやる気出る。）

# Kotlinの変数

おまけです。

```kotlin
val hoge // 再代入不可の変数
var fuga // 再代入可能な変数
```

`val`と`var`はvalueとvariableとかなのかな・・・

以上
【ポエム】チューリング完全性とマルチスレッド処理

# 今北産業

マルチスレッド処理を扱うプログラミング言語に関して、
チューリング完全性よりも強い（？）計算可能な範囲の概念がありそう
誰か教えてくれないかな

# 事の発端

[Qiitaの画像アップロード機能も簡単に実装できる。そう、S3ならね。](http://qiita.com/yuku_t/items/40b7daf018d3dab48974)
を読んでいて、ふと気になったことがありました。
クライアント側で沢山のファイルをエラーにならないように気をつけて投げるにはどうすればよいのかな、と。
結論から言うと、type="file"のinputに対してmultipleを指定して、てきとうに同じ処理を繰り返せばよいです。

```js:something.html
<script>
$(function(){
  var fileInput = $('input[type="file"]');
  fileInput.on('change', function (e) {
    uploadFileRecursive(e, 0);
  });
});

function uploadFileRecursive(e, i){
  var file = e.target.files[i];
  $.ajax({
    url: '/policies',
    type: 'POST',
    dataType: 'json'
  }).done(function (data) {
    var name, fd = new FormData();
    for (name in data.form) if (data.form.hasOwnProperty(name)) {
      fd.append(name, data.form[name]);
    }
    fd.append('file', file);
    var xhr = new XMLHttpRequest();
    xhr.open('POST', data.url, false);
    xhr.send(fd);
    if (i + 1 < e.target.files.length) {
      uploadFileRecursive(e, i + 1);
    }
  });
}
</script>
<input type="file" multiple></input>
```

「てきとうに」と書いたのですが、仮にforで普通のループを書いたりすると、ほぼ同時に沢山のリクエストを投げる事になってしまいます。それを回避する楽なやり方は無いかなーと思って、素朴に思いついたのはコールバックで再帰呼び出しをさせるということでした。

そこで気になったのが、コールバックは意味論的にforとifで書けるのかしら、ということ。（実装レベルでIOをループで待つ、というようなことをせずに、意味論的な話で）
例えば、brainf**kとかOok!やwhitespaceみたいなものでは、原理的にコールバックを書けないんじゃないかな、と思いました。

この処理の本質はajaxがasyncであるということで、マルチスレッド処理のできるプログラミング言語の意味論を考えると、チューリング完全よりも表現力の強い（？）ものが何かありそうだな、というようなことを思いました。
また、こういう計算を許すと、計算量がある程度多い問題でも短時間で解ける可能性があります。例えば、この例では敢えて直列的に計算するためコールバックを通していますが、forを使った場合、処理が滞りなく実行される前提だと時間は短くなります。（当然、メモリやCPU等のリソースを莫大に使う可能性はありますが、、、）

そういう話の詳しい資料とかあったら、おしえてください！(mapreduceの仕組みとかではなくて、プログラム意味論的な話で。コールバックの処理の中身は、ひょっとすると意味論では言及しないのが一般的なのかもしれないですが、、、)
正規表現で一発で置換するより for で回した方が速かった #rstatsj

ある文字列 `x` 中に文字列ベクトル `vec` に含まれる文字列がある場合、その文字列にプレフィクスをつけたい。

```r:R
x <- "hoge fuga hoge piyo"
vec <- c("fuga", "piyo")
prefix <- "PREFIX."

f(x, vec, prefix)
#> "hoge PREFIX.fuga hoge PREFIX.piyo"
```

これを行う方法として正規表現を使うと楽である。

```r:R
f1 <- function(x, vec, prefix) {
  pattern <- sprintf("(%s)", paste(vec, collapse = "|"))
  #> "(fuga|piyo)"
  replacement <- sprintf("%s\\1", prefix)
  #> "PREFIX.\\1"
  gsub(pattern, replacement, x)
}

f1(x, vec, prefix)
#> "hoge PREFIX.fuga hoge PREFIX.piyo"
```

この正規表現は `vec` を一度に置換できるが、次のように `vec`内の文字列ひとつひとつに対してこの正規表現を使った置換を `for` で回しても良い。

```r:R
f2 <- function(x, vec, prefix) {
  result <- x
  replacement <- sprintf("%s\\1", prefix)
  for (item in vec) {
    pattern <- sprintf("(%s)", item)
    result <- gsub(pattern, replacement, result)
  }
  result
}

f2(x, vec, prefix)
#> "hoge PREFIX.fuga hoge PREFIX.piyo"
```

一見、正規表現で一発で置換した方が速そうだが、私が使いたいのは `vec` のサイズが 800 〜 8000 程度の場合である。

速度比較してみた。

```r:R
library(microbenchmark)
set.seed(71)

result <- data.frame()
for (N in seq(100, 900, by = 100)) {
  cat(N, " ")
  vec <- replicate(N, paste0(sample(letters, 10, replace = TRUE), collapse = ""))
  x <- sprintf("hoge %s hoge %s", sample(vec, 1), sample(vec, 1))
  prefix <- "PREFIX."

  microbenchmark(
    only_regex = f1(x, vec, prefix),
    use_for = f2(x, vec, prefix)
  ) -> res_bench
  
  result <- rbind(result, data.frame(N, res_bench))
}

library(ggplot2)
ggplot(result, aes(x = factor(N), y = time)) + 
  geom_boxplot(aes(fill=expr)) + ylim(0, 6e7)
```

![](https://qiita-image-store.s3.amazonaws.com/0/2570/edcc7f28-3355-b7cf-1a0a-1a6804f38ec1.png)

結果は、`vec` の長さが 400 を境に `for` で回した方が速くなった。

私の使用用途の場合は `for` を使った方が良さそうだ。

Enjoy!

## 補足

ちなみに `vec` が 1000 を超えると一発置換の方はエラーとなった。

```r:R
N <- 1000
vec <- replicate(N, paste0(sample(letters, 10, replace = TRUE), collapse = ""))
x <- sprintf("hoge %s hoge %s", sample(vec, 1), sample(vec, 1))
prefix <- "PREFIX."

pattern <- sprintf("(%s)", paste(vec, collapse = "|"))
replacement <- sprintf("%s\\1", prefix)
gsub(pattern, replacement, x)
```

```:結果
 gsub(pattern, replacement, x) でエラー: 
  assertion 'tree->num_tags == num_tags' failed in executing regexp: 
  file 'R-3.3.2/src/extra/tre/tre-compile.c', line 634
```

## 追記

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ほむ…gsubが重たくて遅いってことなのかな？ てことはstringrのstr_replace_allでは変わってくるのかな？</p>&mdash; kazutan v3.3.2 (@kazutan) <a href="https://twitter.com/kazutan/status/819684375402926080">2017年1月12日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

**stringr** を使うとどうなるかだって？ やってみよう。

```r:R
library(stringr)

f3 <- function(x, vec, prefix) {
  pattern <- sprintf("(%s)", paste(vec, collapse = "|"))
  replacement <- sprintf("%s\\1", prefix)
  str_replace_all(x, pattern, replacement)
}
f3(x, vec, prefix)
```

![](https://qiita-image-store.s3.amazonaws.com/0/2570/bfa47b78-d77b-ffa6-2992-a221620ddbc6.png)

ちょっぱやだった。

Enjoy!
Windows上でAnsibleを使う

この記事ではWindowsにインストールしたConEmu、MSYS2およびPython2とDocker Toolboxを使っています。
ユーザー名は適宜読み替えてください。

## WindowsでAnsibleを使うにはどうするか

一番ラクなのはWindows上のターミナルからansibleコマンドを実行する方法でしょうか。
ここを目指して試行錯誤したのですがどうにもうまくいきませんでした。
結局DockerやVagrantを用途ごとに利用する方法が一番ラクだということがわかりました。
以下は試行錯誤した結果をまとめてみます。
最後にWindows上でDockerを使ったAnsibleのRole再利用方法について書き留めます。

## MSYS2上でAnsibleをインストールしてみる

まずAnsibleをwindowsネイティブのプログラムとしてインストールしてみたいと思います。
MSYS2はMSYSTEM=mingw64としてシェルを起動します。
インストールはpip経由で行いました。
Python2とpipはmingw64リポジトリで公開されているものを利用しました。
途中pycryptoやcryptographyのビルド時にライブラリが足りないことがあります。
そんなときにはCFLAGSをセットしておけばgccコンパイル時にincludeのパスを矯正できます。

結果インストールまではこぎつけました。Windowsネイティブのバイナリが生成できました。
しかし実行してみると `ImportError: No module named fcntl` となり失敗になりました。

次にMSYSTEM=msysとしてシェルを起動します。
Python2とpipはmsysリポジトリで公開されているものを利用しました。
しかし実行してみると `ImportError: No module named fcntl` となりまた失敗になりました。

## コマンドプロンプト上でAnsibleをインストールしてみる

Python2をWindowsのインストーラーからインストールしてAnsibleのインストールをやってみました。  
Python2がビルドに利用するWindowsのコンパイラはありがたいことに[Microsoftから提供されていました](http://www.microsoft.com/en-us/download/details.aspx?id=44266)。  

そして見事Ansibleをインストールできます。
しかし実行してみると `ImportError: No module named fcntl` となりまたまた失敗になりました。

```
$ /c/Python27/Scripts/ansible --version
Traceback (most recent call last):
  File "C:/Python27/Scripts/ansible", line 45, in <module>
    from ansible.utils.display import Display
  File "C:\python27\lib\site-packages\ansible\utils\display.py", line 21, in <module>
    import fcntl
ImportError: No module named fcntl
```

その後Anaconda2を利用してみましたがこちらも同様のエラーで無理でした。

## VagrantとVirtualBoxでAnsibleを利用する

Ansibleの利用シーンとしてプロビジョニングがあると思います。
Vagrantはプロビジョニングの方法として[Ansibleのプロビジョナー](https://www.vagrantup.com/docs/provisioning/ansible_local.html)を提供してくれています。

Windows上でAnsibleはインストールできていないのでAnsible Localを利用します。
見事Ansibleでプロビジョニングできました。

## Roleの再利用とRoleの作成を考える

Ansibleにはansible-galaxyコマンドがあります。
Roleの再利用を目的として提供されているので、Roleを作成してみたいと思います。
しかし、Windows上ではプロビジョニングのシーン以外ではAnsibleを利用できません。

## Dockerを利用してRoleの再利用をやってみる

最後にDockerを利用して、Roleの再利用をする方法を試します。
Docker Machineを使いdockerコマンド利用の準備をします。 

```
$ docker run --rm -v "//c/Users/<username>/ansible/roles:/etc/ansible/roles" ansible/ansible-container-builder:0.3 ansible-galaxy install geerlingguy.apache
```

後は上記のような感じでRole再利用のためにansible-galaxyコマンドを利用できます。
プロビジョニング以外のシーンではDocker利用が一番捗りそうです。

以上、Windows上でAnsibleを使う方法についてでした。

MSYS2あたりの知識が不足しており誤っている場合があるのでその際にはご教授くださいませ。  
どうにもこうにも色々躓くことが多いWindows上での開発ですが誰かの助けになれば幸いです。
技術英語 > [end-to-end times] between static and dynamic programs will be [close].

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 364 / 12833)

> **<font color=red>end-to-end times</font>** between static and dynamic programs will be **<font color=red>close</font>**.

http://eow.alc.co.jp/search?q=%22end+to+end%22
> 1. 端と端を接続して
> 2. 端から端まで
...

https://www.merriam-webster.com/dictionary/end%20to%20end
> :  with ends touching each other <Put the two small tables end to end.> <railroad cars lined up end to end>

「端から端まで」と「端と端を接続して」の意味があるようだ。

<hr>
> **<font color=red>end-to-end times</font>** between static and dynamic programs will be **<font color=red>close</font>**.

closeは発音記号「klóus」の方かと思う。
http://qiita.com/7of9/items/e30d89f68e17c43dd560
Cognosの導入がうまくいかないパターン① - 起動が進まない

Cognos BIやCognos Analyticsのセットアップで、色々なパターンでうまく行かない事がありますが、思い出した順に投稿します。

Cognos BI & Analyticsのセットアップ時には、Cognos ConfigurationでCognosサービスの初期起動時に、LogServiceを起動後にContent Storeにテーブルを作成に行きますが、そのどちらのフェーズに入るまで進まず、下の画面の灰色部分に入る事なく止まってしまい、結局タイムアウトしてしまう事があります。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/113a0f24-1a22-4fe2-65e9-3cea26db4425.png)

cogserver.logもでない、Content Storeへのテスト接続はできるのに、実際にテーブルを作成に行かない、というイマイチ手がかりが無く困るパターンですが、この場合、環境変数のJAVA_HOMEの問題である確率が非常に高いです。

何かしら別のM/Wと共存させるような場合に、勝手にJAVA_HOMEがセットされていて、Cognosを後から入れるとその設定で起動してこない事があります。
JAVA_HOMEを削除して、起動できるか試してみましょう。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/c25a5f79-5de9-f595-d411-9937d2ec35ed.png)

手がかりが無い時はJAVA_HOMEを疑え、というのを頭の片隅に覚えておくと、どこかで役に立つかも知れません。
3.0以前のPowerShellでディスクの情報を取得する

PowerShellにはディスクの総容量、空き容量、種類などを調べる便利なコマンドレットがあります。  

```ps1
Get-Volume
Get-Disk
Get-PhysicalDisk
```
便利ですね。でもこれらはPSv4以降のものなのでみんな大好きWin7/2008R2搭載のPSv2ではつかえません。
こんな良く使いそうなもの最初から作っといてほしいですが基本的なとこが抜けてるのは諦めて次のコマンドで代用してください。

```ps1
> [System.IO.DriveInfo]::GetDrives()
```
これでドライブの情報で必要なものはほとんど取得できると思います。
数が多いと見ずらいのでSelect-Object、Format-Tableなどで整形しましょう。

```
PS C:\> [System.IO.DriveInfo]::GetDrives()
>>


Name               : C:\
DriveType          : Fixed
DriveFormat        : NTFS
IsReady            : True
AvailableFreeSpace : 101456936960
TotalFreeSpace     : 101456936960
TotalSize          : 239458705408
RootDirectory      : C:\
VolumeLabel        :

Name               : D:\
DriveType          : CDRom
DriveFormat        :
IsReady            : False
AvailableFreeSpace :
TotalFreeSpace     :
TotalSize          :
RootDirectory      : D:\
VolumeLabel        :

Name               : E:\
DriveType          : Removable
DriveFormat        :
IsReady            : False
AvailableFreeSpace :
TotalFreeSpace     :
TotalSize          :
RootDirectory      : E:\
VolumeLabel        :
```
C++でstringで読み込んだ数列を一桁ずつint型へ変換

入力されたstring型の数列に対して、一桁ずつ(0~9の範囲で)計算処理したかったのでその方法を自分用に簡易メモ。


```StringToInt.cpp
#include <iostream>
#include <string>
using namespace std;

int main(void) {

    string str;   //今回は15文字入力と予めわかっている
    int N[15];

    cin >> str;

    for (int i = 0; i < 15; ++i) {

        N[i] = (int)(str[i] - '0');  //str[i]　はchar型なのでchar→intへ変換

        cout << N[i] << endl;  //確認のため表示
	    
    }

    return 0;
}
```

ちなみに数列内に文字が混在している時は、0~9以外の数値を無視する、などで除外することができるのではないでしょうか。

##追記(2017/01/15)
SaitoAtsushi さんから頂いたコメントで、transformという関数が使えることがわかったので、試してみました。

```StringToInt.cpp

#include <iostream>
#include <string>
#include <algorithm>   //新たにインクルード

using namespace std;

int main(void) {

	string str;  
	int N[15];

	cin >> str;

	transform(begin(str), end(str), N, [](char c) {return c - '0'; });

	for (int i = 0; i < 15; ++i) {
		cout << N[i] << endl;       //確認用
	}

	return 0;
}

```

この方法でも同様の結果が得られました。ありがとうございました。
双方向バインディング(ngModel)対応のComponentを自作する



Angular2では `<input [(ngModel)]="firstName">` と書けば、これを利用してるページでの `currentHero.firstName` との双方向バインディング(two-way binding)が出来ます。

つまり、スクリプト側で値を変えたら反映されるし、View(つまりHTMLというかDOMというかブラウザ上というか)側で値を変えても、もちろん反映されます。


こういうの、標準の `<input>`タグとかには Angular側が組み込みで用意してくれているけれども、自作したカスタムコンポーネントではどうする？


## 答え

`@Input()  value` を作ってるならば
`@Output() valueChange = new EventEmitter();` と、同名+ChangeのEventEmitterを作るだけでよい。

そうすると、`[(value)]` で双方向バインディング出来ます。

### ありがちなミス

うまく動かないときは `Change"d"` になっていないか確認してください。
`valueChanged` など、 `Changed` では双方向バインディングできません。

### 実例


```typescript
import { Component, EventEmitter, Input, Output } from '@angular/core';

@Component({
  selector: 'input-name',
  template: `
  <div>
    <label>あなたのお名前なんですか？</label>
    <input [value]="name" (change)="change($event.target.value)"></input>
    <button (click)="clear()">クリア</button>
  </div>`
})
export class InputNameComponent {
  @Input()  value: string; // 受け口。 <input-name value="123">と書かれると123が代入される
  @Output() valueChange = new EventEmitter<string>();  // 出力口。
  
  change(value) { //値が変化した
    this.value = value
    this.valueChange.emit(this.value)
  }
  
  clear() { //入力値をクリア
    this.value = ""
    this.valueChange.emit(this.value)
  }
}
```



```html:利用側
<!-- シンプルに書ける -->
<input-name  [(value)]="firstName"></input-name>


<!-- とはいえ、上の書き方はエラー時に混乱しやすいので、こんな風に書いたほうが分かりやすいかも -->
<input-name  [value]="firstName" (valueChange)="firstName=$event"></input-name>
```

分かってれば簡単だった。
Raspberry Pi3にDockerをインストールしGitLabを入れる


##インストールするdocker

ぐぐると，docker-hypriotを使っている記事が多いためとりあえず，
docker-hypriotを使用していたが，docker-hypriotを使っていると
イメージビルド時に以下のようなメッセージが出て先に進めませんでした。

```
rpc error: code = 2 desc = "oci runtime error: exec format error"
```


これで2，3日悩みました・・・
現在ではDockerが公式にRasberry Piをサポートしているので
docker-hypriotをアンインストールし，以下で公式のdockerをインストールします。

```terminal
$ curl -sSL get.docker.com | sh
```


このままだとrootユーザでしかdockerコマンドを叩けないので，dockerグループに任意のユーザを追加します。
一度ログアウトし、ログインし直すとrootでないユーザーでもdockerが使えるようになります。

以下は，piユーザをdockerグループに追加する場合の例です。

```terminal
$ sudo usermod -aG docker pi
```

##Gitlab

docker-composeをインストールしていない場合は適当にインストールします。

```terminal
$ pip uninstall docker-compose
```

あとはsameersbn/gitlabの[Quick Start](https://hub.docker.com/r/sameersbn/gitlab/#quick-start)を参考にしてイメージ作成，コンテナを起動すればよい。
vue-ts-loaderを使ってVue.jsでTypeScriptを使う

# はじめに
44と申します。大阪の専門学校でプログラミングを勉強しており、よくVue.jsでつまらないツールを作っています。

この間初めてTypeScriptを触りVue.jsで使いたいと思い調べて見ました。

# 準備
webpackのインストール
webpackは１系をいれてください、vue-ts-loaderがまだ２系に対応していないみたいです。

```
npm install webpack --save-dev
```

Vue.jsのインストール

```
npm install vue --save
```

vue-loaderのインストール

```
npm install vue-loader css-loader vue-template-compiler --save-dev
```

vue-ts-loaderのインストール

```
npm install vue-ts-loader --save-dev
```
# 設定
webpackとtsconfigの設定をしていきます。

####webpackの設定

```webpack.config.js
module.exports = {
    entry: { app: './app.ts', },
    output: { filename: 'app.js' },

    // resolve TypeScript and Vue file
    resolve: {
        extensions: ['', '.ts', '.vue', '.js']
    },

    module: {
        loaders: [
            { test: /\.vue$/, loader: 'vue' },
            { test: /\.ts$/, loader: 'vue-ts' }
        ],
    },
    vue: {
      loaders: { js: 'vue-ts-loader', },      
      esModule: true
    }
}
```

```loaders: { js: 'vue-ts-loader', }```とすることで```.vue```の```<script>```部分で```lang```属性をしなくてもいいようです。


####tsconfigの設定
```tsconfig.json
{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es5",
        "experimentalDecorators": true,
        "lib": ["es5", "es2015.promise", "dom"]
    }
}
```

これで設定は完了したのでHellow Worldを書いて行きたいと思います、

#Hello World


```app.ts
declare var require: any

import Vue = require('vue')
var App = require('./src/App.vue').default

new Vue({
  el: '#app',
  components: { App },
  render: h => h('app')
})
```
app.tsでVueのルートコンポーネントを生成します。


```src/App.vue
<template>
<h1 @click="hello">hello world</h1>
</template>

<script>
export default {
  methods: {    
    hello(): void {
      alert('hello world')
    }
  }
}
</script>
```

index.htmlではapp.tsを読み込むのではなくコンパイルしてできたapp.jsを読み込みます。

```index.html
<html>
	<body>
		<div id="app"></div>
		<script src="app.js"></script>
	</body>
</html>
```
これでHello Worldの準備は完了です！
ここまでの[ソースコード](https://github.com/44x1carbon/vue-ts-loader-example)を置いておきます。

#実行！
準備ができたのであとは```webpack```コマンドを実行しindex.htmlをブラウザで開くだけです。

#最後に
普段、Visual Studio Codeを使って開発しているのですがお互いマイクロソフト製ということもあってすごい開発しやすいです。
JavaScriptを1年半ぐらい触っていて型がないのつらいと思っていた時にTypeScriptに出会い「やっぱり型っていいな」と思いました。

#参考にしたサイト・記事

* [Vue.jsとTypeScript](http://qiita.com/kaorun343/items/425fdfe55b81437cdb6a)
* [ Vue2 + TypeScript2 -- an introductory guide | Abitrarily Idiosyncratic Randomness ](https://herringtondarkholme.github.io/2016/10/03/vue2-ts2/)
js 花占 好き嫌い無関心

##お題
女の子がある人を思い浮かべながら、"好き""嫌い"と花びらを一枚一枚千切っていく花占い、その関数をつくる。
・つぶやく言葉　
    'I love you',
    'a little',
    'a lot',
    'passionately',
    'madly',
    'not at all',
・与えられる花びらは`nb_petals > 0`


```js
function howMuchILoveYou(nbPetals) {
    // write your code
}
```

##出力結果　例

```js
howMuchILoveYou(7)//"I love you"
howMuchILoveYou(3)//"a lot"
howMuchILoveYou(6)//"not at all"
```

##使ったもの
switch文

##考え方
引数の余りを求めて場合分けする

##コード

```js
function howMuchILoveYou(nbPetals) {
    switch (nbPetals % 6) {
        case 1:
            return 'I love you'
            break
        case 2:
            return 'a little'
            break
        case 3:
            return 'a lot'
            break
        case 4:
            return 'passionately'
            break
        case 5:
            return 'madly'
            break
        case 0:
            return 'not at all'
            break
    }
}
```

##ES6

```js
const howMuchILoveYou=n=>['not at all','I love you','a little','a lot','passionately','madly'][n%6];
```

```js
const phrases = [
    'I love you',
    'a little',
    'a lot',
    'passionately',
    'madly',
    'not at all',
];

function howMuchILoveYou(n) {
     return phrases[(n - 1) % phrases.length] 
}
```

###他にもコードが浮かんだ方、コメントお待ちしております
Bitbucket/GitHub/GitLabでブラウザで差分表示する時に空白を無視するブックマークレット

[Bitbucket、GitHubで、ブラウザで差分表示する時に空白を無視したい/タブ幅を変更したい](http://qiita.com/hiroxy/items/6890bfc13918ab075f78)という投稿で、BitbucketやGitHubのURLパラメータに`w=1`を付けることで(`git diff -w`をイメージすれば良い)、空白の差分を無視できることを知った。

ただ、いちいちアドレスに入力するのは面倒なので、ブックマークレットを作った。

```
javascript:(function(){var%20q=location.href.split("?");var%20h=location.href.split("#");var%20b=location.href.split(/[\?#]/)[0];var%20p=q.length==1?"?w=1":"?"+q[1].split("#")[0]+"&w=1";var%20a=h.length==1?"":"#"+h[1];location.href=b+p+a;})()
```

これをブックマークバーなどに設置しておき、対象の差分表示ページで実行すれば、お手軽に空白を無視した差分表示ができる。

ワンライナーだとコードが読みづらくなってきたので、関数部分を改行したものを付記する。

```javascript
function(){
  var q=location.href.split("?");
  var h=location.href.split("#");
  var b=location.href.split(/[\?#]/)[0];
  var p=q.length==1?"?w=1":"?"+q[1].split("#")[0]+"&w=1";
  var a=h.length==1?"":"#"+h[1];
  location.href=b+p+a;
}
```

## 補足など
- 2017/1/13日時点ではBitbucketでもGitHubでも上手く動いたが、当然、今後の仕様変更で動かなくなる可能性は十分にある。
- ~~手元に試せる環境が無いので分からないが、Backlogなどでは上手く動くだろうか？(情報頂けるとありがたいです)~~
    - Backlogには空白無視のdiffを表示する機能がないとのこと。
    - http://feedback.backlog.jp/forums/140671-backlog-%E8%A6%81%E6%9C%9B-%E5%95%8F%E9%A1%8C%E3%81%AE%E5%A0%B1%E5%91%8A-%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A9%E3%83%A0/suggestions/15523482
DockerのAlpine Linuxを試す

## 各種設定見る系

どこまで入ってるかよくわからない。。
コンテナの中からメモリやCPU利用量は取れる？

```
ps aux

ifconfig
```

## 色々インストールしてみる

なるべく最新版を使いたいので、出来る限りビルドしてみるなど。
いずれもalpine:3.5で試しています。

※なお、Dockerfileにするときは層を減らしたりして良い感じにすると思いますが、一旦shellでごにょごにょいじります。

apkのpackage群はこちら。
https://pkgs.alpinelinux.org/packages

### Java

```sh:alpine-sh
# library install
apk add --update openjdk8

# check
java -version
openjdk version "1.8.0_111"
```

### ruby

```sh:alpine-sh
# library install
apk add --update ruby

# check
ruby -v
2.3.3
```

### python2

```sh:alpine-sh
# library install
apk add --update python

# check
python -V
2.7.12
```

### python3

```sh:alpine-sh
PYTHON_VERSION=3.5.2

# library install
apk --update --no-cache add --virtual build-temp build-base openssl

# source code
wget "https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_V
ERSION}.tgz"
tar xzvf Python-${PYTHON_VERSION}.tgz
cd Python-${PYTHON_VERSION}

# build
./configure
make
make install

# check
python3 -V
-> Python 3.5.2
```

### nodejs

```sh:alpine-sh
# env
NODEJS_VERSION=6.9.4

# library install
apk --update --no-cache add --virtual build-temp python build-base linux-headers

# source code
wget http://nodejs.org/dist/v${NODEJS_VERSION}/node-v${NODEJS_VERSION}.tar.gz
tar xzvf node-v${NODEJS_VERSION}.tar.gz
cd node-v${NODEJS_VERSION}

# build
./configure --prefix=/opt/node --without-snapshot --fully-static
make
make install

# clean up
apk del build-temp
rm -rf node-v${NODEJS_VERSION} node-v${NODEJS_VERSION}.tar.gz

# path
PATH=${PATH}:/opt/node/bin

# check
node -v
-> v6.9.4
```

### nginx

refs: http://qiita.com/asakaguchi/items/484ba262965ef3823f61

```sh:alpine-sh
# env
NGINX_VERSION=1.11.8

# library install
apk --update --no-cache add zlib-dev openssl-dev pcre-dev
apk --no-cache add --virtual build-temp build-base

# source code
wget http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz
tar xzvf nginx-${NGINX_VERSION}.tar.gz
cd nginx-${NGINX_VERSION}

# build
./configure \
  --with-http_ssl_module \
  --with-http_gzip_static_module \
  --prefix=/usr/share/nginx \
  --sbin-path=/usr/local/sbin/nginx \
  --conf-path=/etc/nginx/conf/nginx.conf \
  --pid-path=/var/run/nginx.pid \
  --http-log-path=/var/log/nginx/access.log \
  --error-log-path=/var/log/nginx/error.log
make
make install

# clean up
apk del build-temp
rm -rf nginx-${NGINX_VERSION} nginx-${NGINX_VERSION}.tar.gz
```
いろんな型のクイックソート(VBAHaskell)

いろんな型が混じった配列を任意の比較基準でソートしたい。例えば、

Object型はその他の型より常に大きい。
Object型どうし・・・TypeNameの値で比較（文字列としての比較となる）
それ以外・・・・・・VarTypeの値で比較

という基準で比較するとしましょう。

比較用の述語をVBAHaskellの作法でこのように書きます。

```vbnet
Function lessByName(ByRef a As Variant, ByRef b As Variant) As Variant
    If IsObject(a) Then
        If IsObject(b) Then
            lessByName = IIf(TypeName(a) < TypeName(b), 1, 0)
        Else
            lessByName = 0
        End If
    ElseIf IsObject(b) Then
        lessByName = 1
    Else
        lessByName = IIf(VarType(a) < VarType(b), 1, 0)
    End If
End Function
    Function p_lessByName(Optional ByRef firstParam As Variant, Optional ByRef secondParam As Variant) As Variant
        p_lessByName = make_funPointer(AddressOf lessByName, firstParam, secondParam)
    End Function
```

以下のように適当に配列を作ってみます。

```vbnet
a = Array(0, 1, 2, 3, 1.3, "ABC")
Set a(1)= Application 
Set a(3)= Application.Windows
printM a
  0  Application  2  Windows  1.3  ABC
```
ちなみに`printM`は要素がObject型の場合はそのTypeNameを表示する仕様です。

さて、TypeNameとVarTypeの値はそれぞれこうなっています。

```vbnet
?TypeName(a(0)), VarType(a(0))
Integer        2 
?TypeName(a(1)), VarType(a(1))
Application    8 
?TypeName(a(2)), VarType(a(2))
Integer        2 
?TypeName(a(3)), VarType(a(3))
Windows        9 
?TypeName(a(4)), VarType(a(4))
Double         5 
?TypeName(a(5)), VarType(a(5))
String         8 
```

最初に定義した比較用の述語を与えてソートインデックスを計算します。

```vbnet
s = sortIndex_pred(a, p_lessByName)
printM s
  0  2  4  5  1  3
```

これで実際にソートして出力してみます。

```vbnet
permutate a, s
printM a
  0  2  1.3  ABC  Application  Windows
```
一瞬 `2 < 1.3` で？？と思いますが、比較基準に従っています。（Integer:2 < Double:5）
VBAHaskellのソートは安定ソートではないですが、この場合はたまたま元の順番が保たれました。
（一般に安定ソートの需要って高いんでしょうか？）

* * *

リンク

[Qiita　VBAHaskellの紹介　その1　（最初はmapF）](http://qiita.com/mmYYmmdd/items/c731edf943acc0a0ebe9)
[ソースコード(Github)](https://github.com/mYmd/VBA)
[VBAHaskellの関数リファレンス](http://home.b07.itscom.net/m-yamada/vh_Manual/VBAHaskell_reference.htm)
dllバイナリ：
https://github.com/mYmd/VBA/blob/master/bin/mapM (32bit-Office用)
https://github.com/mYmd/VBA/blob/master/bin/mapM64 (64bit-Officey用)
VBAコード添付済みExcelブック
[VBAHaskellほぼ全部入り.xlsm](https://github.com/mYmd/VBA/blob/master/bin/VBAHaskell%E3%81%BB%E3%81%BC%E5%85%A8%E9%83%A8%E5%85%A5%E3%82%8A.xlsm)
ビルドしても更新が反映されなかったり、gitの環境が壊れてしまったときにの対処方法

プログラムのビルドを何回もしていると、更新したはずのプログラムが反映されなかったり、ローカルリポジトリの環境が壊れてしまったりすることがある。
そんなときに環境を修正するための便利なコマンドがあったのでメモしておく

##コンパイル時にGradleのキャッシュを見に行かないようにする。
これをやるにはいくつかの方法がある。

####方法１：キャッシュを消す
これが一番確実
``rm -rf $HOME/.gradle/caches/``

####方法１.２：ビルドごとにコンパイル時のキャッシュの場所を指定し、コンパイル終了時に削除する。
ローカルでのコンパイルであれば問題ないが、jenkisなどの環境で行う場合、複数のコンパイルが同時に走っているケースが想定される。そのような場合にキャッシュを削除してしまうと、予期せぬ動作につながってしまう可能性もある。そこで、タスクごとにキャッシュフォルダを指定し、そのフォルダを削除するという方法を取ることで上記の問題発生を避けることができる。コマンドは下記の通り。
``gradle --gradle-user-home /tmp/naggi build``

また、方法１、１．２のどちらかであれば、必ず再読込したいファイルのみを削除し、その他はキャッシュを使うようにすることもできる。
下記の例は、dom4jというプロジェクトはキャッシュを取得したくない場合。
```rm -rf $HOME/.gradle/chache/caches/modules-2/files-2.1/dom4j``

方法２：コマンドでなんとかする
時々想定通りに動かないのでイライラするのでおすすめしない。
一部の情報では、gradle 2.14には時々下記のコマンドを実行してもキャッシュが有効化されてしまう問題があり、2.14.1で修正されたという情報があった（未確認）。マニュアルに書いてあるコマンドは下記の通り。
``gradle build --refresh-dependencies``

方法３：gradle.buildにキャッシュの有効期間を０を設定する
gradle.buildに下記のように記述することで、キャッシュを無効にできる

```:gradle.build
configurations.all {
    resolutionStrategy.cacheDynamicVersionsFor 0, 'minutes'
}
```
この方法は試してみたけど、有効に機能はしなかった。。。

結論：方法１が一番確実で便利。


## Gitのリポジトリを強制的にリモートと合わせる

対象のgitリポジトリに移動して、下記のコマンドを順番に実行すると、ローカルリポジトリの情報をリモートの情報に合わせることができる。（ローカルの変更はすべて消えることに注意）

```
git fetch origin
git reset --hard origin/master
git clean -d -f
```
ずっと Windows ユーザだったフロントエンドの人が Mac へ移行する手順 基礎編

ずっと OS は Windows でやってきてますが、この度 MacBook Pro を購入しました。

[バッテリーの件は解決しましたが](http://japan.cnet.com/news/service/35094786/)、[グラフィックの件がとても心配な件](https://corriente.top/post-30461/)があり、Late 2016 モデルではなく Mid 2015 モデルを買いました。Mac ユーザからするとなんでこのタイミングでそっちなの、と言われそう。別に Mac 信奉してるわけではないのと Windows では超えられない障壁があり開発のための個人用でしかないので…。


## 開封してから

- 小洒落たものにすべて梱包されている
- 手に持ったままディスプレイを開けて可動部に手を挟む

## 電源を入れてから

- 突如のファ゛ーという起動音にビビる => 音なくしたい

```
$ sudo nvram SystemAudioVolume=%00
```

ターミナルからこれでよいようだ。

- セットアップ中、スクロールができない
	- トラックパッドを二本指で移動
- FileVault ってなんですか？
	- https://support.apple.com/ja-jp/HT204837
	- 個人用なので特に暗号化しない（してる人いるんですか？
- 購入した Apple アカウントが App Store で使ったことがないので登録
	- アプリ導入時にいちいちパスワードを聞かれるので、App Store 環境設定からパスワードは不要に。
- 変換に慣れないので「1」と表示される。

## ブラウザ

- Chrome
- Chrome Canary
- Firefox
- Firefox Developers Edition

## Xcode / Homebrew

- Xcode は App Store から
	- なぜか通信エラーやらで途切れたがインストールした
- Homebrew 導入

```
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

## クリップボード監視・履歴

- [Clipy](https://clipy-app.com/)
	- Windows のときは [CLCL](http://www.nakka.com/soft/clcl/)
	- 操作感などがかなりマッチしていい感じだ

## 開発のお供

- [Google Play Music Desktop Player](https://www.googleplaymusicdesktopplayer.com/)

## 入力

- Google 日本語入力
	- Windows の時からこれなので。

---

シェル、Node.js ほか各言語周りだいぶセットアップ進んでるんですが寒いので寝ます。

次回はfishshel, fisher, rbenv, pyenv, go, VS Code
次々回はVagrant, Docker とかまとめる予定です。
VisualStudio の LNK1112 と LNK1158 の対処


プラットフォームを x86 に指定した時によく出会すエラー。
いつも忘れてググるのでメモ。

## LNK1112: モジュールのコンピューターの種類 'X86' は対象コンピューターの種類 'x64' と競合しています。

指定したプラットフォームとプロジェクトのプロパティ指定が食い違っている。
以下を切り替える。

構成プロパティ > リンカー > 詳細設定 > 対象コンピューター

```diff
-- MachineX64 (/MACHINE:X64)
++ MachineX86 (/MACHINE:X86)
```

![image](https://qiita-image-store.s3.amazonaws.com/0/68277/a6c97151-c277-1ad0-42ac-5d7197feb046.png)

## LNK1158 'rc.exe' を実行できません。

`rc.exe`は`$(WindowsSdkDir)bin\x64`と`$(WindowsSdkDir)bin\x86`の配下に存在するが、
名前順で前者の`rc.exe`が先にヒットしてしまっているようだ。
x86配下の32bit用`rc.exe`が先にヒットするように実行ファイルパスを追加する。

構成プロパティ > VC++ ディレクトリ > 実行可能ファイルディレクトリ

```diff
-- ...$(WindowsSdkDir)bin;...
++ ...$(WindowsSdkDir)bin\x86;$(WindowsSdkDir)bin;...
```

![image](https://qiita-image-store.s3.amazonaws.com/0/68277/b640a726-6745-573a-8080-fcdd2f62d48c.png)
第1回　xamarin勉強会 in こねくりや


##まず何を学ぶ
* クロスプラットフォーム開発で楽したい。
* 画面のコーディングも一回で済ませたい。iOSとアンドロイドそれぞれやりたくない。
* なら、xamarin.forms一択だね。
* 画面周りはせっかくなのでxaml使いましょ。
* イベントドリブンで作っちゃってもいいけど、せっかくなのでmvvmで作りましょう。

 
##教材は
* かずきさんが作ってくれてます。感謝。
* http://blog.okazuki.jp/entry/2017/01/11/083800
* xamarin sampleをとりあえず、片っ端から試してみる。
* https://developer.xamarin.com/samples/xamarin-forms/all/



##とりあえずの目標
* ビットコインAPIつかって、相場情報表示。
* ビットコインアラートアプリ
* ビットコインチャート表示アプリ

##その他
* 開発用にアンドロイド端末買ったよ。
https://twitter.com/pipipipepepe/status/817668002027950080

* こねくりや
https://www.facebook.com/conekuriya/
毎週木曜日19:00〜22:00くらいまで、モクモクやってます。



￼