OmniAICreator/Qiita-1.07M huggingface dataset:
【今日からIoT】根っからのプログラマーがIoTを始めようと思い立ち、100均で手に入る電子回路で遊んでみた（前編）

さてさて、AdventCalendarの季節が今年もやってまいりました！

昨年に引き続き、書きたいものを書きますよ。
いいねとかストック数とか全然関係ないぜ！ウェーイ！！

# あらすじ
今年の秋、プログラマー＆ネットワークエンジニア集団だった我が社にも遂にIoTの波が訪れました。
最近入社したばかりのメンバーが、実用的かつイケてるBluetoothセンサー機器（ウ○コがどれだけ臭いか測るマシン）を組み上げ、社内に衝撃を走らせたのです。

我々プログラマーは論理設計のプロフェッショナル。
そして、電子回路も極めて論理的なもの。
ということは、プログラマーは電子回路を作るのに向いているハズ。

~~自分のウ○コの臭さを測ってみたい。~~
自分もIoT機器を組み立ててみたい。

その大いなる野望への第一歩として、まずはぶっ壊れても後悔しない電子機器をぶっ壊してみよう！

ってことで、押すとメロディーの鳴るメッセージカードを100均で買ってきました。
前編では、こいつのメロディーをスピーカーから流すことにチャレンジします。

# 準備するもの
- メロディーが流れるメッセージカード
→100均で買ったヤツ。

- 普通のスピーカー
→多分壊れないけど、壊れても泣かないものが吉。

- ジャンパーケーブル
→銅線みたいなもん。ネットで買える。数十本セットで数百円くらい。

- はんだごて
→１本持ってて損は無し。ネットで買える。
　台とかのセットで1000円しないのもある。最近何でも安いなー。

# やってみる
では作業を始めましょう。

## メッセージカードをチョキチョキする
まずはメッセージカードをチョキチョキっと切って、基盤とスピーカーを取り出します。
間違って中身を切らないよう気をつけましょう。

こんなん出てきました。
![IMG_6213.JPG](https://qiita-image-store.s3.amazonaws.com/0/74903/cede6758-ee46-c0db-b2b5-9bfda27ca4eb.jpeg)

## 回路を取り外す
私の購入したメッセージカードは、両面テープで紙に張り付いていたのでペリッと丁寧に剥がしました。

よし、うまく剥がせた。
![IMG_6214.JPG](https://qiita-image-store.s3.amazonaws.com/0/74903/de00d01c-af7b-9117-084c-5055576e10c8.jpeg)

## 回路を観察する
基盤にボタン電池が乗っていて、スイッチとスピーカーに繋がっているようです。
電池の横の黒い部分に、音を出すための回路が入っているのかな？多分。

このちっちゃなスピーカーは「圧電スピーカー」ってやつで、電圧をかけると部品が縮み、その力で板を振動させて音を出すようです。
かがくのちからってすげー！

調べたところ、中央がプラス、外側がマイナスの模様。
シンプル。
![IMG_6218.JPG](https://qiita-image-store.s3.amazonaws.com/0/74903/7d2fe92c-abec-dbcb-ebc5-24a429b519f4.jpeg)

## 圧電スピーカーを取り外す
圧電スピーカーは部品として使えそうなので、丁寧に取り外してみます。
プラスとマイナスが基盤のどの端子に繋がってるか覚えておき、はんだごてでレッツトライ。

よーし、見事成功！
ついでに、取り外した端子にジャンパーケーブルをくっつけてみました。（プラスに赤、マイナスに黒）
![IMG_6216.JPG](https://qiita-image-store.s3.amazonaws.com/0/74903/cbbc8db4-8705-01f2-a929-506904dd1c90.jpeg)

## スピーカーのプラグを眺める
どうやって音流せばいいんだろー？と調べたところ、3.5mmプラグってヤツはずいぶん簡単な仕組みのようで。

今回使ったステレオスピーカーだと、↓の通り。
- 根っこがマイナス
- 真ん中が右スピーカー入力
- 先っぽが左スピーカー入力
![IMG_6217.JPG](https://qiita-image-store.s3.amazonaws.com/0/74903/838f758b-bf8a-32b2-2ad6-4100ce5d50f5.jpeg)

これなら圧電スピーカーと同じ繋ぎ方すれば音流れるんじゃない？と思ったワケです。

## スピーカーから音を出してみる
ちっちゃいボタン電池だと1.5Vなので、スピーカーに直接繋いでも壊れはしないでしょー
圧電スピーカー動いてたし。

ってことで、先ほど基盤にくっつけたジャンパーケーブルを3.5mmプラグに接触させます。
- 赤いケーブルを3.5mmプラグの真ん中か先っぽに接触
- 黒いケーブルを根っこに接触
（注）逆にしたりショートさせたりしないよう注意

↑が完了したらメロディーの再生スイッチをポチっとな。

私の手元では、見事メロディーがスピーカーから流れました！
圧電スピーカーと較べてどんな音が鳴るかは、ぜひお手元で試してみてください。

# まとめ
今回はオモチャ分解しただけでプログラムの欠片もない。
これは酷い。（ってか怒られそう・・・ｗ

後編ではちゃんとプログラム書きますよー
Arduinoで音声信号のキャプチャにトライしてみますので、お楽しみに！

→[後編はこちら](http://qiita.com/Ijoru/items/08c6c3b517bdee50f6b7)
TAPL3-1.ブール値(B)

この記事は[Prolog Advent Calendar 2016](http://qiita.com/advent-calendar/2016/prolog)の５日目の記事です。

今日はTAPL図3-1をPrologで実装してみます。

```math
\begin{array}{l|l}

\begin{array}{l}
構文\\
\begin{array}{lcr}
t ::=  &             & 項：\\
 &true               & 定数真\\
 &false              & 定数偽\\
 &if \;t\;then\;t\;else\;t & 条件式\\

v ::= & &              値：\\
   & true &             定数真\\
   & false &            定数偽\\
\end{array}
\end{array}
&
\begin{array}{l}
\begin{array}{cr}
評価  \hspace{320px} & \bbox[3px,border:1px solid black]{t \longrightarrow t’}\\
if\;true\;then\;t_2\;else\;t_3 \longrightarrow t_2   & \text{(E-IfTrue)}\\
if\;false\;then\;t_2\;else\;t_3 \longrightarrow t_3  & \text{(E-IfFalse)}\\

\dfrac{t_1 \longrightarrow t_1’}
{if\; t_1\; then\; t_2\; else\; t_3
\longrightarrow if\; t_1’\; then\; t_2\; else\; t_3}
& \text{(E-IfTrue)}
\\
\\
\\
\\
\end{array}
\end{array}
\end{array}
```

が元のTAPLの構文と、評価規則ですが、if then elseはprologの項として表すのは優先順位をちゃんと表すのはめんどうなので、楽にif(t,t,t)としてみます。

```prolog:tapl03_1.pl
/*
構文

t ::=                項：
　true               定数真
　false              定数偽
　if(t,t,t)          条件式

v::=                 値：
　true               定数真
　false              定数偽
*/
:- op(920, xfx, [ ==>, ==>> ]).
:- op(1200, xfx, [ -- ]).
:- style_check(-singleton).
term_expansion(A -- B, B :- A).

t(true).
t(false).
t(if(T1,T2,T3)) :- t(T1),t(T2),t(T3).
v(true).
v(false).

% 評価 t ==> t’

if(true, T2,T3) ==> T2.         % (E-IfTrue)
if(false,T2,T3) ==> T3.         % (E-IfFalse)

T1 ==> T1_
--%------------------------------ (E-If)
if(T1,T2,T3) ==> if(T1_,T2,T3).

T ==>> T3 :- T ==> T2, T2 ==>> T3.
T ==>> T.

run(T) :- T ==>> T2, writeln(T2).

:- run(true).
:- run(if(true,false,true)).
:- run(if(false,false,true)).
:- run(if(if(true,false,true),if(true,false,true),if(true,false,true))).
:- halt.
```
文字が描画されるまで

# 文章、見えてますか？

コンピュータは機械的に文章を表示します。
この文章が表示されるまでにも様々な処理を経ているわけです。
今回は、その処理をざっくりと説明します。
（昨日のアドベントカレンダーの1.と2.の内容に相当します）

アプリやブラウザ上に文字を表示させることは多いと思いますが、これは画像の表示に比べるとずっと曖昧でふんわりとしたものです。
つまり、非常に複雑な処理が発生しています。

# なぜ文字が見えるのか？
ではどうしてディスプレイには文字が表示されているのでしょうか。
ここで重要な役割を果たすのが

1. 文字コード
2. フォント
3. 文字列描画システム

この2つです。

## 1.文字コード

これは機械を使う人同士でのプロトコルです。
つまり、この値はこの文字に相当するものとして扱いましょうという約束です。
ただし、世界にはこうした約束がいくつもあります。
世で一般にテキストファイル（`*.txt`）と呼ばれるものは、こうしたいくつもある約束のいずれかに則ってデータを書き込んでいるわけです。

ただ、ここで問題になるのが、そのテキストファイルが一体どの文字コードで書かれているのかという点です。
つまり、もっと具体的に言うと、テキストファイルは`UTF-8`なのか`Shift_JIS`なのかということです。
これを機械側が確実に知るのは難しく、また、人間にも難しい問題です。
これがよくいう「文字化け」の原因です。
（UnicodeのテキストならいわゆるBOMと呼ばれるものがあると非常に助かります）

この文字コードに従ったバイナリ情報を人間の目と脳に優しい画像情報にするための情報が詰まっているのがフォントです。

## 2. フォント

フォントは上に出てきた文字コードに準って、ディスプレイ上に適切な文字を表示するためのデータが含まれたファイルです。
つまり、

1. コードポイントをフォント中のグリフIDに変換する（OpenTypeの`cmap`）
    - 全てのコードポイントに対応しているわけではない
    - `cmap`は文字コードや役割で複数あったりもする
2. IDに対応するグリフには文字を描画するための情報が格納されている
    - OpenTypeフォントではPostScript系、TrueType系の2種類のアウトラインデータフォーマットがある
    - ビットマップフォントも存在しうる（Windowsのカクカクしたやつ）
    - カラー絵文字も存在しうる（PNGだったりアウトラインデータと色情報だったり色々）
    - `SVG`も存在しうるようになった（つらい）
3. さらに文字と文字の配置を調整したり、適切に変形させたりする情報もある（オプション）
    - 特に`GSUB`, `GPOS`が様々な仕事をする
    - 最近はバリアブルフォントというのも出た

ところで先ほどは文字化けの話をしましたが、実はもう一つ文字化けと呼ばれるだろう事象がフォントの世界にもあります。

### `\`と`¥`

さてここのサブタイトルは、同じ文字でしょうか、違う文字でしょうか。
Qiitaのフォント指定がいい感じならほとんどの環境で違う文字に見えていると思います。
もし、Windowsの方がいればこの**\と¥**をコピーしてメモ帳などに貼り付けてみましょう。
どうなるでしょうか？

Windowsのレガシーな文字コードではバイナリで言うところの`0x5C`は各地の通貨記号でローカライズすることが多く、日本もその例外ではありませんでした。
つまり、UnicodeでのREVERSE SOLIDUS (U+005C) に対応するコードポイントが円記号（中国元の記号でもある）に置き換えられていました。
日本語のWindowsのファイルパスでよく見るやつですね。

これはWindowsに収録されているフォントの`0x5C`に対応するグリフがShift_JISだけではなくUnicodeの`cmap`でも同じく円記号にマップされているために起こる問題です。
つまり、文字コードではなくフォントへの信頼が仇となるパターンです。

少し似た問題として、全角チルダ/波ダッシュ問題というものもあります。
気になる方は調べてみましょう。

## 文字列描画システム

文字コードとフォントだけがあってもそれらを人間が感じ取って脳内で適切に理解することは難しいです。
そのため誰かが両方の仕様を把握し、コンピュータに処理させて人間の理解できる出力に変換しなければいけません。
それが文字列描画エンジンです。

つまり、何かしらの文字コードに従った文字列を、フォントの情報を適切に解釈して画像にしてくれるのが文字列描画エンジンです。
GUIな環境を持つOSや各種ブラウザなどがこれを持っています（TATEditorも）。

適切に解釈すると言うのは具体的には、縦書き日本語で縦書き用にグリフを変更したり、英語で文字間の距離を調整したりfiを一つのグリフで表示したり、アラビア語で単語の頭と中間と末尾で違うグリフを使ったりしないといけません。（もっと詳しいことはまたいずれ話せたらいいなあ）

### フォントフォールバック
ひとつのフィントに収録できるグリフの最大数は仕様上65536個までです。
そのため、昨今の多言語化する情報をすべて表示するためには数が足りません。
そこで多くの文字列描画システムは、対応するグリフが存在しない場合には他のフォントからグリフを持ってきて穴埋めすると言う処理を行います。
これがフォントフォールバックです。

#### ところでここのフォントは何？

難しい質問ですね。
Chromeの拡張機能などは使用されているフォントを教えてくれたりしますが、厳密に知りたいのであれば役には立ちません。表示されているグリフがどのフォント由来なのかを確実に確かめる方法は現状ほぼ皆無です。
これは上で述べたようなフォントフォールバックのシステムがあるためです。
HTML/CSSではどのフォントを優先して使用してほしいという指定はできますが、それがなければ代替フォントが使用されるのでブラウザの描画処理を直接追わないといけません。少なくともCSS 2.2の仕様では、指定されたフォントとデフォルトフォントでマッチするグリフがなければブラウザ側で適当に処理してもいいと書いてある。
つまり闇の技術です。

ちなみにTATEditorならどのフォントのどのグリフが使われているのか簡単にわかりますよ（宣伝）。
一番下のU+xxxxの後ろがフォント番号とグリフID。
![UnicodeのコードポイントとグリフIDがわかる図](https://qiita-image-store.s3.amazonaws.com/0/150995/3a9df18a-3664-846c-12f6-1fc3e2cad9d5.png "UnicodeのコードポイントとグリフIDがわかる図")

# おわりに

今日も今日とて当日に書いた記事になってしまいました（2230から書いてます）。
明日も何か書きます。
TypeScript　静的型付け

TypeScriptについて、基本的なことをまとめます。


#TypeScriptとは

Microsoft社が開発したAltJS。

AltJS(Alternative JavaScript)とは、JavaScriptの代替言語のこと。コンパイルすることでJavaScriptに変換される。便利な記法を使えたりするので、開発効率があがったりする。

TypeScriptも、コンパイルすることでJavaScriptに変換される。

TypeScriptで作成したコードは、「XXX.ts」のように「ts」という拡張子が使われ、コンパイルすることで、「XXX.js」となる。

#TypeScriptの特徴　静的型付け
変数にデータ型を付与することができる(JavaScriptは動的型付け言語)。

```js:sample.ts
var text:string;
text = "Hello!";
```
**変数名:データ型**で、型を指定できる。
このように書くと、text変数にstring以外のデータ型をいれようとするとエラーになる。

```js:sample.ts
var text:string;
text = 1;    // コンパイルエラー
alert(text);
```

型はほかにも、boolean、number、配列、enum、anyなども指定できる。

####配列

```js:sample.ts
var colors:string[];
colors = ["red", "green", "white"];   
```
Arrayを使用する方法もある。

####enum

```js:sample.ts
enum Color {Red, Green, White};
var color: Color = Color.Green;
var colorName: string = Color[color];
alert(colorName);  // "Green"
```
enumには0から連続する数字がはいる。(Redには0、Greenには1、Whiteには2)

####any
すべての型を指す。なんでも代入できてしまう。

```js:sample.ts
var value: any;
value = 0;
value = "string";
```
Juniper を Ansible, Python で操作する準備


ここ一ヶ月、忙しかったのでリフレッシュのため、週末で軽井沢に来てるのですが、客室がスイートにアップグレードされ、ベッドルームが 2つになったので、その片方のベッドルームで書いてます。

路肩に雪があって、ところどころ道路も凍結しているのに、ノーマルタイヤ。事故ったら確実に「4駆乗りの過信」と言われるので夜間はおとなしく。

前回の記事で vSRX を VMware Fusion にデプロイしましたが、今回はその vSRX を操作する Ansible 側を準備します。

1. Ubuntu のインストール
2. とりあえず safe-upgrade 

	ホテルに無線LANがあって助かる。DHCP で 172.16.0.0/16 で降ってきたので、Broadcast に ping したら 50 デバイスぐらいいた。Apple 多め。
3. ansible インストール 
	[公式ドキュメント](http://docs.ansible.com/ansible/intro_installation.html#latest-releases-via-apt-ubuntu) に従って、以下でインストール


	```
# apt-get install software-properties-common
# apt-add-repository ppa:ansible/ansible
# apt-get update
# apt-get install ansible
```

4. ansible galaxy で [Juniper.junos](https://galaxy.ansible.com/Juniper/junos/) をインストール

	```
	# ansible-galaxy install Juniper.junos
	# ls -ld /etc/ansible/roles/Juniper.junos/
drwxr-xr-x 7 root root 4096 Dec  3 06:36 /etc/ansible/roles/Juniper.junos/
```

5. [Junos PyEZ](https://github.com/Juniper/py-junos-eznc) インストール

	```
# apt-get install python-dev libxslt1-dev libssl-dev libffi-dev
# wget https://bootstrap.pypa.io/get-pip.py -O - | sudo python
# pip install junos-eznc
```

6. [unos-netconify](https://github.com/Juniper/py-junos-netconify) インストール

	```
# pip install junos-netconify
```

7. PyEZ 確認

	以下を実行してエラーが出なければインストール出来ています。

	```
% python
>>> from jnpr.junos import Device
>>>
```
rspecコマンドがspecディレクトリを読み込むまでの流れ

:warning: てrspecを使う分には全く不要な知識なので、余程のことが無い限りここから先を読む必要はありません。

--

諸事情で `rspec` コマンドを引数無しで実行した際に spec ディレクトリ以下の xxx_spec.rb ファイルが指定される流れを追ったので、それを記録として書き残す。バージョンは3.5.4とする

1. `rspec` コマンドを実行すると [`RSpec::Core::Runner.invoke` が実行される](https://github.com/rspec/rspec-core/blob/v3.5.4/exe/rspec#L4)。
2. `RSpec::Core::Runner.invoke` すると [`RSpec::Core::ConfigureOptions` が作られ](https://github.com/rspec/rspec-core/blob/v3.5.4/lib/rspec/core/runner.rb#L66)、 [`RSpec::Core::Parser` が呼び出された結果](https://github.com/rspec/rspec-core/blob/v3.5.4/lib/rspec/core/configuration_options.rb#L134)、 `@options` インスタンス変数に [`{:files_or_directories_to_run=>[]}` が追加される](https://github.com/rspec/rspec-core/blob/v3.5.4/lib/rspec/core/configuration_options.rb#L46-L49)。
3. その後 [`RSpec::Core::Runner#run` が実行され](https://github.com/rspec/rspec-core/blob/v3.5.4/lib/rspec/core/runner.rb#L71)、その過程で先程の `RSpec::Core::ConfigureOptions` に対し [`#configure` が実行される](https://github.com/rspec/rspec-core/blob/v3.5.4/lib/rspec/core/runner.rb#L99) と [`RSpec::Core::ConfigureOptions#process_options_into` が呼ばれ](https://github.com/rspec/rspec-core/blob/v3.5.4/lib/rspec/core/configuration_options.rb#L21)、その中で先程の `@options` の値から [`RSpec::Core::Configuration#files_or_directories_to_run=` が引数無しで実行される](https://github.com/rspec/rspec-core/blob/v3.5.4/lib/rspec/core/configuration_options.rb#L112)。
3. 引数が無いので [`default_path` が使われ](https://github.com/rspec/rspec-core/blob/v3.5.4/lib/rspec/core/configuration.rb#L918)、[その `default_path` に `"spec"` が入っている](https://github.com/rspec/rspec-core/blob/v3.5.4/lib/rspec/core/configuration.rb#L432)。
4. こうして `RSpec::Core::Configuration#files_or_directories_to_run` が `["spec"]` になり、[`RSpec::Core::Configuration#files_to_run` に spec 以下の xxx_spec.rb が入る](https://github.com/rspec/rspec-core/blob/v3.5.4/lib/rspec/core/configuration.rb#L928)。RSpecはテストでこの `#files_to_run` を使う。
Trello APIでチェックリスト付きカードを作るメモ(curl)

# 前提
- APIキーとトークンを取得済であること
- カードを作成する対象のボードとリストが作成済であること

# 手順
## 1. BoardのIDを取得

```:curl
$ curl 'https://trello.com/1/members/[user]/boards?key=[key]&token=[token]'
```
ボードのIDを控えること

### 2. リストのIDを取得
```:curl
$ curl 'https://trello.com/1/boards/[BoardID]/lists?key=[key]&token=[token]'
```
リストのIDを控えること

### 3. カードの作成
```:curl
$ curl -X post 'https://trello.com/1/cards?key=[key]&token=[token]&idList=[ListID]&name=[card name]'
```
カードのIDを控えること

### 4. チェックリストの作成
```:curl
$ curl -X post 'https://trello.com/1/cards/[cardID]/checklists?key=[key]&token=[token]'
```
チェックリストのIDを控えること

### 5. チェックアイテムの追加
「kure」アイテムを追加

```:curl
$ curl -X post 'https://trello.com/1/cards/[cardID]/checklist/[checkListID]/checkitem?key=[key]&token=[token]&name=kure'
```


# 参考
API Reference | Trello Developers
https://developers.trello.com/advanced-reference/
New Relic APM でデータストアをインスタンス単位でパフォーマンスを表示

アドベントカレンダー三日目。今日は、最近追加された、APM の新機能、「データストアをインスタンス単位で可視化」できる機能を紹介。

複数データベースを利用している方、複数のアプリで１つのデータベースを利用している方には、パフォーマンスが気になった場合に便利な機能だと思います。

## 何ができるの？

ざっくり言うと、以下ができるようなった。

- 複数のデータストア・インスタンスを使っている場合に、個々のインスタンスのパフォーマンス(クエリ処理時間、スループット)が見える
- 1つのデータストア・インスタンスで複数アプリを使っていた場合に、アプリごとのパフォーマンスが確認できる
- データストアの健全さが一目でわかるヘルスインジゲーターがついた（アプリにあったが、データストアにもこの度付いた）
- トランザクション・トレースなので、個々のクエリを見た際に、それが、どのデータストアなのかの情報を表示するようなった

もぅちょっと個々を詳細に説明します。

### サービスマップページ

※ サービスマップは、APM が管理しているアプリのアーキテクチャを自動的に視覚化するページ。

- データストアのヘルスインジゲーター: データストアのパフォーマンスが正常化どうかを一目で確認できるようなった。アプリにはあったが、データストアにもついた。
- １つのデータストアで複数のアプリ、複数インスタンスを利用している際に、フィルター機能で絞りこみが行えるようなった。

![service_map_db_122.png](https://qiita-image-store.s3.amazonaws.com/0/46003/3fabfc9b-f4d2-2dee-c077-3eaacd83932e.png)


### トランザクション・トレース ページと スロークエリ・トレース ページ

- トランザクション・トレースページの Trace details タブや Database queries タブでクエリと一緒にデータベース名とインスタン情報が表示される。

<img width="316" alt="trace_dtails_122.png" src="https://qiita-image-store.s3.amazonaws.com/0/46003/865e9b63-9a40-33bc-a566-00ee911d2db3.png">

## インスタンス単位でアラートの設定ができる

New Relic Alerts のアラート条件で、custom metric に以下のように指定することで、インスタンス単位でレスポンスタイムやスループットのパフォーマンスが低下した際に、アラート通知の設定ができる。

```
Datastore/instance/vendor/host/port
```


## 使う条件は？

この機能に必要な情報を収集する APM エージェントのバージョンを使っている必要があります。またデータベース・ドライバにも依存するので、詳しくは、「[互換性と要件(日本語)](https://newrelic.degica.com/docs/apm/applications-menu/features/analyze-database-instance-level-performance-issues#all-links)」に書いてあるのでそちらをチェック。

ここでは、簡単に APM エージェントのバージョンのみ書いておきます。

- Ruby: 3.17.0 以上 (1.4 は、2016/10/18 リリース)
- PHP: 6.8 以上 (6.8 は、2016/11/9 リリース)
- Java: 3.33.0 以上 (3.33.0 は、2016/11/2 リリース)
- .NET: 未対応
- Python: 2.72.0.52 以上  (3.33.0 は、2016/10/18 リリース)
- Go: 1.4 以上 (1.4 は、2016/10/12 リリース)
- Node.js: 1.31.0 以上 (1.31.0 は、2016/10/12 リリース)

メモ: 現在、自身が使用バージョンが気になる場合は、New Relic にログインし、APM > (アプリを選択) > 左サブメニューの一番下の方の `Environment` >  `Environment snapsho' タブの左に、サーバーごとにインストールしているエージェントバージョンが表示されるので、それをチェック。

## 誰が使えるの？

この機能は、**有料版のみ**の提供。つまり、`Essentials` と　`Pro` をお使いの方が対象。

また、サービスマップ上でのデータストアのインスタンスの可視化機能は、`PRO` のみの提供。


## まとめ

以上、いかがでしたでしょうか？ 複数データベースを利用している方、複数のアプリで１つのデータベースを利用している方には、パフォーマンスが気になった場合に便利な機能かと思います。

あわせて読みたい: もっと詳細に知りたい方は以下が参考になります。
- [ブログ記事:[翻訳] New Relic APM を使って個々のインスタンスにまで深掘りしてデータベースのパフォーマンスを監視、トラブルシューティングする](https://newrelic.degica.com/blog/apm-database-performance-instance-troubleshoot)
- [ドキュメント:データベースとインスタンスレベルのパフォーマンス問題の分析(日本語)](https://newrelic.degica.com/docs/apm/applications-menu/features/analyze-database-instance-level-performance-issues#all-links)

このように、APM は日々進化していますので、ちょいちょいリリースノートをチェックしてみると、思わぬ新機能が使えるようなっていることがあります。

この機会に是非、最新版にバージョンアップしてみてください。

この機能以外に今年追加された機能なんかは別の日に解説しまーす。
HSP3でマルチプラットフォームかいはつ

[ドワンゴ Advent Calendar 2016](http://qiita.com/advent-calendar/2016/dwango)

# 概要
現在HSPはjsやAndroid、iOSなど、複数の環境へビルドすることが可能になっています。
久しぶりにAndroid開発勉強しようと思ったら、ちらりとHSPの名前が出てきて、急に懐かしくなってしまいました。
せっかくですので子供時代を思い出しながら、適当なゲームを作ってビルドしてみたいと思います。

## Version
この記事は、HSP3.4を利用しています。
また、ゲームは最新のChromeにて動作確認しました。

## りんく
[HSPのあどべんとかれんだー](http://qiita.com/advent-calendar/2016/hsp)もありますよ。書いて、どうぞ


# HSPの現在
かつては、事実上Windowsでしか動作させられなかったHSPですが、Version3となった現在は以下の環境向けにビルドすることが可能です。一応、JavaアプレットやCGIとして動作させることも可能ですが、昨今の状況から考えると実用的ではないでしょう。

+ Windows
+ iOS
+ Android
+ Web（js）

Unityのように野蛮で強力なエディタはもっていませんが、対応環境は意外と豊富です。
特に**JSを出力できる**という事は、やや手間ですがElectronでラップしてやればMacやLinux上で動かせるという事です。
ただし、DirectX等、各環境に対応してない命令や仕様を把握し、それらを使わないように書く側が配慮してあげる必要があります。

# hsp do it!
JSとして出力できる点を利用し、jsdo.itのようにブラウザ上で書きながら実行できる[HSP部屋](http://hsproom.me/)というサイトがありますので、手軽に実験できます。
ぼくも今回はこのサイトを利用してゲームを作ろうと思います。Web上で動くなら大体の環境でビルドできるはず、という目論見からです。

# Web上で動くげーむ
ニコマークを拾う簡単なゲームを作りました。こちらからプレイできます。
http://hsproom.me/program/view/?p=195
![rnico.png](https://qiita-image-store.s3.amazonaws.com/0/40020/a14f3774-0139-4185-18d9-0fc6b0c941bb.png)



ソースコードはこちら
https://github.com/orzngo/nicorush

リソースをうｐし、ソースコードを張り付けるだけで動きます。
実は制作もここのエディタ上でやりました。最初からWebやAndroidを意識するならこのフローはアリだと思います。Macでもできるし……

# 各環境へのビルド

## Windows向けにビルド
HSPの本来の土俵であるため、エディタでポチポチ作業すると実行ファイル的なものが出来上がります。
ただ、筆者の環境では、実行ファイルを作成すると、pngのアルファが無効になるという現象が発生しました。
![winico.png](https://qiita-image-store.s3.amazonaws.com/0/40020/bdea3965-6413-a271-3cfa-76688889895d.png)

エディタ上からデバッグ実行しているときは大丈夫なのですが、なんやねんこれは、、、

## Web向けにビルド
公開するだけならHSP部屋で十分だと思うんですが、自分でビルドすれば、Electronできるので夢が広がるような気がします……しない？
http://www.onionsoft.net/hsp/v34/doclib/hsp3dish_js.htm

こちらの手順に従います。どうも、HSPのランタイムをEmscriptenかましてC++ -> jsに変換し、中間コードをjsに実行させているようです。
出来上がったものをDropboxにうｐして公開しようとしたのですが、いつからか、HTMLを表示させなくしたようです。（ダウンロードが始まる）
仕方がないので、zipで固めたものを置いておきます。
https://dl.dropboxusercontent.com/u/30980641/nicorush_web.zip
まあ、最初のほうにリンクを張った、HSP部屋で遊べるものと同じものが遊べるだけです。
中間コードや画像ファイルなどをまとめたファイルをXMLHttpRequestで取得しようとするため、おそらくローカルで実行しても動かないと思います。

## iOS向けにビルド
http://www.onionsoft.net/hsp/v34/doclib/hsp3dish_xcode4.htm

手順自体はここにあるのですが、間に合いませんでした。宿題にします。
Webでは動いたので、HSP3Dish準拠でコードはかけているはずで、プロジェクトの設定さえできれば、少なくともシミュレータ上では動きそうです。
通常のiOS向けアップリと一緒で、ビルドにはMacが必要になります。


# まとめ
HSPで、共通のリソースから複数の環境へビルドしました。ソースコードに若干気を遣いますが、少なくともWebとWindows環境へ向けてはビルドできました。（アルファ情報が落ちたのが気になるけど）
僕が昔ゲームを作っていたころからは想像もつきませんが、今はHSPを覚えるとAndroidもiPhoneも守備範囲に入ってしまうわけです。すごい。
もちろん、関数の定義がクソ面倒だったり、goto loopでゴリゴリ書いたりと、原初の鼓動とでもいうべき懐かしさあふれる言語ではあります。
しかし、がりっと書いたらとりあえず動く、という単純さは、とっつきやすさという点ではまだ捨てたもんではないかなと思いました。
ScalaだのTSだの、日進月歩の仕様に疲れた方は、ふと手を止めて、初めてハローワールドした時のことを思い出しながら、HSPで年末年始を過ごしてみてはいかがでしょうか。

# 謝辞
開発の大部分を、[HSP部屋](http://hsproom.me/)でやらせていただきました。
作者のmjhd様にこの場を借りて御礼申し上げます。
単機能のRuby製自作コマンドのGemをつくって配布する


`hello_command`という名前のgemをつくります。
コマンドも同名の`hello_command`です。
単機能コマンドつくるだけだったらThorとかめんどくさいので使いません。

# 雛形を生成する

`bundle gem hello_command -b`で雛形を生成してくれます。
名前が既存のgemと被ってるとめんどくさそうなのであらかじめ同名のgemが無いことをrubygems.orgなどで確認しておきます。

```bash
$ bundle gem hello_command -b
Creating gem 'hello_command'...
MIT License enabled in config
      create  hello_command/Gemfile
      create  hello_command/.gitignore
      create  hello_command/lib/hello_command.rb
      create  hello_command/lib/hello_command/version.rb
      create  hello_command/hello_command.gemspec
      create  hello_command/Rakefile
      create  hello_command/README.md
      create  hello_command/bin/console
      create  hello_command/bin/setup
      create  hello_command/.travis.yml
      create  hello_command/test/test_helper.rb
      create  hello_command/test/hello_command_test.rb
      create  hello_command/LICENSE.txt
      create  hello_command/exe/hello_command
Initializing git repo in /Users/miminashi/projects/hello_command
```

# .gemspecを編集する

`hello_command.gemspec`をvimなどで開きます。

`spec.summary`, `spec.description`, `spec.homepage`あたりは必須です。
ここを書き換えておかないとあとでgemをビルドするときにおこられます。

依存するgemはGemfileには書かずに、`spec.add_development_dependency`の次の行あたりに、

```ruby
spec.add_dependency "haikunator"
```

といった感じで追加します。

# 自作コマンドのコードを書く

`exe/hello_command`をvimなどで開きます。
好きなようにrubyのコードを書きます。
今回はrequireひとつとputsがひとつあるだけです。

```ruby
#!/usr/bin/env ruby

require "hello_command"
require "haikunator"

puts "#{Haikunator.haikunate(0, ' ')}, #{Haikunator.haikunate(0, ' ')}"
```

# 書いたコードを実行してみる

`bundle exec exe/hello_command`で実行できます。
望む動作になるまで書いてはこれを実行します。

```bash
$ bundle exec exe/hello_command 
hidden river, young wave
```


# gemをビルドする

`bundle exec rake build`でビルドできます。

```bash
$ bundle exec rake build
hello_command 0.1.0 built to pkg/hello_command-0.1.0.gem.
```

`pkg/hello_command-0.1.0.gem`が出来上がったパッケージです。
rubygems.orgなどにアップロードしなくても、とりあえずこのファイルを配布すれば自作したコマンドを誰でもインストール可能になります。


# gemをインストールする

`gem install {gemファイルのパス}`でインストールできます。

```bash
$ gem install pkg/hello_command-0.1.0.gem 
Successfully installed hello_command-0.1.0
Parsing documentation for hello_command-0.1.0
Installing ri documentation for hello_command-0.1.0
Done installing documentation for hello_command after 0 seconds
1 gem installed
```

あとはいくらでも遊べます。

```bash
$ hello_command 
withered violet, withered violet
$ hello_command 
green fire, lively smoke
$ hello_command 
```

# 作成したgemのコード

https://github.com/miminashi/hello_command
CACでPlayの環境構築した時のメモ

# 前置き
CentOS 7
初期状態だとunzip入ってなかった。

# Javaインストール
```
yum install java-1.8.0-openjdk-devel
```
最初にインストールした時にdevelつけ忘れてjavacが入ってないことに後で気づいた。

# Scalaインストール

```
wget http://downloads.lightbend.com/scala/2.12.0/scala-2.12.0.tgz
tar xvzf scala-2.12.0.tgz
mv scala-2.12.0.tgz /usr/local/scala
```

# Playインストール
```
wget https://downloads.typesafe.com/typesafe-activator/1.3.12/typesafe-activator-1.3.12.zip
unzip typesafe-activator-1.3.12.zip
mv activator-dist-1.3.12 /usr/local/activator
```

# パスを通す
```
vi /etc/profile
source /etc/profile
```
/etc/profileに以下を追記。

```
export SCALA_HOME=/usr/local/scala
export PATH=$PATH:$SCALA_HOME/bin
export PATH=$PATH:/usr/local/activator/bin
```
複数プログラミング言語対応ゲームエンジン「Altseed」の紹介

「ゲームエンジン・ライブラリ・ツールの開発 Advent Calendar 2016の3日目です。

# Altseedとは

## 初めに

公式より引用

> Altseedは複数のプログラミング言語に対応したゲームエンジンです。C++、C#、Javaといった複数のプログラミング言語で 同じゲームエンジンを用いて開発できます。プログラミング言語が異なってもほとんど同じ記述でゲームを開発できます。 同じ組織内で複数のプログラミング言語が使用されている大学のサークルの講習や他のプログラミング言語を学ぶ際に役立ちます。

とあるとおり、複数のプログラミング言語で使用できることを特徴としたゲームエンジンです。C++を使っている人が新しいプログラミング言語を学ぶために、ただHelloWorldの文字を表示するだけではではなく、とりあえずゲームを作って学んでみようという場合に便利です。

教育に便利とありますが、実際はしっかりとしたゲームを開発できる性能があります。採用事例は公式サイトにあるので見てみましょう。

## 特徴

複数プログラミング言語対応というとC言語のような関数だけで構成されるイメージがあると思いますが、Altseedはオブジェクト指向です。標準でオブジェクト指向に適した設計になっており、実際のゲームに使用される機能を短いソースコードで実装できます。当然、それをC++やC#両方で実現できます。

予め、ゲームに必須な機能も最初から提供されています。

例えば、普通に記述すると長くなるシーン遷移のフェードインアウトですが1行で記述できます。

```
 asd.Engine.ChangeSceneWithTransition(new Transition_Fade_Scene2(), new asd.TransitionFade(1.0f, 1.5f));
```

ポーズも3行で記述できます。

```
foreach(var layer in Scene.Layers)
{
        if(layer != this) layer.IsUpdated = false;
}
```

面倒なUI画像の配置もpsdファイルをほぼそのまま使うことにより楽々できます。

ちなみに、WindowsでもMacでもおそらくLinuxでも動作します。

## 使い方

公式で配布しているパッケージに数十個のサンプルおよびマニュアルがあります。これらを読むことで大体使えるようになると思います。

また、C#限定ですが、公式のSTG製作講座があります。

[Altseedによるシューティングゲーム製作講座](https://github.com/altseed/STGLecture/blob/master/Document/cs/Index.md)

## 複数プログラミング言語

C++、C#、Javaで空のウインドウを出してみました。.NETとJVMに対応していれば他のプログラミング言語でも使用できます。

### C++

```cpp
void main()
{
	// Altseedを初期化する。
	asd::Engine::Initialize(u"Empty", 640, 480, asd::EngineOption());

	// Altseedのウインドウが閉じられていないか確認する。
	while (asd::Engine::DoEvents())
	{
		// Altseedを更新する。
		asd::Engine::Update();
	}

	// Altseedの終了処理をする。
	asd::Engine::Terminate();

	return;
}
```

### C＃

```csharp
class Program
{
        [STAThread]
        static void Main(string[] args)
	{
		// Altseedを初期化する。
		asd.Engine.Initialize("Empty", 640, 480, new asd.EngineOption());

		// Altseedのウインドウが閉じられていないか確認する。
		while (asd.Engine.DoEvents())
		{
			// Altseedを更新する。
			asd.Engine.Update();
		}

		// Altseedの終了処理をする。
		asd.Engine.Terminate();
	}
}

```

### Java

```java
class Main
{
	public static void main(String args[])
	{
		// Altseedを初期化する。
		asd.Engine.Initialize("Empty", 640, 480, new asd.EngineOption());

		// Altseedのウインドウが閉じられていないか確認する。
		while(asd.Engine.DoEvents())
		{
			// Altseedを更新する。
			asd.Engine.Update();
		}
		
		// Altseedの終了処理をする。
		asd.Engine.Terminate();
	}
}

```
# 入手方法

公式サイトから入手できます。

[Altseed](http://altseed.github.io/)

# 最後に

Altseedは常時コミッターを募集しています。
現在、C++、C#、Javaには対応しておりますが、将来的にはD、Python、Ruby等にも対応しようと考えています。
興味ある方はGithubを見てください。

開発の方針等はSlackで決めつつ開発を進めています。

[Github](https://github.com/Altseed/Altseed)
マウントするデバイスを UUID で指定する

[Happy Elements 株式会社 カカリアスタジオ Advent Calendar 2016](http://qiita.com/advent-calendar/2016/hekk_cacalia_studio) の 3 日目です．本日の担当はインフラグループの @nagizero です．よろしくお願いします．



# 顛末

[弊社は先日オフィスを移転しました](http://www.happyelements.co.jp/news/2016/11/01/news.html)．その際，社内用のサーバは電源を落として旧オフィスから新オフィスに移動させたのですが，新オフィスで電源を入れるとサーバの 1 台が HDD をマウントできなくなっていました．

当該サーバではデバイス名 (e.g. /dev/sda1) を指定して HDD をマウントしていたのですが， HDD のデバイス名が変化していたために正常にマウントすることができなくなっていました．どうやらオフィス移転時の電源断がきっかけでデバイス名が変化してしまったようです．

新たにデバイス名を指定してマウントしてもよいのですが，再度デバイス名が変更されてマウントできなくなっても困ります．そこで，変化しうるデバイス名ではなく，不変の UUID を指定してマウントすることにしました．

以下，トラブルの調査から対応までの作業内容を記載します．



# 調査

HDD がマウントできなくなった原因を探るため，まず fstab を確認しました．

```txt:/etc/fstab
/dev/sdb1 /mnt/usbhdd vfat defaults,umask=000 0 0
/dev/sdc1 /mnt/usbhdd2 ext4 acl,usrquota 0 0
```

fstab に従い sdb1 を vfat としてマウントしようとしましたが上手くいきません．どうやらファイルシステムが異なるようです．

```
# mount -t vfat /dev/sdb1 /mnt/usbhdd
mount: wrong fs type, bad option, bad superblock on /dev/sdb1,
       missing codepage or helper program, or other error
       In some cases useful info is found in syslog - try
       dmesg | tail  or so
```

```
# dmesg | tail
[ 1357.548915] FAT-fs (sdb1): utf8 is not a recommended IO charset for FAT filesystems, filesystem will be case sensitive!
[ 1357.549375] FAT-fs (sdb1): bogus number of reserved sectors
[ 1357.549497] FAT-fs (sdb1): Can't find a valid FAT filesystem
```

次に，サーバが認識しているデバイスのファイルシステムを確認しました．

```
# parted -l
Model: BUFFALO HD-WLU3/R1 1 (scsi)
Disk /dev/sdb: 2000GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  2000GB  2000GB  primary  ext4


Model: BUFFALO HD-WLU3/R1 1 (scsi)
Disk /dev/sdc: 2000GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system  Flags
 1      32.8kB  2000GB  2000GB  primary  fat32        lba
```

sdb が ext4 で， sdc が fat32 と表示されています．これは fstab に記載されているファイルシステムと逆ですから， sdb と sdc のデバイス名が入れ替わってしまったと考えられます．

試しに `parted -l` の結果通りのファイルシステムを指定してマウントすると上手くいきました．やはりデバイス名が入れ替わっていたようです．



# 対応

fstab にデバイスと正しいファイルシステムの組み合わせを記述するため，デバイスの UUID を調べます．

```
# blkid /dev/sdb1
/dev/sdb1: UUID="c65bba6a-4ebe-4fc1-aa2c-f6c3ddf99110" TYPE="ext4"
# blkid /dev/sdc1
/dev/sdc1: LABEL="HD-WLU3" UUID="057E-79CD" TYPE="vfat"
```

UUID が確認できたので fstab を書き換えます．

```diff:/etc/fstab
- /dev/sdb1 /mnt/usbhdd vfat defaults,umask=000 0 0
+ UUID=c65bba6a-4ebe-4fc1-aa2c-f6c3ddf99110 /mnt/usbhdd2 ext4 acl,usrquota 0 0
- /dev/sdc1 /mnt/usbhdd2 ext4 acl,usrquota 0 0
+ UUID=057E-79CD /mnt/usbhdd vfat defaults,umask=000 0 0
```

マウントし直して完了です．

```
# mount -a
```

以上でデバイス名が変化しても問題なく HDD をマウントできるようになりました．
motionのframerate設定

motion.confには幾つかの設定があって、framerateも設定ができるみたいです。

`# Maximum number of frames to be captured per second.`
`# Valid range: 2-100. Default: 100 (almost no limit).`
`framerate 100`

使用しているカメラのframerateが30fpsという仕様なので
この設定も30fpsまであげられるかもと思い、30に設定してみたところ、、、
早送りみたいな動画になる。

実験したところ、4あたりまで落とさないと等倍速程度に見えない。
どういうことなんだろう...。
USBカメラから30fpsで入ってきていないということだと、つじつまがあうが。。。
釈然としないがとりあえず見た目重視で、等倍再生したいのでframerateは4程度にしておく。

-（追記）その後実験を行った。motion.confのframerate設定30fpsでデジタル時計を撮影。できた動画をffmpegで静止画切り出ししてjpgに分解。出力されたjpgファイル群の秒を観察。１秒につき３枚程度しか絵がない。3fps。やっぱり体感と同じくらい。そのうち、原因解析したい。


なお、さらに応用編としてtimelapseをやるには、こちらもいじるとよいと思います。
値を大きくしていくほど、大きく間引かれる。

`# Minimum time in seconds between capturing picture frames from the camera.`
`# Default: 0 = disabled - the capture rate is given by the camera framerate.`
`# This option is used when you want to capture images at a rate lower than 2 per second.`
`minimum_frame_time 0`
ベアメタルGPUを最大限利用する BitFusion Boost

このエントリは、[Bluemix(SoftLayer) Advent Calendar 2016](http://qiita.com/advent-calendar/2016/bluemix "Bluemix(SoftLayer) Advent Calendar 2016")の3日目のエントリーです。

Bluemixの特徴のひとつである「ベアメタル」と「GPU」サーバー。今日はこのベアメタルGPUについて、最新情報をまとめてご紹介します。

# Bluemixで利用できるベアメタル・サーバー
オーダー時は、ソケット数が1，2，4の3種類から選択することになります。
ご存知のとおり、IAサーバーのラインナップとなっています。現時点の最新のCPUは、E5-2690v4ですね。
CPUのラインナップが最も充実しているのが、2ソケットのベアメタルです。次いで1ソケット、4ソケットとなります。
GPUが搭載可能なのは、2ソケットのベアメタルです。2U以上のタイプで構成されています。
CPUは、E5-2600v3（Haswell）とE5-2600v4（Broadwell）から選択できます。

# Bluemixで利用できるGPU
K2、K80、M60が利用できます。
それぞれ、1枚、または2枚のGPUを搭載可能です。
K2、K80については、時間単位での利用もできます。
P100も使えるようになる予定のようです。

表１．GPU1枚あたりの仕様

||NVIDIA Tesla K80|NVIDIA Tesla M60|NVIDIA Grid K2|
|:-----------------|:------------------|:------------------|:------------------|
|GPU|2 x Kepler GK210|2 x Maxwell GM204|2 x Kepler GK104|
|メモリー|24GB GDDR5|16GB GDDR5|8GB GDDR5|
|クロック速度|2.5 GHz|2.5 GHz|2.5 GHz|
|CUDAコア|2 x 2496|2 x 2048|2 x 1536|
|帯域幅|2 x 240GB/sec|2 x 160GB/sec|2 x 160GB/sec|

いろいろなクラウドでGPUが利用できるようになっています。
GPUの性能的にどこがいいの？という目安は、CUDAコアの数で比べる、というものがあります。
Deep Learningのようなアプリケーションによってはメモリー容量が大きい方が速度向上に効果的だったりしますね。

# クラウドでGPUを使うなら
BitFusion Boostって聞いたことありますか？
ベアメタルの上にも、仮想マシンのGPUの上にも、コンテナの上にも導入することが出来るGPU仮想化レイヤーを実現する BitFusion.io社が提供するソフトウェアです。Xenなどの Hpervisor を導入しても、VM上のアプリケーションを変更する必要が無いのと同様に、BitFusion Boost でも、既存のCUDAもしくはOpenCLのアプリケーションを変更する必要がありません。
![bitfusion.jpg](https://qiita-image-store.s3.amazonaws.com/0/53057/6fac7814-c13d-3806-173c-a9d784a33432.jpeg)
$$図1．BitFusionとは$$

コンテナでGPUとか共有したり、共有を解いたりする制御に手間を掛けなくても良くなりますね。。。

# BitFusion を使うと便利なこと
いくつかの代表的なユースケースがあります。

1. 1つのアプリケーションや1人のユーザーが大量のGPUを必要とする場合
2. 複数のアプリケーションや複数のユーザーがGPUをそれぞれ必要とする場合
3. データが大きく、GPUに搭載されているメモリーサイズでは容量が足らない場合
4. GPUがコけた時に備えたい場合

なんだか、Elastic GPUって、この仕組みなんじゃないかと思ってしまいますね。

# MapD社 + BitFusion.io社 + IBM で事例が公開されています。

1つのアプリケーションで大量のGPUを必要とした事例があります。
昨今のサーバーではGPUを6枚とか16枚とかありますよね・・・でもそれでは速度が足りない！という場合はなんと64枚のGPUを使った！という事例です。

1987-2008年の米国航空情報は、1.28億行あります。それを312レプリカ作成して、400億行のデータベースを準備しました。これに対して、以下のようなクエリーを流してみたのです。

1. Query Id is Q001 : query is 'select count(*) from flights2’
2. Query Id is Q002 : query is 'select carrier_name, count(*) from flights2 group by carrier_name’
3. Query Id is Q003 : query is 'select carrier_name, avg(arrdelay) from flights2 group by carrier_name'

400億行を対象に、groupしてselectとかって正気の沙汰ではありません。

で、結果はなんと2.のケースで271msec･･･
にわかには信じがたい結果ですが、Bluemix上の32台のベアメタルGPU（計64枚のK80）をBitFusion Boostで1台のマシンに搭載されている64枚のGPUであるかのように利用できるようにした結果です。

大量のGPUを活用した環境を使い切るには、BitFusion は便利な選択肢になるかもしれませんね。

# まとめ
BluemixのベアメタルGPUは、物理サーバーではあるものの、クラウドならではの柔軟性を持っています。特徴的な「故障したら2時間以内に交換してくれる」というものも、BitFusionによる、GPUへのFailOver機能があるとアプリケーションにとっても使い勝手がぐんと上がります。
BitFusion にご興味ある方は、ぜひDMください！ご支援します！
Ruby で例外を捕捉して一定回数 retry するメソッド

制御構文の `retry` を使うことで記述できます。

- [制御構造 (Ruby 2.3.0)](https://docs.ruby-lang.org/ja/latest/doc/spec=2fcontrol.html#retry)

```ruby
def retry_on_error(times: 3)
  try = 0
  begin
    try += 1
    yield
  rescue
    retry if try < times
    raise
  end
end

retry_on_error { do_something }
```

## 間違った例 or 無限リトライ

下のように記述すると、 `try` ローカル変数が毎回 `0` を代入されるため、無限リトライになってしまいます。

```ruby
def retry_on_error(times: 3)
  try = 0
  yield
rescue
  try += 1
  retry if try < times
  raise
end
```

無限リトライを記述するなら、下でよいです。

```ruby
def retry_on_error
  yield
rescue
  retry
end
```

しかし、これは呼び出し元で記述した方がわかりやすいかもしれません。

## retryable を使う

スリープを挟みたい、特定のエラーでのみリトライしたいなど、より複雑な制御をしたくなったときは、gem の [retryable](https://rubygems.org/gems/retryable) を使うとよいかもしれません。

```ruby
Retryable.retryable do
  # do something
end
```

これだけで、 `StandardError` を捕捉して 1 秒の sleep を挟みつつ、2回までリトライしてくれます。

呼び出し時のオプションや `Retryable.configure { |c| ... }` で、細かなカスタマイズを行うことができます。

ピュア Ruby で書かれており、依存 gem もなく古いバージョンの Ruby でも動作するので、自前で複雑な制御を実装するよりは筋が良さそうです。

## 参考

- [rescue 節で一定回数 retry したあとは次に移るループ - Qiita](http://qiita.com/riocampos/items/0870f1b682a62d6477de)
- [retryable gemでretry回数を指定したrescueを簡単に - Qiita](http://qiita.com/riocampos/items/b2bf78c5e37280a1f8ff#_reference-ba2436ff372b949d047a)
scpで.ssh/configに登録しているhostを使う

これで終わり。


## download from server

```
scp registered-hostname:/path/to/downloadfile \
    /path/to/the/place/to/put/the/file
```

##upload to server

```
scp  /path/to/the/place/to/upload \
    registered-hostname:/path/to/upload/destination
```
【Xcode8】カスタムフォントを使用する方法

# イメージ
![スクリーンショット 2016-12-03 21.35.16-min.png](https://qiita-image-store.s3.amazonaws.com/0/135478/31171afa-c573-0300-fe1b-63636fec6679.png)


# 設定
## 1. フォントファイルをXcodeのプロジェクトにドラッグ＆ドロップで追加。
![スクリーンショット 2016-12-03 21.49.27-min.png](https://qiita-image-store.s3.amazonaws.com/0/135478/923830b9-ab62-5ddf-62a2-6061b5212f5a.png)


## 2. TARGETS → Build → Copy Bundle Resources → ＋ボタンから先程追加したフォントファイルを追加。
![スクリーンショット 2016-12-03 21.54.32-min.png](https://qiita-image-store.s3.amazonaws.com/0/135478/8ce923f9-0321-9747-d717-c7143c5ee8ef.png)

![スクリーンショット 2016-12-03 21.57.17-min.png](https://qiita-image-store.s3.amazonaws.com/0/135478/c40b24a7-06e2-1072-a3f5-f791bf876764.png)

# StoryBoardでフォントを指定する
Labelの設定で「Font」をCustomにして「Family」で追加したフォントを指定します。
![スクリーンショット 2016-12-03 22.47.53.png](https://qiita-image-store.s3.amazonaws.com/0/135478/6f5713db-34d8-ae91-2fe1-a2ceafccc474.png)


# コードでフォントを指定する
```.swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let customFont: UILabel = UILabel(frame: CGRect(x: 100, y: 100, width: 200, height: 100))
        customFont.text = "かすたむふぉんと"
        // UIFontのnameで追加したフォント名を指定します。
        customFont.font = UIFont(name: "Alice", size: 50)
        self.view.addSubview(customFont)
    }
}
```

# 使用できるフォント
.ttf
.oft
以上の2種類になります。
.ttcも使えるとの情報もありましたが未確認です。

# フォントファイルの場所の確認方法
まずアプリケーションからFont Bookを開きます。
![スクリーンショット 2016-12-03 22.02.02-min.png](https://qiita-image-store.s3.amazonaws.com/0/135478/f1b92595-1080-5117-c601-0b55f96944bb.png)

該当のフォントを選択し、左上のiマークをクリック。右側の「場所」という項目がフォントがある場所になります。
![スクリーンショット 2016-12-03 22.02.34-min.png](https://qiita-image-store.s3.amazonaws.com/0/135478/b6026def-9ff0-397c-446a-b4ad591cf2c3.png)

フォントによっては先程の「場所」という項目がない場合があります。
その場合はフォントの上にカーソルを合わせると「パス」という項目が出てきますので、そちらで確認することができます。
![スクリーンショット 2016-12-03 22.03.02.png](https://qiita-image-store.s3.amazonaws.com/0/135478/2380ab6e-95c6-073b-29d0-d03f9aac7614.png)
[備忘録]Dependency Injectionについて

※分かりやすさのために、一部の用語を、一般的な表現に置き換えてあります。
※参考資料(MSDN)の内容を参考にしていますが、かなり加筆してあります。

#DI(Dependency Injection)って何なのさ？となった時のために

Dependency(必要なもの)を Inject(外から送り込む)こと。

#Pros(メリット)/Cons(デメリット)
##Pros(メリット)
###クラス間の依存性が減少する(無くなるわけではない)

##Cons(デメリット)
###コードを追いにくい
処理する場所が分散してしまうので、そのプロジェクトに関わってから日が浅い場合など、コードの全体像が見えていないと困る場合がある。
###クラス、メソッドなどが増える
逆に、DIを使わない場合は、メソッド自体が長くなる事が多いと思う。
(一か所にいろいろ盛り込むので。)
###メモリ管理が複雑になる(?)
変数に入っている値は、(クラス間で共用するなら)どのクラスで使っているか分からないから、らしい。
(DIの場合に)共用する事があるかどうかは謎。

#DIを使わない場合と、何が違うの？
DIは、Pushパターン(使いたいものは、使う側が用意する)。
非DIは、Pullパターン(使いたいものがあったら、作れそうな人を探して作ってもらう)。

ようするに、Inversion of Control(コントロール方向の反転)の1形態。
PushとPullだから、逆方向！(パッシブとアクティブみたいなもの)

##非DIの例：Factory Patterns(ファクトリー パターン)
(参考資料から引用)
> There are three common factory patterns. The Factory Method and Abstract Factory patterns

(訳・・カタカナだらけですが。) 
3つの、よく使われるファクトリー パターンがあります。
ファクトリー メソッドと、アブストラクト(抽象)ファクトリー パターンです。

よく使われる例：
>・The Factory Method Pattern
・Simple Factory Pattern
・Abstract Factory Pattern

他の例：
>・Service Locator Pattern

各パターンの差は、自分で作るか、ファクトリーなど(作ってくれる人)を呼び出すかの差。
(詳細は参考資料を参照して下さい。)
ここで重要なのは、作るものを知らなければ、作れないよね！という事。
これが、「依存性」。
そう、Dependency Injectionの"Dependency"・・ではありません。
※Dependencyが「依存性(の)」と訳されていますが、混乱しないようにしましょう！
このページを書いていても、混乱するぐらいですから・・・

作りたいものが増えたら、作る場所(メソッド)を改造する事になりますよね。
そうすると、メソッドの中身が膨らんで、どんどん複雑になって・・

##ここでDIのターン！
で、何を考えたかというと、
よし、作る場所を、分解しよう！
使いたい人が、必要なものだけ揃えればいいよね！
という事。

餅は餅屋。よくわかってる人が作った方が、色々便利。
(注：Factoryも同じ発想。)
必要なものができたら、送り込もう！(Injectionですね)
となったのが、DI。

##必要なもの(dependencies)の、送り込み方の例
###コンストラクタの引数として渡す
必要なものは最初に渡してしまおう！という事。
###プロパティのsetterを使う
「プロパティの」となっているのは、参考資料のコードがC#で書かれているため。
メソッドの引数を使う場合と、あまり差はない。
###メソッドの引数として渡す
使うとしたら、他のクラスと値を共有したい場合など。
(こういう方法もあるよ、という感じの話。)
コンストラクタと違い、すでにデフォルト値が設定されているはずなので、
動作中に状態が変わる変数とかの受け渡し用などに。

例えて言うなら、差し入れが来たから、配るよー！というのが、DI。
差し入れがあるから、持って行ってね～という感じだと、Inject(配布)しないから、非DI。
でも、うっ、要らない・・となったら、非DI。
こんな感じでしょうか。

#蛇足
##dependencyの意味
http://www.dictionary.com/browse/dependency
>the state of being dependent; dependence. 

(訳)
dependentな状態、dependence

##dependenceの意味
http://www.dictionary.com/browse/dependence
>the state of relying on or needing someone or something for aid, support, or the like. 

(訳)援助、サポートなどのために、誰か、あるいは何かに頼っている、必要としている状態。


#参考
Developer's Guide to Dependency Injection Using Unity
2 - Dependency Injection
patterns & practices
https://msdn.microsoft.com/en-us/library/dn178469(v=pandp.30).aspx

DI・DIコンテナ、ちゃんと理解出来てる・・？
http://qiita.com/ritukiii/items/de30b2d944109521298f

猿でも分かる! Dependency Injection: 依存性の注入
http://qiita.com/hshimo/items/1136087e1c6e5c5b0d9f
Support Libraryを22から23にしたらTabLayoutのアイコンが小さくなった


アイコンを追加する処理が少し変わっていた。
(SDK ManagerでSources for Android SDKをチェックしておけばソースが読める)

### Support Library 22

```java:sdk/sources/android-22/android/support/design/widget/TabLayout.java
ImageView iconView = new ImageView(getContext());
LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT,
    LayoutParams.WRAP_CONTENT);
lp.gravity = Gravity.CENTER_VERTICAL;
iconView.setLayoutParams(lp);
```

### Support Library 23

```java:sdk/sources/android-23/android/support/design/widget/TabLayout.java
ImageView iconView =
    (ImageView) LayoutInflater.from(getContext())
    .inflate(R.layout.design_layout_tab_icon, this, false);
```

22ではアイコンの大きさがWRAP_CONTENTで、文字がないときはタブの高さ(48dp)だった。
23ではアイコンの大きさの規定値が24dpなので、前に比べて小さくなることがあった。

自前でlayout/design_layout_tab_icon.xmlというファイルを用意して好きなサイズにすればよい。カスタマイズしやすくなった。

```xml:layout/design_layout_tab_icon.xml
<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="48dp"
    android:layout_height="48dp"
    android:scaleType="centerInside"/>
```
ワークショッパー learnyoumongo 日本語版


MongoDBあんまり詳しくないけど、今年 workshopperの [lernyoumongo](https://github.com/evanlucas/learnyoumongo) を翻訳したので宣伝しておきます。

[workshopper](https://www.npmjs.com/package/workshopper)とは、ターミナルやコマンドプロンプトで実行できる (主にNode.jsの) ワークショップ用タスクランナー・フレームワークであり、それで作られたワークショップ達の事です。

[NodeSchool](https://nodeschool.io/ja/)に参加した際は勿論、自宅でも様々な課題について自習ができます。

まだ日本語訳が出来てないものもあるので、自分が業務とかで使っているものを翻訳したりしてます。その一つが [lernyoumongo](https://github.com/evanlucas/learnyoumongo) だったという訳です。

インストールと実行は簡単です。

```
npm install -g learnyoumongo
```

インストールが終わったら、実行します。

```
lernyoumongo
```

メニューが表示されるので、一番上を選択してください。

![menu](https://c4.staticflickr.com/6/5528/30582766763_04b5900b11_z.jpg)


設問が表示されます。

![menu](https://c7.staticflickr.com/6/5803/31246310222_f88ea7514d_z.jpg)

これから MongoDB を始める方はぜひやってみて欲しいです。
macの環境構築をできるだけ自動化する

この記事は[ドワンゴ Advent Calendar 2016](http://qiita.com/advent-calendar/2016/dwango) 3日目の記事です。
昨日は@tanaproさんの[Ethereumのコントラクトで学ぶ、ポンジースキームの仕組みについて](http://dsaki.hatenablog.jp/entry/2016/12/02/115000) でした。

@regtanです。こんばんは。2016/10にMacBookPro(Late2016)が発表されました。発表直後はESCキーがなくなり、ジョブズの息吹を感じないという話で盛り上がっていました。ここ数週でお手元に届いたユーザーさんも多くなり、みんな大好きなapple storeの店頭でも手に入るようになりました。
最初の評判ではあまり評判の良くなかったtouch barも寿司を流していたりする様子がtwitterで見られるほどに受け入れられ、割とみんな楽しんでいるように思う今日この頃です。わたしも「iOSアプリ開発がんばるぞい」と3回唱えてからMBPを手に入れたのですが、以前のdotfileも古いし、そろそろ構築を楽にしたいと思うようになり、今回ある程度[^1]自動化したというお話です。
最近やりたいゲーム[^2]もあるし、12月だから少しでも予定を開けて置かないといけないので手っ取り早く新しいPCに乗り換えます。

# 開封してここまではやる
Xcodeのインストールはどうしても手でやる必要があります。AppStore経由でインストールすればOK。インストール後は必ず一度起動してライセンス許諾とかコンポーネントのインストールをする必要があります。
あとはシステムアップデートは開封後即やっても良いかと思います。

# セットアップの実行
色々と面倒なのでコマンド一発でやってくれるようにしておきました。

```shell
sh -c "$(curl -fsSL https://raw.githubusercontent.com/regtan/dotfile/master/setup.sh)"
```

あとは画面の指示に従ってYとかnとか押せばなんとかなります

# 何をしてるか
セットアップで何をしているかというとansibleでplaybookに基づいて各種アプリケーションのインストールを行っています。まずhomebrewをインストールし、それを利用して、他のアプリケーションをインストールするという流れです。各ステップで実行する・しないを選ぶことが可能です。

[regtan/dotfile](https://github.com/regtan/dotfile)

## key-pairの生成
`ssh-keygen` 叩いて新しいkey-pairを生成します

## dotfileとplaybookのDL
自分のレポジトリからgit cloneします

## homebrewのインストール
homebrewのサイトのインストールスクリプトを叩いてインストールします

## Ansibleのインストール
homebrewを利用してpythonとAnsibleをインストールしてます

## Ansibleの実行
playbookに基づいて各種アプリケーションのインストールを行います 

## dotfileの配置
dotfileを~/config/以下に配置して必要に応じてシンボリックリンクを貼ります。neovimを見たりしてもconfig/アプリケーション名の下に配置するのが流行ってるみたい。

# なぜcurlでとってきて実行するの？
git cloneしてスクリプト叩いても同じじゃんといえばそうなんですが、gitコマンドすらない場合も想定しての構成です。この手のやり方が良いかどうかって議論はありますが、今回はこのような手法を取っています。

# ハマったところ
githubのrawデータ配布してるところがキャッシュを持ってるということ。これまで全然気がつかなかったのですが、手元からpushしてもすぐに反映されないことがありました。適当にquery stringをつければ回避できるのでいいのですが、何度か直しているはずの内容が反映されず「あれっ？」って感じでした。
あと相変わらずansibleのエラーメッセージは難しいなという点。間違っている点がよくわからないメッセージがたくさん出るというAnsibleあるある。
超初歩的なやーつですが、公開鍵をgithubに登録してない状態ではsshでgit cloneできないことを忘れていてちょっと焦った。

# やっぱり自動化すると楽
コマンド一発であとは[ガッキーの恋ダンス](https://www.youtube.com/watch?v=loDSHuiaR2A)[^3]とか[欅坂46 『二人セゾン』](https://www.youtube.com/watch?v=mNpPQXMgtmw)[^4]を見てれば大体終わります。

それでは、忙しい12月を時間を無駄にしなくてもすむ一つの参考になれば幸いです。明日は@orzngoさんです。
http://qiita.com/advent-calendar/2016/dwango
http://qiita.com/advent-calendar/2016/dwango2


[^1]: 完全自動化はやっぱり無理。特にdockの設定とかhotcornerの設定とかまでやりだすと厳しいと思われます。
[^2]: WATCH_DOGS2とポケモンやりたい。あとFF14もやりたいし、skyrim SEもやりたいし、桃鉄もやりたい。あとファミコンクラシックが未開封になってる。(๑•﹏•)
[^3]: 夢があるw
[^4]: 欅坂って書けないですが衣装の裾が並んだら一直線に並んでるのはすごいなぁって思います。
CentOS7でPlayframeworkを導入する

> "スカラがそんなに嫌なら、JavaでPlayを書けばいいじゃない！！"

別にScalaが嫌いなわけではないけれでも、やっぱりPlayといえばScalaだよな。。。
でもJavaが好きなのでJava-playについて書きます。


Advent Calendar 3日目ということで...
今回はCentOS7に導入したいと思います!!

ローカル環境だとHomebrewを使ってactivatorを導入するかと思うんですが、(決めつけ...)
どうせならLinuxでも同じようにやりたい...(VagrantのCentOS上)
といことで"Linuxbrew"を入れてやりましょう！

Linuxbrewの導入については素晴らしい投稿があるので下記参考です!
[Linuxbrewのススメ](http://qiita.com/thermes/items/926b478ff6e3758ecfea)

## activatorの導入

linuxbrewを入れたらbrewコマンドで簡単に導入できます。

~~~
# brew install typesafe-activator
~~~
(jdkも忘れずに。。。)

## プロジェクト作成

今回はJavaなのでplay-javaを追記してプロジェクトを作成します。

~~~
$ activator new PROJECT_NAME play-java
~~~

。。。ちょっと時間はかかりますが、プロジェクトが作成されたら、以下を実行

~~~
$ activator run
~~~

http://192.168.33.10:9000/
にアクセスすると...(今回はVagrantを使っているので...)


<img width="1092" alt="スクリーンショット 2016-12-03 21.39.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/79650/ff832199-6450-6af4-61f5-b794cb7bb4d0.png">



これでplayが起動しました!

実際にディレクトリ構成はこんな感じになっているかと思います。

~~~
.
├── LICENSE
├── README
├── app
│   ├── Filters.java
│   ├── Module.java
│   ├── controllers
│   │   ├── AsyncController.java
│   │   ├── CountController.java
│   │   └── HomeController.java
│   ├── filters
│   │   └── ExampleFilter.java
│   ├── services
│   │   ├── ApplicationTimer.java
│   │   ├── AtomicCounter.java
│   │   └── Counter.java
│   └── views
│       ├── index.scala.html
│       └── main.scala.html
├── bin
│   ├── activator
│   └── activator.bat
├── build.sbt
├── conf
│   ├── application.conf
│   ├── logback.xml
│   └── routes
├── libexec
│   └── activator-launch-1.3.10.jar
├── project
│   ├── build.properties
│   └── plugins.sbt
├── public
│   ├── images
│   │   └── favicon.png
│   ├── javascripts
│   │   └── hello.js
│   └── stylesheets
│       └── main.css
└── test
    ├── ApplicationTest.java
    └── IntegrationTest.java

14 directories, 27 files
~~~

ということでCentOS7にplayを導入できました！

次回は簡単なアプリを作ってみたいと思います！
Line APIをcurlで叩く

今回はcurlでuserのprofileを取るAPIをcurlで叩いてみた。

~~~sh
curl "https://api.line.me/v2/bot/profile/{user_id}"\ 
-H "X-Line-ChannelSecret: {ChannelSecret}"\
-H "Authorization: Bearer {Channel_Access_Token}"
~~~
これが失敗した場合は認証などに問題がある

取れた

~~~json
{"displayName":"{lineの名前}","userId":"{user_id}","pictureUrl":"{profile写真のurl}","statusMessage":"{lineの一言}"}
~~~
parsebin を試す

# parsebin

`decodebin3` で使われている [`parsebin`](https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-plugins/html/gst-plugins-base-plugins-parsebin.html) というエレメントで今日は遊んでみようと思います。

## ネコの動画をパースしてみる

こんな感じで実行すると...

```sh
$ GST_DEBUG=parsebin:5 gst-launch-1.0 filesrc location=neko_1213a2.mov ! parsebin ! fakesink
```

↓結果(抜粋)

```sh
0:00:00.045106106 29005 0x5622fd357ca0 DEBUG               parsebin gstparsebin.c:3879:gst_parse_pad_update_caps:<'':parsepad1> Storing caps image/jpeg, parsed=(boolean)true, width=(int)640, height=(int)480, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)1/1 on stream <stream1>
```

パース結果がログとして表示ます！ 中身は image/jpeg だったことがわかります。

コンテナの中が H.264 なのか jpeg なのかわからない時や、ネットワークストリーミングで来てるフォーマットがわからない時などにparsebin便利。

## UVCカメラの映像をパースしてみる

おもむろに v4l2src を parsebin に食わせると...

```sh
$ GST_DEBUG=parsebin:5 gst-launch-1.0 v4l2src ! parsebin ! fakesink
```

↓結果(抜粋)

```sh
0:00:01.885670151 29258 0x559a51e0a400 DEBUG               parsebin gstparsebin.c:1232:copy_sticky_events:<'':parsepad0> store sticky event caps event: 0x559a51e06df0, time 99:99:99.999999999, seq-num 24, GstEventCaps, caps=(GstCaps)"video/x-raw\,\ format\=\(string\)YUY2\,\ width\=\(int\)1920\,\ height\=\(int\)1080\,\ pixel-aspect-ratio\=\(fraction\)1/1\,\ interlace-mode\=\(string\)progressive\,\ colorimetry\=\(string\)2:4:7:1\,\ framerate\=\(fraction\)5/1";
```

カメラはYUVのFullHDを出していることがわかります！

しかし、YUV は非圧縮のデータなので、デコードできるはずはないんですがデコーダーを探そうとしてこんなメッセージもでます。

```sh
エレメントが見つかりません: Uncompressed packed YUV  デコーダー
ERROR: from element /GstPipeline:pipeline0/GstParseBin:parsebin0: GStreamer はプラグインを見つけることができません
追加のデバッグ情報:
gstparsebin.c(3461): gst_parse_bin_expose (): /GstPipeline:pipeline0/GstParseBin:parsebin0:
no suitable plugins found:
Missing decoder: Uncompressed packed YUV  (video/x-raw, format=(string)YUY2, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, colorimetry=(string)2:4:7:1, framerate=(fraction)5/1)
```

う〜ん、これを`ERROR: `として出すかどうかは悩みどころな気もする...

## plane textをパースしてみる

ついでに映像以外をパースしてみると...

```sh
$ gst-launch-1.0 filesrc location=README.md ! parsebin ! fakesink
パイプラインを一時停止 (PAUSED) にしています...
Pipeline is PREROLLING ...
ERROR: from element /GstPipeline:pipeline0/GstParseBin:parsebin0: これはテキストファイルのようです
追加のデバッグ情報:
gstparsebin.c(2379): type_found (): /GstPipeline:pipeline0/GstParseBin:parsebin0:
ParseBin cannot decode plain text files
ERROR: pipeline doesn't want to preroll.
Setting pipeline to NULL ...
Freeing pipeline ...
```

おお、こちらもいい感じに結果がでますね...

## おわり

たまに取り扱うファイルの詳細情報(フレームレートとかアスペクト比とか)知りたい時とかあるんですが、意外とそれらの情報って取得するのってめんどくさいんですよね...

これからは parsebin におまかせです :)
GR-CITRUSでAdafruit 8x8 matrix LEDを使う

少し前にAQM0802を使えるようになったので、勢いにのって他のI2C部品を使えるようにしてみようとおもった。
見た目で派手だし、手持ちでいくつかあるのでAdafruitのHT16K33をつかった8x8 LED Matrixをターゲットにしてみた。
最初はfirmwareにAdafruit LEDBackpackのC++のソースを移植して組み込んでみたんだけど、面倒だし使わないときでもfirmwareデカくなっちゃうという問題になるし、無駄に領域圧迫してもな...とおもってArduinoでライブラリを経由せず扱っているのを参考に、Pure Rubyで書いてみた。

https://www.mgo-tec.com/blog-entry-ada-ledmatrix01.html

## 前提
###使用ハード
Adafruit 1.2' 8x8 LED Matrix
   https://www.switch-science.com/catalog/1502/

### 接続
GR-CITRUS pin0,1でI2C Wire1を使うことにした。(WA-MIKANの上にのっかっているとpin7,8のWire3は使えないらしい)

## プログラムの作成
https://github.com/paichi81/adafruit_led_matrix

Rubyらしくクラスとして定義されてるのでインスタンスを作成して、ヒョヒョイっと動かせます。

```:sample.rb
m = Matrix_8x8.new( {:port=>3, :addr=0x70} )
m.set_blink_rate(0)
m.set_brightness(15)

m.buffer = [
  '11111111',
  '10000001',
  '10000001',
  '10000001',
  '10000001',
  '10000001',
  '10000001',
  '11111111'
]
m.write_display
```

ライブラリ後半あたりがサンプルコードになってます。

## デモ
https://www.instagram.com/p/BNjj-FHhPFH/ 
https://www.instagram.com/p/BNjoI1gB40U/


#雑記
朝から昼過ぎまでC++のソースをせこせこ移植してて全然動かないところ、ふとBreakout基板をみたらLED部分が逆に刺さってた orz
Rubyで書き始めて順調だとおもったけど、shift部分書こうとしたらArray#flattenが無くて泣く;_;)

firmwareにrequire,Time,Arrayあたりは組み込んでほしいナリ...
ゲーム運営の中で気をつけようと思ったパターン

これはマイネットエンターテイメント Advent Calendar 4日目の記事です。

#はじめに

初めまして。
簡単に自己紹介から入ります。

私は今年からプログラマーとして弊社に入社させていただきました。
去年までは大学の情報系の学部でぬるぬるとプログラミングのお勉強をしていました。

今ではソーシャルゲームの運営、開発を行っています。
入社し、研修を受け、現在までに3つのタイトルに関わりました。
まだまだ勉強途中で、自分の力不足を感じる時が多くありますが、出た不具合の修正や確認ツール作成、さまざまな業務の中で徐々に開発の体系やソースコードに触れています。

そんな私がタイトル運営の中で気をつけようと思ったパターンを書こうと思います。
同じような立場の方への共有や、運営に関わってる方に、何かプラスになれれば嬉しいです。

#いろいろなパターン

##1.プランナーの作業を観察してみる
プランナーの作業を観察してみると、無駄な工数を発見できる時がありました。
管理画面での各種KPI確認、取り込みツールでの新アイテムの設定、動作テストなど様々な面において、プランナーはプランナーが持っている知識で作業を進めています。

複数の画面の表示を組み合わせることで特定の数値を割り出すような「管理画面の裏ワザ」や、イベント期間内のみのアイテムの使用期限を設定していたり、他の項目の確認ができていればこの項目の確認は不要と思える箇所の確認・・・・・他色々

しかし、実装を知っているエンジニアから見てみればそれらの手間を省く事が可能であり、より実装の精度の向上にもつながる事があります。

バグを見つけて修正した時、それがエンジニア外の作業も絡む物であれば、その元を確認してみることで、原因の根本解決や、工数削減、機能改修、と幸せになれる事があります。
(そんな事やってる時間がない、というパターンがおおいですが・・・・)

##2.ドキュメントを残す際は意図と目的も
過去に開催していたイベントを復刻しよう！→詳しいドキュメントは残ってない(そもそもない)→過去の状況を復元してみる→動かない→実装面はコミットログを追うしかない
という事がありました。

なんとかコミットログを遡り、このへんのコミットかと憶測をつけ、それっぽい物を見つけ、必要な物を判断する
これだけでかなりの工数です。コミットログ以外も確認しなければいけません。
実装の方針が記述してあるドキュメントがあれば、少なくともこの工数は大幅に削減されます。
1回限りのイベントでも、復刻イベントだとしても、それに必要だった作業の簡潔なドキュメントを残す事を意識しています。俗人管理だめぜったい。

しかし、日々の新規実装やリファクタリングの関係で、昔どおりに仕込んでも動かないこともあります。
そのため、ドキュメントには「何の定義をするために」「どこに」「ここでこういう形式で扱うため」「ここに注意しながら」を残しておくと、以後仕様変更があった場合でも、本来の意図がわかればそれが手掛かりになるケースもあります。

(特殊なケースですが定数ファイルに様々な定義を盛り込むケースでは、これがあってかなり助かりました)

##3.実装を疑う
バグの発生コードを修正するだけでは修正しきれてないパターンがありました。
自分がテストしていたフローでは修正されているが、他の箇所では修正されていない・・・

同じ処理をしている同じ名前の関数が複数個存在しているパターン、オブジェクトのパラメータとインスタンスメソッド名が同じで呼び出し方で返り値が変わるパターン、直書きで補完してたパターン、いつのまにか定義がMysqlに保存されておりやばくなるパターン・・・

すでにある処理が動いているから正義で、合っている。と考えて修正や実装に当たる事は危険です。
一回修正した後にIDEなどで全体検索をかける、この処理を使っている他のページを見に行く、先人に聞くなどして適度に確認範囲を調整する事が必要です。

#おわりに
経験が浅く、至らぬ箇所が多かったとは思いますが、ここまで読んでいただきありがとうございました。

何を書こうか、と考えている時に、技術的に有意義な物をかけるか怪しいので、１新人がこういう考えを持って取り組んでいる、というものを残せば、似た環境の方への共有や、偉い方から見た時におかしい箇所をおかしいと言っていただきやすいのかと考えてこういう内容になりました。
書いていて思い直す事が多くあり、そもそもこれって・・・？と考え直す機会になりました。
今後も業務の中で学び、技術的に有意義な事をかけたらいいなと思っています。