OmniAICreator/Qiita-1.07M huggingface dataset:
cd コマンドの罠

シェルスクリプトでおなじみの cd コマンドですが、もしかするとあなたが思っているのとは違う動きをするかもしれません。今日はそんな「cd コマンドの罠」を紹介します。
(この記事の内容は [POSIX 規格 2016 年版の cd コマンドの規定](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/cd.html)に基づいて書かれています。)

# ハイフンで始まるディレクトリー名

これは cd コマンドに限った話ではありませんが、ハイフンで始まるコマンドライン引数はオプションとみなされます。例えば `cd "$dir"` と書いたとき、dir 変数の値がハイフンで始まっているとそれは移動先のディレクトリー名ではなくオプションとして扱われてしまいます。

ハイフンで始まるディレクトリー名なんて普通は避けるべきものですが、任意のディレクトリー名を扱える汎用的なスクリプトを書こうとする場合は注意が必要でしょう。

この問題を回避するには、手前に `--` (ハイフン二つ) を置いて `cd -- "$dir"` のようにします。

# シンボリックリンク

現在の作業ディレクトリーパスはいつも PWD という環境変数に入っています[^1]。PWD 変数はシェルが起動したときや cd コマンドを実行したときに自動的にセットされます。そして cd コマンドの引数として相対パスを指定したとき、それは PWD 変数が指すディレクトリーからの相対パスとして処理されます。

PWD 変数に入っているディレクトリーパスの中にシンボリックリンクが含まれている場合、cd コマンドに .. を指定してディレクトリーをさかのぼる際には注意が必要です。例えば /foo/bar が /hoge/fuga へのシンボリックリンクであり、/foo, /hoge, /hoge/fuga はどれもシンボリックリンクではない普通のディレクトリーであるとします。PWD 変数の値が `/foo/bar` の時、`echo > ../piyo` を実行すると /hoge/piyo にファイルが作られますが、`cd ..` を実行すると /hoge ではなく /foo に移動します。これは cd コマンドがデフォルトではシンボリックリンクを解決せず単なる文字列操作によって親ディレクトリーへのパスを計算するためです。

このように、cd でディレクトリーをさかのぼる際の移動先は元の作業ディレクトリーの真の親ディレクトリーではないことがあり、スクリプトの書かれ方によっては意図しないディレクトリーに移動する可能性があります。その後に続くスクリプトの内容や使われ方によっては本来読み書きしてはいけないファイルを読み書きするなどの動作が発生して脃弱性につながる恐れがあります。 特に、スクリプトが起動された時点で最初から PWD 変数にシンボリックリンクが含まれている可能性もあるので、スクリプトが起動された当初の作業ディレクトリーよりもさかのぼろうとするスクリプトは注意が必要です。

PWD 変数のシンボリックリンクを解決してシンボリックリンクが含まれないようにするには、cd コマンドに P オプションを指定して `cd -P ..` のようにします。

[^1]: あなたが PWD 変数を消さない限りは。

# CDPATH

CDPATH という変数が設定されている場合、cd コマンドの引数として指定される相対パスは CDPATH 変数の値が示すディレクトリーからの相対パスとして扱われます。例えば CDPATH の値を `/usr` にセットすると、現在の作業ディレクトリーがどこであっても `cd share` を実行すると /usr/share ディレクトリーに移動します。

スクリプトを実行する際に外部から自由に CDPATH 環境変数の値をセットできるようになっている場合、スクリプトの中で (現在の作業ディレクトリーからの相対パスで指定されたディレクトリーに移動するつもりで書かれた) cd コマンドが CDPATH 変数の影響で意図しないディレクトリーに移動する可能性があり、これも脃弱性の要因になり得ます。

この問題を回避するにはスクリプトの冒頭で `unset CDPATH` を実行して CDPATH 変数を削除します。(unset コマンドを実行する前に CDPATH 変数が存在しているかどうか確かめる必要はありません)

----

以上、とても怖い cd コマンドの罠の話でした。
明日の株式会社 ACCESS Advent Calendar 2017 記事は @shiromi さんです。
いちばん簡単なEmacsコマンド

Emacsを使ってるけどLispは書いたことがないとはよく聞きますが、ちょっとした処理をするのにEmacsコマンドを定義するのは有用なので、割と簡単めなものを紹介していきます ヾ(〃＞＜)ﾉﾞ☆

## コマンド

### そもそもコマンドとは何か

Emacsにおけるコマンドとは、コマンド定義の最初(引数または説明文字列の次)の場所に`(interactive)`と書かれた関数のことです。

このコマンドはキーバインドを割り当てるか、`M-x`で検索して実行することができます。

個人で利用するコマンドは[`init.el`とか`.emacs`とかのファイル](https://qiita.com/tadsan/items/a2018379ffaadf07a418)に雑に書いてやれば動きます。

### Lispってどう書けばいいの

そもそもEmacsの設定もあまり馴れてない場合は[Emacsを書く前のLisp - Qiita](https://qiita.com/tadsan/items/0d3a772f4b8fb733bf52)を読んでください。

### おてがるなコマンド

すごく簡単には、こんなEmacsコマンドを作るのはおてがるです。

 * ファイル(ディレクトリ)を開く
 * バッファに何かを入力する
 * 何かをコピペする
 * *外部コマンドを実行する*

今日の記事では、一番下の「外部コマンドを実行する」以外の、いちばん簡単なパターンを紹介します。

## ファイルを開く

Emacsでファイルをバッファとして開くのは`find-file`コマンドです。これは関数としても呼ぶことができます[^1]。

これはふだん<kbd>C-x C-f</kbd>で利用するコマンドです。いつもの<kbd>C-x C-f</kbd>は「**1**. ファイル名を検索(または新しく作成するファイル名を入力)して」「**2**. バッファを開く」の二段構成になってますが、実は`find-file`の本当の機能は「**2**. バッファを開く」の方です。

いつもお馴染みの「**1**. ファイル名を検索(または新しく作成するファイル名を入力)」を受け持つのは、実は`read-file-name`関数です。これを利用すれば、いつもと同じ操作感でファイルを開くことができます。

[^1]: すべてのEmacsコマンドが関数として利用できるわけではなく

### 特定のファイルを開く

`init.el`を開くだけのコマンドです。

```el
(defun my-find-file-init-el ()
  "init.elを開く"
  (interactive)
  (find-file "~/.emacs.d/init.el"))
```

いちばん最初のサンプルにふさわしい簡単さですね。自分用のコマンドなんでものは、この程度の雑さで良いでしょう。

### 特定のディレクトリでファイルを開く

ふつう`find-file`は、編集中のバッファ(ファイル)のあるディレクトリ(具体的には変数`default-directory`)のある場所から開かれますが、次のようなコマンドを定義することで、そのディレクトリからファイルを検索できます。

```el
(defun my-find-file-temporary-file-directory (filename)
  "ディレクトリ `temporary-file-directory' のファイルを開く"
  (interactive
   (list (read-file-name "Find files: " temporary-file-directory)))
  (find-file filename))
```

## コピペ

Emacsではコピペするには`(kill-new)`関数が利用できます。なんか物騒な名前ですが、Emacs用語でざっくり切り取りしてクリップボードに入れるのこと[^2]です。`(kill-new)`の引数として文字列を渡してやれば、雑にコピペができます。

[^2]: 正確にはキルリング(kill-ring)と呼ばれるものです。

GUI版のEmacsであれば、基本的には特別な設定をしなくてもデフォルトでOSのクリップボードと同期されます。端末からEmacsを利用する場合も、うまく設定すればOSのクリップボードと同期できるようです。([Emacs と Mac のクリップボードを共有する | Engineering My Life](https://yono05.wordpress.com/2011/11/20/emacs-%E3%81%A8-mac-%E3%81%AE%E3%82%AF%E3%83%AA%E3%83%83%E3%83%97%E3%83%9C%E3%83%BC%E3%83%89%E3%82%92%E5%85%B1%E6%9C%89%E3%81%99%E3%82%8B/))

### バッファのファイルパスをコピペする

`buffer-file-name`はバッファのディレクトリを含んだフルパス(など)が入った変数です。

```el
(defun my-copy-buffer-name ()
  "編集中のファイル名またはバッファ名をコピペする"
  (kill-new (or buffer-file-name
                (buffer-name))))
```

## insert

`(insert)`は現在のバッファに文字列を挿入する関数です。

### 現在時刻をインサートする

`(format-time-string)`を組み合せます。

```el
(defun my-insert-datetime-simple ()
  "現在の日時を挿入する YYYY-mm-dd形式
http://ergoemacs.org/emacs/elisp_datetime.html"
  (interactive)
  (insert
   (format-time-string "%Y-%m-%d %T")))
```

もうちょっと複雑にHTMLの[datetime形式](https://www.w3.org/TR/html51/infrastructure.html#dates-and-times)の文字列を入力するには、こうします。

```el
(defun my/insert-datetime-attr ()
  "
http://ergoemacs.org/emacs/elisp_datetime.html"
  (interactive)
  (insert
   " datetime=\""
   (format-time-string "%Y-%m-%dT%T")
   (let ((x (format-time-string "%z")))
     (concat (substring x 0 3) ":" (substring x 3 5)))
   "\""))
```

### まとめ

複雑なコマンドを構築するには面倒なこともありますが、ちょっとしたことをするコマンドを組み立てるのは意外といけます。

### 脚注
BitVisor を Grub 経由で起動するときの便利設定

# BitVisor Advent Calendar 1 日目
ですね!
今年も頑張って全部埋めましょう!

# 本題:
BitVisor の起動方法はいくつかありますが，その中で一番導入が楽でよく利用されるのが Grub による起動ではないかと思います．
しかし，Grub での起動は毎回毎回手で起動するエントリーを選択するのが面倒だという悩みがあります．
また，ssh などでリモートログインする環境ではなかなか使いづらいです．

実は，これらの問題は Grub の機能を用いて解決できます．
ですので，その方法について，以下で紹介します．

## BitVisor を起動した後に勝手にゲストOS を起動するようにしたい
BitVisor を起動したら，たいてい次は Linux などゲスト OS を選択することになる．
この作業を手でやるのはとても手間です．
これは，Grub における BitVisor の起動エントリーを設定することで実現できます．

例えば，BitVisor を起動した後に，'Ubuntu' という名前のエントリーを選択して起動したい時には，以下のようにエントリーの設定してみてください．
(エントリーの名前とは，Grub の画面でエントリー一覧に出るもので，menuentry で指定されているものです)

```
menuentry "BitVisor" {
        set next_entry='Ubuntu'
        save_env next_entry
        multiboot /boot/bitvisor.elf
}
```

上記の設定だと，BitVisor が起動すると，次回の起動は'Ubuntu'のエントリーがデフォルトで選択されている状態になります．

この状態で，BitVisor のエントリーをデフォルトにしておけば，手放しでGuest OS on BitVisor という環境で起動できて良いです．

## Reboot 時に次回 BitVisor を起動するか否かを選びたい

BitVisor をデフォルトエントリーにすると，いつでも BitVisor とともに Guest OS を起動できます．
ただ，BitVisor をデフォルトエントリーにした状態で，変な BitVisor をインストールしてしまうと，面倒なことになるかもしれません．(特に，リモート環境では)
そこで，Reboot 前に次回起動時に BitVisor を起動するか否かを選択できると素敵な気がします．
これは `grub-reboot` コマンドで実現できます．

Linux などの OS を Grub のデフォルトエントリーにしているときに，以下のようなコマンドをたたいて reboot するとよいです．

```shell-session
# grub-reboot 'BitVisor'
# reboot
```

こうすると，次回起動時は 'BitVisor' エントリーがデフォルトで設定された状態になります．

### entry の指定について
--------------
上記ではエントリーの指定をエントリー名で行いました．
しかし，エントリーの指定はエントリーの名以外にも，番号(上から何番目以下，0 からスタート) でも指定できます．

# おわりに
BitVisor を Grub で起動しているときの便利そうな技を紹介しました．
(BitVisor Advent Calendar 初日ですが，BitVisor の記事というより Grub の記事になってしまいました...)
イーサリアムの基本

個人の理解で書く

## イーサリアムとは
- ビットコインがブロックチェーン技術を証明できたので、ビットコインのソースをコピー・改造したいくつのコピーがでてきた
- そもそも、ビットコインでは Ruby on Rails 3 以前の状態みたいに、全部キレイにモジュール化されていないので、通貨以外のスマートコントラクトを作るのはやりづらい
- イーサリアムはそれを受け取って、ちゃんとモジュール化して、最初からスマートコントラクトのプラットフォームとして設計されている
- 更に、スマートコントラクトをチューリング完全

## スマートコントラクト
- 開発言語は、Solidity という JavaScript ライクな言語
- チューリング完全と言っても、機能とアクセスできるデータは結構制限されている
- スマートコントラクトをデプロイすること自体も１つのトランザクションである

### 疑問
- [ ] スマートコントラクトの中で使っている Mapping 系のデータはどこに保存されている？ブロックの中？
- [ ] 書き込みがある場合、ログを記録できそうが、どこで確認できる？
- [ ] １つのトランザクションの中で、カスタムデータの容量はどのぐらい？
VSCode のすゝめ

*職場でVSCodeにハマったので。*

こいつは Visual Studio から IntelliSence だけ抜き取った Sublime Text だ！
……まあ中身を考えるとむしろ Atom と言うべきなんだが。

真面目に考えるとむしろ「クッソ軽くなった Visual Studio」という表現が近く、テキストエディタとして見ると重いしやけに多機能。まあ、重いのは当然である。~~単なるテキストエディタがほしいなら sakura でいいし~~

# いいとこ
## "いつもの" 感あふれるショートカット
少なくとも **Windowsの民からすると極めて直感的だ**。エクスプローラや
F2ワンボタンでシンボル名のリファクタリング、F12で定義ジャンプ。
しかもタブはCtrl+Tabで移動しCtrl+Wで閉じることができ、挙句Alt+←で前に見ていたところに戻ることさえ出来る。これこれ、こういうのが欲しかったんだよ。これがポリモーフィズムだよ（なんか違うけど伝われ）。

## コントローラブル
もちろん (MSだし) 気に入らない動作はあるだろう。実際初期設定だと結構「お前マジかよ」な動作は多い (とはいっても、初期設定なら初期設定なりに使えはする) 。 
例えば、こいつにはプレビュー・モードという機能があって、何も考えずにファイルを開くとプレビュー・モードで開かれる。そしてどういうわけか、プレビュー・モードなタブで定義ジャンプなどやるとそのタブは上書きされてしまうのだ。~~ほんとなんで用意したんだこれ~~
しかし、設定ボタンから設定ファイルを呼び出し "workbench.editor.enablePreview": false と書き足して保存すれば、**それだけでもう解決する**。再起動すら不要だった。快適な設定変更だ。本当にMSか？
しかも**全体用の設定とWorkspaceごとの設定が別々に用意されている**！素晴らしいことだ。なんだってeclipseの設定はあんな冗談のような仕様なのだろう？

## カスタマイザブル
VSCodeはなんだかんだで機能的にはVSやeclipseの下位だ。そりゃ使用頻度の低い機能を片っ端から投げ捨ててコード書くことをまず考えたんだから当たり前だが、それはそれとして「やっぱこれは欲しい」なものは珍しくない。
しかし、こいつには Sublime Text よろしく (むしろ Firefox よろしく、というべきかもしれない) **Marketplace と Extension がある**。
もう好き放題にいじくり回せる。テーマ、アイコンから各所の機能に至るまで。……おっと、フォントは設定ファイルの方だからそっちを見ておくように。
（個人的には Code Outline, Japanese Word Handler, Material Icon Theme あたりは外せないと思っている）

# 誰におすすめ？
* 「**だぁーっおっもい！IntelliSense以外は全員消えろ！！**」って心のなかで（あるいは実際に）叫んだことのある人。
* MSが好きな人 (いるのか？)
* Windows慣れしてて、新しく覚えることが多いとめんどくさい人。
* Windowsメインでやってきたけど、これから先他OSで開発したい人 (Linux / Mac 用もあるよ！) 。
* Eclipseの重さと不安定さにブチ切れつつも、IntelliJを買う金はないしNetBeansはパッとしないし単なるテキストエディタは流石にダルい、な人。
* Workspaceごとに設定をコピーする作業に疲れた人。 

ただし、**JUnitやTomcatをいきなりサクッと使えるわけではない**のでそこだけは注意。
NodeList をマージする

`document.querySelectorAll()`の戻り値などで使われる`NodeList`オブジェクトですが、要素の追加メソッドが存在しないため、2つの`NodeList`オブジェクトをマージするには、ひと工夫が必要です。

```js
var div = document.querySelectorAll('div');
var span = document.querySelectorAll('span');
Object.setPrototypeOf( [ ...div, ...span ], NodeList.prototype ); // document.querySelectorAll('div,span') と同じ要素
```

何に使えるかはわかりませんが。
JavaScriptでCSV読み込み(ダブルクォート内でのセル内改行に対応)

javascriptでcsv読み込みのサンプルで
ダブルクォート内でのセル内改行したものにも対応したものが見つからなかったので作りました。

エクセルからテキストエディタにコピるとセル内改行したものはダブルクォートが付きますよね。
それに対応させましたので、セパレーターを`\t`としてコーディングしました。

※セル内でダブルクォートが入ったデータには対応してないです。いつか直すかも？

```js
function csvToArray(csvString) {
  var separator = '\t';
  var columnSize = csvString.split(/\r\n|\r|\n/)[0].split(separator).length;
  var chars = Array.from(csvString.replace(/\r\n|\r|\n/g, '\n'));
  var csvList = [];
  var list = [];
  var queteOpenFlg = false;
  var buf = "";
  for (var i = 0; i < chars.length; i++) {
    console.log(columnSize);
    if (chars[i] == '"') {
      queteOpenFlg = queteOpenFlg == false;
    } else {
      if ((chars[i] == separator || chars[i] == '\n') && !queteOpenFlg) {
        list.push(buf);
        buf = "";
        if (list.length == columnSize) {
          csvList.push(list);
          list = [];
        }
      } else {
        buf += chars[i];
      }
    }
  }
  console.log(csvList[0][0]);
  var csv = {};
  csv.dataList = [];
  for (var i = 0; i < csvList.length; i++) {
    if (i == 0) {
      csv.header = csvList[i];
    } else {
      csv.dataList.push(csvList[i]);
    }
  }
  return csv;
};
```
爆速エンジニアの勧め～まずは導入～

こんにちは！エイチーム引越し侍の加藤です！
Qiita Advent Calendar 2017の12月2日分を担当します！よろしくお願いします。

本日書こうと思う記事は、時期柄新卒ちゃんや新卒になろうとしている就活中の学生向け、もしくは伸び悩んでる素直な方向けですので、それ以外の方はそっ閉じしてください！

今日の記事は少し技術チックと言うよりかは、いったん立ち止まってもらって
仕事に対する向き合い方みたいな話になるので説教臭くなるかもしれません。ご注意を！

以下本記事の目次です。

# 目次
1. 爆速エンジニアとは？
2. 爆速のメリットとは？
3. 爆速エンジニアになるためには？
4. 調整力
5. 設計力
6. コーディング力

# 爆速エンジニアとは？
『課題解決』までの『スピードが圧倒的』であること

ここでいう課題とは
・新機能開発（もっと便利にしたい！）
・障害対応・バグ修正
・調査
・etc

# 爆速であるメリット
・PDCAが多く回せる
・評価が上がる
・開発以外のことに時間が掛けられる

エンジニアとしてもっとも成長できるのはPDCAを回すことだと思います。

# 爆速エンジニアに必要な要件
・タイピング力
・コーディング力
・設計力
・調整力

■タイピング力
文字やコマンドを入力する速さ、チャットでの入力もそう、そうそうCtrlをここにしてない人はかなり損しますよ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/146642/2cfd5d4d-8395-107d-b587-9bc7f57fd5f0.png)
※参照 https://qiita.com/shgkt/items/45f34b9130e3047f29e4
タイピング力を早くしようと思わないで爆速エンジニアになろうと思うな！
初期にエンジニア力を磨くためには多くのPDCAを回すべき。ソースレビューを何回も何回ももらうべき。

※経験を積んだエンジニアがタイピング力はいらないよねっておっしゃるのは下記の力がもうすでにありタイピング力で勝負しなくていいからです。

# コーディング力
効率のいいコーディングは、コーディング工数だけじゃなくテスト工数を削る。
コードは量を書けば書くほどテスト工数が必要なので、
いかにシンプルにコーディングできるかが重要。
そのためには関数やライブラリをたくさん知っておく必要があります。こんなんないかな？ととりあえずググるか先輩に聞きまくろう！

# 設計力
良い設計は開発コストを少なくする。テスト工数を少なくする。
まずはひとまず立ち止まって設計力を上げていきましょう。
新卒はここを伸ばそうという気持ちの優先度が低くなりがち。
優秀な方の設計力を盗み取ろう！

# 調整力
エンジニア全体としてここをおろそかにしがち。
こうしたらいいんじゃないか、よしこうしよう、と勝手に実装しちゃってあれ！こんなの頼んでないよ！とか、思ってたのと違う！って出し戻ししてたらどんどん遅れが出ちゃいますね。
顧客やユーザが真に求めるものをしっかりと追及していこう。
自発的にコミュニケーションをしっかり取れて、仕様を詰めていけるエンジニアが結果爆速になれます。

いかがでしたでしょうか？
当たり前のことしか言ってないじゃないか、とおもってる人は爆速エンジニアになる素質のある人です！
詳細、実践編の問題を乗せた内容を近日公開予定です！
合わせて読んでいただけると幸いです！

# 追伸
株式会社エイチーム引越し侍では、一緒にサイト改善をしてくれるWebエンジニアを募集しています。エイチームグループのエンジニアとして働きたい！という方は是非、以下のリンクから応募してください。
皆様からのご応募、お待ちしております！！

> [エイチームグループ採用サイト（Web開発エンジニア職）](http://hikkoshi.a-tm.co.jp/recruit/request.php?ea=ktqiita_bakusoku_engineer_susume)
DialogflowのEntityを爆速で作成するライブラリを作った

##百聞は一見にしかず

こんな感じのCSVファイルを準備します。

```text:sushi.csv
"鯖"
"鯵"
"鰈"
"鱸"
"鮑"
"鮪"
"鯨"
"鮭"
```

**ライブラリを使ってアップロードすると・・・Entityが一瞬で出来上がります！**

<img width="500" alt="Screen Shot 0029-12-01 at 23.03.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/46c786f9-e9ef-2d4c-78d2-4d51c2ae4d2f.png">

漢字から **ローマ字**、**ひらがな**、**カタカナ**が作成されました。

#ライブラリの紹介
このライブラリにflounderという名前を付けました。flounderは日本語のCSVファイルを読み込んで、自動でEntityの登録とシノニムを作ってくれるライブラリです。

## インストール方法
flounderはpykakasiと呼ばれる日本語をローマ字などに変換するライブラリを使用しているため、pykakasiのインストールが必須です。※本当はflounderに取り込みたかったのですが、諸事情により今回は取り込めませんでした。

### pykakasiのインストール

```
pip install git+https://github.com/miurahr/pykakasi.git
```

### flounderのインストール
```
pip install flounder
```

これでインストールは完了です。

## Developer access tokenを取得
dialogflowからDeveloper access tokenを取得します。

<img width="400" alt="Screen Shot 0029-12-01 at 23.18.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/ac2c74b0-e570-bfac-6b85-e6eed4ae6926.png">

## CSVからEntityを作成

### サンプルコード

```py:test_entity_upload.py
from flounder.flounder import Flounder

flounder = Flounder(DEVELOPER_ACCESS_TOKEN)
create_request = flounder.create_request('Sushi', 'sushi.csv')
response = create_request.getresponse()

print (response.read())
print (response.status, response.reason)
```

### CSVファイル

```text:sushi.csv
"鯖"
"鯵"
"鰈"
"鱸"
"鮑"
"鮪"
"鯨"
"鮭"
```

### 実行

```
$ python test_entity_upload.py
```

dialogflowのコンソールに新しくEntityが作成されていたら成功です:smiley:

# ご理解とご協力のお願い
flounderは、設計、ネーミング、エラー処理など、見直すべき課題が多くございます。まだまだ発展途上ですが、その辺を踏まえて使用して頂けたら幸いです。本当はこの状態で公開するのを躊躇しましたが、まずは公開して少しずつリファクタリングをしていこうという方針に舵を切りました。

ソースは[github](https://github.com/flatfisher/flounder)にございます。お気づきの点がございましたら、issueかプルリクを頂けたら幸いです。
scrapyについて理解を深める

# scrapy 1.4.0

## サンプルコード

```py
class HogeSpider(scrapy.Spider):
    name: str = 'hoge'
    start_urls: List[str] = ['https://data-ippai.com/']

    def parse(self, response):
        for li in response.xpath('li-no-xpath'):
            url = li.xpath('anchor-no-link').extract_first()
            yield Request(
                url=url,
                callbacl=self.parse_detail,
            )

    def parse_detail(self, response):
        loader = HogeItemLoader(
            response=response,
            selector=response.body,
        )
        return loader.load_item()
```

## この記事の目的

例えばSpiderクラスは概ね上記サンプルコードの感じで書いていくと思いますが、
Spider の挙動が思っていた動作と違ったり、
クロール対象サイト側に問題があるのか、Spiderに問題があるのか、
切り分けが難しいシチュエーションに多々出会ったため、
scrapy について理解を深める・備忘録目的でこの記事を残します。

## scrapy のアーキテクチャ

![architecture image](https://doc.scrapy.org/en/latest/_images/scrapy_architecture_02.png)

公式にある画像ですがこの図を見ても全然理解できず。

## Requestオブジェクトをジェネレート又はreturn をしたときにscrapy 側で何が起きているのか

サンプルコードでいうと以下の箇所のお話です。図でいうと2のお話。

```py
yield Request(
    url=url,
    callbacl=self.parse_detail,
)
```

ここは yield でも return でも良いのですか、Requestオブジェクトを spider クラスに返すことにより、
`スケジューラー` に登録されます。

じゃあこの `スケジューラー` って何？って話なんですが、 `タスクキュー` みたいな仕組みだと思ってだいたい間違いないです。
scrapy では [queuelib](https://pypi.python.org/pypi/queuelib) というライブラリを使用して、
Requestオブジェクトをシリアライズしてファイルに突っ込んでいます。（キューイングしている）
突っ込まれたRequestオブジェクトは一つずつ取り出され、リクエストの間隔時間を計算してリクエストしています。
その結果 callback で指定したメソッドが実行される仕組みです。

余談ですが、Spider で指定したコールバックメソッド内の yield, return では `Request オブジェクト` 又は `scrapy.Item オブジェクト` のみ受け付けます。
`Request オブジェクト` を渡すと `スケジューラー` に登録され、
`scrapy.Item オブジェクト` を渡すと `ItemPipeline` に処理が移ります。図の7と8のお話です。
（サンプルコード内の `def parse` もscrapy が内部で呼んでいるコールバックメソッドです。）

## Requestオブジェクトはいつリクエストされているのか。

上記でも少し触れていますがスケジューラーからRequestクラスが取り出されたときです。図の3, 4 あたりのお話。
スケジューラからRequestクラスが取り出される間隔は概ね設定値 `DOWNLOAD_DELAY` で指定した秒数です。
（正確には `DOWNLOAD_DELAY` を元にディレイする秒数をscrapy 側で計算している）

## ターミナルに出力しているリクエストログを見ると順番どおりにリクエストしてないな。

図の4あたりのお話です。
scrapy のキューの取り出し順序どうなってんだろと調べた所 (公式)[https://doc.scrapy.org/en/latest/faq.html#does-scrapy-crawl-in-breadth-first-or-depth-first-order] に記載がありました。

デフォルトだと `後入れ先出し` で処理されるらしい。
つまり順番どおりにリクエストされるはずですがそれが確認できず、よく分かりませんでした。

## キューに優先順序をつけられる

図の7, 8, 3のあたりのお話です。
Requestクラスに `priority` をつけることができる。
この値が高いキューが優先的に処理される。
負の値を指定することも可能。

## スクレイピング時に正常にクローリングできてるはずなのに出来てない問題が発生した

階段上ったはずのに登ってなかった問題がありあれれー？となりました。図の7, 4, 5あたりのお話です。
結論から言うと、 ミドルウェアの `DupeFilter` に引っかかり、scrapy がリクエストするのを諦めていました。
この `DupeFilter` って何？って話なんですが、
scrapy が url を元に、既に同じリクエストをしたことがあるかどうかを判定し、
同じリクエストの場合、以降の処理を行わないというものです。

この問題の解決策として、Requestクラスの引数に `dont_filter=True` 入れると同じURLでも正常にクロールしてくれます。

# 最後に

最近サボってしまいましたが、本日の Friday I/O でした。
[株式会社ワムウ](http://wamw.jp/)では、毎週金曜日は 興味がある事柄に取り組み、その成果を何らかの形でアウトプットする日としています。ありがとうございました。
さあ、告白しよう！

_この記事は[カノジョできないエンジニアAdventCalendar2017](https://adventar.org/calendars/2467)の12/02の記事です。_

_ロスト・メモリー（消された記録）こと_俺です。どうも。

- 2015：カノジョできた
- 2016：カノジョできた
- 2017：先週結婚した

つまり妻がいるけどカノジョはいません。
御託はいい。今年もやるぞ！


# 告白しよう！
[一昨年も言った](https://qiita.com/shinichi-takahashi/items/07a0aee1548f1ef5a231#5-%E5%91%8A%E7%99%BD%E3%81%99%E3%82%8B)が待ってるだけでカノジョができるわけがない。
イケメンすぎて相手から近づけないくらいなら話は別だろうが、そうじゃないはずだ。そうだったらごめん。

幸い俺らエンジニアはトライアンドエラーを繰り返すことで徳が積まれる仕組みに慣れている。
トライ（告白）＆エラー（玉砕）してなんぼだろう？！
そうやって世界は回っている。

さあ、あの子に告白をしてこよう。


# 玉砕後
散ったな？
では次は原因を分析しよう。そうすることで先に進むことができる。
何もしないより何倍もマシだ。失敗を活かしていこう。

さて君はなんて告白して、なんといってフラレただろうか？
「あなたの告白の仕方が悪いからいけないんです」だろうか？
それとも「今たくさん告白受けてて頭がおいつけません」だろうか？
どちらにせよ、告白した側か告白された側に原因がある。


# 原因を分析してリトライする

告白した君が悪い場合は、400 <= Code < 500で返ってくる。
逆に告白された相手に原因がある場合は、500 <= Codeが返ってくる。

400番台が返ってきた場合は、単刀直入にいうと君が悪い。
ちゃんと気持ちを伝えたか？言い逃げになってないか？
しっかりbodyを見て、もう一度告白しよう。

500番台が返ってきた場合、相手の内部事情に介入できない限り次に告白しても同じ回答が返ってくるだろう。もし相手がWebAPIサーバでない場合は、おそらくもっと悲惨な結果になる。

つまり、400番台が返ってきたときには改善の余地は絶対にある。
自分磨きをして見返してやるチャンスだ！

世界には、星の数ほどAPIがある。
さあ、告白しよう！話はそれからだ。


# 告白される視点

既婚者な俺は、告白される立場を語っても許される。そう日本書紀にある。
自慢じゃないが同じ人から何回も告白されたり、複数人から告白されすぎて俺から連絡を断ったこともある。
そんなとき、毎回毎回「400ってでるんすけど」っていう電話に対して「ごめんなさい、これはカクカクシカジカなので、マルマルウシウシしてくださいな」なんていうのはごめんだ。
しっかり400を付与した上でbodyに「あなたの告白には、 **好き** っていう必須パラメータがないよ♡」とか書いてあげよう。

知人や会社内で告白される場合も、社外の告白者から告白される場合も、「私への告白の仕方」みたいなのを/docs/overview.mdあたりに書いておくのも大事なテクだ。


# 終わりに

ここまでWebAPIサーバのRequest/Responseについて書いておいてなんだが、誤解のないよう言及しておくと、恋愛に関与する告白においてはたぶんほとんど400系だろう。
答えは[ここ](https://www.slideshare.net/shinichitakahashi790/20171005-http-status-code)にきっとある！


### 謝辞
_※このネタ自体は社内のメンバーと思いついて私がPHPカンファレンス2017のLTで発表したんですが、後から調べてみたら他にも同じことを考えておられる方が多数いらっしゃいました。_
_パクられた！と思われた方がいらっしゃいましたら、この場をお借りしてお詫び申し上げますｍｍ_
_また、スライド内にはウケ狙いで本来の解釈と異なる表現を使用している箇所が散見されると思いますが、ご容赦くださいませ。_
(2017年12月) PythonとOpenCVをこれからやってみる - 1 - はじめの一歩

#はじめに
Python(パイソン)を中々使う機会が無く、OpenCV(オープンシーブイ)も気にはなりつつ使う機会が無く。
そんな折、ちょっとやってみようと思ったので、今からやるにあたっての導入やはじめの一歩など。
環境はWindows7 64bitでやります。

#Pythonの導入
以前にAnaconda(アナコンダ)でPython環境をインストールしていたようです。
コマンドプロンプトにて試したら次のようになりました。

```:コマンドプロンプト
> python -V
Python 3.6.0 :: Anaconda 4.3.0 (64-bit)
```

なので、Pythonのインストールからと言う方はAnacondaのサイトからダウンロード＆インストールを行なってください。
https://www.anaconda.com/download/

#pip(ピップ)について
次のようにして確認して入っていないようなら入れておきます。

```:コマンドプロンプト
> pip -V
pip 9.0.1 from C:\ProgramData\Anaconda3\lib\site-packages (python 3.6)

> python -m pip -V
pip 9.0.1 from C:\ProgramData\Anaconda3\lib\site-packages (python 3.6)
```

#OpenCVのインストール
次の場所から目的に合うファイルをダウンロードします。
http://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv

今回は次のファイルをダウンロードした。実際のバージョン番号などはその時の最新でいいでしょう。
opencv_python‑3.3.1‑cp36‑cp36m‑win_amd64.whl

```:コマンドプロンプト
> pip install opencv_python‑3.3.1‑cp36‑cp36m‑win_amd64.whl
```

以下のようにして確認。

```py3:コマンドプロンプト
> python
Python 3.6.0 |Anaconda 4.3.0 (64-bit)| (default, Dec 23 2016, 11:57:41) [MSC v.1
900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.3.1'
>>> exit()
```

#その他のモジュールの追加
NumPy(ナムパイ,ナンパイ)というのも必要となるそうなので入れておきます。

```:コマンドプロンプト
> conda install numpy
```

#動くか試してみる
画像ファイルを読込み、指定の範囲の切抜きをして画面表示してみます。

```py3
import cv2

filename = "hoge.bmp"

img = cv2.imread(filename, cv2.IMREAD_COLOR)
img2 = img[100:200, 100:200]

cv2.imshow('window title', img2)
cv2.waitKey(0)
```

`cv2.imread`で指定したファイルを、指定した形式で読み取り、NumPyの配列で返してくれるようです。
img は3次元配列となり、1次元目がY軸、2次元目がX軸、3次元目がその1ピクセルのカラー情報であるBGRとなっているようです。(RGBの順ではない)
ファイルを読込む際に、`cv2.IMREAD_COLOR` の所を `cv2.IMREAD_GRAYSCALE`とすれば、グレースケールのため、2次元配列が返ってくるようです。

その後、画像の切り抜き、というより配列の範囲指定なのでしょうが、開始位置:終了位置のように指定すれば、その配列の範囲を抜き取れるようですね。簡単ですね。

最後は、`cv2.imshow`でウィンドウのタイトルの指定と、NumPyの配列を渡せばウィンドウ表示してくれるようです。
`cv2.waitkey(0)`は、その状態で待機すると言う事でしょう。


まだ、よくわかってない状態ですが、いざやってみると本当に簡単で驚きます。
今まで、趣味で動画編集などをするにあたって画像加工をGIMPのスクリプトでやっていましたが、少し本腰入れてこっちで作る方がはるかに簡単で色々と出来そうですね。
折角なら、OCRのように文字の抜き取りなんかもしてみたいですね。


以上

#参考にした記事など
- [OpenCV 3（core + contrib）をWindows & Python 3の環境にインストール＆OpenCV 2とOpenCV 3の違い＆簡単な動作チェック - Qiita](https://qiita.com/hitomatagi/items/d5d475a446ec9c73261e)
- [Python版OpenCV入門 サンプル集 | アルゴリズム雑記](https://algorithm.joho.info/programming/python/opencv-sample-code-py/)
- [Pythonの数値計算ライブラリ NumPy入門 « Rest Term](http://rest-term.com/archives/2999/)

#これまでの記事
||一覧|次回|
|:--|:--:|--:|
||[一覧](https://qiita.com/rrryutaro/items/933ec2ed754a9f3a2d3e)|[2 - マークを読取る](https://qiita.com/rrryutaro/items/10142d3c3397406e5e2b)|
BMS定義紹介～＃TITLE編～

この記事は、BMS制作についてAdvent Calendar 2日目の記事です。

BMSの定義について書いていきたいと思います。

# TITLEの定義

~~~
#TITLE bmsTitle
 string bmsTitle
 ~~~

 　曲のタイトルを定義します。bmsTitleがいくつかの半角スペースから始まるとき、これをインデントとみなして半角スペースを無視します。例えば、半角スペースを□で可視化した時に、定義が`#TITLE□□□□example`であるとき、これは`#TITLE□example`と全く同じであるということです。  
 　規格に書かれてはいませんが、副題として以下のフォーマットが認められています。しかし、これらが複数用いられる場合や、`#SUBTITLE`の定義がある場合は**無視されます。** よって、この方法での副題の定義は**推奨されません。**


| Expression        | Remark        |
|:-:|:-:|
| `#TITLE main-sub-` | 半角ハイフン |
| `#TITLE main～sub～` | 全角チルダ |
| `#TITLE main(sub)` | 半角丸括弧 |
| `#TITLE main[sub]` | 半角ブラケット/角括弧 |
| `#TITLE main<sub>` | 半角不等号/山括弧     |
| `#TITLE main"sub"` | ダブルクォーテーション|

# LR2における動作とバグ

bmsTitleにShiftJISの2Byte文字において、ASCII文字コード上で、`-`,`(`,`)`,`[`,`]`,`<`,`>`,`"`と同じコードが含まれる場合、パースエラーによって譜面が認識されなくなるバグが確認されています。

例えば、にゃ [あにゃざー]をbmsTitleとして指定した場合、`ー`のShiftJISコードが0x815bであるために、これをLR2が`[`を正しく解釈できずに譜面がLR2上に表示されないバグがあるようです。

ほかにも、`ゾ`、`ゼ`にも同じようにASCIIコードを含んでいるために、パースエラーとなります。

【参考】

- [ShiftJISの文字コード一覧](http://charset.7jp.net/sjis.html)
- [ASCIIの文字コード一覧](http://www9.plala.or.jp/sgwr-t/c_sub/ascii.html)


ちなみにこれは別のバグなのですが、一度パースエラーを起こしたファイルは、bmsTitleを正しく編集しても、ファイル名を変えないと認識されないようです。注意して下さい。
OpenAPIはいいぞ

この記事は [Open API Advent Calendar 2017](https://qiita.com/advent-calendar/2017/openapi) の 1 日目の記事です。

[Open API Specification](https://github.com/OAI/OpenAPI-Specification) は、 [Open API Initiative](https://www.openapis.org/) が策定を進めている REST API を定義するための仕様です。どの URL にどのようなパラメータを渡すとどのような結果が返ってくるかを記述するための JSON/YAML ベースのフォーマットで、ツールやサービスとの連携も図られています。

今年 2017 年は、 3.0.0 がリリースされました。元となった [Swagger](https://swagger.io/) が 1, 2 で Open API Spec としては最初のバージョンとなります。 [構造の改善](https://developer.ntt.com/ja/blog/fbb1636b-b3f8-47b9-ac7c-9080a5d9e7ae) が入り、全体的に使い勝手が良くなった・細かいハックをしなくても運用しやすくなったという印象です。 また、 [2016年の API Blueprint (apiary)](https://blog.apiary.io/2016/01/18/We-ve-got-Swagger) に続き [RAML の Mulesoft](https://www.openapis.org/blog/2017/05/02/competitors-join-oai-to-lead-convergence-of-api-landscape) なども加わったことで、 [Swagger 陣営は勝利宣言をしました](https://swagger.io/blog/mulesoft-joins-the-openapi-initiative/)。

ツールの面では [Swagger Editor/UI がサポートを開始](https://swagger.io/blog/support-for-oas-3-0-in-swagger-editor-and-swagger-ui/) し、いよいよ本格的に利用を開始できる感じになってきました。また、他にも対応したツールが出てきています ([公式リスト](https://github.com/OAI/OpenAPI-Specification/blob/master/IMPLEMENTATIONS.md)、[非公式リスト](https://github.com/mermade/awesome-openapi3))。ツールを作った際には [OAI のページから投稿](https://www.openapis.org/specification/v3implementations-form) できるようなので、有名になるチャンスかもしれません。

サービスの領域でも、 AWS の [API Gateway](https://aws.amazon.com/jp/api-gateway/) や [GCP Cloud Endpoint](https://cloud.google.com/endpoints/?hl=ja)、 [Azure Functions] (https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-openapi-definition) も Swagger ではなく OpenAPI に言及しています。バージョン 3 は、すでにそろっているわけではありませんが、次第に広まるだろうと予想されます。

Swagger/OpenAPI を活用しているプロダクトとしては [Kubernetes](https://github.com/kubernetes/kubernetes/tree/master/api) が挙げられます。彼らは [apimachinary](https://github.com/kubernetes/apimachinery) という（おそらく今の所） Kubernetes 専用のライブラリを通して活用しています。 VM Ware の Docker Registry [Harbor](https://github.com/vmware/harbor) も Swagger の仕様が書かれています。リリースからまだそれほど経っていないからだとは思いますが、バージョン 3 を活用したプロダクトは見つかりませんでした。

サーバレスやコンテナといった盛り上がっている領域の裏で、今後このような OpenAPI のエコシステムに支えられたプロダクトが多く出てくると期待しています。 Advent Calendar の 1 日目として 現状の OpenAPI 事情をまとめてみました。
ラジオボックスのボタンを画像にする

先日上がってきたデザインに対して、これどうやって実現するの？とめちゃくちゃ困って、フロントエンドエンジニアさんに聞いて解決した話です.

# ラジオボタンを画像にする
```html
<html>
<head>
<link rel="stylesheet" type="text/css" href="./static/css/main.css">
</head>

<body>
<input type="radio" id="check1" name="check" />
<label for="check1"></label>

<input type="radio" id="check2" name="check"/>
<label for="check2"></label>

<input type="radio" id="check3" name="check"/>
<label for="check3"></label>

<input type="radio" id="check4" name="check"/>
<label for="check4"></label>

</body>
</html>
```

```css
input[type="radio"]{
    display: none;
}
input[type="radio"] + label {
    position: relative;
    margin:10px;
    display: inline-block;
    background-image:url("../img/present.png");
    background-repeat: no-repeat;
    background-size:contain;
    width: 100px;
    height:100px;
}
input[type="radio"]:checked + label {
    background-image:url("../img/win.png");
    background-repeat: no-repeat;
    background-size:contain;
    width: 100px;
    height:100px;
}
```
(若干CSSが冗長)

# 結果
![Dec-01-2017 22-39-48.gif](https://qiita-image-store.s3.amazonaws.com/0/138771/0ccbbf4b-a1d9-f65b-ebcb-ba64505a8f3e.gif)
[いらすとや](http://www.irasutoya.com/)

# ポイント
`隣接セレクタ`といって、 `+`で結合するとある要素の直後の要素に対して、CSSを当てることができる.
また、`>`　は`子セレクタ`といって子要素にあてることができる.

## 例
```
<div>
<p>子セレクタに適用</p>
</div>
<p>隣接セレクタに適用</p>
<p>どちらでもないから色がかわらない</p>
```

```css
div + p {
    color :#808000;
}
div > p {
    color :#800000;
}
```
##結果
<img width="287" alt="スクリーンショット 2017-12-01 23.05.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/138771/7b70de02-e766-e941-d49a-f6cf32d005ed.png">

# 終わり
できたー！って出したcheckboxの使用例の画像がよくなくて、それそもそもradioボタンじゃなくてよくない？ってなってるかもしれないですが、htmlで出るラジオボタンより、もうちょっとおしゃれな感じのラジオボタンの画像にしたかったのです:frowning2:
以上、無駄にjsを使わないで簡単にラジオボックスのボタンを画像にする方法でした！
Gitのブランチ名一覧を表示する


gitのリポジトリ一覧は`git ls-remote --heads`で取得できます。
しかし、余計な情報も多く表示されるため、単にブランチ名の一覧を表示したいような場合はsedなどでの加工が必要です。

```bash
git ls-remote --heads | sed -e 's#.*refs/heads/##'
```
coremltoolを使った画像認識でsvm形式のモデルを利用する2


### 開発環境

+ macOS 10.13
+ Swift4
+ XCode9
+ Python2.7

### coremltoolsをインストールする
[coremltools 0.6.3](https://pypi.python.org/pypi/coremltools)

と思ったらpipがデフォルトでは無いので、インストールする必要がありました。

### coremltoolsを使用する

Appleの用意しているドキュメントにやり方が載っています。
[coremltools.converters.libsvm.convert
](https://apple.github.io/coremltools/generated/coremltools.converters.libsvm.convert.html)


### Examples

がうまく動きませんでしたー。why?

````
# Make a LIBSVM model
>>> import svmutil
>>> problem = svmutil.svm_problem([0,0,1,1], [[0,1], [1,1], [8,9], [7,7]])
>>> libsvm_model = svmutil.svm_train(problem, svmutil.svm_parameter())

# Convert using default input and output names
>>> import coremltools
>>> coreml_model = coremltools.converters.libsvm.convert(libsvm_model) 

````

最初の行から躓くので、凹む。libsvmへのパスが通ってるなら

````
from libsvm import svmutil
````

通ってないなら、パスを指定

````
>>> import sys
>>> sys.path.append('/Library/Python/2.7/site-packages/libsvm/')

````

あと、最後の行でインスタンスの型が違うエラーになります。ちと理由は現在不明。知識が足りない。
回避方法として、一旦、ファイルに落として、それを呼び出してやるとうまくいきます。

````
>>> svmutil.svm_save_model('test.model', libsvm_model)
>>> import coremltools
>>> coreml_model = coremltools.converters.libsvm.convert('./test.model')
[WARNING] Infering an input lenght of 2. If this is not correct, use the 'input_length' parameter.

````

input_lengthの数が正しく無い場合は、引数で正確な数を指定しろよとの事。
というわけで、1で作ったmodelを変換します。

````
>>> coreml_model = coremltools.converters.libsvm.convert('./train.model' input_length=784)
>>> coreml_model.save('./my_model.mlmodel')
````

これで準備完了。後は簡単なペイントアプリを作成する。
のはまた後日。
ロリポップ！マネージドクラウドを試してみた

# ロリポップ！マネージドクラウドとは

クローズドαテストが実施されていましたが、つい先日にオープンβテストが開始されました。
β期間中は無料で試用可能です。
( https://pepabo.com/news/press/201711291300 )

内部構造としてはコンテナ型になっており、コンテナは今のところPHPとRuby on RailsとNodeJSが用意されているようです。
PHPはWordPress用も用意されており、WordPressは即利用開始できるようになっています！！
（ 私もこちらを作ってみました　https://cloud.lolipop.io/ )

# 遊んでみた

以下のプロジェクトを作成しました。
https://nodejs.lolipop.io/

## Node.js

今のところデプロイ手順などはRoRのもののみ用意されており、Node.JSは手探りになります。
ただ、コンテナを作成した段階でサンプルのプロジェクトが存在するためまずはそのコードを見てみました。

まずは、コンテナにSSHでログインしホームディレクトリである/var/appにはデフォルトで0000000000000000というフォルダが用意されておりここに初回のテンプレートが格納されています。

その中身を見つつ独自にコードを書いてみました。
（https://github.com/kasatomo/LolipopNode ）

### ハマりポイント

npmでexpressを使用しているのですが、package.jsonにexpressのみを記述しても動作しませんでした。
mimeパッケージが無いなどというエラーが表示されてしまいます。

また、mimeについてはexpressの依存関係のバージョンと最新バージョンが異なるため注意が必要でした。

### エラー解析
/var/log/container配下にログが格納されています。
ただ、このログが見にくいです。。。いつのログなのかもわかりません。
haconiwa.err
haconiwa.out
この２つのファイルを見ればだいたい原因はわかると思います。

# 感想
随所に遊び心が仕掛けられています。
上記ログファイルのように"haconiwa"（箱庭？）やユーザー名の"yanagawa"（ロリポップ！本社の福岡県にある地名？？柳川？）など探すと他にもあるかもしれません！

ただし！npmの初回インストールが非常に重いです。マネージドクラウドのコンソールに

```
nodejs.lolipop.ioが通常稼働に戻りました
nodejs.lolipop.ioが高負荷になっています
```
のような記載が頻繁に出ます。

実用に耐えれるかわかりません。。。今後のアップデートに期待です！！
（AWSのLambdaのように自前ビルドが必須になるんでしょうか・・・）
CircleCIでx509という証明書エラーに遭遇したときの対処

# エラー状況

CircleCIでのビルド・デプロイの設定をしているところ、
`x509: failed to load system roots and no roots provided`
という内容のエラーが`restore_cache`と`save_cache`で発生していました。

# エラー内容詳細

適当に文字列は改変しています。

```
Skipping cache - error checking storage: RequestError: send request failed
caused by: Get https://circle-production-customer-artifacts.s3.amazonaws.com/?list-type=2&prefix=picard%2F59d0000000000global%2Fcaches%2FXXXXXXXX%22222-yhTkxxxxxxxxxxxxxxxxxqrvrm8IW_Hrsxxxxxx%3D: x509: failed to load system roots and no roots provided
```
どうやら、AWS S3に~~オレオレ~~自己証明書を使って暗号化してキャッシュを保存する動作のようです。

# 原因
CircleCIのビルドプロセスでcacheの暗号化に使うroot証明書を自分で生成しているのですが、そのためのコマンドが入っていない環境を使っていることが原因でした。

今回ビルドに指定していたDockerイメージが`alpine`をベースにしたもので、最低限のライブラリしか入れていなかったのです。

# 対処
`ca-certificates`パッケージをインストールする。

alpine linuxならば以下のコマンドをDockerfileに追加します。

```
RUN apk add --no-cache ca-certificates
```
fishを使うなら知っておきたい豆知識まとめ

調べていて個人的に早く知っておけばよかったと思うことをまとめてみました。
#fishはデフォルトシェルには向いていない
**fishはbashとの互換性がない**ので、bash_profileなどがうまく読み込めず、PATHなどがうまく設定されないという問題が起こるので、bashに設定をやらせたうえでfishを起動するのがおすすめです。
具体的には、.bashrc 先頭に以下を記述

```bash:.bashrc
exec fish
#以下あなたのbashrc
```
sshの接続先でfishを使う人は[**このページ**](https://qiita.com/tak-onda/items/a90b63d9618d6b15c18c)も読んどいたほうがいいです。

#初めに出てくる　Wellcome to fish,~　を表示させない
fish_config に以下を記述
`set fish_greeting`

#便利なショートカットキー
コマンドを打ってるとこんな感じで灰色の文字が出てきたりしますが、`Ctrl + F`または`方向キーの右`でこれを入力できます。
![fish_qiita.png](https://qiita-image-store.s3.amazonaws.com/0/212512/4f9cc481-2f87-9963-f2c1-0960baa2b0b7.png)　⇒`Ctrl + F`　⇒　![fish_qiita2.png](https://qiita-image-store.s3.amazonaws.com/0/212512/4f78f102-bd9b-be09-8588-ca43fdbda77f.png)

`Alt + →`で少しずつ入力することも可能。

#シェルスクリプトが使いやすくなった
インデントも自動、一度改行しても**戻って編集できます**。さらに実行時構文ミスが見つかった場合、**自動で前回の内容を入力**してくれます。[一個目の引用元はこちら](https://www.gfd-dennou.org/arch/hiroki/homepage/main010.html)、[二個目の引用元はこちら](http://fishshell.com/docs/current/tutorial.html)

```bash:while文
while test -f foo.txt 
echo file exists
sleep 10
end
```
```bash:for文
for file in *.txt
    cp $file $file.bak
end
```

for文で*.txt と書くだけで範囲指定できるとこもpythonっぽくて便利です。

#プロンプトにGitのステータスとかを表示させることができる
まあfishじゃなくてもできますけどね。
リモートワークで購入して良かったものベスト3

こんにちは、元武蔵野勢の[@iwashi86](https://twitter.com/iwashi86)です。

リモートワークってみなさん、活用されていますか？ エンジニアにとって、F2Fでの仕事は非常に有用ですが、もくもく集中したい時間も多いと思います。そんなときにリモートワークは非常に効果的です。

私は2年以上前から、平均して月の半分程度をリモートワークしています。本記事では、リモートワーク時に「買っておいて本当に良かったな」、と考える物理的なモノ・ベスト3を紹介します。

## 1位: (指向性)ヘッドセット / イヤフォンマイク

リモートワーク時にも、ちょっとした技術の相談や、打合せなどで、WebRTCを利用したビデオチャットによる会議[^1]に参加することがあります。その際、絶対に用意しておくべきなのが、ヘッドセットやイヤフォンマイクです。

[^1]: ビデオ会議サービスには [SkyWay Conference](https://conf.webrtc.ecl.ntt.com) を私は使っています。

これらを用いると、相手に伝える音質が圧倒的に良くなります。ラップトップなどについている標準のマイクを使うと、キーボードの打鍵音も拾ってしまうため、聞き手にストレスを与えることがあります。ヘッドセットやイヤフォンマイクを使うと、これを回避できます。

特にオススメは、コールセンタ向けの指向性の強いヘッドセットです。余計な音を拾いにくいので、余計なストレスを、対向側の参加者に与えずに、会議に参加できます。（指向性が弱いと、たとえば自宅近辺を走る救急車の音を拾ってしまうなどのケースがあります）

なお、これはあくまで1人で会議に参加する場合の話です。リモートワークの対向先で、仮に会議室などで数名が1台のマイクを使って参加する場合は、カンファレンスマイクを使いましょう。数万円しますが、あっさりペイします。この辺りは、お金の力で解決すべき領域です。

なお、カンファレンスマイクの機種によっては、指向性もコントロールできるため、デイリースタンドアップなどでメンバの方向が固まる場合に効果的に音を拾えます。

たとえば、YAMAHAの[YVC-100MS](https://sound-solution.yamaha.com/products/uc/yvc-1000ms)あたりは定番かと思います。悩まずに、専用のものを使いましょう。

## 2位: 高解像度のディスプレイ

出社時は4k(3840x2160)のディスプレイを会社で使っているが、自宅に戻った場合はフルHD（1920x1080）に落ちてしまうような場合、自宅での作業でかなりのストレスが発生します。たとえば、IDEやエディタで、Tabを複数枚開いてコードを書くときに、いつもの調子で書けないので、スピードが乗ってこないことがあります。

自宅のディスプレイのため、会社から支給するのは難しいかもしれませんが、ヘビーにリモートワークしていく場合は、会社と同じレベルのディスプレイに投資しておくと、生産性を落とさずに仕事できます。

> なお、外部ディスプレイを全く使わない勢には、本項目は関係無いです。

## 3位: 良い椅子

リモートワークしていると、会社で働いている場合と異なり、雑音や割り込みが少ないため、座っている時間が多くなります。集中できる分良いことなのですが、姿勢が変わらない時間が多くなります。

この際、仮にあまり自分にあっていない椅子を使っていると、プログラマの職業病の一種である、腰痛を発症する可能性が高くなります。結果的に、体の痛みが気になって、集中が切れてしまうというのは本末転倒です。

そのため、ある程度の金額を支払ったとしても、自分にあった良い椅子を買いましょう。将来の腰痛や、仕事中の集中力/生産性に寄与することを考えると、これもあっさり元がとれます。

なお、個人的には、[オカムラの椅子](http://www.okamura.co.jp/product/seating/)がオススメです。日本人の体型にあっていて、作業を長めにしても腰の疲労がないです。

## まとめ

**結局は<ruby>金<rt>カネ</rt></ruby>**
ubuntuにAtomを入れる

#環境
- VMWERE 14 PRO
- ubuntu 16.04
- host os Win10 64bit

#インストール手順
i. 端末(Terminal)にてPPAを追加するため下記のように記す　

```
$ sudo add-apt-repository ppa:webupd8team/atom
```

ii. パッケージを更新する

```
$ sudo apt-get update
```

iii. Atomのインストール

```
$ sudo apt-get install atom
```
ConoHaのクラウド型WAFを使ってみた

ConoHa Advent Calendar 2017 1日目の記事です。

こんにちは、[しめさば](https://twitter.com/xserver_jp)です。

[ConoHaのWAF](https://www.conoha.jp/waf/)が提供開始されたので使ってみました（今も使っています）。
WAF(Web Application Firewall)とは、Webサイト上のアプリケーション保護に特化したファイアウォールで、ユーザーからの入力を受け付けたり、リクエストに応じて動的なページを生成したりするタイプのWebサイトを不正な攻撃から守る役割を果たします。Webサイト上のアプリケーション自体にセキュリティ上の問題があってもそれを無害化できる点がメリットとされています。

WAFには保護対象のサーバにエージェントと呼ばれるソフトウェアをインストールして動作させる「エージェント型WAF」と、リバースプロキシ上で動作する「プロキシ型WAF」と、DNSレコードを書き換えてWAFシステムを経由してサーバに通信が到達するようにする「クラウド型WAF」と何種類かあり、ConoHaのWAFは後者の「クラウド型WAF」です。たぶん[これ](https://www.cloudbric.com/features/waf/?lang=ja)のOEMじゃないかと。

ちなみに、さくらインターネットのサービスで無償提供されているSiteGuard Liteは「エージェント型WAF」です。SiteGuard Liteという製品自体はプロキシライセンスを購入することで「プロキシ型WAF」として使用できますが、さくら版はライセンスの追加に対応していません。とはいえ本来有償の製品を無償提供しているのだから凄いのですが。

# ConoHaのWAF設定
コントロールパネルからWAFを追加します（赤枠部分のボタンを押します）
![conoha01.png](https://qiita-image-store.s3.amazonaws.com/0/204950/78fb179b-f5db-14b0-6920-42176ba9fe2c.png)

WAFの詳細画面にIPアドレス・CNAMEが表示されますので、どちらかを設定します。
![conoha02.png](https://qiita-image-store.s3.amazonaws.com/0/204950/985ec877-fd06-2eee-0fd5-3a8f0137d469.png)

例えばこんな感じのDNS設定をします。

example.com
@ IN A [IPアドレス]
www IN CNAME [CNAME]

http://example.comのようにZONE Apexを使っている場合CNAMEレコードは設定できないため、IPアドレス直打ちになります。http://www.example.comのようにZONE Apexでない場合はCNAMEレコードを設定します。

ちなみにIPアドレスが1個だけなの、拠点冗長化とかされてるのか気になります。複数IPをDNSラウンドロビンさせるようなクラウド型WAFサービスもあるので。

# ConoHaのWAF画面

WAFの管理画面は、ConoHaコントロールパネルとは独立しています。
![conoha03.png](https://qiita-image-store.s3.amazonaws.com/0/204950/3eae3866-8da7-35fc-8017-3613dface295.png)

こんな感じで遮断履歴が見れます。結構来ていることが可視化できるので、Webサイト運営している人は一度はWAFかましてみると良いでしょう。できればそのままWAFをかませて運用できるといいのですが、そこはコストとのトレードオフな面があると思います。
![conoha04.png](https://qiita-image-store.s3.amazonaws.com/0/204950/c2477fd7-07f8-2305-3958-b365d2bafe86.png)

こんな感じのグラフィカルなレポートも表示できます。
![conoha05.png](https://qiita-image-store.s3.amazonaws.com/0/204950/21aaeb60-27d5-e72e-d70d-bc3f6cf1c9c7.png)
![conoha06.png](https://qiita-image-store.s3.amazonaws.com/0/204950/016a1557-58a9-c83f-64b6-75a20e3a2aa6.png)
![conoha07.png](https://qiita-image-store.s3.amazonaws.com/0/204950/e7339ba4-6071-a2a8-f833-5446a0c71e5c.png)

# ConoHaのWAFの悩ましいところ
かなりよくできている感じがするConoHaのWAFですが、このまま継続利用するか、利用終了するか悩んでいます。というのも、最近はブラウザがhttpのサイトに対して警告を出したりするようになったため、常時SSL化というのが必須という状況になっていきています。今保護しているサイトも常時SSL化対応しようとしているところです。しかしながら、ConoHaのWAFのSSLは高いです。RapidSSLが1620円/年で買える時代、ましてやLet's Encryptのような無料SSL証明書がある時代に、2000円/月は顧客層を考えても高いでしょう。SSLオフロードにコンピューティングリソースを使うのはわかりますし、ぼったくりではないと理解は示すものの「個人で使うとなると高いなぁ」と思う次第です。
PeerCast プログラミング配信 Advent Calendar 2017 初日

# PeerCast プログラミング配信 Advent Calendar 2017 初日やったこと

[このイベント](https://qiita.com/advent-calendar/2017/7144)に参加したのでやったことメモを書く。
[mogegui](https://github.com/fusuya/mogeRPGserverGUI)に、入力した値だけゲームをループしたときの勝率を計測する機能をつけた。

- 作ってて気づいたこと
(format nil "~s" lst)みたいな書きき方してたら、リストの要素20個目あたりで勝手に改行が入った。視聴者から\*print-right-margin\*が関係しているのではとの情報をもらった。  

- 学んだこと
リストをformatで表示するとき(format nil "~{~d ~}" lst)こんな感じで表示できることを知った。format奥が深い

- わからなかったこと
ltkでウィンドウのサイズに合わせてtextを改行したかったがわからなかった。
仕方ないので(make-instance 'label～のとこで:wraplengthで改行のタイミングを指定した。

おしまい
【TouchDesigner】OSCでスマートフットウェアOrpheと連携させてみた

流行りにのっかりTouchDesignerに触りだした自分が、OSC通信でスマートフットウェアのOrpheと連携させてみたお話。
Orpheに限らず、OSC使ってTDで何かやろうとしている方でも参考になるかもしれません。

![IMG_2809.jpg](https://qiita-image-store.s3.amazonaws.com/0/218869/67e44966-19dc-e7e5-a94e-a13dc2f9e1e9.jpeg)

#Orpheとは
ただ光るだけでなく、無償で提供されているSDKやらアプリケーションを使ってお手軽にハックできるスマートな靴です（ステマ）。
詳細は以下URLをご参照ください。

http://orphe.shoes

#OSC通信もできる
Orpheは、HUB Appというアプリを使いOSC経由で靴に内蔵されているモーションセンサー値の取得やら光り方の操作ができます。
同じくOSCに対応しているTouchDesignerを使って、Orpheの光を操作してみようというのが今回の記事。

・HUB App
https://sites.google.com/view/orphe-developers/hub-app

#OSCメッセージを送信してみよう（TD側）
今回はTD側でボタンを押すたびにOrpheの左右の光が切り替わる、というのをやってみようと思います。

まず、TDでButton COMPとNull CHOPを配置し接続してみてください。ボタンをクリックするたびに値が0 or 1 で切り替わります。

<img width="530" alt="スクリーンショット 2017-12-01 20.53.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/218869/dae5eb2e-b37e-fa36-03d3-81f2448e447b.png">

この値をトリガーにOSCメッセージを飛ばすということをやるため、CHOP Execute DATというオペレーターを使用します。
プロパティのCHOP欄にさっき配置したNull CHOPを指定してあげると次の画像のようにNull CHOPから矢印が伸びます。

<img width="795" alt="スクリーンショット 2017-12-01 21.06.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/218869/11c14741-7922-b327-93b9-7da2d36363ee.png">

OSCメッセージを送信するのにはOSC Out DATを使います。OSC Out CHOPもあるのですが、このオペレーターは1つのアドレスパターンにつき1つの引数しかとることができないらしいので使いません（HUB Appでは複数の引数を扱う場合があります）。

今回はローカル環境でテストするので、プロパティのNetwork Addressにはlocalhost、Portには適当な値を入れときましょう（Port番号はHUB App側でも指定できます）。

<img width="740" alt="スクリーンショット 2017-12-01 21.44.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/218869/818040da-0f4f-0239-bc10-027ae2a488e9.png">


メッセージ送信のためにはPythonスクリプトを少し記述する必要があります（ビジュアルプログラミングしかやらないつもりでTD触ってる人は嫌かも……）。
CHOP Execute DATプロパティのEditボタンを押すとスクリプトがいじれるようになります。offToOn関数とonToOff関数に以下の内容を追記してみましょう。

```py
def offToOn(channel, sampleIndex, val, prev):
	arg_list = [2]
	op('oscout1').sendOSC("/LEFT/triggerLight", arg_list)
	return

def onToOff(channel, sampleIndex, val, prev):
	arg_list = [2]
	op('oscout1').sendOSC("/RIGHT/triggerLight", arg_list)
	return
```
追記したらプロパティより該当関数をONにしてあげてください。
ボタンONでOrpheの左足が光り、OFFで右足が光るようになるはずです。
HUB Appへ送信できるメッセージの内容は以下URLを参考にしてください。

https://sites.google.com/view/orphe-developers/hub-app/api

#OSCメッセージを受信してみよう（HUB App側）
HUB Appを起動しOrpheを接続したら、まずOrphe SettingよりSCENE SDKを選択しましょう。

次にOSC Settingsウィンドウを開きます。
PORT[RECEIVER]が先ほどOSC Out DATプロパティで指定したポート番号になっているか確認しましょう。

確認できたらTD側でボタンをクリックしてみます。
靴が交互に光って、Receive Logに先ほどスクリプトで記述したメッセージの内容が現れたら成功です。

<img width="601" alt="スクリーンショット 2017-12-01 21.57.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/218869/ea99216e-0b77-f863-0dbb-092d5128cb26.png">

#動画
今回のHowToの内容ではありませんが、ZIG simulatorというアプリを使ってスマホから光の色を変えた際の動画を載せておきます。

http://zig-project.com

ZIG simulator → TD → HUB Appという感じ（気が向いたらこちらも記事にするかもしれません）。

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/Bye24r495hc/0.jpg)](http://www.youtube.com/watch?v=Bye24r495hc)

#参考
https://qiita.com/kodai100/items/5b614fed5f3e17b7f8f6
http://txton.net/hoehoe/20170609041851

#おまけ
TDではないけどOrpheを使用した開発事例（ダンスAI）
http://hahaeatora.hateblo.jp/entry/2018/10/14/183000
AWS Cloud9を動かしてみた

# はじめに
AWS Cloud9がリリースされましたので使ってみました。
AWSの各サービスと簡単に連携できるようになったのが素晴らしいです。



### AWS Cloud9 – クラウド開発環境
機能の詳しい内容は[Amazon Web Services ブログ参照](https://aws.amazon.com/jp/blogs/news/aws-cloud9-cloud-developer-environments/)

# 環境作成手順
IDEが立ち上がって、まずは軽く動作するところまで見てみようと思います。

## Create environment
![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/ca60d6d5-a7f3-cfe9-7496-a8b56b8a7b1a.png)


## Name environment
* AWS cloud 9 環境の名称を設定します。<br>
  後続でサーバーをEC2新規作成とする場合、EC2名にも使われます。

![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/f9ef2a15-6ecc-c7b2-0cab-bfc5815d83d5.png)

## Configure  settings
* 今回はEC2を新規作成しました。
* インスタンスタイプは各種使えます。その他のラジオを選ぶと表示されていないインスタンスタイプも選べました。
* Cost-saving setting<br>
  環境が自動停止しEC2のコスト節約するための設定。<br>
  とても良い仕組みに見えます。  

![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/e9e62d69-a939-8c46-71de-c3db4b955122.png)

推奨のデフォルト30分にしましたが、Neverも選べるようです。

![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/8219d3cd-b44b-2afe-00d0-9acea11d9c0f.png)

* Network setting<br>
  VPCやサブネットを指定できます。

![5_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/216527/2352fb45-9944-7f53-fbb2-d76265a9490e.jpeg)

## Review
最後に確認して作成していきます。
![6.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/90d7ed2f-1a39-16ad-e196-1ec8912d2c6d.png)
![7.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/95305750-8ce1-bcbc-3d44-beee6addb9ef.png)

* 待ち時間：2分くらい。<br>
　以前のcloud9より若干遅くなったような体感でしたが、誤差レベル。

![8.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/8d095eff-c147-d3d6-c510-39476c1ed55d.png)

## 完成
* ぱっと見、cloud9のいつものIDEが出来ました。

![10.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/b9bcf569-8786-f116-7353-3b5cd1ea7016.png)

* EC2のダッシュボード。先ほど作ったインスタンスが表示されています。

![12.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/ca76141c-5b0b-05a6-5d3a-9baa67f83994.png)



* 簡単ですが、動作確認。

![11.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/f7aedf02-719c-f9b8-73af-1d7c051228fd.png)


# まとめ
* AWSで開発する上での環境を簡単に構築できました。<br>
  ローカルを使わずAWSの独立した開発環境を複数個作れるのはとても便利です。<br>
　LambdaをIDE内で動作検証できることは魅力的。私もいずれ試してみたいです。<br><br>
* 1人でAWSに関係なし&マシンパワーも必要ないプログラムの勉強に使う場合は<br>
  [AWSではない方のcloud9](https://c9.io/login)のほうが良いかもしれません。<br>
  (AWS Cloud9はそれ自体は無料で使えるようですが、利用中のEC2料金がかかります。）
CentOS7にRead the Docsをインストール

#概要

 - CentOS7.4
 - Python2.7, Python3.6

#手順
1. 要りそうなものをインストール

```yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel
```

2. Python2.7, 3.6 をインストール。
　（ソースからビルドしました）

3. virtualenvをインストール

```pip install virtualenv```

4. 本家ドキュメントに沿ってインストール。
http://docs.readthedocs.io/en/latest/install.html

なんかエラーになるので、これを実行。
yum install -y libxml2-devel libxslt-devel
（参考）http://centos.sabakan.red/entry/2015/03/11/113451

やり直したら、ビルド完了。
Firebird SQL のストアドプロシージャで FizzBuzz

# はじめに

これは [FizzBuzz Advent Calendar 2017](https://qiita.com/advent-calendar/2017/fizzbuzz) 13 日目の記事となります。
[Firebird SQL](https://www.firebirdsql.org/) のストアドプロシージャで FizzBuzz を書いてみます。

# コード

適当な DB を用意し、ストアドプロシージャを書きます。

```SQL:
SET TERM ^;

CREATE PROCEDURE FizzBuzz
RETURNS
  (Result VARCHAR(10))
AS
  DECLARE VARIABLE I INTEGER = 0;
BEGIN
  WHILE (I < 100) DO
    BEGIN
      I = I + 1;
      IF ((mod(I, 3) = 0) and (mod(I, 5) = 0)) THEN
        Result = 'Fizz Buzz';
      ELSE
        BEGIN
          IF (mod(I, 3) = 0) THEN
            Result = 'Fizz';
          ELSE
            BEGIN
              IF (mod(I, 5) = 0) THEN
                Result = 'Buzz';
              ELSE
                Result = CAST(I as VARCHAR(10));
            END
        END
      SUSPEND;
    END
END ^

SET TERM ;^
```

次に Select 文を実行します。

```SQL:
Select * from FizzBuzz;
```

するとこうなります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21785/5981fb78-c7a3-028e-af2f-6c234b86e06b.png)

多分 [Interbase](https://www.embarcadero.com/jp/products/interbase) でも同じコードで OK だと思います。


# おわりに

ブラッシュアップしてくれると嬉しいな ＞ Firebird の偉い人。
**他の DB のストアドプロシージャではどうなるのか**も知りたかったり...。

[Firebird Advent Calendar 2017](https://qiita.com/advent-calendar/2017/firebird) が開催されていますので興味のあるかたはどうぞ！

**See Also:**

 - [Firebird SQL](https://www.firebirdsql.org/)
 - [Embarcadero Interbase](https://www.embarcadero.com/jp/products/interbase)
 - [Firebirdのストアドプロシージャ (Wikipedia)](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%88%E3%82%A2%E3%83%89%E3%83%97%E3%83%AD%E3%82%B7%E3%83%BC%E3%82%B8%E3%83%A3#Firebird.E3.81.AE.E3.82.B9.E3.83.88.E3.82.A2.E3.83.89.E3.83.97.E3.83.AD.E3.82.B7.E3.83.BC.E3.82.B8.E3.83.A3)
浜辺でIoT〜

こんにちは。IoTフルスタックエンジニアです。

IoTでpython(パイソン)使って遊んだり、デモしたりしている方も多いと思います。

小規模の組み込み機器のソフトウェア（ファームウェア）では、初期のデモから本番まで、C/C++を使うことが多いと思いますが、（本番、製品、ではちょっとお薦めできないのですが、）初期のデモ・PoCの段階では、[C/C++で書いたファームウェアとpythonのスクリプトを連携させた実装](https://docs.python.org/3/c-api/index.html)で実現すると便利なことがあります。

組み込み機器の実装にpythonを絡ませるメリットは

- C言語ほど時間を使わずに、迅速に機器の動作を調べ、素早くプロトタイプすることができます。CでSNS連携しようなんて思うと結構気が遠くなるけれど、python側で処理してしまえば簡単。非常にハイレベルのことはpythonで、細かい高速なところはC/C++で、みたいな住み分けをすると楽に開発できます。
- pythonはバイナリデータとも仲良しです。筆者もmp4の適当なバイナリパーサーがなかったのでpythonで作ったことがあります。Cで書いても良いのですが、調べ物をしたいだけなのにCで書くのは大変だったで。
- C/Python APIを使うと、ハードウェアやロジックの検証が終わったあとで段階的にpythonのクラスや関数をC/C++言語に置き換えて高速化したりすることができます。
- メモリやストレージがたっぷりあるのであれば、pythonで機器がとったデータをそのままこれもpythonから使えるDeepLearningやMachineLearningの処理系に流すこともできます。linuxぐらい走っていないと一般的には大変かと思われますが、2017年のIoT/Embedded展では、組み込みデバイス内でMachineLearningできるライブラリを出している企業もあり、エッジコンピューティングもできます。

ちなみに、みんなだいすきラズパイの RPi.GPIO (IO制御するためのpythonモジュール）の連携のためのソースコードはたったのこれだけです。

|サイズ|ソース|
|---:|:----|
31992|py_gpio.c|
|14679|event_gpio.c|
|7848|c_gpio.c|
|7609|cpuinfo.c|
|6266|py_pwm.c|
|4900|soft_pwm.c|
|3295|common.c|
|2871|constants.c|
|1844|c_gpio.h|
|1626|event_gpio.h|
|1557|common.h|
|1474|constants.h|
|1306|cpuinfo.h|
|1282|soft_pwm.h|
|1122|py_pwm.h|

もし自作のハードウェアをもっとゴリゴリしたいとか、泣く泣く全部C/C++で書かざるをえない状況の方がいらしたら是非一度試してみてください。 コンピュータサイエンスのクラスではパーサーを作るととてもソフトウェアの作りがわかるということですが、python -C/C++連携のコードを一度書くとpythonを上（スクリプト）から使うだけではなくて、下（OS、ハードウェア側)からもつかって理解を進めることができる上に、pythonの豊富なライブラリ資源・高速なC/C++のメリット双方を使えるようになります。

ただ、現時点で製品動作まで本気でpythonで書くのは難しいようです。あくまで開発初期の高速な検証手段としてお薦めします。

参考：pythonの組み込みポーティング(CPython)/プラットフォームをいくつか

- （ほぼ何でも動く）https://www.raspberrypi.org/
- （ほぼ何でも動く）http://beagleboard.org/Products/BeagleBone%20Black
- （限定実装）http://www.tinypy.org/ 64k tinypy "batteries not (yet) included"
- （限定実装）https://micropython.org/

---
新潟 - 東京を行ったりきたりしてIoT界隈の仕事をしています。12/1は新潟市内に雪がちょっと降りました。雪が降ると風が止んで街が静かになって暖かく感じます。いつも行ってる[浜茶屋](http://seapoint.info/)のco-working spaceでこの土日はIoT三昧（というかお仕事） 荒れた海や、静かに光る冬の海を眺めながら。 

次回IoTLT新潟は2018/2の予定です。 広い浜をみながらいつかここで大きなIoTLT企画したいな、と思っています。