OmniAICreator/Qiita-1.07M huggingface dataset:
【ゲリラアドカレ】UE4ゲーム実装　進捗報告 8日目　構造体の配列ソート(バトル画面ロジック実装　その4)

【非公式】某会社設立記念ゲリラ Advent Calendar 2016 17日目の記事です。

FlashゲームをUE4で再実装するゲリラアドカレです。

バトルのロジックを悩ませながら実装中です。
このとき、構造体の配列ソートに思いのほか悩んだので記事化します。

・注意
許可を取ってないので通常業務の空いた時間を利用して作成するため、作成中のゲーム、及びアドカレは完成保証がなければ、ゲーム自体もリリースされる保証も皆無なので、あんまり期待しないでください。

#ブループリントによる配列のソート

ステータスの構造体を素早さの降順に並べようとしたところ、どうやらブループリントにソートの関数がないようなので自作しました。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/4a058607-db89-40c6-0c57-67731b943f6b.png)

かなり泥臭いやり方しています。
構造体配列のソートする一つのやり方なので、参考になればと思います。

#バトルの今後

色々ロジックを考えていたらちょっと頭がこんがらがってきたので、味方キャラ全員のコマンドを選択してから行動するのではなく、キャラごとに選択したらすぐ行動するように変えていきます。

本当はドラ○エの戦闘みたいなことやろうとしたのですが、悩む時間が増えてしまったので余計な仕様は排除していきます。

あと９日、果たして完成するのか。
不安がっていても仕方ないので頑張っていきます。
DXライブラリを使って簡単なプロ生ちゃんタイピングゲームを作った

# はじめに
おはこんばんにちは、プロ生ちゃんファンクラブ会員No.128のmorivdenです。
~~プロ生ちゃんをprprしてhshsしたい。~~
プロ生ちゃんで何かアプリケーションを作ってみようと思ったので、
簡単なタイピングゲームを作りました。

# 環境
- Windows10
- DXライブラリ
- Visual Studio 2015

# 実際のプレイ画面
実際に作ったゲームのプレイ画面はこんな感じです。
## タイトル画面
Spaceキーでスタート、Escapeキーで終了です。
![title.png](https://qiita-image-store.s3.amazonaws.com/0/151976/f8f2fa69-4dc9-0ea2-2935-9269ec1ff04c.png)

## 難易度選択
お好みの難易度を1、2、3のキーを押して選択します。
WPMが400近くあれば、3の難しいも楽にクリアできるくらいになっています。
![diff.png](https://qiita-image-store.s3.amazonaws.com/0/151976/79067589-ac56-bf89-4d11-c9aca7acdad0.png)

## プレイ画面
右下に表示されている数字は残り時間です。
![play.png](https://qiita-image-store.s3.amazonaws.com/0/151976/f6ea9b86-49ba-a5c3-be78-18ebf96ca678.png)

## タイプ時
正しくタイプすれば文字が水色になります。
![type.png](https://qiita-image-store.s3.amazonaws.com/0/151976/fa62a45d-c3f7-537f-75a0-9271ca127165.png)

## ミスタイプ時
ミスタイプをすると文字が赤色になります。
![miss.png](https://qiita-image-store.s3.amazonaws.com/0/151976/02ddb08c-cc7c-3e17-623f-b4505708aa15.png)

## 成功時
時間内に全てタイプできればプロ生ちゃんがウィンクしてくれます。
![success.png](https://qiita-image-store.s3.amazonaws.com/0/151976/909e5301-7533-97b0-dc0c-99902c6c5f6f.png)

## 失敗時
時間内に全てタイプできなければプロ生ちゃんが泣いてしまいます。
![failed.png](https://qiita-image-store.s3.amazonaws.com/0/151976/4d76ea23-b351-9e61-0883-efe868a48a04.png)

## リザルト画面
全ての問題が終了するとリザルト画面が表示されます。
![result.png](https://qiita-image-store.s3.amazonaws.com/0/151976/95133595-fc84-e1bf-7406-6c3475b5229e.png)

ちなみに、ミスタイプ0で全て打ち切るとリザルト画面の前におまけの画像が表示されます。
![perfect.png](https://qiita-image-store.s3.amazonaws.com/0/151976/560a50ad-4501-8736-cfa4-58ebd8c04f36.png)


## 終了画面
Escapeキーで終了、Nキーで継続します。
![end.png](https://qiita-image-store.s3.amazonaws.com/0/151976/a8b4fa8b-1496-110e-7aab-c9c2260e1ae8.png)

# 終わりに
プロ生ちゃんがふんだんに含まれたタイピングゲームを作ってみました。
機能としては必要最低限のものしか実装されていないので、
問題文の文章が少なかったり、複数の入力方式(例 : siとshi)に対応していなかったりと
まだいくつか課題が残っています。
今後、時間があれば追加機能の実装やリファクタリングを行って
Github等で公開できればと思っています。
~~あと、プロ生ちゃんをprprしてhshsしたい。~~
MantleのXML拡張を作った

# MantleのXML拡張を作った

https://github.com/soranoba/MantleXMLExtension
はい. 作りました. SwiftじゃなくてObjective-Cです^^;;

## Mantleって？

https://github.com/Mantle/Mantle

先人達の記事がたくさんあるので, そちらを参照してください.

- [【Objective-C】MantleでJSONをマッピング](http://qiita.com/KentaKudo/items/3688a8be8262ed272c36)
- [JSON<->NSManagedObjectのマッピングを簡単に！Mantleを使ってCore Dataのソースコードをシンプルにする](http://qiita.com/asakahara/items/307638c1396286afb3f3)

## Mantleを何故使うか

Json/XMLライブラリを使うのと手間はあまり変わらないでしょう.
ただ, 必須要素のチェックを`validate`メソッドに書くことで, 異常系のハンドリングが統一的かつシンプルになるだろうということで採用しました. [^1]

## 既存のXML拡張

Mantleは標準でJsonとDictionaryしか対応していません. しかし, 残念ながら仕事で使うのはXMLでした.
Mantleも歴史のあるライブラリなので既にXML拡張はあります. [MantleXMLAdapter](https://github.com/mbaranowski/MantleXMLAdapter)です.

ただ, この拡張には使いたくない理由がありました.

- メンテされていない
- XMLライブラリへの依存がある (しかも普段使っているライブラリと違う)
- Model to XMLは実装しないといけない

## MantleXMLExtension

という訳で作りました. [MantleXMLExtension](https://github.com/soranoba/MantleXMLExtension).

- XMLライブラリへの依存はありません. (NSXMLParserがあれば十分!!)
- Attribute, Arrayにも対応しています.
- Model to XMLももちろん自動です.
- XML宣言もカスタム可能
- XML to Modelの際のnodeの順番も設定可能

と, MantleXMLAdapterよりも強化しているつもりです. 何より依存がありません.

```objc

#pragma mark - MXEXmlSerializing

+ (NSDictionary<NSString*, id>* _Nonnull)xmlKeyPathsByPropertyKey
{
    return @{ @"status" : MXEXmlAttribute(@"", @"status"),
              @"userCount" : @"summary.count",
              @"users" : MXEXmlArray(@"", MXEXmlChildNode(@"user")) };
}

+ (NSString* _Nonnull)xmlRootElementName
{
    return @"response";
}

+ (NSValueTransformer* _Nonnull)usersXmlTransformer
{
    return [MXEXmlAdapter xmlNodeArrayTransformerWithModelClass:UserModel.class];
}
```

使い方はこんな感じで, `.`だけseparatorとして予約しました (Mantleに準拠).
より詳しい内容はドキュメントを参照してくださいm(_ _)m

Mantleで良いiOSライフを！

---

[^1]: というよりもvalidationを書く文化がチームにありませんでした.
なるほどわかった！困った時のMoodleのパスワードリセット

<img width="401" alt="moodle.png" src="https://qiita-image-store.s3.amazonaws.com/0/116241/396391a4-8516-8d93-3d04-f9f19825460d.png">

# Moodleのパスワードを忘れた！！

いくつものMoodleを立てていると、adminのパスワードを忘れることありますよね。

そのときは慌てずに以下のようにしてください。

1. MoodleのサーバにSSHでログインする
2. 以下のコマンドを実行する

```bash
[user@moodle ~]$ sudo php /path/to/moodle/admin/cli/reset_password.php
== Password reset ==
enter username (manual authentication only)
: admin
Enter new password
: NewP@ssw0rd!!??
```
新しいパスワードがセットされます。
これで安心ですね。

# その他のコマンドライン操作

こちらの[公式ドキュメント](https://docs.moodle.org/2x/ja/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%AB%E3%82%88%E3%82%8B%E7%AE%A1%E7%90%86)にはMoodleの以下のコマンドライン操作について詳しく記載されています。


1. コマンドライン経由のインストール
2. メンテナンスモード
3. オフラインモード
4. コマンドラインを使ったアップグレード
5. カスタムサイトデフォルト
6. ユーザパスワードをリセットする
7. MySQLストレージエンジンの移管
8. コマンドライン経由でcronを実行する


困った時に参照すると良いでしょう。
インスタンスを異なるクラスに属させてみる

こんにちは、今日は [Smalltalk 忘年会](https://smalltalk.connpass.com/event/46709/)です。みなさん、忘れないように気をつけましょう！

わたくし、現在は Smalltalk 処理系で [ALLSTOCKER](http://allstocker.com/) というサービスを運用開発している[SORABITO株式会社](https://www.sorabito.com/)に務めていまして、プロダクション環境で Smalltalk を運用することでさまざまなことを学んできました。今年のアドベントカレンダーではそれを少し意識して実務で役立ちそうな記事をふたつほど書きました。今回も Smalltalk をプロダクションとして使うときに有効な技を紹介できればと思ったのですが、ちょっと個人的な都合で時間がありません。

ですが、せっかくなので Smalltalk ならではというネタでも書いてみようと思いました。そこで思いついたのが `Object>>#becomeForward:` でしたので、今日はそれについて書いてみます。

今日の記事にはきちんとオチがありますので、ぜひ最後までご覧下さいまし。

# インスタンスはクラスに属する

よくオブジェクト指向を説明するときに「インスタンスはクラスに属していて、途中で他のクラスになることはない」といった説明が用いられることがあります[^1]。

まあ、当たり前ですよね。イヌがいきなりニャーニャー鳴いたらおかしいわけです。

# Smalltalk ではそうとは限らない

その概念をぶち壊すこととができるのが `Object>>#becomeForward:` です。
インスタンスを他のクラスに属させるような変更をさせ、振る舞いを変えます。

簡単にコードで説明してみましょうか。

# 普通にオブジェクトをインスタンス化して代入

Array をインスタンス化して変数に代入、その変数に OrderedCollection を代入してみます。
その前後で `Object>>#identityHash` を比較してみることで同一のインスタンスではないことを確認します。

```
| a |
a := #().
Transcript cr; show: a identityHash.
a := OrderedCollection new.
Transcript cr; show: a identityHash.
a inspect.
```

当然と言えば当然ですが、 Array と OrderedCollection はインスタンス化されていますから、 Transcript には異なる値がでます。

いま、実行してみたらこんな感じでした。

```
1066388736
972583936
```

言うまでもないかもしれないですが、 `a inspect.` では空の OrderedCollection を見ることができます。

# Object>>#becomeForward:

ところが、同じインスタンスであるにも関わらず属するクラスを変える事が Smalltalk ではできます。
それを可能にするのが `Object>>#becomeForward:` です。

上と同じようなことを今度は `Object>>#becomeForward:` を使って書いてみます。

```
| a |
a := #().
Transcript cr; show: a identityHash.
a becomeForward: OrderedCollection new.
Transcript cr; show: a identityHash.
a inspect.
```

`a inspect.` では、同じく空の OrderedCollection を見ることができます。ここで Transcript に表示される値をみてみましょう。

```
454936320
454936320
```

なんと！
同じインスタンスであるにも関わらず、振る舞いを Array から OrderedCollection にしてしまえることが分かります。

# どんな時に使うの？

この `Object>>#becomeForward:` ですが、どんなときに便利かというと、わりと入り組んだ感じに変数を使ってしまっているところで、インスタンスの機能に不具合が発生したときに、代替となるクラスに属させることでフォールバックさせる、といった用途に便利です。

# 危険なんじゃないの？

何も考えずに使うと危険です。

Pharo 環境などがあれば、以下のようなコードを実行してみましょう。
実行前にはイメージをセーブしてください！！！

```
| a |
a := true.
a becomeForward: false.
```

![Screen Shot 2016-12-16 at 15.51.54.png](https://qiita-image-store.s3.amazonaws.com/0/1644/91320ca7-06f1-b502-f2cf-5a4cc287df0b.png)


ね。

ということで、ちゃんとオチがある話でした。

お後がよろしいようで。

ではまた。

[^1]: 出展: [オブジェクト指向でなぜつくるのか 第2版](https://www.amazon.co.jp/dp/4822284654/)
RESTfm が返してくるフォーマットについて

# API を叩いた時に RESTfm が返してくるフォーマット
現在の多くの Web API では、API にアクセスした際に返ってくるフォーマットに JSON を採用していると思います。昔からのサービスは XML が返ってくるところもあるでしょうか。

RESTfm では JSON や XML はもちろん、その他の様々なフォーマットで結果の返却が可能です。

# 許可するフォーマットは RESTfm.ini.php で設定する
様々な返却フォーマットを返すことができる RESTfm ですが、どのフォーマットを返すの返さないのかは`RESTfm.ini.php`で設定します。`formats`の配列のところです。

セキュリティやトラフィックのことを考慮しても、デフォルト状態である全部許可の設定でいいとは思います。もし特定のフォーマットを返したくない場合はコメントアウトしましょう。`.html`は Web API の本質からは本番環境ではコメントアウトしてもいいかもしれません。

# フォーマットは URI の後ろに指定する
フォーマットを指定するためには、URI の後ろに拡張子として`.json`や`.txt`、`.simple`とフォーマット名を付与しましょう。なお、**フォーマットを指定しない場合は`.html`が選択されます**。

具体例を見てみます。

http\://hogehoge/RESTfm/ に RESTfm を配置した場合、http\://hogehoge/RESTfm/Member という URI が、Member というデータベースにアクセスするための URI となります（最後のスラッシュは不要です）。

この場合、フォーマット（拡張子）が省略されていますので、URI は http\://hogehoge/RESTfm/Member.html と等価です。試しにアクセスしてみてください。

そして`.html`の部分を他のフォーマット形式、例えば`.json`や`.xml`に変えてみましょう。ちゃんとそのフォーマットで返り値が戻ってきたかと思います。

# アプリケーションに応じて適切なフォーマットを選択する
冒頭にも書きましたが、現在の一般的な Webアプリケーション（フレームワーク）では JSON を用いれば便利なことが大半でしょう。ただし、FileMaker Pro / Go との連携を考慮した場合は fmpxml フォーマットは絶大な威力を発揮します。

デバッグの際には`.simple`や`.txt`が役に立つかもしれません。

状況に応じて適切なフォーマットを選び、開発をしていきましょう。

# 公式ドキュメント
フォーマットの詳細な説明は[公式ドキュメント](http://restfm.com/restfm-manual/data-formats)もご覧ください。
Vim 8.0 Advent Calendar 17 日目 新しい関数 ～文字列操作編～

この記事は [Vim 8.0 Advent Calendar](http://qiita.com/advent-calendar/2016/vim8) の 17 日目の記事です。

Vim 8.0 では新しく便利な組み込み関数が多数追加されています。今回はその中から、文字列操作に関連するものを紹介します。

## `matchstrpos({expr}, {pat}[, {start}[, {count}]])`

Vim script には元々、指定した文字列から、正規表現にマッチした位置を取り出す `match()` 関数と、マッチした文字列を取り出す `matchstr()` という関数があります。
これら関数は便利ですが、マッチした位置とマッチした文字列両方が欲しい場合には少し問題があります。この場合、それぞれの関数を呼び出すことになるのですが、関数を 2 回呼び出すのは手間がかかる上に、同じ正規表現マッチを 2 回行うのはパフォーマンス的にも無駄です。

そこで、`matchstrpos()` 関数が追加されました。引数は `match()` 関数や `matchstr()` 関数と同じで、戻り値が違います。"マッチした文字列"、"マッチした先頭の位置"、"マッチした末尾の位置" の 3 要素の配列を返します。

```vim
echo matchstrpos('fizz buzz fizzbuzz', 'b\w\+')
" => ['buzz', 5, 9]
```

## `strcharpart({src}, {start}[, {len}])`

Vim script には元々、文字列の一部を切り出す `strpart()` 関数がありますが、これはバイト単位で動作するため、マルチバイト文字に対して使うと文字列のバイトの途中で切り取られてしまうという問題がありました。
そこで `strcharpart()` が追加されました。これはバイト単位ではなく、文字単位で文字列の一部を切り取ります。

```vim
echo strcharpart('あいうえお', 1, 3)
" => いうえ
```

## `strgetchar({str}, {index})`

文字列内の指定した index の文字の文字コードを取得します。これはバイトではなく文字単位で動作します。文字数はマルチバイトで数えられ、結果はマルチバイト文字の 1 文字の文字コードになります。

```vim
let code = strgetchar('あいうえお', 4)
echo printf('0x%x', code)
" => 0x304a
echo nr2char(code)
" => お
```

## `byteidxcomp({expr}, {nr})`

Vim script には `byteidx()` という関数があります。これは、マルチバイト文字を考慮して、`{expr}` に与えた文字列の 0 オリジンで `{nr}` 番目の文字が、文字列内の何バイト目かを返します。`{nr}` が文字列の文字数と同じ場合は文字列全体のバイト数を返し、`{nr}` がそれより大きい場合は -1 を返します。

```vim
echo byteidx('あいうえお', 2)
" => 6
echo byteidx('あいうえお', 5)
" => 15
echo byteidx('あいうえお', 6)
" => -1
```

新しく追加された `byteidxcomp()` は、合成文字を個別にカウントします。

```vim
let s = 'e' . nr2char(0x301)
echo s
" => é
echo byteidx(s, 1)
" => 3   (合成文字を 1 文字とみなし、文字列が 1 文字であるため文字列全体のバイト数を返します)
echo byteidx(s, 2)
" => -1  (合成文字を 1 文字とみなし、{nr} が文字数より大きいため -1 を返します)
echo byteidxcomp(s, 1)
" => 1   (合成文字を別々の文字とみなし、"e" までをカウントして 1 を返します)
echo byteidxcomp(s, 2)
" => 3   (合成文字を別々の文字とみなし、文字列が 2 文字であるため文字列全体のバイト数を返します)
```

## `glob2regpat()`

`glob()` 関数などで使われる、いわゆるワイルドカードなどが含まれるファイルパターンを正規表現に変換します。

```vim
echo glob2regpat('*.vim')
```

今のところ、ワイルドカードの `*` も `**` も、正規表現の `.*` に変換されるようです。実際のワイルドカードの `*` はディレクトリを辿らず、`/` などのディレクトリ区切り文字にはマッチしないため、若干挙動が異なってしまう点に注意してください。
Fess シノニム辞書をアップロード

Fess 10.3
シノニム辞書をアップロードして登録してみます。

管理>システム>辞書>辞書一覧>synonym.txt
#### 同義語一覧
登録済みの同義語が確認できます。

1つしか登録されていませんが、ダウンロードしてみます。

```synonym.txt
fess,フェス
```
中身はCSV形式になっています。

この形式でアップロードすることで
カンマで区切られた単語を同様のものとして扱うことができます。

#### 登録するデータ
[Vector](http://www.vector.co.jp/)から以下のデータを利用させていただきました。
[同義語辞書](http://www.vector.co.jp/soft/data/writing/se434756.html) (作者：Hiroshi Kameya)

中身のデータは以下のような形式でした。

```synonym.txt
りんご	9309
リンゴ	9309
申込者	9316
希望者	9316
応募者	9316
出願者	9316
```

```awk
$ awk 'NR==1{col2=$2; col1=$1;} NR!=1{if($2==col2) {col1=s1 "\," $1;} else{ print col1;
 col2=$2;  col1=$1;}}' synonym.txt > upload_synonym.txt
```

awkで以下のCSV形式に変換しました。

```upload_synonym.txt
りんご,リンゴ
申込者,希望者,応募者,出願者
```

#### アップロード

1. 同義語一覧のアップロードボタンをクリック
2. upload_synonym.txtを選択してアップロード

同義語が登録できました。
Visual Studio 2015 でチャートコントロールと Excel データをバインド

標準 ADO.NET プロシージャを使ってデータバインドして、Visual Studio ツールボックスのコントロールから Excel データとの双方向接続を実現。この記事ではVisual Studio のグラフィカルアプローチと、ほんの数行のコードでデータバインドをする方法を説明します。

データバインドによって、UI コントロールからデータに接続できます。 [CData ADO.NET Provider for Excel](http://www.cdata.com/jp/drivers/excel/ado/) を使って、Visual Studio 上で Windows Forms および Web Forms とExcel データをデータバインドできます。この記事では、ウィザードから変更をライブで反映するチャートにExcel データをデータバインドする方法を説明します。 コードWalk-through セクションではチャートをほんの数行のコードで作成します。

#チャートへのデータバインド
データバインドは３つのステップから構成されます。コントロールのインスタンス作成、データソースの設定、データバインドです。

#接続を設定してデータベースオブジェクトを選択

下の手続きにより、データソース構成ウィザードを使ってチャートコントロールと Excel との接続を作成します。ウィザード上でデータバインドをする Excel エンティティを使います。 

１．Windowsフォームアプリケーションプロジェクトで、チャートコントロールをツールボックスからフォーム上にドラッグ＆ドロップします。チャートプロパティのデータセクションで DataSource を選択し、メニューからプロジェクトデータソースの追加を選択します。

![fig4_01.png](https://qiita-image-store.s3.amazonaws.com/0/141193/12b79170-e26e-5dd5-8ef1-1b378f68e1b8.png)

２．出てくるデータソース構成ウィザードで データベース -> データセット を選択します。

３．データ接続ステップで、「新しい接続」をクリックします。

４．データ接続の選択ダイアログで、「変更」をクリックして、CData Excel データソースを選択して、接続プロパティを入力します。参照先のExcelファイルのパスを設定します。

![fig4_02.png](https://qiita-image-store.s3.amazonaws.com/0/141193/016cdf6d-e935-25d4-3dac-5cf90fecce43.png)

５．使用するデータソースオブジェクトを選択します。例は Temp テーブルです。

![fig4_03.png](https://qiita-image-store.s3.amazonaws.com/0/141193/c9c8400b-a78c-4148-43ce-381205dc8ae3.png)

#データバインド

データソースの追加とデータベースオブジェクトを選択したら、チャートにオブジェクトをバインドします。この例では、X軸に 年月 をY軸に 平均気温(℃) を設定します。

![fig4_04.png](https://qiita-image-store.s3.amazonaws.com/0/141193/8a6423ad-0ba8-4597-3d95-773db96e3528.png)

チャートはこれで Excel データにデータバインドされました。チャートを実行して最新のデータを表示させましょう。

![fig4_05.png](https://qiita-image-store.s3.amazonaws.com/0/141193/98aa28f7-ad5e-a23c-2a66-718120f3fbc4.png)

#コード Walk-through

Excel データへのデータバインドはほんの数行のコードのみが必要で、３つの簡単なステップで完了できます。

1. Excel に接続します。
1. ExcelDataAdapter を作成して、クエリを作成し、結果を入れるデータセットを作成します。
1. 結果セットとチャートをデータバインドします。

下に完全なコードを示します。

```csharp
ExcelConnection conn = new ExcelConnection("Excel File='C:\\temp\\temp.xlsx';");
ExcelCommand command = new ExcelCommand("SELECT * FROM Temp", conn);
ExcelDataAdapter da = new ExcelDataAdapter(command);
DataSet ds = new DataSet();
da.Fill(ds);

chart2.DataSource = ds;
chart2.Series[0].XValueMember = "年月";
chart2.Series[0].YValueMembers = "平均気温(℃)";

chart2.DataBind();
```
モンテカルロ法をAndroidで遊んでみた

猫の居る会社で有名なqnoteに入社させていただき、半年が経とうとしております。
最近では猫社員とも打ち解けてきており、モニターの前に陣取られてしまうこともしばしばです。

#目的

世間ではカジノ法案の採決で与野党が揉めているようですが、カジノといったらランダムの世界ですよね。今回はAndroidでモンテカルロ法を使用し円周率を求め、Mathクラスのrandom()メソッドで取得できる値に偏りがないか確認したいと思います。

#モンテカルロ法と円周率
モンテカルロ法をWikipediaで調べるとこんな感じに書かれております。
>シミュレーションや数値計算を乱数を用いて行う手法の総称。

モンテカルロ法で円周率を求める場合は、XとYを半径以下の乱数として点を打ちます。一辺が半径の正方形内に分布し、これらの点の総数と円内の数の比が正方形と扇状の円の面積比になることを利用して円周率を求めます。

+ 1.0×1.0の正方形にランダムで点を打つ
+ 打たれた点の座標XとYをそれぞれ二乗し足す
+ その数が1.0より小さければ扇状の円の中、大きければ外とする
+ 全体に打った点の数と扇状の円の中に入った点の数を割り4倍すると円周率！

```GraphicsView.java
import android.content.Context;
import android.graphics.*;
import android.util.Log;
import android.view.View;

public class GraphicsView extends View {

	Paint paint = new Paint();
	int NUMBER = 1000000;
	double[] randX, randY;

	public GraphicsView(Context context) {
		super(context);
		randX = getRandom();
		randY = getRandom();

	}

	private double[] getRandom() {
		double[] rand = new double[NUMBER];
		for (int i = 0; i < NUMBER; i++) {
			rand[i] = Math.random();
		}
		return rand;
	}


	@Override
	protected void onDraw(Canvas canvas) {

		int n1 = 0; 
		double pi = 0.0; 

		for (int i = 0; i < NUMBER; i++) {
			int intx0 = (int) (randX[i] * 500);
			int inty0 = (int) (randY[i] * 500);
			
			if (randX[i] * randX[i] + randY[i] * randY[i] < 1.0) { /* 円の中に入っているか */
				n1 = n1 + 1;
				paint.setColor(Color.rgb(255, 0, 0));
				canvas.drawPoint(intx0, inty0, paint);
			} else {
				paint.setColor(Color.rgb(0, 0, 0));
				canvas.drawPoint(intx0, inty0, paint);
			}
			pi = (double) n1 / (i + 1) * 4;
		}
	    Log.v("LogPi", "円周率:"+pi);
	}

}
```

実際に描画した画面（打点数10万）
![Screenshot_20161212-144826.png](https://qiita-image-store.s3.amazonaws.com/0/150944/5e873c4a-625c-cb96-b218-e1e9baedf8d8.png)
この時の求めた円周率は3.134でした。
もしランダムメソッドから得られる値に偏りが合った場合、ここで求められる円周率が大幅に狂っていきます。
3.134という値は。。。いや駄目ですね。算数のテストで使用したら間違いなくバツですね。
モンテカルロ法はサンプル数が多いほど、ある程度まで精度が上がる性質があるので、次は300万回の打点を行ってみます。

実際に描画した画面（打点数300万）
![Screenshot_20161212-144535.png](https://qiita-image-store.s3.amazonaws.com/0/150944/880fc117-67d6-109f-5444-552e88545268.png)
求められた円周率は3.1412。。。3.14になったのでOKとしてください。モンテカルロ方は正確な値を求められる方法ではないのでこんな感じです。


#余談
randXとrandYの配列の他にrandZを用意し
```変更前
if (randX[i] * randX[i] + randY[i] * randY[i] < 1.0) {
```
を
```変更後
if (randX[i] * randX[i] + randY[i] * randY[i] + randZ[i] * randZ[i] < 1.0) {
```
とすると、先程までは２次元の円が描画されていましたが、
![Screenshot_20161212-145819.png](https://qiita-image-store.s3.amazonaws.com/0/150944/e2835635-4b65-3251-ae72-5ac556df334d.png)
球体で描画されます。
同じ方法でもう一次元足して上げると4次元の球体が描画。。。されているのかな？？
DBのデフォルトのインデックス名を短くする「activerecord-simple_index_name」

# activerecord-simple_index_nameとは?
Railsで生成されるインデックス名からtable名を抜いて短くするためのgemです

* https://github.com/sue445/activerecord-simple_index_name
* https://rubygems.org/gems/activerecord-simple_index_name

## 例
```ruby
create_table :user_stocks do |t|
  t.integer :user_id,    null: false
  t.integer :article_id, null: false
  t.timestamps null: false
end

add_index :user_stocks, [:user_id, :article_id]
```

こういうmigrationがあった時に、デフォルトだと `index_user_stocks_on_user_id_and_article_id` というindex名が作られますが、activerecord-simple_index_nameを使うと `user_id_and_article_id ` というindex名になります

# 基本的な使い方
Gemfileに書いてrequireするだけ

# 応用的な使い方
既存のアプリに途中から activerecord-simple_index_name を導入する仕組みを用意しています

## デフォルトではindex短くしつつも、特定の場所だけ無効化したい（オプトアウト）
migrationで `ActiveRecord::SimpleIndexName::DisableShorten` をincludeすれば一時的に無効化できます。

例）

```ruby
class AddArticleIndexToUserStocks < ActiveRecord::Migration
  include ActiveRecord::SimpleIndexName::DisableShorten

  def change
    add_index :user_stocks, :article_id
  end
end
```

## デフォルトでindex短くするやつを無効化しつつ、特定の場所で有効化したい（オプトイン）
デフォルトの挙動は設定で変えられます。

```ruby
ActiveRecord::SimpleIndexName.config.auto_shorten = true
```

or

```ruby
ActiveRecord::SimpleIndexName.configure do |config|
  config.auto_shorten = true
end
```

`auto_shorten` を `false` にすれば短くならなくなります。（要はactiverecord-simple_index_nameを入れない時と同じ状態）

デフォルトだと `true` （自動でindex名が短くなる）です。

特定の場所のみindex名を短くするのを有効にしたい場合はさっきの逆で `Activerecord::SimpleIndexName::EnableShorten` を `include` してください。

```ruby
class AddCategoryIdToArticles < ActiveRecord::Migration
  include Activerecord::SimpleIndexName::EnableShorten

  def change
    add_column :articles, :category_id, :integer
    add_index :articles, :category_id
  end
end
```

# 元ネタ
[ActiveRecordのデフォルトのインデックス名が長いのが気になる - Qiita](http://qiita.com/kamipo/items/6e5a1e238d7cc0611ade)

kamipoさんから許可をもらってgem化しています :bow:

元エントリだと `alias_method_chain` を使っていますが、activerecord-simple_index_nameではRails 5対応の時に `prepend` を使うようにしています。
マネージャーをやりたくなかった人が開発組織のマネージャーをやるまで

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

# はじめに

クラウドワークスのエンジニアで、現在プロダクト開発Div.にてマネジメント職についている @teriyakisan です。
社内には田中が数名いることもあってか、テリヤキさんと呼ばれることも増えてきました。

今回はもともとマネージャーをやりたくなかった私が、なぜやることになったか、やってみてどうだったかを（緊張感ありますが）書いてみます。

# なぜやりたくなかったか

エンジニア界隈で「マネージャーやりたくない」という声は多いと思います。

- 現場寄りでいたい
- コードを書き続けたい
- 給与は上げたいけど昇進にそこまで興味はない
- マネジメント職につくとMTG増えて大変そう

とかが代表的かなと。

例にもれず私もそうで、クラウドワークスの組織拡大に伴いマネージャーポジションが全社的に増えつつあった昨年、自分がやるイメージはまったく湧いていませんでした。

数字を前提としたコミットメントをすることがマネージャーとしての責務として大きく、正直プレッシャーのかかるつらい立場にしか見えていなかったです。

また、「昇進」扱いで全社の中で前に出ることに対しても抵抗感を持っていました（ここは個人差あると思います）。

# なぜやったか



その後組織の拡大と合わせて開発組織内でもマネージャーが誕生する中、やんわりとマネージャー打診を受けました。
チームリーダーを務め、社歴も長くなってきていたこともあったかと思います。

そこから半年くらい、なんとかマネージャーではなく他のロールを探っていきたいという会話をGMの@tsuyokと続けました（続けてもらいました）。

@tsuyokはしんどかったと思いますが、私自身は悩みつつもじわじわと「組織の未来をつくっていくこと」「一緒に働く人たちの未来を考えること」には興味を持ち始めていた気がします。

これまでなんとなく「マネージャー」というつらみの固まりで捉えていたものが、いくつかの役割を持ち合わせた職であることに気づき始めたのもこのタイミングでした。

結果、最終的に折り合いがついたのが、組織と人のマネジメントに特化した「EM（エンジニアリングマネージャー）」という形です。

EMは実際に「エンジニアリング」を「マネージ」するわけではなく、開発組織やそこにいる人たちを見ていくのですが、既存の「マネージャー」概念とは少し変えた立て付け（名前？）にさせてもらいました。

結局、もともと開発組織内で「マネージャー」と呼ばれていた人もいつの間にか「EM」と呼ばれるようになり、開発組織内にいればエンジニアじゃない人でも「EM」と呼ばれるようになったことは申し訳なかったので、ここで謝っておきます。

# やってみてどうだったか

EMになり、これまでの自分の仕事と大きく違うと感じたのは「単一チームでなく全体最適を意識して組織を考えること」「組織の人たちと目標設定をして評価をおこなうこと」の2つでしょうか。

今それがベストな形で遂行できているとは思わないのですが、組織にいる人たちができるかぎりパフォーマンスを発揮し、次のステップを見つけて成長を続けることをサポートする意識は強く持つようになった気がします。

また、「組織全体」を考える機会、考えさせられる機会が増えたのも事実で、視野は広がってきている感覚は持ててきました。

# そして現在

現在クラウドワークスのエンジニアのキャリア（役職）は、大きく3つに分類されています。

- 技術系：CTO、Tech Lead
- プロダクト系：PM（プロダクトマネージャー）、PO（プロダクトオーナー）
- マネジメント系：GM、EM（エンジニアリングマネージャー）

以前は「CTO」「GM」くらいの定義しかなかったところからだいぶ整理されてきました。

直近、私自身はEMに加えPOにもなり、プロダクトの戦略を考えてもいます。

EMとしては組織や人の未来を考え、POとしてはプロダクトの未来をつくっていくので、否が応でも関係する部分は多く、そういう意味では両者の議論に参加し考えられることは現状ではプラスに働いている印象です。

POについては、数字だけではないもののプロダクト創出やサービスグロースへの責任がついてくるので、ブーメラン的にもともとのマネージャー像に含まれていた「プレッシャーのかかるつらい立場」になりうる気もしていますが、ロールが分かれていることで順番にチャレンジできているのは大きい気がします。

ゆくゆくはEMとPOどちらかのロールに集中する可能性もあるのかなと。

# まとめ

改めて振り返れば「マネージャー」が何をする人なのかよくわかってなかったことも、やりたくない気持ちの多くを占めていたのかもしれません。

責務がある程度明確になり、ロールとしてもわかりやすく定義されたことで、何が求められるかもわかりやすくなり、何にチャレンジすべきかも見えやすくなりました。

一方、「現場寄りでいたい」「コードを書き続けたい」には少し距離ができつつもあり、その状況で新たな楽しみを見出しつつもあり、自分の中でもまだ葛藤がある状況です。

ただやってみないと見えないことも多いので、一旦やってみようと思える状況になったのは良かったかなと。

そんなところで、マネージャーをやりたくなかったけど今チャレンジしている人の話は終わりです。

明日はGMの@tsuyokによる「イケイケなベンチャーの開発チームが、普通の開発チームになってしまう5つの兆候」です。

引き続き [CrowdWorks Advent Calendar 2016](http://qiita.com/advent-calendar/2016/crowdworks) をお楽しみください。
Macでgolang

「MacでGo」にすると意味が変わってきそうなのでgolangにしました。
インストールからやってみます。

#ダウンロード
公式からダウンロードします。
https://golang.org/dl/

<img width="1051" alt="スクリーンショット 2016-12-03 15.57.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/81753/c153d48e-c5c9-b5a8-8258-b2db70ae440a.png">

#インストール
ダウンロードしたpkgファイルを実行してインストールします。

<img width="624" alt="スクリーンショット 2016-12-03 16.02.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/81753/c28a5fd8-c97b-deb7-ccd3-b165fc3e4fb1.png">

パスを通します。

```bash
$ export GO_HOME=/usr/local/go
$ export PATH=$PATH:$GO_HOME/bin
$ go version
go version go1.7.4 darwin/amd64
```

#Hello World
公式のチュートリアルを元にやってみます。
https://go-tour-jp.appspot.com/welcome/1

以下を実行し、ローカルブラウザでGo Tourを開きます

```bash
$ go tool tour
2016/12/03 16:17:09 Serving content from /usr/local/go/misc/tour
2016/12/03 16:17:09 A browser window should open. If not, please visit http://127.0.0.1:3999
2016/12/03 16:17:10 accepting connection from: 127.0.0.1:54410
```

画面右半分のコードの下にある「RUN」ボタンを押下して実行。

<img width="647" alt="スクリーンショット 2016-12-03 16.20.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/81753/32ec3fb4-0561-bfc5-e808-676c6a788129.png">

下に結果が表示されます。

引き続き勉強中・・・
FreeBSD/mrubyのgem

私がFreeBSD上のmrubyで作ったgemの紹介です。どれも100行くらいの小規模なgemです。

## mruby-bsdgpio

https://github.com/yamori813/mruby-bsdgpio

[はじめて作ったgem](http://qiita.com/yamori813/items/038027275d21e87388cd)でGPIOのコントロール用です。

```ruby
t = BsdGpio.new(0)
t.setflags(1, BsdGpio::OUTPUT)
t.set(1,1)
usleep 1000*1000
t.set(1,0)
```

LED点灯やスイッチの状態を確認できます。こちらはFreeBSD 11Rから入ったライブラリを使って作りました。

~~FreeBSDではspiドライバをユーザランドから直接叩く事はできないですが、gpioにつないだspiデバイスであればbitbangでアクセスできます。確認のためにgpioでspiする[スクリプト](https://gist.github.com/yamori813/40efce7ddd4d0b0bb9da557a0367a8a1)も作ってみました。~~ (spigenドライバでユーザーランドからアクセスできます 後日修正)

## mruby-bsdiic

https://github.com/yamori813/mruby-bsdiic

I2Cのコントロール用のgemです。IoTやるやらI2Cもあった方が良いのではと意見をもらったので作ってみました。ioctlで実装してあります。

```ruby
t = BsdIic.new(0)
p t.read(0x50,2)
```

[リアルタイムクロック](http://qiita.com/yamori813/items/1d1c40ce69fe6e60ce1c)や[サウンドチップ](http://qiita.com/yamori813/items/eb23741d99a3677cf077)の制御してみました。

## mruby-etherswitch

https://github.com/yamori813/mruby-etherswitch

ルーターなどのswitchチップを制御するためのetherswitchドライバ経由でswitchチップのレジスタを読み書きするgemです。ioctlで制御していて、etherswitchのヘッダーはまだシステムに入っていないので、ローカルにコピーしてビルドしています。ヘッダーに変更があると動かなくなります。

```
t = EtherSwitch.new(0)
p t.readreg(0x0509)
```

etherswitchドライバはetherswitchcfgというコマンドで設定をおこないます。このコマンドでVLANの設定をおこなう事はできますが、mibを拾う機能などはサポートされていません。データシートが公開されているチップであればこのgemを使いレジスタにアクセスしてmibを拾ったり、細かい設定をおこなう事ができます。

## mruby-remocon

https://github.com/yamori813/mruby-remocon

ビット・トレード・ワンさんの[USB赤外線リモコンモジュールの制御用](http://qiita.com/yamori813/items/a7379d750518f174c0c4)のgemです。libusbベースのコードを組み込んで実装してあります。

```ruby
# Sony CD Player Play
play = [0x33, 0x4d, 0x10]

t = Remocon.new()

t.send(play)
usleep 45*1000
t.send(play)
```

このgemの元になっているソースはLinuxで作られているので、おそらくLinuxでも使えるのではないかと思います。またMac用のコードも組み込んであります。

## ビルドについて

これらのgemは全てmipsなルーターに入れて使っています。FreeBSDのカーネルとmrubyを含むrootfsは[ZRouter](http://qiita.com/yamori813/items/2fc5b14648029bb4730f)というビルドシステムでビルドしています。このビルドシステムはamd64などの普通のホストで実行してクロスコンパイルでターゲット用のバイナリを作ってくれます。gemを利用するためにはmrubyをターゲットに入れてビルドするときに環境変数のMRUBY_CONFIG設定されたbuild_config.rbにgemを追加して、ビルドを実行する事でgemが入ったmrubyが出来上がります。ZRouterでビルドできるシステムはぎりぎり4MのFlashに入りますが、mrubyを入れると1.5MByteくらいの容量が必要になるので最低8MのFlashが必要になります。

## 最後に

ちょっと気になっているのですがmipsにはビッグエンディアン(mips/mips:Atherosなど)で実行される環境とリトルエンディアン(mips/mipel:Mediatekなど)で実行される環境があります。mrubyの実行が同程度のクロックのSOCでビッグエンディアンの場合、リトルエンディアンの倍くらい遅くなっています。ビルド時になにかおまじないが必要だったりするのでしょうか。

それはさておき、結構この環境が気に入っています。FreeBSDでmrubyも楽しいですよ。
TensorFlowを使ってやりたいこと

## 背景

僕が興味を持っている数値光散乱シミュレーションの分野では、非球形粒子単体の光散乱を研究したい研究者は世界で300人くらいではないかと思います (応用研究を除く)。
その300人の中で、審査を勝ち抜いて数億円予算のsupercomputerを扱える資格を持つ人はだいたい世界で30人くらいではないかと思います。

残り270人はそれぞれの扱える予算内や共同研究利用などを申請して上記よりは非力な環境での数値計算をする、というのが現状です。

supercomputerの計算については、数ヶ月動かし続けて得られた結果が論文に掲載されたり、「データベース」として公開されたりすることがあります。
しかしながら、その「データベース」というのは計算条件が使いたい条件と異なっているなどして、あくまで参考意見程度の扱いとなります。

残り270人がそれぞれ使える環境で、supuercomputer並の結果(その1/100でもいい）が使えるようになれば、コミュニティが活性化するのでは、と思います。
その結果、うっかり彗星の起源の研究が進んだり、うっかり大気粒子による気候変動影響の研究が進んだり、各種光学機器の開発が進んだりすると面白いし、それらの発展を生きている間に目にしたいと感じています。

270人の計算環境を良くするにはどうするか。

## シナリオ

1. 30人の誰かがsupercomputerでGPUをふんだんに使用して計算を行う
2. 計算結果をsupercomputerでDeep Learningしてその結果を公開する
3. 公開した結果を元に、残り270人が学習結果を用いてそれぞれの希望する条件で数値計算を行う

アイデアの種は以下の情報から来ています。

- Weta DigitalのSpherical Harmonics cache
  - http://qiita.com/7of9/items/c04b08c5e719dc6f8593
  - cache計算はsupercomputerを用いて、アーティストが非力なdesktop computerでリアルタイム性の高いCG生成を見ながら作業している
- 2000年に試したNeural Network
  - そして、QiitaのCNN/Deep Learning関連記事
- 前々からsupercomputerの結果をもっと有効利用できないかと考えてきたこと
- TensorFlowの転移学習
  - まだ言葉しか知らない知識レベル
  - http://qiita.com/7of9/items/88e9ae26017105436c28

上記のシナリオを実現するためのプロトタイプを作り、30人の何名かに連絡したいと思っています (連絡が取れ、かつ対応もいい人は1名(U国のYさん)、その人が多くの時間を費やして管理しているuser groupで広まると良い)。


## プロトタイプ作成に必要なもの

パラメータ(サイズ、化学組成、形状、入射光の方向、波長など）の値が様々な場合での計算結果を元にDeep Learningをする。

多次元補間と同等のことをすることになるのだろうか。
多次元補間用のテーブルと学習結果、どちらを保存するほうが得策かというのも検討事項。

つまりは多次元関数を学習することになり、そのfirst stepとしてsine curveを近似しようとしている。

## sine curve近似の進捗

誤差は0.01程度になりました。
http://qiita.com/7of9/items/7e45a69c822900a80c67
weightとbiasをファイル出力して、別プログラムからも再現できるようになりました。
http://qiita.com/7of9/items/ce58e66b040a0795b2ae

ただし、Fully connected neural networkを使っているだけで、近年のDeep Learningの研究で得られた事項はまだ使っていない状況です (TensorFlowという良いツールは使っています)。

sine curveやPower Loadなどの関数を近似する方法としてRNNのLSTMもあると認識しています。
http://qiita.com/7of9/items/d4fc540c1dc92f2f0c85
http://qiita.com/7of9/items/11500a5c26d4c8828062

RNNやLSTMを自分が理解して使えるようになるにはまだしばらくかかりそうです。
RNNやLSTMを使わなくても10倍くらい高速化できれば、それはそれで影響力があるとも考えています。
(とりあえず誤差0.01程度で近似できたので、それを使って様子をみます)
(RNNやLSTMは「時系列の次の値」(forecast)を得られる、という特徴を持つようで、それは自分が今行いたいこととは違うかもしれない。勾配消失問題など関係しそうな時に考えるかもしれない。)

## 対象コード

ADDAというコードにより計算できる結果を学習しようと考えています。

関連記事はADDAタグで整理しています。
http://qiita.com/tags/ADDA
(一方でDeep Learning関連の試行錯誤は[borgWarpタグ](http://qiita.com/search?q=tag%3AborgWarp)にまとめています）

ADDAタグの方はいずれU国のYさんに連絡するため、英語で書いています。
また、他の29名および270名も対象としているので英語です。

## おわり

上記を実現しようとして作業中です。
性能が出るかわかりませんが、プロトタイプ完成が一区切りになります。

他にやりたい電子工作などはスポット的作業はするかもしれませんが、基本的にはこちらの作業を優先します。こちらの作業が行き詰った時は他のことをします。
本業はこちらの作業とは無関係のため、空き時間(週10時間ほど)で進めていきます。

。
。
。
到着した[Amazon Dash Button](http://qiita.com/tags/AmazonDashButton)をどう使うか。
Scrapy Cloudでスクレイピングした成果物をS3にアップロードする

## はじめに
以前、勉強目的で、[AWS lambda + API Gateway で郵便番号検索APIを作ってみた](http://qiita.com/imunew/items/85af754703266ec1c592)のですが、その郵便番号データは`Scrapy`でスクレイピングし、`S3`にアップロードして利用していました。
今回は、そのプロジェクトを`Scrapy Cloud`にデプロイして定期スケジュール実行するまでにハマったポイントについて書きます。

`Scrapy Cloud`については、下記のURLを参考にしました。

- [Scrapy + Scrapy Cloudで快適Pythonクロール+スクレイピングライフを送る - Gunosyデータ分析ブログ](http://data.gunosy.io/entry/python-scrapy-scraping)
- [Pythonでスクレイピング - Scrapy入門最初の2歩目 - Qiita](http://qiita.com/ttomoaki/items/05d3dc104a695f939d63)

## 全体のワークフロー
全体のワークフローを図にすると下記のようになります。

![jp-zip_scrapy構成図.png](https://qiita-image-store.s3.amazonaws.com/0/26422/efa17a37-70b7-acaa-f1f7-0e3568e37a13.png "jp-zip_scrapy構成図.png")

## `scrapinghub`にデプロイするまで
`scrapy`のプロジェクトを作成してから、`scrapinghub`にデプロイするまでは、下記のような流れになります。

- scrapyプロジェクトを作成
  - `$ scrapy startproject {your project}`
- ローカルで実装
- ローカルでスクレイピングしてみる
  - `$ scrapy runspider {spider_file.py}`
- `scrapinghub`にデプロイ
  - `$ shub deploy` 

### `scrapinghub`でジョブを実行したときにハマったこと
`scrapinghub`にデプロイするまでは、順調だったのですが、`scrapinghub`でジョブを実行したときにいくつかハマったポイントがありました。

## botoは2系をサポート
AWSの操作には、[boto](https://github.com/boto/boto)を使いますが、`Scrapy Cloud`であらかじめインストールされているのは`boto`(v2)なので、注意が必要です。

- [Supported libraries on Scrapy Cloud / Knowledge Base Forum / Scrapinghub](https://support.scrapinghub.com/topics/727-supported-libraries-on-scrapy-cloud/)

### boto3を追加インストール（2016-12-19更新）
`scrapinghub.yml`に`requirements_file`を指定すれば、必要なライブラリをインストールできるので、boto3を利用することができます。

- [Scrapy Cloud — Scrapinghub documentation Dependencies and External Libraries](https://doc.scrapinghub.com/scrapy-cloud.html#dependencies-and-external-libraries)

デプロイ時に`requirements_file`が正常に処理されれば、`Code & Deploys`の`requirements`にて、追加インストールされたライブラリを確認することができます。

![requirements.png](https://qiita-image-store.s3.amazonaws.com/0/26422/ce775adf-06c8-07fd-6135-e95e5ea06ac1.png "requirements.png")


## AWSの認証情報をどうするか
AWS認証情報は、`Spider Settings` -> `Spider settigns` にて、下記のように設定値を登録します。

![scrapy_settings.png](https://qiita-image-store.s3.amazonaws.com/0/26422/532e7a6d-4c3b-a284-4b69-bb768e2b5a84.png "scrapy_settings.png")

コードからは下記のようにアクセスします。

```python
from scrapy.conf import settings

s3 = boto.connect_s3(settings['AWS_ACCESS_KEY_ID'], settings['AWS_SECRET_ACCESS_KEY'])
```

- https://doc.scrapy.org/en/latest/topics/settings.html#built-in-settings-reference

ローカルで確認する場合は、`settings.py`に、設定値を記述します。
ただし、`~/.aws/credentials`に認証情報が存在する場合は、設定値の記述は不要です。

```settings.py
AWS_ACCESS_KEY_ID = 'xxxxxx'
AWS_SECRET_ACCESS_KEY = 'xxxxxx'
```

## 課題
- `S3`へのファイルアップロードが極端に遅く、スクレイピングに約20分かかっている
  - 勉強目的なので、気にしなくてもいいのだが、何とか改善したい
- 郵便番号データは毎月１度は更新されている
- 郵便番号データが更新された場合に、`AWS Lambda`側のAPIも自動的に最新のデータを参照するようにしたい
  - 現状、郵便番号データの更新年月日をバージョン情報として、ステージ変数で管理している
  - `S3`へのアップロードが完了した後で、ステージ変数を更新したい

## おわりに
はじめは、APIだけでなく、Scrapyプロジェクトも`AWS Lambda`で動かそうとしていました。
しかし、ソースコードをライブラリも込みでZIPファイルに圧縮してアップロードしなくてはならず、結果として、うまく動かせなかったので、素直に`Scrapy Cloud`にデプロイしてみました。

[ボット・クローラー Advent Calendar 2016](http://qiita.com/advent-calendar/2016/bot)にも招待されましたので、そちらでも、`Scrapy Cloud`を使って何かボットを作って記事にしようと思います。

ではでは。
VueJS Migration from 1.0 to 2.0

## はじめに
[VueJS Advent Clendar](http://qiita.com/advent-calendar/2016/vue) の17日目です。VueJSの1.0から2.0へMigrationした話をします。

## VueJSに至る道
AngularJS便利そうだけど色々覚えるの面倒くさいしJSONのデータレンダリングする機能だけ欲しい! と思って色々調べてみたらVueJSなら簡単そう、となって使ってるだけな奴。ちゃんと比較したりVueJSの機能全て把握してるわけではない。

とか適当抜かしてたら、VueJS Calendarでも結構な人が同じようなこと言ってて安心した。

## 情報源
とりあえず最小限読むべき公式の情報源。こんなブログ読んでる場合ではない。

[Migration from v1.0(公式)](https://vuejs.org/v2/guide/migration.html)

[Migration from v1.0(日本語公式)](https://jp.vuejs.org/v2/guide/migration.html)

とは言うものの滅茶苦茶多くて読み切れてない←

あと便利なmigration toolが出ている。全部やれば完全に動く訳は勿論無いが、最小限は出してくれる。



## やったこと
自作ゲーム、[TrainStampRally](https://train.ponkotuy.com/) がv1.0で書かれているので、とりあえずv2.1.5に上げて、動かなかった部分を適宜修正した。オープンソースでコードはこちら

https://github.com/ponkotuy/train-stamp-rally

### Attribute内に{{value}}を使ってるやつ
動かなくなってた。素直にv-bindを使おう。

```coffeescript:before
<a href="/{{ category }}/index.html">
```

```coffeescript:after
<a :href="'/' + category + '/index.html'">
```

でもなんか読み辛くなるし、個人的にHTML内にソースコード書くのどうよ、っていう派閥なのでびみょ。ただ複数のやり方が許容されているのは良くないという意見もわかる。

### ready, compiled→mounted

https://vuejs.org/v2/guide/migration.html#ready-replaced

readyはreplaceされてmountedになり、`this.$nextTick`で囲えばいいのか…？VueJSのHook系メソッド難しくてイマイチ分かってない。

### v-forの仕様変更
その1。idxの順番が変わった。

```:before
v-for="idx, elem in elements"
```

```:after
v-for="elem, idx in elements"
```

既存のmapやforEachへの追従。寧ろ最初からこうしておけよ。

その2。v-forに数値を渡すときの値が0-indexedから1-indexedに。つまり `v-for="idx in 10"` の結果が0..9から1..10に。クソみたいな変更だ。

### $indexの廃止
```
v-for="elem, idx in elements"
```

とか書いてidxを使うように。

### 事前コンパイル
Vueが実行前に事前でコンパイルをするようになったらしく、文法的に間違ってる奴とかがエラー出るようになった。今まではとりあえず動いてしまっていたので、そゆのがあればUpdateで死ぬ。とはいえこれ、メリットばかりではなく…(次に続く

### なんかよくわからん問題
```coffeescript
data:
  train: null
methods:
  getTrain:
    @train = getJson()
```

という手法を多用していたのだが、これが幾らかのパターンでnullエラーが出るようになった。HTML側で```train.speed.toFixed(0)```などと最後にtoFixedを呼んだりするときにエラーが出る。よくわからん。とりあえずtoFixed(0)を呼ぶだけのmethodを作って解決している。良く分からないけど、事前コンパイルの弊害という認識でいる。

### deleteメソッド
deleteメソッドが予約語に近い扱いであることを知らなくて、deleteっていう名前のメソッドを定義していたのだが、前は問題なく動いていたのだが動かなくなった。まぁこれは予約語使ってる奴が悪い。

### typeahead.jsとのコンフリクト
typeahead.jsというinput要素に対しautocompleteを提供するライブラリがあるのだが、こいつがうまく動かなくなった。具体的には補完しても補完前の状態でmodelの変数に束縛されている(VueJSが変更を検知できない)、という挙動を示す。全く良く分からんので、~~補完したときにmodelを書き換えるイベントを定義して解決した。~~全体的にこわれててどうしようもなかったので、ライブラリ置き換えを検討中。

AngularにしてもVueJSにしても、見た目変わってるのに変数変わってないという問題が、このタイプのライブラリ多い気がする。

## まとめ
わりと小さいプロダクトでも結構変更点が多く、バッドノウハウを多用していたのもあって、正直しんどかった。このレベルの修正が頻繁に要求されるのはしんどいし、0-indexedから1-indexedへの変更とか実にどうでもいい破壊的変更とかもあって、VueJSの変更方針には賛同しかねるし別の手段を考慮した方が良いのでは、という気持ちが高まりつつある。むかしはよかった。(老害
Gebでいきいき塾のページを自動化してみた

# はじめに

これは[Geb Advent Calendar 2016](http://qiita.com/advent-calendar/2016/geb)の16日目の記事です。
前日は[Gebで別タブ遷移を自動化する](http://qiita.com/PoohSunny/items/24c431c4f0c0f39db1ba)でした。
今日は私もサンプルコード書いてみた！　の話です。

# Gebで簡単な自動化スクリプト書いてみた！
[いきいき塾 第8回「いきいき ✕ 忘年会」](https://rd-lesson.doorkeeper.jp/events/52783)でGebがらみのLTしてきました。
デモでDoorKeeperのいきいき塾のページの自動化をしてみたので、シェアします。

当日のスライドは[こちら](https://speakerdeck.com/poohsunny/kodonisi-igachuan-waru)です。
LTで利用したコードは[こちら](https://github.com/PoohSunny/ikiiki-juku)にあげています。

本当はもっといい感じにかけると思うのだけど、それはまた。
ゆるふわカワイイ*scratch*バッファ

みなさまEmacsを起動してる頃ですが[.emacs Advent Calendar 2016](http://qiita.com/advent-calendar/2016/dot-emacs)です。

@kiwanamiさんが[Emacsの起動画面のカスタマイズについて](http://qiita.com/kiwanami/items/d10fac42d30a14c6c28d)を書いてくださいましたが、私は`*scratch*`に拘ってます。

## `*scratch*`バッファとは何か

Emacs起動時に最初から作られるバッファのひとつです。“scratch”は「書きなぐる」みたいな意味で、ファイルを作るまでもない適当な下書きみたいなのを利用します。

## Emacsを起動したあとの`*scratch*`のようす

<img width="591" alt="*scratch* バッファのようす" src="https://qiita-image-store.s3.amazonaws.com/0/4121/97665524-29eb-5cd3-fc1d-6fed47b3fb32.png">

## 私はどうするか

こんな感じの函数を定義するじゃろ。

```init.el
(defun my/insert-tetosan ()
  "Kimiwa jitsuni bakadana."
  (with-current-buffer "*scratch*"
    (goto-char (1- (point-max)))
    (insert "
;; 　　　　　 　r /
;; 　 ＿＿ , --ヽ!-- .､＿
;; 　! 　｀/::::;::::ヽ l
;; 　!二二!::／}::::丿ハﾆ|
;; 　!ﾆニ.|:／　ﾉ／ }::::}ｺ
;; 　L二lイ　　0´　0 ,':ﾉｺ
;; 　lヽﾉ/ﾍ､ ''　▽_ノイ ソ
;;  　ソ´ ／}｀ｽ /￣￣￣￣/
;; 　　　.(_:;つ/  0401 /　ｶﾀｶﾀ
;;  ￣￣￣￣￣＼/＿＿＿＿/
")))
```

[init-open-recentf](https://github.com/zonuexe/init-open-recentf.el)を使ってる場合は、これを`init-open-recentf-before-hook`に追加してやるだけで良いのでカンタン。

```init.el
(add-hook 'init-open-recentf-before-hook #'my/insert-tetosan)
(init-open-recentf)
```

そんな怪しいもん入れたくねえよってひとも、これでいいんじゃないかと。

```init.el
(advice-add 'command-line-1 :after #'my/insert-tetosan)
```

## AAを選ぶ

[やる夫AA録2](http://yaruo.b4t.jp/)には、けっこういろんなキャラクターのアスキーアートがございますので、小さいものを自分の環境でずれないように加工すれば良いんじゃないですかね。
BrowserSyncコマンド（エイリアス）をつくろう

※ BrowserSyncの細かい解説はしません。

※ Macとか向け
※ Winでもできますがググって下さい。

# 便利なBrowserSync
Webサイトコーディングでとても面倒なのが、コードをひとしきり書いた後の
ブラウザに移動して更新ボタンをポチること。

GulpなどのタスクランナーでBrowserSyncを使ってこの操作を自動化してる
人も多いと思いますが、さくっとHTMLを書きたいときわざわざ `gulpfile.js` を書くのもぁ…と思います。

# Command Line

BrowserSyncの[サイト](https://browsersync.io/docs/command-line)をみればわかりますが、実は実行にはGulpやGruntは必要ありません。
Command Line = 黒い画面からコマンドを入力することで自動更新入りのローカルサーバーが手には入ります。

## コマンド

私がよく使うコマンドは以下のものです。

```bash
browser-sync start --server --files "./**/*.html" --files "./**/*.css" --files "./**/*.js"
```

これは

* コマンドを入力したディレクトリでローカルサーバーを起動
* ディレクトリ階層化に含まれるHTML/CSS/JavaScriptファイルを監視し、更新があったらブラウザを更新

という意味を表しています。

BrowserSyncの終了には `Ctrl + c` を入力します。

JavaScriptやSASSなどのコンパイルが必要なければ十分すぎる内容ですね。

つまりコレを常に暗記すればOK…

__ってめんどくせぇよ！！！__

# エイリアス

僕らの使っているぱそこんには `エイリアス` という長いコマンドを短くするための仕組みが備わっています。
あなたもドヤ顔で「エイリアス…エイリアス…」ぶつぶつつぶやいてるプログラマを、一度みたことはあるんじゃないですかね。

例えば「ホイミ」と唱えるとケアルラ・プロテス・ヘイストがかかるようにするようなものです。

# ェィリアス

ではエイリアスはどうやって作ることができるのでしょうか。
Macでは `~/.bash_profile` というファイルをゴニョゴニョすれば良いみたいです。

ターミナルを開き、以下のようにして、 `~/.bash_profile` に記述を追加して下さい

```bash
vi ~/.bash_profile

alias bs='browser-sync start --server --files "./**/*.html" --files "./**/*.css" --files "./**/*.js"'

```

viエディタに蕁麻疹が出る？がんばってください。
それか隣の人に土下座して書いてもらいましょう。

ごちゃごちゃ書いてますが、下のようなことを書いています。

```bash
エイリアス名=`登録するコマンド`
```

記述が終わったらターミナルを再起動しましょう。

# 使用法

おもむろに編集したいサイトのディレクトリをターミナルで開き、
以下を入力しましょう。

```bash
bs
```

ブラウザが立ち上がり、サイトが表示されればOKです。
テンション上がってきた。

以上です。
editorvr

本日EditorVR初めてリリースされました。

https://blogs.unity3d.com/2016/12/15/editorvr-experimental-build-available-today/

その勉強をブログしてみます。

ダウンロードし、インストールします～～。

![evr.png](https://qiita-image-store.s3.amazonaws.com/0/35681/c1a65763-cf24-b7c4-3572-866a412cf1c5.png)


![import.png](https://qiita-image-store.s3.amazonaws.com/0/35681/c9135da9-b859-6b44-a8d2-0224fc90d6de.png)
ブラックリスト(DNSBL)の仕組みと掲載を防ぐ方法

これは[SendGrid Advent Calendar 2016](http://qiita.com/advent-calendar/2016/sendgrid)の16日めの記事です。
昨日は[@shibayan](https://twitter.com/shibayan)の、[SendGrid のアカウントを環境ごとに使い分ける](http://blog.shibayan.jp/entry/20161215/1481807742)でした。サブユーザはまじ便利なので絶対使った方がいいです。

[レピュテーション](http://qiita.com/nakansuke/items/cbdf3a3ba130431be466)、[エンゲージメント](http://qiita.com/nakansuke/items/e6a3e796aab4dde3fde9)、[IPアドレス](http://qiita.com/nakansuke/items/e26f44103e9a1dda366f)に続いて、今日はブラックリストについて説明します。

## そもそもブラックリストってなんぞ
「ブラックリスト」、よく聞く言葉だと思いますが、のってしまうとメールが届かなくなるやばいリスト、というなんとなくイメージを持っているだけという方は多いのではないでしょうか。大きく分けて以下の2種類が存在します。
## DNSBL
一般的にブラックリストと言うと[DNSBL](https://ja.wikipedia.org/wiki/DNSBL)のことを指し、スパムの送信元のIPやドメインをリスト化して保有しているISPとは別の第三者サービスのことを意味しています。メールの送信リクエスを受けた宛先サーバは、DNSBLに問合せをして、送信元IPアドレスやドメインが掲載されているかどうかを確認します。その後の判断は、宛先サーバ次第ではありますが、拒否したり、スパムフォルダに入れたり、Inboxに入れたりします。

DNSBLで最も有名なものは[SPAMHAUS](https://www.spamhaus.org/)で、こいつに掲載されてしまうとあらゆる宛先から受信を拒否されてしまうほどの強力なものになります。

![spamhaus_dnsbl_diagram.gif](https://qiita-image-store.s3.amazonaws.com/0/24785/e6d32833-c926-6e72-551d-a399b331b9f2.gif)
source: https://www.spamhaus.org/whitepapers/dnsbl_function/

## 各ISPが保持しているブロックリスト
DNSBLのようにグローバルで使われるものに加え、各ISPがレピュテーションに応じて受信するかどうかを判断する基準として保持しているブロックリストもあります。

SendGridの立場からよく見るのがMSのメールサービス（hotmail, outlook, liveなど）はプアなレピュテーションの状態で大量に送信してしまった送信者をブロックリストに掲載してその後の受信を拒否するということがあります。これは、そのISPだけで有効で、他のGmailなどでは問題なく受信が可能です。

これらの各ISPが保持するブロックリストはある意味特殊なので、今後の話は、DNSBLに絞って進めます。

## 何をしたらブラックリストに掲載されるのか
ブラックリストに関しては[こちら](https://sendgrid.kke.co.jp/blog/?p=572)の記事で説明してますので、詳細はそちらをご確認ください。
で、その中に、

*ブラックリストに登録されてしまう主な原因のひとつは、迷惑メール報告数の多さです。*

とありますが、経験上およびSendGridのコンプライアンスチームの話によると、DNSBLに記載されてしまうのは、十中八九、

**スパムトラップにメールを送り続けてしまうこと**

が原因であるように思われます。
スパムトラップとは、ISPやDNSBLが用意したスパマーをあぶり出すためのメールアドレスで、使われなくなったアドレスを罠として残しておくのが一般的なようです。詳しくは[こちら](https://sendgrid.kke.co.jp/blog/?p=4198)

## どうやって防ぐ？
一度スパムトラップが保有してしているリストに紛れ込んでしまうと本当に厄介で、それを取り除かなければいずれはブラックリストに掲載され、何度削除をしてもらってもいずれ掲載され、掲載⇒削除を繰り返すことになってしまいます。
そのため、ブラックリストに掲載されるのを防ぐには、リストからスパムトラップを取り除く必要があります。

#### Re-confirmation campaign(再確認メール)
スパムトラップをリストから除去する方法で一番有効なのがこのRe-confirmation campaignです。これは、読者に対して、メールの購読を希望するかを再確認するメールで、希望するとした購読者以外のメールアドレスを全て削除することで、スパムトラップを一掃します。

スパムトラップは開封も、クリックもすることがないので、開封/クリックがあったリストはそもそも有効なアカウントとして、それ以外に対してRe-confirmation campaignを実施するのが有効です。

かなり痛みを伴う方法ですが、やむをえないですね。まぁ、いくら送っても読むことがない読者に送り続けることは無意味なので、エンゲージメントが高い読者に絞ることができたと、ポジティブに捉えるのがよいと思います。

## まとめ
この一連の記事で一貫しているのが、**適切なメッセージを、適切な人に、適切な時に、適切な頻度で**送るのが一番ということです。

日々エンゲージメントをモニタリングしていれば、ブラックリストに掲載されることもありません。
「ちょくちょくブラックリストに掲載されちゃうんですが、SendGridで送れば改善されますか」というお問合わせもよくいただくのですが、同じプラットフォームを利用している不届き者の影響を受けた掲載でないのであれば、リストをクリーンにする以外回避する方法はありません。

メルマガなんて同じメールをどがっと一斉に送ればいいんでしょ(batch and blast)という時代はとうに終わりました。今後事故らないためにも、今回紹介したような対策を日頃から取りながら健全な送信を心がけてください。

**Happy Sending!!**
アフィン変換/平行移動だって変換行列で(Excelで）

'①もっと短くなりますか？
'②vbaのworksheet.function.minverseでfunctionの書き換えを探しています。

'XY座標変換,座標変換（移動、回転）,二点法変換,2点間変換（または、へルマート変換）
'http://d.hatena.ne.jp/Zellij/touch/20120523/p1
'(参考)アフィン変換/平行移動だって変換行列で
'http://qiita.com/yuba/items/7fb6a49adfda8fa466d8
'(参考)Excelの計算式をテキストファイルに出力してみた
'以下Excelのデータ説明
'関数の入力時,Ctrl+Shift+Enterが必要です。
'設定データ:座標系1(0,0)→座標系2(0,1)-----------------------------------
  1行  1列目: 0
  1行  2列目: 0
  1行  3列目: 0
  1行  4列目: 1
'設定データ:座標系1(1,0)→座標系2(0,0)-----------------------------------
  2行  1列目: 1
  2行  2列目: 0
  2行  3列目: 0
  2行  4列目: 0
'cos,sin,tx,tyの計算------------------------------------------------------
  4行  1列目: =A1
  4行  2列目: =-B1
  4行  3列目: 1
  4行  4列目: 0
  4行  6列目: =MINVERSE(A4:D7)
  4行  7列目: =MINVERSE(A4:D7)
  4行  8列目: =MINVERSE(A4:D7)
  4行  9列目: =MINVERSE(A4:D7)
  4行 11列目: =C1
  4行 13列目: =MMULT(F4:I7,K4:K7)
'
  5行  1列目: =B1
  5行  2列目: =A1
  5行  3列目: 0
  5行  4列目: 1
  5行  6列目: =MINVERSE(A4:D7)
  5行  7列目: =MINVERSE(A4:D7)
  5行  8列目: =MINVERSE(A4:D7)
  5行  9列目: =MINVERSE(A4:D7)
  5行 11列目: =D1
  5行 13列目: =MMULT(F4:I7,K4:K7)
'
  6行  1列目: =A2
  6行  2列目: =-B2
  6行  3列目: 1
  6行  4列目: 0
  6行  6列目: =MINVERSE(A4:D7)
  6行  7列目: =MINVERSE(A4:D7)
  6行  8列目: =MINVERSE(A4:D7)
  6行  9列目: =MINVERSE(A4:D7)
  6行 11列目: =C2
  6行 13列目: =MMULT(F4:I7,K4:K7)
'
  7行  1列目: =B2
  7行  2列目: =A2
  7行  3列目: 0
  7行  4列目: 1
  7行  6列目: =MINVERSE(A4:D7)
  7行  7列目: =MINVERSE(A4:D7)
  7行  8列目: =MINVERSE(A4:D7)
  7行  9列目: =MINVERSE(A4:D7)
  7行 11列目: =D2
  7行 13列目: =MMULT(F4:I7,K4:K7)
'変換行列の表示------------------------------------------------------------
  9行  1列目: =M4
  9行  2列目: =-M5
  9行  3列目: =M6
'
 10行  1列目: =M5
 10行  2列目: =M4
 10行  3列目: =M7
'
 11行  1列目: 0
 11行  2列目: 0
 11行  3列目: 1
'入力データ1:座標系1(0,0)→出力データ座標系2(x,y)---------------------------
 13行  1列目: 0
 13行  2列目: 0
 13行  3列目: 1
 13行  5列目: =TRANSPOSE(MMULT($A$9:$C$11,TRANSPOSE(A13:C13)))
 13行  6列目: =TRANSPOSE(MMULT($A$9:$C$11,TRANSPOSE(A13:C13)))
 13行  7列目: =TRANSPOSE(MMULT($A$9:$C$11,TRANSPOSE(A13:C13)))
'入力データ2:座標系1(0,1)→出力データ座標系2(x,y)---------------------------
 14行  1列目: 1
 14行  2列目: 0
 14行  3列目: 1
 14行  5列目: =TRANSPOSE(MMULT($A$9:$C$11,TRANSPOSE(A14:C14)))
 14行  6列目: =TRANSPOSE(MMULT($A$9:$C$11,TRANSPOSE(A14:C14)))
 14行  7列目: =TRANSPOSE(MMULT($A$9:$C$11,TRANSPOSE(A14:C14)))
（メモ）rst2pdfでreStructuredTextをPDFに変換する

# 背景

- reSTで書いたドキュメントをPDFで出力したい
    - 日本語にも対応させたい


# 動作環境

rst2pdf on Amazon Linuxでやってみます


# rst2pdf

## 必要なパッケージのインストール

```bash:コマンド
sudo yum install libjpeg-devel zlib-devel gcc
```


## rst2pdfのインストール

```bash:コマンド
sudo easy_install rst2pdf
```


## フォントのインストール

2016/12/16時点の最新版を利用します。

### VLゴシックフォント

```bash:コマンド
wget http://jaist.dl.sourceforge.jp/vlgothic/62375/VLGothic-20141206.zip
unzip VLGothic-20141206.zip
cd VLGothic
sudo cp *.ttf /usr/share/fonts/
fc-cache
cd ~
```


## フォントの設定

```bash:コマンド
cat << EOF > ja.json
{
    "fontsAlias" : {
        "stdFont": "VL-PGothic-Regular",
        "stdBold": "VL-PGothic-Regular",
        "stdItalic": "VL-PGothic-Regular",
        "stdBoldItalic": "VL-PGothic-Regular",
        "stdMono": "VL-Gothic-Regular",
        "stdMonoBold": "VL-Gothic-Regular",
        "stdMonoItalic": "VL-Gothic-Regular",
        "stdMonoBoldItalic": "VL-Gothic-Regular",
        "stdSans": "VL-Gothic-Regular",
        "stdSansBold": "VL-Gothic-Regular",
        "stdSansItalic": "VL-Gothic-Regular",
        "stdSansBoldItalic": "VL-Gothic-Regular"
    },
    "styles" : [
        ["base" , {
            "wordWrap": "CJK"
        }],
        ["literal" , {
            "wordWrap": "None"
        }]
    ]
}
EOF
```

JSONファイルの検証をしましょう。

```bash:コマンド
jsonlint -q ja.json
```


jsonlintのインストールは以下の手順で

```bash:コマンド
sudo yum install npm --enablerepo=epel -y
sudo npm install -g jsonlint
```

## reSTファイルの生成

こちらのブログより拝借しました＆全体的に参考にさせて頂きました。

[(8日目) Sphinx から PDF を生成してみよう (rst2pdf 編)](http://tk0miya.hatenablog.com/entry/20111208/p1)

```bash:コマンド
cat << EOF > index.rst
=============================
rst2pdf sample documentation
=============================

これは rst2pdf を利用するサンプルです。

blockdiag の紹介
=================

blockdiag シリーズは以下のパッケージから構成されています。

* blockdiag
* seqdiag
* actdiag
* nwdiag
   * nwdiag
   * rackdiag

blockdiag パッケージとコマンド群
=================================

もちろん表も書けます。

============  =========
パッケージ名  コマンド
============  =========
blockdiag     blockdiag
seqdiag       seqdiag
actdag        actdiag
nwdiag        nwdiag
              rackdiag
============  =========

EOF
```


## PDFファイルの生成

```bash:コマンド
rst2pdf -s ja index.rst
```

# 所感

- インストールは簡単
- デザインに制約（がありそう？）


以上
ArduinoをNode.jsで制御してLチカをする

今回はArduinoを制御してみたいと思います。

ただArduinoってC言語風のArduino言語で書くし、工学系のガチな人たちがいじるイメージ。。。

でも実はweb系の人でもいじれるっぽいんです！それがこちら :tada:


http://nodebots.io/

![](https://i.gyazo.com/40abe9fda672757b0ebc14458905e720.png)

おおお、「Node」なんか聞いたことあるぞ。

そうです、Node.jsです。

**johnny-five** というライブラリを使うとNode.jsでArduinoを制御できるそうです。

これはweb系の人には朗報ですね！
しかも、、、！

![](https://raw.githubusercontent.com/tableflip/nodebot-workshop/master/screenshot.png)
出典: [tableflip/nodebot-workshop](https://github.com/tableflip/nodebot-workshop)より

おおお、「なんか教科書っぽい」

そうです、Node.jsに関連するソフトウェアを無料で学習できる **[Node School](https://nodeschool.io/ja/)** というオープンソースの学習ツールです。

このNode Schoolがjohnny-fiveでArduinoの制御方法を勉強できる学習ツールを出しているんです。
それがこちら。https://github.com/tableflip/nodebot-workshop

なんか感心するほど、ほとんど揃ってますねw

あとは、実際に制御するArduinoが必要なわけですが、もちろんありました。

https://dotstud.io/projects/nodebots-seeeduino-for-beginners/

![](https://i.gyazo.com/74f697f3a78b0d30b8865b579a049bc5.png)
出典: [NodeBot kit for Beginners ver.JP | dotstudio](https://dotstud.io/projects/nodebots-seeeduino-for-beginners/)より

[購入ページ](https://dotstud.io/projects/nodebots-seeeduino-for-beginners/)でセットを買うことができました。


これで必要なものが揃ったので早速始めたいと思います。


# 環境設定

ではサクサク始めます


```shell
$ mkdir nodebot
$ cd nodebot
# グローバルにnodebot-workshopをダウンロードするのは嫌だったのでローカルにダウンロードします
$ npm init -y
$ npm i -S nodebot-workshop
$ nodebot-workshop
```
こういう画面が出力されましたか？もし英語になった場合は、言語を選択できるので日本語に設定しましょう。カーソル↑↓またはjkで上下に移動できます。
![](https://i.gyazo.com/b6a0d5b5ea7d2b589426162c0167ddee.png)

これで環境設定は完了ですね。nodebotが手元にある人はArduinoをUSBコードでPCに繋げてください。

# Lチカ

ではLチカをやってみます。

**Lチカ** を選択すると以下のようなmarkdownが出力されました。用意周到ですねw
あとはこれを読んでやってみましょう。すごい丁寧に誘導されているので大丈夫でしょう！ドキュメントもありますし

![](https://i.gyazo.com/912657473e003d5f9a02d7e591b391a9.png)

コードを書けたら、一旦テストを実行しましょう。

```
$ nodebot-workshop verify l-chika.js

1481897226692 Device(s) /dev/cu.usbserial-FAKEID
1481897226715 Connected /dev/cu.usbserial-FAKEID
1481897227119 Repl Initialized
>> 回答をテストしています。お待ちください。。。
  ✓  Boardインスタンスが作成されました。

  ✓  LEDインスタンスが作成されました。

  ✓  LEDがpinに接続されました。

  ✓  LED is flashing once a second

  ✓  LED is flashing once a second

  ✓  Pin 2 was set to OUTPUT mode

  ✓  Pin 13 was turned on

  ✓  Pin 13 was turned off

  # おめでとう！ 「Lチカ」に対するあなたの回答は合格です！

  あと8個のチャレンジが残っています。 メニューを表示するには
  'nodebot-workshop' と入力してください。
```

こうなれば正解です！実際はこの検証が通らなくてもLチカはできましたw

一応回答を載せておきます。

```
var five = require('johnny-five');
var board = new five.Board();
board.on('ready', function() {
  var led = new five.Led(13);
  led.strobe(1000);
});
```

# おわり

こんな感じで結構気軽にマイコンを制御できるので、よかったらやってみてください！
僕は家で家族に年越しサプライズするために、黙々実装してますw
ではでは、良いお年を！ :tada: