OmniAICreator/Qiita-1.07M huggingface dataset:
Access 2013以降でフォームにGoogleMapを表示するときの変更点

#基本的にはEXCEL版の応用
[ExcelにGoogle Maps APIで地図を埋め込み、住所検索、拡大／縮小、地図種類変更](http://www.atmarkit.co.jp/ait/articles/1409/05/news165_2.html)
を今回はACCESSのフォームでやってみるときの変更点をメモします。
##ACCESSの場合表示用フィールドを設ける
EXCEL版はテキストボックスを作って、それに住所を入力してOKボタンを押すと検索します。これはACCESSでも可能ですが、GOOGLEMAP表示用アドレスフィールドを設けると、何度も入力しなくて済みます。
というのもGOOGLEMAPは必ずしも正確な住所で検索ができず、緯度経度、近くの建物の住所等、あるはQIITA町2010-2では検索できないがQIITA町2010では検索できる、など工夫する必要があるためです。

##ACCESSではスピンボタンを表示させる時工夫が必要
上記のようなフィールドを設けたテーブルを単票形式のフォームに表示させ、上記記事のようにOKボタン、オプションボタンを設けますが、スピンボタンが見つかりません。
Web Browserと似ていますが、ツールボックスには表示されないので、
ActiveX Contorolsから
Microsoft FormsX.X Spinbutton
を選択する必要があります。
このときSpinbutton1とするとなぜかオブジェクト名がSpinbutton1_Spinbutton1となりましたが、そういう時もあるのでしょう。

##ACCESSのWeb BrowserにはNavigate命令がない
AccessのWEB BROWSERにはありません。どうするかというとCotrolsourceプロパティに入れます。ところがここでもう一つ注意点があります


##ACCESSのWeb BrowserのURLはEXCELと違う
[navigate method missing from web browser control](https://social.msdn.microsoft.com/Forums/office/en-US/8bf1d5ba-533c-4f94-8140-38bf958c38e3/navigate-method-missing-from-web-browser-control?forum=accessdev)
Try this
=("www." & [text2] & ".com")
とあります。つまり()でつつまないと駄目なのです。

以上をまとめると、上記記事のOKボタンのプロシージャの記述はACCESSの場合、該当する部分の2行は記述を以下のように変更する必要があります。

Access.VB```
'EXCEl VBA
googleUri = "=(" & Chr(34) & "http://maps.google.com/maps/api/staticmap?size=600x600&zoom=" & no & "&sensor=false&markers=" & myAddressCoodinatePosition & "&maptype=" & myMapType & Chr(34) & ")"
WebBrowser1.ControlSource = googleUri
```

##オプションボタンにはキャプションがない
ACCESSのオプションボタンにはキャプションがありません
myMapType = OptionButton1.Caption
という記述はエラーになります。
また、元の記事はグループ化してあるのかな？オプションボタンを一つ押すと他は排他でFALSEにする必要があります。
Captionの代わりにtagプロパティを使うか、直接値を記述します。
optionbutton1を作ったらプロパティのタグにroadmapと入れます
もしくは値を直接入れます

Access.VBA```
Private Sub OptionButton1_Click()
  okButton.Enabled = True
  OptionButton2.Value = False
  OptionButton3.Value = False
  OptionButton4.Value = False
  myMapType = OptionButton1.Tag
  'myMapType = "roadmap"
  地図の表示
End Sub
```

##地図の表示サブプロシージャはフォーム内
原記事ではわかりにくいですが、地図の表示はフォームのプロシージャに記述しないと動きません。

##最後に
この機能はオフィス2007以降に仕様が変わったもののようですが、むしろこのフォームでボタンを押すと地図を表示する機能はACCESS用ではないでしょうか。あと住所ではなく緯度経度、ランドマークでもできますので、その場所にあった最適な表示を選んでみてください。
また縮尺はデフォルトではこの記事は10に設定されていますが、少し詳しく、12くらいでもいいかもしれません。縮尺用のフィールドを設けてもいいかもしれません。ただし、フォーム内の地図はマウスで拡大できます。
ローカルで AWS Lambda をうごかしてみる。そのための exports 入門サンプル。

AWS Lambda を使いはじめました。マネジメントコンソール画面から Test ボタンを押せば Lambda を走らせることができるのですが、それだと毎回、マネジメントコンソールのソースをいじらないといけません。できれば、ローカルのファイルを修正して、ローカルでその Lambda を走らせたいです。

きっと、いろいろ方法はあると思いますが、とても安易に、`node index.js` 的なノリで軽く動かしたいと思います。

# exports.hoge について

```js:~/workspace/hoge.js
exports.piyo = function(){
	console.log("Hello");
}
```

```zsh:~/workspace
$ node
> const hoge = require('./hoge.js')
undefined
> hoge.piyo()
Hello
undefined
```

このようにできます。

# Lambda の index.js で試してみる。

Lambda の index.js は以下の構造になっていますので、

```js:index.js
exports.handler = (event, context, callback) => {
    ...処理...
}
```

hoge.js と同じノリで叩いてみます。

```zsh
$ node
> const lambda = require('./index.js')
undefined
> lambda.handler()
TypeError: callback is not a function
    at Object.exports.handler.https.get.req.on [as handler] (/Users/mochizuki/Developments/ferretone-pardot/index.js:45:3)
    at repl:1:8
    at REPLServer.defaultEval (repl.js:262:27)
    at bound (domain.js:287:14)
    at REPLServer.runBound [as eval] (domain.js:300:12)
    at REPLServer.<anonymous> (repl.js:431:12)
    at emitOne (events.js:82:20)
    at REPLServer.emit (events.js:169:7)
    at REPLServer.Interface._onLine (readline.js:211:10)
    at REPLServer.Interface._line (readline.js:550:8)
```

こんな感じになります。

コールバックが function じゃないぞ、と言われていますので、適当に引数をセットしてみます。

```zsh
> lambda.handler(null, null, function(){})
undefined
> STATUS: 200
```

無事できました。

ひとまず、これで僕のニーズは満たされたので、すこしはデバッグがやりやすくなりました。

まだまだ、知らないことがたくさんなので、すこしずつできることを増やして行きたいです。 :walking_tone1: 

# 追記 require キャッシュ強い問題

`index.js` を更新したあとに、`lambda.handler()` を叩いてもキャッシュされてるので更新されません。結局以下のフィアルを用意して、`node lambda_test.js` を叩いて動かすことにしました。

```js:lambda_test.js
var lambda = require('./index.js')
lambda.handler(null, null, function(){})
delete require.cache[require.resolve('./index.js')]
```

```zsh
$ node lambda_test.js
```
awsとwordpressでホームページ作り2(開発編)

ローカル開発の環境を整えます。

| 前 |
|:-:|
|[準備編](http://qiita.com/kinzi0828/items/28c026434e02898fde57)   |

#はじめに
wordpressの開発のメインはテーマ開発になります。
ここをこうしたい！って思ったらすぐに変えたいですが、そのままいじったら完成する前のぐちゃぐちゃなのが見られてしまいます。また、テキストエディタを使ったほうが何かと便利です。そこで[github](https://github.com/)を使いましょう。または[bitbucket](https://bitbucket.org/)などのプライベートのやつにしましょう。

テーマ開発手順
1.ローカルで開発
2.githubに変更を反映
3.githubの変更をwordpressに反映

これを繰り返していきます。

ローカルで開発できるようにしていきましょう。

#wordpressにgitをインストールしてリポジトリを作る

ローカルで開発するため、wordpressをgitにプッシュします。

```
sudo yum -y install git
git --version
```
gitをインストールして確認、その後

```
cd /var/www/html/wordpress/
sudo git init
```
wordpressのリポジトリができました。

githubなどのリポジトリを作成して、URLをコピーしときます。そのURLをはります。

```
sudo git remote add origin https://◯◯.git
sudo git pull origin master

sudo git add .
sudo git commit -m "コメント"
sudo git push origin master
```

これで準備ができました。URLを確認するとブランチのマスターにコードが増えているのがわかります。

#ローカルで開発してみる

ローカルで開発するためのサーバを用意してください。
そこにwordpressをクローンします。

```
git clone https://◯◯.git
```

あとはテーマを編集してブラウザでちょこちょこ見ながら開発するだけです。


#参考
http://did2memo.net/2015/12/13/wordpress-github/
githubでwordpress自動更新があったので
https://torounit.com/blog/2016/01/20/2176/
githubコマンド
http://qiita.com/mountcedar/items/682743c95fd3b8fc274b
チャンネル数が多くなっても大丈夫な Slack の設定


## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
コミュニケーションツールとして Slack を使っている方が多いと思います。
チームやプロジェクトで Slack を使っていると知らず知らずのうちにチャンネル数が増えていて、
サイドバーのチャンネル一覧がひどいことになっているかたも多いのではないでしょうか。
そんなときに、Slack の設定を少し変更するだけで、チャンネル数が多くても大事なメッセージを見逃さないようにする設定をご紹介します。

## <i class="fa fa-star" style="font-size:1em;"></i> Star 機能を活用する

Slack にはチャンネルに Star を付ける機能が存在します。お気に入り登録というやつですね。
まずはこれを活用するのが第一歩です。
頻繁に使うチャンネルなどは Star を付けておきます。
Star は各チャンネル画面上部のチャンネル名の下辺りにあると思います。

![スクリーンショット 2017-01-21 12.28.55.png](https://qiita-image-store.s3.amazonaws.com/0/17385/cf449821-3870-5ad4-b4e9-0228f30e0ac9.png)


## <i class="fa fa-sliders" style="font-size:1em;"></i> 更新のあったチャンネルのみを表示する

次に、Slack の設定を変更します。
1. `Preference` から、`Advanced` の項目を選択
1. `Channel List` の設定を `My unreads, along with everything I've stared` にチェックを入れる

![スクリーンショット 2017-01-21 12.33.41.png](https://qiita-image-store.s3.amazonaws.com/0/17385/079d6036-2660-785c-16c3-7deabc32151b.png)
![スクリーンショット 2017-01-21 12.37.54.png](https://qiita-image-store.s3.amazonaws.com/0/17385/2435fb58-fd47-76a4-d72c-90d59504f8d3.png)


以上の設定を行うことで、未読メッセージのあるチャンネルのみがサイドバーに表示されます。加えて、Star を付けているチャンネルは常時表示されます。
しかし、この使い方をしていると一点不便な時があります。
それは、現在未読メッセージがないためサイドバーに表示されていないチャンネルの内容を読みたいと思った場合です。
サイドバーに表示されていないため該当のチャンネルを探すのが大変です。
そういうことが頻繁に起こる場合はそのチャンネルに Star をつければいいのですが、Star をつけるほどでもないチャンネルを見たいときもあります。
そんな時は、`Cmd + K` ショートカットでチャンネル名で検索をしましょう。慣れてしまうととても便利です。
TeXやLaTeXで図の挿入に時間がかかるときに挿入を省略する方法

#課題
TeXで文書を作成しているとき，挿入する図が多いほどPDFを出力するのに時間がかかってしまう。

#解決
documentclassのoptionに`draft`を指定する。
例えばこんな感じ　`¥documentclass[12pt, draft]{jreport}`
するとPDF出力されたとき、以下の画像のように出力されるはず。

![test.png](https://qiita-image-store.s3.amazonaws.com/0/90215/98471b93-f8fe-81cd-1171-5a3ac26cd183.png)

#結論
やっぱりTeXって素晴らしい。
tesseract-ocr などの海外オープンソース系のソースコードをいじらずにコンパイルを通す

メモです。

PCのコントロールパネルの地域を開き、管理タブを選んで、システムロケールの変更ボタンを押し、ロケールを英語(米国)に換えて再起動してからコンパイルするとすんなり通ります。
この方法で、なかなかコンパイルが通らないオープンソース系のプログラムや海外のサンプルコードなど、謎のコンパイルエラーで悩んでたものが大体解決できます。
cmake-guiやLINKで失敗するときはいったん日本語に戻します。コンパイルがうまくいけばlinkは日本語でも大丈夫みたいです。
一般的には、ソースコードをBOM付きUNICODEで保存しなおせば良いようですが、コード改変してないのに日付が変わるのが嫌な場合有効な方法かと思います。
Maxscale2.0からMySQL5.7に接続する

mysqlrouterまで待てない、routerにはない機能を使いたい人向け

サンプルコンフィグでもハマると
ERROR 1045 (28000): failed to create new session
が出て繋がらないので自分の事例を紹介
手探りで構築したので間違っているのでしたら取り下げますのでご指摘よろしくお願い致します。

#ダウンロード
https://mariadb.com/downloads
まさかのfirefoxではOS選択画面が表示されずダウンロードできません
火狐に愛の手を


#権限

```
CREATE USER 'monitor'@'%' IDENTIFIED BY 'xxxxxx';
GRANT SELECT ON mysql.user TO 'monitor'@'%';
GRANT SELECT ON mysql.db TO 'monitor'@'%';
GRANT SELECT ON mysql.tables_priv TO 'monitor'@'%';
GRANT SHOW DATABASES ON *.* TO 'monitor'@'%';
GRANT REPLICATION CLIENT ON *.* TO 'monitor'@'%';
flush privileges
```
ユーザ名には指定がないですがmonitorを仮で入れてます。
権限は5つ必要な模様。エラーログに出てくれるのでわかりやすいです。
ubuntu16.04では/var/log/maxscale/maxscale1.logに出力されました

#コンフィグ
公式にサンプルがあります。
https://mariadb.com/kb/en/mariadb-enterprise/connection-routing-with-mysql-replication/
基本的にこのコンフィグで動作します。最小モードでまずテストを
**/etc/maxscale.cnf.templateの設定では完全には動作しません**

##serviceタグ

```
[xxxx Service]
type=service
router=readconnroute
```

サンプルでも書かれてますがrouter=readconnrouteしか動作せず
**router=readwritesplitにするとERROR 1045になる模様**
普通はgarela環境で使うためwrite serviceにはreadwritesplitを指定する例が多く
mysqlユーザがハマりやすいポイントかと

##serviceタグ

```
[xxxx Service]
type=service
#router_options=xxxxxxxxxx
```

**router_options=有効にするとERROR 1045になる模様**

filterがうまく動作しない・・・
動きましたら使っているコンフィグをUPします。

#起動
`sudo maxscale`でも起動します。ヘルプは--help、停止はkill？
`sudo systemctl start maxscale.service`こっちがubuntu16.04では正式
ってかinitファイルも用意してもいいのではないかと言いたい。corosyncのサンプル的にも
Windows 10の仮想デスクトップショートカットキー

宗教上の理由でMacBookが使えないユーザのための機能
とりあえずこれだけ知っておけば使える

# 仮想デスクトップの追加
[Ctrl] + [Win] + D

# 仮想デスクトップの削除
[Ctrl] + [Win] + [F4]

# 仮想デスクトップの一覧(タスクビュー)
[Win] + [Tab]

タスクビューを開いてアプリケーションを他のデスクトップにドラッグで移動が可能。

# 仮想デスクトップの切り替え
## 右のデスクトップに切り替え
[Ctrl] + [Win] + [→]

## 左のデスクトップに切り替え
[Ctrl] + [Win] + [←]
MPAndroidChartで棒グラフと折れ線グラフを同時に描く

とりあえずコードをのせておきます（あとで清書する）

```java
List<String> labels = new ArrayList<>();
List<BarEntry> bar = new ArrayList<>();
List<Entry> line = new ArrayList<>();
Random random = new Random();
for (int i=0; i<10; i++) {
	// x軸用のラベルはList<String>
    labels.add(String.valueOf(i));
    
    // 各データはList<BarEntry>, List<Entry>などに格納
    // Entry(float value, int index)
    // labelsの長さ以上のインデックスを指定すると実行時エラーが起きる
    bar.add(new BarEntry((float)random.nextInt(10), i));
    line.add(new Entry((float)random.nextInt(5)+3f, i));
}

// エントリーのリスト(List<Entry>) ＋ 名前(String) => DataSet
// ラベルのリスト(List<String>) ＋ DataSet => Data

// 棒グラフ
BarDataSet barDataSet = new BarDataSet(bar, "bar");
BarData barData = new BarData(labels, barDataSet);

// 折れ線グラフ
LineDataSet lineDataSet = new LineDataSet(line, "line");
lineDataSet.setColor(Color.BLACK);
lineDataSet.setLineWidth(1.5f);
lineDataSet.setDrawCircles(false);

LineData lineData = new LineData(labels, lineDataSet);
lineData.setDrawValues(false);

// 組み合わせる
CombinedData data = new CombinedData(labels);
data.setData(lineData);
data.setData(barData);
chart.setData(data);

// チャート
CombinedChart chart = (CombinedChart)findViewById(R.id.combined_chart);
chart.setBackgroundColor(Color.WHITE);
chart.setDrawGridBackground(false);
chart.setDrawBarShadow(false);

chart.setTouchEnabled(true);
chart.setPinchZoom(false);
chart.setDoubleTapToZoomEnabled(false);

chart.setHighlightEnabled(false);
chart.setDescription("");

// x軸設定
XAxis xAxis = chart.getXAxis();
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setDrawGridLines(false);
xAxis.setSpaceBetweenLabels(0);

// 右側y軸設定
chart.getAxisRight().setEnabled(false);

// アニメーション
chart.invalidate();
chart.animateY(2000, Easing.EasingOption.EaseInBack);
```
golangで同じものを含む順列

```go
package main

import "fmt"

func removeDuplicate1(args []int) []int {

	results := make([]int, 0, len(args))
	encountered := map[int]bool{}
	for _, arg := range args {
		if !encountered[arg] {
			encountered[arg] = true
			results = append(results, arg)
		}
	}
	return results
}

func perm(head []int, rest []int) {
	if len(rest) == 0 {
		fmt.Println(head)

	} else {

		result := removeDuplicate1(rest)

		for _, v := range result {

			restx := make([]int, len(rest))
			copy(restx, rest)

			for i, x := range restx {
				if x == v {
					restx = append(restx[:i], restx[i+1:]...)
					break
				}
			}

			headx := append(head, v)

			perm(headx, restx)
		}
	}
}

func main() {
	perm([]int{}, []int{1, 1, 1, 2, 2, 3})
}
```
# 参考
http://qiita.com/hi-nakamura/items/5671eae147ffa68c4466
CでPython3のモジュールを追加してみた

Cで書いたプログラムをPython3から使えるようにしてみた
参考文献がどれも古くて、Python3に対応させるのに苦労しました、、、

## まずはソースコード

```c:hello.c
int add(int x, int y)
{
	return x + y;
}

void out(const char* adrs, const char* name)
{
	printf("こんにちは、私は %s の %s です。\n", adrs, name);
}
```

これはCのソースコードで、add,outの二つの関数を持っている

```c:helloWrapper.c
#include "Python.h"
extern int add(int, int);
extern void out(const char*, const char*);

PyObject* hello_add(PyObject* self, PyObject* args)
{
	int x, y, g;

	if (!PyArg_ParseTuple(args, "ii", &x, &y))
		return NULL;
	g = add(x, y);
	return Py_BuildValue("i", g);
}

PyObject* hello_out(PyObject* self, PyObject* args, PyObject* kw)
{
	const char* adrs = NULL;
	const char* name = NULL;
	static char* argnames[] = {"adrs", "name", NULL};

	if (!PyArg_ParseTupleAndKeywords(args, kw, "|ss",
			argnames, &adrs, &name))
		return NULL;
	out(adrs, name);
	return Py_BuildValue("");
}

static PyMethodDef hellomethods[] = {
	{"add", hello_add, METH_VARARGS},
	{"out", hello_out, METH_VARARGS | METH_KEYWORDS},
	{NULL}
};

static struct PyModuleDef hellomodule =
{
    PyModuleDef_HEAD_INIT,
    "hellomodule", /* name of module */
    "",            /* module documentation, may be NULL */
    -1,            /* size of per-interpreter state of the module, or -1 if the module keeps state in global variables. */
    hellomethods
};

PyMODINIT_FUNC PyInit_hellomodule(void)
{
    return PyModule_Create(&hellomodule);
}
```

こっちがメインのソースコード。

プログラムのそれぞれの意味はこちら参照
→[PythonからCプログラムを呼び出す](http://owa.as.wakwak.ne.jp/zope/docs/Python/BindingC/)

## 実行してみる

### コンパイル
3つのコマンドを実行する。

```bash
gcc -fpic -o hello.o -c hello.c
gcc -fpic -I`python3-config --prefix`/Headers -o helloWrapper.o -c helloWrapper.c
gcc -L`python3-config --prefix`/lib -lpython3.5 -shared hello.o helloWrapper.o -o hellomodule.so
```

* まずはhello.cをコンパイルしてオブジェクトファイルを作成
* -Iで`python3-config--prefix`にあるヘッダーファイルを指定してあげてhelloWrapper.cをコンパイルしてあげる
* そして最後に-Lで`python3-config--prefix`にあるライブラリの場所を指定してあげて、ライブラリの作成

### python3から試す
実際に試してみよう、ほんとにできてるかな？

```bash
hnkz $ python3
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 26 2016, 10:47:25)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import hellomodule
>>> hellomodule.add(2,3)
5
>>> hellomodule.out("hamamatsu","hnkz")
こんにちは、私は hamamatsu の hnkz です。
```

できてる！すごい！！

応用してPython3でキーロガーを作りたいな。

## 参考文献
[PythonからCプログラムを呼び出す](http://owa.as.wakwak.ne.jp/zope/docs/Python/BindingC/)
[PythonでCバインディング試してみた](http://esperia.hatenablog.com/entry/2015/11/29/173734)
[Compiler can't find Py_InitModule() .. is it deprecated and if so what should I use?](http://stackoverflow.com/questions/28305731/compiler-cant-find-py-initmodule-is-it-deprecated-and-if-so-what-should-i?newreg=b8b98c7be1224d2db6b5c2f9b30f322e)
UbuntuのSpotifyでローカルファイルを再生する

本日、Windowsを捨ててUbuntuに移行したわけですが、快適です。

Sptifyで音楽を聞いているわけですが、ローカルファイルが再生されません。

libavcodec54とlibavformat54が古いようなのでアップデートするとローカルファイルが再生されるようになります。

```
echo deb http://se.archive.ubuntu.com/ubuntu trusty main universe | sudo tee /etc/apt/sources.list.d/temp-trusty.list
echo deb http://security.ubuntu.com/ubuntu trusty-security main universe | sudo tee -a /etc/apt/sources.list.d/temp-trusty.list
sudo apt update
sudo apt install libavcodec54 libavformat54
sudo rm /etc/apt/sources.list.d/temp-trusty.list
sudo apt update
```

# 参考
https://community.spotify.com/t5/Desktop-Linux-Windows-Web-Player/Local-files-don-t-play/m-p/1505507
youtube動画組込みのプロパティ

youtubeの動画組込みによく使用するプロパティ、パラメーター
※随時更新していきます。



プロパティ
frameborder="1" 周囲に枠線をつける（初期値0）
allowfullscreen　全画面表示（初期値あり）


パラメータ
autoplay=1 自動再生有効(初期値0)
rel=0  関連動画無効(初期値1)



参考）
```<iframe width="720" height="400" src="https://www.youtube.com/sample?rel=0" frameborder="0" allowfullscreen></iframe>```
Yeomanの使い方

# Yeoman

- ※バーチャルボックスでは「yo webapp」でエラーが出て使えない！


## Yeomanとは
- Yo
  - ひな型作成(ジェネレータ)
- Grunt
  - タスクランナー
- Bower
  - パッケージマネージャ


## インストール
1. Node.js のインストール

    ~~~bash
    # yumにepelのリポジトリを追加
    rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
    yum install nodejs npm --enablerepo=epel
    ~~~

1. git のインストール

1. Yoman のインストール

    ~~~bash
    npm install -g yo grunt-cli bower
    # [npm]は、nodeのパッケージマネージャ
    ~~~

1. ジェネレータをインストール

    ~~~bash
    npm install -g generator-webapp
    ~~~

## 使い方
1. yoでプロジェクト作成

    ~~~bash
    mkdir hello_yeoman
    cd hello_yeoman
    sudo chown -R `whoami` ~/.npm
    yo webapp
    ~~~

1. ページ起動

    ~~~bash
    grunt server
    # 停止は[ctrl + c]
    ~~~

1. ビルド

    ~~~bash
    grunt
    # distフォルダにサーバにUPするファイルが作成される
    ~~~
C# ゼロバイトファイルの作成

### 0byteファイルの作成方法

最近、テストでファイルを作成した時につまづいたのでそのメモ

最初は以下のように書いていました。しかしテストのcleanupで削除できない。

``` program.cs

System.IO.File.Create(@"hoge.txt");

```

CreateメソッドはStreamを返すのでCloseする必要がある。
以下のようにしたらうまくいきました。


``` program.cs

System.IO.File.Create(@"hoge.txt").Close();

```
機械学習のPython環境をMac OSに構築を構築する


[機械学習の勉強会のためにPyData環境の構築を行う (2017年1月）](http://qiita.com/terapyon/items/e4a759de90fb687e7332) で書いた、VirtualBoxを使ってUbuntu用の環境構築を書いたが、Mac用にも欲しいので書いています。

この記事は、Python標準の環境構築方法です。この方法をオススメします。

以下の書籍の勉強には、このように環境を整えるのが良いと思います。

- [機械学習Pythonプログラミング(インプレス)](http://amzn.to/2iKe2r5) 

# 使用するもの

- Python 3.6
- NumPy
- SciPy
- pandas 
- scikit-learn 
- matplotlib
- ipython[notebook]


# インストール方法

## Python 3.6

- Pythonのダウンロード https://www.python.org/downloads/release/python-360/ から `Mac OS X 64-bit/32-bit installer` を取得
- ダウンロード後、ダブルクリックでインストールする。


Mac OSに、 `python3` でPythonが使用できる

## Pythonの仮想環境

`~/work/tmp` に環境を構築することで記載します。

```
$ mkdir ~/work/tmp
$ cd ~/work/tmp
$ python3 -m venv env
```

これで、 `~/work/tmp/env` にPythonの仮想環境が整った
`venv` というPython標準の仮想環境作成ツールを使っています。

## ライブラリインストール

```
$ cd ~/work/tmp
$ source env/bin/activate
(env)$ pip install numpy scipy pandas scikit-learn matplotlib
(env)$ pip install ipython[notebook]
```

`source` コマンドでPythonの仮想環境を有効にして、 `pip` でライブラリをインストールします。

`wheel` でバイナリパッケージが提供されているの、コンパイルが不要になり、OSの外部モジュールをインストールしなくてもMac OS環境に簡単にインストールできます。

## 使用方法

```
$ cd ~/work/tmp
$ source env/bin/activate
(env)$ jupyter notebook
```

ライブラリインストール直後は、 `source` コマンド が実行されていて、Pythonの仮想環境に入っているので、`source` コマンドは実行しなくても大丈夫です。
Android - LinerLayoutで表示する時とListViewを使う時のメモリー比較

#LinerLayoutで表示する時とListViewを使う時のメモリー比較
#①LinerLayoutで表示す場合

```activity_number.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/rootView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="com.example.miwok.NumberActivity">
</LinearLayout>
```

```NumberActivity.java
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_number);

        ArrayList<String> words = new ArrayList<String>();
        for(int i=0; i < 10000; i++) {
            words.add(i, "テスト");
        }
   }
```
##実行前のメモリー
![beforeLinear.PNG](https://qiita-image-store.s3.amazonaws.com/0/108475/1bcb9acb-08aa-038c-13e9-2f43fed8c7c2.png)
##実行後のメモリー
10000件の文字列を全部LinearLayoutに表示したので13M程度メモリーが増えました
![afterLinear.png](https://qiita-image-store.s3.amazonaws.com/0/108475/b24d621d-d710-f196-6b43-b683cc0219b1.png)

#②ListViewとArrayListで表示する場合

```activity_number.xml
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/list"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.miwok.NumberActivity"/>
```

```NumberActivity.java
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_number);

　　　　 ArrayList<String> words = new ArrayList<String>();

        LinearLayout liner = (LinearLayout) findViewById(R.id.rootView);
        for(int i=0; i < 10000; i++) {
            words.add(i, "テスト");
        }


        ArrayAdapter<String> itemsAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, words);

        ListView listView = (ListView) findViewById(R.id.list);

        listView.setAdapter(itemsAdapter);
   }
```

##実行前のメモリー
![list_before.PNG](https://qiita-image-store.s3.amazonaws.com/0/108475/a14dd049-869f-b007-084e-eb72aff19cc2.png)


##実行後のメモリー
同じデータを表示してもメモリー再利用しているのでほとんどメモリー使わない
![list_after.PNG](https://qiita-image-store.s3.amazonaws.com/0/108475/e5a2c020-c09f-9b51-3a78-6a35848de8c1.png)


##見た目は同じだけどメモリー使い方がこんなに違います。
メモリー考えながら開発しましょう！！！！！
Apple Watchでカウントアプリ

```ruby:InterfaceController.swift
import WatchKit
import Foundation


class InterfaceController: WKInterfaceController {

    @IBOutlet var label: WKInterfaceLabel!
    var count:Int = 0
    override func awake(withContext context: Any?) {
        super.awake(withContext: context)
        
    }
    
    override func willActivate() {
        // This method is called when watch view controller is about to be visible to user
        super.willActivate()
        let fontSize = UIFont.systemFont(ofSize: 90)
        let text = String(count)
        let attrStr = NSAttributedString(string: text, attributes:[NSFontAttributeName:fontSize])
        label.setAttributedText(attrStr)
        
    }
    
    override func didDeactivate() {
        // This method is called when watch view controller is no longer visible
        super.didDeactivate()
    }
    @IBAction func push() {
        count += 1
        let fontSize = UIFont.systemFont(ofSize: 90)
        let text = String(count)
        let attrStr = NSAttributedString(string: text, attributes:[NSFontAttributeName:fontSize])
        label.setAttributedText(attrStr)
    }

}
```
Webpackを使ってSassをビルドする


GulpからWebpackに変えてSassの環境作りに少し悩んだので備忘録です。
http://webpack.github.io/docs/stylesheets.html

## 手順

まずはWebpackとCSSをビルドするに必要なLoaderをインストールします。

```bash
$ npm install --save-dev webpack node-sass style-loader css-loader sass-loader
```

合わせてExtra-Text-Webpack-Pluginというプラグインをインストールしておきます。

```bash
$ npm install --save-dev extract-text-webpack-plugin
```

このプラグインに関してはまだ掴みきれていない部分がありますが通常でビルドするとJavaScript内に組み込むのCSSが出力されます。
通常はlinkタグを使ってcssを読み込むことが多いと思いますのでその場合はこのプラグインを使ってCSSを出力します。

## 設定ファイル

webpack.config.jsにビルドに必要な情報を記述します。

```js:webpack.config.js
var path = require('path'),
	ExtractTextPlugin = require('extract-text-webpack-plugin');
	
module.exports = [{
	context: path.join(__dirname, 'src/css'),
	entry: {
		style: './style.scss'
	},
	output: {
		path: path.join(__dirname, 'public/css'),
		filename: '[name].css'
	},
	module: {
		loaders: [
			{
				test: /\.scss$/,
				loader: ExtractTextPlugin.extract('style-loader', 'css-loader?-url&minimize&sourceMap!sass-loader')
			}
		]
	},
	devtool: 'source-map',
	plugins: [
		new ExtractTextPlugin('[name].css')
	]
}];
```

気をつける箇所としてはmoduleのloader部分くらいです。
書き方がちょっと気になりますがstyle-loader、css-loader、sass-loaderを使用するという記述になります。
minimaizeはそのままですがcssファイルの圧縮、sourceMapもソースマップファイルを出力する設定です。sourceMapを使用する場合は、devtoolも合わせて設定しないと出力されませんので注意してください。
「-url」は記述間違いではありません。私もすこしハマってしまいましたがこれがないと背景画像等のイメージパスをcss-loaderがチェックします。最初はよくわかりませんでしたがurlの情報を除外すると見ると何となく納得いきます。

## ビルド

あとはビルドするだけです。

```bash
$ webpack --watch --progress
```

webpackコマンドが使えない状況であればpackage.jsonを使用してビルドしてあげればいいと思います。

```js:package.json
"scripts": {
	"watch": "webpack --watch --progress"
}
```

```bash
$ npm run watch
```

## BourbonやCompassを使用する

とりあえず環境はできましたが私は作るものによってですがBourbonやCompassを使ってます。
このあたりの設定もメモしておきます。

### Bourbon、Neatを使う

```bash
$ npm insall --save bourbon bourbon-neat
```

場合によってはBittersも仲間にいれてあげていいと思います。
直接cssフォルダ内に組み込む場合は特に必要はありませんがnpm installしたものをそのまま使う場合はwebpack.config.jsを修正する必要があります。

```js:webpack.config.js
var bourbon = require('bourbon'),
	bourbonNeat = require('boubon-neat');
	

module.exports = [{
	...
	module: {
		...
	},
	sassLoader: {
		includePaths: bourbon.includePaths.concat(bourbonNeat.includePaths)
	},
	...
}]
```

あとはSassの方は今まで通り`@import "bourbon"`とかしてあげれば読み込めます。

### Compassを使う

場合によってはCompassを使う場合もまだあるのでメモ。

```bash
$ npm install --save compass-mixins
```


```js:webpack.config.js
module.exports = [{
	...
	module: {
		...
	},
	sassLoader: {
		includePaths: path.join(__dirname) + '/node_modules/compass-mixins/lib'
	},
	...
}]
```

BourbonみたいにincludePathsな記述ができなかったので直接パスを書いてしまってます。
他にいい方法があれば教えてください。
PlayFramework でDBにバイナリデータを保存したいときにModelクラスにどう書くか

PlayFrameworkではModelクラス（@Entityアノテーションを付けたクラス）を作成することで、自動的にcreate文のSQlを発行し、クラスに定義した内容に合わせてテーブルを作成してくれる機能があります。
その時バイナリデータを保存するカラムの書き方がわからず時間を食ってしまったので記録しておきます。

書き方としては以下です。

`@Lob
	public byte[] paramBlob;
`

実装のサンプルとしては以下です。

```java:TbParam.java
package models.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import play.db.ebean.Model;

@Entity
public class TbParam extends Model {

	@Id
	public Integer id;
	@Lob
	public byte[] paramBlob;

	public TbWorkParam(){
	}

}
```
上記の書き方でmysql環境ではカラムparamBlobがlongblob型にて作成されます。
phpの基本的な配列操作で上手くいかなかったときの経験

phpの配列操作で自分では「いける」って思っていたけどだめだったときの経験を記録しておきます。
基本的なところかもしれませんが、同じところでつまずく方もいるかもしれないので、その場合は参考にしていただければと思います。
またそもそももっといい書き方があるよっていう場合はご指摘いただければ幸いです。



#「いける」って思ったコード
まず「いける」って思ったけど実行結果が期待どおりにならなかった場合

```php:array-test.php
<?php

$box = array();

for ($i = 1; $i <= 10; $i++) {
    if(($i % 2) == 0){
        $arr = array($i => "even");
        $box =  array_merge($box,$arr);
        printf($i . "/");
    }
    
}

foreach($box as $key => $value){
   printf($key . ":" . $value);
}

?>
```

実行結果

```
2/4/6/8/10/0:even1:even2:even3:even4:even
```

#実際にやりたかったことができたコード
次に実際にやりたかったことができた場合

```php:array-test２.php
<?php

for ($i = 1; $i <= 10; $i++) {
    if(($i % 2) == 0){
        $box[$i] = "even";
        printf($i . "/");
    }
    
}

foreach($box as $key => $value){
   printf($key . ":" . $value);
}

?>
```

実行結果

```
2/4/6/8/10/2:even4:even6:even8:even10:even
```

実行結果を比較すると、配列のキーが異なっていることがわかります。
phpはじめたときにしばらくはまってしまいました。
yii2をcomposer-asset-pluginから自由にする

## はじめに

PHPのアプリケーションフレームワーク[yii(以下yii2)](http://www.yiiframework.com/)は、FastでSecureでプロユースですが、ビルドに一手間掛かるのが玉に瑕です。
その手順は、[公式ドキュメント](http://www.yiiframework.com/doc-2.0/index.html)のファーストビューに飛び込んできてしまうほどです。
今回は、yii2をFastにビルドするコネタを紹介します。

## 課題

ビルドの一手間を具体的に確認してみます。

>[公式ドキュメント](http://www.yiiframework.com/doc-2.0/index.html)より
```
composer global require "fxp/composer-asset-plugin:^1.2.0"
composer require yiisoft/yii2
```

composerを用いて、2つのコンポーネントをインストールしています。2行目は、我らがyii2の本体となります。
1行目でインストールしている```fxp/composer-asset-plugin```の[リポジトリ](https://github.com/fxpio/composer-asset-plugin)を一読してみると

>This plugin works by transposing package information from NPM or Bower to a compatible version for Composer. This allows you to manage asset dependencies in a PHP based project very easily.

とあります。
NPMやBowerで管理されているライブラリをcomposer互換に整理してくれるツールの様です。yii2では、このツールをフロントエンドライブラリのパッケージマネージャとして利用するわけですが、以下の問題が生じます。

1. グローバルにインストールする
1. フロントエンドを必要としないアプリケーション(WebAPI等)には不要
1. インストールの所要時間が長い

1は言わずもがなですが、サーバの環境は可能な限りクリーンにしておきたいものです。  
2については、ビューを提供するWEBアプリケーションであれば必要コストなので問題ありませんが、フロントエンドを必要としないWebAPI(JSON over HTTP)なアプリケーションの場合は、面倒なだけです。  
3については、後ほど記載しますが、所要時間が想像以上に長く、yii2の価値を毀損しているのではないかと思うほどです。  

私の所属するチームでは、WebAPIの開発も担当しています。
実現したいことは、__```fxp/composer-asset-plugin```をインストールすることなくyii2で実装したアプリケーションをビルドする__ことです。

## 方法

簡単です。同じような課題意識を持った先輩の肩に乗るだけです。

- [cebe/assetfree-yii2](https://github.com/cebe/assetfree-yii2)

composer.jsonに上記のコンポーネントを追加します。注意点としては、```cebe/assetfree-yii2```とyii2本体のバージョンを合わせることです。

- yii2のバージョンを2.0.7とする場合
```
"yiisoft/yii2": "2.0.7",
"cebe/assetfree-yii2": "2.0.7"
```

追加後は、```composer install```でインストールしていきます。事前に```composer global require "fxp/composer-asset-plugin:^1.2.0"```コマンドを実行する必要はありません。

## 成果

私の所属するチームでは、OpsWorksを利用しており、アプリケーションのデプロイもOpsWorksが担当します。
```cebe/assetfree-yii2``` 導入前後デプロイの所要時間をOpsWorksのログファイルから拾ってみました。

- before : 2分37秒
```
[2017-01-21T01:59:56+09:00] INFO: Processing script[install_composer] action run (/srv/www/apollo_app_stg/releases/20170120165934/deploy/before_restart.rb line 24)
[2017-01-21T02:02:33+09:00] INFO: script[install_composer] ran successfully
```

- after : 1分10秒
```
[2017-01-21T01:54:30+09:00] INFO: Processing script[install_composer] action run (/srv/www/apollo_app_stg/releases/20170120165407/deploy/before_restart.rb line 24)
[2017-01-21T01:55:40+09:00] INFO: script[install_composer] ran successfully
```

所要時間が半分以下になりました。デプロイ時のコマンドも省略することが出来ました。

## おわりに

yii2をFastにビルドする方法を紹介致しました。次期バージョンでは、```fxp/composer-asset-plugin```の利用がオプションになるかもとのことですが、当面はお付き合いする必要がありそうです。
Fastといえば、PHP7の[事例](http://www.yiiframework.com/forum/index.php/topic/63662-yii2-and-php-7/page__view__findpost__p__299411)もぼちぼち挙がっている様です。こちらも機会を伺ってチャレンジしてみたいと思います。

## 参考

- [Yii 2.0.x で Composer Asset Plugin を使わないでアプリを作っていく方法 - Qiita](http://qiita.com/livejam_db/items/70d674d0d735038ef93f)
Jupyter / matplotlib > イメージのサイズを調整する > fig.set_size_inches()

### TensorFlow

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
```

v0.1 http://qiita.com/7of9/items/8b43357bcaea1f1bce4b

画像を複数表示する時に、１つのページ内の表示数を増やすため、イメージのサイズを調整したいことがある。

参考 http://stackoverflow.com/questions/332289/how-do-you-change-the-size-of-figures-drawn-with-matplotlib

> answered Nov 29 '10 at 17:30
> Pete

```
fig = matplotlib.pyplot.gcf()
fig.set_size_inches(18.5, 10.5)
fig.savefig('test2png.png', dpi=100)
```

試してみた。

showIn2D_2image_subplot_each()において、` fig1.set_size_inches(3.14,3.14)`としてみた。

```py:in100_out100.ipynb
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

'''
v0.4 Jan. 21, 2017
  - set size of figures
v0.3 Jan. 21, 2017
  - show 2 images in one figure
v0.2 Jan. 14, 2017
  - calcOutput() return in numpy.array
  - add saveToCsvFile()
v0.1 Jan. 14, 2017
  - add calcOutput()
  - add showIn2D()
  - show 1d in 2d format
'''

XDIM = 10
YDIM = 10
INDIM = XDIM * YDIM


def saveToCsvFile(data_1d, filename):
    wrk_1d = data_1d.reshape(1,INDIM)
    np.savetxt(filename, wrk_1d, delimiter=',')

    
def calcOutput(in_1d):
    len_1d = XDIM * YDIM
    out_1d = [0.0] * len_1d
    for idx in range(0, in_1d.size):
        out_1d[idx] = in_1d[len_1d - idx - 1]
    return np.array(out_1d)


def showIn2D(data_1d):
    # print(data_1d)
    data_2d = np.reshape(data_1d, (XDIM, YDIM))
    plt.imshow(data_2d, extent=(0, XDIM, 0, YDIM), cmap=cm.gist_rainbow)
    plt.show()

def showIn2D_2image_subplot_each(data1_1d, data2_1d):
    data1_2d = np.reshape(data1_1d, (XDIM, YDIM))
    data2_2d = np.reshape(data2_1d, (XDIM, YDIM))
    fig1 = plt.figure(1)
    fig1.set_size_inches(3.14,3.14)
    plt.subplot(121)
    plt.title('input node')
    plt.imshow(data1_2d, extent=(0, XDIM, 0, YDIM), cmap=cm.gist_rainbow)
    plt.subplot(122)
    plt.title('output node')
    plt.imshow(data2_2d, extent=(0, XDIM, 0, YDIM), cmap=cm.gist_rainbow)    
    plt.show()

def showIn2D_2image_subplot_first(data1_1d, data2_1d):
    data1_2d = np.reshape(data1_1d, (XDIM, YDIM))
    data2_2d = np.reshape(data2_1d, (XDIM, YDIM))
    fig, (axL, axR) = plt.subplots(ncols=2, figsize=(10,4))
    axL.imshow(data1_2d, extent=(0, XDIM, 0, YDIM), cmap=cm.gist_rainbow)
    axL.grid(True)
    axR.imshow(data2_2d, extent=(0, XDIM, 0, YDIM), cmap=cm.gist_rainbow)
    axR.grid(True)
    fig.show()    
    
if __name__ == '__main__':
    for loop in range(5):
        in_1d = np.random.rand(INDIM)
        out_1d = calcOutput(in_1d)    
        showIn2D_2image_subplot_each(in_1d, out_1d)
        showIn2D_2image_subplot_first(in_1d, out_1d)
    
    saveToCsvFile(in_1d, 'test_in.csv')
    saveToCsvFile(out_1d, 'test_out.csv')
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/242374ea-9ecc-61be-6937-2bd8beb23beb.png)
Jupyter / matplotlib > 2つのイメージを表示する > 2つの実装 (1:成功, 2:失敗)

### TensorFlow

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
```

v0.1 http://qiita.com/7of9/items/8b43357bcaea1f1bce4b

2つの画像を横に並べて表示しようとしている。

前回 http://qiita.com/7of9/items/68da222129dc657eac54
参考 http://qiita.com/supersaiakujin/items/543053ca4610437112df

2つの方法を試してみた。

- 方法１. 各画像に対してplt.subplot()をコールしてからplt.imshow()
- 方法2. 最初にplt.subplots(ncols=2)をコールしておく

### code 


以下において、
showIn2D_2image_subplot_each()が方法１。
showIn2D_2image_subplot_first()が方法２。

```py:in100_out100.ipynb
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

'''
v0.3 Jan. 21, 2017
  - show 2 images in one figure
v0.2 Jan. 14, 2017
  - calcOutput() return in numpy.array
  - add saveToCsvFile()
v0.1 Jan. 14, 2017
  - add calcOutput()
  - add showIn2D()
  - show 1d in 2d format
'''

XDIM = 10
YDIM = 10
INDIM = XDIM * YDIM


def saveToCsvFile(data_1d, filename):
    wrk_1d = data_1d.reshape(1,INDIM)
    np.savetxt(filename, wrk_1d, delimiter=',')

    
def calcOutput(in_1d):
    len_1d = XDIM * YDIM
    out_1d = [0.0] * len_1d
    for idx in range(0, in_1d.size):
        out_1d[idx] = in_1d[len_1d - idx - 1]
    return np.array(out_1d)


def showIn2D(data_1d):
    # print(data_1d)
    data_2d = np.reshape(data_1d, (XDIM, YDIM))
    plt.imshow(data_2d, extent=(0, XDIM, 0, YDIM), cmap=cm.gist_rainbow)
    plt.show()

def showIn2D_2image_subplot_each(data1_1d, data2_1d):
    data1_2d = np.reshape(data1_1d, (XDIM, YDIM))
    data2_2d = np.reshape(data2_1d, (XDIM, YDIM))
    fig1 = plt.figure(1)
    plt.subplot(121)
    plt.title('input node')
    plt.imshow(data1_2d, extent=(0, XDIM, 0, YDIM), cmap=cm.gist_rainbow)
    plt.subplot(122)
    plt.title('output node')
    plt.imshow(data2_2d, extent=(0, XDIM, 0, YDIM), cmap=cm.gist_rainbow)    
    plt.show()

def showIn2D_2image_subplot_first(data1_1d, data2_1d):
    data1_2d = np.reshape(data1_1d, (XDIM, YDIM))
    data2_2d = np.reshape(data2_1d, (XDIM, YDIM))
    fig, (axL, axR) = plt.subplots(ncols=2, figsize=(10,4))
    axL.imshow(data1_2d, extent=(0, XDIM, 0, YDIM), cmap=cm.gist_rainbow)
    axL.grid(True)
    axR.imshow(data2_2d, extent=(0, XDIM, 0, YDIM), cmap=cm.gist_rainbow)
    axR.grid(True)
    fig.show()    
    
if __name__ == '__main__':
    in_1d = np.random.rand(INDIM)
    # showIn2D(in_1d)
    out_1d = calcOutput(in_1d)
    # showIn2D(out_1d)
    
    showIn2D_2image_subplot_each(in_1d, out_1d)
    showIn2D_2image_subplot_first(in_1d, out_1d)
    
    saveToCsvFile(in_1d, 'test_in.csv')
    saveToCsvFile(out_1d, 'test_out.csv')
```

### 結果 

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/06707780-c547-93cf-a6b3-3de414c9033e.png)

方法１の結果は表示され、方法２の結果は表示されなかった。
React Nativeで作ったアプリをVisual Studio Mobile Centerで配布する

[Visual Studio Mobile Center](https://www.visualstudio.com/ja/vs/visual-studio-mobile-center/)を使ってReact Nativeアプリを配布する方法を説明します。

# 配布用のアプリを用意する

```terminal
$ react-native init RNDemoApp
$ cd RNDemoApp
$ git init
$ git add .
$ git commit -m "Bootstrap React Native project"
```

GitHubに新規リポジトリを作成してローカルで作ったコードをプッシュする。

```terminal
// 自分で作成したリポジトリに置き換えてください
$ git remote add origin git@github.com:mkamakura/RNDemoApp.git
$ git push -u origin master
```

# Visual Studio Mobile Centerに配布するアプリを登録する

https://mobile.azure.com/login にアクセスしてGitHubアカウントでログインします。
ログインしたら`Add a new app`ボタンを押してアプリを追加します。

![image](https://qiita-image-store.s3.amazonaws.com/0/13263/7622bf61-dd7f-31d4-2b85-644cdfdf4379.png)

Androidも`Android-RNDemoApp`という名前で作成しました。

# ビルド設定をする

まずMobile Centerに登録したAppにGitHubに作成したリポジトリを紐付けます。

Mobile Centerのサイドメニューにある`Build`から先程作成したリポジトリを選択します。(`iOS`、`Android`それぞれ実行する必要があります)

![image](https://qiita-image-store.s3.amazonaws.com/0/13263/eadfca49-9849-135e-6164-1060ce75b079.png)


## `iOS`のビルド設定

```terminal
$ open ios/RNDemoApp.xcodeproj
```

![image](https://qiita-image-store.s3.amazonaws.com/0/13263/f0e0f6a6-ff55-5879-76c8-bbfff3656cae.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/13263/180efefb-aa8f-d6aa-8c7e-1fed4caaa295.png)

`Product>Scheme>Edit Scheme...`を開いて`Build Configuration`を`Release`にする
![image](https://qiita-image-store.s3.amazonaws.com/0/13263/51d214b0-4001-71c6-a8f9-39e65d53ad35.png)

`RNDemoAppTests`の項目のチェックボックスを外す
![image](https://qiita-image-store.s3.amazonaws.com/0/13263/fe1113ec-cb2f-f7f6-39d6-a565b586923d.png)


XCodeを閉じて変更をCommit&Pushする。

```
$ git add .
$ git commit -m "Add iOS Signing Info"
$ git push origin master
```

Mobile Centerからアプリのbranch設定をします。

![image](https://qiita-image-store.s3.amazonaws.com/0/13263/f22cc69d-16b5-068c-2749-282952737b08.png)

`iOS`のビルド設定が完了すると、自動的にビルドが実行されます。

## `Android`のビルド設定

```terminal
$ keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
```

terminalからkeystoreを作成して、Mobile CenterのAndroidアプリのbranch設定をします。

![image](https://qiita-image-store.s3.amazonaws.com/0/13263/6e38841d-7b3d-48d1-4ad9-947d7ab15064.png)

セットアップが完了するとビルドが実行されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/13263/6e58583f-d128-6a77-8d0b-b0fe08b0f9a0.png)

# 実機での確認

ビルドが成功するとインストールのリンクが貼られたメールが届きます。
![image](https://qiita-image-store.s3.amazonaws.com/0/13263/e954fe63-2cbc-9811-a70a-e84f8f07d1ee.png)

インストールが完了したらアプリを起動して、動作を確認しましょう。
![image](https://qiita-image-store.s3.amazonaws.com/0/13263/0aaeb1b1-4e24-f300-da1a-f07fc4abff79.png)

キャプチャはiPhoneの画面ですが、流れは`Android`も同じです。

# 参考
この記事は以下の動画を参考に作成しました。不明な点がある場合は動画も参考にしてください。
https://www.youtube.com/watch?v=lfqZ8Uy2p3U
技術英語 > It's [faster and neater] than using a temporary variable. / neatとtidyの違い

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

```py
a = a - 3
```

> It's **<font color=red>faster and neater</font>** than using a temporary variable.

http://learnersdictionary.com/definition/neat
> 1 : not messy : clean and orderly

<hr>
neatとtidyの違い

https://oshiete.goo.ne.jp/qa/4544157.html

> 余計なものが乗っていないのがneat
ペンなどがちゃんとペン入れに収まっているのがtidy

...
> つまりneatは全体的に整理されていること、tidyは小さなものがきれいにまとめられている状態です。
スライシングを禁止する

C++ ではスライシングと呼ばれている現象があります。 これは派生クラスのオブジェクトが基底クラスに型変換したときに情報が切り詰められるというものです。 特に仮想クラスを継承したクラスにおいて問題を生じやすいということが知られています。

端的に説明した記事が以前に投稿されているので、これを見ればどういう現象なのかよくわかります。

》》 [C++のスライシング](http://qiita.com/Nabetani/items/d80397ce0327429f1f86)

仮想クラスを必要とする状況というのは、その仮想クラスを継承するクラスがインターフェイスは同じで挙動は変えたいという場合です。 それなのに派生クラスで定義したメンバ関数が全て消えて基底クラスのふるまいをするようになるのは困ったことです。

こうなるのは実際に生成されるコードを考えれば理解できる話ではあるのです。 仮想クラスのオブジェクトは一般的に仮想関数テーブルへのポインタを持つように実装され、その仮想クラスから派生したクラスのオブジェクトは別の仮想関数テーブルへのポインタを持ちます。 派生クラスで仮想メンバ関数を上書きしたメンバ関数は派生クラスのデータメンバにアクセスする可能性があるので基底クラスに型変換したときに消えてしまうデータメンバへアクセスしようとすると辻褄が合わなくなります。 (仮想クラスである) 基底クラスに型変換するときは仮想関数テーブルも基底クラスのものに置き換えざるを得ません。

可能であればスライシングが起こっても辻褄が合うように定義できるのならば望ましいですし、出来ないのならばスライシングしないように扱えば問題は起こりませんが、スライシングできないように定義するのは良い考えです。 必要な機能を付けるだけでなく[使ってはいけないときに使えないようにすること](http://qiita.com/SaitoAtsushi/items/e2847efef72d7e7b9959#%E5%88%B6%E7%B4%84%E3%81%AE%E9%87%8D%E8%A6%81%E6%80%A7)の重要性を私はしばしば述べていますが、今回もその一環です。

元記事のコードを改良したものを書いてみました。 基底クラスのコンストラクタや代入演算子を削除することで問題のある個所がエラーにできたようです。 コンストラクタなどに `default` や `delete` を指定できるのは C++11 からの機能ですが、それ以前でも `private` 指定することで `delete` したのと同じような効果を得ることはできます。

```cpp
#include <iostream>

struct Base {
  virtual void print() const {
    std::cout << "Base" << std::endl;
  }
  Base()=default;
  Base(Base& x)=default;
  template<class T> Base(T& x)=delete;

  Base & operator=(Base const &)=default;
  template<class T> Base & operator=(T const &)=delete;
};

struct Derived : public Base {
public:
  void print() const {
    std::cout << "Derived" << std::endl;
  }
};

void print_val(Base v) {
  v.print();
}

void print_ref(Base& r) {
  r.print();
}

int main(void) {
  Base base;
  Derived derived;

  print_val(base);    //=> Base
  print_val(derived); //=> ここがエラーになる。 この行をコメントアウトするとコンパイル可能
  print_ref(base);    //=> Base
  print_ref(derived); //=> Derived

  return 0;
}
```
Redmine でチケット更新時にフォームの値からウォッチャーを追加

# 対象

* Redmine : 3.3.1
* クライアント : Linux, Firefox 50.1.0

# やりたいこと

ユーザー選択のフィールドを持つチケットを更新するときに、選択したユーザーをついでにウォッチャーに追加したい場合がある。
ウォッチャーの追加を自動にしたい。

# 方法

View Customize Plugin (https://github.com/onozaty/redmine-view-customize) を使う。

```js:/issues/\d+$
$(document).on("submit", "#issue-form", function() {
    var trackerId = "1";
    var statusId = "1";
    var userFieldIds = [
        "issue_custom_field_values_1",
        "issue_custom_field_values_2"
    ];

    if ($("#issue_tracker_id").length > 0) {
        if ($("#issue_tracker_id").val() !== trackerId) {
            return;
        }
    } else {
        if (!$("#content > div.issue").hasClass("tracker-" + trackerId)) {
            return;
        }
    }

    if ($("#issue_status_id").val() !== statusId) {
        return;
    }

    var userIds = [];

    for (var i = 0; i < userFieldIds.length; i++) {
        $("#" + userFieldIds[i]).each(function() {
            var $this = $(this);

            if ($this.is("select")) {
                if ($this.prop("multiple")) {
                    userIds = userIds.concat($this.val() || []);
                } else {
                    userIds.push($this.val());
                }
            } else if ($this.is("input")) {
                $("input[name='" + $this.attr("name") + "'][value!='']:checked").each(function() {
                    userIds.push($(this).val());
                });
            }
        });
    }

    if (!userIds) {
        return;
    }

    $.post(location.href + "/watchers", { "watcher": { "user_ids": userIds } });
});
```
ActiveRecord::Relationをmapでごにょごにょして厚切りJSONに変換する

データベースから取ってきたレコードの情報をJSファイルで使いた〜い。そんな時ありますよね？

そんなときは、はい、

![image](https://qiita-image-store.s3.amazonaws.com/0/92468/821b9422-366c-5106-9c57-0ea9214beb41.png)
出典：[面白いテレビ情報局](http://1noce.com/atsugirijason-trend)

**JSONに変換しましょう。**

でも全カラムの情報はいらない。しかもできればアソシエーションで取ってきた他のレコードの情報もJSONにぶっこみたい。
今回はそんなあなたのためにmapを使ったお手軽JSON変換の仕方を紹介します。

# DB構成
今回のゴールはツイッターのようなアプリをイメージして、

```
{
  "ジェイソン": ["why", "japanese", "people"],
  "たろう": ["おはよう", "ありがとう"]
}
```
こんな感じのJSONデータを取得することをゴールにします。

usersテーブルとtweetsテーブルがあるとして、

```
usersテーブル
  ｎameカラム

tweetsテーブル
  textカラム

association
  user has_many tweets
  tweet belongs_to user
```

こんな感じのテーブルを想定します。

# コードはよ

```rb
User.all.map{ |user| [user.name, user.tweets.pluck(:text)] }.to_h.to_json
```

はい、これだけです。
順を追ってみていきましょう。

# ①ハッシュにしたいけどmapをつかっちゃう

```rb
User.all.map{ |user| ~~ }
```

ruby界のJSONといえばハッシュですよね？なんかぱっと見よく似てるしハッシュならJSONにすぐ変換できそうですよね。
しかしrubyにはブロック内で処理をして結果ハッシュを返してくれるような都合のいいメソッドに僕はまだ出会っていません。
**なのでまずはmapを使って配列を生成します。**

# ②[キー, 値]の順番で取得する
```rb
User.all.map{ |user| [user.name, user.tweets.pluck(:text)] }
```
**mapで取得する配列は[キー, 値]の順番で取得します。**
今回は下記のような形なので、
{"ジェイソン": ["why", "japanese", "people"]}

配列の一つ目にユーザー名、二つ目にpluckしてtext情報の配列を取得しています。

# ③配列をハッシュに

```rb
User.all.map{ |user| [user.name, user.tweets.pluck(:text)] }.to_h
```

**取得した配列をto_hメソッドでハッシュに変換します。**
このとき、配列が二重配列だと、

```
[
  ["ジェイソン": ["why", "japanese", "people"]],
  ["たろう": ["おはよう", "ありがとう"]]
].to_h

=>
{
  "ジェイソン": ["why", "japanese", "people"],
  "たろう": ["おはよう", "ありがとう"]
}
```
という形に変換してくれます。便利ですね〜。

# ④ハッシュをJSONに
```rb
User.all.map{ |user| [user.name, user.tweets.pluck(:text)] }.to_h.to_json
```

**ハッシュに対してto_jsonメソッドを使用してJSONにします。** ハッシュとJSONの構造はとても良く似ているのでイメージは簡単ですよね。
to_hメソッドを間に挟まずにto_jsonメソッドを配列に使用してしますと、キーと値の関係がうまく反映されなくなってしまうので、
**一度to_hメソッドを挟むのが肝です**

# おわり
はい、どうでしょうか？ちゃんとJSONに変換できましたか？
こんなまどろこっしいことしなくてももっと簡単な方法あるよ！という方、コメント待ってます！では！
js 複数の数字の最小公倍数を求める（ユークリッドの互除法使用）

##お題
引数で与えらえた二つの数字の範囲の数の最小公倍数をもとめる。
例　引数`[5,1]`の場合、`1,2,3,4,5`の最小公倍数`60`を求める
・n>0
・二つの数字の並びは昇順とは限らない

[最大公約数](https://ja.wikipedia.org/wiki/%E6%9C%80%E5%A4%A7%E5%85%AC%E7%B4%84%E6%95%B0)　greatest common divisor
2つ以上の整数において，それらに共通する約数を公約数といい，公約数のうち最大のものが最大公約数
[最小公倍数](https://ja.wikipedia.org/wiki/%E6%9C%80%E5%A4%A7%E5%85%AC%E7%B4%84%E6%95%B0)　least common multiple
2つ以上の整数において，それらに共通する倍数を公倍数といい，正の公倍数のうち最小のものが最小公倍数

```js
function smallestCommons(arr) {
    //write your code.
}
smallestCommons([5,1]); //60
```

##出力結果　例

```js
([1,7])//420
([1, 13])// 360360
([23, 18])// 6056820
```

##つかったもの
Math.max()
Math.min()
push()
reduce()
for文
if文
[ユークリッドの互除法](https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%BC%E3%82%AF%E3%83%AA%E3%83%83%E3%83%89%E3%81%AE%E4%BA%92%E9%99%A4%E6%B3%95)
2 つの自然数 a, b (a ≧ b) について、a の b による剰余を r とすると、 a と b との最大公約数は b と r との最大公約数に等しいという性質が成り立つ。この性質を利用して、 b を r で割った剰余、 除数 r をその剰余で割った剰余、と剰余を求める計算を逐次繰り返すと、剰余が 0 になった時の除数が a と b との最大公約数となる。


##考え方
・引数から範囲の数字を降順に配列にいれる。(最初の二つの数の最小公倍数が共通の公倍数である可能性が高くなる)
Math.max(),Math.min()で最小と最大の数を判定し、用意した配列にfor文で範囲の数をpush()する。

・最小公倍数(lcm)は二つの数を掛けて、最大公約数(gcd)で割ると求めることができる。
例　5と4の場合、5*4/1=20 20がlcm 1はgdc

連続する数字の最小公倍数を求める場合は最初の二つの数のlcmを求め、lcmと次の数のlcmをもとめてlcmを更新していく。最後に返ってくる数が全体のlcm。
二つの数の比較はreduce()またはfor文などで実行できる。

例　[5,1]の場合　→[5,4,3,2,1]
5*4/1 =20
20*3/1 =60
60*2/2 =60
60*1 =60 　全体のlcmは60

・gdcはユークリッドの互除法を使って求める
→剰余が 0 になった時の除数が a と b との最大公約数

例　5と4のgdc
5÷４ = 1・・・1
4÷1 = 1・・・0 
1がgdc


##コード

```js
function smallestCommons(arr) {
    var range = [];
    for (var i = Math.max(arr[0], arr[1]); i >= Math.min(arr[0], arr[1]); i--) {
    range.push(i);
    }

    return range.reduce(function(previousValue, currentValue) {
    var gcdPrevCurr = gcd(previousValue, currentValue);
    return (previousValue * currentValue) / gcdPrevCurr;
    });

    function gcd(x, y) {    // ユークリッドの互除法使用
    if (y === 0)
        return x;
    else
        return gcd(y, x%y);
    }
}
smallestCommons([5,1]);//60
```


###他にもコードが浮かんだ方、コメントお待ちしております。
ESLintの--fixはソースを破壊する！本当？？

そういうものなの？破壊的なものはやめてもらいたいんだけど......(背景を追記。＆続きは、別記事......)

# 環境

* **ESLint Version:**3.13.1
* **Node Version:**7.4.0
* **npm Version:**4.1.1

```js:.eslintrc.js(まだいじりかけ)
module.exports = {
  extends: 'airbnb',
  rules: {
    'no-unused-vars': ['error', { vars: "all", args: 'none' }],
  }
}
```

# サンプル

```js:fix前
function foo(key) {
  var value = map[key];
  if(!value){
    return;
  }
  // do something....
}
```

```js:fix後
function foo(key) {
  var value = map[key];
  if(!value){
  }
  // do something....つねにここに通っちゃうのですか？？？
}
```

## 背景

- Atomで、linter-eslintを使っている。
- linter-eslintでは、保存時のautofixを使っている。(インデントがグダっていても平気！スイスイかける！！)
- コード書いたらガンガン保存。
- コードの記述は「条件チェックでreturn;残りは後で！」って感じで、わかることを書いてあっちこっちに行くスタイル。

# 結論

Atomで保存するときに自動でESLintに直させるのは危険。
誰だ？そんな危険な状態にしたのは？？ってか、そういうものなんでしょうか？？？
Doxygenでヘッダファイルの依存関係を確認しよう

　プログラムを開発しているときに、「この依存性は変だな」と感じるときがある。

　そのようなときは、[doxygen](http://www.stack.nl/~dimitri/doxygen/) と[graphviz](http://www.graphviz.org/) でinclude の依存性を確認しよう。ヘッダファイルで宣言されている内容を知るべき範囲以上に、そのヘッダファイルのincludeが波及していないか。
　「動けばいいんだ」というスタンスのコーディングをしていると、単体テストさえ「動かない」コードができあがる。


###**危険な兆候**

- ヘッダファイルのincludeがソースコード全体に広く深く広がっている。
- 名前空間の依存関係が、相互にお互いを利用する関係になっている。
- ヘッダファイル名から予想される範囲を超えて、ヘッダファイルの依存関係が広がっている。
 
その結果「単体テストしようとすると、結局全体のコードをlinkの対象に含めなくてはならなくなった」などという状況が発生しやすくなります。開発者は、どのコードは○○のモジュールには本来関係しないはずということを知っているでしょう。そのようなときに、何が依存性を招いてしまったのかを確かめます。


###**対策の手順**
- このモジュールは "something.h" のヘッダを本来必要としない設計であるべき思う。
- そのモジュールの中の\#include "something.h"の行をコメント化してみる。
- そのとき見つからなくて、ビルドエラーを生じたマクロ名を調べてみる。
- それが、"something.h" の大半だったら、必要なincludeです。
- それが、"something.h"のごく少数の宣言だったら、something.h からbar.h (仮名)として切り出して、\#include "bar.h"　に置き換える。

この手法で、"something.h"をincludeするモジュールの範囲が広すぎるのを解消することができます。
　

###**Doxyfileの書き方**
それでは、自分の関わっているソースコードに危険な兆候が生じていないかを知るためにdoxygenでDoxyfileに次の行を含めておきます。


```
INCLUDE_GRAPH          = YES
INCLUDED_BY_GRAPH      = YES
```
　

> CALL_GRAPH が YES であれば、各関数が 　　　直接・間接に呼び出す関数を示す、呼び出し関係図が描画されます。
CALLER_GRAPH が YES であれば、各関数を 　　　直接・間接に呼び出す関数を示す、被呼び出し関係図が描画されます。

[http://www.doxygen.jp/]
(http://www.doxygen.jp/diagrams.html)から引用


こうすることで、依存性の広がりを抑えて、単体テストをしやすいコードに少しづつ変えていくことができます。


-------------------------
参考にしたURL
[Doxygen を使おう](http://www.fides.dti.ne.jp/~oka-t/doxygen.html#sample)

[doxygen+graphvizでファイルの依存関係をグラフ化]
(http://d.hatena.ne.jp/heisseswasser/20110322/1300771800)

[How to create header include graph using Doxygen](https://codeyarns.com/2013/12/24/how-to-create-header-include-graph-using-doxygen/)