OmniAICreator/Qiita-1.07M huggingface dataset:
Kinect v2の闇

Kinect v2をC++ Native SDKで使った時に発生した不都合として、Kinect v2は割りとコマ落ちすることで、Sleepを適宜かまさないとMultiFrameの必要なFrameをすべて取得した後に表示を行う、と言った実装をすると思い通りに処理されない状態が続いてしまうっぽい。
[メモ]Vagrantを使ってVMを起動する

VagrantからVMを立ち上げてsshするとこまでまとめる。

# まず使いたいboxを探してくる

vagrant boxはサイトで公開されているものがあるためそちらを利用する。
今回はGentooを利用する。

```
$ vagrant box add gentoo_amd64 https://dl.dropboxusercontent.com/u/632007/gentoo-systemd-amd64-virtualbox-2015-02-22.box
```
この時、gentoo_amd64と入力したがこれは自分のローカルで使うboxの名前になる。

# Vagrantfileの作成

VMの設定をVagrantfileに記載することでvagrant up後に設定が反映される。
※vagrant up後については後記
Vagrantfileを作成したいディレクトリで

```
$ vagrant init gentoo_amd64
```

これでVagrantfileが作成される。

# vagrant up

```
$ vagrant up
```

これでいったんはVMが起動される。

# VMにsshする

```
$ vagrant ssh
```

便利そうなことを書き足す形式でこの投稿を更新しよう
安価なソリッドステートリレー (FC-85) を使う


ebay で売ってた SSR にオムロンの G3MB-202P を使った安価なモジュール(今現在送料込み1.83$)、FC-85 を使ってみたのでメモ。[この辺で購入](http://www.ebay.com/itm/331599214885?_trksid=p2060353.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT)。

![20151011-DSC04501.jpg](https://qiita-image-store.s3.amazonaws.com/0/5330/bc7a8885-de9d-7b2f-c584-fcc97eff6b0b.jpeg "20151011-DSC04501.jpg")


- DC+ / DC- には 5V と GND を繋ぐ
- CH1 に電流を流すと、トランジスタのベースに流れて、コレクタ・エミッタの DC+ と DC- で 5V 電流が流れ、SSR が駆動しスイッチする。(たぶん)
  - 電流が流れてる間はオンボードの LED が点灯する
- SW1 には交流 100~240V を流す
  - 最初試しに DC の電流で試していたら流れっぱなしでアレレとなった…。そりゃそうだ。ちゃんと AC 流しましょう。
ブラウザのタブ文字幅が8スペースなのが気に入らない

GithubやBitbucketやその他、昨今では業務でもブラウザからプログラムのソースコードを読む機会が増えていると思います。
しかし、私が使っているFirefoxでは、タブ文字幅が8スペースで固定されているらしく、「少々読みづらいな・・・」とは思いつつ、仕方ないと思って日々を過ごしてきました。

そんなある日、[大昔に自分が書いたJavaScriptのコード](https://ja.wikipedia.org/wiki/MediaWiki:Gadget-ForkAPage.js)を見て、目眩がしました。
***なんだこの無駄な空白は！？***
![tab8.png](https://qiita-image-store.s3.amazonaws.com/0/9926/11afe2a3-cb91-2f29-19e9-dfd53f80876a.png)
しかも深すぎて画面に入りきらずに折り返してるし・・・。
いつも手元で編集している時4スペースなので大して気にならなかったんですが、これはひどい。

さすがに見過ごせなかったので、色々試行錯誤してみた結果、CSS3の草案であるTextモジュールに[tab-sizeプロパティ](https://developer.mozilla.org/en-US/docs/Web/CSS/tab-size)というのがあるのを見つけました。
そしてFirefoxを含めて主要なブラウザではサポートしているようです（もちろん、InternetExplorerはサポートしてません）。

ということで、さっそくFirefoxのユーザーCSSを修正してタブ文字幅を4にしました。

```css
pre
{
	-moz-tab-size: 4;
}
```

結果、![tab4.png](https://qiita-image-store.s3.amazonaws.com/0/9926/1115ee89-82b0-eca9-e08d-a866dc8f88b9.png)

と見慣れた形になりました（それでもまだ無駄な空白は多いですが、元のコードのインデントが深いから仕方ない・・・）。
めでたしめでたし。

なお、具体的な手順としては

0. [Stylish](https://addons.mozilla.org/en-US/firefox/addon/stylish/)アドオンを入れる
0. 「新しいスタイルを書く」→「白紙のスタイル」
0. 上記のcssを書いて、保存

で完了します。

なお、既に誰かQiitaに書いてるだろうと思って検索しても[Github特化](http://qiita.com/sue738/items/c68bf768f4aa30e88682)したのしかありませんでした・・・。
みんな8スペースで気にならないんだろうか・・・？
あるいは世の中の多くの人は、やはりインデント（字下げ＝タブ文字）とアライン（桁揃え＝スペース）の区別がついていない人が多くて、インデントにスペースを使っちゃってる人が多いからタブ文字の幅なんて日頃は見てないんでしょうか。

それはともかく、[ブラウザのタブ文字幅が固定で悲しい思いをしている人もいる](https://twitter.com/aokomoriuta/status/354235513110138880)ようなので、そういう人がこの記事を読んで救われること、それ<del>だけ</del>が私の願いです。
AWS Lambda で aobench を動かす(C/C++ binary を動かす)

漢だったら AWS Lambda で C/C++ PaaS 的なことをやりたいですよね!

とりあえず aobench を AWS Lambda で動かしてみましょう.

https://docs.aws.amazon.com/lambda/latest/dg/nodejs-create-deployment-pkg.html

を参考に, まずは手元で node.js アプリを構成します.

    $ g++ -O2 -o ao ao.c
    $ touch aobench.js
    $ ls
    ao aobench.js

async モジュールは今回は必要ありません.

aobench.js は以下のようになります.

```
var exec = require('child_process').exec;

exports.js = function(event, context) {
    console.log("running aobench...");
    child = exec('./ao', function(error) {
        console.log("running aobench done!");
        // Resolve with result of process
        context.done(error, 'Process complete!');
    });

    // Log process stdout and stderr
    child.stdout.on('data', console.log);
    child.stderr.on('data', console.error);
};
```

zip アップロードで実行する場合は, `exports.h `exports.js` 関数がエントリポイントになります.

出来たファイルを一式 zip 圧縮して AWS Lambda にアップロードします.
このとき, ディレクトリを zip 圧縮ではなく, **ファイル群を zip 圧縮**することに注意してください. そうしないと以下のようなエラーが出ます.

```
{
"errorMessage": "Cannot find module 'index'",
"errorType": "Error",
"stackTrace": [
"Function.Module._resolveFilename (module.js:338:15)",
"Function.Module._load (module.js:280:25)",
"Module.require (module.js:364:17)",
"require (module.js:380:17)"
]
```

## 実行する.

handler の部分に `aobench.js`(JS ファイル名)を指定して実行します. duration は長めに取ってきます(30 secs など)

```
2015-10-11T08:46:19.351Z	running aobench...
2015-10-11T08:46:19.493Z	running aobench done!
2015-10-11T08:46:23.594Z	ao: ao.c:324: void saveppm(const char*, int, int, unsigned char*): Assertion `fp' failed.

2015-10-11T08:46:23.734Z		TypeError: Object #<Object> has no method 'done'
    at /var/task/aobench.js:11:17
    at ChildProcess.exithandler (child_process.js:662:7)
    at ChildProcess.emit (events.js:98:17)
    at maybeClose (child_process.js:766:16)
    at Socket.<anonymous> (child_process.js:979:11)
```

おおっと! ファイルの書き込みはできないようですね...

とりあえずファイル書き出し無効にして aobench を再度コンパイルして, アップロードと実行します.

```
START RequestId: Version: $LATEST
2015-10-11T08:57:19.038Z	running aobench...
2015-10-11T08:57:23.634Z	aobench done

END RequestId: 
REPORT RequestId: 	Duration: 4656.21 ms	Billed Duration: 4700 ms 	Memory Size: 128 MB	Max Memory Used: 11 MB	
```

Voala! 
C/C++ binary の実行に成功しました!

## 浮動小数点計算は?

構成を変えて実行してみました.

* 0.35 secs : 手元環境での SandyBridge 3.3 GHz 1 core
* 4.5 secs : AWS Lambda 128 MB 
* 1.1 secs : AWS Lambda 512 MB
* 0.6 secs : AWS Lambda 1024 MB
* 0.4 secs : AWS Lambda 1536 MB(設定できる最大値)

メモリサイズに応じて CPU 性能も変わるようですね. 浮動小数点性能は AWS Lambda 1.5 GB 時が概ね Desktop CPU 1 コア相当という感じでしょうか.

## OpenMP は?

omp_get_max_threads() でスレッド数を取得してみました.

* 128 MB : omp_num_threads = 2
* 1536 MB : omp_num_threads = 2

HT(HyperThread)が有効な環境のようです. 1.5GB でも threads = 2 なのでマルチコア環境ではないようですね.

## TODO

* セキュリティ周りはどうなっているのかな?
* C++ での計算結果をなにかしら返す仕組みを考える.
Python3.5(Windows)+django1.7.1 ではプロジェクト作れず

内容としてはエントリ名でほぼすべてなのですがざっと説明。

Python Django をさらっと味見してみるか、ということで [Python Django入門](http://qiita.com/kaki_k/items/1fff7fefcf26dc4b69bc) を参考に進めてみる。

Pythonのバージョン新しいほうがいいっしょ！　とか何とかいいつつPython3.5(Windows)をインストールした後に

pip install django==1.7.1

で django のバージョン1.7.1をインストールする、ここまではうまくいくが

django-admin.py startproject mysite

と、新規プロジェクトを作ろうとするとダーッとエラーがでてきて何も作られず。

この辺を見るに
http://www.thefourtheye.in/2015/02/python-35-and-django-17s-htmlparseerror.html

django1.7.1　は　Python3.5に対応できてないみたい。
最新バージョンと思われるdjango1.8.5をインストールしたらうまくプロジェクト作れました。
zshにfishを載せたfizshが良かった

設定をカスタマイズするのは楽しいが、
パッケージ化されているのをそのまま使うだけというのも簡単で良い


* ubuntu 15.10, debian8 で確認。

## インストール

```bash:
sudo apt-get install -y fizsh
```

## 設定

```bash:
$HOME/.fizsh/.fizshrc
```

## 便利な機能

コマンドラインで以下を行うと、コマンドのmanが表示される

```
コマンド Esc-h押下
```
Python3.5(Windows)ではvirtualenv動かない

内容としてはエントリ名でほぼすべてなのですがざっと説明。

Python Django をさらっと味見してみるか、ということで [Python Django入門](http://qiita.com/kaki_k/items/1fff7fefcf26dc4b69bc) を参考に進めてみる。

とにかく最新版が好きなので書いてあることを守らずPython3.5をインストール。
virtualenv・・フムフム仮想環境ね、といいつつ

pip install virtualenv

したあとに

virtualenv DEST_DIR

とすると、仮想環境ディレクトリが作成される。
ここまでは順調のように見えるが、実はうまくいってない。

DEST_DIR/Script/activate.bat
DEST_DIR/Script/deactivate.bat

のようなファイルが存在しないので、次のステップである仮想環境を立ち上げることができない。

そこで、[Python Django入門](http://qiita.com/kaki_k/items/1fff7fefcf26dc4b69bc)　の後半に書いてあるようにvenvを使えばいい。
virtualenvのインストールなどはせずに、 venv を使うのが必須ぽい。

python -m venv DEST_DIR

Windows環境ではない場合は試していません。

だけどなんですか、direnvを使ったほうがいいんですか？
http://blog.hde.co.jp/entry/2015/02/27/182117
精進します・・・
parse cloud code でリクエストを投げてきたユーザーのIDを取得するときの注意点

mbaasって便利ですね。

parse を使って開発をしている時にハマったもので解決したのを紹介。

cloud code でリクエストを投げてきたユーザーのデータは以下のコードだと request.user に入っています。

```js
Parse.Cloud.beforeSave("hogehoge", function(request, response) {
code....
}
```

このユーザーのID(objectId) を取得しようとして

```js
Parse.Cloud.beforeSave("hogehoge", function(request, response) {
	console.log(request.user.get("objectId"));
}
```

ってしても

```
No Message provided
```

とエラーが出ます。

正しくは

```js
Parse.Cloud.beforeSave("hogehoge", function(request, response) {
	console.log(request.user.id);
}
```

でした。
さくらVPSにFuelPHPをインストールしてみる


# インストール
1. http://fuelphp.jp/docs/1.7/installation/instructions.html を参考にホームディレクトリにインストール
2. /etc/httpd/conf/httpd.confの設定してホームディレクトリ以下で参照されるようにする

	```
	# directory if a ~user request is received.
	#
	# The path to the end user account 'public_html' directory must be
	# accessible to the webserver userid.  This usually means that ~userid
	# must have permissions of 711, ~userid/public_html must have permissions
	# of 755, and documents contained therein must be world-readable.
	# Otherwise, the client will only receive a "403 Forbidden" message.
	#
	# See also: http://httpd.apache.org/docs/misc/FAQ.html#forbidden
	#
	<IfModule mod_userdir.c>
    	#
	    # UserDir is disabled by default since it can confirm the presence
    	# of a username on the system (depending on home directory
	    # permissions).
	    #
    	#UserDir disabled <== コメントアウト

	    #
	    # To enable requests to /~user/ to serve the user's public_html
    	# directory, remove the "UserDir disabled" line above, and uncomment
	    # the following line instead:
    	#
	    #UserDir public_html
	    UserDir  fuelSample/public # <== 追加

	</IfModule>
```

3. apache再起動
```sudo /etc/rc.d/init.d/httpd restart
```
Ubuntu/gfortranでLAPACKを使用するために

LAPACK(Linear Algebra PACKage)は、線形計算のための数値解析ソフトウェアライブラリである。
これを用いることで、

- 線形方程式
- 線形最小2乗問題
- 固有値問題
- 特異値問題

などを数値的に解くことができる。

今回は、このような便利なツールであるLAPACKを、Ubuntuのgfortranで使えるようにするための方法を紹介する。

# **1. LAPACKパッケージのダウンロード**
http://www.netlib.org/lapack/
からできる（2020/01/06時点で、最新版は3.9.0）。

# **2. LAPACKパッケージを適当なディレクトリで解凍する**
パッケージを解凍すると、「lapack-3.9.0」というディレクトリができているはずなので、下記のコマンドを順々に実行。
`$ cd lapack-3.9.0/`
`$ cp make.inc.example make.inc`
`$ make blaslib`
`$ make lapacklib`
`$ make tmglib`
この時点で、ディレクトリ内に「librefblas.a」「liblapack.a」「libtmglib.a」という3つのファイルができているはずである。引き続き下記のコマンドを実行。
`$sudo cp librefblas.a /usr/local/lib/libblas.a`
`$sudo cp liblapack.a /usr/local/lib/liblapack.a`
`$sudo cp libtmglib.a /usr/local/lib/libtmg.a`

# **3. LAPACK95パッケージのダウンロード**
http://www.netlib.org/lapack95
からできる（2020/01/06時点で最新版は3.0）。

# **4. LAPACK95パッケージを適当なディレクトリで解凍する**
パッケージを解凍すると、「LAPACK95」というディレクトリができているはずなので、下記のコマンドを順々に実行。
`$ cd LAPACK95/`
`$ mkdir lapack95_modules`
続いて、LAPACK95/以下に入っている「make.inc」を開き、以下のように編集する。

```make.inc
FC=gfortran
FC1=gfortran
OPTS0=-O3 (<- Oは大文字のO(オー))
MODLIB=-I./../lapack95_modules (←4.で作ったディレクトリと同じ名前)
LAPACK_PATH=/usr/local/lib/　（←2.で「librefblas.a」などの移動先に指定したのと同じディレクトリ）
LAPACK95=../lapack95.a
LAPACK77=$(LAPACK_PATH)/liblapack.a
TMG77   =$(LAPACK_PATH)/libtmg.a
BLAS    =$(LAPACK_PATH)/libblas.a
```
続いて下記のコマンドを実行。
`$cd SRC/`
`$make single_double_complex_dcomplex`
これによって、LAPACK95/に「lapack95.a」が生成されているはず。これを/usr/local/lib/に移動させて、更にファイル名を「liblapack95.a」に変更する（ファイル名の頭文字に"lib"がついてないといけないらしい）。

最後に、
LAPACK95/lapack95_modules/以下に入っているファイルを全て、
/usr/local/include/
に移動させる。




# 以上で終了。あとはコンパイルするだけ。
LAPACK95を使用したfortranプログラムのコンパイル方法は、
http://www.rcs.arch.t.u-tokyo.ac.jp/kusuhara/tips/linux/fortran.html
に掲載されております。
（その他にも、「lapack fortran」で検索すれば色々と出てくるはず）
基本的に、
`$gfortran [fortranファイル名] -I/usr/local/include -llapack95 -llapack -lblas`
と入力すればコンパイルできるはず。
（オプションの順番が大事。例えば”-llapack”と"-lblas"を逆にするとコンパイルできない。）




# 参考URL
* <a href="http://www.rcs.arch.t.u-tokyo.ac.jp/kusuhara/tips/linux/fortran.html">Fumio KUSUHARA -Fortran90で構造解析-</a>
masterの更新フィードとCircieCIでOSS用プラグインの結合テストを回しつづける


プラグイン機構をそなえて、機能を追加しやすくするOSSがある。わかりやすいのは[fluentd](http://www.fluentd.org)あたりだろうか。
で、何かのプラグインを作っており、かつ現役でしっかり使っているなら、元のプロダクト(コア)の更新時には自動で結合テストをしておくとよいという話。

![master_to_test.jpg](https://qiita-image-store.s3.amazonaws.com/0/7454/44ed6d2e-cd36-4ede-777e-7a2a53ca648a.jpeg "master_to_test.jpg")


プラグイン自体は単体テストをやってても、コア側に非互換の変更が入ったり、リファクタリングで機能に退行があると、結局バージョンアップ時に寝耳に水のようなエラーに会う。
結合テストを常にmasterのHEADで回しておくとコア側のアップデートを追いやすいし、もしかするとコア側でも『この変更で、既存プラグインは大丈夫だろうか(※)？』という不安が減るかもしれない。

※ そういう心配をするとこならある程度プラグイン用のテストも用意してくれていたりするが


## しくみ

定期的に実行でもまあ悪くないけど、できれば細かい単位で回しておきたい。

サンプルとして、Chefのプラグインのこれを例に。

[knife-zero/integration_testedge](https://circleci.com/gh/higanworks/knife-zero/tree/integration_testedge)


### IFTTTでmasterのcommitフィードを購読

プラグインの元プロダクトのmasterブランチでのコミットをfeedで受け取るには一覧に`.atom`をつける。

```
https://github.com/chef/chef/commits/master.atom
```

ついでにその他取れるフィードについてはこちら。

- Githubが結構色々なatomフィードを出せるので、連携で役に立ったりする - Qiita <http://qiita.com/sawanoboly/items/eddc1e230657184d5121>


これをIFTTT(など)のfeedトリガーとして登録。



### CircieCIのブランチを指定してビルドを実行するPOST

もともとHerokuのスケジューラで定期的にテストを実行していたのですが、ちょっと前にIFTTTがHTTPRequestを投げれる様になったのが大きい。

次のようなPOSTをFeed新アイテム登場時のActionに登録すればビルドしてくれる。

```
# POSTで
https://circleci.com/api/v1/project/higanworks/knife-zero/tree/integration_testedge?circle-token=${CIRCLECI_PROJECT_TOKEN}
```

ものによっては、テストケースをgistとかに置いておくとソースと分離できて良いかもしれない。


## masterの更新をトリガーにすると

- プラグイン側のテストがコケる変更期間が限定できる。
    - 変更が必要ならさっさと対応。
- コア側の(意図しない)退行を、リリース前にプルリクエスト等で直せる。

この変更期間を特定しやすいのが嬉しい。
そもそもそんなに互換性崩れるのか？っていうと、親プロダクト次第なのではあるが。この例のケースでいえば結構壊れる。

ただこっち(プラグイン)は野良なんだし、コア側に普段から互換性を意識させるってのは面倒になりそうで。
テスト勝手に回るから気にしないで、くらいが丁度いいね。


## バージョンアップIssueの抑制

コア側更新の影響で変更をするケース2種を比べてみよう。

- 『なんかバージョン上げたら動かねーんだけど？』
- 『コアの新機能使いたいから対応しようよ！』

前者は原因の調査から入らなくてはならない。継続した結合テストではこれをある程度予防できる。
なによりこの類のIssueはモチベ的にわりとしんどい。

この記事で紹介しているやり方では、そもそも後者の事は考慮していません。
しかし前者のほうは、自分でもキャッチアップしていることもあるし、Issueが作られる際も、どちらかと言うとプルリクエストで来る傾向にある気がします。


Chefの例では、実際にコア側でのインターフェース変更、デフォルトオプション変更、リファクタリング時の退行、あたりで結合テストがFailした。
そのたびにプラグイン側で対応するか、コア側にテストケース追加するなどで、リリース前にこっそり直せてる。
PythonからSQLiteに入力する時にデータを重複させない方法。

<pre>
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import codecs
import sqlite3
import types

conn = sqlite3.connect("test.db" , isolation_level=None)
cur = conn.cursor()

 #テーブルの初期化
conn.execute("create table list(id integer primary key,name text)")

new_list = ['a','b','c','a'] #<= 最後の'a'が重複している。

for i in new_list:
  sql = "select name from list where name LIKE '"+str(i)+"';"
  result =  conn.execute(sql).fetchone()
　#types.NoneTypeが返ってくる。　=>入力データに同じ内容が無い
  if type(conn.execute(sql).fetchone()) == types.NoneType:
    sql = "insert into  list(name) values('"+str(i)+"');"
    conn.execute(sql)

sql = "select * from list;"
print conn.execute(sql).fetchall()

>>>[(1, 'a'), (2, 'b'), (3, 'c')]

<pre>
GitbucketとSlackを連携する


詳細は公式リファレンス([Setup Slack Integration](https://github.com/takezoe/gitbucket/wiki/Setup-Slack-Integration))を見てください。

こちらも備忘録的に画像付きでログを残しておきます。

1. Menu -> Integrationsから、GitHubのViewを選択
![kobito.1444543366.830221.png](https://qiita-image-store.s3.amazonaws.com/0/11214/0b9fe229-06a9-8b99-7200-73cefb5a3f64.png "kobito.1444543366.830221.png")
1. 任意のPostChannelを選択。
![kobito.1444543481.868106.png](https://qiita-image-store.s3.amazonaws.com/0/11214/d48dc489-2096-04b0-a95d-cb00f04f21f7.png "kobito.1444543481.868106.png")
1. `switch to unauthed mode`を選択
![kobito.1444543516.036221.png](https://qiita-image-store.s3.amazonaws.com/0/11214/ce473085-bb6b-6705-b441-dbaa841ed9bc.png "kobito.1444543516.036221.png")
1. `Customize Name`を`gitbucket`に変更
1. `Customize Icon`をhttps://raw.githubusercontent.com/takezoe/gitbucket/master/src/main/webapp/assets/common/images/gitbucket.png から拝借してUpload.
1. `Webhook URL`のURLをコピー。
![kobito.1444543724.724790.png](https://qiita-image-store.s3.amazonaws.com/0/11214/add4d46b-5a22-d301-edbc-cd467ec14d59.png "kobito.1444543724.724790.png")
1. Gitbucketの任意のプロジェクト->設定->Service Hooksから、WebHook URLsに先ほどコピーしたURLを追加
![kobito.1444544216.198772.png](https://qiita-image-store.s3.amazonaws.com/0/11214/b6746c09-e6b4-3529-3b83-7a5c59bfec0e.png "kobito.1444544216.198772.png")


## 結果
あとはgitbucketにコミットなり、pull-requestなりすれば、以下のような感じでslackに通知されます。便利ー。
![kobito.1444551656.819384.png](https://qiita-image-store.s3.amazonaws.com/0/11214/9b78b2fd-d515-b103-648d-1b642043bb04.png "kobito.1444551656.819384.png")
Java Tomcat Mavenのインストール


この記事は[Web開発をするまで](http://qiita.com/FSMS/items/6db6178a564ef32926f6)の一部です

# Open-JDKのインストール

```
sudo yum -y install java java-1.8.0-openjdk-devel
java -version
```

バージョン番号が表示されれば、インストールが成功しています。

openjdk version "1.8.0_60"
OpenJDK Runtime Environment (build 1.8.0_60-b27)
OpenJDK 64-Bit Server VM (build 25.60-b23, mixed mode)

# Tomcat

```
sudo yum -y install tomcat
rpm -qa tomcat
```
バージョン番号が表示されれば、インストールが成功しています。


# Maven

```
sudo yum -y install maven
mvn --version
```

バージョン番号が表示されれば、インストールが成功しています。

この時、古いjavaがインストールされると思いますので、削除します。

```
sudo yum list installed|grep open-jdk
sudo yum remove -y java-1.7.0-openjdk-headless
```
仮想環境についてのまとめ（VirtualBox, Vagrant）

## 仮想環境とは

WEBエンジニアにとってはもはや常識とも言える仮想環境での開発。

普段の開発では仮想環境上での作業を行っており、ひととおり基本的には使えるようになったので一度知識を整理しようと思い、まとめを書きました。

## 仮想環境の必要性

仮想環境を導入していないプライベートな開発環境で書いて動作したコードは、その他のマシンでも正常に動作するかどうかは、実際にその環境に置いてみないとわからない。

仮想環境上で開発を進めることにより、デプロイされた状態、要するに本番環境のサーバーマシンに置かれた状態をおおよそ再現しながら開発を進めることができる。

## VirtualBox

仮想環境の構築には、まず仮想マシンが必要です。
仮想マシンは、まるでそこにLinuxサーバーマシンがあるかのように振る舞います。

その環境を提供するのがVirtualBoxです。

仮想環境上で動作しているOSを、ゲストOSといいます。それに対して、通常時使用しているOSをホストOSと言います。

## Vagrant

VirtualBox内での仮想マシンをどのような環境で動かすかを定義し、実際にその定義に従って仮想マシンの構築をしてくれるのがVagrantです。(そろそろ後継がOttoになるようですが今回その話は置いておきましょう

[Vagrantの後継ツールとして、開発環境だけでなく実際の動作環境も構築できる「Otto」がリリース](http://codezine.jp/article/detail/8993)

## Vagrantの設定について

下記は`vagrant up`で実際にVirtualBoxに仮想マシンを構築する際の設定ファイルであるVagrantfileの一部です。

```ruby:vagrantfile
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "centos65"
  config.vm.box_url = "https://github.com/2creatives/vagrant-centos/releases/download/v6.5.1/centos65-x86_64-20131205.box"
  config.vm.network :forwarded_port, host: 3000, guest: 3000   # rails
  config.vm.network :forwarded_port, host: 3333, guest: 3306   # mysqld
  config.vm.synced_folder "../your-application-root", "/home/vagrant/hoge", nfs: true
end
```

>
`config.vm.guest` - 仮想マシンで実行しているゲストOSを示します。 デフォルト値は:linuxです。Vagrantは適切なディストリビューションを自動判別します。
>
`config.vm.box_url` - boxを取得可能なURLを設定します。 boxがインストールされていないシステムでvagrant upした時に、そのURLからboxを取得してきます。

上記のコードで使用したいOSを指定します。

>
`config.vm.synced_folder` - 仮想マシン上の同期フォルダを設定します。 これにより、ホストマシン上のフォルダが仮想マシンと同期させることができます。 どのように動作するか等の詳細な情報は、同期フォルダのページを参照してください。

これで仮想環境内で使用したいディレクトリが指定する必要があります。

## Vagrantコマンド

* `vagrant up` 環境構築を実行
* `vagrant ssh` ssh通信で仮想マシンにログイン
* `vagrant ssh-config`ssh通信に使用するパラメータを表示
 * ちなみにIdentityFileの欄にssh通信で使用する秘密鍵の場所が表示されます・
* `vagrant status` 仮想マシンの起動状態を確認

## 参考
* http://blog.raqda.com/vagrant/vagrantfile/index.html
* http://kazmax.zpp.jp/linux_beginner/yum.html
* http://e-words.jp/w/yum.html
* https://docs.vagrantup.com/v2/
指定時間以上起動している Google Compute Engine インスタンスを削除する

一つのタスクが数分から数十分で終わるジョブをクラウドで 100 ノードとか立てて並列処理する用途がメインのときは, instance がずっと起動されていると困りますね.

手動で停止だと操作を忘れてしまって無駄に instance を実行してしまう可能性が大きいですね.

GCE では Preemptible VM で最大 24 時間で自動停止されますが, 24 時間は長過ぎですね.

instance を起動するときに shutdown コマンドをスタートアップスクリプトに指定する方法もありますが, 時々指定を忘れてしまうという運用上の問題もありますね.

そこで調べたら Google App Engine で GCE インスタンスを監視して指定時間以上立っていたら削除するというサンプルがありました.

https://github.com/googlearchive/compute-appengine-timeout-python

何という俺得サンプルでしょうか. GAE cron で指定時間ごとに実行できるのでこれを使えばよさそうですね!

## TODO

* サービスではなく(URL 公開しない), バックグラウンドで起動させる方法を探す.
* AWS Lambda で出来ないか検討する.
* CPU usage も見て, CPU usage が低ければ削除というのもやってみる.
動画配信プラットフォームKalturaを使ってみる1

とりあえず動画の配信と手軽にできるかどうかってとこ
を検証してみよう。AmazonのElastic Transcoderとの比較になるかな。

![スクリーンショット 2015-10-11 15.48.32.png](https://qiita-image-store.s3.amazonaws.com/0/89997/21b5ed13-3dfb-255f-c914-f6bf6717284f.png)

Upload Content > Upload from desktop
より猫動画をアップしてみましょう。

アップが完了するとContentタブのEntriesからコンテンツを編集できます。
動画を再生しながら、サムネイルをキャプチャしたりとかできたりします。
Studioタブでは閲覧時のPLAYER(たぶんweb用)デザインと動作のサイズをカスタマイズできます。
Analyticsでは配信のログであったりストレージや帯域の消費量を確認できます。
とまあ動画に特化しているという点でコンシューマー的には使いやすい仕様になっています。
配信国のアクセスコントールであったりメジャーな機能はだいたいあるかなという感じ。

・有償版だとDRMの機能が付いているのはいいかな

ト:http://knowledge.kaltura.com/kaltura%E2%80%99s-digital-rights-management-drm-service-widevine-setup-and-workflow-guide#whatisdrm

QRコードとURLとページ埋め込み用のタグが完成する。

http://www.kaltura.com/tiny/4cqux

`html:script
<script src="http://cdnapi.kaltura.com/p/2012821/sp/201282100/embedIframeJs/uiconf_id/31364942/partner_id/2012821?autoembed=true&entry_id=0_wyfi0sp0&playerId=kaltura_player_1444549653&cache_st=1444549653&width=400&height=333&flashvars[streamerType]=auto"></script>!
`


<script src="http://cdnapi.kaltura.com/p/2012821/sp/201282100/embedIframeJs/uiconf_id/31364942/partner_id/2012821?autoembed=true&entry_id=0_wyfi0sp0&playerId=kaltura_player_1444549653&cache_st=1444549653&width=400&height=333&flashvars[streamerType]=auto"></script>![スクリーンショット 2015-10-11 16.34.03.png](https://qiita-image-store.s3.amazonaws.com/0/89997/7b20ff99-9329-4b3e-9869-7d4a4fc7f199.png)
xfce4にthemeを追加

## テーマのダウンロード

* http://xfce-look.org/

## 追加方法

* zipをダウンロードし解凍
* README.md を読むと手順が書いてある。

![スクリーンショット_2015-10-11_16-25-38.png](https://qiita-image-store.s3.amazonaws.com/0/25728/942aca5b-0f5c-ec60-ee32-6db79faec466.png)

```bash:
sudo cp -a "Windows 10" /usr/share/themes/
```

## 設定

```bash:
xfconf-query -c xsettings -p /Net/ThemeName -s "Windows\ 10"
xfconf-query -c xfwm4 -p /general/theme -s "Windows\ 10"
```
RasberryPiセットアップからNode.jsでNiftyCloudMobileBackendにデータを送信するまで(関西おうちハック参加記録)


関西おうちハックで行った内容をまとめたものです。
https://kansaiouchihack.doorkeeper.jp

##実行環境
- RasberryPi 2 Model B
- MacBookAir(OSX Yosemite)
- SDカード (サンディスク　microSDHC　16GB　SDSDQ-016G-J35U)

###その他
- Ｒａｓｐｂｅｒｒｙ　Ｐｉで学ぶ電子工作　超小型コンピュータで電子回路を制御する (ブルーバックス)
- LANケーブル、USB2.0 LANアダプタ、microUSBコンセント

##SDカードにraspbianのOSイメージを焼く
こちらは公式から(https://www.raspberrypi.org/documentation/installation/installing-images/mac.md)

SDカードをMacに接続後、ディスクユーティリティからMS−DOSで初期化する（必要な人のみ）
raspbianのOSイメージをダウンロード->(https://www.raspberrypi.org/downloads/raspbian/)

### Unmoutしてddコマンドで書き込む

```
$ diskutil list
/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *251.0 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage                         250.1 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.9 GB    disk2
   1:             Windows_FAT_32 boot                    58.7 MB    disk2s1
   2:                      Linux                         15.9 GB    disk2s2
   
$ diskutil UnmountDisk /dev/disk1
$ sudo dd bs=1m if=/path_to_imagefile/hogehoge.img of=/dev/disk1

#結構時間かかります。 

```

##ラズパイ起動
SDカードを差し込み、ラズパイを電源につなぐ。

##今回はディスプレイなしで進める方法で
- Macはネット接続を無線LANにUSBポートからLANケーブルを使ってラズパイに接続。
- Macの環境設定から共有>インターネット共有>無線LANを共有経路、ポートをUSBのポートに設定。
- コンソールアプリから「OFFER」で検索するとラズパイにネットワーク共有のログがあるので、そのIPアドレスを使ってターミナルからSSH接続する。ID pi  Password raspberry

##初期設定ですること
パスワード変更
日本語に対応した環境設定
VNC接続のためのtightvncのインストール
他、ホストネームの設定、無線LANの設定など。。

##node.jsのインストール
このあと行うNCMBのSDKをする上で一番問題がなさそうなバージョンは
__v0.12.6__

__注意!!__
nodebrewを使ってインストールする方法ではRaspbarryPi2は非対応のため直接ソースを落としてインストールする

以下、参考リンクを実行させていただく（http://qiita.com/fumishitan/items/e5b8e4bcaeee1b85e239）

##NCMBにデータを送る
以下内容そのまま。
「Node.jsの動作確認」で確認できる。
(http://mb.cloud.nifty.com/doc/current/introduction/quickstart_javascript.html)

###次は実際にデータを取得、アップしてMonacaで表示を考えています
Linux Mint 17.1 - Cinnamon (64-bit)にmikutter 3.2.9をインストール

2015年10月現在、史上最強の[mikutter](http://mikutter.hachune.net/ "mikutter")であるmikutter 3.2.9を、Linux Mint 17.1環境にインストールする際に軽くハマったので、自分用の備忘録です。
普通に、

```
$ wget http://mikutter.hachune.net/bin/mikutter.3.2.9.tar.gz
$ tar -xvzf mikutter.3.2.9.tar.gz
$ cd mikutter
$ bundle install --path vendor/bundle
```

としますと、以下のようなエラーが出ます。

```
Installing nokogiri 1.6.6.2 with native extensions

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    /home/dc1394/.rbenv/versions/2.2.0/bin/ruby -r ./siteconf20151011-8312-154k4a2.rb extconf.rb --use-system-libraries --with-xml2-include=/usr/local/opt/libxml2/include/libxml2
checking if the C compiler accepts ... yes
Building nokogiri using system libraries.
libxml2 version 2.6.21 or later is required!
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/home/dc1394/.rbenv/versions/2.2.0/bin/$(RUBY_BASE_NAME)
	--help
	--clean
	--use-system-libraries
	--with-zlib-dir
	--without-zlib-dir
	--with-zlib-include
	--without-zlib-include=${zlib-dir}/include
	--with-zlib-lib
	--without-zlib-lib=${zlib-dir}/lib
	--with-xml2-dir
	--without-xml2-dir
	--with-xml2-include=${xml2-dir}/include
	--with-xml2-lib
	--without-xml2-lib=${xml2-dir}/lib
	--with-xslt-dir
	--without-xslt-dir
	--with-xslt-include
	--without-xslt-include=${xslt-dir}/include
	--with-xslt-lib
	--without-xslt-lib=${xslt-dir}/lib
	--with-libxslt-config
	--without-libxslt-config
	--with-pkg-config
	--without-pkg-config
	--with-exslt-dir
	--without-exslt-dir
	--with-exslt-include
	--without-exslt-include=${exslt-dir}/include
	--with-exslt-lib
	--without-exslt-lib=${exslt-dir}/lib
	--with-libexslt-config
	--without-libexslt-config

extconf failed, exit code 1

Gem files will remain installed in /home/dc1394/mikutter/vendor/bundle/ruby/2.2.0/gems/nokogiri-1.6.6.2 for inspection.
Results logged to /home/dc1394/mikutter/vendor/bundle/ruby/2.2.0/extensions/x86_64-linux/2.2.0-static/nokogiri-1.6.6.2/gem_make.out
An error occurred while installing nokogiri (1.6.6.2), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.6.6.2'` succeeds before bundling.
```

これを回避するためには、以下のようにまず、

```
$ sudo apt-get install libxml2-dev libxslt1-dev
```

した後、改めて、

```
$ bundle install --path vendor/bundle
```

してやれば良いようです。そして、`$ ruby mikutter.rb`で、mikutterが無事起動すればインストール完了です。お疲れ様でした。 

参考にさせていただいた記事
[nokogiriをビルドできずにrailsのインストールが失敗する。](http://qiita.com/chobi9999/items/7b66677b3bf3da8acc14)
自分仕様のboxファイルを作成する


# 目的
仕事でVagrantを使う場合、インターネット上に落ちているboxは何がインストールされているか分からないから不安が付きまといます。
そのため、ここではVirtual Boxで一から仮想マシンを作成し、作成した仮想マシンのboxを作成し、Vagrantで使用出来るようにします。
なお、開発環境で使用する目的のため、セキュリティは一切無視します。

## 作成する仮想OSの仕様
作成する仮想OSの仕様を以下に記述します。

### ハードウェア構成
* 仮想CPU数は1つ
* メモリ数は1GB
* ディスク容量は500GB（可変）
* ネットワークアダプタはNATで1つ

### ソフトウェア仕様
* OSはCentOS Linux7 
* インストールタイプはミディアム
* 日付と時刻はアジア/東京
* 言語サポートは日本
* キーボードは日本語
* パーティション構成は自動
* SELinuxはオフ
* yumで最新にしておく
* sudoを使えるようにしておく
* ssh設定
* firewallをオフにする

## まずはインストール
OSは[http://ftp-srv2.kddilabs.jp/Linux/packages/CentOS/7/isos/x86_64/](http://ftp-srv2.kddilabs.jp/Linux/packages/CentOS/7/isos/x86_64/)から取得します。

## SELinuxをオフにする
```lang:/etc/selinux/config(変更箇所のみ)
SELINUX=disabled
```

## yumで最新にしておく
あえて書く必要はないかも知れませんが。
アップデートが終わったらシャットダウンします。

<div class="gray">
<pre>
$ yum update
$ shutdown -h now
</pre>
</div>

## sudoを使えるようにしておく
```lang:visudo
$ visudo
#Defaults requiretty ← コメントにする
%vagrant ALL=(ALL) NOPASSWD:ALL ←追加
```
注：これをやらないと「sudo を実行するには tty がなければいけません。すみません」のエラーが出ます。


## ssh設定
<div class="gray">
<pre>
$ su - vagrant
$ mkdir .ssh
$ curl https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub > .ssh/authorized_keys
</pre>
</div>

## firewallをオフに
<div class="gray">
<pre>
$ su - 
$ systemctl stop firewalld
$ systemctl disable firewalld
</pre>
</div>




## vagrantのパッケージ作成
ここからやっとvagrantのパッケージ作成

```lang:packageコマンドの書式
vagrant package --base [VM名] --output [出力box名]
--outputオプションをつけなかったら、package.boxというファイル名になります。
```

```lang:実行例
$ vagrant package --base "CentOS7" --output CentOS7.box
```
## Vagrantに作成したboxを追加する

```lang:addコマンドの書式
vagrant box add [VM名] [box名]
```
```lang:実行例
$ vagrant box add centos7 CentOS7.box
```
```lang:確認
$ vagrant box list
centos7 (virtualbox, 0)
```

以上で完成です。

## 作成したboxファイルはこちらにあります
[CentOS7のbox](
https://dl.dropboxusercontent.com/u/30982648/box/centos7.box)

## 仮想OSをマウントするとエラーが出る
仮想OSを起動すると、
<div class="gray">
<pre>
Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:
mount -t vboxsf -o uid=\`id -u vagrant\`,gid=\`getent group vagrant | cut -d: -f3\` vagrant /vagrant
mount -t vboxsf -o uid=\`id -u vagrant\`,gid=\`id -g vagrant\` vagrant /vagrant
The error output from the last command was:
mount: unknown filesystem type 'vboxsf'
</pre>
</div>
とエラーが出る場合があるようです。
その場合は、「mount: unknown filesystem type 'vboxsf'」をキーワードにぐぐるとすぐに、解決方法が見つかります。
Ruby でWebhook にPOST する方法

```ruby
require 'net/http'
require 'uri'
require 'json'

uri  = URI.parse('Webhook URL を指定する')
params = { text: 'POST したいメッセージ' }
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.start do
  request = Net::HTTP::Post.new(uri.path)
  request.set_form_data(payload: params.to_json)
  http.request(request)
end
```

メソッド化しておくと、何か通知するときに便利。

## Slack Incoming Webhooks

`params` に指定するハッシュデータは公式ドキュメントを参考に設定すればOK
https://api.slack.com/incoming-webhooks
c++ builder XE4, 10.2 Tokyo > TPanel * の配列から配列要素の個数を取得 > int numPanels = sizeof(dstPanels) / sizeof(TPanel *);

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

TPanel *[]の配列を定義して、自動的にその個数を取得したい。

以下でできた。

```cpp
	TPanel *dstPanels[] = {
			/*P01TL,*/ P01BL, P01TR, P01BR,
			P02TL, P02BL, P02TR, P02BR,
			P03TL, P03BL, P03TR, P03BR,
			P04TL, P04BL, P04TR, P04BR,
			P05TL, P05BL, P05TR, P05BR,
		};
	int numPanels = sizeof(dstPanels) / sizeof(TPanel *);
```

分母のsizeof()を`TPanel`型でなく`TPanel *`型ですればよかったのに気づいた。

ちなみにTPanel *のsizeof()はこちらのビルド設定では4だった。
ドットインストールのローカル開発環境構築(Windows編) vagrant init chef/centos-6.5; vagrant up; でCentOSを起動できない時の対処方法

#環境
Windows7 Home Premium 64bit

#概要
* ドットインストールのローカル開発環境構築(Windows編)の学習

* 「#04 VagrantでCentOSを立ち上げよう」で**vagrant up**コマンドがエラーとなる。
Error: The requested URL returned error: 404 Not Found

#原因
* Vagrant Boxのchefからbentoへの移行
* CentOS6.5がない。
* 参考
[Chef社のbento案内](https://vagrantcloud.com/chef), [bentoのVagrant Box](https://atlas.hashicorp.com/bento/)

#対策
* bentoのCentOS6.7を導入

#手順
* 以下の順に実行
 * vagrant init bento/centos-6.7
 * vagrant up --provider virtualbox
* 参考
[bento/centos-6.7](https://atlas.hashicorp.com/bento/boxes/centos-6.7)
vim立ち上げ時にneobundle#rc() is removed function. が出た時の対処法

# はじめに
最近久しぶりにVimでコードを書こうと思って立ち上げたら大量にエラーが出まして、何だこりゃという感じだったので対処した内容をまとめておこうと思います。

# 現象
Vim起動時のエラーメッセージは以下のとおりです。

```
[neobundle] neobundle#rc() is removed function.
[neobundle] Please use neobundle#begin()/neobundle#end() instead.
[neobundle] neobundle directory is empty.
[neobundle] neobundle directory is empty.
[neobundle] `NeoBundle` commands must be executed within a neobundle#begin/end block.  Please check your usage.
[neobundle] neobundle directory is empty.
[neobundle] `NeoBundle` commands must be executed within a neobundle#begin/end block.  Please check your usage.
[neobundle] neobundle directory is empty.
[neobundle] `NeoBundle` commands must be executed within a neobundle#begin/end block.  Please check your usage.
[neobundle] neobundle directory is empty.
[neobundle] `NeoBundle` commands must be executed within a neobundle#begin/end block.  Please check your usage.
[neobundle] neobundle directory is empty.
[neobundle] `NeoBundle` commands must be executed within a neobundle#begin/end block.  Please check your usage.
[neobundle] neobundle directory is empty.
[neobundle] `NeoBundle` commands must be executed within a neobundle#begin/end block.  Please check your usage.
[neobundle] neobundle directory is empty.
[neobundle] `NeoBundle` commands must be executed within a neobundle#begin/end block.  Please check your usage.
[neobundle] neobundle directory is empty.
[neobundle] `NeoBundle` commands must be executed within a neobundle#begin/end block.  Please check your usage.
[neobundle] neobundle directory is empty.
[neobundle] neobundle directory is empty.
[neobundle] neobundle directory is empty.
[neobundle] neobundle directory is empty.
function neobundle#commands#check の処理中にエラーが検出されました:
行   20:
E216: そのようなグループもしくはイベントはありません: neobundle VimEnter * NeoBundleCheck
```
このエラーメッセージが出る状態でもVimは起動しますが、Neobundleは動作していないので、Neobundleを利用したpluginの導入・管理はできません。

また、エラーメッセージの2行目以降は1行目を対処すれば解決します。なので、ここで扱うのはエラーメッセージの1行目「neobundle#rc() is removed function.」の対処のみとします。

# 対処法
上のエラーメッセージが出たときの僕の.vimrcファイルには以下のような記述になっていました。

```vim:.vimrc
call neobundle#rc(expand('~/.vim/bundle'))

NeoBundleFetch 'Shougo/neobundle.vim'
NeoBundle 'auther/pluginname'
```

これを以下のように書き換えます。

```vim:.vimrc
call neobundle#begin(expand('~/.vim/bundle'))

NeoBundleFetch 'Shougo/neobundle.vim'
NeoBundle 'auther/pluginname'

call neobundle#end()
```
このように`neobundle#rc()`は使用せずに、
管理したいplugin`NeoBundle 'auther/pluginname'`を`call neobundle#begin()`と`call neobundle#end()`で囲みます。
エラーメッセージをよく見てみると、
`NeoBundle commands must be executed within a neobundle#begin/end block.`
と書いてありました。

# その他調べたこと
`Neobundle`のリポジトリはここです。
https://github.com/Shougo/neobundle.vim
`README.md`のサンプルコードを見ると、`neobundle#begin()/end()`を使うようになっていますね。
この辺りの仕様が変わったということなのですが、リポジトリのログを追ってみるとこのコミットで変更されたようです。
https://github.com/Shougo/neobundle.vim/commit/f9c566efbd117d7189ea4c951e3523b33f15b453
>Add neobundle#begin()/neobundle#end() interface

コミット日時は2014年4月3日のようです。結構前なので需要ないかもですが、一応備忘録ということで。
AWS Windows EC2Configのドライブレターの動きがややこしい件

#EC2のWindows機におけるSysprepとドライブレターの話

話というか、メモです。

Sysprep後にドライブレターが振りなおされる挙動について
トライアンドエラーで調べてみたらわかってきたことを書き残します。

環境：windows2008r2

##見えてきたルール

###EC2Configの基本
1.windowsでAMIを作成する際にはsysprepを行う事が推奨されている。
2.sysprepを行ったEC2はドライブレターがCから順に詰まってレタリングされる。
3.EC2Configのドライブレターマッピングが働くのはlaunch時ではなく、launch後の再起動以降。

###EC2Configのドライブレターマッピング前提
1.ボリュームにラベルをつける必要あり。2.で使用するため。
2.EC2ConfigのDriveLetterSettingもしくは、C:\Program Files\Amazon\Ec2ConfigService\Settings\DriveLetterConfig.xmlで事前にマッピング設定を行う。

###EC2configのドライブレターマッピング動作
1.Launch時にレタリングされ直したドライブをD→Zの順にひとつずつ再レタリングする。
(ブロックデバイスの順番の可能性あり)
2.レタリングに成功した場合はもちろん、失敗した場合も次のドライブのレタリングに移る。
※失敗例1：失敗した場合は先が使用されている時
※失敗例2：ページファイル領域などでドライブを変更できない場合も失敗する。
3.2を対象がなくなるまで繰り返す。



以上です。

###参考
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/UsingConfig_WinAMI.html#UsingConfig_Install
http://sssslide.com/www.slideshare.net/tanakata/20150127-jawsug-ec2config#5
https://forums.aws.amazon.com/thread.jspa?threadID=31418
forecastのmaの仕様のちょっとしたメモ

# 移動平均で自分が中心で偶数個を取るとき、中心とは何なのか
結論：20を指定すると、左が10個、右が10個(つまり、a_{n-10}からa_{n+10}の平均ということ)

```R
> library(forecast)
> temp <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30)
> temp2 <- ma(temp, 20)*20
> temp2
 [1]  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 220 240 260 280 300 320 340 360 380 400  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA

> library(forecast)
> temp <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30)
> temp2 <- ma(temp, 21)*21
> temp2
 [1]  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 231 252 273 294 315 336 357 378 399 420  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
```

# centre=Fの時はどうなるのか
フランス語風なのが気になるが、それはさておき。

```R
> library(forecast)
> temp <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30)
> temp2 <- ma(temp, 20, centre = F)*20
> temp2
 [1]  NA  NA  NA  NA  NA  NA  NA  NA  NA 210 230 250 270 290 310 330 350 370 390 410  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
```
a_{n-9}からa_{n+10}の平均になる。
centre=Fを指定したときに期待するのは、後ろ20個の平均とか前20個の平均とか、そういうものではないのか。ざんねん。
外部のgithubプロジェクトをbranchごとcloneする方法


#概要
他人のgithubアカウント上のリポジトリをbranchごとcloneするときの手順は以下である。

1.fork
2.remoteリポジトリからlocalへclone
3.branchを指定してclone
<br>

##詳細
_1.fork_

他人のgithubアカウント上のcloneしたいリポジトリのページへいくと上部に`Watch`/`Star`/`Fork`のボタンがあるので、`Fork`をクリック


<br>

_2.clone_

forkした自分のリポジトリを確認してcloneする
`$ git clone ~/リポジトリの場所/ 自分のディレクトリ名 `


_~/リポジトリの場所
githubの当該ページの右側のサイドバーの中段にある、`SSH clone URL`からコピーできる_

######_ここでcloneしているのは「master branchのみ」_


<br>

_3.branchを指定してclone_

`$ git branch -r`

でremoteのbranch名を以下のように取得できる。

>origin/01_untested
>origin/02_setup
>origin/03_models
>origin/04_factories
>origin/05_controller_basics
>origin/06_advanced_controllers
>origin/07_controller_cleanup
>origin/08_features
>origin/09_speedup
>origin/11_tdd
>origin/master

見つからない時は
`$ git fetch `


この中の`origin/01_untested`というbranchを指定してcloneする場合は以下でclone可能。

`$ git checkout -b 01_untested origin/01_untested`



_checkoutの第一引数にローカルリポジトリでのブランチ名を、第二引数にリモートの落としていたいブランチ名を指定する。_
      
      
#####参考    
[リモートのブランチをcloneする--Qiita](http://qiita.com/shim0mura/items/85aa7fc762112189bd73 "Qiita")
N+1問題について


#概要
***
SQLクエリが 「データ量N + 1回 」走ってしまい、取得するデータが多くなるにつれて（Nが増えるにつれて）パフォーマンスを低下させてしまう問題。
=> __低下させないようなコードを書くべき__

***

<br>

###具体例

```
@posts = Post.all 

@posts.each do |post|
post.user.name
…
```
  
      
などのコードを書くと、、、

__起きること__
userモデルを事前にローディングしていないので、post.userのたびにクエリが発行される 
=> N+1問題

<br>


###解決法
__Eager Loading(事前にデータをローディングしておく)__
メソッド `includes` を利用することで、Postモデルの取得時に、それに関連するUserモデルも取得できる。

```
@posts = Post.all.includes(:user)
```

<br>
_参考「N+1 問題」を検出してくれるライブラリとしてbullet がある_

<br><br>


####参照
http://ruby-rails.hatenadiary.com/entry/20141108/1415418367

http://www.techscore.com/blog/2012/12/25/rails%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E7%B4%B9%E4%BB%8B-n1%E5%95%8F%E9%A1%8C%E3%82%92%E6%A4%9C%E5%87%BA%E3%81%99%E3%82%8B%E3%80%8Cbullet%E3%80%8D/
node で ES6 の let を使ったファイルを実行すると SyntaxError になるのを回避する


(node v4.1.2)

## let 使うと SyntaxError になる現象

ES6 の記述を使って node コマンドでファイルを指定して実行できます。  
例えばアロー関数を使って実行

``` hoge.js
var a = (num) => {
  console.log(num);
};
a(10
```

```
$ node hoge.js

10
```

しかし、なぜか `let` 使うと `SyntaxError` になります

``` hoge02.js
let foo='bar';
console.log(foo);

```

```
$ node hoge02.js

/Users/cortyuming/example/hoge02.js:1
let foo='bar';
^^^

SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode
```

## 回避

### その１

`"use strict"` をつけるとエラー出なくなる


``` hoge03.js
"use strict"
let foo='bar';
console.log(foo);
```

```
$ node hoge.js

bar
```

### その２

実行時に `--use_strict` オプションをつける

```
$ node --use_strict hoge02.js

bar
```

## 参考リンク

- http://stackoverflow.com/questions/29347240/harmony-flag-in-node-js-0-12-throws-syntaxerror
Rakeタスクの賢いロギング

# やりたいこと
* すべてのRakeタスクの前後で、開始と終了のメッセージを表示したい。
* 毎回出るのは鬱陶しいので、指定したときだけ表示したい。
* いろんなところに`p`とか`Rails.logger.info`のような処理を書きたくない。

# 実装

```ruby:lib/tasks/setup_account.rake
desc "Setup an account"
task setup_account: %i(common) do
  logger.debug "creating account..."
  logger.info  "created account!"
end
```

```ruby:lib/tasks/common.rake
# Extend logger to the main object
def logger
  Rails.logger
end

desc "Setup a common setting for every tasks"
task common: %i(environment) do
  Rails.logger = Logger.new(STDOUT)
  Rails.logger.level = Logger::INFO
end

desc "Switch the level of a logger to DEBUG"
task debug: %i(common) do
  Rails.logger.level = Logger::DEBUG
end

require "task_logging"
```

```ruby:lib/task_logging.rb
module TaskLogging
  def task(*args, &block)
    Rake::Task.define_task(*args) do |task|
      if block_given?
        Rails.logger.debug "[#{task.name}] started"
        begin
          block.call(task)
          Rails.logger.debug "[#{task.name}] finished"
        rescue => exception
          Rails.logger.debug "[#{task.name}] failed"
          raise exception
        end
      end
    end
  end
end

# Override Rake::DSL#task to inject logging
extend TaskLogging
```

上のように実装すると、以下のように賢くログを出し分けられる。

```zsh
$ rake setup_account
I, [2015-10-10T17:38:58.192968 #15178]  INFO -- : created account!
$ rake debug setup_account
D, [2015-10-10T17:38:00.704398 #11753] DEBUG -- : [setup_account] started
D, [2015-10-10T17:38:00.704460 #11753] DEBUG -- : creating account...
I, [2015-10-10T17:38:00.704478 #11753]  INFO -- : created account!
D, [2015-10-10T17:38:00.704491 #11753] DEBUG -- : [setup_account] finished
```
AngularJS入門

最近AngularJSフレームワークを勉強したので覚書です。
MVCのViewをhtml,CSSファイルのみでModel, ControllerをJavascriptで実現してしまうことができます。

#AngularJSフレームワークの準備



まずはAngularJSを使えるようにします。
htmlファイルのheadタグに下記コードを挿入します。

```index.html
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.6/angular.min.js"></script>
```


そしてモジュール(ng-app)とコントローラ(ng-controller)を定義します。

```index.html
<!DOCTYPE html>
<html ng-app = 'App'>
  <head>
...
   <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.6/angular.min.js"></script>
   <script type="text/javascript" src="controller.js"></script>
  </head>
  <body ng-controller="AppController">
...
  </body>
</html>
```

```controller.js
var app = angular.module('App', []);

app.controller('AppController', function($scope){
//ここでModelとのやりとりなど。
});
```
angular.moduleの最初のパラメータはhtmlで定義したモジュール名、次のパラメータは依存関係（ルーティングやアニメーションを使うとき必要）を示すんですが今は省略します。

これでとりあえずAngularJSの準備ができました。

#実際に使ってみる（１）

AngularJSは基本的にディレクティブng-XXXでHTML要素のふるまいを定義して、データバインディング{{}}でControllerから送られた値を表示するということをします。


まずは簡単にボタンが押されたときテキストボックスから入力された文字を読み取ってそれを表示することをしてみましょう。


```index.html
<body ng-controller="AppController">
      <input type = "text" ng-model="displayText"> 
      <input type="button" value="Go" ng-click="display()">
      <h1>{{text}}</h1>
</body>
```

テキストボックスにng-modelでdisplayTextというモデルをつくります。
ボタンにng-clickでクリックされたときの関数display()をつくります。
h1タグにtextという値をバインディングします。

```controller.js
app.controller('AppController', function($scope){
  $scope.display = function(){
    var str = $scope.displayText;
      $scope.text = str;
  }
});
```
AngularJSでは\$scopeを介してViewとのやりとりをします。まず関数display()を定義し、$scopeからdisplayTextの値をtextに代入するといった流れです。

結果はこんな感じです。

![Screenshot (7).png](https://qiita-image-store.s3.amazonaws.com/0/52622/e673b332-628d-2985-336c-1f31848b456d.png)


これでjQueryなどでいちいち要素を指定して値を表示しなくてもよくなります。


#実際に使ってみる（２）

AngularJSの真骨頂はこれからです。
HTMLファイルでMVCのViewをすべて任せてしまおうということでHTMLでfor文なども使えてしまいます。
例えば、


```
$scope.comments = [
      {name: "Yamada", text: "Hello!"},
      {name: "Tanaka", text: "Thanks!"},
      {name: "Nakamura", text: "Yeah!"}
  ];

````

commentsという配列があったとします。これをng-repeatディレクティブをつかってループして表示します。

```index.html
<div ng-repeat="comment in comments">
          <h2>{{comment.name}} : {{comment.text}}</h2>
</div>
```


![Screenshot (8).png](https://qiita-image-store.s3.amazonaws.com/0/52622/3926798a-67d3-062b-be20-3ee2a889a0e8.png)

結果はこんな感じです。


今回は少しだけAngularJS使い方を紹介しましたがまだまだいろいろなディレクティブがあります。

詳しくは[日本語リファレンス](http://js.studio-kingdom.com/angularjs)などを参考にしてください。

次はAngularJSでルーティングのやり方をご紹介したいと思います。
Pythonでのワンライナー

Pythonでは、ワンライナーはやりづらいのですが、できなくはないです。
Pythonでワンライナーがやりづらい理由は、式にできることが少ないこと、複合文を1行で書けないことに集約されると思います。
ここでは、いろんな処理を式に落としこむための方法を紹介します。

#基本の方法
##and, or, 三項演算子
`if a: f()`は、`a and f()`と書けます。`if not a: f()`は、`a or f()`と書けます。
(論理演算子の短絡についてよく知らない方は、手前味噌ですが、 http://qiita.com/gyu-don/items/a0aed0f94b8b35c43290 をご覧ください。)
また、三項演算子は若干気持ち悪い構文ですが用意されています。 `true_value if condition else false_value`
##タプル化、リスト化
タプルやリストを作れば、複数の式をひとつの式にまとめることができます。最後に[0]や[-1]などで参照すれば、特定の箇所の値を取り出すこともできます。
#リスト内包表記を使ったループ
ループはリスト内包表記で行います。
##ジェネレータ
特にPython3では、至るところでジェネレータオブジェクトが出てきますが。副作用を期待しているときはとくに、リストとジェネレータの違いは重要です。
リスト内包表記は、その場で最後の要素まで、リストが作られます。一方で、ジェネレータは、next()で呼び出されるまで各要素は評価されません。各要素を評価するには、自分でnextを呼び出すか、list(gen)のようにするか、リスト内包表記のfor ... inで使うかです。
#lambdaを使ったあれこれ
##lambda
lambdaで匿名関数が作れますが、Pythonでは、匿名関数は単一の式でしか作れません。
##letの代わりに
lambdaを使うと、文を作らずに、変数を束縛することができます。セミコロンを使いづらい場面にどうぞ。
`(lambda a,b: a+b)(f(),g())`は、`a=f();b=g();a+b`を式で実現しています。
##リストを持たせておく
Pythonでは代入は文になってしまいますが、list.appendなら式になります。引数にリストを持たせておくと便利かもしれません。
例: sumやreduceを使わずに、0〜100の足し算結果を返す式
`(lambda t: [t.append(t.pop()+x)or t[0] for x in range(101)][-1])([0])`

##再帰
Yコンビネータなんて複雑なものを作らなくても、関数に自分自身を受け取る引数があればいいのです。
例: 1〜10の階乗
`(lambda f: f(10,f))(lambda n,f: n*f(n-1,f) if n>0 else 1)`

#それではみなさん、よいPythonライフを
おわり。
PythonでAzureストレージサービスのCORS設定をする方法

私の会社[カカドゥ](http://kakadu.jp/)では開発環境にPython + Django + Azureを使っています。

クラウド環境としてはAWSを利用している会社が多いと思いますが、Azureも[Pythonのライブラリ](https://github.com/Azure/azure-sdk-for-python)がSDKとして提供されていたりして、なかなか使いやすく気に入っています。

先日、Azureストレージという、AWSでいうところのS3に相当する機能を使い始め、静的ファイルをAzureストレージからサーブするようにしたのですが、PythonでAzureのCORS(Cross Origin Resource Sharing)の設定をする方法についてネットにまったく資料がなかったため、私が対応した方法を記録しておきます。

[CORSについてはこちらの記事を御覧ください](http://dev.classmethod.jp/cloud/cors-cross-origin-resource-sharing-cross-domain/)

```py
from azure.storage.models import StorageServiceProperties
from azure.storage.blob import BlobService
from azure.storage.blob.models import WindowsAzureData

class Cors(WindowsAzureData):
    pass

class CorsRule(WindowsAzureData):
    pass

rule = CorsRule()
rule.allowed_origins = '*'
rule.allowed_methods = 'GET,PUT'
rule.max_age_in_seconds = 500
rule.exposed_headers = 'x-ms-meta-data*,x-ms-meta-customheader'
rule.allowed_headers = 'x-ms-meta-data*,x-ms-meta-customheader'

cors = Cors()
cors.corsrule = rule

prop = StorageServiceProperties()
prop.cors = cors
prop.default_service_version = '2013-08-15'

client = BlobService(
    account_name='アカウント名',
    account_key='キー'
)
client.set_blob_service_properties(prop)
```

SDKの実装を読みながら導き出した対応策なのですが、もっと簡単にできるよって方法をご存知の方がいらっしゃいましたらコメントいただけると幸いです！
c++ builder XE4, 10.2 Tokyo > コンポーネントのタイプ?(TLabelなど)を取得する > srcPtr->ClassName() / bool isTLabel = (dynamic_cast＜TLabel *＞(lblPtr) != NULL);

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

##try1

コンポーネントがTCheckBoxかどうかの確認にはClassName()を使う。

```cpp
static bool isTCheckBox(TControl *srcPtr)
{
	if (srcPtr->ClassName() == L"TCheckBox") {
		return true;
	}
	return false;
}
```

ヘルプの`Vcl.Controls.TControl のメソッド`を参考にした。


<hr>
##try2
[SO](http://stackoverflow.com/questions/33060775/how-to-know-the-control-is-tlabel/33068111#33068111)にて教えていただいた方法。
以下を使う。

```cpp
if (dynamic_cast<TLabel*>(ParentControl->Controls[i]) != NULL)
```

実装してみた。

```cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	TControl *lblPtr = (TControl *)Label1;

	bool isTLabel = (dynamic_cast<TLabel *>(lblPtr) != NULL);
	bool isTComboBox = (dynamic_cast<TComboBox *>(lblPtr) != NULL);

	Memo1->Lines->Add(BoolToStr(isTLabel));
	Memo1->Lines->Add(BoolToStr(isTComboBox));
}
```

```txt:結果
-1
0
```
@Documented アノテーションの意味

# `@Documented` がないとき

**実装**

```java:Hoge.java
@MyAnnotation
public class Hoge {}
```

```java:MyAnnotation.java
public @interface MyAnnotation {}
```

**Javadoc 生成**

```text:
> javadoc -d doc -encoding UTF-8 -charset UTF-8 Hoge.java MyAnnotation.java
```

**出力結果**

![documented.JPG](https://qiita-image-store.s3.amazonaws.com/0/28302/ab2fded0-45d0-5b54-28c0-980446f5b4ec.jpeg)

# `@Documented` があるとき

**実装**

```java:Hoge.java
@MyAnnotation
public class Hoge {}
```

```java:MyAnnotation.java
import java.lang.annotation.Documented;

@Documented
public @interface MyAnnotation {}
```

**Javadoc 生成**

省略

**出力結果**

![documented.JPG](https://qiita-image-store.s3.amazonaws.com/0/28302/1fb6eeb4-26ca-868c-4cee-5b8f70193078.jpeg)

アノテーションのリンクが出力されるようになってる。

# 参考
- [7. アノテーション (3) | TECHSCORE(テックスコア)](http://www.techscore.com/tech/Java/JavaSE/JavaLanguage/7-3/)
c++ builder XE4, 10.2 Tokyo > 動的生成 > TPanel内のTLabelを動的コピーする / TLabelかどうかを知るのはClassName()使用

```txt:動作確認
C++ Builder XE4 on Windows 7pro
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

http://qiita.com/7of9/items/c0e4bcf9a3eae51a3525
において、TLabelの動的生成を行った。

今やりたいのは、TPanel内のすべてのTLabelを別のTPanelにコピーすること。

とりあえず位置、Font、Caption、Visibleをコピー。

### code

```cpp
static bool isTLabel(TControl *srcPtr) { return srcPtr->ClassName() == L"TLabel"; }

void __fastcall TForm1::Button1Click(TObject *Sender)
{
	TLabel *work;
	TLabel *srcPtr;

        // copy all the TLabels from Panel1 to Panel2
	for(int idx=0; idx < Panel1->ControlCount; idx++) {
		if (isTLabel(Panel1->Controls[idx]) == false) {
			continue;
		}

		srcPtr = (TLabel *)Panel1->Controls[idx];

		work = new TLabel( this );
		work->Name = L"test" + IntToStr(idx);
		work->Parent = Panel2;
		work->Height = srcPtr->Height;
		work->Width = srcPtr->Width;
		work->Left = srcPtr->Left;
		work->Top = srcPtr->Top;
		work->Font = srcPtr->Font; /* Font */
		work->Caption = srcPtr->Caption;
		work->Visible = srcPtr->Visible;
	}
}
```

コンポーネントがTLabel型かどうかのチェックはClassName()で確認。
[SO](http://stackoverflow.com/questions/33060775/how-to-know-the-control-is-tlabel)に質問したが、ヘルプで見つけた。
(http://qiita.com/7of9/items/e601b8fb10a2a40423e3)

### 400個のコピー時間

400個のコンポーネントを動的コピーするとどれくらい重いのかは気になる。

実際にやってみたところ、ButtonOnClick()での処理では600msecだった。
FormCreate()時の処理では1900msecかかる。

### デバッグ

動的コピーしたものがどういう名前になったかのデバッグは以下で行う。

```
	dstPtr->Hint = dstPtr->Name;
	dstPtr->ShowHint = true;
```

### ComponentCountが増えない

~~上記でコピーしたのはいいが、ComponentCountがコピー前と同じだった。
なんらかの追加処理が必要なのか?~~

作り直した処理にて以下のthisに相当するものが、別のコンポーネントを指してたのが原因だった。

```
		work = new TLabel( this );
```

関連 http://stackoverflow.com/questions/9918013/why-the-componentcount-property-of-my-tgroupbox-returns-0