OmniAICreator/Qiita-1.07M huggingface dataset:
カテゴリ変数に負けずに python で機械学習する(ダミー変数化)


いつも同じことを調べているので、
これを機にメモにしておきました。

ここでは実際に python でcsv を読み込み、
ダミー変数化などの前処理を行ってSVMで予測を行いました。

# モチベ
データを機械学習に突っ込む際に、データにカテゴリ変数（例：性別、出身国）が入っている場合があります。
そのときただの数値（例：日本なら1、アメリカなら2）に変えた場合、意図しない意味をデータに
与えてしまうので、学習がうまくいかないことがあります。

ここではダミー変数という方法でカテゴリ変数を数値に変換して対処します。

## ダミー変数とは
例えば、以下のようなデータを想定します。

* ここでは国という一列だけ持っている
* 国は全部で `{日本, アメリカ, 中国}` しかない
* 元のデータでは `国` という列があって、その中に `{日本, アメリカ, 中国}` のいずれかが
格納されているとする

ダミー変数化では、`国` という列を、`国.日本, 国.アメリカ, 国.中国` という3つの列にして、
該当する値だけ `1` にして、その他を `0` とした形に変換します。

### ダミー変数化前データ例
| 国 |
|:----------:|
|日本|

### ダミー変数化後データ例
| 国.日本 | 国.アメリカ | 国.中国 |
|:----------:|:----------:|:----------:|
|1|0|0|


# 実装
## データの取得
今回は「Adult Income Data Set」という匿名化加工などの実験で用いられるデータを用いました。
おそらくググっても手に入りますが、今回は R で取得しました(python と言っているのに早速 R を使っているのは気にしないでください)。

また、このデータセットには `income(収入)` という項目があり、`large, small, NaN` の3つの値があります。
今回の実装では `NaN(欠損値)` に対し、`large or small` を予測したいとします。

そのため `NaN` が入っていない行を訓練データ、入っているデータを評価用データとしました。

```r
library('arules')
data("AdultUCI")
id <- 1:nrow(AdultUCI)
d <- data.frame(id, AdultUCI)
write.csv(d, "AdultDataSet.csv", quote = FALSE, fileEncoding = 'cp932', row.names = FALSE)
```

## ライブラリとcsvファイルの読み込み
```py3
import numpy as np
import pandas as pd
from sklearn import svm

df = pd.read_csv("AdultDataSet.csv", encoding='cp932', low_memory=False)
```

## 前処理（ダミー変数化も行う）
```py3
# 訓練ラベル
Y_train = df.copy()
Y_train['income'] = Y_train['income'].map({"large":1, "small":0})
Y_train = Y_train[Y_train['income'].notnull()]
Y_train = Y_train.iloc[:, 15].values #  income のみ

# カテゴリ変数のダミー変数作成
X = df.iloc[:, 0:15] #  income 以外
colnames_categorical = ['workclass', 'marital.status', 'occupation', 'relationship', 'race', 'sex', 'native.country']
X_dummy = pd.get_dummies(X[colnames_categorical], drop_first=True)

# ダミー変数の結合
X = pd.merge(X, X_dummy, left_index=True, right_index=True)

# 使わない、重複している列の削除
X = X.drop(colnames_categorical, axis=1)
X = X.drop(['id', 'education'], axis=1)

# income が NaN か否かで train と test を分ける
X_train = X[df['income'].notnull()].values
X_test  = X[df['income'].isnull()].values
```

## 学習と予測
```py3
# 学習
clf = svm.LinearSVC() #  学習が速いから。他には svm.SVC(kernel='rbf') 等がある
print('start!')
clf.fit(X_train, Y_train)
print('end!')

# 予測
Y_predict = clf.predict(X_test)
```

## 予測した結果の結合
```py3
# 予測した値を加える
df2 = df.copy()
df2.loc[df2['income'].isnull(), 'income'] = Y_predict
df2['income'] = df2['income'].map({1.:"large", 0.:"small", "small":"small", "large":"large"})
df2.head()
```

## 結果の確認
本来は予め正解ラベルがついているデータを分類して性能を評価するべきだと思いますが、
今回は欠損しているデータに対して予測したことと、趣旨はダミー変数化の適用ですので
とりあえず欠損値がなくなっていることを確認してみます。

```py3
# 学習前の income の集計値
count_before = df['income'].value_counts(dropna=False)
pd.DataFrame(count_before) #  print(count_before) でもよい
```

```py3
# 学習後の income の集計値
count_after = df2['income'].value_counts(dropna=False)
pd.DataFrame(count_after)
```

これで学習後に `NaN` が消えていればひとまずOKです。

## 結果の出力
```py3
df2.to_csv('AfterAdultDataSet.csv', index=False)
```

## さいごに
そこまで難しいことではないはずなのに、pandas の使い方とかscikit learn への
入力等で苦労した…悲しい…
C#(WPF)アプリのスタックサイズの変更方法

C++ではリンカーオプションでスタックサイズの指定ができた。
今回、C#アプリを開発していてスタックサイズを変更しないといけない状態になったので、調べてみた。

editbin.exeを使った方法を紹介する。

【editbin.exeの場所】※環境に応じて読み換えてください
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.10.25017\bin\HostX86\x86\editbin.exe

無い人は、インストール時に「C++ によるデスクトップ開発」をチェックして再インストール
そもそも、VisualStudioをインストールしていない人は、インストールしてください

【使い方】
"C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.10.25017\bin\HostX86\x86\editbin.exe" "targetApplication.exe" /STACK:4194304
4194304⇒4MB

---
スタックサイズが変更されたことの確認方法
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.10.25017\bin\HostX86\x86\dumpbin.exe

呼び方
"C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.10.25017\bin\HostX86\x86\dumpbin.exe" 
 /HEADERS "targetApplication.exe"
初級者が、TensorBoardで、MNISTのEmbedding Visualizationを表示 (ぐるぐる動かして見る)


![img1.jpeg](https://qiita-image-store.s3.amazonaws.com/0/189863/63347c57-3ffb-4c32-d16d-11e66894648c.jpeg)

多次元空間ベクトルを、3次元に射影してグルグルと自由自在に表示できそうな、TensorBoardのEmbedding Visualization、にトライしました。TensorFlowはインストール済みです。

###1. サンプルコード
TensorBoardのTutorialを読み進めましたが、そのものずばりのコードは書かれていないようです。
[TensorBoard: Embedding Visualization](https://www.tensorflow.org/get_started/embedding_viz)

そこでGitHubに、TutorialをベースにEmbedding関係を追記してくれているコードがありました。mnist_with_summaries.py　をダウンロードします。
https://github.com/normanheckscher/mnist-tensorboard-embeddings

MNISTのスプライト画像もダウンロード。
![mnist_10k_sprite.png]
(https://www.tensorflow.org/images/mnist_10k_sprite.png)
https://www.tensorflow.org/images/mnist_10k_sprite.png
下記 --data_dir 直下に、mnist_10k_sprite.png として保存します。


###2. 対応
mnist_with_summaries.py 末尾(247行と249行目)の、--data_dirと--log_dir部を、自分のtmpフォルダに書き換えます。

```
--data_dir = '/tmp/tensorflow/mnist/input_data'
--log_dir = '/tmp/tensorflow/logs/mnist_withsummaries'
```

また、--log_dir の直下に、/projector フォルダを作成しておきます。


###3. いざ実行

```
$python3 mnist_with_summaries.py
```

```
$tensorboard --logdir=/tmp/tensorflow/logs/mnist_withsummaries/projector
```

ブラウザでTensorBoardを起動 (http://0.0.0.0:6006 )し、右上のEmbeddingsを選択、トップ画面が表示されます。

---
1.5Lのペットボトル大の脳が、色々なことを認識。新皮質のニューロン数は20億らしいですが、有限のリソースで対応するために、情報コストの低減=次元数の縮約がポイントでは？と思い、トライしてみました。他の対象でもテストしてみたいです。
Slice、Mapの存在チェック

## Sliceの存在チェック

* Array/Sliceのlengthをチェックしなければならない

``` go
package main

import (
	"fmt"
)

func main() {
	row := []string{"1", "2", "3"}

	if len(row) >= 3 {
		fmt.Println(row[2])
	}

	if len(row) >= 4 {
		fmt.Println(row[3])
	}
}
```


## Mapの存在チェック

* MapのKeyを参照すると、2つめの返り値でそのKeyが存在しているかどうかのbool値を返すので、それをチェック

``` go
package main

import (
	"fmt"
)

func main() {
	m := map[string]int{"a": 1, "b": 2, "c": 3}
	
	if v, ok := m["a"]; ok {
		fmt.Println(v)
	}
	
	if v, ok := m["d"]; ok {
		fmt.Println(v)
	}	
}

```
Dockerを用いてLaravelの開発環境を1コマンドで構築

# はじめに
Laravelの開発環境を構築するには様々な方法があります。
その中で[Laradock](https://github.com/laradock/laradock)はdockerを用いて素早く構築できる有力な選択肢の一つです。
しかしそれでも数ステップの作業を行う必要があります。
そこでもっと簡単にできないかということで試行錯誤しましたのでご紹介します。

[shomatan/laravel-docker](https://github.com/shomatan/laravel-docker)

# 特徴
- 何と言っても1コマンドですぐ構築
- 必要なものは同梱してビルドしているので、ローカルでビルドする必要がありません
- 好きなバージョンで開発可能(現在5.1~5.5 LTSを用意しています)
- Alpine Linuxがベースなので軽量です
- cronエントリーを設定済みなのでタスクスケジュールの機能が使えます

# 使用方法
あらかじめDockerやdocker-composeのインストールが必要です。

## 起動
    docker-compose up -d

しばらくすると`http://localhost`でアクセス可能です。
`laravel`ディレクトリが作成されその中に全ソースが配置されています。
お好みのIDE等で開発できます。

## `artisan`コマンドについて
デフォルトで作成される`.env`にはDBホストとしてcomposeで同時に作成されるDBサーバーを指定しています。
そのため `php artisan migrate`等を行ってもホストから見える接続情報が異なるためエラーが出ます。
対処法としてdockerコンテナ内で作業を行います。

    docker exec -it laravel-app sh

もしくはコンテナ内に入らずコマンドを実行します

    docker exec -it laravel-app php artisan migrate

## 削除

    docker-compose kill
    docker-compose rm -f
    rm -rf laravel

# 各コンテナの構成について
## web
ベースにオフィシャルの[nginx](https://hub.docker.com/_/nginx/)イメージを使用し、gid uidともに1000の`www`ユーザーを作成しています。

## app
ベースにオフィシャルの[php](https://hub.docker.com/_/php/)イメージを使用し、gid uidともに1000の`www`ユーザーを作成しています。
web、app共に同一idのwwwユーザーを作成することで両コンテナからphp-fpm.sockの読み書きをできるようにしました。
その後にlaravelで必須のパッケージ群をインストールし、composerでLaravelプロジェクトを作成し `composer install`で依存するライブラリをインストールしておきます。
appコンテナ起動時に`docker-entrypoint.sh`で.envの設定やDBコンテナが立ち上がるまで待機する処理を実行します。

# 終わりに
今後redis等のコンテナも起動するように設定し、Laradockに近づけて行きたいと思います。
【FileMaker】条件付き値一覧の表示　階層深し編

以前、[条件付き値一覧の表示](http://qiita.com/tyuma/items/dd82037d4e382f3d0f57)という記事を書いたのですが、階層が深くなった場合はどうすればいいかをお問い合わせいただいたので、続編を書くことにしました。

もう２年半以上も経ってました。
FileMakerのバージョンも上がっていますね。
あの頃は、FM13かFM14くらいでしょうか。
とりあえずFM15でも開いたので、FM15で追加してみました。
（あの時削除しなかった過去の私に感謝）

実装自体は、そんなに難しくはありません。
ただ、ベタ書きの値一覧からすると、ファイルの内容を値一覧にすること自体が敷居が高いのだと思うので、まだ[条件付き値一覧の表示](http://qiita.com/tyuma/items/dd82037d4e382f3d0f57)を読んでいない方は、まずそちらから入ってみてください。

では、階層さらに深くなった場合の実装についてです。
まずは、動きを見てみましょう。

# 動き
前回は、メニューに
・タイプ（メニューを提供する区分け）
・項目（メニュー内容）
と分けていましたが、さらに、メニュー内容にオプションを追加してみました。

例えば、スープの種類にコンソメスープ、コーンスープなどなどがあります。
ディナータイムには複数のスープが選べますが、ランチタイムは限られた時間で数をこなさないとならないので、コンソメスープ一品のみの提供です。
ステーキは、ソースが選べますが、ソースなしで味わいたい人向けに、ソースなしというオプションもつけています。
<img width="654" alt="記事１.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/910cd3e0-225a-fb05-75b4-197df6e4bd6a.png">

実際にメニューを選ぶときには、こんな感じで表示されて、選択できます。
![記事3.png](https://qiita-image-store.s3.amazonaws.com/0/60538/54af0892-a049-769f-d9e8-c40ef24e62cf.png)


ちょっと項目がプルダウンで見えませんでしたが、ステーキのソースを選択しているところでした。
<img width="375" alt="記事２.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/29cbd280-ba61-177f-c348-6fc9426cde9e.png">
あ、チーズソースを選んだと思ったら、気が変わって和風ソースにしたみたいです。


では、実際に実装をしていきましょう。

# 実装

メニューテーブルと注文テーブルに、「オプション」を追加しています。
こちらは、メニューテーブルの「オプション」追加です。
<img width="409" alt="記事５.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/1322e5bb-15d3-48f5-ae5f-5f84d862b4af.png">

注文テーブルの「オプション」は、メニューから選択したオプションを保持するフィールドになります。
<img width="333" alt="記事６.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/00847a8e-2eed-eaeb-5d80-dd491f2b7e95.png">

オプションを選択する際の値一覧のリレーションは、「メニュー」テーブルのオカレンス「メニュー 2」において、「タイプ」と「項目」を繋げます。
<img width="732" alt="記事４.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/93304447-8bdb-efe8-5595-f71c9d816e0d.png">
なぜ、「項目」だけのリレーションではダメかというと、スープ項目は、ランチでもディナーでも提供されますが、
・ランチどきは「ランチタイム（タイプ）」の「コンソメスープ（オプション）」が出て欲しい
・ディナーどきは、「ディナータイム（タイプ）」の「コンソメスープ（オプション）」や「コーンスープ（オプション）」など、タイプごとに表示して欲しい
からです。

値一覧は、今までと同じように、フィールドの値を使用します。
<img width="914" alt="記事７.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/ba3357a1-bde9-7d77-9afb-443619d004b5.png">
このとき、メニューからの注文を保持する「注文」テーブルの「タイプ」と「項目」から値一覧を表示しますので、忘れずに「次のテーブルからの関連レコードの値を含める」部分に「注文」テーブルを指定してくださいね。


もっと階層が深くなったら、テーブルオカレンスを増やして、「タイプ」「項目」「オプション」までをリレーションして値一覧を作成します。
応用ができますね。

---
追記です。
[条件付き値一覧で選択した項目の別フィールドを取得する](https://qiita.com/tyuma/items/c17d8b7fb152974ba28f)を、公開しました。
こちらも参考にしてください。

では、FileMakerライフをお楽しみください。
Rustでは同じ名前の変数を別の型で再定義できるらしい->シャドーイングと言うらしい

Prashant N Mhatreさんによる[新しいプログラミング言語を学ぶための15のエクササイズ](http://www.articlecity.com/articles/computers_and_internet/article_2686.shtml)をRustでやっていますがその過程で気づいたことを書いています。
一応、Rustで新しいプログラミング言語を身につける15のエクササイズシリーズの一つです。

## 今回のテーマ

> swapping two variables,

## この課題……失敗しました！　とりあえずコード

```rust:main.rs
fn main() {
    let a: i64 = 50;
    let b: i64 = 15;
    let (a, b)  = swap0(a, b);
    println!("a: {}, b: {}", a, b);
}

// 一次変数を用意する方法。大体どんな型でも使える。
fn swap0(a: i64, b: i64) -> (i64, i64) {
    return (b, a)
}
```
なんの問題もなくSwapされたように見えます……が問題ありです。
曲者なのが、let (a, b)の部分で、ここでaとbを再定義しています。

### 例えば、以下のコード
```rust:main.rs
fn main() {
    let c: i64 = 50;
    let d: i64 = 15;
    let (c, d) = return_i32(c, d);
    println!("c: {}, d: {}", c, d);
}

fn return_i32(_: i64, _: i64) -> (i32, i32) {
    let int1: i32 = 67;
    let int2: i32 = 22;
    return (int1, int2)
}
```
このコードはちゃんとコンパイルを通って動きます。はじめcとdはi64型だったのに、最後はi32型になっています。

そこで気になって書いてみたのが下のコードです。

## 再定義の実験

```rust:main.rs
fn main() {
    let a: i64 = 300;
    println!("{}", a);
    let a: u16 = 20;
    println!("{}", a);
}
```

このコード、ちゃんとコンパイル通って動作します。
今まで私が触ってきた言語からすると不思議なのですが、Rustは同じ名前の変数の再定義ができるようです。

私が今まで触ってきた言語（go）からすると不思議な仕様だったのでなかなか興味深いです。型に対してなんでもありの動的言語は除くとして、このあたりの処理ってどう言うのが主流なんでしょうか？

## goで再定義しようとすると

```go:main.go
package main

import "fmt"

func main() {
	var a int64 = 30
	fmt.Println(a)
	var a string = "Hello, World!"
	fmt.Println(a)
}
```
ちなみにgoの場合はエラーが起こります。

## まとめ

* Rustでは変数を同名で再定義できる。
* Goではできないけど他がどうなってるかはよくわからない。

課題の方は、別のタプルを用意して、逐一変数c, dに代入すれば問題はないのですが、なんだか釈然としません。
WindowsとUbuntuのDual Boot環境にGPU(NVidia GeForce GTX1080)をインストール

表題の通りWindowsとUbuntu 16.04のDual Boot環境を作りつつ、GPU(NVidia GTX1080)を入れる際にかなり苦労しました。GTX1070でも同様。
ネットの情報をいろいろ試したのですが、殆どがnomodesetや.XAuthのパーミッションに話が終始していておりましたが、実はUEFIに鬼門があります。
普通にやるとログインループにはまります。（GNOMEでログインしても、強制的にまたログイン画面に戻る。）

Windows10がプレインストールされたドスパラのGalleria(ASUSのマザボ）をベースに話してます。

1. Windows上で、Shiftを押しながらメニュー>再起動をクリックし、UEFIのモード変更を選ぶ
2. BIOS起動時にDelかF2を押してBIOSメニューに入る
    3.  SecureBootをWindowsからOtherOS
    4.  FastBootをDisable
4. Ubuntuを起動。
5. ログイン画面でCTRL+ALT+F1でコマンドラインに入る
6. 以下の順番でnvidiaドライバをインストール

```bash
sudo service lightdm stop
sudo apt-get purge nvidia-*
sudo apt-get upgrade
sudo add-apt-repository ppa:xorg-edgers/ppa
sudo apt-get update
sudo apt-get install nvidia-375
sudo reboot
```

375か381とかは使っているGPUに合わせて最新のPROPバージョンを選んでください。
375のインストール中にUEFIのSecureBootの解除パスワードを入れられますが、ここでは8文字きっかり入れましょう。8文字未満だとバグにハマることがあります。

7.これで再起動したら、GNOMEの出力がGPUから高解像度で出力されて幸せになります。



もしもはまったら以下を試してみましょう。
- Ubuntuの起動選択時にeを押して、nomodesetを入れてから起動。lightdmや古いドライバとかが邪魔しているときに有効。
- インストール後の再起動後、PROGRAM MOKみたいなブルースクリーンが出るとアウト。ここで正しいパスワードを入れてもなぜかループにハマります。BIOSがOtherOSになっているか要確認。
DjangoのDetailViewをPDFで出力する(日本語対応)

DjangoでgenericのDetailViewを使って日本語PDF出力をする方法です。

template htmlからPDFを出力したいのでxhtml2pdfというライブラリを使用します。
python3ではdevバージョンしか動かないので気をつけてください。

```
pip3 install --pre xhtml2pdf
```

まず使いたい日本語フォントを用意します。
次にフォントを`<prj_name>/<prj_name>/static/fonts`に設置します。
設置したらsettings.pyにpathを通します。

```prj_name/prj_name/settings.py
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, '<prj_name>', 'static')
```

次にviewを書いていきます。
今回は例としてfoo_app(`<prj_name>/foos`)のモデル`Foo`のDetailViewをPDFとして出力します。
`generic.DetailView`を使い`render_to_response`の部分だけoverrideします。

```prj_name/foos/views.py
import io
import os
from django.conf import settings
from django.views import generic
from django.http import HttpResponse
from django.template.loader import get_template
from xhtml2pdf import pisa

class FooPDFView(generic.DetailView):
    model = Foo
    template_name = 'foos/pdf.html'

    def render_to_response(self, context):
        html = get_template(self.template_name).render(self.get_context_data())
        result = io.BytesIO()
        pdf = pisa.pisaDocument(
            io.BytesIO(html.encode('utf-8')),
            result,
            link_callback=link_callback,
            encoding='utf-8',
        )

        if not pdf.err:
            return HttpResponse(
                result.getvalue(),
                content_type='application/pdf'
            )

        return HttpResponse('<pre>%s</pre>' % escape(html))

def link_callback(uri, rel):
    sUrl = settings.STATIC_URL
    sRoot = settings.STATIC_ROOT
    path = os.path.join(sRoot, uri.replace(sUrl, ""))

    if not os.path.isfile(path):
        raise Exception(
            '%s must start with %s' % \
            (uri, sUrl)
        )

    return path
```

templateを書いていきます。
フォントを設定しないと日本語は予期している通りに表示されないので気をつけてください。

```prj_name/foos/templates/foos/pdf.html
<!DOCTYPE html>{% load static %}
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <style type="text/css">
    @font-face {
      font-family: "japanese";
      src: url("{% static 'fonts/<your_font>.ttf' %}");
    }
    @page {
      size: A4;
      font-family: "japanese";
    }
    html, body {
      font-family: "japanese";
    }
  </style>
</head>
<body>
  <div>
    名前 {{ object.name }}
  </div>
</body>
</html>
```

urlsを設定します。

```prj_name/foos/urls.py
app_name = 'foos'
urlpatterns = [
    url(r'^(?P<pk>[0-9]+)/pdf/$',views.FooPDFView.as_view(), name='foo-pdf'),
]
```

projectのurlsに通します。

```prj_name/prj_name/urls.py
urlpatterns = [
    url(r'^foos/', include('foos.urls')),
]
```

これで/foos/:foo_id/pdfにアクセスするとPDFが出力されると思います。
unityのGetKeyで指定するKeyCodeを見つける

GetKeyなどで指定するKeyCodeが英字キーボードになっているので@や:あたりを設定するのにいつも困る。対応表くらい公式で作るべきだろー、つーか、バグだろー。


```
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    void Update()
    {
        for (var i = 0; i < 999; ++i)
        {
            try
            {
                if (Input.GetKeyDown((KeyCode)i))
                {
                    Debug.Log(System.Enum.GetName(typeof(KeyCode), i));
                }
            }
            catch
            {
            }
        }
    }
}
```
Python vs Ruby 『ゼロから作るDeep Learning』 4章 損失関数 (loss function) の実装

## 概要

書籍『ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装』4章のコードを参考に、損失関数 (loss function) として2乗和誤差 (mean squared error) と交差エントロピー誤差 (cross entropy error) を Python と Ruby で実装する。

計算処理では外部ライブラリを利用する。Python では NumPy を、Ruby では Numo::NArray を使用する。

環境構築が必要な場合はこちらを参照。
→ [Python vs Ruby 『ゼロから作るDeep Learning』 1章 sin関数とcos関数のグラフ \- Qiita](http://qiita.com/niwasawa/items/6d9aba43f3cdba5ca725)

## 2乗和誤差 (mean squared error) と交差エントロピー誤差 (cross entropy error) の実装

### Python

```python
import numpy as np

# 2乗和誤差
def mean_squared_error(y, t):
  # ニューラルネットワークの出力と教師データの各要素の差の2乗、の総和
  return 0.5 * np.sum((y-t)**2)

# 交差エントロピー誤差
def cross_entropy_error(y, t):
  delta = 1e-7 # マイナス無限大を発生させないように微小な値を追加する
  return -np.sum(t * np.log(y + delta))

# テスト
t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0] # 正解が1, それ以外が0
y1 = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0] # 2の確率が最も高い場合(0.6)
y2 = [0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0] # 7の確率が最も高い場合(0.6)
print(mean_squared_error(np.array(y1), np.array(t)))
print(mean_squared_error(np.array(y2), np.array(t)))
print(cross_entropy_error(np.array(y1), np.array(t)))
print(cross_entropy_error(np.array(y2), np.array(t)))
```

### Ruby

```ruby
require 'numo/narray'

# 2乗和誤差
def mean_squared_error(y, t)
  # ニューラルネットワークの出力と教師データの各要素の差の2乗、の総和
  return 0.5 * ((y-t)**2).sum
end

# 交差エントロピー誤差
def cross_entropy_error(y, t)
  delta = 1e-7 # マイナス無限大を発生させないように微小な値を追加する
  return -(t * Numo::NMath.log(y + delta)).sum
end

# テスト
t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0] # 正解が1, それ以外が0
y1 = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0] # 2の確率が最も高い場合(0.6)
y2 = [0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0] # 7の確率が最も高い場合(0.6)
puts mean_squared_error(Numo::DFloat.asarray(y1), Numo::DFloat.asarray(t))
puts mean_squared_error(Numo::DFloat.asarray(y2), Numo::DFloat.asarray(t))
puts cross_entropy_error(Numo::DFloat.asarray(y1), Numo::DFloat.asarray(t))
puts cross_entropy_error(Numo::DFloat.asarray(y2), Numo::DFloat.asarray(t))
```

## 実行結果

### Python

```
0.0975
0.5975
0.510825457099
2.30258409299
```

### Ruby

```
0.09750000000000003
0.5974999999999999
0.510825457099338
2.302584092994546
```

## 参考資料

- Python vs Ruby 『ゼロから作るDeep Learning』 まとめ - Qiita http://qiita.com/niwasawa/items/b8191f13d6dafbc2fede
PHPで正規表現を使わずHTTPステータスコードを取得する

PHPでHTTPステータスコードを取得しようとググったところ、
正規表現で抜き出しているのが多くて、他にやり方がないか調べたところ以下のやり方で取得できた。

```php
$url = 'http://example.co.jp';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_exec($ch);
$http_status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE));
curl_close($ch);
```

これで`$http_status_code`に値が格納される。

これだけで6行もかかるなぁ。
もっといいやり方ある気がするけど…
お名前.comで取得したドメインをAmazon EC2に紐付ける

# 概要
お名前.comで取得したドメインをAmazon EC2で運用する場合の方法です。
手順としては、EC2のHost ZoneでIPを固定してNSを設定、その値をお名前に設定という流れになります。
一度やってしまえばなんてことないのですが、初めてだと色々とわからないことがあるかもしれません。
# EC2の設定

## Hosted Zoneの作成
### Elastic IP
EC2は、デフォルトはPublic IPのため、時間とともに変わる可能性があります。
そのため、Elastic IPを設定する必要があります。

### Elastic IPの設定
Elastic IPをクリックし、「割り当て」をクリックします。
「Elastic IP」を割り当てたら、「プライベート IP アドレス」を割り当てます。
Route 53の設定で使うので、「Elastic IP」をメモします。

## Route 53
### ネームサーバーを設定
マネージメントコンソールから「Route 53」をクリックします。
続いて「DNS management」をクリックします。
左メニューの「Hosted zones」から「Create Hosted zones」をクリックします。
画面が切り替わったら上の「Create Hosted zones」をクリックします。

- Domain Name: 取得したドメイン名
- Comment: 空
- Type: Public Hosted Zone

NSレコードとSOAレコードが生成されるます。
お名前の設定で使うので、NSの4つをメモします。

### Record Setの設定
Route 53の画面からCreate Record Setをクリックします。
メモしたElastic IPをペーストし「Save Record Set」をクリックします。

- Name: 空
- Type: A - IPv4 address
- TTL (Seconds):300
- value:Elastic IP

# お名前.comの設定
お名前にログインし、「ドメイン設定」→「ネームサーバーの設定」→「ネームサーバーの変更」をクリックします。
「他のネームサーバーを利用」→「ネームサーバー情報を入力」をクリックします。
メモしたネームサーバーの情報を入力します。
※終わりが「.」の場合は「.」は削除します。

# 最終確認
digコマンドでチェックします。
digはDNS（ネームサーバ）の情報を出すコマンドです。
ここにEC2のアドレスが出ていれば72時間以内に反映されます。

```
$ dig hogehoge.com
```

# 参考情報

## 用語説明
|用語  |説明  |
|---|---|
|Elastic IP  |アカウントに割り当てることができるパブリック IP アドレス  |
|プライベート IP  |プライベート IP アドレスは、インターネットから到達できない IP アドレス  |

## 参考サイト
Rustに挑戦！新しいプログラミング言語を学ぶ15のエクササイズを解いてみた：2-1フィボナッチ数列

Rustに挑戦するために「[新しいプログラミング言語を学ぶための15のエクササイズ](http://www.articlecity.com/articles/computers_and_internet/article_2686.shtml)」に取り組んでいきます。挑戦内容の[邦訳Qiita記事](http://qiita.com/shozaburo/items/b71c9f6645faf64587df)を見つけました。

## 今回の課題

フィボナッチ数列を出力！

エクササイズとしてよくみるフィボナッチ数列に取り組みます。今回は、50番目までの数としました。

## コード

```rust:main.rs
// 表示桁数の問題があるので50回で止めます
fn main() {
    let mut a: i64 = 1;
    println!("{}", a);
    let mut b: i64 = 1;
    println!("{}", b);
    for _ in 2..50 {
        println!("{}", a + b);
        let a_old = a;
        a = b;
        b = a_old + b;
    }
}
```

コメントでも書きましたが、50番目までとしています。

## ポイント

フィボナッチ数列のポイントは、いくつかあります。
* 再帰を用いてはいけない
* 型に注意（i32では50回より前に上限に達する）
* temporaryな変数を用意した
* 所有権について

### ポイント解説：再帰

一般的な再帰で解くと計算量が膨大になって凄まじい時間がかかります。対処法は色々ありますが、今回は愚直に足し算しました。

### ポイント解説：型

i32の上限は20億くらいなので、i32だと50番目に達する前に上限を超えます。

### ポイント解説：temporaryな変数a_oldについて

今回はtemporaryな変数a_oldを用意しました。フィボナッチ数列をどう書くかは言語ごとに変わるためこれで正しいのかはよくわかっていません。
Go言語なんかはかなりシンプルに書けますね。

### ポイント解説：所有権について

Rustの習得で難しそうな所有権ですが、i64はプリミティブ型なので、所有権の問題は発生しません。

## まとめ

フィボナッチ一つとっても学ぶことは多い。
AtoMパッケージおすすめ一覧

AtoMはGithub社開発のオープンソースエディタです。
無料だし、プラグイン頼りな分ちょっとパフォーマンスは落ちるけど、個人的には世話が焼けて好き。え。
とりあえず入れているものの中で使えるものを列挙。
他にもオススメあったら教えてください:relaxed:
随時追加します。

# 基本のやつ
## [atom-beautify](https://atom.io/packages/atom-beautify)
たいていの言語の入力補完、コード整形をしてくれるもの。
Beautify HTML, CSS, JavaScript, PHP, Python, Ruby, Java, C, C++, C#, Objective-C, CoffeeScript, TypeScript, Coldfusion, SQL, などなど。
<kbd>Ctrl</kbd> + <kbd>alt</kbd> + <kbd>b</kbd>　でスパッとコード整形してくれます。

## [markdown-pdf](https://atom.io/packages/markdown-pdf)
マークダウンのファイルを一発でPDF保存できるもの。
ショートカットは<kbd>Shift</kbd> + <kbd>Ctrl</kbd> + <kbd>c</kbd>　

## [linter](https://atom.io/packages/linter)
各言語の"linter-XXX"パッケージを入れていて初めて生きるやつ。
linterでコンパイル＋エラー・ワーニングチェックまでやってくれたものを
エディタの下部に可視化してくれるもの。
私はlinter-rubocopしか入れてなかったな。



# フロントエンド系
## [atom-html-preview](https://atom.io/packages/atom-html-preview)
<kbd>Shift</kbd> + <kbd>Ctrl</kbd> + <kbd>ｈ</kbd>　で左半分にhtmlファイルをプレビュしてくれる。
ブラウザ開かなくても簡単な確認ならできる。

## [atom-typescript](https://atom.io/packages/atom-typescript)
atomでTypescript書くなら、入れなきゃなプラグイン。
コンパイルのタイミングとエラー方法を設定できる。

## [less-than-slash](https://atom.io/packages/less-than-slash)
htmlと閉じタグを `</`まで記述したら入力補完してくれる。地味に便利。

## [tag](https://atom.io/packages/tag)
<kbd>Alt</kbd> + <kbd>Cmd</kbd>で閉じてないタグをポンポン閉じれちゃう。
less-than-slash要らない説。

# Ruby on rails系
## [linter-rubocop](https://atom.io/packages/linter-rubocop)
プロジェクトでrubocopを採用してたので、入れただけ・・・
上記のlinterでエラーを可視化。

## [ruby-block](https://atom.io/packages/ruby-block)
`end`, `elsif`, `else`, `when` ,`rescue`, `ensure`　にカーソルがある時に、
rubyのblockをハイライトしてくれる。
よくendの数で迷子になる私には絶対必要（の割に入れたのは最近）。


# その他楽しくなる系
## [color-picker](https://atom.io/packages/color-picker)
<kbd>Cmd</kbd> + <kbd>Shift</kbd> + <kbd>ｃ</kbd>　でカラーピッカーが現れる。

## [file-icons](https://atom.io/packages/file-icons)
ファイルアイコンが、拡張子によって楽しい感じになります。
フレームワーク使ってるといっろんなファイルがごちゃごちゃするからいいかも？！


## [pigments](https://atom.io/packages/pigments)
カラーコードをその色でエディタ上でハイライトしてくれる。いちいち確認しなくていいから◎
RAB,RGBA,HSL,HSLAも対応。
SharePoint Client Object Model で現在のページがリストのビューページかフォームページの場合に処理を行うコード

```javascript

function execHoge4View() {
	alert('This is ListView page!');
}
function execHoge4Form() {
	alert('This is ListForm page!');
}


(function(func4View, func4Form){
	if(_spPageContextInfo.listId === null || _spPageContextInfo.listId === ""){
		// リストコンテキスト外のため処理終了
		return;
	}

	// コンテキスト取得
	var custCtx = SP.ClientContext.get_current();

	// リストコンテキスト内のページ（ビュー、フォーム等）の場合に現在のリストを取得
	var custList = custCtx.get_web().get_lists().getById(_spPageContextInfo.pageListId);

	// リストビューコレクション オブジェクトの取得指示
	var custViews = custList.get_views();

	// リストビューコレクション オブジェクト取得予約
	custCtx.load(custViews);

	// リストフォームコレクション オブジェクトの取得指示
	var custForms = custList.get_forms();

	// リストフォームコレクション オブジェクト取得予約
	custCtx.load(custForms);

	// サーバーへのクエリー実行（ここまでのコンテキストに含まれる指示予約を送信）
	custCtx.executeQueryAsync(
		function(sender, args) { // クエリー実行時コールバック処理
			var currentUrlPath = decodeURIComponent(location.pathname).toLowerCase();
			// console.log(currentUrlPath);

			// すべてのリストビューの内容を取得
			// console.log(custViews.get_count());
			var listViewEnumerator = custViews.getEnumerator();
			while (listViewEnumerator.moveNext()) {
				// 各ビューを調査
				var oView = listViewEnumerator.get_current();

				// console.log(String.format( "Title:{0}, ServerRelativeUrl:{1}, ID:{2}",
				// 	oView.get_title(), oView.get_serverRelativeUrl(), oView.get_id() ));

				if( currentUrlPath == oView.get_serverRelativeUrl().toLowerCase() ) {
					// 現在のページがリストビューだった場合
					func4View();
					break;
				}

			}

			// すべてのフォームの内容を取得
			// console.log(custForms.get_count());
			var listFormEnumerator = custForms.getEnumerator();
			while (listFormEnumerator.moveNext()) {
				// 各ビューを調査
				var oForm = listFormEnumerator.get_current();

				// console.log(String.format( "FormType:{0}, ServerRelativeUrl:{1}, ID:{2}",
				// 	oForm.get_formType(), oForm.get_serverRelativeUrl(), oForm.get_id() ));

				if( currentUrlPath == oForm.get_serverRelativeUrl().toLowerCase() ) {
					// 現在のページがリストフォームだった場合
					func4Form();
					break;
				}

			}
		},
		function(sender, args) { // クエリー失敗時コールバック処理
			console.log('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
		}
	);
})(execHoge4View, execHoge4Form);
UTF-8 テキストファイルを読み込む

```js:read_utf8_example.js
function app_read(handle, scpt='') {
	let a = Application.currentApplication()
	a.includeStandardAdditions = true
	return a.runScript(`on run argv
		read (item 1 of argv) ${scpt}
	end`, {in:'AppleScript', withParameters:handle})
}

app = Application.currentApplication()
app.includeStandardAdditions = true

p = '/Users/uchcode/Desktop/example.txt'
h = app.openForAccess(p)
r = app_read(h,'as «class utf8»')
app.closeAccess(p)

console.log(r)
```

macOS Sierra にて動作確認。以前は runScript のオプション `withParameters` を渡して実行すると原因不明のエラーが発生していた。
AWS情報源リスト

#AWSのキャッチアップに参考にしているサイトのまとめです

##技術ブログ
#####クラスメソッド
http://dev.classmethod.jp/category/cloud/aws/

#####Cloudpack
https://cloudpack.media/tech

#####サーバーワークス
http://blog.serverworks.co.jp/tech/

##公式ブログ

#####サービスの発表(英語)の翻訳など
https://aws.amazon.com/jp/blogs/news/

#####ソリューションアーキテクト視点
http://aws.typepad.com/sajp/

#####サードパーティ製品目線
http://aws.typepad.com/aws_partner_sa/

##その他

##### AWS活用資料集
https://aws.amazon.com/jp/aws-jp-introduction/
wcで行カウントしようとしたら0だった

WindowsのExcelで作成したCSVファイルをMACのExcelで加工し、
Ubuntuサーバで処理している最中のこと。

```console
$ wc -l tmp/input20170710.csv
0 tmp/input20170710.csv
```
3万行以上あるはずなのに`wc -l`の結果が0になってしまった。
CRLFはカウントされないのではないかと推測して検索すると…。
`grep -c`を使うと良いらしいという記事を発見。
> wc -lで行数カウントするとなんか1行少なくなった。
> どうにも改行コードとかそもそも改行コードしか数えないとか色々あるらしい。
> 微妙に気づきにくい。調べてたらgrep -cのほうが安定してるらしいのでこちらでやることに。
> http://asionm.hatenablog.com/entry/2013/12/02/130708

早速試してみるが…。

```console
$ grep -c '' tmp/input20170710.csv
1
```
1になってしまった。

落ち着いて現状を整理してみる。
まずはファイルの情報。

```console
$ file tmp/input20170710.csv
tmp/input20170710.csv: ASCII text, with CR line terminators
```
`CRLF`だと思っていたが`CR`だったようだ。
`LF`が無いので`grep`の処理では1行として認識されるのかな。
`grep -c`はヒット数ではなくヒットした行数なので致し方ないということか。
大人しく`sed`するとしましょう。

```console
$ sed "s/\r/\n/g" tmp/input20170710.csv | wc -l
32396
```
できました。

# おまけ
ちなみに`\r`は`less`などで見ると`^M`（コピペ不可）が表示されますが、
コンソール上で`ctrl+V`, `ctrl+M`の順番に押すと入力できました。

なお、改行コードが`CRLF`の場合は`wc -l`でも`grep -c`でもカウントされました。

```console
$ sed "s/\r/\r\n/g" tmp/input20170710.csv | wc -l
32396
$ sed "s/\r/\r\n/g" tmp/input20170710.csv | grep -c ''
32396
```

# バージョン情報

```
Ubuntu 16.04.2
wc (GNU coreutils) 8.25
grep (GNU grep) 2.25
sed (GNU sed) 4.2.2
```
Vagrantでホストとの時刻同期を止める

Vagrantを開発環境として使っていてテストなどで時間を過去に設定したい時、以下のコマンドを実行することでホストとの時刻同期を止めることができます。

```
$ date
Tue Jul 11 01:39:04 UTC 2017
$ sudo service vboxadd-service stop
```

その後はdateコマンドで任意の時刻を設定します。

```
$ sudo date -s "2017/07/02 01:40:00"
$ date
Sun Jul  2 01:40:02 UTC 2017
```

テストが終わったら同期するよう戻します。

```
$ sudo service vboxadd-service start
$ date
Tue Jul 11 01:50:04 UTC 2017
```
phpで長い文字列順にソートする

```
<?php
$words = [
	'aaaaaaa',
	'bb',
	'ccc',
	'ddddd',
	'e',
];

usort($words, function($a, $b) { return strlen($a) <= strlen($b); });

var_dump($words);
```

実行結果
```
array(5) {
  [0] =>
  string(7) "aaaaaaa"
  [1] =>
  string(5) "ddddd"
  [2] =>
  string(3) "ccc"
  [3] =>
  string(2) "bb"
  [4] =>
  string(1) "e"
}
```
Python PandasでJSONファイルをCSVファイルに変換する方法

データ分析の仕事をしている時に容量のでかいJSONファイルをCSVに変換しないといけないことがあり、色々と調べてみたけど簡単に変換できる方法がないな～と思ってたらPandasが3行で解決してくれたのでメモ。
##Python PandasでJSON→CSV変換

```python:changer.py
#Pandasをインポート
import pandas as pd

#変換したいJSONファイルを読み込む
df = pd.read_json("hogehoge.json")

#CSVに変換して任意のファイル名で保存
df.to_csv("hogehoge.csv")

```

これだけで終わり。Pandasほんと便利。
Windows | .NET Framework > link > インストールされている.NET Framework のバージョン確認

```txt:動作環境
Windows 8.1 Pro (64bit)
```

あるWindows PC上でどのバージョンの.NET Frameworkがインストールされているかを確認する方法。

以下を見つけた。
http://www.askvg.com/how-to-check-which-version-of-microsoft-net-framework-is-installed-in-windows/

```
%windir%\Microsoft.NET\Framework\
```

エクスプローラで上記を開くとバージョンごとのフォルダが見つかる。

~~PowerShellやレジストリを確認するよりは簡単かもしれない。~~

v4.6.2がインストールされている場合でも`v4.0.30319`のようなフォルダ名なので、minor versionやrevisionも知りたい場合にはこの方法は有効ではなさそう。

~~コマンドプロンプトの方法もあるが、コマンドプロンプトでは「貼り付け」方法の説明が必要になる点がいまいち。~~

### batファイル

記事を元に、以下の方法にしてみた。

```checkDotNetVer.bat
wmic /namespace:\\root\cimv2 path win32_product where "name like '%%.NET%%'" get version
pause
```

- Window 7
  - ダブルクリックするとバージョンが表示される
- Windows 8.1 (64bit)
  - 「利用できるインスタンスはありません」エラー
- Windows 10 (64bit)
  - 「利用できるインスタンスはありません」エラー
  
### 検索用キーワード
(追記 2018-11-12)

- WMI 
- Windows Management Instrumentation
[checkio] Roman Numerals

お題は引数として与えられるアラビア表記の数値を、ローマ表記の数値に直すというもの。
例)
89 →　LXXXIX
290 → CCXC

今回は無念としか言いようのないコードが出来上がった・・・！！

###自分の回答
```js
function romanNumerals(number) {
    
    //variables
    let answer = "";
    let bsNum = [1000, 100, 10, 1];
    let count = 0;
    
    for (let i of bsNum) {
        count = 0;
        while (number>=i) {
            number -= i;
            count += 1;
        }
        if (count) {
            romanMaker(i,count);
        }
    }
    
    //identifier
    function romanMaker(num1, num2) {
        let a="", b="", c="";
        switch (num1) {
            case 1000:
            a = "M";
            break;
            
            case 100:
            a = "C";
            b = "D";
            c = "M";
            break;
            
            case 10:
            a = "X";
            b = "L";
            c = "C";
            break;
            
            case 1:
            a = "I";
            b = "V";
            c = "X";
            break;
        }
        switch (num2) {
            case 1:
            answer += a;
            break;
            
            case 2:
            answer += a+a;
            break;
            
            case 3:
            answer += a+a+a;
            break;
            
            case 4:
            answer += a+b;
            break;
            
            case 5:
            answer += b;
            break;
            
            case 6:
            answer += b+a;
            break;
            
            case 7:
            answer += b+a+a;
            break;
            
            case 8:
            answer += b+a+a+a;
            break;
            
            case 9:
            answer += a+c;
            break;
        }
    }
    return answer;
}
```
これはひどい。でもこれしか浮かばなかった。4とか9のケースが曲者。

###すごいかいとう

```js
function romanNumerals(number) {
    var out = ""
    var units = [[1000,'M'], [900,'CM'], [500,'D'], [400,'CD'], [100,'C'], [90,'XC'],  [50,'L'],  [40,'XL'],  [10,'X'],  [9,'IX'],  [5,'V'],  [4,'IV'],  [1,'I']]
    units.forEach(function(unit) {
        while(number >= unit[0]) {
            number -= unit[0]
            out += unit[1]
    }})
    return out
}
```
行数が圧倒的に少ない。でも結局ある程度パターンを表記しなきゃいけないことは変わらないのか。
3行目のunits変数で見なければいけない数値とそれのローマ表記の数値のペアを連想配列として定義。
4-8行ではまずforEachを使って、一つずつ配列を取り出し、値を引き算しつつ、リターンの文字列に対応するものを加えていく。スマート。

###学び

*switchの条件式とcaseについて*

- switchにてbreakを置き忘れると、caseに合致した箇所以降の処理をcaseに合致しているか関係なく行うという仕様らしい。

> break を置かなければ、スクリプトは基準を満たす case から実行され、その後の case も基準を満たすかに関係なく実行されます。
参考：[switch構文](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/switch) - MDN

以下で両方のlogが出力されてしまうのはそのため。最初は部分一致的な仕様かと思ったけど。

```js
switch (10) {
    case 10:
	console.log("10ですね");

    case 1:
	console.log("1やな");
}
//output
10ですね
1ですね
```

*Array.forEach()*

- Arrayの配列から一つずつ値を取り出して、callback関数を呼び出す。callbackの引数には取り出した処理中の要素と配列内でのインデックスを指定できる。

###反省
一応bsNumの部分はconstで定義できるので、その方がよかったかも。
gmail > ToDo リストに追加 > 新規タブで開いた時はリストに出てこない

```txt:動作環境
Google Chrome v. 59.0.3071.115（Official Build） （64 ビット）
Windows 8.1 Pro (64bit)
```

2017/07/11現在。

gmailでメールをTODOリストに追加しようとしたら、メニューに「ToDoリストに追加」が見つからない。

通常は「その他」のメニューとして「ToDoリストに追加」があるのだが、「新規タブで開く」とした場合にリストに出てこないようだ。

### ペインの中でメールを開いた場合
![2017-07-11_10h19_15.png](https://qiita-image-store.s3.amazonaws.com/0/32870/1adf15a1-07d9-d5ab-b58e-292c04040a14.png)

### 新規タブで開いた場合
![2017-07-11_10h22_45.png](https://qiita-image-store.s3.amazonaws.com/0/32870/060a3baf-e15c-0c95-23f3-eb2a443d97d6.png)
sedコマンドを使用してファイル内で指定した文字列間の行を抜き出す

##コマンド

```shell:sample.sh
$ cat filename | sed -ne '/FROM/,/TO/p'
```

##オプション説明

-e : 置換処理、行の削除・選択などを行うオプション
-n + フラグのp(''内の末尾に記述) : 出力を行うオプション

##動作環境

centos7.2

##その他

sedコマンドの使用例はこちらの記事に詳しく書かれています

http://qiita.com/hirohiro77/items/7fe2f68781c41777e507
s3のURLパターン

いつも忘れるのでメモ

以下東京リージョンの場合:

REST API
- http(s)://s3-ap-northeast-1.amazonaws.com/{バケット}/{パス}
- http(s)://{バケット}.s3-ap-northeast-1.amazonaws.com/{パス}

webhosting
- http(s)://{バケット}.s3-website-ap-northeast-1.amazonaws.com/{パス}

バケット名に"."が入っていると、ドメインにバケット名がつくパターンの場合s3標準のssl証明書が通らない(サブサブドメインになってしまうので)
→ webhosting機能とssl必須な場合はバケット命名を気をつけないといけない
LXDでコンテナ作成する時のコマンド（CentOS, Ubuntu, その他)

## CentOS
### CentOS 7
```
# lxc launch -c security.privileged=true images:centos/7/amd64 <コンテナ名>
```

### CentOS 6
```
# lxc launch images:centos/6/amd64 <コンテナ名>
```

## Ubuntu
### Ubuntu 16.04 LTS
```
# lxc launch ubuntu:16.04 <コンテナ名>
```

### Ubuntu 14.04 LTS
```
# lxc launch ubuntu:14.04 <コンテナ名>
```

### Ubuntu 12.04 LTS
```
# lxc launch ubuntu:12.04 <コンテナ名>
```

## その他のディストリビューションイメージ

上記のほか、以下のページに一覧されているイメージを利用することができます。
https://uk.images.linuxcontainers.org/

以下のコマンドおよびオプションを実行することで、指定されたディストリビューションのコンテナを作成することができます。

```
# lxc launch images:<Distribution>/<Release>/<Architecture>
```
flask を uWSGI と Nginx でデプロイする

参考にしたページ
[How To Serve Flask Applications with uWSGI and Nginx on Ubuntu 16.04](https://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-uwsgi-and-nginx-on-ubuntu-16-04)

Google Colud の "Debian GNU/Linux 9 (stretch)" でデプロイしました。

実行した結果

![gcloud_jul11.png](https://qiita-image-store.s3.amazonaws.com/0/179446/a682c15e-3a8f-66c6-6ab8-93dc43638e1c.png)

前提となるソフトのインストール

```bash
sudo apt install nginx-full
sudo apt install python3-pip python3-dev
sudo apt install virtualenv
```

python を、python3 にする

```bash
sudo rm /usr/bin/python
sudo ln -s /usr/bin/python3 /usr/bin/python
```
python のバージョンの確認

```bash
python --version
```

virtualenv の作成

```bash
mkdir ~/myproject
cd ~/myproject
virtualenv -p python3 myprojectenv
source myprojectenv/bin/activate
```

この時点での画面の表示

![myproject_jul1101.png](https://qiita-image-store.s3.amazonaws.com/0/179446/6f008247-e63f-f43e-9a68-635e607e5882.png)

```bash
pip install uwsgi flask
```

flask のプログラムを作成します。

```py3:myproject.py
# -*- coding: utf-8 -*-
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    str_out = "<h1 style='color:blue'>Hello There!</h1>"
    str_out += "こんにちは。<p />"
    str_out += "Jul/11/2017<br />"
    str_out += "AM 08:54<br />"
    return str_out

if __name__ == "__main__":
    app.run(host='0.0.0.0')
```

プログラムが正常に動くか確認

```bash
python myproject.py
```

クライアントで確認

```bash
curl http://localhost:5000
```

uwsgi を使う用意

```py3:wsgi.py
# -*- coding: utf-8 -*-
from myproject import app

if __name__ == "__main__":
    app.run()
```

uwsgi を動かす

```bash
uwsgi --socket 0.0.0.0:5000 --protocol=http -w wsgi:app
```

クライアントで確認

```bash
curl http://localhost:5000
```

virtualenv から出る

```bash
deactivate
```

systemd の用意

```text:myproject.ini
[uwsgi]
module = wsgi:app

master = true
processes = 5

socket = myproject.sock
chmod-socket = 660
vacuum = true

die-on-term = true
```

```text:/etc/systemd/system/myproject.service
[Unit]
Description=uWSGI instance to serve myproject
After=network.target

[Service]
User=uchida
Group=www-data
WorkingDirectory=/home/uchida/myproject
Environment="PATH=/home/uchida/myproject/myprojectenv/bin"
ExecStart=/home/uchida/myproject/myprojectenv/bin/uwsgi --ini myproject.ini

[Install]
WantedBy=multi-user.target
```

サービスの起動

```bash
sudo systemctl start myproject
sudo systemctl enable myproject
```

Nginx の設定

```text:/etc/nginx/sites-available/myproject
server {
    listen 80;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:/home/uchida/myproject/myproject.sock;
    }
}
```

```bash
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled
sudo rm -f /etc/nginx/sites-enabled/default
```

Nginx の設定が正しいか確認

```bash
sudo nginx -t
```

Nginx の再起動

```bash
sudo systemctl restart nginx
```
Ubuntuでのディストリビューション確認


# Ubuntuでディストリビューションのバージョンを確認するコマンド

```shell-session
$ cat /etc/lsb-release
```

実行例

```shell-session
ubuntu@rails-dev-box:/etc/apt$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.10
DISTRIB_CODENAME=yakkety
DISTRIB_DESCRIPTION="Ubuntu 16.10"
```
pycharmでローカル変数の型の入力補完を効かせる


こんにちはsekitakaです。
何度か忘れてググっているのでPycharmのローカル変数の型の入力補完を効かせる方法をメモしておきます。

変数宣言(代入)のコメントで`type:`に続いて型を指定することで入力補完が効くようになります。

```python
s = None # type: str
```

こんな感じで変数`s`に`str`型の入力補完が使えるようになります。

![pycharm_hinting.jpg](https://qiita-image-store.s3.amazonaws.com/0/18273/df4a9448-f1d5-394c-0d6b-dc27f2fa5a53.jpeg "pycharm_hinting.jpg")

他にも関数の入力・出力や色々な補完を有効にできます。
詳しくは[公式ドキュメント](https://www.jetbrains.com/help/pycharm/type-hinting-in-pycharm.html)に説明があります。
ワタシはtype hintingという言葉がなかなか出てこなくて、このページ探すのにちょっと時間かかってしまいました。
ChainerでLSTM/GRU/RNNの出力の最後のベクトルを取り出す

自然言語処理において文(sentence)を単方向LSTM/GRUに入力して最後のベクトルを取り出してsentence vectorを文書分類などに使いたい時があります。

そこでNStepGRUに入力して, 最後のベクトルを得るコードを書いてみましょう。

2017.7.12 追記
※個人的に任意のベクトルを取ってくるときに下記のようにF.embed_idを使うのが便利だと思うのですが、LSTM, GRUの場合は返り値として最後のベクトルは取れるようになっています。
詳しくは
http://qiita.com/aonotas/items/8e38693fb517e4e90535#hy
を御覧ください。失礼しました。

# コード
```
class SentenceEncoderGRU(chainer.Chain):

    def __init__(self, n_vocab, emb_dim, hidden_dim, use_dropout):
        super(SentenceEncoderGRU, self).__init__(
            word_embed=L.EmbedID(n_vocab, emb_dim, ignore_label=-1),
            gru=L.NStepGRU(n_layers=1, in_size=emb_dim,
                           out_size=hidden_dim, dropout=use_dropout)
        )
        self.use_dropout = use_dropout

    def __call__(self, x_data):
        batchsize = len(x_data)
        xp = self.xp
        hx = None
        xs = []
        lengths = []
        for i, x in enumerate(x_data):
            x = Variable(x)
            x = self.word_embed(x)
            x = F.dropout(x, ratio=self.use_dropout)
            xs.append(x)
            lengths.append(len(x))
        # GRU
        _hy, ys = self.gru(hx=hx, xs=xs)

        #######################################################
        ## Extract Last Vector　最後のベクトルを取り出す
        ## 例：　
        ##    x_data = [[0, 1, 2, 3], [4, 5, 6], [7, 8]]の時
        ##    lengthsは[4, 3, 2]というリストになる
        ##    xp.cumsum(lengths)は [4, 7, 9]　というArrayを返す
        ##    last_idxは　[3, 6, 8] というインデックスになる
        #######################################################
        last_idx = xp.cumsum(lengths).astype(xp.int32) - 1 

        #######################################################
        ##    ysは [(4, 400), (3, 400), (2, 400)] のshapeのListのVariable
        ##    F.concat(ys, axis=0) は   (9, 400) のshapeに変換する
        ##    F.embed_idで最後のインデックスを取り出す
        #######################################################
        last_vecs = F.embed_id(last_idx, F.concat(ys, axis=0))
        last_vecs = F.dropout(last_vecs, ratio=self.use_dropout)
        return last_vecs

```

# 実行
```
enc = SentenceEncoderGRU(5000, 100, 100, 0.33)
x_data = [[0, 1, 2, 3], [4, 5, 6], [7, 8]] # 可変長データ (4, 3, 2)の長さのデータとする
x_data = [np.array(x, dtype=np.int32) for x in x_data] # numpyに変換する

vec = enc(x_data)

print(vec.shape) # (3, 100)のベクトルが返ってくる

```



# 解説

- 入力データの長さをlengthsとして計算しておく
- xp.cumsum(lengths)で累積和を計算しておく。これがベクトルの最後のインデックスを示す。
- F.embed_idで行列中の該当するインデックスのベクトルを取り出す



質問や間違い訂正などは @aonotas までお願いします。
プログラマが覚えておいしいFlexbox

# これなに

だいぶ前に社内発表した資料です。

# Flexboxとは

* * *

# 柔軟なレイアウトシステム

* * *

# HTMLのレイアウト

* 古くはTable Layout
    * CSSがまともに動いてない時代があった
    * ガラケー
* `position: fixed`
* Float
    * `<br clear="all">`による回り込みの解除
    * clearfix
    * %指定によるFluid / Grid実装
* `display: table-cell`
    * 合法的に使えるTable Layout
* translate

* * *

# まさに群雄割拠

* いろんなやり方があった
* どれも機能的に足りておらず一つだけ覚えてもだめだった
* 無理くりな手法も多く、後ろ髪を引かれる思いで実装してた

* * *

# 全てをレイアウトを過去にするFlexible Box Layout Module (個人的な感覚)

* * *

# 震えるがいい

* * *

# Flexboxの考え方

* 直接の子要素に影響を及ぼす
    * 親要素に影響を受けるpositonやfloatとは逆

* * *

# レイアウト定義

* 並び
    * 方向
    * 順序
* 位置
    * 縦横方向
    * 均等割り付け
* サイジング
    * 固定
    * フレシキブル

* * *

# サンプル

https://codepen.io/8845musign/pen/awQamg

* * *

# 今日覚えて帰ってもらいたい一つの使い道

* * *

# 中央配置のレイアウト

* * *

`.wrap` 内の `item` を左右及び垂直中央に配置

https://codepen.io/8845musign/pen/RgqZMV

* * *

```html
<div class="wrap">
  <div class="item">item</div>
</div>
```

```css
.wrap {
  display: flex;
  align-items: center;
  justify-content: center;
}

.item {
  width: 200px;
  height: 200px;
}

```

* * *

# 解説

* * *

## flex-direction

レイアウトの方向を決める、デフォルトは `row` （水平方向に左から右）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/73240/d3167aec-c74e-3b72-e63a-fbfea88d0214.png)

* * *

## justify-content

`flex-direction`　で決めた軸に、子要素をどう配置するか

![image.png](https://qiita-image-store.s3.amazonaws.com/0/73240/f2fc681c-b624-7ad7-8e46-70d809ac9463.png)

* * *

## align-items

`flex-direction`　と直交する軸に、子要素をどう配置するか

![image.png](https://qiita-image-store.s3.amazonaws.com/0/73240/00758569-8654-58a2-6570-367d1d9f5699.png)

* * *

# つまるところ垂直中央

![image.png](https://qiita-image-store.s3.amazonaws.com/0/73240/4e37fd11-76e9-94cb-7db6-eeb9a05f4c75.png)

* * *

* 親要素がレイアウト情報を持つのでシンプル
    * いままでのレイアウト手法は子要素と親要素のレイアウト情報が密接に絡まり合って決定されていた
* ようやく使えるようになったお手軽垂直中央
    * `table-cell` からの解放
* さらに複雑なレイアウト組を可能にする豊富なオプション
    * 学習コストをあげている原因でもある

* * *

## このレイアウトを他の手法でやると？

参考記事:

[たった4行！ CSS3 Flexboxを使った史上最短の上下中央揃え2016年版](http://qiita.com/tonkotsuboy_com/items/a5aaa4a69fecfaf546a3)

いろいろあるけど頭いたくなるょ。

* * *

## SLDSのGrid

* `.slds-grid` は `display: flex` を宣言してる
* `.slds-grid_align-center` は `justrify-content: center`
* 逆に言うと、上記のプロパティのような本当に簡単なレイアウト組は普通にCSS書いとこ？という気持ち

ひっじょーにシンプルな作り　　
https://www.lightningdesignsystem.com/utilities/grid/

* * *

# 使えるブラウザ

* IE11〜
    * 古い仕様での実装のため書き方に差異がある

* * *

# Bug

* そこそこ地雷が埋まってる
* 参考
    * [flexbugs](https://github.com/philipwalton/flexbugs)
    * [flexboxのバグに立ち向かう（flexboxバグまとめ）
](http://qiita.com/hashrock/items/189db03021b0f565ae27) 
* 一部のバグを自動修正するツール
    * [postcss-flexbugs-fixes](https://github.com/philipwalton/flexbugs)

* * *

# マルチブラウザでのチェックは必ずやろう

* * *

# !!!!New Commer!!!! 

* * *

# 2017年はGridレイアウト元年

[これからのレイアウトはGrid Layoutで決まり？](https://ics.media/entry/15921)  
※ICSさんより


* * *

# To be continue.
authorized_keysにpublickeyを登録したのにログインできない時

```shell-session
$tail -f tail -f /var/log/secure
```
でサーバ側のログイン失敗の原因を確認。

Authentication refused: bad ownership or modes for directory /home/hogehoge
hogehogeはユーザ名として
この場合
/home/hogehogeのパーミッションに問題。
パーミッションを700にすると、無事にログインできる。
Atom: Pythonスクリプトをシェルにコピペ時の、IndentationError対応メモ

###対応
(1) Atom -> Preferences... -> Install -> whitespaceを検索 -> Settingsをクリック。
![img02.tiff](https://qiita-image-store.s3.amazonaws.com/0/189863/2e627984-c625-adc2-b798-e8d8dab9b5ea.tiff)

(2) Ignore Whitespace Only LinesチェックボックスをOnに。
![img03.tiff](https://qiita-image-store.s3.amazonaws.com/0/189863/ddb84575-3da4-efdf-c2d4-92e16d90f1a5.tiff)

---
###症状
Pythonスクリプトを、Pythonシェルにコピペして実行しようとすると、IndentationError、が発生。
![img04.tiff](https://qiita-image-store.s3.amazonaws.com/0/189863/b8f8f9e6-ba71-f965-cdd0-72d255114462.tiff)

###原因 
Atomでファイル保存時に、空白行のインデント用スペースが、自動的に削除されてしまっていた。
(下12行目のようにスペース2個でインデントしていたのだが、10行目のように自動で削除されてしまう)
![img05.tiff](https://qiita-image-store.s3.amazonaws.com/0/189863/25b3d6bb-f168-0f70-3a23-994e978239ca.tiff)

---
Python初級、ディープラーニングを勉強中です。メモまで。
既知すぎて検索しにくかったのか。仕様かと思いそうでした。
参考: http://takezoe.hatenablog.com/entry/2015/06/21/021254

---
#### その他: Atom-runner
+ Atom -> Preferences -> Install -> atom-runner

Python3を使用するため、Atom -> Configにて、config.csonに以下を追記。

```
>"*":
>  〜
>  runner:
>    scopes:
>      python: "Python3"
```
SeleniumとRubyを使ってブラウザの操作を自動化してみた

#Seleniumって何？
 Seleniumとは、Webブラウザを使ってWebアプリケーションをテストするツールです。この「Webブラウザを使って」というのが非常に大きなポイントで、人が手でWebブラウザを操作する代わりにSeleniumがWebブラウザを操作してくれるのです。
>引用
<a href="https://thinkit.co.jp/free/article/0705/2/1/">[ThinkIT] 第1回：Webブラウザを使ったテストツールSeleniumとは (1/3)</a>

##環境
windows10(64bit)
ruby 2.4.1

#Sleleniumをインストールしよう

今回はRubyを使用するので、gemでインストールしましょう。
以下のコマンドを入力してください。
``` 
gem install selenium-webdriver
```

インストールが完了したか確認するには、
```
gem list
```
と入力して「selenium-webdriver(バージョン)」が表示されていればOKです。

#ドライバーをインストールしよう
SleleniumではGoogleChrome.FireFox,InternetExplorerなど様々なブラウザがサポートされているようですが、
今回はGoogleChromeを利用します。
以下のパスから最新版をOSに応じてインストールしましょう。
<a href="http://chromedriver.storage.googleapis.com/index.html">ChromeDriver</a>

#Rubyからブラウザを立ち上げて動作確認をしてみよう
テスト的にGoogleのトップページを表示させて、適当な文字を検索してみましょう。

```selenium_test.rb
require "selenium-webdriver"

#Chrome用のドライバ
driver = Selenium::WebDriver.for :chrome

#Googleにアクセスする
driver.get "https://google.com"

#テキストボックスの要素をname属性から取得
element = driver.find_element(:name, 'q')

#取得したテキストボックスの要素に"test"を入力
element.send_keys "test"

#実行キーの押下
element.submit

sleep 30
```

基本的なとこはこんなも感じです。
次はseleniumを利用した昔流行った某クッキーをクリックするゲームの自動化をやってみます。
[rubyクイズ]正しく出力されるのはいくつ？

# 問題「①〜③の中で以下のような期待される出力になるのはいくつ？」

### 期待される出力

```rb
0zero
1one
2two
3three
4four
5five
6six
7seven
8eight
9nine
```

### ①

```rb
[[0, "zero"],
 [1, "one"],
 [2, "two"],
 [3, "three"],
 [4, "four"],
 [5, "five"],
 [6, "six"],
 [7, "seven"],
 [8, "eight"],
 [9, "nine"]].each do |a,b| puts "#{a}#{b}" end
```

### ②

```rb
[[0, "zero"],
 [1, "one"],
 [2, "two"],
 [3, "three"],
 [4, "four"],
 [5, "five"],
 [6, "six"],
 [7, "seven"],
 [8, "eight"],
 [9, "nine"]].each.each do |a,b| puts "#{a}#{b}" end
```

### ③

```rb
[[0, "zero"],
 [1, "one"],
 [2, "two"],
 [3, "three"],
 [4, "four"],
 [5, "five"],
 [6, "six"],
 [7, "seven"],
 [8, "eight"],
 [9, "nine"]].each.each.each do |a,b| puts "#{a}#{b}" end
```


:joy:
:moyai:
:joy:
:moyai:
:joy:
:moyai:
:joy:
:moyai:
:joy:
:moyai:
:joy:
:moyai:
:joy:
:moyai:
:joy:
:moyai:
:joy:
:moyai:
:joy:
:moyai:

# 答え

３つ。eachをどれだけ重ねても出力が変わりません:innocent:
さくらVPSをはじめてつかってみた④-Apatchインストール

・一般ユーザーの追加
・rootユーザーの直接ログイン拒否
・Port番号の変更

上記が完了したので、いよいよApatchさんのインストール
（Apacheってよくエンジニアさんが口にする単語だな、と思っていたけど、
はじめて理解してテンションがあがったw）

`# yum install httpd`
と
`# service httpd start`

をrootで実行するだけなので、インストールは簡単であった。

▼参考記事
http://knowledge.sakura.ad.jp/beginner/2978/

しかし、ブラウザにIPアドレスを打ち込んでも初期画面が表示されず、、、、（このサイトにアクセスできませんの表示）

うーん？と思って、ネットの記事を漁ったところ、httpd.configの設定についてのものが見つかったので、
その記事を参考にhttpd.configをさわってみる。（httpd.configのバックアップ必須）

▼参考記事
http://akabeko.me/blog/2010/09/%E3%81%95%E3%81%8F%E3%82%89%E3%81%AEvps-%E3%82%92%E4%BD%BF%E3%81%84%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B-4/

最後にhttpdを再起動して、これで表示されるかな。。。？
`# service httpd start`

しかし、まだIPアドレスを打ち込んでも初期画面が表示されない。うーん？
Pythonの文字列中に変数を埋め込みたい

## やりたかったこと

rubyの```"some sentence...#{value}..."```のようなこと。
検索すると変換指定子として％使うか、format関数を使う方法が出てきます。
けれども、前者の紹介例だと視線が前後するように感じたし、format関数はなにこれ長いという感想でした。

## 現状の結論

```py3
from functools import partial
myprint = partial(print, sep='')

hex_value = 0x1234
myprint('the value is %x'%hex_value,' and...')
```

変数1つごとに、,で文字列を区切ると近いことができる。
上記の例では,でのスペース挿入を防いでいるが、問題なければそのままprint関数でいいと思います。
出力フォーマットの指定も一緒にできているのでいいんじゃないかと思ってます。
もっといい機能があったらどなたか教えてください。

（追記）
3.6以上で使えるformatted string literalがまさに求めていた記法でした。
@naari さんありがとうございます。[（コメント参照）](http://qiita.com/taki4416/items/11314a956b57e006adbf#comment-640c65f8503e8850d56b)