OmniAICreator/Qiita-1.07M huggingface dataset:
MongoDBにどこからでもアクセス（クロスドメイン）できるRESTを作るもっとも簡単な方法（私見）

# Cordovaのアプリから、外部のMongoDBにアクセスしたかった
色々試行錯誤してしまった。
先人はもっとスマートにやってると思う。

- CordovaにNode.jsのMongoDBライブラリを読み込む方法
  - Cordovaで使うJavaScriptにNode.jsが使えないのか、ライブラリを読み込めず断念。
- MongoDBのコンフィグでrest=true,jsonp=trueでRESTを使ってアクセス
  - jsonpの形式がとってこれず断念。
- EveというMongoDBのサイトにあるRESTのためのもの
  - 外からアクセスできず断念。
- SleepyMongooseというMongoDBのサイトにあるRESTのためのもの
  - pythonのバージョン違い対処するときにCentOS壊しかけたので断念
- Node.jsのmongodb-restを使う
  - 成功

とりあえず、検証段階なのでセキュリティも何も考えずに作るには簡単だった。

# mongodb-restのインストール
npmでインストール。私は-gオプションでインストール。
そのまま起動。

```text
npm install -g mongodb-rest
mongodb-rest
```
-gオプションは、npmの基本のインストール先にインストールするオプション。
→これがないと、カレントディレクトリにインストールする。
自分の場合は次のパスにインストールされていた。（設定ファイルのパス）

```text
/usr/lib/node_modules/mongodb-rest/config.json
```
デフォルトだと、ポート3000を使っているので、iptablesでtcp:3000を開ける。

# 他のPCからアクセス
http://アクセス先ホスト:3000/DB名/コレクション名/
でjson形式のデータ取得成功。

# 学んだこと
実はかなり長いこと「MongoDBのコンフィグでrest=true,jsonp=trueでRESTを使ってアクセス」にこだわって時間がかかった。

- RESTでアクセスする場合、CORSの話でクロスドメインはDatatype:jsonpを使うのがお作法
  - Datatype:jsonp以外（textとかjsonとかxmlとか）はサーバ側にAccess-Control-Allow-Originの設定が必要
- MongoDBにもとからあるRESTの戻りにはJsonP形式で必要なcallbackがついてない
  - 付けられるのかどうか試行錯誤の末、付けられなかった

因みに環境はCentOS6.9、MongoDB2.6。（MongoDBが古すぎたのが問題？）

なお、mongodb-restのデフォルトはAccess-Control-Allow-Originが*になっている。
Datatype:jsonpでは取れず、jsonでリクエストしている。

# 注意
nodeバージョンが新しすぎると動かない。
7.10.0失敗。
4.8.2成功。
AndroidのViewに角丸の枠線とRippleエフェクトを同時に適用させる

[こちらの記事](http://michaelevans.org/blog/2015/05/07/android-ripples-with-rounded-corners/)に記載されている通りなのですが、  
以下の Drawable Resource を追加し、対象のViewの`background`に適用することで実現できます。

``` XML
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="?android:attr/colorControlHighlight">
    <item android:id="@android:id/mask">
        <shape android:shape="rectangle">
            <solid android:color="#000000" />
            <corners android:radius="3dp" />
        </shape>
    </item>

    <item>
        <shape android:shape="rectangle">
            <!-- 枠線 width:線の幅、color:線の色 -->
            <stroke
                android:width="1dp"
                android:color="#4d000000" />

            <!-- 角の丸み -->
            <corners android:radius="3dp" />
        </shape>
    </item>
</ripple>
```

なおこれは v21 以降でしか使えませんのでご注意ください。
再帰

同じく書籍より

```

def fact(x):
    if x == 1:
        return 1
    else:
        return x * fact(x-1) #再帰で階乗を計算している

```

fact(3) > 6 #3*2*1 = 6となる　３!階乗計算

fact(3)呼び出しで
return x * fact(x-1) # 3 x 2
すぐにfact(2)呼ばれて
return x * fact(x-1) # (3*2) x 1
みたいな階乗計算(スタックのように積み重なっているイメージかな)
通勤時間の最適化

# これなに
4月から新しく下宿して、通勤・通学を始めた方も多いかもしれません。
東京だと、なかなか近くに住むのも大変です。

さて、みんなの住むところをシャッフルして、自由に引っ越し可能とした場合、**総通勤時間を最小化**するとどうなるでしょう？
(勤務地も住宅の位置も同じで、住む人を変えるものとします)

# 解いてみる

通勤時間の分布ですが、[通勤に関するアンケート調査結果](https://www.env.go.jp/earth/ondanka/supply_chain/gvc/business/files/D18-2.pdf)の電車通勤を見ると、平均 33.23分、標準偏差 21.80分とありますので、それを使います。分布は、適当に対数正規分布にしましょう。

住宅は、半径60分の円内に一様にランダムに作ります。勤務地は、そこから方向はランダムで、上記の距離離れたところとします。

Pythonで表示してみましょう。

```py3:python
%matplotlib inline
import numpy as np, matplotlib.pyplot as plt, networkx as nx
from pulp import *
from ortoolpy import addbinvars
plt.rcParams['font.family'] = 'IPAexGothic'
n = 100 # 100人分
np.random.seed(1)
dirc1 = np.random.uniform(0,np.pi*2,n)
dist1 = np.random.triangular(0,60,60,n)
dist2 = np.random.lognormal(3.2644,0.5838,n)
dirc2 = np.random.uniform(0,np.pi*2,n)
xs = np.sin(dirc1)*dist1      # 住宅X座標
ys = np.cos(dirc1)*dist1      # 住宅y座標
xt = np.sin(dirc2)*dist2 + xs # 勤務地X座標
yt = np.cos(dirc2)*dist2 + ys # 勤務地y座標
print('%.2f %.2f'%(dist2.mean(), dist2.std()))

plt.title('元の通勤時間分布')
plt.hist(a,bins=100, range=(0,120));
>>>
33.23 21.80
```

![image](https://qiita-image-store.s3.amazonaws.com/0/13955/a7df906d-f098-4f5a-5da3-a1347e29053d.png)

```py3:python
plt.title('住宅')
plt.scatter(xs,ys);
```

![image](https://qiita-image-store.s3.amazonaws.com/0/13955/0e36de4c-baab-c7ac-42d2-b5fdc3570b57.png)

```py3:python
plt.title('勤務地')
plt.scatter(xt,yt);
```

![image](https://qiita-image-store.s3.amazonaws.com/0/13955/a5018e7c-5fee-262d-a50d-7672f05139e6.png)

```py3:python
print(dist2.sum()) # 元の総移動時間
>>>
3323.3549788106984
```

最適化してみます。

```py3:python
g = nx.Graph()
for i1,(x1,y1) in enumerate(zip(xs,ys)):
    for i2,(x2,y2) in enumerate(zip(xt,yt)):
        g.add_edge(i1, i2+n, weight=1000-np.linalg.norm([x1-x2,y1-y2]))

m = LpProblem(sense=LpMaximize)
x = np.array(addbinvars(n,n))
m += lpDot(x.flatten(),[g.edge[i][j]['weight'] for i,j in g.edges()])
for i in range(n):
    m += lpSum(x[i]) == 1
    m += lpSum(x[:,i]) == 1
%time m.solve()
s = (np.vectorize(value)(x)@np.arange(n)).astype(int)
print(1000*n-value(m.objective)) # 最適化後の総移動時間
>>>
Wall time: 488 ms
1973.67977958
```

2/3以下になりました。
分布を出してみましょう。

```py3:python
plt.title('通勤時間分布')
plt.hist([1000-g.edge[i][s[i]+100]['weight'] for i in range(n)], alpha=0.5, range=(0,180), bins=60)
plt.hist([1000-g.edge[i][i+100]['weight'] for i in range(n)], alpha=0.5, range=(0,180), bins=60);
```

![image](https://qiita-image-store.s3.amazonaws.com/0/13955/10246bac-6501-4272-9dab-834b517216af.png)

ちなみに、NetworkXでも解けますが、遅いです。

```py3:python
%time r = nx.max_weight_matching(g)
print(1000*n-sum(g.edge[i][r[i]]['weight'] for i in range(n)))
>>>
Wall time: 2.73 s
1973.67977958
```

以上
シェルスクリプトを使う前に

今まで何の気なしに過去教わった方法(./s)でRailsのローカルサーバーをショートカットで起動していたが、新たに作ったワークスペースでうまくいかなかった話。

##[先に結論 => 権限をつけてあげれば良い]

まずRailsのローカルサーバーの起動方法についてだが、以下のコマンドを打つ必要がある。

```
$ rails s -b $IP -p $PORT
```
だがこれ、一回一回打ち込むのは非常に面倒臭い。
なので、ファイル名を端的に「s」としてその中に上記のコマンドを書いておく。
こうすることで、次からは「./s」と打ち込むだけでローカルサーバーを起動できる・・・はずだった。

```
$ ./s
bash: ./s: Permission denied
```
「はい？」
・・・というのが、当時の僕の反応。

Permission deniedという英語がまず読めないのでこのままコピペで検索をかけると、なんでも「権限が無い」ということらしい。

じゃあどうやって権限つけんのよ、と。

##[権限のつけ方]

そんなに難しい話じゃありません。

```
$ chmod +x 権限をつけたいファイル名
```
はい。
これで完了です。

僕の場合だと、「chmod +x s」ですね。

これで、今後は今まで通り「./s」でローカルサーバーを起動できます。
駆け出しの僕はまだこれくらいしか使い道見つけられていませんが、今後も使えそうな感じなので記載しておきます。

とりあえず、同じエラーメッセージ出てきたらこれを試してみてください。
swift3でjsonをパースして配列に格納したい

何層にも重なるjsonディクショナリーからそれぞれの階層の特定の位置にあるインデックスだけ取り出して配列にappendしたいと思いました。

# step1

空っぽの配列をAnyで準備します


```swift
var CastAnotherThemeList: [Any] = []
```


# step2

for文の中でjsonを取得して取得してAnyに変換して変数に入れる

```swift
var AnotherJsonList = json_list[i]["list_name"] as Any
```
# step3

配列にappend
                        
```swift
CastAnotherThemeList.append(AnotherThemeList)

```

# 参考

[](http://off.tokyo/blog/2017/04/26/swift3-json-array-any/)
c言語_ポインタのポインタを関数に渡す

ここ２年くらい、pythonばっかり触ってたので、c言語(特にポインタの使い方)忘れてしまいました。。
うんこですよね。。


```c:main.c

#include <stdio.h>

void allocate(int **array, int size, int value){

    *array = (int*)malloc(size * sizeof(int));

    for (int i=0; i<size; i++){
        *(*array + i) = value; // unko
    }
}


int main(int argc, const char * argv[]) {

    int *v = NULL;
    int size = 5;
    int value = 100;

    allocate(&v, size, value);

    for (int i=0; i<size; i++){
        printf("v[%d]=%d\n", i,v[i]);
    }

    return 0;
}

```

int型のポインタvのポインタ&vをallocate関数に渡して
うんこするサンプルコードです。

``` c:./main.o

v[0]=100
v[1]=100
v[2]=100
v[3]=100
v[4]=100

```

参考：
> [詳説Cポインタ](https://www.oreilly.co.jp/books/9784873116563/)

　　
　　
どやっ！
突然DNSルックアップエラーが発生→うっかりが原因だった件

# DNSルックアップエラーが突然発生

さくらVPSにてサーバをレンタルし、お名前.comでドメイン取得、同時にドメインレコード設定を行い、さくらVPSで立てているサーバに紐付けて利用していました。
利用して少したったころ、突然ドメインによるサーバアクセスができなくなって原因を調べて試しても、一向に解決せず、最終的に問い合わせ窓口に電話して質問しました。

# 原因

原因はドメイン登録者（Registrant）情報のメールアドレス有効性認証をしていなかったために利用制限がかかっていました。
あとで確認したところ確かに通知のメールはきていました。
メールを開いて該当のリンクをクリックして認証画面を開くだけで対応は終了・・・。

サーバの設定を自分でしていると、ついつい自分の設定ミスを疑ってドツボにハマっていることがおおいのですが、もっと根本的なところに原因があったりすることがあります。
今後気をつけたいと思います。
Evernoteの高度な検索オプション


個人の備忘用、およびメンバーとの共有用メモです。
> 公式情報
> [Evernote の高度な検索構文の使い方](https://help.evernote.com/hc/ja/articles/208313828)

Evernoteの検索はかなり強力です。
タイトルや本文、タグだけでなく、OCR機能により画像内の文字も検索対象になり得るそうです。
しかし検索ワードによっては、検索結果が多すぎて意図するノートを探せない場合もあるかも知れません。
そんな時は、下記のような検索オプションを組み合わせて、目的の情報を取り出してください。

# <i class="fa fa-search" aria-hidden="true"></i> 全文検索
> キーワード

上記で指定したキーワードを含むノートを検索する。
半角スペースで区切って複数指定可能。（普通の検索です）

## 完全一致
> “キーワード”

ダブルコーテーションで囲むと、キーワードと完全に一致する単語を含むノートを検索する。

## 部分一致
### 前方一致
> キーワード*

キーワードの後ろに * をつけると、キーワードから始まる単語を含むノートを検索する。

### 後方一致
> *キーワード

キーワードの前に * をつけると、キーワードで終わる単語を含むノートを検索する。

# <i class="fa fa-search" aria-hidden="true"></i> 除外検索
> -除外したいキーワード

先頭に-を付けると、指定したキーワードを除いたノートを検索する。

# <i class="fa fa-search" aria-hidden="true"></i> ノートブック検索
> notebook:検索対象のノートブック名

※半角スペースのあるノートブックはダブルクォーテーションで囲むことで検索が可能。

ノートブック名が長いので、下記のように「以下を検索中：ノートブック名」からノートブックを選択したのち検索をかけるほうが現実的。

![8dbe08da-b36d-9757-5568-357da76f8963.png](https://qiita-image-store.s3.amazonaws.com/0/170211/1bfc0bed-09fa-c2cf-6d69-2a94b14b1270.png)

# <i class="fa fa-search" aria-hidden="true"></i> タグ検索
> tag:タグ名

上記で指定したタグを含むノートを検索する。

※半角スペースのあるタグはダブルクォーテーションで囲むことで検索可能。

> -tag:タグ名

先頭に-を付けると、指定したタグを含まないノートを検索する。

# <i class="fa fa-search" aria-hidden="true"></i> タイトル検索
> intitle:タイトル名

上記で指定したタイトル名を含むノートを検索する。

> -intitle:タイトル名

先頭に-を付けると、指定したタイトル名を含まないノートを検索する。

# <i class="fa fa-search" aria-hidden="true"></i> OR検索
> any:シングル DINKS

いずれかのキーワードが含まれているノートを検索する。
※anyで指定するキーワードは半角スペースで区切って複数指定可能。
※anyがない場合は、指定したキーワードをすべて含むノートが表示される。

# <i class="fa fa-search" aria-hidden="true"></i> 日時検索
## 作成日時で検索
> created:20170401

上記で2017年4月1日以降に作成されたノートを検索する。

> -created:20170401

上記で2017年4月1日以前に作成されたノートを検索する。

## year, month, dayのような指定も可能
> created:week

上記で今週作成されたノートを検索する。

> -created:year

上記で今年以前に作成されたノートを検索する。

## 更新日時で検索
> updated:20170401

上記で2017年4月1日以降に更新されたノートを検索する。

# <i class="fa fa-search" aria-hidden="true"></i> リソース検索
> resource:image/gif

上記で画像付きのノートを検索する。

# <i class="fa fa-search" aria-hidden="true"></i> すべての検索オプションは複数指定が可能
> マンション -tag:東京都

上記で「マンション」という単語を含むノートからタグに「東京都」が指定されたノートを除外して検索する。

# <i class="fa fa-search" aria-hidden="true"></i> よく使う検索ワードは保存が可能
![cti.png](https://qiita-image-store.s3.amazonaws.com/0/170211/fc728b93-3b09-0b61-e8d8-00a30541c265.png)
選択ソート O(n^2)

同じく書籍より

```

#とても時間がかかるが一番わかりやすいソート
#最初から順番にみていく、そのうち減っていくので
#実質 O(n x 1/2 x n)となる
#ビックオー記法では無視されるのでO(n^2)と書く

def findSmallest(arr):
    smallest = arr[0]        #最も小さい値を格納
    smallest_index  = 0 #最も小さい値のインデックスを格納
    for i in range(1, len(arr)):
        if arr[i] < smallest: #最初は配列[0]と比べている
            smallest = arr[i]
            smallest_index = i
    return smallest_index

#この関数を使って選択ソート
def selectionSort(arr):   #配列をソート
    newArr = []
    for i in range(len(arr)):
        smallest = findSmallest(arr)   #配列内で最も小さい要素を見つけ出す
        newArr.append(arr.pop(smallest)) #新しい配列に追加
    return newArr

print selectionSort([5,3,6,2,10])  #並べ替えた

```

結果順序よく並べ替えられた
[2,3,5,6,10]
Intl.DateTimeFormat 日付表記option逆引き表

Intl.DateTimeFormatを用いた多言語対応の日付フォーマット、どのオプションでどのような出力結果になるのかを、備忘録として表にまとめました。

オプションの一覧と仕様はこちら
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat

## 確認方法

```js
var date = new Date();
console.log(new Intl.DateTimeFormat('ja-JP', {
  year: 'numeric',
  month: 'narrow',
  day: 'numeric'
}).format(date));
```

## 結果

主な環境は
OS: macOS Sierra version 10.12.4
ブラウザ: Google Chrome バージョン 57.0.2987.133 (64-bit)
です。
（他のブラウザもざっと見た感じ、IE以外はだいたい同様の結果だったように思います。）

バグやブラウザ依存の影響が少なく、表記としてもよく使いそうなものに :thumbsup: マークつけました。


| | 出力    |   locale | year | month | day | era | 備考 |
|:--|:--------|:----------|:---:|:-----:|:----:|:----:|:--------|
|| 2017/4/1   | ja-JP | numeric | numeric | numeric || IE、Edgeでは「2017‎年‎4‎月‎1‎日」|
| :thumbsup: | 2017/04/01 | ja-JP | numeric | 2-digit | 2-digit || IE、Edgeでは‎「2017‎年‎04‎月‎01‎日」 |
|| 17/04/01   | ja-JP | 2-digit | 2-digit | 2-digit |
|　 :thumbsup: | 2017年4月1日 | ja-JP | numeric | narrow | numeric |  |
|| 2017年4月1日 | ja-JP | numeric | short | numeric | |
|| 2017年4月1日   | ja-JP | numeric | long | numeric || バグ1|
| :thumbsup: | 平成29年4月1日  | ja-JP-u-ca-japanese | numeric | narrow | numeric |long |
|| 2017年4月1日 | zh-Hans-CN | numeric | narrow | numeric ||バグ2|


### バグ :bug: 
バグ1
特定環境のIEで 「2017‎年‎4‎月‎月1‎日」　月が重複する 

バグ2
特定環境のIEで「2017‎年‎4月‎月‎1‎日」　月が重複する

月月のバグは
Windows Server 2008
IE 11.0.9600.18638
などで再現
win8.1　IE11　では再現せず

## まとめ

locales × options × ブラウザ　で確認がすごい面倒 :rolling_eyes: 
しかも特定のlocaleとoptionとブラウザ（IE）でだけバグがあったりする :poop:
Android releaseビルドでinstrumentation testを実施する


こんにちはsekitakaです。
最近CIに傾倒しています。

今回はAndroidのインスツルメントテストをreleaseビルドで実施する方法の紹介です。
BuildConfigの値を参照している部分のテストがあり、releaseビルドでinstrumentation testを実施したくて調べました。

以下の方法で実行できます。

```build.gradle
android {
    // 略
    testBuildType "release"
}
```

AndroidStudio上は何かの理由でテストケース上エラーになりますが、以下のコマンドでテスト自体は実行できます。

```
./gradlew connectedReleaseAndroidTest
```
`Release`の部分がビルドバリアントになります。省略記法を使用して`./gradlew cRAT`でも実行できます。
この方法でテストするとテストコード内の`BuildConfig.BUILD_TYPE`は`release`になってくれました。
Mac OS SierraでCordovaを構築した際のメモ

## 追加したパス
```
export PATH=$PATH:$HOME/.nodebrew/current/bin
export PATH=$HOME/Library/Android/sdk/platform-tools:$PATH
export PATH=$HOME/Library/Android/sdk/tools:$PATH
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
export ANDROID_HOME=$HOME/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools
export GRADLE_HOME=/usr/local/Cellar/gradle/3.5/bin
```

## 追加したエイリアス
```alias xcode='open -a /Applications/Xcode.app'```

## Androidの開発環境の準備でハマった点
Android sdkの最新バージョンだと、リビジョンtools/templatesは削除されてしまっていて、それのせいで盛大にコケた。
引用：

```
ダウンロードページ（https://developer.android.com/studio/index.html）の一番下にある「コマンドライン ツールのみ入手する」では、今日現在はまだr25.2.3が配布されているので、これをダウンロード・展開して、作られたtoolsフォルダーを差し替えれば良いでしょう。
```

解決に役立った記事：https://teratail.com/questions/68549

## Xcodeの開発環境の準備でハマった点
1. Xcodeは最新版じゃないとダメ。
旧OSを使用しているなら、今すぐ最新のSierraにして、最新のXcodeを手に入れましょう。

2. Xcodeに認証情報をちゃんと設定しないとコマンドラインツールのビルドさえも通させない厳格さ
Xcodeのbuild settingsページのcode signing identity項目に、

```
debug に　iphone developer : {email@gmail.com}
any ios sdk に ios developer
releaseに iphone developer : {email@gmail.com}
any ios sdk に ios developer
```
って感じで設定
二分探索(python2.7)メモ

書籍「なっとく！アルゴリズム」より
備忘録用


```

def binary_search(list, item):
    low = 0                               #low とhighを使ってリストの検索部分を追跡
    high = len(list) - 1
    
    while low <= high:
        mid = (low + high) // 2
        guess = list[mid]          #真ん中の要素を調べる
        if guess == item:        #アイテムを検出
            return mid     #正解ならmid(index)を返す
        if guess > item:    #推測した数字が大きすぎた
            high = mid -1
        else:                   #小さすぎた
            low = mid + 1
    return None    #みつからなければNone

my_list = [1,3,5,7,9]

print binary_search(my_list, 3) #答えは3だけど

```

2*2*2*2*2*2*2   # log2(100) = 7
log2(100) とは 2を何回掛ければ100になるのかだから
答えは7

対数変換をすると探索回数がだせることがわかった
【fortran】行番号は使ってはならない

#はじめに
fortranはパンチカードでプログラミングしていた時代からある言語なので、しばしばそのころの名残が仕様に残っていることがある。数万行にも及ぶ大規模コードも扱う現代では、可読性や保守性を落とす古いコーディングスタイルは一掃しなければならない。
しかしfortranは科学技術計算に用いられるという特性から、「大学の大先生の古いスタイルが、初めてコードに触れる学生に引き継がれる」という悪夢のような悪循環が起こっている。その一つが、「行番号による制御」だ。

#例1:do文をcontinue文で閉じる
大先生レベルの年齢の人が書くコード。

```fortran:BadEx01.f90
do 10 i=1,10
do 20 j=1,10
   write(6,*) i+j
20 continue 
10 continue
```

問題点

* continueを閉じる10,20を逆につけるバグが非常に多い（上が10,20と並んでいるから同じ並びにしたくなる）
* 特にループの中が長くなるとどのcontinue文がどのdo文を閉じているのかわからなくなる
* エディタの自動整形機能が働かないことがある

改善点
**do文は必ずend doで閉じましょう。**

```fortran:GoodEx01.f90
do i=1,10
   do j=1,10
      write(6,*) i+j
   end do 
end do
```

#例2:goto文でループを抜ける
実際に指導をする割と若い先生でもやりがちなコード。

```fortran:BadEx02.f90
do i=1,10
   if(f(i) > 0) goto 30
end do
30 continue
```
問題点

- コードが長くなるとどこに飛ぶかわからなくなる
- continueがループの中か外かで指す意味が変わるので、可読性が落ちる

改善点
**ループを抜けるときはexitを使いましょう。**

```fortran:GoodEx02.f90
do i=1,10
   if(f(i) > 0) exit
end do
```

#行番号を使わざるを得ない所
ここまで行番号を使ってはいけないと述べてきたが、残念なことにfortranにはいまだに行番号を使わなければならない機能が残っている。

##1.format文
書式を指定するformat文は行番号で指定する必要がある。

``` fortran:Ex03.f90
100 format(f10.4)

!...

write(6,100) x

!...

write(10,100) y
```
書式を使いまわすケースはあまりないので、write文の中に直接書いておくのがよいだろう。

#2.read文のEOF検知
ファイルの入力に使うread文ではendオプションでEOFを検知することができる。しかしEOF検知後に行う処理を行番号で飛ばす必要がある。

```fortran
read(10,*,end=1000) x
1000 continue
```

マジックナンバーは可読性を落とすので、何か変数に入れてしまいたいところだが、残念なことに変数をendに渡すことはできない。

可読性を極力保つには、上記のようにread文の直下を指定するのがよい。あまり遠くを指定するとどういう処理をしているのかわけがわからなくなる。
Keras の学習のようすを Slack に通知する

<img width="764" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/62450/e551d08b-f635-3fb5-9ae6-f619ad9050a9.png">

最近よく Python の深層学習ライブラリ Keras でモデルの学習をしています。
深層学習では一般的にモデルの学習に時間がかかり、GPU (もしくはそれに類する強力な) サーバに常にログインしっぱなしでコンソールを確認しているわけでもないため、都度進捗を報告してくれたらありがたいです。

そこで、Keras のコールバック機能から Slack の WebAPI を叩いてチャットで通知を試みます。

# Slack の WebAPI キーの取得
まずは必要な API キーを取得します。
Slack の API キーを取得する作業は、世の中に大量に資料が転がっていますし、公式のドキュメントも親切なので、サマリだけとします。

[Slack 公式](https://api.slack.com/) から画面上部の「Start Building」ボタンを押します。
すると、APIキーを使用するアプリの名前 (適当で OK です。例えば「notifier」等) と、その API キーを使用したいチームを登録するポップアップが出現するので、適宜入力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/62450/16e89403-7715-d78d-313b-ef1afcbb3595.png)

アプリが登録できたら、今回は外部から Slack に投稿をしたいので、 Incoming Webhooks を有効にします。
![貼り付けた画像_2017_04_26_14_49.png](https://qiita-image-store.s3.amazonaws.com/0/62450/21b9ac8c-50dc-1f19-0081-6b7a8e564c62.png)

あとは画面の案内に従っていけば API キーが発行されます。
![貼り付けた画像_2017_04_26_14_51.png](https://qiita-image-store.s3.amazonaws.com/0/62450/40349b97-1d08-4a4f-235d-824b46a33ff0.png)

API キーが発行されたら、サンプルコードが表示されるので、コピペして一度動作確認してみると良いでしょう。
![貼り付けた画像_2017_04_26_14_53.png](https://qiita-image-store.s3.amazonaws.com/0/62450/d182c6e6-cbc7-1488-bd9b-76adb3c826dd.png)

# Keras のコールバックの設定
Keras には `LambdaCallback` という、カスタムコールバックを簡単に生成できるクラスが用意されているので、それを使うだけで OK です：

```python
import os

from keras.callbacks import LambdaCallback

hostname = os.uname()[1]

callbacks = []

slack_command = 'curl -X POST -H \'Content-type: application/json\' --data \'{{"text":"Here is {}.\nepoch:{:03d}, loss:{:.7f}, val_loss:{:.7f}"}}\' https://hooks.slack.com/services/<your_key_here>'
slack_callback = LambdaCallback(
    on_epoch_end=lambda epoch, logs: os.system(slack_command.format(hostname, epoch, logs['loss'], logs['val_loss'])))
callbacks.append(slack_callback)

# あとはいつもどおり Keras のモデルの学習メソッドを呼ぶときに Callback を渡すだけ
history = model.fit_generator(train_generator, samples_per_epoch, nb_epoch, callbacks=callbacks,
                    validation_data=val_generator, nb_val_samples=nb_val_samples)
```

`<your_key_here>` の部分は、自分の API キーで置き換えてください。
また、 `loss` と `val_loss` なにもしなくても存在しますが、他の指標も欲しい場合は、`model.compile()` メソッドの `metrics` 引数に渡せば、その名前で `LambdaCallback` 中でも参照することが出来ます。カスタムメトリクスの登録については [Keras公式ドキュメントの該当ページ](https://keras.io/metrics/) が参考になります。

上に貼ったコードからなんとなく伝わると思いますが、`LambdaCallback` には `on_epoch_end` のほかにも `on_epoch_begin` や `on_batch_end` といったフックも用意されています。
もっとも、バッチごとに Slack に通知を飛ばされたら鬱陶しいので、この用途では使わないかもしれませんが。
(CSV 等にログをとる用途には便利かもしれませんね)


# 参考リンク
- Slack API: https://api.slack.com/
- Keras 公式 (Callbacks): https://keras.io/callbacks/
- Python でホスト名を取得する: http://qiita.com/iorionda/items/cfceac93c9e87d430077
[mysql]dumpファイルのサイズを気にせずに別サーバへデータを転送する

#dumpファイルのサイズを気にせず別サーバへデータを転送する

あるmysqlサーバから別のmysqlサーバにデータを移したい。
dumpファイルに出力後別サーバに流し込む方法だと、ディスク容量の関係で大きなデータを転送できない。

そこでmknodコマンドでFIFOスペシャルファイルを作成し、dumpの結果をそのまま別サーバへ流し込めば、ディスクの空き容量を気にせずに作業できる。
mknodでファイル作成後、別プロセスでファイルオープン、クローズするとファイルからmysqlコマンドへの入力処理が終了する。
mkfifoも同様のファイルを作成できる。

実際の処理をワンライナーにするとこんな感じ。
<pre>
dump_file=/tmp/dump.sql; \
mknod ${dump_file} p; \
mysql -uuser -ppass -htohost db < ${dump_file} & \
mysqldump -uuser -ppass -hfromhost db table1 table2> ${dump_file}
</pre>
シェルにするとこんな感じ。
<pre>
\#! /bin/bash

TABLES="
table1
table2
"

table=($TABLES)

dump_file=/tmp/${tables[0]}.sql
mknod ${dump_file} p
mysql -uuser -ppass -htohost db < ${dump_file} &
mysqldump -uuser -ppass -hfromhost db $TABLES > ${dump_file}

rm -rf ${dump_file}
</pre>

バックアップなどの用途で圧縮したい場合はこんな感じ。
<pre>
\#! /bin/bash

TABLES="
table1
table2
"

table=($TABLES)

dump_file=/tmp/${tables[0]}.sql
mknod ${dump_file} p
gzip < ${dump_file} > ${dump_file}.gz &
mysqldump -uuser -ppass -hfromhost db $TABLES > ${dump_file}

rm -rf ${dump_file}
</pre>

スペシャルファイルの動きについて試してみたい方はターミナルを複数立ち上げ、片方で
<pre>
dump_file=/tmp/tmp.sql; \
mknod ${dump_file} p; \
mysql -uuser -ppass -htohost db < ${dump_file}
</pre>
もう片方で
<pre>
cat "select count(*) from table1" > /tmp/tmp.sql
</pre>
とするとmknodコマンドを実行したターミナルにcountの結果が出力され、処理が完了するので試していただきたい。

mknodについてはこちらを参照
https://www.ibm.com/support/knowledgecenter/ja/SSLTBW_2.2.0/com.ibm.zos.v2r2.bpxa500/mknod.htm
mkfifoについてはこちら
http://qiita.com/richmikan@github/items/bb660a58690ac01ec295
docker-composeでRailsのGemを更新する時、docker buildするのを回避したい

# 背景
docker-composeを使って開発しているが、Gemを更新する度にdocker buildをするのは辛いしだるい。
ゴールはGemの更新の度にこれが出来れば良い。

```bash
$ docker-compose run --rm rails bundle install
```

ちなみに、現状のDockerfileはこんな感じ。

```
FROM ruby:2.3.4
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN apt-get install -y qt5-default qt5-qmake libqt5webkit5-dev gstreamer1.0-plugins-base gstreamer1.0-tools gstreamer1.0-x
RUN mkdir /rails
WORKDIR /rails
ADD Gemfile /rails/Gemfile
ADD Gemfile.lock /rails/Gemfile.lock
RUN bundle install
ADD . /rails
```

# 解決策
bundlerによって配備されるディレクトリをdocker-composeが提供するボリュームに入れてあげれば良い。
まずは、現状のdocker-compose.ymlから。

```yml
version: '2'
services:
  db:
    image: mysql:5.7
    command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci
    volumes:
      - sql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - 3306
  rails:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/rails
    ports:
      - "3000:3000"
    environment:
      RAILS_ENV: development
      RAILS_DATABASE_NAME: hoge
      RAILS_DATABASE_USER: root
      RAILS_DATABASE_PASSWORD: password
      RAILS_DATABASE_HOST: db
    tty: true
    stdin_open: true
    links:
      - db
volumes:
  sql-data:
    driver: local
```

bundler用のボリュームを追加。

```bash
$ diff old.yml new.yml
diff --git a/old.yml b/new.yml
index 546cb42..22d618b 100644
--- a/old.yml
+++ b/new.yml
@@ -14,6 +14,7 @@ services:
     command: bundle exec rails s -p 3000 -b '0.0.0.0'
     volumes:
       - .:/rails
+      - bundle:/bundle
     ports:
       - "3000:3000"
     environment:
@@ -29,3 +30,5 @@ services:
 volumes:
   sql-data:
     driver: local
+  bundle:
+    driver: local
```

これで、Gemの更新の度にdocker buildをせずに`docker-compose run --rm rails bundle install`が実行出来てストレスが軽減出来るネー。
テキストレイヤーを単語毎に配列に入れる

#やりたかった事
レイヤーマーカーのタイミングで単語毎にテキストを表示させたい。
テキストレイヤーを配列で格納・配列を取得してマーカーの番号とリンクさせて、アニメーターにエクスプレッションを渡して、ごにょごにょと考えていたのですが・・・
作成中に別の方法を思いついたので、とりあえずメモ書き保存用です。

配列に入れるまでは完成しています。

#それでは今回の内容
I just want to take you higher
このテキストには単語毎半角のスペースが入っており、これを利用し配列に入れる。

```js

var myComp = app.project.activeItem;
var myLayer = myComp.selectedLayers[0];
var myText = myLayer.property("ADBE Text Properties").property("ADBE Text Document").value;
var text  =　myText.toString (myText);
var text_array = text.split(' ');
var dis = "";
var kai = String.fromCharCode(13); 

for(var i=0; i<text_array.length;i++){
    dis=dis+text_array[i]+" ";
    }
    
    alert(text_array.length+kai+dis)


これだけです(笑)
自分用のメモなので、すみません・・・

```

#解説
①AE上で選択状態のしたテキストレイヤーをtoStringで変数textに入れる

```js
var myComp = app.project.activeItem;
var myLayer = myComp.selectedLayers[0];
var myText = myLayer.property("ADBE Text Properties").property("ADBE Text Document").value;
var text  =　myText.toString (myText);

```
②正規表現の位置で分割
今回は半角スペースを利用するのでsplit(' ')で分割する

```js
var text_array = text.split(' ');
```

③あとfor文を使ってデータを取り出し、アラートで結果を表示しているだけです。

```js
var dis = "";
var kai = String.fromCharCode(13); 

for(var i=0; i<text_array.length;i++){
    dis=dis+text_array[i]+" ";
    }
    
    alert(text_array.length+kai+dis)
```

結果配列数が　７
配列を全て並べて元のテキストを配列で表示しています。

![bandicam 2017-04-26 13-57-37-568.jpg](https://qiita-image-store.s3.amazonaws.com/0/178061/945cc939-e3e0-3bfb-aadb-e81c98d37699.jpeg)
ApacheでIPアドレス認証かダイジェスト認証のどちらかでアクセス制限させる

# Apacheの設定の話
内容はタイトルとおりです。
Apacheの設定関係で、意外と出回ってなかったという印象なので書いておきます。
よくあるのは、IPアドレスとベーシック認証のどちらかを使用してアクセス制限するタイプです。

そもそもダイジェスト認証があまりメジャーではない（？）印象なので、尚更書いている人が少ないように思います。


## ダイジェスト認証とは？
Wikiによると、以下のとおりですね。詳細は書いてあるので割愛します。

> Digest認証（ダイジェストにんしょう）とは、HTTPの認証方法の一つ。ユーザ名とパスワードをMD5でハッシュ（ダイジェスト）化して送る。Basic認証では防げなかった盗聴や改竄を防ぐために考案された。
https://ja.wikipedia.org/wiki/Digest%E8%AA%8D%E8%A8%BC

要するに、ベーシック認証はセキュリティ面で不安があるので、それを解決したのがダイジェスト認証ということです。
ちなみに、ベーシック認証のなにが不安なのかというと**「ユーザーIDやパスワードの情報がほとんど加工されないまま送信される」**点です。暗号化されていないパスワードでやりとりするとか恐ろしすぎます。

## それでもダイジェスト認証があまり使われてないのは
ベーシック認証がダイジェスト認証よりも広く使われている理由には、対応していないブラウザがまだあるということらしいですね。

* ページを閲覧するユーザがある程度決まっていて、どんなブラウザを使用するか把握している
　→　ダイジェスト認証

* 想定されるユーザが多岐に渡ってブラウザ環境が不明　
 　→　ベーシック認証が無難

という解釈をしています。

## 環境次第でベーシック認証でいい
ベーシック認証はセキュリティ面で不安な面もありますが、SSLが確立されている場合や社内LANからのアクセスならそこまで慎重になる必要はなさそうです。

## 社内アクセスはIPアドレス認証し、社外からのアクセスはダイジェスト認証にする
ここまで書いた内容を考慮して、特定の社員がアクセスするページに対してこのような設定をすることにしました。

### パスワードファイルを作成する

コマンドを叩くだけですが、何点か注意が必要です。
まずはApacheをインストールしたディレクトリに移動します。
```htdigest -c```で新規のパスワードファイルを作ります。

```
htdigest -c パスワードファイル名 領域名 ユーザー名
#パスワードファイルを新規作成する場合は-cは必要です
```

* パスワードファイル名
<pre>絶対パスで指定します</pre>

* 領域名
<pre>後にhttpd.confのAuthNameで指定する名前になります。特に決まりはないです</pre>

* ユーザ名
<pre>ダイジェスト認証でユーザ名を聞かれたときに入力する値になります。adminがわかりやすいです</pre>

コマンドを実行すると、二度パスワードを入力せよと指示があるので入力します。
そのパスワードがダイジェスト認証のパスワードになるので忘れないようにしてください。

### httpd.confに設定を書く
パスワードファイルができたら以下の設定を記述します。
ベーシック認証設定の内容とほぼ変わりません。

```
＝＝＝
<Directory "<Directory_path>">
  Order deny,allow　#全拒否してから許可させるものを指定する
  Allow from <社内IP> #許可するIPアドレス
  Allow from <社内IP>
  Allow from <社内IP>
  Deny from All #すべてを拒否

 #Digest
  AuthType Digest 　#ダイジェスト認証を使うぞ宣言
  AuthName "<領域名>" 　#htdigestで入力した領域名
  Options FollowSymLinks　　#シンボリックリンクファイルを認識させる
  AllowOverride All 　　　　#上位で設定した設定値を、下位の設定で変更できるように許可を与える
  AuthUserFile "/etc/httpd/conf/.htdigest" 　　#パスワードファイル名
  Require valid-user　#記述されているユーザを許可する

  Satisfy any　#ダイジェスト認証かIP元どちらかをパスすればOKにする（defaultはAll）
</Directory>
```

記述が終わったら、syntaxの確認をして・・・。

```
/etc/init.d/httpd configtest
```

問題なければサービスを再起動です。

```
service httpd restart
```

これにより、社内からのアクセスはダイジェスト認証が実施されずにページへアクセスできます。
それ以外のIPアドレスから来た場合、ダイジェスト認証のポップアップがでるようになります。

## 参考文献
ベーシック認証Wiki
https://ja.wikipedia.org/wiki/Basic%E8%AA%8D%E8%A8%BC
ダイジェスト認証Wiki
https://ja.wikipedia.org/wiki/Digest%E8%AA%8D%E8%A8%BC
Apache HTTP サーバ バージョン 2.4 ドキュメント
https://httpd.apache.org/docs/2.4/ja/
Basic認証（基本認証）とDigest認証、それぞれの役割と違いについて
https://madalinazaharia.com/column/basic-authentication-and-digest-authentication/
ダイジェスト認証を設定する
https://www.adminweb.jp/apache/allow/index8.html
Huawei MediaPad M3をAndroid 7.0(BTV-DL09C233B338)


見出し
# 見出し 1
## 見出し 2
### 見出し 3
強調
**強調**
リンク
[リンク](http:\/\/...)
コード
```ruby:filename.rb
コード
```
リスト
- リスト 1
- リスト 2
    - リスト 2-1
1. 番号付きリスト 1
2. 番号付きリスト 2
3. 番号付きリスト 3
- [ ] チェックボックス 1
- [ ] チェックボックス 2
- [x] チェックボックス 3
npmをバージョン指定してインストールする

# はじめに
Dockerでnpmを使っていたのですがエラーが出てしまいました。

```bash
$ npm install --global npm@4.5.0
$ npm --version


module.js:471
    throw err;
    ^

Error: Cannot find module 'semver'
    at Function.Module._resolveFilename (module.js:469:15)
    at Function.Module._load (module.js:417:25)
    at Module.require (module.js:497:17)
    at require (internal/module.js:20:19)
    at Object.<anonymous> (/usr/local/lib/node_modules/npm/lib/utils/unsupported.js:2:14)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
    at Function.Module._load (module.js:438:3)
```

npmの最新版（安定版？）を入れる方法があったのですがうまく動かず、バージョン指定で入れることができないかな、ということで試してみました。

```bash:バージョン4.5.0のインストール
$ curl -0 -L https://registry.npmjs.org/npm/-/npm-4.5.0.tgz | tar zxvf - && \
 cd package && ./configure && make && make install
```

```bash:バージョン3.10.10のインストール
$ curl -0 -L https://registry.npmjs.org/npm/-/npm-3.10.10.tgz | tar zxvf && \
 cd package && ./configure && make && make install
```

> The npm module is available for download at https://registry.npmjs.org/npm/-/npm-{VERSION}.tgz.
> https://docs.npmjs.com/getting-started/installing-node

# インストールスクリプト
あちこちにインストールスクリプトを使う方法が載っていて、そちらでのやり方です。

```bash
$ curl -0 -L https://npmjs.org/install.sh | sh
```
サイトによっては記述されていない、リダイレクトを追跡する`-L`オプションが必要でした。
おそらくですがNode.jsのバージョンに適したnpmが入るのではないかな、と思います。Node.jsの6.10.2ではnpmの3.10.10が入りました。

# 参考サイト

http://hayatomo.com/2220
http://hacknote.jp/archives/17889/
http://qiita.com/aureonebulosa/items/1cbfacc8a8095f2ee887
[VirtualBox][Windows] 特定のVDIのUUIDを確認する

VirtualBoxの特定のディスクイメージのUUIDを取得する方法メモ。

`VBoxManage.exe showhdinfo HDDNAME.vdi` を使用すれば良さそう。

```console:出力名
$ VBoxManage.exe showhdinfo HDDNAME.vdi
UUID:           4c0451fb-7d9e-4c5d-8c51-4ec51b00005d
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       C:\Users\username\VirtualBox VMs\VMNAME\HDDNAME.vdi
Storage format: VDI
Format variant: dynamic default
Capacity:       81920 MBytes
Size on disk:   55383 MBytes
Encryption:     disabled
In use by VMs:  VMNAME (UUID: 9d9b6fd8-062c-4e99-b1eb-6140a23e3059)
```

# 参考
[virtualbox - how to check what is the uuid of a vdi? - Stack Overflow](http://stackoverflow.com/questions/5379799/virtualbox-how-to-check-what-is-the-uuid-of-a-vdi)
tmux 2.4 をローカルインストールする

tmxu 2.4をCentOS6上でローカルインストールする方法を記す。

まずは、ホームディレクトリ配下に`local`というディレクトリを作成する。

```
mkdir $HOME/local
```

必要なパッケージをダウンロードして解凍する。

```
wget https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz
wget http://ftp.gnu.org/gnu/ncurses/ncurses-6.0.tar.gz
wget https://github.com/tmux/tmux/releases/download/2.4/tmux-2.4.tar.gz
tar zxvf ncurses-6.0.tar.gz
tar zxvf libevent-2.1.8-stable.tar.gz
tar zxvf tmux-2.4.tar.gz
```

`libevent`をインストールする。

```
cd libevent-2.1.8-stable
./configure  --prefix=$HOME/local/
make
make install
```

`ncurses`をインストールする。

```
cd ncurses-6.0
./configure  --prefix=$HOME/local/
make
make install
```

`tmux`をインストールする。各種環境変数を忘れると`tmux`が起動してこないため気をつけるように。

```
cd tmux-2.4
export DIR="$HOME/local"
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$DIR/lib
./configure --prefix=$DIR CFLAGS="-I$DIR/include" LDFLAGS="-L$DIR/lib"
make
make install
```

パスを通す。

```
vi ~/.bash_profile
```

以下を追記する

```
export DIR="$HOME/local"
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$DIR/lib
export PATH=$HOME/local/bin:$PATH
```

設定を反映させる。

```
. ~/.bash_profile
```

以上。
複数の機械学習ライブラリを一発で適応しちゃう方法

#複数の機械学習ライブラリを一発で適応する方法です。
機械学習では、データをトレーニング用とテスト用の2つにわけ、精度を測りますよね。そこで、簡単にデータを分けられるのがKFoldです。その他にも、StatifiedKFoldやShuffleSplitなどもありますが、今回はKFoldを使います。


##まず交差検定の一つであるsklearnのKFoldについて
KFoldはデータをk個のデータセットに分け、例えば１０個に分けたら、９個をトレーニング用のデータセットとして使い、残りの1個をテスト用として使います。ちなみに、この場合、分けられた10個のデータセットがテスト用として必ず1回使われるように10回検定します。defaultのコードは下記のようになっています。

```python:KFold
from sklearn.cross_validation import KFold

KFold(n_splits=3, shuffle=False, random_state=None)

```

そして下記がKFold内のパラメータです。

- n_split
データをいくつに分けるかを指定するもの。defaultは3。なお、検定はここで指定した数値の数だけ繰り返される。

- shuffle
defaultはFalseだが、これをTrueにすることで、連続する数字の単純なグループ分けではなく、データセットの中からランダムに値を持ってきてグループを作ることができる。

- random_state
乱数制御のパラメータでこれを数値にすることで、毎回同じデータセットが得られる。


こちら[公式ドキュメント](http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.KFold.html)

##続いて  cross_val_score についてです。
cross_val_scoreは、classifierと、トレーニング用データ、テスト用データを指定してその精度を割り出せる便利なツールです。下記がdefaultのコード。

```python:cross_val_score

from sklearn.model_selection import cross_val_score

cross_val_score(estimator, X, y=None, groups=None, scoring=None, cv=None, n_jobs=1, verbose=0, fit_params=None, pre_dispatch='2*n_jobs')

```

下記が主要パラメータの説明です。

- estimator 
これでclassifierの指定をします。

- X
トレーニング用のデータの指定
- y
テスト用のデータの指定
- scoring
スコアのつけ方の指定。精度のaccuracyの他にもaverage_precisionやf1などがあります。[リンク](http://scikit-learn.org/stable/modules/model_evaluation.html)
- cv
crossvalidation(交差検証)の略で、データのsplitの方法を指定できます。


こちら[公式ドキュメント](http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.cross_val_score.html)

##本題の複数の機械学習
メインの複数の機械学習の方法を1発でapplyしちゃう方法です。
今回使うのは、DecisionTreeClassifier, KNeighborsClassifier, SVCです。まずはコードをどうぞ。ちなみにここでは、トレーニングデータセットとテスト用データセットをすでに分けている程で進めていきます。

```python:machine_learning

from sklearn.model_selection import KFold
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC

#機械学習モデルをリストに格納
models = []
models.append(("KNC",KNeighborsClassifier()))
models.append(("DTC",DecisionTreeClassifier()))
models.append(("SVM",SVC()))

#複数のclassifier の適用
results = []
names = []
for name,model in models:
    kfold = KFold(n_splits=10, random_state=42)
    result = cross_val_score(model,X_train,Y_train, cv = kfold, scoring = "accuracy")
    names.append(name)
    results.append(result)

#適用したclassifierのスコア表示
for i in range(len(names)):
    print(names[i],results[i].mean())

```
これで結果が

KNC 0.88
DTC 0.91
SVM 0.79

みたいな感じになると思います。
configureのAX_CXX_COMPILE_STDCXX_11でエラーが出た時

# 起きたこと

C++のプロジェクトでconfigureしたらエラーが出た。

```
./configure: line 4585: syntax error near unexpected token `noext,'
./configure: line 4585: `AX_CXX_COMPILE_STDCXX_11(noext, mandatory)'
```

今までmakeやらconfigureは適当にやれば適当に動いてくれたので不勉強なままだったからさあ大変。とりあえずエラーメッセージをググる。

# 解決策

`autoconf-archive`を入れる。[ここ](https://github.com/json-c/json-c/issues/292)に書いてあった。

Macの場合

```
brew install autoconf-archive
```

## `autoconf-archive`とは？

[GNU Autoconf Archive](https://www.gnu.org/software/autoconf-archive/)
Autoconfのマクロ集。500個以上のマクロが入っている。

ちなみにGNUには珍しく、Autoconfによって生成される`configure`ファイルのライセンスに関わらず、Autoconf Archiveのマクロを使用できる[^1]。これはAutomakeがソフトウェア開発ツールチェインの中核的位置を占めているため、これらのマクロが商用ソフトウェアにも使われる不利益よりも、幅広く利用可能であることによる利益の方が重要だからである、とのこと。

[^1]: https://www.gnu.org/software/autoconf-archive/Introduction.html#Introduction
【初心者向け】Django よく使うコマンドとリファレンス集まとめ

## この記事の概要・目的
* Djangoで開発する上で、よく使うコマンド、よく見るリファレンスページのまとめです。
* 開発時の時短にお使いください。他に、よく使うコマンド・よく見るリファレンスページがあれば、コメント頂けると嬉しいです:+1:

## よく使うDjangoコマンド
* 空のアプリケーション作成
  * `django-admin startproject (プロジェクト名)`
* アプリケーション作成
  * `python manage.py startapp (アプリ名)`
* スーパーユーザの作成
  * `python manage.py createsuperuser`
* 開発用のwebサーバ起動
  * `python manage.py runserver`
* マイグレーションファイルの作成
  * `python manage.py makemigrations (アプリ名)`
* 実際のマイグレーションの実施
  * `python manage.py migrate`
* マイグレーションの結果を表示する
  * `python manage.py sqlmigrate (アプリ名) (マイグレーション番号)`
* Python対話環境の開始(djangoに必要な環境変数を設定した上で)
  * `python manage.py shell`
* 特定アプリに対するテストの実施
  * `python manage.py test (アプリ名)`

## よく使うDjangoリファレンス
* [Django 日本語版ドキュメントトップ](https://docs.djangoproject.com/ja/)
  * 日本語版公式ドキュメントのTOPページです。
* [Django 公式 QyerySet APIリファレンス (モデル層の基本的なAPI)](https://docs.djangoproject.com/ja/1.11/ref/models/querysets/)
  * モデル層のAPI一覧が載っており、よく使います。
* [Django 公式 テンプレート](https://docs.djangoproject.com/ja/1.11/ref/templates/language/)
  * テンプレートエンジン Jinjaの基本的な使い方が載っています。
Firebase Notificationsをやめた4つの理由


最近、Firebaseがいいみたいになってるけど、2017年4月時点では、あんまり良くないと思っています。
そんな記事です。
主にFirebase Notificationsについてです。

# 前提

全ての状況で良くないわけではなくて、以下の前提がある場合です。

* 技術者でない人、例えば企画がPush通知を送りたい。
* ユーザをセグメント分けして、対象のセグメントだけに送りたい。
* お金はかけたくない。

# 駄目だと感じたところ

## セグメントが上書きされない

__2018/12/7追加__

__現在は改善されているようです。(すいません、自分で試してないですが。。)__
__詳しくはコメント欄をみてください。__
__下記に記述していた公式の[Firebaseヘルプ](https://support.google.com/firebase/answer/6317519?hl=ja)も更新されていて全く違う内容になっていました。__


ほぼ、これに尽きます。

Firebaseではユーザの属性情報（例えば、職業とか性別とか）は、ユーザプロパティと呼んでいます。
これを使ってセグメント別にPushを送りたいところです。

普通の感覚だと属性が変更になれば、上書きされると思いますが、Firebaseでは積み上げ式です。

[Firebaseヘルプ](https://support.google.com/firebase/answer/6317519?hl=ja)には以下のように書いてあります。

>非可変属性のプロパティを使用してください。

つまり、一度登録したユーザプロパティは変更されず、残り続けます。違うユーザプロパティを設定してもレコードが追加されるだけです。
なので、例えば、以下のストーリーのようにうまくいきません。

1. Aさんが、アプリ上で、職業を「IT技術者」から「販売員」に変更。
2. サービス側が、通知で「IT技術者」のための通知を送りたい。
3. Aさんにも通知が届いてしまう。

## 集計が始めるのが遅すぎる

Firebaseでは、例えば、ユーザリストといって、ユーザをグループ分けできます。
例えば、「ユーザプロパティの職業=大学生 && 性別=女」を「女子大生」としてユーザリストを作り、それに対して通知を送ることができます。

ただ、これの反映が遅すぎる。まず、Firebase Console上でユーザリストを作成してもそのユーザリスト宛にすぐにPush通知を送ることができません。
作成直後は、「ユーザ数」が0です。

予想でしかないですが、おそらくユーザリストを作った後にアプリを利用したユーザが、2時間後ぐらいに反映されている感じがします。

## 登録制限が多すぎる

制限が多すぎます。

ユーザプロパティは[公式](https://firebase.google.com/docs/analytics/android/properties?hl=ja)でこのように書いてあります。

> 最大 25 個までアプリに設定できます。

そして、削除もできません。入力間違いは許されません。
追記：
（ちなみにプロパティには[自動で登録されるもの](https://support.google.com/firebase/answer/6317486)があって、それは別枠です。具体的には、年齢層、性別、興味関心、端末情報など13項目あります。これらの情報はiosの場合、IDFAから収集しているのでユーザが許可していないと取得はされません。さらに、これらの広告に基づくデータはFirebase Notifications と Firebase Remote Config のターゲティングでは使用できません。）

ユーザリストは[公式](https://support.google.com/firebase/answer/6317509?hl=ja#create-an-audience)でこのように書いてあります。

>最大 50 個のユーザーリストを作成できます

カスタムイベントは[公式](https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event?hl=ja)でこのように書いてあります。

>.You can report up to 500 different types of Events per app and you can associate up to 25 unique parameters with each Event type. 
・・・・・・
> Event names can be up to 40 characters long, may only contain alphanumeric characters and underscores ("_"), and must start with an alphabetic character. The "firebase_" prefix is reserved and should not be used.


イベント数は、最大500。これはまあいい。
パラメータ25個の制限は、無料で使うとどちらにしろ見れないので、まあいい。
厳しいのはイベント名の長さが最大40文字で、英数字とアンダースコアで書く必要があることです。

## 目標到達プロセスで最初の必須がない

これは通知とは関係ないですが、「なんだこれ？」と思ったので書いておきます。

例えば、新規登録直後だけ「Aボタン」を押下したことを目標にしたいのに、新規登録直後以外に「Aボタン」を押下したらカウントされます。
なので、グラフが右肩下がりになるはずなのに、途中で上がったりします。なので使うところが限られてしまいます。

ちなみに、Google Analyticsでは、最初のページを「必須」にするトグルがあるので、この問題は発生しません。

# 代替案

Firebaseは日々進化しているので、これらの問題点が解決されることを期待してますが、代替案を上げておきます。

通知機能であれば、[OneSignal](https://onesignal.com)の方が遥かに優れています。

Analytics機能では、Google Analyticsで、イベントを仕込んで、属性情報をカスタムディメンションを利用し、目標到達プロセスで利用するものだけをページビューを使うことで運用しています。
Cabochaで活用して自動で「IOB2タグcorpus」学習データを発生

https://gist.github.com/jpena930/0753edfd27e010503755ccfdaeb965bf

```tcsh
#coding: utf-8
from __future__ import print_function  # Only needed for Python 2
import MeCab
import CaboCha
import sys
import os


cabocha = CaboCha.Parser("-f1 -n1")
m = MeCab.Tagger ("-Ochasen")

# For reading from file
class getWords():
    def readText(self, filename):
        ###ファイルを展開
        with open(filename, 'r', encoding='utf-8') as f:
            tText = f.read()
            f.close()
        return tText

#Usage: python training_generator <text file>
with open(sys.argv[1], 'r') as my_file:
    text = my_file.read()


getText = getWords()
#file_output = '<Filename>'

file_output = sys.argv[1]

text = getText.readText(file_output)

cabocha_text = cabocha.parseToString(text)
cabocha_text = cabocha_text.replace("B-ORGANIZATION", "B-ORG")
cabocha_text = cabocha_text.replace("I-ORGANIZATION", "I-ORG")
cabocha_text = cabocha_text.replace("B-ARTIFACT", "B-ART")
cabocha_text = cabocha_text.replace("I-ARTIFACT", "I-ART")
cabocha_text = cabocha_text.replace("B-LOCATION", "B-LOC")
cabocha_text = cabocha_text.replace("I-LOCATION", "I-LOC")
cabocha_text = cabocha_text.replace("B-DATE", "B-DAT")
cabocha_text = cabocha_text.replace("I-DATE", "I-DAT")
cabocha_text = cabocha_text.replace("B-TIME", "B-TIM")
cabocha_text = cabocha_text.replace("I-TIME", "I-TIM")
cabocha_text = cabocha_text.replace("B-PERSON", "B-PSN")
cabocha_text = cabocha_text.replace("I-PERSON", "I-PSN")
cabocha_text = cabocha_text.replace("B-MONEY", "B-MNY")
cabocha_text = cabocha_text.replace("I-MONEY", "I-MNY")
cabocha_text = cabocha_text.replace("B-PERCENT", "B-PNT")
cabocha_text = cabocha_text.replace("I-PERCENT", "I-PNT")


#Remove commas and replace with tab
cabocha_text = cabocha_text.replace(",", "\t")

filename = file_output + '_generated.txt'

if os.path.exists(filename):
    os.remove(filename)

# Remove * and add line space
for line in cabocha_text.splitlines():
    if not line.startswith('*'):
        with open(filename, 'a') as f:
            print(line, file=f)
    if line.startswith('。'):
        with open(filename, 'a') as f:
            print("", file=f)

readFile = open(filename)

lines = readFile.readlines()
lines = lines[:-1]

readFile.close()

w = open(filename,'w')
w.writelines([item for item in lines[:-1]])
w.close()
```

Next Step:  Fix tags to suit your needs

Reference:
http://qiita.com/Hironsan/items/326b66711eb4196aa9d4
https://github.com/Hironsan/IOB2Corpus
【ネタ】PythonでSleep Sort


```python:script.py
from time import sleep
from _thread import start_new_thread


def sleep_sort(i):
    sleep(i)
    print(i)


array = [5, 3, 6, 3, 6, 3, 1, 4, 7]
sorted = list(map(lambda item: start_new_thread(sleep_sort, (item,)), array))
# >>> 1
# 3
# 3
# 3
# 4
# 5
# 6
# 6
# 7
# なお sortedには別物がはいる...まぁネタだから
```

元ネタ: http://qiita.com/lovee/items/9701151633d61e7ed4e3
Cognos Analyticsのバージョンアップ時に構成ファイルのカスタマイズを維持する

##概要
Cognos BIにFixPackを適用した際に、index.html,default.htm,system.xmlなど、カスタマイズしていた色々なファイルがデフォルトに戻ってしまう事を経験された方は多いと思います。

こちらのビデオを見ていたところ、Cognos Analyticsの11.0.6から、バージョンアップ時に維持したいファイルやフォルダを指定できるという情報がありましたので紹介します。
**How to upgrade your version of Cognos Analytics**
https://www.youtube.com/watch?v=r4UOCNPyyG4

##内容
ちなみにCognos Analyticsでは、Cognos BIと違い、バージョンアップ(アップグレード)は上書きインストールで行います。
**例1：Cognos BIで10.2.2 にFixPackを適用する場合**
FixPackのモジュールを用意し、FixPackのインストーラーの中で、既存のCognos BIが導入されているパスを指定し、FixPackの適用を行います。
何もCognos BIが導入されていない環境に、FixPackから直接インストールを行う事はできません。

**例2：Cognos BIで10.2 → 10.2.2の場合**
Cognos BI 10.2をアンインストール、Cognos BI 10.2.2を新規インストール、となります。

**例3：Cognos Analytics 11.0.5 → Cognos Analytics 11.0.6の場合**
Cognos AnalyticsにはFixPackはありません。
Cognos Analytics 11.0.5が導入されている環境を11.0.6にバージョンアップしたい場合、Cognos Analytics 11.0.6のモジュールを用意し、インストーラーの中で11.0.5が導入されているパスを指定し、上書き導入でバージョンアップを行います。
もちろん、何もCognos Analyticsが導入されていない環境に、Cognos Analytics 11.0.6のモジュールから直接インストールを行う事は可能です。

さて、本題ですが、Cognos Analyticsでは、以下のように\<CA_Install>\configuration\preserveというフォルダの配下に、.ca_base_preserve.txtというファイルと、preserve.txtというファイルが存在します。
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/ed887d66-5a48-6a0c-8981-adbf99c8da17.png)

.ca_base_preserve.txtファイルを見ると、以下のように、アップグレード時に維持されるフォルダやファイルの一覧がリストされています。
しかしながら、このファイルを編集してはいけません。
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/0804720c-401c-f006-874a-b608680505bf.png)

アップグレード時に維持したいファイルを追加したい場合、preserve.txtファイルの方に記載します。
画像は初期状態のpreserve.txtファイルです。
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/e5e920b3-1d85-08cf-4959-8a6cdb178046.png)

ちなみに、11.0.5まではアップグレード時にどのファイル・フォルダが維持されるかは、マニュアルに明記されています。
**Preserved files and folders when upgrading Cognos Analytics**
https://www.ibm.com/support/knowledgecenter/en/SSEP7J_11.0.0/com.ibm.swg.ba.cognos.inst_cr_winux.doc/c_ca_upgrade_latest.html

以上、簡単ですがご紹介まで。
アップグレード時に思いがけずファイルのカスタマイズ内容が消えないように、是非ご活用下さい。
Swift ログ関数を定義

NSLogみたいに出力したいけど、出力の頭に入る文字を短く（時間だけに）したい。
SwiftとObjective-Cで同じ出力にしたい。

## Swift側

デバッグビルドの設定で`Swift Compiler - Custom Flags` > `Other Swift Flags` に `-D DEBUG` を設定。

```swift:ログクラス
public class Log: NSObject {
    public static let instance = Log()
    
    private override init() {
        dateFormatter = DateFormatter()
        dateFormatter.locale = Locale.init(identifier: "en_US_POSIX");
        dateFormatter.dateFormat = "HH:mm:ss.SSS"
    }
    
    public func print(text: String) {
        #if DEBUG
            semaphore.wait()
            defer {
                semaphore.signal()
            }
            
            let dateString = dateFormatter.string(from: Date())
            Swift.print("[\(dateString)] \(text)")
        #endif
    }
    
    public func print(format: String, arguments: CVarArg...) {
        #if DEBUG
            print(format: format, arguments:arguments)
        #endif
    }
    
    public func print(format: String, arguments: [CVarArg]) {
        #if DEBUG
            let logLine = String.init(format: format, arguments: arguments)
            print(text: logLine)
        #endif
    }
    
    private let semaphore = DispatchSemaphore(value: 1)
    private var dateFormatter: DateFormatter
}
```

```swift:便利関数
public func LOG(_ text: String) {
    #if DEBUG
        Log.instance.print(text: text)
    #endif
}

public func LOG(_ format: String, _ arguments: CVarArg...) {
    #if DEBUG
        Log.instance.print(format: format, arguments: arguments)
    #endif
}
```

## Objective-C側

```objc:ログ関数
void _log_print(NSString* format, ...);

#import <MODULE-Swift.h>

void _log_print(NSString* format, ...)
{
	va_list args;
	va_start(args, format);
	NSString* text = [[NSString alloc] initWithFormat:format arguments:args];
	va_end(args);
	
	[[Log instance] printWithText:text];
}
```

```objc:prefixヘッダーでNSLog再定義
#if !DEBUG
#define NSLog(...)
#else
#define NSLog(...) _log_print(__VA_ARGS__)
#endif
```
フッターを最下部に固定

# よくあるフッターを最下部に固定する処理

フッターを固定するために、htmlとbodyタグの高さを100%にして、その中に最低100%の高さになる箱を作って、そこの最下部にフッターが来るよう調整したうえで、コンテンツの下に余白を持たせるなどという処理が書かれます。

あるとき、body直下のその箱いらなくね？bodyに箱の役割持たせればよくね？っと思って実装したらうまくいったものの、毎度そのコードを見つけに行くのが面倒になったので、ここにメモとして置いておきます。

# やっていること

フッターを最下部に固定するための肝となる箱は、主に以下のスタイルかと思います。

```
min-height: 100%;
height: auto !important;
height: 100%;
position: relative;
```

これをそのままbodyタグに持っていくだけです。

後はコンテンツとフッターをbodyタグ直下に書けばそのまま使えます。

普通に固定したい場合は階層が一段階減ってうれしいです。

# コード

フッターの高さは20pxでfooterタグとし、コンテンツはその高さ分下にpaddingが設定してあるarticleタグを使った実装例が以下です。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title></title>
<style>
html{height:100%;}
body{margin:0;padding:0;min-height:100%;height:auto !important;height:100%;position:relative;}
article{padding-bottom:20px;}
footer{position:absolute;width:100%;height:20px;bottom:0;text-align:center;overflow:hidden;}
</style>
</head>
<body>
	<article>contents</article>
	<footer>Copyright &copy; 20XX YOURNAME All Rights Reserved.</footer>
</body>
</html>
```
クレジットカード情報のバリデーション


```
VALID_CARD_NUMBER_REGEX = /^\d{14,16}$/                                                                                                                                                                
VALID_NAME_REGEX = /^[A-Z]+ [A-Z]+$/                                                                                                                                                                   
VALID_YAER_REGEX = /^\d{2}$/                                                                                                                                                                           
VALID_MONTH_REGEX = /^\d{2}$/                                                                                                                                                                          
VALID_CVV_REGEX = /^\d{3,4}$/ 
```

Payment Gatewayで有効性確認を取る手前のバリデーションなので雑に。

## Railsに怒られる問題
Railsにおいて `^` や `$` をバリデーションに使うと怒られるので `\A` `\z` を使用するようにする。
詳しくは [Railsの正規表現でよく使われる \A \z って何？？ - Qiita](http://qiita.com/jnchito/items/ea7832df6f64a9034872)

```
VALID_CARD_NUMBER_REGEX = /\A\d{14,16}\z/                                                                                                                                                                   
VALID_NAME_REGEX = /\A[A-Z]+ [A-Z]+\z/                                                                                                                                                                      
VALID_YAER_REGEX = /\A\d{2}\z/                                                                                                                                                                              
VALID_MONTH_REGEX = /\A\d{2}\z/                                                                                                                                                                             
VALID_CVV_REGEX = /\A\d{3,4}\z/ 
```

## 参考
- [クレジットカード全般のバリデーション | 私的雑録](http://php.o0o0.jp/article/php-creditcard)
- [Finding or Verifying Credit Card Numbers](http://www.regular-expressions.info/creditcard.html)
- [active_merchant/credit_card_methods.rb](https://github.com/activemerchant/active_merchant/blob/d0bef05c7510a250ae395aa65c93eaa162d6753a/lib/active_merchant/billing/credit_card_methods.rb#L5)
- [internationalization - Credit Card validation: can Card Name contain non-ASCII characters? - Stack Overflow](http://stackoverflow.com/questions/2004532/credit-card-validation-can-card-name-contain-non-ascii-characters)
WKWebViewを使ってロード後に表示したコンテンツサイズが取得できない

WKWebViewを使ってロード後に表示したWebコンテンツのサイズ取得したいだけなのに読み込み終わっても取得できなく困った末に苦肉の策で解決？した時の備忘録

```swift:Swift
open func load(_ request: URLRequest) -> WKNavigation?
```
URLを指定してWebをロードを行い、

```swift:Swift
optional public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)
```
このdelegateで`webView.scrollView.contentSize`を見ると取得できていない・・・

`open func viewDidAppear(_ animated: Bool)`や`open func viewDidLayoutSubviews()`
でも取得できるか試したが取得できない・・・

仕方なく
WKWebViewのメンバーのUIScrollViewをgetし`UIScrollViewDelegate`を設定して
`optional public func scrollViewDidScroll(_ scrollView: UIScrollView)`を受けるように追加
※ここでは`scrollView.contentSize`が取得できている

ただし、何度も呼ばれるメソッドなので、ここで何かの処理をするのには不向き。
何か他に方法を考えたいところ。