OmniAICreator/Qiita-1.07M huggingface dataset:
Slim 3 Framework のGET，POSTパラメータを利用しやすい形にする．

# はじめに

PHPは好きでも嫌いでもないけど，触れてから早3年経ちました．
Webアプリケーション開発を行う際，私はよく[Laravel](https://laravel.com/)を利用しています．

ですが，開発規模が小さい場合，フルスタックフレームワークのLaravelを使うのはオーバースペックだったりします．
そこで，目をつけたのは軽量フレームワークの[Slim3](https://www.slimframework.com/)です．

必要な機能は後から注入していけばいいので非常に使い勝手が良いです．

# 本題

さて，本題です．

このSlim3ですが，Laravelを使ってきた私からすると，
GETやPOSTのパラメータへアクセスするのに手間がかかるのが何とも言い難い気持ちになります．

ちなみに[公式](https://www.slimframework.com/docs/objects/request.html)によるGET，POSTへのアクセス方法は以下の通りです．

``` php
$app->map(['GET', 'POST'], '/test', function ($request, $response, $args) {
    // GET
    $getParams = $request->getQueryParams();
    // POST
    $postParams = $request->getParsedBody();
    // 値の取り出し
    foreach($getParams as $key => $param){
      echo $param;
    }
});

$app->run();

```

## 解決策の提案


Slim3は[Middleware](https://www.slimframework.com/docs/concepts/middleware.html)の概念を取り入れています．

そこで，Middlewareを使ってパラメータを取り出しやすい形に加工しましょう．

``` php

// ミドルウェア
$mw = function($req, $res, $args){
        $params = [];
        $params['get'] = $req->getQueryParams();
        $params['post'] = $req->getParsedBody();
        
        // 連想配列をオブジェクトに変換して，'params'というkeyに登録
        $req = $req->withAttribute('params', json_decode(json_encode($params)));

        $response = $next($req, $res);
        return $response;
};

// App
$app->map(['GET', 'POST'], '/test', function ($request, $response, $args) {
    // 'params'の取得
    $params = $request->getAttribute('params');
    // GET parameters
    $getParams = $params->get;
    // POST parameters
    $postParams = $params->post;
    // 値の取り出し
    echo $getParams->test;
})->add($mw);

$app->run();

```

## 終わりに

関数を呼び出すよりはまともになったのではないでしょうか．
もっといい呼び出し方があればいいのですが，現状はミドルウェアをうまく利用していくのがいいのかと思います．

また，今回は`json_decode(json_encode($params))`により連想配列をオブジェクトへ変換していますが，連想配列のままでいい人はこれを付けない形にすれば大丈夫です．

以上!

Dependency Injection って響きが好き
ActiveRecordで一意データのみカウントするクエリの速度計測

#前提
Userモデルが以下の状態

レコード数：105100データあった場合
カラム数：20
インデックス：id
rails consoleで実施

##1.　User.distinct.count

```
User.distinct.count
**(38.2ms)**
SELECT DISTINCT COUNT(DISTINCT "user"."id") FROM "users"
=> 105100
```

####一番シンプルな書き方だと思いますが、全件検索してカウントしているで速度が出ません

##2. User.uniq.count
~~User.uniq.count
**(36.2ms)**
SELECT DISTINCT COUNT(DISTINCT "user"."id") FROM "users"
=> 105100~~
####※ActiveRecord::QueryMethods#uniqはRails5.0より非推奨となっており、次の警告が発生します。

```
DEPRECATION WARNING: uniq is deprecated and will be removed from Rails 5.1 (use distinct instead)
```

####そのため、以降はActiveRecord::QueryMethods#distinctを使用する様になります。

##3. User.count('DISTINCT id')
User.count('DISTINCT id')
**(33.3ms)**
SELECT COUNT(DISTINCT id) FROM "users"
=> 105100

####SQL実行時にインデックス対象のテーブルにアクセスする必要がないので高速になる

##4. User.group(:id).pluck(:id).count
User.group(:id).pluck(:id).count
**(289.5ms)**
SELECT "users"."id" FROM "users" GROUP BY "users"."id"
=> 105100

#### ~~予想外の遅さ。idにインデックス貼ってるのになぜ？？~~

####DBアクセスの結果105100件に対してRubyでカウントしている為、遅くなります。

#動作環境
Ruby 2.3.1
Rails 4.2.7
DB:PostgreSQL-9.5
JavaScript input属性の列挙について

#始めに
JavaScriptのInput属性を列挙するロジックを書いたときに若干、はまったことを書いてみます

#環境
Google Chrome バージョン: 59.0.3071.115（Official Build） （64 ビット）

#やりたいこと
```html
<input type='text' id='testid' size='30'/><br>
<input type='text' id='testid2' size='30'/><br>
<input type='hidden' id='testid3' value='test'/>
<input type='button' value='実行' onclick='g()'/>
```
という入力フィールドがあったとき、
`[testid=入力値,testid2=入力値,testid3=入力値・・・・]`
というように
"id名=入力値"
という組み合わせの配列をできるだけJavaScriptの組み込み関数のみを使ってやってみたい

#やってみたこと
##document.getElementsByTagNameとmapを組み合わせてみる
inputタグの一覧を取得するには
`document.getElementsByTagName(取得したいタグ名)`
ででき、それぞれの要素にアクセスするには
`document.getElementsByTagName(取得したいタグ名)[0]`
という感じでできることが分かった
ならば、

```js
document.getElementsByTagName(取得したいタグ名)
.map(a=>`${a}=${f(a)}`)
```
で一発で変換できるんじゃないかと考え、実行してみた
##エラーが発生する
実行後、コンソールを見ると「map」というfunctionは存在しないというエラーが発生した
mapは配列の関数として定義されているので、「document.getElementsByTagName」の型が配列ではないのは分かったので、実際の型はなんだ、というわけで、typeofで型を調べたら「Object」が帰ってきた
・・・JavaScriptのObjectは添え字に数字を指定してプロパティにアクセスできることをすっかり忘れていた・・（汗）
##Objectのプロパティ一覧とmapとdocument.getElementById属性を組み合わせる
「document.getElementsByTagName」で返ってくる型がObjectだと分かったので、Objectのkey属性の一覧を取得し、その一覧に対して、「map」と「document.getElementById」の組み合わせでやりたいことが実現できそう。
後、Objectのプロパティ一覧には配列のような添え字でアクセスできるようにするためのindexが含まれているので、それらを除外するロジックも併せて書いておく

```my.js
function g(){
    k('input')
    .filter(a=>isNaN(a))
    .map(a=>`${a}=${f(a)}`)
}
function f(str){
    return document.getElementById(str).value;
}
function k(str){
   return Object.keys(document.getElementsByTagName(str))
}
```
関数 g()を実行すると、目的の"id名=入力値"の組み合わせが取得できた

#おわりに
JavaScript、配列とObject型の区別が分かりにくいです
配列とオブジェクトを意識的に分けてロジックを書くとき、この変数が今、Object型なのか配列なのかを意識するのは相当面倒くさいです
Javaプログラミング基礎の練習～switch文

新人の時に作ったプログラムを、2年目になった今はあっさり書けるのか、はたまた忘れてしまっているのか・・
と思ったので、作ってみました。

結論
* とりあえず動くものは作れる（ただしほぼEclipseのおかげ感もある）
* 新人の時は疑問に思わなかったことを、疑問に思う

#問題
* ソースファイル名「Check22.java」
* 2数（整数）と演算方法(1文字）を入力します
* 指定した演算を行い、計算結果を出力します
* 計算方法による処理の分岐はswitch文を使用してください
* その他の詳細は以下の実行結果を参考にしてください

```
1つめの数値を入力してください>
10
2つめの数値を入力してください>
3
計算方法を選択してください>
(a)加算
(b)減算
(c)乗算
(b)除算
d
答えは3です
```

#実装
以下のように作りました。

```Check22.java
package practice;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Check22 {

	public static void main(String[] args) {
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

		String line = null;
		int num1 = 0;
		int num2 = 0;
		try {
			System.out.println("1つ目の数値を入力してください");
			line = reader.readLine();
			num1 = Integer.parseInt(line);
			System.out.println("2つ目の数値を入力してください");
			line = reader.readLine();
			num2 = Integer.parseInt(line);

			System.out.println("計算方法を選択してください");
			System.out.println("(a)加算");
			System.out.println("(b)減算");
			System.out.println("(c)乗算");
			System.out.println("(d)除算");

			line = reader.readLine();
			if (!( line.equals("a")) && !( line.equals("b") )&& !( line.equals("c") )&& !( line.equals("d"))) {
				System.out.println("a,b,c,dのどれかを入力してください");
			}else {
				String symbol = line;
				int answer = calc(num1,num2,symbol);
				System.out.println("答えは" + answer + "です。");
			}
		}catch(NumberFormatException e) {
			System.out.println("数値を入力してください");
		}catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static int calc(int num1, int num2, String symbol) {
		int result;
		switch(symbol) {
		case "a":
			result = num1 + num2;
			break;
		case "b":
			result = num1 - num2;
			break;
		case "c":
			result = num1 * num2;
			break;
		default:
			result = num1 / num2;
			break;
		}
		return result;
	}

}

```

#疑問点
* calcメソッドのswitch文に、breakを書かないとすべての処理が走ってしまう  
 ー最初はbreak;を書いておらず、aを入力しても、全てのcaseの処理を通ってしまって、思った通りの結果になりませんでした。case"a":に入ったら、aのところだけしか処理されないと思っていましたが、break;がくるまで、処理がおわらないことを知りました。（去年はとりあえずbreak;って書いているからbreak;を付けようというノリで書いていた気がします。）
* calcメソッドにstaticをつけないとエラーになる（エラー内容：型Check22の非staticメソッドcalc(int,int,string)をstatic参照することはできません）  
 ー同じクラスにあるメソッドなんだから、staticつけなくても参照できるでしょ！と思っていました。エラー内容そのままですが、staticがついているメソッドは、非staticメソッドを直接使うことができないことを知りました。staticメソッドはインスタンスに関連づいていないところで管理されるので、非staticメソッドから参照しようと思っても、「これどこのインスタンスのメソッドなの？」と判断がつかない状況になるので、コンパイルエラーになるよう。なんとなくわかったような気がします。  
（けどmainメソッドはstaticなメソッドなので、そこからメソッドを参照しようと思ったら全部のメソッドにstaticつけないといけなくなる気がするのですが、どうしたらいいんだろうっていうところが未解決です。）

#感想
* たぶん1年目のころは例外処理とか考えてなかったかも
* 変数名とかメソッド名を考えるのが苦手
Javaの文字列操作での反省

最近業務の中で文字列をちょこっといじる処理を実装したのだが、


```java:Sample.java
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Split {
	public static void main(String[] args) {
　　　　　　　//お題：長さ10の文字列を2文字ずつ、5個のブロックに分割する
	        String sampleString = "0123456789";
	        List<String> splitedStringList = new ArrayList<String>();
	        Matcher m = Pattern.compile("[\\s\\S]{1,2}").matcher(sampleString);
	        while (m.find()) {
	        	splitedStringList.add(m.group());
	        }
	         
	        for (String element : splitedStringList) {
	        	System.out.println(element); //01 23 45 76 89が改行されて表示される
	       }
	}
}

```
正規表現だのなんだのを駆使すれば↑みたいな「パッと見かっこいいことやってそうな」処理が書ける。

というか、最初はそういう実装にした。

split()とかは引数に指定した区切り文字基準なので、「X文字ずつ」という指定ができないからだ。

しかし、後ろを通りかかった現場のリーダーからは

「substring()使えばよくない?」と。

所詮、超単純なルールで文字列を区切るだけなので、それだけで十分。しかし、実装中それを使うという発想は全く出てこなかった。お恥ずかしい。



1つの実装をとっても、処理のパフォーマンス、コードの可読性など考えるべきことはたくさんあるが…

####・単純な処理で実現できるならそれに従う。

####・自分の頭の中の引き出しを増やす&自在に引き出せるようにする。


Javaに限らず、個人的に反省すべき一件でした。
[cocos2d-x] v3.15でControlButtonクラス使用時のビルドエラーへの対応方法

#はじめに
普段からC/C++を触っているので、
最近流行り(?)のUnityやUE4よりcocos2d-xの方が
自分には向いているのでは？と思い最近勉強しています。
そこで躓いたこととかを備忘録がてらまとめていこうと思っています。

現在は「cocos2d-x スマートフォン2Dゲーム 開発講座」という本で勉強しています。
本書で使用しているcocos2d-xのバージョンはv3.0で、
大分最新のバージョンとかけ離れていたので
その辺りの違いにより、エラーが出ているようでした。

#開発環境
Visual Studio 2013
Microsoft .NET Framework v4.7
cocos2d-x v3.15

#現象
CHAPTER03/LESSON14でControlButtonクラスを使用するのですが、
本書に従って cocos-ext.h をインクルードしたところ、エラーが発生しました。

![キャプチャ2.png](https://qiita-image-store.s3.amazonaws.com/0/75533/f71cebc8-5fc2-58f1-e488-57e578ba0374.png)
※赤枠の部分です。

#原因
エラーの内容を見る限り、どうやら extension/ExtensionExport.h へのパスがうまく通っていないようです。
依存関係とか考えるとそのまま素直にパスを通して良いものか。。。

#対応方法
中国語のサイトでしたが、同じことで躓いている人がいました。(※リンク1)
単純にパスを通すだけで良さそうですね。
参考にプロパティページから
[構成プロパティ]->[C/C++]->[全般]->[追加のインクルードディレクトリ]->[<編集...>]を開き、$(EngineRoot) を追加します。
![キャプチャ3.png](https://qiita-image-store.s3.amazonaws.com/0/75533/8c309c72-8975-65ef-e846-baee12a6c9c7.png)

結果、無事ビルド通りました！
![キャプチャ4.png](https://qiita-image-store.s3.amazonaws.com/0/75533/4aeba598-c517-0891-316b-5eaab21bdf8e.png)

#最後に
ネットで調べてみるとこのようなエラーはcocos2d-xでは良くあることらしいです。
勉強になります。
ちょっとしたことですがこういうところで時間取られるの勿体無いので、
気づいたらまとめていこうと思います。

#参考リンク
[(※リンク1)extensions/ExtensionExport.h”: No such file or directory 谁来帮我看一下呢](http://forum.cocos.com/t/extensions-extensionexport-h-no-such-file-or-directory/39310)
コミットサブジェクト（題目）とメッセージ部分を分けるには

# 本題

https://medium.com/@risacan/コミットメッセージの書き方-64aeadd92057
の[2行目に空行を設ける]の節をみて、意外と知らない人多いのかなぁ、と思ったので。

上のリンクでは、`git commit`打ってから、コミットログの編集画面に移行して、コミットメッセージをコミットサブジェクト（題目）とメッセージ部分に分けて書いているが、その時、2行目を空白にする必要があるという旨がかかれている。

これは、実は`git commit`のmオプションを2つ重ねれば同じことができる。
つまり、`git commit -m "short msg" -m "long description"`を使えばよい。

どのように表示されるかは、上のリンクと参考を参照してください:


参考)
https://saraford.net/2017/01/07/how-to-commit-an-optional-extended-description-from-command-line-git-bash-007/
Elasticsearchを使う準備

# ゴール
Elasticsearchのヘルスチェック

# はじめに
- elasticsearchの導入

```.sh
$ brew install elasticsearch
$ echo "export ELASTICPATH=/usr/local/Cellar/elasticsearch/5.5.1/libexec/bin" >> .bashrc
# 起動
$ elasticsearch
# 確認
$ curl localhost:9200
{
  "name" : "MDffy-a",
  "cluster_name" : "elasticsearch_naopon",
  "cluster_uuid" : "Dzj28enNSkyAig0sZkyQZQ",
  "version" : {
    "number" : "5.5.1",
    "build_hash" : "19c13d0",
    "build_date" : "2017-07-18T20:44:24.823Z",
    "build_snapshot" : false,
    "lucene_version" : "6.6.0"
  },
  "tagline" : "You Know, for Search"
}

# cluster nameはここで設定されている
$ vim /usr/local/Cellar/elasticsearch/5.5.1/libexec/config/elasticsearch.yml
# ---------------------------------- Cluster -----------------------------------
#
# Use a descriptive name for your cluster:
#
cluster.name: elasticsearch_naopon

# clusterの確認
$ curl localhost:9200/_cat/health?v
epoch      timestamp cluster              status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1501895954 10:19:14  elasticsearch_naopon yellow          1         1      1   1    0    0        1             0                  -                 50.0%
# indexの確認
$ curl localhost:9200/_cat/indices?v
health status index   uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   .kibana oFN9CZzIRASC5Eww1FFW0Q   1   1          1            0      3.1kb          3.1kb
```

- clusterのstatus

>The cluster health status is: green, yellow or red. On the shard level, a red status indicates that the specific shard is not allocated in the cluster, yellow means that the primary shard is allocated but replicas are not, and green means that all shards are allocated.

https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-health.html

- kibana導入

```.sh
$ mkdir ~/kibana && cd $_
$ wget https://artifacts.elastic.co/downloads/kibana/kibana-5.5.1-darwin-x86_64.tar.gz
$ tar zxvf kibana-5.5.1-darwin-x86_64.tar.gz
$ cd kibana-5.5.1-darwin-x86_64
$ bin/kibana
```
http://localhost:5601/ でアクセス
iPhone上にSwifterでサーバーをたててiPhone内のリソースをサーバーを通して取得

## やりたいこと
iPhoneのWebView内でJavaScriptを実行し、iPhone内のリソースを取得。
（最終目的は[Spine](http://ja.esotericsoftware.com/)のアニメーションをWebView内で、JavaScriptを使って動かすこと。なぜJavaScriptかというと、SpineをSwiftで動かすのがハードルが高すぎるので。）

## 問題点
JavaScriptからはiPhone内のリソースに直接アクセスできない。

## 解決方法
iPhone上に[Swifter](https://github.com/httpswift/swifter)を利用してサーバーを立てて、サーバーを通してファイルを取得。

## コード

```swift
import Swifter

let server = HttpServer()
let bundle = Bundle.main

server.GET["/:file"] = { request in
    print("request: " + request.path)
    let path = NSString.init(string: request.path)
    let pathBundle = bundle.path(forResource: path.deletingPathExtension, ofType: path.pathExtension)
    if pathBundle == nil {
        return .notFound
    } else {
        if let file = try? pathBundle!.openForReading() {
            return .raw(200, "OK", [:], { writer in
                try? writer.write(file)
                file.close()
            })
        } else {
            return .notFound
        }
    }
}

do {
    print("start server")
    try server.start(3000, forceIPv4: true, priority: DispatchQoS.QoSClass.default)
} catch {
    print("cannot start server")
}
```

## 動作確認
Safariで "localhost:3000/{任意のリソースのパス}" にアクセスし
ファイルの中身が表示されることを確認した。
追記2) forceIPv4:true だとアクセスできないかもしれない。Safariで試した時点ではforceIPv4:falseとしていた。

追記1) WebView内でバンドルリソース内のHTMLファイルを表示できた。

## セキュリティ
localhostドメインからのリクエストのみを許可すれば、外からは見えないだろう。（このコードではやってない）
さらに、特定のリソースしか返さないようなロジックを追加すれば、より確実になるはず。
あと、forceIPv4をtrueにしたのはIPv6でダイレクトにアクセスされるのを防ぐ狙い。
セキュリティ的にまずいことがあったら、どなたか教えてくだされ。

## 蛇足
Swiftはじめて１週間に満たないので、美しくないコードを書いているかもしれないので注意してください。
あと、いんたーねっつのことも最近勉強しはじめたので、用語の使い方が間違っているかも。
numpy.timedelta64で時刻データをチェック

例えば５万行の温度データは１０分間隔で収集しているつもりだが， 本当に時刻カラムは１０分間隔なのかをチェックしたいので， `numpy.timedelta64()`関数を使ってチェックすることができる．

```py3
import numpy as np
import pandas as pd

df = pd.DataFrame({
            '時刻': pd.to_datetime(['2017-08-01 01:00:00', '2017-08-01 01:10:00', '2017-08-01 01:20:00', '2017-08-01 01:40:00'])
            ,'温度': [21, 22, 23,24]
})
```
<img width="188" alt="Screen Shot 2017-08-05 at 9.47.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/54698/4ed53be0-301b-057a-90e4-9b8dc8647b59.png">


`i+1`個目と`i`個目の時刻の差は`<class 'pandas._libs.tslib.Timedelta'>
`型で，下のようなフォーマットになっている． 

```
0 days 00:10:00
0 days 00:10:00
0 days 00:20:00
```

時刻の差分を `(delta_tmp / np.timedelta64(1, 'm')).astype(int)`で計算して，整数に変換する．

```py3
for i in list(range(len(df['時刻'])-1)):
    delta_tmp = df['時刻'][i+1] - df['時刻'][i]

    # 時刻の差分は何分あるかを計算してintに変換
    delta_final = (delta_tmp / np.timedelta64(1, 'm')).astype(int)

    if delta_final != 10:
        print(i+1, delta_final)
```

これで１０分間隔のデータではないときに見つかるはず．
visual studioで書いたプログラムが使用するファイルはどこに置くか

#実行環境
この方法で実際に試したのはvisual studio2015,2017ですが、ほかのバージョンでも似たような構造になっていたら行えると思います。(書いたプログラムはC言語ですが、ほかの言語のときも同じ方法かも?)
##手順
**（重要!!) 例えば作成したソリューションの名前がkadaiであり、ソースコードの名前がprogram1で、program1が使用するファイルがdata1.datだとします。**
**手順１**
まずエクスプローラーを開いてkadaiというフォルダーをさがします。
**手順２**
kadaiフォルダーを開くと、program1フォルダーのみの画面に移動するので、今度はprogram1フォルダーを開きます。
**手順３**
今度はDebugフォルダーと、再びprogram1フォルダーがあり、またprogram1.slnというのもありますが、ここではprogram1フォルダーを開きます。
**手順４**
そうすると、Debug,program1.vcxproj,program1vcxproj.filters,program1.cという４つのファイルが表示されていると思いますが、この場所にprogram1が使用するファイルであるdata1.datを置くとprogram1がちゃんと認識します。(datファイル以外でも認識可)
Matplotlibで時系列データをplotする

時系列（time series)データをプロットするメモ


```py3
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline


# 温度データ
df = pd.DataFrame({
    '時刻': pd.to_datetime(['2017-08-01 01:00:00', '2018-08-01 02:00:00', '2019-08-01 03:00:00'])
    ,'温度': [21, 22, 23]
    ,'湿度': [41, 42, 43]
})
```

<img width="225" alt="Screen Shot 2017-08-05 at 8.28.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/54698/ffba7ce5-a9bc-b3a9-1cf5-e20933585e8e.png">

時刻データはpandasのTimestamp型であることを確認

```
type(df_temp.loc[0, '時刻'])
```
結果
`pandas._libs.tslib.Timestamp`


時刻をindexにして， `plt.scatter`でプロットするときにX軸は`df.index`として指定する．

```py3
df = df.set_index('時刻')
plt.scatter(df.index, df['温度'])
plt.scatter(df.index, df['湿度'])

plt.xticks(rotation=70)

plt.show()
```

<img width="391" alt="Screen Shot 2017-08-05 at 8.36.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/54698/0e82414a-c31d-26b0-a0d3-7ae8c03fd2cc.png">


ソースコード

```py3
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

# 温度データ
df = pd.DataFrame({
    '時刻': pd.to_datetime(['2017-08-01 01:00:00', '2018-08-01 02:00:00', '2019-08-01 03:00:00'])
    ,'温度': [21, 22, 23]
    ,'湿度': [41, 42, 43]
})

df = df.set_index('時刻')
plt.scatter(df.index, df['温度'])
plt.scatter(df.index, df['湿度'])

plt.xticks(rotation=70)

plt.show()
TensorFlow > tf.train.AdamOptimizer() > デフォルト引数 learning_rate=0.001 (論文の推奨値)

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

学習コードv0.1 http://qiita.com/7of9/items/5819f36e78cc4290614e

http://qiita.com/7of9/items/02313f11d2917ed2b040
の続き。

5次元の補間を学習させようとしている。

```py
train_op = slim.learning.create_train_op(loss, tf.train.AdamOptimizer(0.001))
```

AdamOptimizer()のlearning rateを0.001以外でいろいろ試したが、結局のところ0.001が一番良いlossの減少を示す結果となっている。

以下を見つけた。
[Optimizer : 深層学習における勾配法について](http://qiita.com/tokkuman/items/1944c00415d129ca0ee9)
> Adam
...
> 以下の式のように重みを更新していきます。パラメータはα=0.001,β1=0.9,β2=0.999,ϵ=$10^{−8}$が論文内で推奨されています。

https://www.tensorflow.org/api_docs/python/tf/train/AdamOptimizer
においては以下のデフォルト引数になっている (論文の推奨値)。

```py
__init__(
    learning_rate=0.001,
    beta1=0.9,
    beta2=0.999,
    epsilon=1e-08,
    use_locking=False,
    name='Adam'
)
```

learning rateはとりあえずデフォルトを使うことにしよう。

```py
train_op = slim.learning.create_train_op(loss, tf.train.AdamOptimizer())
```
Git リモートリポジトリ 特定コミット地点に遡る

個人開発でもリモートリポジトリとしてGitHubを使っている方はいらっしゃると思います。

今回は誤ったプッシュをしてしまい、修正のための操作を色々行った結果コミットログもマージもややこしくなってしまった...という事態を想定しています。

###できること
- 特定コミットより後のログの全消去
- 特定コミットをmasterブランチのHEAD化

**※チーム開発の際は大惨事となる可能性があるので、この方法は使用しないでください。**
　**また、消去は取り消せないため自己責任でお願いします。**

なお、操作はローカルリポジトリのmasterブランチ上で、コマンドラインからを想定しています。

##手順
###１. 戻したいコミット地点のハッシュ値を調べる

```
git log
```
ハッシュ値というのはコミットごとに振られるIDのようなものです。
b606ffe5f3ad20ce8b9ea3f7fd25d...のような値が見つかると思います。
logコマンドはデフォルトであればlessコマンドと操作が同じなので、ターミナルから捜査している場合はqで戻れます。

###２. HEADを戻したいコミット地点に指定する

```
git reset --hard 先ほど調べたハッシュ値
```
ハッシュ値は同一リポジトリ内で重複が無ければ省略が可能です。
おおよそ上7桁くらい入力すれば問題なく省略が使えると思います。
HEADが変更されたことを示すメッセージが出ればOKです。

###３．強制プッシュ

```
git push -f origin ハッシュ値
```
これで特定コミット地点がmasterのHEADになります。
WEBサーバのROOTディレクトリを動的に取得する方法

以下のコードで動的に、WEBサーバより'/public'の文字列が見つかる場所を特定して、ルートディレクトリ等を取得することができます。

```
＄public_end = strpos($_SERVER['SCRIPT_NAME'], '/public') + 7;
$doc_root = substr($_SERVER['SCRIPT_NAME'], 0, $public_end);
define("WWW_ROOT", $doc_root);
```
gulp-ejsで<%= filename %>が使えない問題の回避策としてgulp-dataを使う

以前のバージョンでは `<%= finename %>` でEJSファイルのパスが取得できたんですが、
いつのまにか（gulp-ejs v3から？）これが取得できなくなって困っていました。

> [EJSでルートへのパス（相対、絶対）を取得して変数化する](http://qiita.com/manabuyasuda/items/6d3cfdf388fa39c023db#filename%E3%81%8B%E3%82%89%E3%83%91%E3%82%B9%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B)

EJSをコンパイルする前に、gulp-data を挟んだら回避できました。

```js:gulpfile.js
let gulp = require('gulp');
let $ = require('gulp-load-plugins')();

gulp.task("ejs", callback => {
  return gulp.src([
    "ejs/**/*.ejs",
    '!' + "ejs/**/_*.ejs"
  ])
  .pipe($.plumber())
  .pipe($.data(file => {
    return {
      'filename': file.path
    }
  }))
  .pipe(
    $.ejs()
    .on('error', $.util.log)
  )
  .pipe($.rename({
    extname: '.html'
  }))
  .pipe(gulp.dest( yourDestDir ));
});
```
SQLまとめ

# SQLの基本

* SQLというのはDBMS（DBを管理するためのシステム）とやり取りするための命令文
* 大文字小文字どちらでも関係ない
* standart SQLは#standart SQLと宣言する
* ASをつけると項目名を変えることができる


# 4大命令（DML）

## SELECT

* SELECT・・・列を取得する命令文
    * SELECT COUNT・・・SELECTで選ばれたレコードの件数を数える
        * COUNT(列名)・・・NULL以外のレコードを数える
        * SELECT COUNT(DISTINCT 列名)(=EXACT_COUNT_DISTINCT)・・・重複を弾いて数える
        * count group by・・・group byのカラム名でグループ分けしてそのカラムごとにカウントする。


```SQL:rei

SELECT 集計キー1, 集計キー2, ..., COUNT(列名1), COUNT(列名2), ...
FROM テーブル名
GROUP BY 集計キー1, 集計キー2, ...
```



* ORDER BY・・・指定した列の値を並び替える
        * ASC・・・昇順
        * DESC・・・降順
* LIMIT・・・先頭から数行だけ取得
* SELECT FROM JOIN ON・・・２つのTABLEを結合する
* SELECT LEFT(カラム名,文字数)・・・左から〜文字を引っ張ってくる
* select max(カラム名)・・・そのカラムの最大値のレコード一つを引っ張ってくる。

```SQL:rei
SELECT 売上明細.伝票番号, 商品.商品コード, 商品.商品名
FROM 商品 JOIN 売上明細
  ON 商品.商品コード = 売上明細.商品コード
```

## UPDATE

```SQL:rei

UPDATE テーブル名
 SET 列名 = 値
 WHERE 対象の行
```
WHERE句がないと全件同じ値が入る

## DELETE

```SQL:rei
DELETE
 FROM テーブル名
(WHERE)
```

WHEREをつけないと全件削除になる

## INSERT

```SQL:rei
INSERT INTO テーブル名
 (列名1,列名2,列名3)
VALUES (値1,値2,値3)
```



# WHERE句

* 処理対象行の絞り込みに使う
    * WHERE句を使わない場合、全ての行が対象に
* SELECT,UPDATE,DELETE文で使用可能
    * INSERT文では使えない
* WHERE句の後は条件式でTRUEかFALSEしか返さないもののみくる

## WHEREで使える演算子

### BETWEEN
### LIKE・・・一部と一致しているかを見る
    * %・・・ついている方に任意の0文字以上の文字列が付いていても良い。
    * _・・・ついている方に任意の一文字が付いていても良い。

```SQL:rei
SELECT * FROM 家計簿
 WHERE メモ LIKE '%１月%'
```

### IN・・・()内のいずれかに該当すると対象になる
    * NOT IN・・・()内のいずれにも該当しないものが対象

```SQL:rei
SELECT *
 FROM 家計簿
 WHERE 費目 IN (値1,値2,値3)
```
### NOT

```sql:rei
SELECT * FROM 家計簿
 WHERE NOT A = 1;
```

WHEREと条件の間に入れてその条件じゃない時を検索してくる。

# NULLについて

* NULLはなにも無いことを表すもので0とは違う。
* =は使えず=の代わりにISを使う。 
    * 式 IS NULL
    * 式 IS NOT NULL

# JOIN

```SQL:rei
SELECT * FROM テーブル名 JOIN テーブル名
```

のように複数のテーブルから値を持ってくることができる。

## EACHについて

EACH 修飾子は、複数のパーティションを使用して JOIN 操作を実行することを BigQuery に知らせるヒントとなります。JOIN の両側が大きい場合に特に便利です。EACH 修飾子は、CROSS JOIN 句では使用できません。

これまで EACH は多くのケースで推奨されていましたが、現在は違います。パフォーマンスを向上させるため、可能であれば EACH 修飾子を付けない JOIN を使うようにします。JOIN EACH は、リソース超過のエラー メッセージが表示されてクエリが失敗した場合に使ってください。

（https://cloud.google.com/bigquery/query-reference?hl=ja）

# サブクエリ（副問い合わせ）

```sql:rei
SELECT name
FROM rei
WHERE item >(
 SELECT item
 FROM rei
 WHERE name = "あばば"
);
```

* サブクエリは()で囲む
* サブクエリは;で終わらせない
* 実行順序はサブクエリが先

## EXISTS句

EXISTS句は存在検査ともいわれ，副問合せによって返されたレコードが一つでもあれば真，一つもなければ偽を返します。毎レコード存在があるかを繰り返し検査する。

![スクリーンショット 2018-04-20 15.43.24.png](https://qiita-image-store.s3.amazonaws.com/0/193389/e8992331-cd6e-e035-ba21-6fa29248c13d.png)


```sql:rei
SELECT 社員コード, 社員名
FROM 社員 AS x
WHERE EXISTS (
    SELECT * FROM 受注
    WHERE 担当コード = x.社員コード
)
```
引用：http://www.sql-reference.com/select/subquery_exists.html

* 担当コードが社員コードと同じものを受注テーブルから持ってくる
* そのレコードの社員コードと社員名をひっぱってくる

# SQLの実行順序について

基本的には実行の順番は段々狭めていくイメージ。

* どのテーブルでとるか
* どの行をとるか
* どう表示するか、集計するか

実際に書くのはselectを一番最初に持ってくる。それ以外は同じ。

## 実行の順序

```
FROM → WHERE → GROUPBY → HAVING → SELECT → ORDERBY
```

## 書く順番

```
SELECT → FROM → WHERE → GROUPBY → HAVING → ORDERBY
```
numpy > np.savetxt()する時の open(OUT_FILE ,'w+') > TypeError: Mismatch between array dtype ('<U11') and format specifier ('%s') > open(OUT_FILE, 'wb+')にする

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

5行の文字列をファイル出力するコード。

```test_170805a.py
import numpy as np

OUT_FILE = 'out_170805.txt'
TEXT = 'hello world'

with open(OUT_FILE, 'wb+') as fhndl:
	hdr = np.array(TEXT).reshape(1,)
	for loop in range(5):
		np.savetxt(fhndl, hdr, delimiter=' ', fmt='%s')
```

このようなコードを実装したのだが、気になったのがopen()を'b'付きでしていること。

テキストなので'b'ではないのでないかと思った。
'b'なしのopen()にすると以下のエラーになった。

```
...
Traceback (most recent call last):
  File "test_170805a.py", line 9, in <module>
    np.savetxt(fhndl, hdr, delimiter=' ', fmt='%s')
  File "/home/yasokada/.local/lib/python3.5/site-packages/numpy/lib/npyio.py", line 1219, in savetxt
    % (str(X.dtype), format))
TypeError: Mismatch between array dtype ('<U11') and format specifier ('%s')
```

以下を見つけた。
https://stackoverflow.com/questions/35372829/numpy-savetxt-resulting-a-formatting-mismatch-error-in-python-3-5
> savetxt opens the file in wb mode, and thus writes everything as bytes.
[クイズ]javascriptと仲良くなるための一歩　第１５話「プロトタイプ継承」

#問題

```js
function MyClass() {}
MyClass.prototype.x = 1;
var obj = new MyClass();
obj.y = 2;

obj.x; //=> 1
obj.y; //=> 2

delete obj.x; //=> ?
obj.x;        //=> ?
delete obj.y; //=> true
obj.y;        //=> undefined
```

:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:
:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:

#答え

```js
function MyClass() {}
MyClass.prototype.x = 1;
var obj = new MyClass();
obj.y = 2;

obj.x; //=> 1
obj.y; //=> 2

delete obj.x; //=> true
obj.x;        //=> 1
delete obj.y; //=> true
obj.y;        //=> undefined
```

プロトタイプ継承したプロパティはdeleteできません。
直感的には、`delete obj.x; //=> false`になりそうですが、
xは削除できていないのに、trueが返ってきます:hugging_face:
VagrantでVM起動に自動でDockerをインストールする



VagrantのProvisionerを使用してVagrant up時に自動でDockerをインストールするように設定します。
※初回のみ実行されます

詳細に関しては公式ドキュメントを参照して下さい
[Docker Provisioner](https://www.vagrantup.com/docs/provisioning/docker.html)

#環境
MacOS 10.12.6 (Sierra)
Vagrant 1.9.7
CentOS 7.3(VM)

#下準備
Vagrantのインストールをしていない場合（でMacの方）は下記ページの下準備を行う。
[MacでVagrant上にdocker環境を構築](http://qiita.com/Manjiii/items/5546cde1ecf532cf2082)

#Vagrantfileを作成
※既に稼働しているVagratに適用する場合は下記手順は必要ありません。

```
#Vagrantfile作成
cd [任意のPATH]
vagrant init

ls -l
#デフォルトのVagrantfileが作成される
```

#Vagrantfileの編集
```
vi Vagrantfile

Vagrant.configure("2") do |config|
  # The most common configuration options are documented and commented below.
 ---略----

config.vm.box = "base"
↓上記の行を以下のように編集
config.vm.box = "bento/centos-7.3" #←は自分の使用したいBoxを指定する
config.vm.provision "docker"       #←がdockerのprovision指定

 ---略----
  # SHELL
end
```

#Vagrant起動、Docker確認

```
vagrant up

#Vagrantに入る
vagrant ssh

#dockerがインストールされていることを確認
docker version

#dockerが起動していることを確認
docker ps
```
※すでに稼働中のVMに適用する場合は

```
vagrant reload --provision
```
で適用する。

これでVMをdestoryしても新しくupする時に自動でインストールされるようになります。

次はdockerでnginxを立てようと思います。
[Vagrant上のdockerでnginxを作成しホストからアクセスする](http://qiita.com/Manjiii/items/bcd2f390391038f890f6)
PukiWiki の文書を Markdown に変換するワンライナー(一部 crowi-plus 仕様)

# 概要

- WESEEK, Inc. で、PukiWiki Plus! から [crowi-plus](http://qiita.com/yuki-takei/items/5df9601039ccfc1df01f) に移行する際に使ったワンライナー
    - みんなでせこせこ「3pages/day」とかのノルマを設けて1週間ほどかけて移行
- Pukiwiki 記法の文書を Markdown に変換する
- Sonots' PukiWiki Plugin の lsx の記法(`#lsx`)は [crowi-plugin-lsx](https://github.com/weseek/crowi-plugin-lsx) の記法に置換

# コード

PukiWiki の文書は予め `pukiwiki.txt` として保存

```
cat pukiwiki.txt | sed -e 's/ \[#[0-9a-z]\+\]$//g' -e 's/^\*\*\*/###/g' -e 's/^\*\*/##/g' -e 's/^\*/#/g' -e 's/^---/        -/g' -e 's/^--/    -/g' -e 's/^\(\s*\)-\([^ ]\)/\1- \2/g' -e 's/&br;/<br>/g' -e 's/^#pre{*/```/g' -e 's/^}}*/```/g' -e 's/%%/~~/g' -e "s/^\#lsx/`echo -ne '\u0024'`lsx()/g" | less
```

## コード詳細

- 末尾のハッシュを削る
    - `-e 's/ \[#[0-9a-z]\+\]$//g'`
- 見出しを # に変更
    - `-e 's/^\*\*\*/###/g' -e 's/^\*\*/##/g' -e 's/^\*/#/g'`
- リストの `--/---` を `\t\t-/\t-` に変換する
    - `-e 's/^---/        -/g' -e 's/^--/    -/g'`
- `-`の後が空白じゃない場合はスペースを一つ入れる
    - `-e 's/^\(\s*\)-\([^ ]\)/\1- \2/g'`
- `&br;` を `<br>` へ変換する
    - `-e 's/&br;/<br>/g'`
- `#pre{{` を ` ``` ` に変換する
    - `-e 's/^#pre{*/```/g'`
- `}}` を ` ``` ` に変換する
    - `-e 's/^}}*/```/g'`
    -     - `#pre{{` の閉じタグ以外(`#table_edit2`など)でも使われているが、とりあえず一律変換
- 打ち消し線 は、`%%` を `~~` に変換する
 - `-e 's/%%/~~/g'`
- ` #lsx ` を `$lsx()` に変換する
    - ``` -e "s/^\#lsx/`echo -ne '\u0024'`lsx()/g" ```

## Lisence

- Public Domain
- 編集リクエスト歓迎
Runnableは別スレッドで実行するためだけのインタフェースではなかったと気づきました

#はじめに
テスト用クライアントアプリで、定義ファイルの内容を順に送信するだけでなく、複数同時に送信する必要が生じた。別々のスレッドで処理するための`Runnable`実装クラスをリストに入れてそれらを別スレッドで実行するような実装をした時、これをそのまま順に実行すれば順次実行となることに気づきました。

#目次
1.はじめに
2.目次
3.いまさらながら
4.おわりに

#いまさらながら
`Runnable`は別スレッドで実行する処理の起点としてしか使ったことがありませんでしたが、そのまま`run()`メソッドを呼び出せば同じスレッドで処理が行われるということにいまさらながら気づいたということです。

```java:Runner.java
	public void start() {
		List<Runnable> runnables = new ArrayList<>();
		for (String line : getLines()) {
			runnables.add(createRunnable(line));
		}
		
		log.debug("同一スレッド順次実行");
		runnables.forEach(r -> r.run());

		log.debug("複数スレッド同時実行");
		runnables.forEach(r -> new Thread(r).start());
	}

	private String[] getLines() {
		return new String[] {
			"Hello",
			"Hi",
			"How are you",
			"Bye"
		};
	}

	private Runnable createRunnable(String line) {
		// lineの内容によって実行する処理が異なる的な
		if (line.length() < 5) {
			return () -> process(line, "***");
		}
		else {
			return () -> process(line);
		}
	}

	private void process(String line) {
		log.debug(Thread.currentThread().getId() + ": "+ line);
	}

	private void process(String line, String deco) {
		process(deco + line + deco);
	}
```

#おわりに
最近ようやくJava8を触るようになり、勉強中です。携わってきたプロジェクトの都合によりこれまでずっとJava6で開発していました。これまでのクラス設計の考え方を転換しないといけませんね。
docker掃除によく使うコマンド

#　内容
コンテナやイメージがたくさん溜まった時に面倒になってよく使うコマンド

- \<none>のイメージを削除する
`docker images | awk '/<none/{print $3}' | xargs docker rmi`

- exitedのコンテナを削除する
`docker rm $(docker ps -a --filter 'status=exited' -q)`

- 使っていないイメージを削除する
`docker image prune`

- 使っていないコンテナを削除する
`docker container prune`

- 使っていないvolumeを削除する
`docker volume prune`
vscodeとanacondaの連携に関する自分用メモ

# vscodeとanacondaの連携メモ
VScodeでanacondaで作成した環境のpythonを使用する自分用メモ．

anaconda，vscodeはインストール済み，anacondaでpython3.6環境を構築済み．

## vscodeでデバッグ可能にする
setting.jsonに
```
"python.pythonPath": "(anaconda環境のpython.exeの絶対パス)",
```
を追加する．

## 統合ターミナルでanacondaのpythonを使う
anaconda環境に入るbatファイルを作成．batファイルでactivateまで行う．

```
%windir%\system32\cmd.exe "/K" C:\Users\(ユーザー名)\Anaconda3\Scripts\activate.bat C:\Users\(ユーザー名)\Anaconda3\envs\(環境名)
```

次にsetting.jsonに以下の内容を追加する．

```
"terminal.integrated.shell.windows": "(batファイルの絶対パス)"
```

vscodeを起動すると統合ターミナルではactivateされた状態で起動される．
Lua で数値の型チェック（整数なのか浮動小数点なのかを判定する方法）

# この文書の目的
Lua の関数において、引数として渡された値が整数であることを確認したい場合がたまにあります。そのような場合に使える、isInteger 関数の実装方法について説明します。全く同様の仕組みで、実数値のときのみ true を返す isReal 関数についても紹介します。

# 動作確認した Lua のバージョン
Lua-5.3.4。本文書で使用する機能は基本的なもののみですので、最近の Lua であれば動くと思います。

# しくみ
引数が数値であるか否かは type 関数で判断できます（数値ならば number という文字列が返ります）。これを利用し、文字列などのデータ型との区別ができます。

```lua:ex_type.txt
> type(1)
number
> type(1.1)
number
> type("1")
string
```

問題となるのは、整数値であるか浮動小数点値であるかの判断ですが、これは 1 で除算した余りを用いて判断できます。もちろん、1.2 など、小数点以下に値を持つ場合は余りが 0 になりません。

```lua:ex_isInteger_check1.txt
> 1.2 % 1
0.2
> 1 % 1
0
```

剰余を使った方法で完全かといえば、そうではありません。問題は、1.0 など、値としては整数値であるが、表記としては浮動小数点値をとっている場合です。幸い、1.0 を 1 で割った余りは 0.0 となりますので、得られた剰余を空文字列と連結させて文字列化し、文字列 "0" と比較すれば isInteger 関数を実現できます。

``` lua:ex_isInteger_check2.txt
> 1.0 % 1
0.0
> 1.0 % 1 .."" =="0"
false
```

# コードの例
関数の引数として、整数が渡された場合には true を、浮動小数点値や文字列その他の値が渡された場合には false を返す、isInteger 関数を以下に示します。

```lua:isInteger.lua
function isInteger(inVal)
    if type(inVal)~="number" then
        return false
    else
        return inVal%1 ..""=="0"
    end
end
```

使用例

```lua:ex_isInteger.txt
> isInteger(1)
true
> isInteger(1.2)
false
> isInteger(1.0)
false
> isInteger("1")
false
```

全く同様にして、浮動小数点値だったら true を返す isReal 関数も以下のように実装できます。

```lua:isReal.lua
function isReal(inVal)
    if type(inVal)~="number" then
        return false
    else
        return inVal%1 ..""~="0"
    end
end
```

こちらも使用例を。

```lua:ex_isReal.txt
> isReal(1.0)
true
> isReal(1)
false
> isReal(1.1)
true
> isReal("1.1")
false
```

# まとめ
本文書では、整数値と浮動小数点値で、1 で割った余りが異なることを活用して、渡された値が整数であるかどうかを判定する方法を紹介しました。具体的な実装例では、文字列化することにより、1 と 1.0 を区別しました。
Ext.MessageBoxのボタン(ok,yes,no,cancel)の順番を変える

ExtJSのMessageBoxでは、OK,Yesボタンが左、No,Cancelボタンが右の順で並ぶようになっています。
これを、No,Cancelボタンが左、OK,Yesボタンが右の順になるように変更してみます。

`Ext.window.MessageBox` をオーバーライドします。

```js:/overrides/window/MessageBox.js
Ext.define('MyApp.overrides.window.MessageBox', {
    override: 'Ext.window.MessageBox',

    /**
     * MessageBoxのボタンの並び順を変更
     * (No,Cancelが左、Yes,OKが右)
     */

    /**
     * Button config properties
     * Defaults to:
     *   OK: 1,
     *   YES: 2,
     *   NO: 4,
     *   CANCEL: 8,
     *   YESNO: 6,
     *   OKCANCEL: 9,
     *   YESNOCANCEL: 14,
     */
    OK: 8,
    YES: 4,
    NO: 2,
    CANCEL: 1,
    YESNO: 6,
    OKCANCEL: 9,
    YESNOCANCEL: 7,

    /**
     * buttonIds
     * Defaults to: ['ok', 'yes', 'no', 'cancel']
     */
    buttonIds: [
        'cancel', 'no', 'yes', 'ok'
    ],

    /**
     * onClose
     * Defaults to: cancel button is specified as 'msgButtons[3]'
     */
    onClose: function() {
        var btn = this.msgButtons['cancel'];
 
        if (btn) {
            this.btnCallback(btn);
        }
    }
});
```

`buttonIds`で並びが決まっているのでこれを逆順にします。
それに合わせてボタンコンフィグプロパティのOK,YES,NO,CANCEL, ・・・の値も変更しています。
`buttonIds`の1番目のボタンを表すプロパティが1(0001)、
2番目が2(0010)、3番目が4(0100)、4番目が8(1000) となるようにします。

さらに、onCloseメソッドも修正しています。
メッセージボックスの閉じるボタンが押された時には
cancelボタンが押されたときのコールバック関数が呼ばれるようになっているのですが
なぜかcancelボタンへの参照が
`msgButtons[3]` (つまり`buttonIds`の4番目のボタン) と記述されています。
これではボタンの順番と共に閉じるボタンを押した時の振る舞いまで変わってしまうので、
常にcancelボタンのコールバック関数に流れるようにするための修正です。

(変更前)
![OK,Yesボタンが左、No,Cancelボタンが右のメッセージボックスのキャプチャ](https://qiita-image-store.s3.amazonaws.com/0/8029/3cadf2ed-490c-0e8b-648f-0f2ac582edb5.png)

こうなりました ↓

(変更後1)
![No,Cancelボタンが左、OK,Yesボタンが右のメッセージボックスのキャプチャ](https://qiita-image-store.s3.amazonaws.com/0/8029/10f786dd-93a4-43fe-9ca5-d39c3b481693.png)


ついでに、OK,Yesボタンが強調されて見えるようにスタイリングしてみます。
先程のoverrideに↓を追記します。

```js:/overrides/window/MessageBox.js
    defaultHighlightButtons: ['yes', 'ok'],

    initComponent: function(cfg) {
        var me = this,
            highlightButtons = cfg && cfg.highlightButtons
                                || me.defaultHighlightButtons;

        me.callParent();

        /**
         * 指定されたボタンが目立つようにスタイリング
         */
        Ext.each(me.buttonIds, function(id) {
            var ui = (id === 'cancel') ? 'plain-toolbar' :
                        highlightButtons.indexOf(id) === -1 ? 'default-toolbar' :
                        'default';
            me.msgButtons[id].setUI(ui);
        });
    }
```
元々全てのボタンの`ui`が'default'で背景色がついています。
強調するボタン以外の`ui`を'default-toolbar'にして背景色を薄く、
cancelボタンは`ui`を'plain-toolbar'にして更に薄く枠線もないスタイルにしてあります。
(今回はちょうどいいのがあったので既存のuiで指定しましたが、もっとカスタマイズしたければ
`@mixin　extjs-button-small-ui`を利用してuiを自作できます。)

デフォルトではOK,Yesボタンが強調されますが、`highlightButtons`コンフィグオプションで指定すれば
Noボタンを強調することもできるようになっています。


最終的にはこうなりました ↓

(変更後2)
![No,Cancelボタンが左、OK,Yesボタンが右でスタイリングされたメッセージボックスのキャプチャ](https://qiita-image-store.s3.amazonaws.com/0/8029/3f050183-d910-bf38-cb47-8d1c40d03253.png)

なかなかいい感じに仕上がったのではないでしょうか。


(RowEditorのupdate, cancelボタンの順番を変える方法は [こちら](http://qiita.com/yamayamayamaji/items/0f2b39f5c1c759b8a25d "Ext.grid.plugin.RowEditingのupdateボタンとcancelボタンの順番を変える") を参照)
Windows10の初回ログイン時のアニメーションを表示させなくする方法

# 概要
Windows10から初めてログインすると結構キツイ配色に「ようこそ」とか表示されている画面をしばらく見させられる。
通常の環境であれば1回見るだけで済むけど、環境復元が掛かっているような環境だと毎回見せられるのでうざい。

# 初回ログイン時の画面を表示しないようにする
グループポリシーエディタにて設定を変更する。
これをすることで、なんとなくログインが速くなったような感じもする。

* コンピューターの構成
    * 管理用テンプレート
        * システム
            * ログオン
                * 初回サインインのアニメーションを表示する: 無効
Windows10のカスタムした既定のプログラムをデフォルト設定にする方法

既定のプログラム設定はCopyProfileでデフォルト設定されないため、以下の方法で設定する。

## 設定方法
### 既定のプログラム設定
既定のプログラム設定を普通にカスタマイズする。

### 設定コマンド実行
以下のコマンドPowerShell上で実行する。

```ps1:PowerShell(Administrator)
Dism /Online /Export-DefaultAppAssociations:C:\AppAssoc.txt
Dism /Online /Import-DefaultAppAssociations:C:\AppAssoc.txt
del C:\AppAssoc.txt
```
#### 注意点
Windows10 1709にKB4074588及びKB4058258が適用されている環境では、Exportに[失敗する模様](https://social.technet.microsoft.com/Forums/en-US/5161bd23-733e-4e2f-a500-d652fc23b81d/the-current-user-associations-could-not-be-exported-to-file-error-0x80004002-it-is-no-longer?forum=win10itprosetup)。
実際に失敗したので、インストールされていた"KB4074588"をアンインストール※したらエクスポートが出来たことを確認。
※KB4058258は適用されていない環境。
該当プログラムはWSUSもしくは[Show or hide updates](https://blogs.technet.microsoft.com/jpsecurity/2015/07/30/windows-10-windows-update-12/)トラブルシューターを利用して拒否しておくと良い。
MacユーザがLaTeXでPDFにMSフォントを埋め込む方法

某研究会に原稿を投稿する際、MS明朝とMSゴシックを埋め込めと指定があったので設定しました。
ただし、LaTeXを使って作る全ての書類がダサいMSフォントになるのは勘弁なので、**ファイルごとにフォントを変えられる設定をします**。

## 環境
- OS: macOS Sierra
- Tex ディストリビューション: TexLive (2016)
- TeXエンジン: pLaTeX

今回はエディタには非依存ですが、参考までにTexPadを紹介しておきます。めちゃくちゃ便利なTex用エディタです。
[Texpad · Smoothest way to write LaTeX](https://www.texpad.com/)

## はじめに
日本語フォントは、フォントマップと呼ばれるマップファイルに、文書中の明朝体とゴシックをどのフォントファイルを対応づけるか記述して指定しているようです。
どのフォントマップを利用してフォントを埋め込むかは、
`sudo kanji-config-updmap-sys status`
で確認できます。ただし、これはdvipdfmxを利用して生成される全てのPDFに適応される設定です。
フォントマップの中身は、デフォルトで設定されているipaexのマップファイルptex-ipaex.mapなら以下のようになっています。

```map:ptex-ipaex.map
rml H :0:ipaexm.ttf
gbm H :0:ipaexg.ttf
rmlv V :0:ipaexm.ttf
gbmv V :0:ipaexg.ttf
```
つまりrmlは明朝体、gbmはゴシックの指定です。この例なら、明朝体はipaexm.ttf、ゴシックはipaexg.ttfというフォントファイルとマッピングされています。
HとVは、何を意味するか知らなくてもフォント埋め込みできたので調べてないです。

MSフォントを埋め込むフォントマップはデフォルトでTexLiveにあります。
`/usr/local/texlive/2016/texmf-dist/fonts/map/dvipdfmx/jfontmaps/ms/`の中です。
4種類ありますが、どうやらpLaTeXではptex-ms.mapを使うようです。

```map:ptex-ms.map
rml	H	:0:msmincho.ttc
rmlv	V	:0:msmincho.ttc
gbm	H	:0:msgothic.ttc
gbmv	V	:0:msgothic.ttc
```

ちなみに、自分でマップファイル作った時は、`/usr/local/texlive/texmf-local/fonts/cmap/`に入れて、`sudo mktexlsr`を実行すればいいみたい。

## Texファイルへの記述
Texファイルのプリアンブルで、dvipdfmxに対してMSフォントを埋め込むフォントマップを指定します。

```TeX:sample.tex
\AtBeginDvi{\special{pdf:mapfile ptex-ms.map}}
```
このように書くだけです。

## フォントファイルの設置
これだけでは、MS明朝とMSゴシックのフォントファイル(msmincho.ttcとmsgothic.ttc)が見つからないと言われることがあります。その時は、`/usr/local/texlive/texmf-local/fonts/truetype/`の中にフォントファイルをぶち込みましょう。ディレクトリtruetypeがない場合は`mkdir`で作りましょう。

ちなみに、`/usr/local/texlive/2016/texmf-dist/fonts/`の下に置かないのはTexLiveのアップデート時に消されないようにするためです。

フォントファイルは、MicrosoftOfficeをインストールする時にフォントも一緒にインストールしている場合は、Macがシステムで管理しているフォントフォルダ内にあるはずです(場所は調べてください)。私の場合は、MicrosoftOfficeはインストールしたものの、フォントをシステムにインストールしていなかったので少し面倒でした。その場合は、MS明朝は`/Applications/Microsoft\ Word.app/Contents/Resources/Fonts/msmincho.ttc`に、MSゴシックは
`/Applications/Microsoft\ Word.app/Contents/Resources/DFonts/msgothic.ttc`にあります。

Finderからでも、ApplicationsフォルダでWord.appを右クリック(Ctl+クリックまたはトラックパッドを二本指クリック)して「パッケージの中身を表示」でたどり着けます。あと、WordじゃなくてもExcelでもPowerPointでもOK。

最後に、更新のためのコマンドを実行します。
`sudo mktexlsr`

## 埋め込まれたことの確認
Adobe Acrobat ReaderでPDFを開いて、ファイル＞プロパティ＞フォントを見てください。所望のフォントが「埋め込みサブセット」となって入れば埋め込み成功です。
Windowsにて自動ログインさせる方法

# 概要
エンドユーザーからの要望として、よく「パソコン起動時に自動でログインするようにして欲しい！」というものが挙がる。
もちろんセキュリティ的にとても宜しくないけど、それでもやって欲しいというのだからしょうがない。


# 方法1:GUIで設定する
レガシーな方法。最近のOSでまともに動かないと思う。

```bat:ファイル名を指定して実行
control userpasswords2
```
もしくは

```bat:ファイル名を指定して実行
etplwiz
```

# 方法2:レジストリで設定する
方法3を知るまで利用してきた方法。
なぜかうまく動かない時もあったりして不安定だけど、バッチファイルで配布できるので便利でした。


```bat:Cmd
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "AutoAdminLogon" /t REG_SZ /d "1" /f
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "DefaultUserName" /t REG_SZ /d "ユーザーID" /f
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "DefaultDomainName" /t REG_SZ /d "ドメイン名 | ホスト名" /f
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "DefaultPassword" /t REG_SZ /d "パスワード" /f
```
参考リンク https://support.microsoft.com/ja-jp/help/324737/

# 方法3:ツールを使用する
[AutoLogon](https://technet.microsoft.com/ja-jp/sysinternals/autologon.aspx)というMS謹製ツールを使用する。
インストール不要、GUIでもコマンドラインでも使えるのが魅力的。最近はこれを利用しています。
ダウンロード先 https://technet.microsoft.com/ja-jp/sysinternals/autologon.aspx

GUI:
![autologon_gui.png](https://qiita-image-store.s3.amazonaws.com/0/97774/d2d1570f-bd1d-275c-d8f8-7085751f22b9.png)

CUI:

```bat:Cmd
Autologon.exe {ユーザー名} {ドメイン名 | ホスト名} {パスワード}
```


---
* 2017.08.05 方法2のドメイン名に関するご指摘を反映。
SELinux が有効な CentOS 6 で PukiWiki

# 準備
FrontPage - PukiWiki-official
https://pukiwiki.osdn.jp/
- pukiwiki-1.5.1_utf8.zip をダウンロードし, ホームディレクトリに転送しておく。

# パッケージインストール
```
$ sudo yum install httpd php unzip policycoreutils-python
```

# PukiWiki 設置
```
$ cd /var/www/cgi-bin; pwd
$ sudo unzip ~/pukiwiki-1.5.1_utf8.zip
$ sudo mv -iv pukiwiki-1.5.1_utf8 pukiwiki
$ sudo chown -Rv apache:apache pukiwiki
$ sudo run_init /etc/init.d/httpd condrestart
```

http://\<FQDN\>/cgi-bin/pukiwiki/index.php にアクセスしても,
SELinux が効いているため正常に表示されない。

```
Runtime error
Error message :

Directory is not found or not writable (DATA_DIR)
Directory is not found or not writable (DIFF_DIR)
Directory is not found or not writable (BACKUP_DIR)
Directory is not found or not writable (CACHE_DIR)
```

# SELinux 無効化
$ sudo setenforce 0

# PukiWiki 操作
1. **新規** ボタンを押下する。
1. *hogehoge* と入力して, **編集** ボタンを押下する。
1. **プレビュー** ボタンを押下する。
1. **ページの更新** ボタンを押下する。
1. **編集** ボタンを押下する。
1. -- 雛形とするページ -- から SandBox を選択し, **読込** ボタンを押下する。
1. **ページの更新** ボタンを押下する。
1. **編集** ボタンを押下する。
1. 内容を全て削除して **ページの更新** ボタンを押下する。

# SELinux モジュール作成, インストール
```
$ cd; pwd
$ sudo audit2allow -a -M pukiwiki
$ sudo semodule -i pukiwiki.pp
$ sudo setenforce 1
```

これで PukiWiki が一通り操作できる…かもしれない。

ちなみに今回作成されたモジュールは以下の通り。

```
$ sed -e '/^ *$/d' -e '/^ *#/d' pukiwiki.te
module pukiwiki 1.0;
require {
        type httpd_t;
        type httpd_sys_script_exec_t;
        class dir { write remove_name add_name };
        class file { rename write setattr create unlink append };
}
allow httpd_t httpd_sys_script_exec_t:dir { write remove_name add_name };
allow httpd_t httpd_sys_script_exec_t:file { rename write setattr create unlink append };
```

どっとはらい。
PythonでCognito経由でS3リソースにアクセスする

# 目的
Cognito経由で一時的な認証情報を獲得し、その情報を使ってS3に対してアクセスするPythonコードを示す。Pythonについてはどうも不完全な実装しか落ちていないので載せておく。

# 準備
Cognito側で非認証ロールにおいて予め当該S3リソースに必要な最低限の権限を与えておくこと。

# 実装
以下がコード。


```py:cognito-s3.py
        client = boto3.client('cognito-identity', 'ap-northeast-1')

        #1回目のアクセスでCognitoの認証IDを得る
        resp =  client.get_id(IdentityPoolId='ap-northeast-1:<YOUR COGNITO IDENTITY POOL ID>')
        print "\nIdentity ID: %s"%(resp['IdentityId'])
        print "\nRequest ID: %s"%(resp['ResponseMetadata']['RequestId'])

        #2回目のアクセスでSessionを確立するための認証情報を得る
        resp = client.get_credentials_for_identity(IdentityId=resp['IdentityId'])
        secretKey = resp['Credentials']['SecretKey']
        accessKey = resp['Credentials']['AccessKeyId']
        token = resp['Credentials']['SessionToken']
        print "\nToken: %s"%(token)
        print "\nSecretKey: %s"%(secretKey)
        print "\nAccessKey ID: %s"%(accessKey)
        print resp

        #認証情報を用いて S3 Object にアクセスする
        session = Session(aws_access_key_id=accessKey,
                  aws_secret_access_key=secretKey,
                  aws_session_token=token, #トークンを忘れずに！
                  region_name='ap-northeast-1')
        s3 = session.resource('s3')
        obj = s3.Object(bucket_name='<BUCKET NAME>', key='<KEY NAME>')

        #以下は単純に読み込んで長さを返す例
        response = obj.get()
        data = response['Body'].read()
        print len(data)
```
scikit-learnで英文テキスト中の単語を集計

# きっかけ
Kaggleの[Personalized Medicine: Redefining Cancer Treatment](https://www.kaggle.com/c/msk-redefining-cancer-treatment)に挑戦しようと思い、テキストデータの分析方法を学習中です。
論文のようなテキストデータに基づいて、遺伝子変異を9つのカテゴリーに分類するというコンペです。

# 用いるデータ
上記コンペでtrain_textとして与えられている、医学系の論文のデータセットです。
https://www.kaggle.com/c/msk-redefining-cancer-treatment/download/training_text.zip


データの読み込み

```py
train_texts = pd.read_table("training_text", sep="\|\|", engine="python", squeeze=True)
train_texts.tail()
```

```
3316    Introduction  Myelodysplastic syndromes (MDS) ...
3317    Introduction  Myelodysplastic syndromes (MDS) ...
3318    The Runt-related transcription factor 1 gene (...
3319    The RUNX1/AML1 gene is the most frequent targe...
3320    The most frequent mutations associated with le...
Name: ID,Text, dtype: object
```

3320個の論文（重複含む）が含まれています。
試しに1つの論文の中身をもう少し見てみます。

```py
train_texts[0][:200]
```

```
'Cyclin-dependent kinases (CDKs) regulate a variety of fundamental cellular processes. CDK10 stands out as one of the last orphan CDKs for which no activating cyclin has been identified and no kinase a'
```

このような普通の論文です。

# トークン化と集計
NLTKや自作の関数を使っても良いのですが、今回は簡単のためscikit-learnに頼ります。

```py
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer(stop_words="english", lowercase=True, min_df=1)
X = vectorizer.fit_transform(train_texts[:100])
X
```

```
<100x18296 sparse matrix of type '<class 'numpy.int64'>'
	with 133551 stored elements in Compressed Sparse Row format>
```

全部読み込むと少し時間がかかるので、100番目の論文までを使うことにしました。

stop_words="english"と指定することで、"that" や "and" など、あまりにありふれていて、解析上あまり意味のない単語を除外してくれます。
lowercaseはデフォルトでTrueになっていますが、全て小文字に変換して集計してくれます。
min_dfはint型を与えると文書中にその数未満しか現れない単語を除外してくれます。デフォルトは1ですが、例えば2とすると、1回しか現れない単語が除外されるようになります。
ちなみに、[0.0, 1.0]の範囲のfloat型を与えると、全単語中その数値の割合以下でしか出現しない単語が除外されるようです。

vectorizerにより変換した結果は、sparse matrixとして返されます。

stop_wordsに何が含まれるか気になったので調べてみます。

```py
from sklearn.feature_extraction import stop_words
eng_stop_words = stop_words.ENGLISH_STOP_WORDS

print(len(eng_stop_words))
print(list(eng_stop_words)[:20])
```

```
318
['con', 'toward', 'anywhere', 'on', 'a', 'most', 'this', 'full', 'inc', 'whereafter', 'had', 'hers', 'call', 'interest', 'move', 'she', 'six', 'up', 'he', 'you']
```

'on', 'most', 'this' など納得いくものが多いですが、'call', 'move' などは場合によっては除外しないほうが良いかもしれません。

何はともあれ、論文中の単語を集計してみます。

```py
vocabulary = vectorizer.get_feature_names()
word_count = np.sum(X.toarray(), axis=0)

D = pd.Series({tag: count for tag, count in zip(vocabulary, dist)})
D.sort_values(ascending=False).head(20)
```

```
mutations     7212
cbl           5660
cells         4912
cell          4558
cancer        2931
et            2775
figure        2755
al            2722
fig           2491
mutation      2181
protein       2043
activity      2034
type          1998
cyclin        1870
expression    1679
tert          1609
binding       1543
domain        1537
wild          1491
tumor         1418
dtype: int64
```

mutation, cell, cancerなど、確かにがん関係の論文に多そうな単語が上位に入っています。figure, et alなども論文に特有ですが、これらは特に有益な情報にならないので、stop wordに加えた方が良さそうです。

今後は、各カテゴリーに属する論文に多い単語などを探索します。
今日はここまで。
localtime_sをlocaltimeの代わりに使うときのやりかた

#localtime_sを使い時間取得をした後、取得時間をファイルに書き出すプログラム

```c
include<stdio.h>
include<time.h>

int main(void)
{

        FILE *fp;
	    time_t jikan = time(NULL);
	    struct tm imanojikan;
	    errno_t error;

	    error = localtime_s(&imanojikan, &jikan);

	if (fopen_s(&fp, "jikanget.dat", "w") != 0) {
		printf("ファイルをオープンできません。\n");
		if (error != 0) {
			printf("現在の日付・時刻を書き出すことができません。\n");
		                }
            }
	else {
		printf("現在の日付・時刻を書き出しました。\n");
		fprintf(fp,"%d %d %d %d %d %d\n",imanojikan.tm_year+1900,imanojikan.tm_mon+1,imanojikan.tm_mday,
			imanojikan.tm_hour, imanojikan.tm_min, imanojikan.tm_sec);
		fclose(fp);
	    }
 }


```
##実行環境
VisualStudio2017 Communityを使用しました。
##localtimeとlocaltime_sの違い
Visual Studioでlocaltimeを使うと、警告が出てきてしまいます(上のコードでもしれっとfopenじゃなくてfopen_sを使っているように、localtimeのほかにもあります)。では、localtimeを使用したため出た警告をどうやって消すかというと、警告に従ってlocaltime_sを使うのが一つの手としてありますが(マクロ使って警告が出ないようにし、localtimeを使用しコンパイルを通すやり方もあります)そうなるとlocaltimeとlocaltime_sの違いが出てきて私のような初心者には困ることになります。そこで、初心者なりに調べて出した二つの基本的な違いは以下の通りとなリます。

**localtime**
localtimeはその返り値として要素別の時間を**tm構造体へのポインタ**に返してくれます。引数は一つだけでtime_t型の変数(time関数で取得した暦時刻が入っているもの)です。

**localtime\_s**
localtime\_sはlocaltimeと違い**errno\_t型(エラーを判別するために作られた型)の値を返します**。引数は二つあり、第一引数にはlocaltime\_sで取得した値を入れておくための**tm構造体の変数のアドレス**(localtimeと違い、**tm構造体へのポインタでないことに注意**)であり、第二引数にはlocaltimeの時と同じようにtime\_t型の変数(time関数で取得した暦時刻が入っているもの)をとります。ちなみにerror_t型の変数errorで得られた値についてはここでは使わない(使い道がわからないのは内緒)ので無視しています。

##結論
つまり、localtimeとlocaltime_sの違いとは暦時刻を処理した値を渡す箇所が**、localtimeだと返し値**、**localtime_sだと第一引数**というのがlocaltimeとlocaltime\_sの主な違いといえます。