OmniAICreator/Qiita-1.07M huggingface dataset:
React(Javascript)でファイルの命名規則をどうするかという問題


どっちにするべきか悩んだのでgithubのレポジトリで `https://github.com/search?o=desc&p=1&q=react&s=stars&type=Repositories&utf8=%E2%9C%93`って感じに「react」「Star多い順」で調べてみた。3pageくらいみたところ、結果は以下。


## キャメルケース派

FileName.jsってやつ。

https://github.com/erikras/react-redux-universal-hot-example
[react-bootstrap/react-bootstrap](https://github.com/react-bootstrap/react-bootstrap)
[gaearon/react-hot-loader](https://github.com/gaearon/react-hot-loader)

## スネークケース派

file_name.jsってやつ。

https://github.com/ruanyf/react-demos
https://github.com/react-toolbox/react-toolbox
https://github.com/reactjs/react-rails
[rackt/react-router](https://github.com/rackt/react-router)
 
## ハイフン派

hoge-huga.jsってやつ。
キャメルケースvsスネークケースかとおもいきや、一定数存在した。

[react/examples at master · facebook/react](https://github.com/facebook/react/tree/master/examples) 
[callemall/material-ui](https://github.com/callemall/material-ui)
[chenglou/react-motion](https://github.com/chenglou/react-motion)
[radium/computed-well.jsx at master · FormidableLabs/radium](https://github.com/FormidableLabs/radium/blob/master/examples%2Fcomponents%2Fcomputed-well.jsx)

## まぜまぜ派

[facebook/relay](https://github.com/facebook/relay)

app.jsとかいたり、FileName.jsと書いたりもうなんなんだろうか。

# 結論：「好きにすればいい」

明確な結論がでました。ありがとうございました。

統一感さえでればいいと思うのでプロジェクトの好みで。

railsが基本的にスネークケースなのでreactｘrailsでいくときはよりそのほうが自然なんじゃないかと思う。react-railsのプロジェクトもスネークケースですし。
RPi / python > plotly > 時系列グラフ > 1. 固定時刻 / 2. 3秒ごとにプロット / 3. リストでまとめてプロット

http://qiita.com/7of9/items/345c854e8e8b2edaa83e
の続き。

今度は時系列グラフにする。

## try1 > 固定時刻

```plotlyTimeGraph.py
import plotly.plotly as py
py.plot({
	"data":[{
		"x":["2016-01-03 12:30:45","2016-01-03 12:30:55","2016-01-03 12:31:05"],
		"y":[4,2,5]
	}],
	"layout":{
		"title":"graph as a function of time"
	}
},filename='timegraph160103'
,fileopt='extend'
,privacy='public')
```

"x"の指定に年月日、時分秒の文字列を入れるようにする。

結果　https://plot.ly/272/~7of9/


## try2 > 現在時刻 3秒ごとにプロット　

以下の実装により３秒ごとにプロットできるようになった。

```160103-randomPlot.py
import plotly.plotly as py
import time
import datetime

while True:
	today = datetime.datetime.today()
	xdt = today.strftime("%Y-%m-%d %H:%M:%S")
	yval = 3.1415
	
	py.plot({
		"data":[{
			"x":[xdt],
			"y":[yval]
		}],
		"layout":{
			"title":"graph as a function of time"
		}
	},filename='timegraph160103'
	,fileopt='extend'
	,privacy='public')

	print "added at " + xdt
	time.sleep(3)
```

毎回アクセスするのも良くないので、リストに保持してまとめてプロットするように変更するのがいい。

## try3 > リストでまとめてプロット

参考
http://qiita.com/7of9/items/586f62fa46dc3409d954
のコメント。

リストで5個単位でプロットできるようになった。
これでplotlyへのアクセスが軽減できる。

```160103-listPlot.py
import plotly.plotly as py
import time
import datetime

xlist = [0] * 0
ylist = [0] * 0

while True:
	today = datetime.datetime.today()
	xdt = today.strftime("%Y-%m-%d %H:%M:%S")
	yval = 3.1415
	xlist.append(xdt)
	ylist.append(yval)
	
	if (len(xlist) < 5):
		time.sleep(3)
		continue

	py.plot({
		"data":[{
			"x":xlist,
			"y":ylist
		}],
		"layout":{
			"title":"graph as a function of time"
		}
	},filename='timegraph160103b'
	,fileopt='extend'
	,privacy='public')

	print "added at " + str(xlist[1:])

	del xlist[1:]
	del ylist[1:]

	time.sleep(3)
```

pythonのリストがまだよくわかっていない。

0個としての初期化は`xlist = [0] * 0`でいいのだろうか？

次は関数化。
既出だしチラシの裏レベルだけど、rails generateで生成したMVCなどを削除する話

# 環境に関して
 - rails 4.2.5 (bundlerにてインストール）
 - ruby 2.2.3 （rbenvにて管理中）
 - Mac OS X El Capitan

railsのバージョン以外、あまり関係ないだろうけど。

# rails generateで作ったものを削除したい時

scaffoldとかでいろいろと作成したものが不要になる。そんなときに。

ここでは、削除したいものを　direct_tag　とします。

## モデルを削除する。
```bash:terminal
$ bundle exec rails destroy model direct_tag
      invoke  active_record
      remove    db/migrate/20160103083403_create_direct_tags.rb
      remove    app/models/direct_tag.rb
      invoke    test_unit
      remove      test/models/direct_tag_test.rb
      remove      test/fixtures/direct_tags.yml
```

## コントローラを削除

```bash:terminal
$ bundle exec rails destroy controller direct_tag
      remove  app/controllers/direct_tag_controller.rb
      invoke  erb
      remove    app/views/direct_tag
      invoke  test_unit
      remove    test/controllers/direct_tag_controller_test.rb
      invoke  helper
      remove    app/helpers/direct_tag_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    coffee
      remove      app/assets/javascripts/direct_tag.coffee
      invoke    scss
      remove      app/assets/stylesheets/direct_tag.scss


```

## ビューは・・・　rails destroyではダメみたい

```bash:terminal
$ bundle exec rails destroy view direct_tag
Could not find generator 'view'. Maybe you meant 'model', 'task' or 'mailer'
Run `rails generate --help` for more options.

```

# ついでに、データベースを１から作り直すケースも

この作業をやった時に、DBも整理したくなった。
マイグレーションファイルのうち、必要なものだけ残してあとは削除し

以下のようなコマンドを入力

```bash:terminal
$ bundle exec rake db:migrate:reset
== 20160102152201 CreatePages: migrating ======================================
-- create_table(:pages)
   -> 0.0021s
== 20160102152201 CreatePages: migrated (0.0023s) =============================

== 20160103074822 CreateExtags: migrating =====================================
-- create_table(:extags)
   -> 0.0021s
== 20160103074822 CreateExtags: migrated (0.0022s) ============================
```

# 参考
マイグレーションの実行(rake db:migrate) Rails ドキュメント
http://railsdoc.com/references/rake%20db:migrate
Scientific Linux 7.1 に yum で Chrome をインストールする

# 概要
Scientific Linux 7.1 に yum で Chrome をインストールする。

# 環境
```shell-session
cat /etc/redhat-release
```

```shell-session:stdout
Scientific Linux release 7.1 (Nitrogen)
```

# 手順

## 1. リポジトリを追加する

```shell-session
sudo emacs /etc/yum.repos.d/google-chrome.repo
```

```google-chrome.repo
[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub
```

## 2. リポジトリが登録されたか確認する

```shell-session
yum info google-chrome-stable
```

```shell-session:stdout
名前                : google-chrome-stable
アーキテクチャー    : x86_64
バージョン          : 47.0.2526.106
リリース            : 1
容量                : 171 M
リポジトリー        : installed
提供元リポジトリー  : google-chrome
要約                : Google Chrome
URL                 : https://chrome.google.com/
ライセンス          : Multiple, see https://chrome.google.com/
説明                : The web browser from Google
                    : 
                    : Google Chrome is a browser that combines a minimal design with
                    : sophisticated technology to make the web faster, safer, and easier.
```

## 3. インストールする

```shell-session
sudo yum install google-chrome-stable
```

## 4. 確認

`アプリケーション > インターネット > Google Chrome` にアイコンが登録されていることを確認。


# 参考
- http://www.tecmint.com/install-google-chrome-on-redhat-centos-fedora-linux/
C++11の特殊メソッド自動生成ルール

## 特殊メソッド？
コンパイル時にルールに従って自動的にclassに追加されるメソッドの事。
C++11より前は4つでしたがC++11で**ムーブ演算**が追加され5つになりました。
その影響かどうかはわかりませんがメソッドの自動生成ルールが変更されている部分があるのでそれをまとめてみます。

※単語について
コピー演算 = コピーコンストラクタ と コピー代入演算子 の事。
ムーブ演算 = ムーブコンストラクタ と ムーブ代入演算子 の事。

## デフォルトコンストラクタ
前と同じでコンストラクタを宣言しないクラスの場合にのみ生成される。

## デストラクタ
デフォルトで `noexcept` になる点以外は前と同じ。

## コピーコンストラクタ
コピーコンストラクタを宣言しないクラスの場合にのみ生成される。
ムーブ演算を宣言したクラスの場合は生成されない。
コピー代入演算子やデストラクタを宣言したクラスに対するコピーコンストラクタの自動生成は非推奨。

## コピー代入演算子
コピー代入演算子を宣言しないクラスの場合にのみ生成される。
ムーブ演算を宣言したクラスの場合は生成されない。
コピーコンストラクタやデストラクタを宣言したクラスに対するコピー代入演算子の自動生成は非推奨。

## ムーブコンストラクタ および ムーブ代入演算子
C++11から追加された特殊メソッド。
コピー演算と違い、片方を宣言した場合もう片方は自動生成されなくなる。

コピー演算、ムーブ演算、デストラクタのいずれも宣言しないクラスの場合にのみ生成される。
RPi / python > Plotly再入門 > 1. user name, API Keyの設定 / 2. プログラム実行 > プロット追加は fileopt='extend'

```txt:動作確認
Raspberry Pi2
```

Unityのプログラムからplotlyへグラフプロットをしたことはあったが、今度はRaspberry Piからプロットすることになった。

https://plot.ly/python/getting-started/
を参考にやってみた。

## 前準備
https://plot.ly/python/getting-started/
に書いている以下を実行する。

```
$ sudo pip install plotly
$ python -c "import plotly; plotly.tools.set_credentials_file(username='DemoAccount', api_key='lr1c37zw81')"
```

DemoAccountは自分のアカウント、api_keyは自分のAPI KEYを入れて実行する。

API KEYの確認は　Settings > API settings のページを参照。

## プログラム

```plotlyDemo.py
import plotly.plotly as py
py.plot({
	"data":[{
		"x":[1,2,3],
		"y":[4,2,5]
	}],
	"layout":{
		"title":"hellow world"
	}
},filename='hello worled 160103',
	privacy='public')
```

上記を以下のように実行

```bash
$ python plotlyDemo.py
```

実際に追加されたのが以下
https://plot.ly/268/~7of9/

## 備考

pythonプログラムにusernameとAPI KEYを埋め込まなくていいのは良い。

RPiを再起動してプログラムを再実行しても、きちんとグラフプロットができた。設定は保持されているのだろう。

## プログラム（プロット追加）

既存のグラフへのプロット追加は
,fileopt='extend'
をつければよいようだ。　https://plot.ly/python/file-options/

```plotlyDemo.py
import plotly.plotly as py
py.plot({
    "data":[{
        "x":[9,10,11],
        "y":[4,2,5]
    }],
    "layout":{
        "title":"hellow world"
    }
},filename='hello worled 160103'
,fileopt='extend'
,privacy='public')
```
MQメモ　〜WebSphere MQ 入門書〜

## 資料のありか ##
[WebSphere MQ 入門書](https://www.ibm.com/developerworks/jp/websphere/library/wmq/mq_intro/)

## 1_WebSphere MQとは... ##
 * 相手のシステムが動いてなくてもメッセージを送ったことにできる、というのが本来の良さ。
 * パーシスタント・メッセージは、以下の場合でもメッセージがログに残る。※リトライはどうするのか？
   * ハードウェア障害で再起動したとき
   * ネットワーク障害が起きたとき  
 * 送信元と送信先のキュー・マネージャ同士で送達確認を行い、失敗したら、パーシスタント・メッセージであれば送信元のトランスミッション・キューに戻され、チャネル復旧後に再転送される(ちょっと怪しい)。
 * 退避キューは、送信先のキューが満杯の場合など、送信に失敗したメッセージを退避させておくためのもの。

## 2_WebSphere MQの構成要素 ##
 * 送信側にはリモートキュー定義があるが、これはあくまでも「リモートキューのローカル定義」であって、厳密には「リモートキューそのもの」ではない。送信側は、このリモートキュー定義に対してPUTすることになる。

## 5_WebSphere MQによる相互通信 その1 ##
 * 通信障害が発生した場合、パーシスタント・メッセージはトランスミッション・キューに戻される。チャネルが復旧したら再転送される。

## 6_WebSphere MQによる相互通信 その2 ##
 * MQのチャネルがネットワーク障害を検出できるのは、基本的には以下の場合だけ。
  * [送信側] メッセージなど、何らかのデータを送信しようとして、エラーが発生した時
  * [受信側] 受信のため呼び出したネットワークのインタフェースが、タイムアウトした時
 * チャネルがエラーを検出した場合、STATUS(Retrying)に状態遷移する。リトライアウトするとチャネルが停止する。
 * 送信中にネットワーク障害に遭遇したメッセージは、パーシスタント・メッセージであればトランスミッション・キューに戻され、チャネル復旧後に再転送される。

## 7_メッセージ ##
 * 同期点はあくまでもGETやPUTするときに開始する。これらの操作をUOWとしたいのだから、これは当然。

## 10_キュー・マネージャー・クラスター その1 ##
TODO:ここから先は、後で要学習。
Project Eulerをシェル芸で解いてみる(Problem 3)

# 概要
Project Euler[^pe]は、数学的な問題解決能力を要求する、プログラミング問題集である。
Project Eulerは、一般的なオンラインプログラミングジャッジとは異なり、解答するプログラミング言語は、特に限定されていない。
フォームに入力した値だけで正誤を判別するため、適切なアルゴリズムさえ考案できれば、手計算で解答することも可能である。
そのため、Web上では様々な手法による解答が公開されている。

しかし、シェル芸[^def]による解答は、私が探した限りでは、殆ど見つからなかった。
そこで、私自身の勉強も兼ねて、Project Eulerをシェル芸で解いてみることにした。
<br>
本記事では、Project EulerのProblem 3を、シェル芸で解いた際の過程を述べる。

# 実行環境
* Arch Linux (x86\_64, 4.3.3-2-ARCH)
* zsh (5.2)
* GNU coreutils (8.24)
* gawk (4.1.3)

# 問題文
[原文 ([https://projecteuler.net/problem=3](https://projecteuler.net/problem=3))]

> The prime factors of 13195 are 5, 7, 13 and 29.
> What is the largest prime factor of the number 600851475143 ?

[日本語訳 ([http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%203](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%203))]

> 13195 の素因数は 5, 7, 13, 29 である.
> 600851475143 の素因数のうち最大のものを求めよ.

正答は注釈[^ans]に記載する。

# 解法1
```shell
#!/bin/sh

factor 600851475143 \
| # 600851475143の素因数分解
awk '{print $NF}'
  # 600851475143の素因数のうち、最大の数値の出力
```

## 解法1の解説
この解法による処理の詳細は、コードに記載してあるコメントの通りである。

# 解法2
```shell
#!/bin/sh

echo 600851475143 \
| # 600851475143の出力
awk '{
    d=2; d++; q=$0/d;
    while(d <= q){
        if($0%d == 0){$0=q}
        else{d+=2}
        q=$0/d
    }
    print $0
}'
  # 2および3以上の奇数で割り切れる数値(素数)のうち、最大値を出力
```

## 解法2の解説
この解法による処理の詳細は、コードに記載してあるコメントの通りである。


# 参考にしたもの
1. 『C言語による最新アルゴリズム事典』、奥村 晴彦 著、技術評論社

# 雑記
* 「こんな別解があるよ」や、「こうすればもっと効率化できるぜ」、「こう書けばエレガントですわよ」等の意見がありましたら、気軽に教えていただけますと幸いです🐺
* 現在の進捗状況 -> [https://github.com/gin135/Project_Euler/tree/master/sh](https://github.com/gin135/Project_Euler/tree/master/sh)
<br>

* 解法1、身も蓋も無い方法だ...
    - さすがにこれだけだと面白くないので、解法2で自分で素因数分解することにした。
* 解法2は、参考書籍1のpp.154のアルゴリズムを拝借した。
    - あまり早くはないけれど、素朴でお手軽な手法。
    - 素因数分解アルゴリズムは、factorコマンドで用いているポラード・ロー法などがあるけれど...
    - 僕の貧弱な数学力だと理解するのが厳しかったので、お手軽な手法にしたorz
* 今回もまた、解説が投げやりだ...
    - 難しい問題になったら、ちゃんと書きますすいません...


- - -

[^pe]: About - Project Euler ([https://projecteuler.net](https://projecteuler.net))
[^def]: シェル芸の定義 >> シェル芸 - 上田ブログ ([https://blog.ueda.asia/?page_id=1434](https://blog.ueda.asia/?page_id=1434))
[^ans]: 6857
difference > handle / process > The word 'process' sometimes suggests that there is a standard method already established to do something

何かを処理するという意味で、関数のシグネチャとして自分が使ってきた process と handle について違いの調査。

<hr>
https://www.englishforums.com/English/ProcessVsHandle/xmdhq/post.htm

>There's often no difference intended. 

> The word 'process' sometimes suggests that there is a standard method already established to do something. So, if it's a new problem or situation, you can 'handle' it, but not really 'process' it.

<hr>
 
http://www.merriam-webster.com/dictionary/process

> 2 b(1)  :  to subject to or handle through an established usually routine set of procedures <process insurance claims>

<hr>

http://www.merriam-webster.com/dictionary/handle

> to do the work required for (something)

<hr>

ルーチン的な決まった事項を処理する場合はprocessでいいという案が出ている。

一方で、interrupt handlerや event handler のような場合に handle を使っていたりする。

まだまだ未消化。
Project Eulerをシェル芸で解いてみる(Problem 2)

# 概要
Project Euler[^pe]は、数学的な問題解決能力を要求する、プログラミング問題集である。
Project Eulerは、一般的なオンラインプログラミングジャッジとは異なり、解答するプログラミング言語は、特に限定されていない。
フォームに入力した値だけで正誤を判別するため、適切なアルゴリズムさえ考案できれば、手計算で解答することも可能である。
そのため、Web上では様々な手法による解答が公開されている。

しかし、シェル芸[^def]による解答は、私が探した限りでは、殆ど見つからなかった。
そこで、私自身の勉強も兼ねて、Project Eulerをシェル芸で解いてみることにした。
<br>
本記事では、Project EulerのProblem 2を、シェル芸で解いた際の過程を述べる。

# 実行環境
* Arch Linux (x86\_64, 4.3.3-2-ARCH)
* zsh (5.2)
* GNU coreutils (8.24)
* gawk (4.1.3)

# 問題文
[原文 ([https://projecteuler.net/problem=2](https://projecteuler.net/problem=2))]
> Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:
> 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
> By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.

[日本語訳 ([http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%202](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%202))]

> フィボナッチ数列の項は前の2つの項の和である. 最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである.
> 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
> 数列の項の値が400万以下の, 偶数値の項の総和を求めよ.

正答は注釈[^ans]に記載する。

# 解法
```shell
#!/bin/sh

a=1; b=2;
# 初項の設定

while :; do
    c=$(echo "$a+$b" | bc | tr -d '\n\\');
    echo $a;
    a=$b;
    b=$c;
done \
| # フィボナッチ数列の生成
awk '$0 <= 4000000; $0 > 4000000 {exit}' \
| # 数列の項の値が400万以下の項の出力
awk '$0 % 2 == 0 {sum += $0} END {print sum}'
  # 偶数の総和の出力
```

## 解法の解説
この解法による処理の詳細は、コードに記載してあるコメントの通りである。

# 雑記
* 「こんな別解があるよ」や、「こうすればもっと効率化できるぜ」、「こう書けばエレガントですわよ」等の意見がありましたら、気軽に教えていただけますと幸いです🐺
* 現在の進捗状況 -> [https://github.com/gin135/Project_Euler/tree/master/sh](https://github.com/gin135/Project_Euler/tree/master/sh)
<br>

* フィボナッチ数列の生成に関しては、シェル芸勉強会等でもっとエレガントな方法が考案されているかもしれない。
    - シェル芸勉強会、参加してみたいけど、参加したことがない(地理的に参加できない)...(´・ω・`)
* 今回も解説が投げやりだ...
    - だって、今回もそのまんまなんだもん...

- - -

[^pe]: About - Project Euler ([https://projecteuler.net](https://projecteuler.net))
[^def]: シェル芸の定義 >> シェル芸 - 上田ブログ ([https://blog.ueda.asia/?page_id=1434](https://blog.ueda.asia/?page_id=1434))
[^ans]: 4613732
RasPBXでSecurityWarningに遭遇した


# RasPBXでSecurityWarningに遭遇した

## 今回遭遇したSecurityWarningはこんなやつ
![SecurityWarning.png](https://qiita-image-store.s3.amazonaws.com/0/89027/e0d715c9-cd6f-8834-d969-82f4bc1be3fb.png)

Module: "FreePBX Framework", File: "/var/www/html/admin/bootstrap.php altered" 

/var/www/html/admin/bootstrap.php が変更されてて、やばいよやばいよ的なことを言いたいんだろうか？

## とりあえず修復

```shell-session
amportal chown
amportal a ma refreshsignatures
amportal a reload
```

RasPBXでは、どうやらこれらのコマンド達を実行することでよきに計らってくれるようだ

> That will ensure that all the files have the correct permissions, re-download any modules that you have on your machine that don't have signatures. and finally click the 'Reload Now' button for you. After that, all the warnings and errors should be gone!
Railsでの日付操作でよく使うものまとめ

## 対象バージョン

- ruby 2.1.2
- Rails 4.2.1


以下で利用している`Time`クラスは、ActiveSupportの拡張した`Time`クラスを利用しています。

https://api.rubyonrails.org/classes/Time.html

## 現在日時の取得

```ruby
now = Time.current 
```

## N日前・N日後

```ruby
now = Time.current 

# 昨日
now.yesterday

# 翌日
now.tomorrow

# N日前,N日後
now.ago(3.days)
now.since(3.days)
```

## Nヶ月前・Nヶ月後

```ruby
now = Time.current 

# 前月
now.prev_month

# 翌月
now.next_month

# Nヶ月前,Nヶ月後
now.ago(3.month)
now.since(3.month)
```

## N年前・N年後

```ruby
now = Time.current 

# 前年
now.prev_year

# 翌年
now.next_year

# N年前,N年後
now.ago(3.years)
now.since(3.years)
```

## その他

```ruby
now = Time.current 

# 月初
now.beginning_of_month

# 月末
now.end_of_month

# 今週の最初
now.beginning_of_week

# 今週の末
now.end_of_week

# 先週の月曜日
now.prev_week(:monday)

# 翌週の月曜日
now.next_week(:monday)

```
Ceemple OpenCV for Visual Studioを見つけた

OpenCV3.1をビルドしようと四苦八苦しているときにWindows用のコンパイル済みのOpenCV3.0の配布を見つけた。

OpenCVは高速化のためにどのライブラリを使うのかによって、ビルドのオプションが変わってきて、適切にビルドするのが、必ずしも容易ではなくなってくる。

Ceemple OpenCV for Visual Studio
http://www.ceemple.com/ceemple-opencv-visual-studio/

>Support for Windows 64 bit distribution and Visual Studio Community 2013


opencv.orgのNews(http://opencv.org/ceemple.html)
に以下の内容の記事がある。

>Ceemple is an innovative solution enabling rapid C++ based scientific computing. It features the productivity of MATLAB and Python, combined with the performance and integration of standard C++.

まだ、使い勝手は試していない。
OpeenCV3.0ならば、Windowsでも順調にCMake、Visual Studio でビルドできているので、コンパイル済みの配布にこだわっていないためです。
また、opencv_contrib(https://github.com/itseez/opencv_contrib)の内容は含まれていないため、opencv_contribを利用しようと思う人には適しません。

Cudaを使えるNVidiaのGPUをもっている64bit OSのWindowsを使っている人でコンパイル済みのOpenCV3.0を必要としている人は、選択肢の１つに考えるといいかもしれません。
iOSのカスタムキーボードで高さが変わらない時の対処法


高さは下記のコードで変わるのですが

```
let heightConstraint = NSLayoutConstraint(
        item: self.view,
        attribute: NSLayoutAttribute.Height,
        relatedBy: NSLayoutRelation.Equal,
        toItem: nil,
        attribute: NSLayoutAttribute.NotAnAttribute,
        multiplier: 0.0,
        constant: 400)
self.view.addConstraint(heightConstraint)

```

予め用意された`nextKeyboardButton`が`addSubView`されていることが必須なようです。(これで１日潰した)

参考
[stackoverflow](http://ja.stackoverflow.com/questions/20551/ios%E3%81%AEapp-extension-%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%9F%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%81%AE%E9%AB%98%E3%81%95%E3%81%8C%E8%AA%BF%E6%95%B4%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84)
重み付きランダム

# 例えば
ガチャのレア１は1000本、レア２は50本、レア３は１本、で完全確率でレア１～レア３までのどれかを抽選したい。　といったような、**本数ベースで抽選する**ようなケース。

# 作っておくと、ちょっと便利

```csharp
public class MyUtil
{
    //渡された重み付け配列からIndexを得る
    public static int GetRandomIndex(params int[] weightTable)
    {
        var totalWeight = weightTable.Sum();
        var value = Random.Range(1, totalWeight + 1);
        var retIndex = -1;
        for (var i = 0; i < weightTable.Length; ++i)
        {
            if (weightTable[i] >= value)
            {
                retIndex = i;
                break;
            }
            value -= weightTable[i];
        }
        return retIndex;
    }
}
```

# 使い方
```csharp
    public void Start()
    {
        var weightTable = new int[]{
            1000,
            50,
            1
        };

        int index1 = MyUtil.GetRandomIndex(1000, 50, 1);
        Debug.Log("index1:" + index1);

        int index2 = MyUtil.GetRandomIndex(weightTable);
        Debug.Log("index2:" + index2);
    }
```

`params`付けて可変長引数扱いなので、
int index1 = **MyUtil.GetRandomIndex(1000, 50, 1)**;
のように、直接重みを記述してもよいし、
int index2 = **MyUtil.GetRandomIndex(weightTable)**;
のように、重み付け配列を用意・使用してもよいです。

# 検証
**10万回抽選**

```csharp
        var count = new int[3];
        for (int i = 0; i < 100000; ++i)
        {
            var index = MyUtil.GetRandomIndex(1000,50,1);
            count[index]++;
        }

        for (int index = 0; index < count.Length; index++)
        {
            Debug.Log(index + ":" + count[index]);
        }
```
*出力*
>0:94990
>1:4909
>2:101

概ね期待通りぽいので、良さそうです。


なお、重み配列に0を入れて。
`var index = MyUtil.GetRandomIndex(1000,0,10);`
として、同じく１０万回回すと
*出力*
>0:99011
>1:0
>2:989

のように、0を指定したindexは抽選されなくなるので、**有料ガチャなので、レア１は輩出しない。**といったケースもすぐ対応できてやや便利です。

これを上手く活用すると完全確率ではなく、本当のくじびき形式（取ったくじを箱に戻さない）も

```csharp
        var weightTable = new int[]{1000,50,1};

        var count = new int[3];
        for (int i = 0; i < 500; ++i)
        {
            var index = MyUtil.GetRandomIndex(weightTable);
            count[index]++;
            weightTable[index]--;
        }

        for (int index = 0; index < count.Length; index++)
        {
            Debug.Log("取得" + index + ":" + count[index]);
        }

        for (int index = 0; index < weightTable.Length; index++)
        {
            Debug.Log("残り" + index + ":" + weightTable[index]);
        }
```

のように、得られたindexを添え字にしてweightTableから獲得した分減らして行くことで実現できますね。（回しすぎるとカラになりますが・・・）

#ちなみに  

- 重みに全て0入れたりすると、-1が返ってくるので、そのまま検証処理に投げたりすると、配列範囲外起こします。
- 本数ベースではなくて、確率ベース(レア１は95%、レア２は4.9%、レア３は0.1% のような）でのランダムは本来また違った作りが必要になりますが、全部整数になるように桁を上げてしまえば同じ結果が得られると思います。 → `MyUtil.GetRandomIndex(950,49,1);` 

## よいランダムライフを。
importによってパッケージを拡張する方法(プラグイン)

## 概要

Goでは以下のようなブランク識別子(アンダースコア)を使った`import`を見かけることがあります。

```go
import (
	_ "foo"
)
```

[公式リファレンス](https://golang.org/ref/spec#Import_declarations)には、

> An import declaration declares a dependency relation between the importing and imported package. It is illegal for a package to import itself, directly or indirectly, or to directly import a package without referring to any of its exported identifiers. To import a package solely for its side-effects (initialization), use the blank identifier as explicit package name:

と書いてありますが、よくわかりません。

実際にブランク識別子を使った`import`を活用して理解を深めたいと思います。

## 作るもの

いろんな言語で挨拶をするパッケージ`greet`を作成します。
`import`によって対応する言語を増やせるようにします。

## ソースコード

以下のような構成です

```
.
├── greet
│   ├── english
│   │   └── english.go
│   ├── greet.go
│   └── japanese
│       └── japanese.go
└── main.go
```

`greet`パッケージの中心となる`greet.go`では、挨拶をする関数`Greet()`とパッケージを拡張するための関数`Register()`を用意します。
`Greet()`は対応する全ての言語の挨拶を表示します。対応する言語がない場合には`???`を表示します。

```go:greet.go
package greet

import (
	"fmt"
)

var messages []string

func Register(m string) {
	messages = append(messages, m)
}

func Greet() {
	if len(messages) == 0 {
		fmt.Println("???")
	} else {
		for _, m := range messages {
			fmt.Println(m)
		}
	}
}
```

次は`greet`を拡張するためのパッケージ`japanese`と`english`です。
これらのパッケージでは、`init()`内で`Register()`関数を呼び出して、`greet`パッケージを拡張します。
`init()`関数は特別な関数で、`main()`関数より前に自動で実行されます。

```go:japanese.go
package japanese

import (
	".."
)

func init() {
	greet.Register("こんにちは")
}
```

```go:english.go
package japanese

import (
	".."
)

func init() {
	greet.Register("Hello")
}
```

最後に`main()`関数ですが、まだ`import`によるパッケージの拡張は行っていません。

```go:main.go
package main

import (
	"./greet"
)

func main() {
	greet.Greet()
}
```

## 実行する

まずは、このまま実行してみます。

```bash 
$ go run main.go
???
```

`greet`はどの言語にも対応していないので挨拶ができません。

`main.go`の`import`を以下のように変更し、再度実行してみます。

```go:main.go
...
import (
	"./greet"
	_ "./greet/japanese"
)
...
```

```bash
$ go run main.go
こんにちは
```

`japanese`を`import`したことにより、日本語の挨拶が追加されました。さらに、`english`も`import`してみます。

```go:main.go
...
import (
	"./greet"
	_ "./greet/english"
	_ "./greet/japanese"
)
...
```

```bash
$ go run main.go
Hello
こんにちは
```

日本語と英語の両方に対応しています。
`init()`内で`Register()`を呼び出しているパッケージを`import`することによって`greet`が拡張されていることを確認できました。

## まとめ

`import`によってパッケージを拡張できるような仕組みを取り入れました。

今回は対象としたパッケージがシンプルだったので、あまり問題はありませんでしたが、実際には拡張される順番がバラバラでもユーザの思い通りに動作するようにしなければならないので、もっと難しくなると思います。

より実践的な使い方に興味がある方は標準ライブラリの`image`等を見ればいいと思います。`image.Decode()`でpng形式の画像を読み込めるようにするために、`image/png`を`import`して`image`を拡張するような仕組みになっています。
Project Eulerをシェル芸で解いてみる(Problem 1)

# 概要
Project Euler[^pe]は、数学的な問題解決能力を要求する、プログラミング問題集である。
Project Eulerは、一般的なオンラインプログラミングジャッジとは異なり、解答するプログラミング言語は、特に限定されていない。
フォームに入力した値だけで正誤を判別するため、適切なアルゴリズムさえ考案できれば、手計算で解答することも可能である。
そのため、Web上では様々な手法による解答が公開されている。

しかし、シェル芸[^def]による解答は、私が探した限りでは、殆ど見つからなかった。
そこで、私自身の勉強も兼ねて、Project Eulerをシェル芸で解いてみることにした。
<br>
本記事では、Project EulerのProblem 1を、シェル芸で解いた際の過程を述べる。

# 実行環境
* Arch Linux (x86\_64, 4.3.3-2-ARCH)
* zsh (5.2)
* GNU coreutils (8.24)
* gawk (4.1.3)

# 問題文
[原文 ([https://projecteuler.net/problem=1](https://projecteuler.net/problem=1))]
> If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
> Find the sum of all the multiples of 3 or 5 below 1000.

[日本語訳 ([http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%201](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%201))]

> 10未満の自然数のうち, 3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり, これらの合計は 23 になる.
> 同じようにして, 1000 未満の 3 か 5 の倍数になっている数字の合計を求めよ.

正答は注釈[^ans]に記載する。

# 解法1
```shell
#!/bin/sh

seq 1 999 \
| # 1000未満の自然数の生成
awk 'BEGIN{sum=0}; ($1 % 3 == 0 || $1 % 5 == 0){sum += $1}; END{print sum}'
  # 3もしくは5の倍数の出力
```

## 解法1の解説
この解法による処理の詳細は、コードに記載してあるコメントの通りである。

# 解法2
```shell
#!/bin/sh

(seq 3 3 999; seq 5 5 999) \
| # 1000未満の自然数のうち、3の倍数と5の倍数を出力
sort -n \
| # 数値のソート
uniq \
| # 重複する数値(15の倍数)の除去
tr '\n' '+' \
| # 総和算出式の生成
sed -e 's/+$/\n/' \
| # 末尾の余分な演算子'+'の除去
bc
  # 総和の出力
```

## 解法2の解説
この解法による処理の詳細は、コードに記載してあるコメントの通りである。


# 雑記
* 「こうすればもっと効率化できるよ」や、「こう書けばエレガントだよ」等の意見がありましたら、気軽に教えていただけますと幸いです🐺
* 現在の進捗状況 -> [https://github.com/gin135/Project_Euler/tree/master/sh](https://github.com/gin135/Project_Euler/tree/master/sh)
<br>

* 解法1は、シェル芸というよりは、ほとんどAWKのコードだよね...
    - なので、なるべくシェルコマンドだけで答えを出す、解法2も考えてみた。
    - まあ、シェル芸の「目の前の問題をパパっと終わらせる」という目的を考えると、解法1でも問題は無い気もする。
* なんか、解説がすっごく投げやりな気がする...
    - 第1問だけあって、簡単ということもあるけど...
    - 実際、そのまんまだし...
* シェル芸、処理の過程が把握しやすくて、楽ちん。
    - コメントアウトするだけで、途中まで実行することも簡単にできるので、便利。
    - 僕のように面倒臭がりな人間に、ぴったりだと思う。

- - -

[^pe]: About - Project Euler ([https://projecteuler.net](https://projecteuler.net))
[^def]: シェル芸の定義 >> シェル芸 - 上田ブログ ([https://blog.ueda.asia/?page_id=1434](https://blog.ueda.asia/?page_id=1434))
[^ans]: 233168
配列（IEnumerable)の中からランダムで一つ返却するLinq拡張

# 作っておくと、ちょっと便利

```csharp
public static class LinqExtensions
{
    public static T RandomAt<T>(this IEnumerable<T> ie)
    {
        if (ie.Any() == false) return default(T);
        return ie.ElementAt(Random.Range(0, ie.Count()));
    }
}
```

# 使い方

```csharp
	public void Start()
	{
		var data = new []{ 1, 2, 3, 4, 5, 10, 20, 31, 32, 33, 34, 35 };
		var r1 = data.RandomAt();
		Debug.Log("r1:" + r1);　
		var r2 = data.Where(num => num % 2 == 0).RandomAt();
		Debug.Log("r2:" + r2);
	}
```

`IEnumerable<T>`なので

var r1 = data.**RandomAt()**;
のように、配列に直接使ってもよいし、

var r2 = data.Where(num => num % 2 == 0).**RandomAt()**;
のように、他のLinqと組み合わせてもよい（この例では、int配列の偶数の値からランダムで一つ）
MQメモ　〜Javaインターフェース（Base&JMS）〜

## 資料のありか ##
[WMQ Javaインターフェース（Base&JMS）ワークショップ資料](https://www.ibm.com/developerworks/jp/websphere/library/wmq/java_ws/)
## 2_MQ_ Javaデザインのポイント ##
 * Expiryは照会メッセージに設定するのが普通らしい。
 * MQ被仕向けでは、要求メッセージのGET〜応答メッセージのPUTまでをUOWとすべき。
 * 応答メッセージには、要求メッセージのmessageIdをcorrelationIdに設定する必要がある。
 * 応答メッセージは、要求メッセージに設定されている、応答先キュー・マネージャーと応答先キューに送信する必要がある。
 * 応答メッセージは、応答先キュー・マネージャー名と同名のトランスミッション・キューに（リモート・キューを介さずに）PUTされ、要求元のキューに届く。
![image](https://qiita-image-store.s3.amazonaws.com/0/107616/a7eb3b12-a765-4ed8-bb11-dddb3a4226ca.png)

 * BaseJavaから利用する場合、文字コード変換はBaseJavaが自動でやってくれる。MQMessageのcharacterSetに、Unicodeからの変換先CCSIDを指定し、writeString()すればOK。
 * UOWはキュー・マネージャーとの1接続内でのみ制御できる。
 * PUT,GETをUOWに入れるかは、その度にMQxMO_SYNCPOINTで指定する。
 * MQのコネクション・プーリングは、あくまでも「使い回す」ものであり、「予め貯めておく」ものではない。起動直後から高い性能が求められるのであれば、空回しして「予め貯めておく」必要がある。
 * コネクション・マネージャがコネクション・プーリングを制御する。
 * プールのスコープはコネクション・マネージャーのインスタンスごと（なはず）。
    * 対向先ごとにキュー・マネージャを用意するなら、対向先ごとにコネクション・マネージャのインスタンスを用意しておかないとマズイということか。
 * BaseJavaのメソッドは処理が異常終了した場合、MQExceptionをthrowする。適切なハンドリングが必要。

## 3_1_MQ_Javaシステム構成-その1 ##
 * バインディング接続(ローカル接続)を利用したシステム構成

![image](https://qiita-image-store.s3.amazonaws.com/0/107616/381232a8-2875-3540-66e6-c9d6fc71dda6.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/107616/c83b533f-4c94-631c-0700-c3d33c31af98.png)

## 4_MQ_Javaパフォーマンス ##
 * コネクション・プーリングは実際に効果がありそう。
 * BaseJavaはJMSより速い。

## 5_まとめ ##
 * JMSを選択する理由はほぼない。事実上、BaseJava一択。
Pythonを使った多言語テキスト画像の生成


エクセルから様々な言語のテキストを読み込んで画像を生成する．

例として以下の様な画像を生成します．
![فارسی.png](https://qiita-image-store.s3.amazonaws.com/0/65106/d363d08d-28bc-9ddd-1b1d-01c788ff8bbe.png "فارسی.png")

[ipython notebook](http://nbviewer.ipython.org/urls/bitbucket.org/Shinaji/generate_text_images/raw/c39a3f5f185711a31be371b97aa53e292f1d583a/Generate%20text%20images.ipynb)で実行例を公開．




言語リスト
---------
<table border="1" class="dataframe">   <thead>     <tr style="text-align: right;">         <th>アラビア語</th>       <th>カタロニア語</th>       <th>英語</th>       <th>スペイン語</th>       <th>ペルシア語</th>       <th>フランス語</th>       <th>イタリア語</th>       <th>韓国語</th>       <th>ロシア語</th>       <th>スウェーデン語</th>       <th>タイ語</th>       <th>ウクライナ語</th>       <th>中国語</th>     </tr>   </thead>   <tbody>     <tr>   <td>العربية</td>       <td>Català</td>       <td>English</td>       <td>Español</td>       <td>فارسی</td>       <td>Français</td>       <td>Italiano</td>       <td>한국어</td>       <td>Русский</td>       <td>Svenska</td>       <td>ไทย</td>       <td>Українська</td>       <td>中文</td>     </tr>     <tr>  <td>التعلم المتعمق</td>       <td>Aprenentatge profund</td>       <td>Deep learning</td>       <td>Aprendizaje profundo</td>       <td>یادگیری عمیق</td>       <td>Deep learning</td>       <td>Apprendimento approfondito</td>       <td>딥 러닝</td>       <td>Глубинное обучение</td>       <td>Deep learning</td>       <td>การเรียนรู้เชิงลึก</td>       <td>Глибинне навчання</td>       <td>深度学习</td>     </tr>   </tbody> </table>

スクリプト
---------

```py:
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
import numpy as np
import pandas as pd

#Load text list
df = pd.read_excel('example_words.xlsx', sheetname='Sheet1')
indices = df.columns.tolist()

#Generate text images
def generate_text_img(text, fontname='Arial', fontsize=64):
    font = ImageFont.truetype(fontname, fontsize, encoding="utf-8")
    img_size = np.ceil(np.array(font.getsize(text))*1.1).astype(int)
    img=Image.new('L', img_size, 'white')
    draw = ImageDraw.Draw(img)
    text_offset = (img_size - font.getsize(text))/2
    draw.text(text_offset, text, font=font, fill='#000')
    return img
    
fontname = '/Library/Fonts/Arial Unicode.ttf'
for index in indices:
    for text in df[index]:
        txt_img = generate_text_img(text, fontname=fontname, fontsize=64)
        txt_img.save(text+'.png', 'png')
```        
        
参考
----------

 * [Pillow(PIL)で1文字の画像をたくさん生成する](http://qiita.com/lazykyama/items/65bcce351f3d1cf07d8e)
gorpで実行されるSQLをログに出力する

DBが絡む開発をしていると、実際に投げているSQLを確認したくなることがあります。そんな場合に、gorpでは実行されたSQLを出力する方法が用意されています。

## どうやるか

[gorpのLoggerインターフェイス](https://godoc.org/gopkg.in/gorp.v1#GorpLogger)を実装して、それを渡すことで利用者がある程度コントロールできるようになっています。

``` go:GorpLogger
type GorpLogger interface {
    Printf(format string, v ...interface{})
}
```

## やってみる

プログラム全体は[こちら](https://github.com/reiki4040/go-memo/blob/master/gorp_logging/main.go)
ec2用のテーブルを作って適当にデータを入れています。

GorpLoggerインターフェイスをを実装した構造体を作って渡します。今回は標準logをラップしてるだけのものです。

``` go:GorpLogger簡易実装
type MyGorpTracer struct{}

func (t *MyGorpTracer) Printf(format string, v ...interface{}) {
    log.Printf(format, v...)
}
```

その上で、[TraceOn()](https://godoc.org/gopkg.in/gorp.v1#DbMap.TraceOn)にprefix文字列と一緒に渡すと、出力されるようになります。

``` go:ログの有効化
// gorpのDbMap生成
dbmap := &gorp.DbMap{Db: db, Dialect: gorp.SqliteDialect{}}

// Loggerを生成
tracer := &MyGorpTracer{}

// Logging有効化
dbmap.TraceOn("[gorp SQL trace]", tracer)
```

そうすると、以下のように出力されます。今回はテーブルを削除して、テーブルを作ってデータを10件入れてselect allしてます。

``` :gorpのSQLログ
2016/01/03 12:09:01 [gorp SQL trace] drop table "ec2"; []
2016/01/03 12:09:01 [gorp SQL trace] create table if not exists "ec2" ("id" integer not null primary key autoincrement, "type" varchar(255)) ; []
2016/01/03 12:09:01 [gorp SQL trace] insert into "ec2" ("id","type") values (null,?); [1:"t2.micro0"]
2016/01/03 12:09:01 [gorp SQL trace] insert into "ec2" ("id","type") values (null,?); [1:"t2.micro1"]
2016/01/03 12:09:01 [gorp SQL trace] insert into "ec2" ("id","type") values (null,?); [1:"t2.micro2"]
2016/01/03 12:09:01 [gorp SQL trace] insert into "ec2" ("id","type") values (null,?); [1:"t2.micro3"]
2016/01/03 12:09:01 [gorp SQL trace] insert into "ec2" ("id","type") values (null,?); [1:"t2.micro4"]
2016/01/03 12:09:01 [gorp SQL trace] insert into "ec2" ("id","type") values (null,?); [1:"t2.micro5"]
2016/01/03 12:09:01 [gorp SQL trace] insert into "ec2" ("id","type") values (null,?); [1:"t2.micro6"]
2016/01/03 12:09:01 [gorp SQL trace] insert into "ec2" ("id","type") values (null,?); [1:"t2.micro7"]
2016/01/03 12:09:01 [gorp SQL trace] insert into "ec2" ("id","type") values (null,?); [1:"t2.micro8"]
2016/01/03 12:09:01 [gorp SQL trace] insert into "ec2" ("id","type") values (null,?); [1:"t2.micro9"]
2016/01/03 12:09:01 [gorp SQL trace] select * from ec2 []
```
最初に標準logの日付、渡したprefix文字列、SQL、valuesが出力されています。

出力フォーマットが指定できるともっと使いやすそうですが、とりあえず開発中に出力するには十分かなと思います。

ORMとして使っているとそもそもSQL自体が見えないので、こういった形で見えるようにできると、調査時に便利です。また、adhocにSQLを投げた場合も、実行とログ出力で変数の指定を間違えるといったことも防げます。

動的に[TraceOn()](https://godoc.org/gopkg.in/gorp.v1#DbMap.TraceOn), [TraceOff()](https://godoc.org/gopkg.in/gorp.v1#DbMap.TraceOff)を呼び出せるようにしておいて、コマンドであればdebug用オプション時に、Webアプリケーションであれば、内部エンドポイント呼び出しなどで切り替えられると便利かもしれません。


## 参考

- [gorp github](https://github.com/go-gorp/gorp)
- [gorp.v1 godoc](https://godoc.org/gopkg.in/gorp.v1)
- gorpのSQLite利用は[こちら](http://mattn.kaoriya.net/software/lang/go/20120914222828.htm)を参考にしました
vagrant up失敗ーVirtualBox編ー

vagrant upが失敗した時の対処方法。
下記のようなエラーが出た場合。

```
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["hostonlyif", "create"]

Stderr: 0%...
Progress state: NS_ERROR_FAILURE
VBoxManage: error: Failed to create the host-only adapter
VBoxManage: error: VBoxNetAdpCtl: Error while adding new interface: failed to open /dev/vboxnetctl: No such file or directory
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component HostNetworkInterface, interface IHostNetworkInterface
VBoxManage: error: Context: "int handleCreate(HandlerArg*, int, int*)" at line 66 of file VBoxManageHostonly.cpp
```

## 方法１：　Virtual Boxの再起動

```
/Library/StartupItems/VirtualBox/VirtualBox restart
```
若しくは

```
launchctl load /Library/LaunchDaemons/org.virtualbox.startup.plist
```


## 方法２：　Virtual Boxの再インストール

こちらの方が確実

１、まずは既にあるファイルをアンインストール（これは必要ない？）

   ```
   /Volumes/VirtualBox/VirtualBox_Uninstall.tool ; exit;
   ```
２、最新版を[VirtualBoxのHP](https://www.virtualbox.org/wiki/Downloads)よりDL

３、インストール
MacでMySQLが起動しない

## 対象
  - /usr/local/var/mysql/[マシン名].local.errの所有者を変えてもダメだった
  - mysqlのプロセスは起動されていないことを確認している

それでもMySQLが起動してこない↓
  
## MySQLを起動してみると
`sudo mysql.server start`
を実行しても
```
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/[user name].local.pid).
```

## 対処方法
/usr/local/var/mysqlのディレクトリの所有者を
"_mysql"に変える

例：
`sudo chown -R _mysql:admin /usr/local/var/mysql`
Laravelのユニットテストとデバッグ＆ログの出し方

LaravelにはXcodeのような行ごとのステップ実行できるデバッガーはない。
なので、実行中にHTML上に表示させるかファイルへのログ出力を行うしか方法がない。

１．HTML上に出す方法
ベタにvar_dumpかprint_rを使う（PHPのお約束）

２．ログファイルに書き出す方法
Logファサードを使ってファイルに吐き出す。
【注意点】
　・ファサードなのでuse Logが必要
　・config/app.phpファイルのAPP_DEBUG属性（もしくは.envファイルの同箇所）をtrueにする

ということで以下使用例。[ここ](http://readouble.com/laravel/5/1/ja/errors.html)に詳細は出ています。

    use App\Restaurant;
    use App\Http\Requests;
    use App\Http\Controllers\Controller;
    use Log;

    class AreaController extends Controller
    {
    //
    public function index()
    {
        $restaurant = Restaurant::all();

    Log::info('Showing user profile for user: '.$restaurant);
        return view('area', ['restaurants' => $restaurant]);
    }

    public function show($id)
    {
        $restaurant = Restaurant::where('areaid', $id)->first();

    var_dump($id);
    print_r($restaurant);
        
        return view('areashow', ['restaurant' => $restaurant]);
    }

さて、ユニットテストについてであるが、とてもシンプル。
作成したプロジェクト配下のtestsディレクトリにあるExampleTest.phpを修正してもいいし、以下のコマンドで新規作成してもよし。

    php artisan make:test UserTest

指定したアドレス（ドメイン直打ちとかの場合は/）で特定の文字が含まれて欲しければ以下の様な書き方となる。

    public function testBasicExample() 
    {
        $this->visit('/')
             ->see('Laravel 5');
        $this->visit('/area')
             ->see('test 8');
        $this->visit('/area/25')
             ->see('Laravel 5');
    }

これを書いたらあとは

    phpunit

とプロジェクトのデフォルトディレクトリからコマンドラインで入力すればテストが簡単に実行できる。

全部成功の例

    PHPUnit 4.8.21 by Sebastian Bergmann and contributors.

    .

    Time: 4.1 seconds, Memory: 14.50Mb

    OK (1 test, 4 assertions)


一部失敗の例：
　HTML吐き出しをして、エラーになった箇所のテストの行が出る

    Time: 4.25 seconds, Memory: 14.50Mb

    There was 1 failure:

    1) ExampleTest::testBasicExample
    Failed asserting that '<html>
    <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">

    <body>
        <h1>Hello, Area id = 8</h1>
    <p>test 黄金屋</p>
    </body>
    </html>
    ' matches PCRE pattern "/Laravel 5/i".

    /home/vagrant/Code/petittdt/vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/InteractsWithPages.php:188
    /home/vagrant/Code/petittdt/tests/ExampleTest.php:21

    FAILURES!
    Tests: 1, Assertions: 6, Failures: 1.

[ここ](http://readouble.com/laravel/5/1/ja/testing.html)に詳細は出ています。
[Rails]テスト環境のDBが空だったら

# development環境のschema dumpを取る
```
bin/rake db:schema:dump
```

# 取得したdumpファイルをテスト環境へ反映
```
bin/rake db:schema:load RAILS_ENV=test
```

# 絵文字も扱えるようにする
```
create database [database name] CHARACTER SET utf8mb4
```

```
GRANT ALL ON [database name].* to [user]@'%'
```

```
FLUSH PRIVILEGES
```
スマフォでlandscape（横持ち）フルスクリーンサイトを作る際のノウハウ

# はじめに
通常のブログや縦長サイトをlandscapeで見る場合は特に特別なことをやる必要はないと思いますが、画面にFIXした「アプリっぽい」サイトを制作するときには色々と癖があり、事前に想定しておく必要のあるものがたくさんありますので、そちらを可能な限りまとめていけたらと思います。
※ いったん、Androidを無視して、Mobile Safari（以下、ブラウザ）に限定した記事になります。
※ ここでいうフルスクリーンとは ブラウザの上下にあるUIバーが隠れて、ディスプレイ全体でウェブサイトを表示している状態を指します。

## フルスクリーンにするための手段
iOS9 現在の情報です。

### 有効なもの
* オリエンテーションが変わって横持ちになったとき（landscape限定）
* 長いページを下にスクロールしたとき（landscape, portrait共に）
* ``<meta name="apple-mobile-web-app-capable" content="yes">`` を設定し、ホーム画面登録させて立ち上げる

### 無効になったもの
* iOS6以前の ``window.scrollTo(0, 1)`` ハック
* iOS7のみの ``minimal-ui`` viewportプロパティ

### 実現できないもの
* jsで任意のタイミングでUIバーを隠すこと（擬似的に orientationchange イベントなどを発火してもフルスクリーンにすることは不可能です。タイミングは完全にユーザーに委ねられています）。
* ``<meta name="apple-mobile-web-app-capable" content="yes">`` を使わない状態でのportraitフルスクリーン
* landscape状態でサイトにアクセスした際のフルスクリーン化（必ずportrait -> londscape と orientationchangeイベントを発火させる必要があります）


## 前準備
現在有効なもののうち、
3つ目の「ホーム画面に登録させる」はユーザー頼みになってしまい現実的ではなく、
2つ目も、今回は画面FIXしたアプリ風のサイトを目指すので目的に即していません。
というわけで1つ目の **オリエンテーションが変わって横持ちになったとき** にフォーカスすることにします。

ただ、単純にlandscapeにしたらフルスクリーンになる（上下のUIバーが隠れる）わけではありません。
ポイントとしては表示コンテンツ（bodyの高さ）がディスプレイサイズ以上になっている必要があります。
なので 

```html

<body>
	...
</body>

```

```scss

body {
	position: absolute;
	top: 0;
	left: 0;
	width: 100%;
	height: 101%; // ここがポイント
}

```

このようにします。
これでlandscapeにすると確実にフルスクリーンになります。

# フルスクリーンを解除させないTips

上記で無事landscapeのフルスクリーンは実現できたので、あとはひたすらウェブサイトを構築していくのみですが、
あくまでこのフルスクリーンは「擬似」的なものなので、「フルスクリーンが解除してしまう（UIバーが出てきてしまう）弱点」がかなりあります。
ここからは、「なるべく」そうならないようなTipsをご紹介していきます。

## 1.スクロールはjsで制御すべし

上にスクロールした瞬間にUIバーが再表示されてしまいますので

```js
document.body.addEventListener('touchmove', function (e) {
	e.preventDefault();
});
```
こんな感じで **bodyのtouchmoveを無効にしましょう**。

そしてスクロールで表示したいコンテンツはjsの擬似スクロールで実装しましょう。
※ 要素内スクロール（``overflow:scroll``とか）でも一見いい感じなのですが、要素を一番上までスクロールしたあとも上方向にスクロールを続けようとするとUIバーが出てきてしまいます。

ちなみに僕は普段 https://github.com/mjohnston/scroller をベースに魔改造した独自ライブラリを使っております。


## 2.クリックイベント系に注意すべし
クリックイベント系でURLを更新する（ページが切り替わる）とUIバーが出てきてしまいます。
対策は以下のようにします（hashchangeを用いたSPAサイトを想定）。

```html
<a href="#!/hoge/hoge" id="hoge">HOGEのページ</a>
```

```js
var el = document.getElementById('hoge');
el.addEventListener('click', function (e) {
	e.preventDefault();
}, false);
el.addEventListener('touchstart', function (e) {
	location.hash = '#' + this.href.split('#')[1];
}, false);

```

このように ``touchstart`` リスナー内で hash を更新します。
ちなみにjsで更新すればいいというわけでなく、``click`` と ``touchend`` のリスナー内で hash を更新するとUIバーが出てきてしまいます。
また ``touchend`` のリスナー内で ``setTimeout`` を用いて非同期でも更新してみましたが、ダメでした。

## 3.ボタンなどの配置場所に注意すべし
フルスクリーンになったあと、画面の上部や下部をタップするとUIバーが出てきてしまいます。
具体的にはiPhone5sまで（landscape時の高さが320pxの端末）では上は約20px、下は約40px
iPhone6以降は上の約20pxのみ（下はタップしてもUIバーは出てきません）がUIバー表示領域になります。
なので、iPhone5以前も考慮するとなると縦320px中、60px分がタップ禁止区域になるので
縦260px以内にボタンなどが収まるようデザインをしなくてはいけません。

また、個人的には60pxというのはホントにギリギリのラインなので、
できたらもう10pxぐらいは余裕を持って、縦240px以内に収まるようにできればベストかと思います。
AnsibleでVPSにLAMP環境を自動構築

前回ではAnsibleとvagrantでローカル環境構築の方法を記載しましたが、
今回はVPSでのLAMP環境の構築の自動化をやってみました。

今回の開発環境と手順は
ローカル環境（MAC）からServerMan@VPS上にLAMP環境の自動構築の方法になります。
もちろんVPS側にAnsibleをインストールして自動構築の方法もありますが
今回は前者の方法でのご説明をします。

事前準備
■vpsにssh接続が可能になっていること
■ローカル環境ににAnsibleのインストール済であること

ansibleを作業ディレクトリとします
/Users/example/ansible

**inventryfileファイルの作成**
今回はhostsというファイル名で作成

```
[web]
2x.1xx.9x.xxx:sshポート番号 ansible_ssh_private_key_file=~/.ssh/id_rsa
```

VPSに公開鍵認証を使用している場合は鍵を指定します。

**playbookの作成**
今回はplaybook.ymlというファイル名で作成

```
---
 - hosts: web
   user: VPSのユーザー名
   sudo: yes
   tasks:
    - yum: name=vim state=latest
    - name: install apache
      yum: name=httpd state=present
    - name: start apache and enabled
      service: name=httpd state=started enabled=yes
    - name: set epel repository
      shell: rpm -Uvh --force http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
    - name: set remi repository
      command: sudo rpm -Uvh --force http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
    - name: install php packages
      yum: name={{item}} enablerepo=remi,epel state=present
      with_items:
       - php
       - php-pear
       - php-devel
       - php-mbstring
       - php-pdo
       - php-mysql
       - php-gd
       - php-xdebug
      notify:
       - restart apache
    - name: install mysql
      yum: name={{ item }} enablerepo=remi,epel state=installed
      with_items:
       - mysql-server
       - MySQL-python
      notify:
        - start mysql
   handlers:
    - name: restart apache
      service: name=httpd state=restarted enabled=yes #enabled=yes 自動起動
    - name: start mysql
      service: name=mysqld state=started enabled=yes
    - name: mysql set password
      command: mysqladmin -u root password "{{ mysql_root_pw }}" #passwordの設定
```

流れとしては
vimのインストール
apacheのインストール
phpのインストール
mysqlのインストール
mysqlのユーザーのパスワード設定

となっています。

ではローカル環境からAnsibleでVPSに接続可能かどうかのチェックをしてみます。
ansibleディレクトリ上で

```
ansible -m ping web -i hosts -u ユーザー名
```

ユーザー名はVPSのユーザー名となります。
rootユーザーでのログインを禁止している場合はrootでログインできないので注意です。

```
2x.1xx.9x.xxx | success >> {
    "changed": false,
    "ping": "pong"
}
```

上記のようなレスポンスが返ってきたら接続は成功です。

それではいよいよ自動構築します。

```
ansible-playbook -i hosts -vv  playbook.yml -u ユーザー名 --ask-sudo-pass
```

ssh接続のパスワードを入力する必要がありますので入力したらあとはAnsibleさんがすべてやってくれます。

```
......略
2x.1xx.9x.xxx              : ok=8    changed=2    unreachable=0    failed=0
```

こんな感じにunreachable=0ならとりあえず成功してます。
失敗しないプロジェクト管理：２ 最悪に備える

ITプロジェクトをあとで振り返って「すべて想定通りにうまくいった」ということはまずありえません。その必ずおこる”何か”の備えを十分にしておくことが重要です。これはＩＴプロジェクト管理における”リスク管理"にあたります。"リスク"とは簡潔に言えばプロジェクトを失敗させる要因となりえるモノです。ではそのようなリスクが発生する要因はなにか。

見積が甘かった、忘れているタスクがあった
委託先の納品物に品質が想定していたよりも悪い。
想定外の事象が途中で発生した（ハードトラブル、キーマンの退職etc)

このようなことへの対策を、日々繰り返し行う ことがポイントの２つめ。もっとも重要なのはリスクに気づくのは早いほうがよいということ。
ところで、このようなリスクが顕在化するとき(実際のトラブルとなって現れる形としては）
1.やるべきことを忘れている
2.技術的に難しくて、思ったよりも時間とお金がかかった
3.想定していた人があまり活躍しなかった
たとえば一度終わらせたプロジェクトを仮にもう一回同じことを同じ期間・同じコスト・同じメンバーでやれ、といわれたら どうでしょうか。そう、おそらくよほどのトラブルがない限りまず成功すると思います。要するにリスクの要因のほとんどは、”いままで経験のない新しいこと” だからベテランのほうがうまくいく確率が高いのはあたりまえ(＝新しいことが少ないから)なのです。
これを補うためには、知識と経験、他人の力も利用する必要があります。リスクポイントを探している、あなたの考慮漏れ自体が大きなリスクであることも忘れなく。
また想定外というのは本当に想像できないことです。スケジュール遅延に備えて少なくとも、大きな各フェーズで２割くらい。さらにプロジェクト全体としてもさらに２割くらい”バッファ"は作っておくべきでしょう。
７行で作るElectronアプリ


## はじめに

シェルで７行打ち込むだけでElectronアプリを作るネタ記事です。
なお、環境はMacを想定しています。

## 作業

[Node.js](https://nodejs.org/en/)が必要ですので、Node.jsをインストールしていない方はインストールしておいてください。

以下の７行を実行すると、Electronアプリが起動します。

```
$ npm install -g electron-prebuilt gulp typescript
$ npm install -g elects
$ elects new sample_project
$ cd sample_project
$ npm install
$ gulp compile
$ gulp run
```

```npm install```にかなり時間がかかりますので、ゆっくりお茶でも飲んでお待ち下さい。

## Package

もし、誰かに配布したい場合には、

```
$ gulp pack
```

とすることで、./releaseディレクトリ以下に配布用Zipファイルが作成されます。

## 補足

electsは、[「なぜTypeScriptでElectronアプリを書いてみるのか」](http://qiita.com/JunSuzukiJapan/items/657026f79aee03a587bf)という記事で書いたものを、毎回同じ作業を繰り返したくないので正月三ヶ日をかけて自動化したものです。
徐々に機能を拡張していく予定ですが、ゆっくりとしか進まないかと思います。


## 追記(2016/1/3)

- 最初に出力されるテンプレートプロジェクトをReact.jsを使ったものに変更しました。(version0.0.4)

参考：[お手軽に React.js を試してみる](http://qiita.com/cortyuming/items/9e7c30224ff3e4671019)
非アーティスト向けのロゴ作成(Blender + Substance Painter)

# 始めに
当方プログラマーでロゴデザイン、出来ません。

という事で前回と同じくSubstance Painterを使用して描く事無くそれっぽいロゴ作ります
→　前回：[非アーティスト向けのSubstance Painter](http://qiita.com/com04/items/575ae68c9748934ec774)

ロボット物なので削れた感じで、今回こんな感じのが出来ました。
![Logo02.png](https://qiita-image-store.s3.amazonaws.com/0/58518/90fbec74-8e13-fafc-5908-8480a628d029.png)

# 文字3Dモデルの作成
今回はBlenderを使用します。
使用バージョン：2.76b

1. 3D Viewから「Add」→「Text」でテキストオブジェクトを追加。<br>
![Logo03.png](https://qiita-image-store.s3.amazonaws.com/0/58518/a3911d20-f978-3a7e-9679-be2f3319d93f.png)
2. 平行投影(「5」キー)＋上面図(「7」キー)にする。<br>
![Logo05.png](https://qiita-image-store.s3.amazonaws.com/0/58518/dbabfbc0-83b7-e0fc-6736-649e1cfd3201.png)
3. Editモードに入ると、文字列を変更できます。<br>
![Logo06.png](https://qiita-image-store.s3.amazonaws.com/0/58518/37e4ccf9-ae22-96b2-21fd-4ec73dd4dd84.png)
4. 「Properties」の「Text」欄で線の太さ、立体等調整できます。<br>
![Logo07.png](https://qiita-image-store.s3.amazonaws.com/0/58518/d662ed4c-5667-e67e-f526-ab5ca85340bc.png)
5. シーンを保存してメニューバーの「File」→「Export」→「FBX(.fbx)」で出力する。

# 編集
Substance Painterの使い方については[前回記事も参照](http://qiita.com/com04/items/575ae68c9748934ec774)）
1. SubStance Painterで先ほどのFBXを読み込み、Bake Texturesまで行います。
2. 文字モデルが正面を向いていない場合は、「Alt」＋「Shift」＋「マウス左ドラッグ」で90度でスナップしつつ回転出来ます。
3. 従来通り作っていきます。<br>
![Logo08.png](https://qiita-image-store.s3.amazonaws.com/0/58518/cdbe0d8c-8e4b-8473-8dc4-b8447dc02ee5.png)
4. また、「ポストエフェクト」欄で、「ポストエフェクトをアクティベート」にチェックを入れると、[YEBIS2](http://www.siliconstudio.co.jp/middleware/yebis/jp/)によるポストエフェクトが表示できます。綺麗です。<br>
![Logo09.png](https://qiita-image-store.s3.amazonaws.com/0/58518/c7d421c5-f49c-be74-bd9b-39ff57037a74.png)
5. これでスクリーンキャプチャーして画像編集ソフトに持っていくだけです。
もしくは、別途レンダリングエンジンに持って行ってもいいかもしれません。

# まとめ
デザイン文字が作れない人にとっては、ただ単に文字を描くだけよりはロゴっぽく出来るのではないでしょうか？
考察 > センサとしてのESP-8266 > Access Pointにするかどうか

ESP-8266にてAccess Pointを立てることができる。

以下のような構成とする時、ESP-8266がAPとなるのが良いかどうかの考察

- センサ: ESP-8266
- データ収集、処理 : RPi (またはPC)


## 考察

- A. センサ(ESP-8266)がAPとなった場合
  - 利点: APのSSIDとパスワードをESP-8266側でハードコードしなくて良い ([関連](http://www.esp8266.com/viewtopic.php?f=8&t=1925)). 変更がフレキシブル
  - 利点: (おそらく)IPアドレスが192.168.4.1と固定になる? 探さなくてよい
  - 欠点: そのAPからplotlyなどのサービスにつながらない
  - 欠点: 複数のセンサと通信する場合、(各センサで異なる）APの切替をすることになる
 
- B. センサ(ESP-8266)以外がAPとなった場合
  - 利点: モバイルルータなどに接続することで、plotlyなどのサービスを利用できる
  - 利点: 複数のセンサと通信する場合、APの切替をせずに通信をする
  - 欠点: APのSSIDとパスワードをESP-8266側でハードコードすることになる。変更がフレキシブルではない
  - 欠点: ESP-8266のIPアドレスが不定になる. ESP-8266を見つける仕組みが必要

各センサをAPにしておいて、APを切り替えながらセンサに接続してデータ収集をして、集め終わったらRPi側でモバイルルータに接続し、plotlyへデータを流す、などしたらどれくらいオーバヘッドがかかるのだろうか。また、RPi側のIPがコロコロ変わることで、RPiのネットワーク処理に混乱が生じるだろうか?
JavaScriptでPythonのrange関数のようにリスト作成

Pythonのrange関数のように開始値と終わり値を指定してリストを作成する関数を毎回書きたくないのでモジュール化。

- [GitHub](https://github.com/zuzuta22/jsranger)
- [npm](https://www.npmjs.com/package/jsranger)

## Pythonのrange関数
range([start, ]stop[, step])

```
>>> range(3,10)
[3, 4, 5, 6, 7, 8, 9]
>>> range(3,10,2)
[3, 5, 7, 9]
```

これをJavaScriptでもやりたい

## JavaScriptでほぼ等価の関数
```
var jsrange = function (start, end, step) {
  var array = new Array();
  var step = step === undefined ? 1 : step;
  var counter = start;
  var index = 0;

  while (counter < end) {
    array.push(counter);
    counter += step;
  }

  return array;

}

module.exports = jsrange;
```

## インストール
```
% npm install jsranger
```

## 使用例
```
var jsranger = require('jsranger');

var L = jsranger(2, 20);
console.log(L);
  // should display the following
  // [ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 ]

var l = jsranger(2, 20, 2);
console.log(l);
  // should display the following
  // [ 2, 4, 6, 8, 10, 12, 14, 16, 18 ]
```

## 課題
数字以外の者が引数に来た時のエラーなど、引数のチェックを全くしてない