OmniAICreator/Qiita-1.07M huggingface dataset:
オンライン決済サービスの比較（2016年11月）

BtoBサービスを開発するにあたって、オンライン決済機能を実装する必要があり、どのような決済サービスがあるのか調べてみました。間違いがあったら教えて頂けると助かります。

# 比較対象のサービス

自社Webサービスに簡単にクレジットカード決済機能を組み込むことのできるサービスを比較対象として取り上げます。
問い合せしないと価格を教えないサービスは除外しています。

- [SPIKE](https://spike.cc/)
- [Stripe](https://stripe.com/japan)
- [Yahoo!ウォレットFastPay](https://fastpay.yahoo.co.jp/)
- [PayPal](https://www.paypal.com/jp/webapps/mpp/express-checkout)
- [PAY.JP](https://pay.jp/)
- [Komoju](https://komoju.jp/)
- [Omise](https://www.omise.co/ja)

# 比較の軸

- 料金（初期費用・決済手数料・その他維持費等）
- 対応しているカードの種類
- 継続課金対応（毎月決まった金額を課金するような決済方法に対応しているか）
- API（APIによる取引が可能か）

# 比較表

(略称) Visa: V, Master Card: M, JCB: J, AMEX: A, Diners: D, Discover: Ds

|サービス名|料金(初期費用)|料金(決済手数料)|料金(その他)|カードの種類|継続課金|API|
|---|---|---|---|---|---|---|
|[SPIKE](https://spike.cc/)<br/>フリープラン|無料|月10万円(または1,000米ドル)まで無料<br/>超過分は3.9%+30円(または0.30米ドル) /件|無料|V|未対応|5,000円/月|
|[SPIKE](https://spike.cc/)<br/>ビジネスプレミアム|無料|V M: 2.55％ + 10円/件<br/>J A D: 3.4%+30円|3,000円/月|V M J A D|未対応|5,000円/月|
|[Stripe](https://stripe.com/japan)|無料|3.6%|無料|V M A|対応|対応|
|[Yahoo!ウォレットFastPay](https://fastpay.yahoo.co.jp/)<br/>(新規申し込み受付を終了)|無料|3.25%|無料|V M J A D|対応|対応|
|[PayPal](https://www.paypal.com/jp/webapps/mpp/express-checkout)<br/>エクスプレスチェックアウト（API型）|無料|〜30万円/月:3.6％+40円<br/>30〜100万円/月:3.4%+40円<br/>100〜1000万円/月:3.2%+40円<br/>1,000万円〜/月:2.9%+40円<br/>(少額決済の場合は[小額決済用手数料](https://www.paypal.jp/jp/contents/support/faq/faq-022/)を適用可能)|無料|V M J A D|対応|対応|
|[PAY.JP](https://pay.jp/)<br/>ベーシックプラン|無料|V M: 3.0%<br/>J A D Ds: 3.6%|無料|V M J A D Ds|対応|対応|
|[PAY.JP](https://pay.jp/)<br/>プロプラン|無料|V M: 2.59%<br/>J A D Ds: 3.3%|10,000円/月<br>|V M J A D Ds|対応|対応|
|[Komoju](https://komoju.jp/)|無料|V M: 3.25%<br/>J A: 3.85%|無料|V M J A|未対応|対応|
|[Omise](https://www.omise.co/ja)|無料|V M: 2.95%<br/>J A D: 3.6%|売上をユーザーの口座に入金する際に振込手数料260円が掛かる|V M J A D|[対応可能](https://www.omise.co/ja/how-to-do-recurring-payments)|対応|

# 選定結果 (参考)

私の場合は、継続課金とAPI取引が必須で、決済単価1000円〜3000円、月間決済回数1000回以上、Visa&Masterの比率は80%と仮定、後はコスト次第という条件なので、PAY.JPが9/6に発表したプロプラン（2.732% + 1万円/月 = 2.59 * 0.8 + 3.3 * 0.2 + 1万円/月）、Omise(2.95%)辺りが候補になってきますね。
ただここまで料金が下がってくると、料金を主軸として比べる意味があんまりないので、もう少し細かくサービスの特徴を見てみる必要がありそうです。

# 参考リンク
- [【徹底比較】話題の5大オンライン決済サービスPayPal、SPIKE、Stripe、WebPay、Yahoo!ウォレット FastPay、を比べてみた（比較表有り）](http://keiei.freee.co.jp/2015/06/01/paypal-spike-stripe-webpay-yahoowalletfastpay/) (2015/06/01)
- [【比較表】pay.jpが開始、オンライン決済サービス比較表をつくりました](http://michihhh.hateblo.jp/entry/2015/10/13/213348) (2015/10/13)
- [BASE株式会社プレスリリース: プレビューの限定公開URLを取得 PAY.JPのスタートアップ支援制度「PAY.JP Seed」を提供開始！一般事業者向けに決済手数料がお得な新プランも同時スタート](https://binc.jp/ja/pr_20160906/)
- [「WebPay」サービスの終了について](https://linecorp.com/ja/pr/news/ja/2016/1560)
【しずおかアプリ部】活動ログ　第20回

![しずおかアプリ部2.jpg](https://qiita-image-store.s3.amazonaws.com/0/88105/ee800648-fa25-1829-20c3-bad9c2055d35.jpeg)


##■タイトル##
第２０回


##■開催日##
２０１６年５月２８日（土）　１６：００～１８：００


##■参加者##
９名


##■活動内容（概要）##
・雑談
・保坂「hour of code」の紹介
・保坂プレゼン「Cocos2d-xで作る物理演算ゲーム　～軌跡の点線を入れてみる③～」
・菅原プレゼン「Unityはじめるよ～武器を持たせてみる～」
・部員さん　「Gear VR」オススメソフト体験


##■活動内容（詳細）##
**・雑談**
　コナミの特許問題について
　Google I/O 2016で発表されたAndroid用VR「Daydream」について


【実演・プレゼン】

**・保坂「Hour of Code」の紹介**
　人気ゲームなどを題材にに、プログラムの勉強ができるサイト。
　コードを書く代わりに、命令ブロックを置くというのが「Scratch」に似ているが、
　問題クリア型なのと、最適解でのブロック数が表示されるので、最適解でクリアしようと燃える。
　今回は「Minecraft」を題材にしたものをプレイ。
　[Hour Of Code](https://code.org/mc)




**・保坂プレゼン「Cocos2d-xで作る物理演算ゲーム　～軌跡の点線を入れてみる③～」**
　毎度おなじみのAngryChiken。
　　今回はチキンが飛んだ軌跡の点線を残す方法を紹介した。
　　－＞前ゲームの点情報の保持
　　　　DrawNodeクラスに持っている点情報を何らかの方法でコピーする必要がある。
　　　　ディープコピーをするには、DrawNodeをオーバーライドして、コピーコンストラクタなどを追加しなくてはならない。
　　　　なので今回は、実行中に画面表示用のほかに保存用のDrawNodeにも値を入れていく方法をとった。

　　　　併せてディープコピーとシャローコピー、参照カウンタについて学んだ。
![13320774_813050602158306_9124496100828041658_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/88105/f41c4283-ed9b-4705-6675-8d06fb138c68.jpeg)

　　資料：[第20回_プレゼン資料(Cocos2d-xで作る物理演算ゲーム　～軌跡の点線を入れてみる③～).pdf](http://monolizm.com/sab/pdf/第20回_プレゼン資料(Cocos2d-xで作る物理演算ゲーム　～軌跡の点線を入れてみる③～).pdf)




**・菅原プレゼン「Unityはじめるよ～武器を持たせてみる～」**
　スクリプトからキャラクターの武器を変更する方法をプレゼン。
　・エディタ上でキャラクターに武器を持たせるのは非常に簡単。
　　　武器を手の子オブジェクトにしてしまえばよい。
　・スクリプトから武器を差し替えるためには下準備が必要。
　　　武器の向き、大きさ、原点を調整しておく。
　　　キャラクターに見えない武器を持たせておく。
　・スクリプトから武器変更できるようにすることで、アプリ配信中でも武器の追加が可能となる。
　・同様の方法で、防具も装備変更可能。
![12322615_813050578824975_6280586849968732755_o.png](https://qiita-image-store.s3.amazonaws.com/0/88105/3f3e3219-a94a-4587-e8d6-4fa46f02afa2.png)


　　資料：[第20回_プレゼン資料(Unityはじめるよ～武器を持たせてみる～).pdf](http://monolizm.com/sab/pdf/第20回_プレゼン資料(Unityはじめるよ～武器を持たせてみる～).pdf)




**・部員さん　「Gear VR」オススメソフト体験**
　「Invasion」
　美しい自然の中の凍った湖の上。一羽のウサギと出会い、UFOでやってきた凶悪な宇宙人を追っ払うストーリー。
　ゲームではなく観るタイプのVRだが、映像のクオリティが高く、スマホでリアルタイムにレンダリングしているとは思えないレベルだった。


##活動後記--------------------------------------------##
第２０回「しずおかアプリ部」開催！
ゲームでプログラミング（Unity、Cocos2d-x、Minecraft hour of code）、部員さんの今月のVRソフト紹介。
　
皆さんこんにちは！モノリズムです。
さて、今回もしずおかアプリ部が開催されました。
　
　
Unityは、キャラクターに容易に武器を持たせるなどを
持たせる方法（親子付け）を紹介！
骸骨のモデルに武器を持たせるレクチャを行いました。
　
Cocos2d-xの方ではアングリーチキンの「軌跡を表示する」
処理を紹介。前ゲームの軌跡が履歴として残る処理を行いました。
Ｃ＋＋のディープコピーとシャローコピーの動作概念の
注意点なども紹介。Ｃ＋＋の実装における注意点も話しました。
そして今回は急きょマインクラフトの世界をプログラムで冒険させる「Minecraft hour of code」を紹介。初心者向けですが、最適解でクリアするには少し頭をひねる必要があるところが、我々プログラマでもちょっと頭の体操になりました。
[Minecraft hour of code]
https://code.org/mc　
　
そしてシリーズ化した「今月のＶＲゲーム」のコーナーでは、部員さんが持ってきてくださったGearVRでVRを体験。今回はディズニー動画「INVASION」。ディスニーっぽいコミカルな動きでかわいいうさぎと宇宙人のドタバタ劇。ほのぼのします。
　
[INVASION]
http://vrstore.tv/gear-vr/179.html
　
　
中でも「Minecraft hour of code」で、ベテランのプログラマも
最適解を出すために、頭をひねっているようなところが妙に面白かった回でした。
　
さて、そんなしずおかアプリ部、初心者の方も楽しめる内容となっています！ご興味ある方はモノリズムアプリ部へご入部ください。無料体験もやっていますので、ぜひご参加ください。
　
ここまで気軽にしっかりゲーム作りの体験できるのはモノリズムだけです！　
http://monolizm.com/sab/
　
お待ちしております！
＊パソコンの台数と参加人数には制限がございます。状況によっては１台のパソコンを共有してもらうこともあります。何卒ご了承くださいませ。
AWSなどサーバー間でネットワーク帯域を手軽に測定する方法

# Netperfを使おう！
ネットワークベンチマークソフト。特定のホスト間でTCPやUDPのベンチマークを行う場合に便利。
大学時代は大変お世話になりました。
UDPでの測定は、-mオプションを使うこと！要注意。
UDPでの計測はiperfの方がオススメです。

- 公式サイト:
http://www.netperf.org/netperf/NetperfPage.html

# インストール方法
## Amazon Linuxへのインストール
```
yum install netperf
```
## Macの場合
```
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null
```

```
brew install netperf
```

# コマンドライン
## 基本的な使い方
1.netserverをサーバー側で起動
2.送信側でnetperfコマンドをで測定方法に合わせて起動する

それぞれ以下を参照して下さい。

## サーバ
- netserverを実行する

```
  $ netserver 
```

## クライアント
```
    $ netperf -H <server IP addr> 
```



# 使用例
## TCPでの測定
送信側(クライアント)は以下のコマンドを実行します。

```    
$ netperf -H 192.168.1.32 
```

## UDPでの測定
送信側(クライアント)は以下のコマンドを実行します。

```
    $ netperf -H 192.168.1.32 -t UDP_STREAM -- -m 1024 
```

※注意： デフォルトでは9216バイトのUDPパケットが送出されてしまうので、 "-m"オプションで各ネットワークのMTUを指定して下さい。;
デフォルトの使用ポート12865番ですが、変えたい場合のオプションは"-p"となります。


# 結果の見方
- TCPでの結果

```
    TCP STREAM TEST to 172.29.34.138 Recv Send Send Socket Socket Message 
Elapsed Size Size Size Time Throughput bytes bytes bytes secs. 
10^6bits/sec 87380 16384 16384 10.00 94.13
              (1)   (2)   (3)   (4)   (5) 

(1)受信ソケットサイズ(byte)
(2)送信ソケットサイズ(byte)
(3)送信メッセージ(byte)
(4)計測時間
(5)実効帯域
```

- UDPでの結果

```
    UDP UNIDIRECTIONAL SEND TEST to 172.29.34.138 Socket Message 
Elapsed Messages Size Size Time Okay Errors Throughput bytes bytes secs 
# # 10^6bits/sec 65535 1024 10.00 114702 0 93.97 65535 10.00 114702 93.97 
                                            (a)                      (b) 

(a)送信した帯域
(b)受信できた帯域（実効帯域）
とりあえずUDPでの帯域は(b)を見ればよい
```
2回目の マインクラフトPE マルチプレイサーバー セットアップ時のメモ

#前回のメモ
http://qiita.com/haya2_/items/dfbc0e4b4fa8e7b1ade5

#2回目にむけて
手順をひととおりまとめて、ここに書いた手順通りにやればサーバーが立てられる状態をめざしたい。

#環境
- さくらのクラウド
- CentOS 7
- マインクラフトPE 0.14.3

#はじめに
マインクラフトPEのマルチプレイサーバー（PocketMine-MP）のセットアップ（２回目）時のメモです。

#メモ
- マインクラフトPEのPEとは、Pocket Editionの略。簡単に言うとスマホ（iPhone, Android）版のこと。
- PEと、PC版と、コンシューマーゲーム機版（プレステ版など）は、基本的に互換性がない。
- PEのマルチプレイサーバーのソフトは、PocketMine-MPというソフト。（公式が提供するものではない？他にもあるかも？）
- pharファイルというファイル(jarのPHP版？)を最新のものをダウンロードして置き換えることが必要。（プレイしているクライアントのバージョンよりも低いバージョン用のサーバでは動かない）




#コマンドメモ
```
#root ユーザー以外のユーザーを作ってセットアップするのが原則
useradd hoge
passwd hoge

#とりあえず yum update しておく
yum -y update

#前提パッケージのインストール（すでに入っているかも？）
yum install perl gcc make automake libtool autoconf m4

#wget インストールする
yum -y install wget

#PocketMine-MP をダウンロードする
wget -q -O - http://get.pocketmine.net/ | bash

#現在公開されているものは最新バージョン用にまとまっておらず、いくつか追加の手順が必要
#PHPのバージョンが古いので、ベットダウンロードしてきて、bin ディレクトリ毎入れ替える
#上記手順なので、PHP を yum でインストールしたりはしなくても大丈夫
wget -O PHP_7.0.3_x86-64_Linux.tar.gz https://bintray.com/pocketmine/PocketMine/download_file?file_path=PHP_7.0.3_x86-64_Linux.tar.gz

#展開する
tar -xvf PHP_7.0.3_x86-64_Linux.tar.gz

#phar ファイル（プラグインパック？）の新しいのをダウンロードして、ファイルを入れ替えることが必要

＃0.14.2用
wget -O PocketMine-MP.phar https://bintray.com/pocketmine/PocketMine/download_file?file_path=PocketMine-MP_1.6dev-24_ac482621_API-2.0.0.phar

＃0.14.3用
wget -O PocketMine-MP.phar https://bintray.com/pocketmine/PocketMine/download_file?file_path=PocketMine-MP_1.6dev-25_e2d079a7_API-2.0.0.phar

#firewalld で ポートを開ける。この辺りは、まだまだ勉強しないといけない。
firewall-cmd --add-port=19132/udp --zone=public --permanent
firewall-cmd --reload

#スタート用のシェルスクリプトを起動する
./start.sh

#今回参考にさせていただいた主なページ。感謝 :pray: 
- [PocketMine-MP公式サイト](https://www.pocketmine.net/?lang=ja)
docker-compose up したらタイムアウトしたん

`$ docker-composer.exe up`

したら

`Network timed out while trying to connect to https://index.docker.io/v1/repositories/library/xxxxx`

みたいなエラーでた場合の対応。

`$ docker-machine.exe restart`

DNS変えたら～みたいなこともIssueには書いてあったけどDocker再起動でいけた。

参考：https://github.com/docker/docker/issues/16829
正規表現のパフォーマンスの話をされても全くピンと来なかった僕は、backtrackに出会いました。

社内LTで、ベトナムから来たタイン君から

「ふつう正規表現は長ければ長い方がよい」というお話を聞いて、
http://qiita.com/DinhDuyThanh/items/1b19eba549f3680d3378

「は？..どういうことでしょうか？」 （という状態でした。

# 例えば

郵便番号「123-4567」にマッチする正規表現として以下の２つを考えてみると、

```bash:どちらもマッチします。
/^.*-.*$/    #悪い（表現方法として"短い"けど）

/^\d{3}-\d{4}$/    #良い（表現方法として"長い"）
```

となります。
（もちろん、上のパタンは、デタラメなものも引っかかるので、正しくないけど、そういうのはいったん無視。

感覚的には下の方がよさそうだけど。どういうことですか？


# ステップ数を見てみる！

https://regex101.com/#pcre
この素晴らしいサイトを利用します。

`123-4567`とのマッチングを考えます。

まず、`/^\d{3}-\d{4}$/` はこんな感じで、7ステップ

<img width="634" alt="スクリーンショット 2016-05-28 20.06.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/45822/a01ce871-385a-a8d1-8066-819749211106.png">

一方、`/^.*-.*$/` は..12ステップ

<img width="670" alt="スクリーンショット 2016-05-28 20.07.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/45822/55b2fe53-889f-7ebe-e056-425b38ca521e.png">


ということで、`.*` の方がステップ数が増えてパフォーマンスが悪くなっていそうです。
（実際パフォーマンスはこのステップ数に依存しそうなので、悪くなっていると思います。**後で時間測ります。**

# バックトラック（BACKTRACK）と出会いました。

上のツールを使うことで、正規表現の処理順序が視覚的に理解できます。

左から比較処理をしていくのですが、ステップ3を比較します。

<img width="630" alt="スクリーンショット 2016-05-28 20.29.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/45822/d72ee5ab-59c4-a85a-f1c5-7c8618ae211c.png">

<img width="647" alt="スクリーンショット 2016-05-28 20.21.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/45822/e4288147-5155-d5ac-1243-7c414184df87.png">

`(\d{3})`は`123`とマッチさせて次の比較に移るのに対して、`(.*)`は`123-4567`にマッチさせます。そして次の比較`（-)`をします。そしてコケます。

**`*`は貪欲なのです。（The asterisk is greedy.）**

そして、`123-4567`を諦めたアスタリスクは、`123-456`で再度トライします。そしてまたコケます。そして、次は`123-45`という具合に進めて行きます。

このようなアルゴリズムを「バックトラッキング（バックトラック法など）」と云います。上のサービスで赤文字で描かれていますね。「BACKTRACK」

**`*`や`+`は、まずは最大限マッチする範囲を広げて、つぎのパターンマッチを考え、ダメだったらひとつ範囲を狭めて再度やり直すわけです。**

分かってきました。

# １行で同じパタンが繰り返される場合も、もう迷わない。

`"name" => "taro"`

という行に対して、`/".*"/`というパターンは、どこにマッチしてるんだ？と、以前は迷っていました。が、backtrackと出会った僕は、もう迷いません。彼（asterisk）は貪欲なので、`"name" => "taro"` 全体にマッチすることがわかります。


# 時間を計測してみる

差がでやすように、サンプルをちょっと長くしておりますが。 rubyで調べます。

```rb
irb(main):001:0> require 'benchmark'
=> true
irb(main):002:0> Benchmark.bm do |x|
irb(main):003:1*   x.report {1000000.times do '123-456-789-123-456-789' =~ /\d{3}-\d{3}-\d{3}-\d{3}-\d{3}-\d{3}/ end}
irb(main):004:1>   x.report {1000000.times do '123-456-789-123-456-789' =~ /.*-.*-.*-.*-.*-.*/ end}
irb(main):005:1> end
       user     system      total        real
   0.680000   0.000000   0.680000 (  0.692865)
   2.800000   0.010000   2.810000 (  2.821374)
```

ちゃんと差がでてます。

以上、ありがとうございました！
javascriptで乱数を取得


そんなに難しい話ではない。

##３つのメソッド

前と後ろを含めるか否か。

```
// 0~100
var random = Math.round( Math.random()*100 );

// 1~100
var random = Math.ceil( Math.random()*100 );

// 0~99
var random = Math.floor( Math.random()*100 );
```

##例

```
var random = Math.round( Math.random () * 20 ) + 3;
//3~23

var random = Math.ceil( Math.random () * 55 ) + 2;
//3~57

var random = Math.floor( Math.random () * 10);
//0～9
  
var random = Math.floor( Math.random () * 10) + 1;
//1～10
 
var random = Math.floor( Math.random () * 5) + 1;
//1~5
```
【PowerShell】スネークケース⇔キャメルケース相互変換

```ps1
$snake = "get_current_directory"

# スネークケースからキャメルケースに変換
$camel = ([regex]"_([a-z])").Replace($snake, {
    $args[0].Groups[1].Value.ToUpper()
})

echo $camel #=> "getCurrentDirectory"
```

```ps1
$camel = "getCurrentDirectory"

# キャメルケースからスネークケースに変換
$snake = ([regex]"[A-Z]").Replace($camel, {
    "_" + $args[0].Groups[0].Value.ToLower()
})

echo $snake #=> "get_current_directory"
```

* `[regex]`で文字列を`System.Text.RegularExpressions.Regex`オブジェクトに変換する。
* `{}`で囲まれている部分はスクリプトブロックと呼ばれ、複数の処理を一つにまとめられる。スクリプトブロックは値として扱える。つまり、変数に格納できるし、メソッドの引数として渡すこともできる。イメージ的には高階関数、ラムダ式のようなもの。今回は`Regex.Replace`メソッドの第二引数にスクリプトブロックを渡している。
* スクリプトブロック呼び出し時のパラメータは、`$args`配列に格納されている。
* `Regex.Replace`メソッドには、第一引数に置換対象文字列を、第二引数に`MatchEvaluator`オブジェクトを受け取るものがある。今回はそれを使用している。PowerShellがどのようにしてスクリプトブロックを`MatchEvaluator`オブジェクトに変換しているかは不明。

下は、キャメルケース⇔スネークケースのコマンドレット。文字列は引数として与えてもいいし、パイプラインで与えてもいい。

```ps1
function ConvertCamelToSnake
{
    param
    (
        [Parameter(ValueFromPipeline=$true)]
        [string]
        $String
    )

    process
    {
        ([regex]"[A-Z]").Replace($String, {
            "_" + $args[0].Groups[0].Value.ToLower()
        })
    }
}

function ConvertSnakeToCamel
{
    param
    (
        [Parameter(ValueFromPipeline=$true)]
        [string]
        $String
    )

    process
    {
        ([regex]"_([a-z])").Replace($String, {
            $args[0].Groups[1].Value.ToUpper()
        })
    }
}
```
Finderなどで使用されるタグにアクセスする

Finderなどで使用されるタグ。
実はAppleEvent（AppleScript）などを使わずに直接アスセスすることが可能です。

このAPI、NSFileManagerあたりにありそうですが、なんと、NSURLに存在します。

NSURL.h内で Resource accessとコメントされている

```objc

- (BOOL)getResourceValue:(out id __nullable * __nonnull)value forKey:(NSString *)key error:(out NSError ** __nullable)error NS_AVAILABLE(10_6, 4_0);

- (BOOL)setResourceValue:(nullable id)value forKey:(NSString *)key error:(NSError **)error NS_AVAILABLE(10_6, 4_0);
```

で直接アクセスが可能です。

キーは `NSURLTagNamesKey` 
値の型は `NSArray<NSString *> *` です。

また、 `red`、 `orange` などを設定するとFinder上ではレッド、オレンジのタグが付きます。

以下、例。


```objc

- (NSArray *)tags
{
	NSError *error = nil;
	NSArray *tags;
	if(![self.url getResourceValue:&tags forKey:NSURLTagNamesKey error:&error]) {
		if(error) {
			NSLog(@"get tags error -> %@", error);
		}
		return @[];
	}
	return tags;
}
- (void)setTags:(NSArray *)tags
{
	NSError *error = nil;
	[self.url setResourceValue:tags forKey:NSURLTagNamesKey error:&error];
	if(error) {
		NSLog(@"set tags error -> %@", error);
	}
}

```
所属社員の検索と編集をするロジックをLaravelで書いてみた

1. フォームに会社名または社員名を入力する
2. 検索結果を一覧表示
3. 編集する社員を選び、ページ遷移
4. 編集完了ボタンで検索ページに戻る
5. 同じ会社の社員が一覧表示されている

同じ会社の社員情報を連続して編集するなら、１人終わったあとに同じ会社の社員が一覧表示していてくれてたら使いやすい。

#コード

##ルート

```php:route.php
Route::get('/admin/staff', StaffController::class.'@staffIndex');
Route::get('/admin/edit', StaffController::class.'@staffEdit');
```

##ビュー

```php:staff.blade.php
<form action="/admin/staff" method="get">
    <div class="row">
        <input type="text" name="name" placeholder="社名または社員名を入力">
    </div>
    <button class="button" type="submit" value="検索">検索</button>
</form>

<table class="staffs">
    <thead>
        <tr>
            <th>会社名</th>
            <th>氏名</th>
            <th>ふりがな</th>
            <th>&nbsp;</th>
        </tr>
    </thead>
    <tbody>
        @forelse ($testData as $staff)
            <tr>
                <td>{{$staff["company"]}}</td>
                <td>{{$staff["name"]}}</td>
                <td>{{$staff["kana"]}}</td>
                <td><a href="/edit">選択</a></td>
            </tr>
        @empty
            <tr>
                <td>データがありません</td>
                <td>データがありません</td>
                <td>データがありません</td>
                <td>データがありません</td>
            </tr>
        @endforelse
    </tbody>
</table>
```

編集画面は`edit.blade.php`で`/admin/staff`に戻るボタンを設置。

##コントローラー

`staffIndex`

- フォームデータがなければ全テストデータ一覧表示
- フォームデータがあればif文で分岐、一致してないテストデータを外して一覧表示
- sessionデータがあれば（遷移ページから戻ったとき）sessionデータをフォームデータにする

`staffEdit`

- ページ遷移と同時にsessionにデータを一時保存

```php:StaffController.php
<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class StaffController extends Controller
{
    protected $request;

    public function __construct(
        Request $request,
    )
    {
        $this->request = $request;
    }

    public function staffIndex(){
        $testData = [];
        $testData[] = [
            "company" => "株式会社クエスチョン",
            "name" => "鈴木たけし",
            "kana" => "すずきたけし"
        ];
        $testData[] = [
            "company" => "株式会社クエスチョン",
            "name" => "秋元健",
            "kana" => "あきもとけん"
        ];
        $testData[] = [
            "company" => "株式会社hatenabox",
            "name" => "山田太郎",
            "kana" => "やまだたろう"
        ];
        $testData[] = [
            "company" => "株式会社hatenabox",
            "name" => "山口亮太",
            "kana" => "やまぐちりょうた"
        ];

        if($data = old()){
            $formData = $data["company"];
        }else{
            $formData = $this->request->get("name");
        }

        if($formData){
            foreach($testData as $index=>$test) {
                if ($test["name"] !== $formData && $test["company"] !== $formData && $test["kana"] !== $formData) {
                    unset($testData[$index]);
                }
            }
        }
        return view('staff', [
            "testData" => $testData
        ]);

    }

    public function staffEdit(){
        $this->request->flash();
        return view('edit');
    }
```
Amazon Echoで照明を操作する


[Amazon EchoはSmart Home](http://www.amazon.com/smarthome-home-automation/b?ie=UTF8&node=6563140011)との連携ができPhillipsのHueと言った照明を音声でコントロールすることが出来ます。

けど、ちょっと試したいって時に、Hueはちょっと高いんですよね。。

いろいろ調べていたら、Raspberry Piで試せそうでした。（Intel Edisonでも動きます）

参考にしたのはこちらのサイト。
[Home Automation with Amazon Echo voice control](http://www.instructables.com/id/Hacking-the-Amazon-Echo/)

サイトのサンプルではログを表示するだけでしたので、GPIOを利用してAmazon EchoからLチカしてみました。

[![Raspberry Pi Smart Home](http://img.youtube.com/vi/m6EI2ymyBOs/1.jpg)](http://www.youtube.com/watch?v=m6EI2ymyBOs)
デバイスの検出と操作動画

# 手順
## 配線
Raspberry PiのGPIO 4を使うので、以下のように配線します。
![smarthome.png](https://qiita-image-store.s3.amazonaws.com/0/36184/939eb149-3564-89c2-fd67-58d093cade61.png "smarthome.png")
![IMG_7496.JPG](https://qiita-image-store.s3.amazonaws.com/0/36184/47e8eb93-636b-a530-fc09-6ba5e040141f.jpeg "IMG_7496.JPG")

## Raspberry Piでサンプルコード実行
元のソースを少しいじって、GPIOでLチカできるようにしてます

```
git clone https://github.com/sparkgene/echo.git
cd echo
sudo python example-gpio.py
```

違うPINを使う場合は、以下のところを直してください。
https://github.com/sparkgene/echo/blob/master/example-gpio.py#L10

## Amazon Echoからデバイスを探す
`Alexa, discover my devices` と語りかけると同じネットワークにあるデバイスを探してくれます。

デバイスが見つかると、Echoの管理画面に表示されます。
![スクリーンショット 2016-05-28 12.29.08.png](https://qiita-image-store.s3.amazonaws.com/0/36184/09b5aa02-6a2c-73fb-199a-ee3dabda840b.png "スクリーンショット 2016-05-28 12.29.08.png")


## Lチカ
ONにするときは `Alexa, turn on living`。
`living`はサンプルの中でそのように命名しているからで、お風呂場だったら`bathroom`のように変えてあげればいい。
https://github.com/sparkgene/echo/blob/master/example-gpio.py#L18

Offにするときは `Alexa, turn off living`

Alexaは違う言い方でも対応しており、単純に `Alexa, living on`、 `Alexa, living off` でも操作できます。

# あとがき
実際に家の照明を操作するとした場合、今回利用したLEDの代わりにリレーなどを使って、照明の電源をOn/Offする形になります。

けど、実際にこれを壁のスイッチの所に埋め込むのは大きすぎて厳しいですね。
やはり市販のものみたいに、コントローラとなるものは別置きにして、照明とコントローラ間は別の通信方法にするか、Wi-Fiとマイコン部分が専用なものにできれば、自作できるのかな。

また、Echo → Skill → Lambda → Raspberry Piという作りこみをすることで、ネット経由で外部からも操作できるようになりますが、それなりのタイムラグが出てしまいます。
照明みたいな家電を操作するぐらいは、今回のサンプルのように直接操作できたほうがストレスも無いし、大掛かりにならないので向いてると思います。
WPFのある生活（２日目）

二日目にして早速浮気をしてしまう私はきっと、欲求不満なのでしょう。

# MarkDownにハマる
Qiitaに１日目の記事を投稿する際に、Markdown記法なるものを初めて触りましたが、これは良いものだ。`So-Ro`気味の私の頭はMarkdownのことで支配されてゆくのでした。

## Markdownの書き方
あえて私が記事にする必要はないであろう。

## Markdownの活用案
Markdownの利点は"ほぼほぼプレーンテキスト"であること。完全なプレーンでは表現が物足りない、でもマークアップやリッチテキストは記述の手数も多く、学習にかかるコストがかさむ、というそれぞれの長所短所の中間ぐらいに位置する。運用の現場では、技術的な知識があまりない人も多いが、記法について覚える項目もさほどない為、負担も減らすことが出来そう。

また、データ量としてもプレーンテキストに毛が生えた程度なので、保存先も圧迫しない。

私の現場で選択できるデータベースとしては
- Access
- Excel(oledb)
- ファイルサーバ
- Exchange(メール形式)
ぐらいであろう。それらとI/OするPGでも用意し、取り出す際にパースしつつWebbrowserコントロールで表示すればいい。また、うまくパースできなかったりしても、元データはプレーンテキストで、人の目でも何を表現したいのか理解出来るという点も良い。

# 夢が広がる
Markdownをキーワードに調べていると、Markdown形式からdocxやPDFに変換するライブラリなども見つかった。
日頃のメモや手順書などのメモからドキュメントを生成できる。元データはプレーンテキスト、文字中に自分変数などを設定しておき、Replaceすれば簡単に状況にあった内容のドキュメントを生成できる。

# 夢の終わり
現場で却下された。
【TechShop JP】CNC木工旋盤Tips

# 型番
3DT-SD50
[メーカーページ](http://www.asahikawakikai.com/3d_machine.html)（旭川機械工業株式会社）

# 操作動画
https://youtu.be/w5BHBJja4DI

# 材料
角材~~500~~400mmまで（加工領域~~400~~325mm）
チャックは５種類、100mm x 100mmまで対応
* 15〜35
* 40〜50
* 55〜65
* 70〜85
* 90〜100

# チップソー
３種類
* 165φ x 1.6mm
* 190φ x 1.6mm
* 255φ x 3.0mm

# ルーター
SBUがまだはじまってない

# 計算条件の入力

１回転あたりのピッチ　0.1〜0.5mm（適用範囲）標準0.2mm
１回転あたりのデーター数　50〜200Point/Rev（適用範囲） 標準100point
チップソーの半径 82.5mm/95mm/127.5mm
チップソーの厚さ 1.6mm/3mm

# Tips
DesignSparkが相性がいいらしい
Macで出力したSTLを使用すると、STLからGコードへの変換で変なエラーがでます。
2016/10に変換ソフトが新しくなった（Wood Cam ver1.00）ので以上の不便さは解消されてるかも？
Z軸は原点からプラス方向へ（SBUで教わる）
X,Y軸は原点を中心に。123D DESIGNではマイナス方向にグリッドがなく、こんな感じになります。
<img width="400" alt="20160528-180705.png" src="https://qiita-image-store.s3.amazonaws.com/0/59514/a319dc74-19f2-e9a0-5cfa-000829adbd6c.png">

書き出したSTLの改行コードがLFのみになっているので、CR+LFに変換。
```$ perl -p -e 's/\n/\r\n/' <lf.stl > crlf.stl```

# 課題
角材とXY軸の合わせ方が謎
ざっくりとこんなこと身についているかリスト(Java編)

#Java力ついたかなリスト
□　変数が使えるようになった
□　配列が使えるようになった
□　比較演算が使えるようになった
□　分岐が使えるようになった
□　繰り返し処理が使えるようになった
□　クラス定義・オブジェクト作成ができるようになった
□　継承を使えるようになった
□　コンストラクタが使えるようになった
□　インターフェースが使えるようになった
□　カプセル化が使えるようになった
□　例外処理が使えるようになった
□　APIを活用できるようになった
□　ファイル操作ができるようになった
□　デバッグができるようになった
□　データベース接続ができるようになった
□　バリデーションチェックができるようになった
□　JavaDocが書けるようになった
Eloquentのcreateメソドを使ったデータの挿入

#ポイント

- エラーを読み解く
- `create`メソドを使用
- データの挿入を許可するプロパティの指定（`$fillable` or `$guarded`）
- 日付ミューテーターの指定
- フォームの `name`値とカラム名をつなげる

#コード

```php:MemberController.php
<?php
namespace App\Http\Controllers\TestConnect;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Carbon\Carbon;
use App\Http\Model\Member;
use App\Http\Repository\MemberRepository;

class MemberController extends Controller
{
    protected $request;
    protected $member;

    public function __construct(
        Request $request,
        MemberRepository $product
    ){
        $this->request = $request;
        $this->member = $member;
    }

    public function postMemberRegister(){
        $formData = $this->request->all();
        $this->member->addMember($formData);

        return view('admin.member.complete');
    }
}
```

```php:MemberRepository.php
<?php
namespace App\Http\Repository;
use Carbon\Carbon;
use App\Http\Model\Member;

class MemberRepository
{
    public function __construct()
    {
        $this->now = Carbon::now();
    }

    public function addMember($data){
        Member::create([
    　　　　　　     'name' => $formData["name"],
　　　　　         　'email' => $formData["mail"],
            'accountcode' => $formData["code"]
        ]);
    }
}
```

```php:Member.php
<?php
namespace App\Http\Model;
use Illuminate\Database\Eloquent\Model;

class Member extends Model
{
    protected $table = 'account';
    protected $dates = [];
    public $timestamps = false;
    protected $fillable = [ 'name', 'email', 'accountcode' ];
}
```

#エラー

##MassAssignmentException

DBになんでもかんでもデータがぶちこまれると大変なので、Eloquentは `$fillable` または `$guarded`を使ってデータ挿入を許可するプロパティを与える必要がある。

###$fillable（ホワイトリスト方式）

**ホワイトリスト方式**という。

```php:Model.php
    protected $fillable = ["name", "email"];
```

これでテーブルの「name」「email」はデータ挿入が可能になる。
（Mass Assignmentできるようになる、というらしい）

###$guarded（ブラックリスト方式）

```php:Member.php
    protected $guarded = ["id", "created_at", "updated_at"];
```

今度は逆に「id」「created_at」「updated_at」はデータ挿入が不可、その他は可能となる。

##SQLSTATE[42703]: Undefined column: ~

>QueryException in Connection.php line 673:
>SQLSTATE[42703]: Undefined column: 7 ERROR: column "updated_at" of >relation "account" does not exist
>LINE 1: ...sert into "account" ("type", "name", "updated_a...

Eloquentではデフォルトで`created` `updated_at` を勝手に書き込むらしく、これは「書き込むとこないやんけ！」って怒ってるらしい。（今回のテーブルにこの２項目はなかった）

###日付ミューテーター

[Laravel公式ドキュメント](https://laravel.com/docs/5.2/eloquent-mutators#date-mutators "Laravel公式ドキュメント")にもこの辺のことは書いてある。
日付ミューテーターを使用する属性をEloquentに知らせるには、dates配列に属性名を追加するらしい。
この[サイト](https://laravel10.wordpress.com/2015/03/04/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AElaravel-5-12-eloquent-%E3%82%A2%E3%82%AF%E3%82%BB%E3%83%83%E3%82%B5%E3%81%A8%E3%83%9F%E3%83%A5%E3%83%BC%E3%83%86%E3%83%BC%E3%82%BF%E3%83%BC/ "サイト")もわかりやすかったです。

###解決法

今回は **日付のカラムがない** ので、以下を追記。

```php:Member.php
protected $dates = [];
public $timestamps = false;
```

これで **日付として認識するものはありません** ということになるんだと思う。
`$timestamps` はよくわかりませんが、ないとDBに挿入できなかったので。

#フォームのname値とカラム名のリンク

下のコードのようにすると、フォームの`name`値とカラム名が一致してないものはDBに挿入されないので注意。

```php:MemberRepository.php
    Member::create($data);
```
Cisco WLC クライアント数を Kibana で可視化


PI とか使えば可視化されますが、Kibana で見たいので SSID ごとのクライアント数を取得し、json で吐き出すスクリプトを書きました。

```
from pysnmp.entity.rfc3413.oneliner import cmdgen
import json

wlc_host  = "WLC HOSTNAME"
snmp_comm = "WLC SNMP COMMUNITY"
SSIDs     = [ "SSID1","SSID2","SSID3" ]

cmdGen = cmdgen.CommandGenerator()

count  = {}
result = {}

errorIndication, errorStatus, errorIndex, varBindTable = cmdGen.nextCmd(
            cmdgen.CommunityData(snmp_comm),
            cmdgen.UdpTransportTarget((wlc_host, 161)),
            '1.3.6.1.4.1.14179.2.1.4.1.7',
            )

for varBindTableRow in varBindTable:
    for name, val in varBindTableRow:
        if val in count:
            count[str(val)] = count[str(val)] + 1
        else:
            count[str(val)] = 1

for SSID in SSIDs:
    if SSID in count:
        result.update({ SSID:count[SSID]})
    else:
        result.update({ SSID:0 })

print json.dumps(result, sort_keys=True,)
```

実行結果はこんな感じ

```
{"SSID1": 5, "SSID2": 128, "SSID3": 0}
```

これを curl で ElasticSearch に POST すると Kibana で見られます。

```
JSON=`/usr/bin/python Clients.py`
/usr/bin/curl -X POST -d "json=$JSON" http://localhost:8080/wifi.clients
```
bashのキーバインド(キーボードショートカット) まとめ

# 移動系
|key|説明|
|:-----------|:------------:|
|Ctrl + a| 行頭へ移動|
|Ctrl + e |行末に移動|
|Ctrl + b |1文字戻る|
|Ctrl + f |1文字進む|

# 削除系
|key|説明|
|:-----------|:------------:|
|Ctrl + d |カーソル位置にある文字を削除|
|Ctrl + k |カーソル位置から行末まで削除|
|Ctrl + u |行頭からカーソル位置まで削除|
|Ctrl + w |カーソル位置からその左側の最初のスペースまで削除（スペースが無い場合は行頭まで削除）|
|Ctrl + h |カーソルの左にある１文字を削除（BackSpaceに相当） |
|Ctrl + y |削除した文字を貼り付ける|

# 表示系
|key|説明|
|:-----------|:------------:|
|Ctrl + l |画面をクリアしてカレント行（現在いる行）を再表示する |
|Ctrl + q |画面への出力を再開|
|Ctrl + s |画面への出力を停止|
|Ctrl + t |カーソル位置の文字とその左側の文字を入れ替える|

# 検索系
|key|説明|
|:-----------|:------------:|
|Ctrl + r|前打ったコマンドを検索|

# コマンド系
|key|説明|
|:-----------|:------------:|
|Ctrl + m |コマンドを実行|
|Ctrl + n |コマンド履歴の１つ後ろのコマンドの表示|
|Ctrl + p |コマンド履歴の１つ前のコマンドの表示|
|Ctrl + c |現在のコマンドを強制終了|
|Ctrl + z |現在のコマンドを一時停止|
|!! |1つ前に実行したコマンドを再実行|

# おまけ
```
# set -o vi
```
とするとキー操作がviスタイルになる。
emacsスタイルに戻したい場合は、以下のコマンドを実行すればOK。

```
# set -o emacs
```
Python(Xlwings)を使ってExcelを操作してみる


今度はXlwingsを使ってExcelを操作してみる。
表現がExcelっぽいからか、Pandas/XlswWriterより使いやすい気がする。
直接Excel触るからのインストールが必要だけど。

## 準備
xlwingsをインストール

```sh
conda install xlwings
```

Excelをインストール。
今回使っているバージョンはExcel for mac 2011


## Excleファイルを作成して書き込み

```py
# -*- coding: utf-8 -*-
import xlwings as xw
import matplotlib.pyplot as plt

# Excel New Bookを作成
wb = xw.Workbook()

# セルに値をセットする
xw.Range('A1').value = 'Foo 1'

# 値を取得する
str = xw.Range('A1').value
print(str)

# 指定したセルを基準に表データをセットする
xw.Range('A1').value = [['Foo1','Foo2', 'Foo3'], [10, 20, 30]]

# 指定したセルを基準に表データを取得する
table = xw.Range('A1').table.value
print(table)

# 指定した範囲のデータを取得する
table2 = xw.Range('A1:C2').value
print(table2)

# ワークブックやシートを指定する
table3 = xw.Range('Shett1', 'A1:C2', wkb=wb).value
print(table3)

# matplotlibのグラフを追加する(エクセルのグラフを作成できるけど)
fig = plt.figure()
plt.plot([1,2,3,4,5])
plot = xw.Plot(fig)
plot.show('Plot1', left=xw.Range('D3').left, top=xw.Range('D3').top)

# 保存
file_name = "xlwings_sample.xlsx"
wb.save(file_name)
```

## 既存のファイルを読み込む

```py
# 既存のファイルを読み込み
wb2 = xw.Workbook(file_name)
xw.Range('A1').value = '書き込みしたよ'
wb2.save(file_name)
```
VsiaulStudioの拡張

Windows版のUnityをインストールすると標準でVisualStudioがインストールされるようになりましたが、
標準のVisualStudioでは機能が足りないので個人的に気に入っている拡張機能をまとめてみました。
自分好みのエディタをゲットして楽しくゲーム開発しましょう！
10万円くらい払って購入していたVisualStudioが今や無料で使用可能。良い時代になったものですね！
※ReSharperのみ有料ですがとても便利なので特にオススメです！
  
拡張機能のインストール方法
---
拡張機能のファイルをDL後、実行するだけで拡張機能をVisualStudioに導入することができます。
導入時間わずか1分！

拡張機能の削除方法
---
https://msdn.microsoft.com/ja-jp/library/dd293639(v=vs.110).aspx

ClaudiaIDE
---
- URL  
https://visualstudiogallery.msdn.microsoft.com/9ba50f8d-f30c-4e33-ab19-bfd9f56eb817
- 概要  
エディタの背景に自分のお気にリの画像を透過表示させることができる拡張機能です。
- 使用例  
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/ea08cbef-a39f-dff7-b3b8-3e1f8e1dfd38.png)
- 画像の変更方法  
http://qiita.com/new_spaghet/items/855d5411ffdba0c7a849

CodeAlignment
---
- URL  
https://visualstudiogallery.msdn.microsoft.com/7179e851-a263-44b7-a177-1d31e33c84fd
- 概要  
ボタンを押すだけで=を基準にコードを縦に整形することができます。
- 使用例  
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/e003c168-810d-7e2b-60f3-75892fe11006.png)


Go To Definition
---
- URL  
https://visualstudiogallery.msdn.microsoft.com/4b286b9c-4dd5-416b-b143-e31d36dc622b
- 概要  
Ctrlを押しながらジャンプ元のメソッドや変数などをクリックすると定義元にジャンプすることができます。


Indent Guides
---
- URL  
https://visualstudiogallery.msdn.microsoft.com/e792686d-542b-474a-8c55-630980e72c30
- 概要  
インデントが分かりやすいように、縦に線を入れることができます。

Trailing Whitespace Visualizer
---
- URL  
https://visualstudiogallery.msdn.microsoft.com/a204e29b-1778-4dae-affd-209bea658a59
- 概要  
不要なタブや半角スペースがあった場合には赤く警告表示してくれます。


C# outline 2015
---
- URL  
https://visualstudiogallery.msdn.microsoft.com/9390e08c-d0aa-42f1-b3d2-5134aabf3b9a
- 概要  
アウトライン機能を拡張することができます。


CodeMaid
---
- URL  
https://visualstudiogallery.msdn.microsoft.com/76293c4d-8c16-4f4a-aee6-21f83a571496
- 概要  
コード整形用の拡張機能です。
- 使い方  
http://moriblog.kit-eng.com/?p=1199

StyleCop
---
- URL  
https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae
- 概要  
C#のコーディング規約にそった内容かどうかをチェックしてくれます。誤っていた場合、警告がでます。
- 使い方  
http://www42.atwiki.jp/jfactory/m/pages/57.html?guid=on#id_c1de316d  
http://d.hatena.ne.jp/y_maeyama/20120304/1330846135  
初期設定では警告レベルが強すぎるので規約除外設定を個別にして使っています。

ReSharper
---
- URL  
https://www.jetbrains.com/resharper/
- 概要  
StyleCopはコーディング規約違反の警告を表示してくれるが、その修正方法までは提示してくれない。  
ReSharperを導入していると、コーディングの提案を自動でしてくれます。  
StyleCopとReSharperのタッグが最強！しかしReSharperは有料です。
- 使い方  
http://qiita.com/papeMK2/items/f85c21ad07d3ba04e572
- 設定変更  
http://qiita.com/takesuke/items/c71e4c410ae57d191f31
- ReSharper 9でもStyleCopの支援機能を使用できるようにする方法  
http://opcdiary.net/?p=29374
- CodeMaidとReSharperの連携  
VisualStudioのツールバーの[CodeMaid]->[Option]->[Third Party]を開き  
「Run JetBrains ReSharper deanup」にチェックを入れる

Visual Studio 2015 Color Theme Editor
---
- URL  
https://visualstudiogallery.msdn.microsoft.com/6f4b51b6-5c6b-4a81-9cb5-f2daa560430b
- 概要  
VisualStudioのエディタテーマを設定することができます。

Codic Extension
---
- URL  
https://visualstudiogallery.msdn.microsoft.com/b24a6e62-c6af-4cc2-aa5b-c2ae39195d7f
- 概要  
VisualStudioにCodicの機能を追加
- 使い方  
https://github.com/codic-project/codic-vs-extension


おまけ
---
- エディタ背景  
https://studiostyl.es/
- 和英辞典  
http://ejje.weblio.jp/
- 変数、メソッド、クラス名に迷った時は…  
https://codic.jp/
zf2 コントローラーbefore方法

コントローラーにてすべてのアクションで共通する動作を定義するには

コントローラークラスにて

```
use Zend\Mvc\MvcEvent;
```


と

```
    /**
     *
     * @param \Zend\Mvc\MvcEvent $e
     * @return type
     */
    public function onDispatch(MvcEvent $e) {

        // ここにbeforeの内容

        return parent::onDispatch($e);
    }
```

を追加する。
MacのメーラーはAirmailがよさそう

MacOSXを仕事のメイン機になって数か月。
Macの標準のmail.appをつかってましたが、
仕事上、Windowsのお客様とやり取りすることが多く、
その際に、Excelの添付ファイルを受け取った際、
ファイル名が????と文字化けしているケースがありました。

いろいろ調べていったのですが、
てっとり早く、メーラーをairmail(beta)をさわってみたところ、
mail.appで文字化けしていたファイルが
airmailでは文字化けしていないということを発見しました。

現段階だと、ラベルが有効に動かないバグがあったりするもの（labels not working)
個人的には、ラベルより添付ファイル名が化けて、やりとりが正確にできないほうが
いやだったのと、そのうちラベルはなおるだろうということで、airmailにしました。

macメインで仕事していらっしゃる方で、もし同様のお悩みがあればぜひairmailを
試してみるとよいと思います。
betaバージョンは無料とのことです。

-- 追記 --
その後、使ってみて個人的レビューを記載します。
これから使って見ようと思う方に、何かの参考になれば幸いです。

・スレッド表示のメールが見づらい
　→スレッド形式の表示に固定されてしまう。
　　　昔ながらの１件１件表記に変更できない。

　　　そして、スレッド形式つかっていて、一番デメリットだった事ととして、
　　　　例えば、パスワードつき添付zipが送られてきて、
　　　その後、パスワードのみが届くといったケースにおいて
　　　スレッド表示なので、最新のパスワードのメールは表示されているものの、
　　　直前の添付を抽出するのに、気づきづらいし抽出しずらい。
　　　個人的な主観なので、慣れてしまえばですがね...

・使わない機能が多い
　　→基本的に、メールを正確にやり取りできればよく、使わない機能が多い。


ただ、良い所として、添付ファイル文字化けをこのソフトでは起こっていないので
標準のMailには戻れないのが現状です。
Jenkinsの左上のおじさんアイコンを変更する

Jenkins　ver2.5で確認。

* おじさんアイコンを変えたい画像を用意する。
* JENKINS_HOME の /userContent にアイコンをアップロードする（icon.pngとします）。
* 以下のようなCSSを用意して、同様に　/userContent　にアップロードする（icon.cssとします）。

```css
#jenkins-head-icon {
content:url('/userContent/icon.png');
height:36px;
}
```
* Jenkinsの管理→プラグインの管理→Simple Theme Pluginをインストールする。
* Jenkinsの管理→システムの設定→Theme→URL of theme CSS に /userContent/icon.css を指定する、
* ちょっと幸せになれます

私は、https://github.com/jenkins-contrib-themes/jenkins-material-theme のCSSをダウンロードして、最下部にこれを追加しています。
同様に、faviconについても、以下を参考に変更することができました。

http://sleepingcatsyndrome.com/post/102070227470
onlineTool > 3次元ベクトルを可視化

## 要望

1. 多数のベクトルデータがあるとする (30本くらい)
2. それらベクトルデータを3D空間で見たい
3. ぐりぐり動かしたい
4. PC環境に依存しないのが望ましい

## 選択肢

### gnuplot on CentOS

要望の4に目をつむると gnuplotではできそう。
http://d.hatena.ne.jp/pyopyopyo/20051118/p1

> set arrow from  x1,y1,z1  to x2,y2,z2


### STL on github

githubにSTLを置くという方法
http://qiita.com/7of9/items/d107a886d9f83c5c86a5

ベクトルデータからSTLファイルを作るツールを作らないといけない。
STLは三角形の表示のようで、ベクトル表示には向かないか?

変換やgithubへのuploadも手間だ。


## 3D Vector Plotter

3本までプロットできる
https://academo.org/demos/3d-vector-plotter/

上記の30本ベクトル読込み版が欲しい。
探したがいいのが見つからなかった。
virtualbox ディスクサイズを増やす(Mac->Win7)


# ホストがMac→ゲストwindowsのディスクを拡張する方法

「可変ディスク」に設定しても、容量満タンになっても勝手に拡張はしない。

ホスト側でコマンドをうって、ゲスト側で拡張した領域を既存に適用する操作が必要となる。


概要
-----
１．　ホスト側のOSのターミナルからコマンドをうって領域拡張
２．　ゲスト側の方で、追加した領域を使う設定を行う。


具体例
-----

Step1. ターミナルより以下コマンドを実行
```
VBoxManage modifyhd /Users/xxx/VirtualBox\ VMs/Win7/Win7.vdi --resize 64424
```
※ xxxはMacOSユーザ名に変換
※ 64424は6０Gへ増量

Step2. ホスト側で、パーテーションの領域拡張を行う

コントロールパネル＞検索ワードに「管理」＞パテーションがほにゃららをクリック
拡張対象の領域を右クリックして、「拡張」を選択。以上

詳細は、以下のサイトの領域拡張の図を参照
http://tech.ewdev.info/2014/10/2140/
（上記は、WinからWinへの設定）
HomeBrewのUpdateが失敗する


時々気がついた時にBrewのUpdateをしているが、

	$ brew update
	$ brew upgrade

ある日、	/usr/localのパーミションがないと怒られるようになった。

何が問題なのか確認する

	$brew doctor
	
解決方法まで教えてくれる。

	$ sudo chown -R $(whoami) /usr/local
	
まぁそれはそうなんでしょうけど、
そもそものオーナーはどうなっていたんだっけな。
jQueryでサムネイル画像をセンタリング+トリミング。

#はじめに。
個別にサムネイル画像を準備できれば問題ないのですが、システム案件や顧客側で更新作業をする場合など、
それが難しい場合にjQueryで画像をリサイズ、センタリングしサムネイルを表示する覚え書きです。
# 表示イメージ
縦長、横長、パノラマの画像を使っていますが、こんなかんじでトリミングしていきます。
![www.jpg](https://qiita-image-store.s3.amazonaws.com/0/119342/49bed610-8fcb-30bf-cf27-706f49d9c241.jpeg)

（ 画像はこちらからお借りしました。http://www.ashinari.com/ ）
# サムネイル画像を配置
##HTML
```html

<div class="trimming"><img src="image1.jpg"></div>
<div class="trimming"><img src="image2.jpg"></div>
<div class="trimming"><img src="image3.jpg"></div>
<div class="cle"></div>
```
##css

```css

div.trimming {
  width:250px;
  height:250px;
  overflow:hidden;
  float: left;
  margin: 10px;
  border: solid 1px #666;
  }

.trimming img { position:relative;}

.cle { clear: both;} /*float解除用*/

```

![マウスonでズームアウトとか-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/119342/0c12d06e-b008-e940-3dc8-904cb187a1ed.jpeg)

この段階では画像は原寸。
`div.trimming`からはみ出た部分が`overflow:hidden；`で切り抜かれているだけの状態です。

#jQueryでリサイズ+センタリング
まずはjQueryの読み込み。
`<script type="text/javascript" src="jquery.min.js"></script>`


次にこのコードを書きます。

```js

jQuery.event.add(window, "load", function(){
        var sl = '.trimming img'; //リサイズしたい画像のクラス名
        var fw = 250;        // サムネイルの幅
        var fh = 250;        // サムネイルの高さ
        var iw, ih;
        $(sl).each(function(){
            var w = $(this).width(); // 画像の幅(原寸)
            var h = $(this).height(); // 画像の高さ(原寸)
            
            //横長の画像の場合
            if (w >= h) {
                iw = (fh/h*w-fw)/2
                $(this).height(fh); //高さをサムネイルに合わせる
                $(this).css("top",0);
                $(this).css("left","-"+iw+"px");//画像のセンター合わせ
            } 
            
            //縦長の画像の場合
            else {
                ih = (fw/w*h-fh)/2
                $(this).width(fw); //幅をサムネイルに合わせる
                $(this).css("top","-"+ih+"px");//画像のセンター合わせ
                $(this).css("left",0);
            }
        });
    });
```
画像が横長の場合…高さをサムネイルにあわせて、x方向にセンター合わせ
画像が縦長の場合…幅をサムネイルにあわせて、y方向にセンター合わせ　をやってる感じです。

![マウスonでズームアウトとか-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/119342/9ad39c0a-cd81-8d8f-aa9f-7c135fbd39aa.jpeg)
やったー！できたよーー！！
これだと、画像のサイズがバラバラでもアス比が一定でなくてもひとまずそれっぽいサムネイルが表示できます。


#さいごに
新しいブラウザのみを対象とするなら`object-fit:cover`で一発ですし
（でも未だにsnowleopardしか支給されてない人だっているんです私みたいに。）
おなじjQuery使うにしても[「imgLiquid」](http://kwski.net/jquery/1077/)とかの方が断然便利なんですけどね。


こういう実装にしたのはマウスオーバーで動き付けたい時に「imgLiquid」だと上手くいかなかったからなのですが
その点はまた次回書きたいと思います。
#参考にさせていただきました
- [width()とheight()で画像のサイズを変更する](http://combitaro.net/article/140)
- [jQuery とCSS で画像をトリミングしてセンタリング表示する方法](http://www.webantena.net/css/jquery-css-trimming/)
幾何学 > STL(ASCII)に使うsurface normalを計算 > 外積 > numpyのcross()がある

[STLの資料](http://www.mech.iwate-u.ac.jp/~hirose/ockitatohoku/ref/wakashimasensei-text-6.pdf)
のp4などを見ると、ASCII形式でSTLファイルを作れるようだ。

その場合、3角形のsurface normalは計算しないといけないだろうか。

## code v0.1

python実装を見つけた。
http://stackoverflow.com/questions/1984799/cross-product-of-two-vectors-in-python

実行してみた
http://ideone.com/KjukfJ

```py
import numpy as np

def cross(a, b):
    c = [a[1]*b[2] - a[2]*b[1],
         a[2]*b[0] - a[0]*b[2],
         a[0]*b[1] - a[1]*b[0]]

    return c
    
a = np.array([0.0, 1.0, 0.0])
b = np.array([1.0, 0.0, 0.0])
c = cross(a,b)

print c
```

```txt:結果
Success	time: 0.11 memory: 25336 signal:0
[0.0, 0.0, -1.0]
```

それっぽいのが出ているようだ(幾何学は苦手)。

STLのファイルにするには以下の手順になりそうだ。

1. 頂点座標を設定
2. 頂点座標からベクトルを作成
3. 外積


## code v0.2

numpyを使うとしたら、cross関数が用意されていた。

http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.cross.html

http://ideone.com/ru7PYj

```py
import numpy as np
 
def cross(a, b):
    c = [a[1]*b[2] - a[2]*b[1],
         a[2]*b[0] - a[0]*b[2],
         a[0]*b[1] - a[1]*b[0]]
 
    return c
 
a = np.array([0.0, 1.0, 0.0])
b = np.array([1.0, 0.0, 0.0])
c = cross(a,b)
d = np.cross(a,b)
 
print c
print d
```

```
[0.0, 0.0, -1.0]
[ 0.  0. -1.]
```
SDL_PollEventの実装を解析

![SDL_logo.png](https://qiita-image-store.s3.amazonaws.com/0/28417/61b007d2-9e42-d039-8453-46ad129a3b8e.png)


OSのメッセージ処理とゲーム実装部分分離についての参考のためにSDLを解析したときのメモを公開します。

# 注意点
昔Blogに書いた記事の転載です。そのため、SDLのバージョンはリビジョン7724（2013/8/31更新とかなり古い）を参考にしているので現状の実装と異なる場合があります。
ウィンドウプロシージャ周りの挙動はWindowsOSを前提としています。

# 対象
基本的なC/C++の知識があること。
OSが介在するプログラミングの知識があること。
基本的なSDL/SDL2のプログラミングの知識があること。

# SDL_PollEventの正体


　結論から言ってしまうとSDL_PollEventの中身は通常のWin32アプリケーションで実装されるメッセージポンプと同様の処理を行うSDL_PumpEventsと、メッセージキューに貯まっているウィンドウズメッセージを横取りするSDL_PeepEventsによって実装されている。

　SDL_PumpEventsの実装を辿っていくと最終的に次のコードが見つかる。これは典型的なメッセージポンプ処理の実装。

```cpp:SDL_dibevents.c
void DIB_PumpEvents(_THIS)
{
    MSG msg;

    while ( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) ) {
        if ( GetMessage(&msg, NULL, 0, 0) > 0 ) {
            DispatchMessage(&msg);
        }
    }

    if ( SDL_GetAppState() & SDL_APPMOUSEFOCUS ) {
        DIB_GenerateMouseMotionEvent( this );
    }
}
```

SDL_PeepEventの実装を辿っていくと「SDLが管理しているイベントキューの中にある全てのイベント種類の中から最初の１つを取得する」という動作を行う。取得したイベントはSDL_CutEventが呼び出され、メッセージキューから消える。


# 追記

リビジョン10179では構成が変わり、SDL_PollEvent()からすぐにSDL_WaitEventTimeout()が呼び出され、SDL_WaitEventTimeout()内ではSDL_PumpEvents()とSDL_PeepEvents()が実行されて処理を返すようになった。

SDL_PumpEventsは環境によって呼び出されるコードが変わり、Windows環境では下記に引用するWIN_PumpEventsが呼び出されるように仕様変更されたようだ。
内容は結局一緒で典型的なメッセージループを回している。


```cpp:SDL_windowsevents.c

void
WIN_PumpEvents(_THIS)
{
    const Uint8 *keystate;
    MSG msg;
    DWORD start_ticks = GetTickCount();

    if (g_WindowsEnableMessageLoop) {
        while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
            if (g_WindowsMessageHook) {
                g_WindowsMessageHook(g_WindowsMessageHookData, msg.hwnd, msg.message, msg.wParam, msg.lParam);
            }

            /* Always translate the message in case it's a non-SDL window (e.g. with Qt integration) */
            TranslateMessage(&msg);
            DispatchMessage(&msg);

            /* Make sure we don't busy loop here forever if there are lots of events coming in */
            if (SDL_TICKS_PASSED(msg.time, start_ticks)) {
                break;
            }
        }
    }

    /* Windows loses a shift KEYUP event when you have both pressed at once and let go of one.
       You won't get a KEYUP until both are released, and that keyup will only be for the second
       key you released. Take heroic measures and check the keystate as of the last handled event,
       and if we think a key is pressed when Windows doesn't, unstick it in SDL's state. */
    keystate = SDL_GetKeyboardState(NULL);
    if ((keystate[SDL_SCANCODE_LSHIFT] == SDL_PRESSED) && !(GetKeyState(VK_LSHIFT) & 0x8000)) {
        SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_LSHIFT);
    }
    if ((keystate[SDL_SCANCODE_RSHIFT] == SDL_PRESSED) && !(GetKeyState(VK_RSHIFT) & 0x8000)) {
        SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_RSHIFT);
    }
}
```

SDL_PeepEventsの役割は変更なく、「SDLが管理しているイベントキューの中にある全てのイベント種類の中から最初の１つを取得する」という動作を行う。取得したイベントはSDL_CutEventが呼び出され、メッセージキューから消える。
家電の運転状態を引っこ抜くためにLEDに半田付けしてみた

#はじめに
赤外線リモコンで家電制御しようとすると、リモコンの信号が確実に届いたかどうかの確認方法がなくて困ります。
リモコンの送信に失敗したらリトライしたい。機器連携とはかくあるべきだ！

そこで、電源インジケータのLEDに配線を半田付けして拾ってくるという方法を考えてみます。

#前提となるLED駆動回路

LEDの点灯方法はいろいろあると思うのですが、ここでは下図の①か②を前提とします。なぜこれかというと、たまたま私がいじったエアコンがそうだったから、です。

![LED.png](https://qiita-image-store.s3.amazonaws.com/0/104360/e1bee31c-94a1-daa7-6985-abb4f5fea47a.png)


#回路

LEDのアノード側を直接GPIOに入れても動くとは思うのですが、5V I/OのGPIOだと（たとえばArduinoだと）、点灯しててもLOW側に張り付いたままになりそうです。

そこでトランジスタを用いた反転増幅回路を組みます。

![LED2.png](https://qiita-image-store.s3.amazonaws.com/0/104360/d7845459-f29c-f30d-8825-dcbb72401129.png)

簡単に動作を説明しておきます。

LEDが光ってないときは、ベース・エミッタ電流が流れないので、コレクタ電流も流れず、プルアップによりGPIOがHIGHになります。

LEDが光っているときは、ベース・エミッタ電流が流れて、それにともないコレクタ電流が流れて、プルアップからの電流がそっちに引っ張られて、GPIOはLOWになります。

「反転」増幅回路なので、光っているときにLOW,光ってないときにHIGHになるところがポイントです。

家電側・自作回路側で 3.3V I/O と 5V I/Oが混在してても問題なく動きます。

PULLUPの所に抵抗値を書いてませんが、最近のマイコンにはソフトウェアプルアップがついていると思うのでそれを使うとよいでしょう。もしついてない場合は10kΩ程度の抵抗を使えばいいと思います。

トランジスタのベース側の抵抗値は4.7kと書いてますが、1k～10kぐらいなら大丈夫だと思います。ちなみに、抵抗値が高くなるほど家電側に負担を掛けなくなり、しかし自作回路が不安定になります。

#たくさんのLEDに配線したい

せっかく配線するなら、家電にあるLEDの数だけ配線したい気持ちになります。そうするとLEDの数だけ抵抗とトランジスタを用意して、それぞれ配線しなければならないのですが、結構面倒です。

そんなときは、トランジスタアレイを使いましょう！

 
秋月電子などで売られている [TD62083APG](http://akizukidenshi.com/catalog/g/gI-09634/) が利用できます。8回路分のトランジスタとベース制限抵抗が入っていると考えて大丈夫です。

![TD62083APG.png](https://qiita-image-store.s3.amazonaws.com/0/104360/a2e82620-60f9-bc5a-e3d2-4f76c250ddf9.png)


Ix にLEDのアノード側を、 Ox にGPIO をつなげればOKです。もちろんGNDはGNDにつないでください。COMMONは自作回路側のVCCをつなげるんですが、保護回路用なのでつながなくても動きます。なお、プルアップ抵抗はついてないので、マイコン側のソフトウェアプルアップを有効にしましょう。

（実はこれ、データシート上の入力電圧（出力オン）が「2.5V」と書かれているので、LEDの電圧より高くてダメなんですが、手元の実験では1.6Vぐらいから出力オンになります。）


#PWM制御されている場合がある件

ここまで読み進めることができた方は、LEDの明るさを変えるためにPWM制御を試してみたことがあると思います。

家電もPWM制御している場合があります。

私が試してみたエアコンも、PWM制御していました。

最初それに気づかず、点灯時にHIGHになったりLOWになったり不安定になってしまう原因が分からず四苦八苦してしまいました。

PWM制御されているLEDの点灯状態を取得する場合は、LOWになったら（点灯したら）即時点灯と判断し、消灯した場合はPWM周期分消灯し続けていたら消灯と判断するようプログラムを組む必要があります。

#実例

エアコンを分解して、
![AIRCON1.jpg](https://qiita-image-store.s3.amazonaws.com/0/104360/f8f197a4-4971-74a3-a7ae-4c6d38a347e0.jpeg)

制御基板を取り出してLEDに配線
![AIRCON2.jpg](https://qiita-image-store.s3.amazonaws.com/0/104360/d2bc1dc5-2570-128b-4213-d20fca3102a3.jpeg)

試してみたらPWM制御されてた
![PWM.jpg](https://qiita-image-store.s3.amazonaws.com/0/104360/5db094bd-9740-92ed-d543-2d6a39f0b898.jpeg)

#おわりに

全体の話がなく、「LEDの点灯状態を引っこ抜く」ことにフォーカスしすぎてよくわからない記事になってしまったかもしれません。

しかし、電子工作初心者から一歩抜け出して使えるモノを作りたい方には参考になったのではないでしょうか。

なお、この記事を見て家電などを壊しても一切責任を負いません m(_ _)m
Firebase のプッシュ通知をcurlで実行

Firebase Consoleからでも出来るけど、プッシュ通知の多言語対応をしたかったので。。。
でもって、なんか数時間なやんだ結果、そんな事だったのか。。。。となったので自分への備忘録。

Firebaseのセットアップとかその辺はスキップ。

実際にcurlするところのメモだけ。

```
curl \
--header "Authorization: key=ご自身のAPI_KEY" \
--header Content-Type:"application/json" \
https://fcm.googleapis.com/fcm/send \
-d "{
  \"to\" : \"/topics/何か適当に\", 
  \"time_to_live\" : 0,
  \"restricted_package_name\" : \"bundle id\",
  \"notification\" : {
    \"sound\" : \"default\",
    \"badge\" : \"1\",
    \"body_loc_key\" :\"KEY_ID\",
    \"body_loc_args\" : [\"置き換え文字\"],
    \"title_loc_key\" : \"TTL_KEY_ID\",
    \"title_loc_args\" :　[\"置き換え文字\"], 
  }
}"
```
補足：
Firebase Notificationsとは違い、FirebaseAnalyticsとは連携できていないようなので、
`\"data\" : { \"push_label\" : \"キー\" }`
みたいなのを一緒に送ってプッシュ通知の既読数をFirebaseAnalyticsへ送信とかした方がいいかも。

補足追記：
`/topics`を指定すると
`2016-05-31 06:48:40.731: <FIRMessaging/WARNING> Cannot parse topic name /topics. Will not subscribe.`
といわれるので指定できないようです。

で

**ハマった内容**

メッセージが届くがローカライズされたメッセージが表示されないという問題。
ログでもプッシュ通知は届くがuserInfoの内容が変だった・・・

試行錯誤を数時間・・・

で

**原因**

Appleさんのドキュメントのパラメータは、`title-loc-args: "KEY"`　という感じで、
Firebaseのドキュメントのパラメータは、`title_loc_args: "KEY"`　という感じ。

私はアップルのドキュメントからキーとコピーしてきたのですが、
「 **-** 」
「 **_** 」
って。。。
おぅぅ、、、なんとまぁ。。。

でアンダーバーにすれば問題無く解決したというお話。
後から気づいたのですが、Firebaseは基本的にanalyticsのイベント名とかも英数字とアンダーバーだけみたいです。

ドキュメントはきちんと読まないとダメですね。
macでdllのバージョンを確認する

monodisをつかえばOK

# 前準備

```shell-session
brew install mono
```

# チェック

```shell-session
$ monodis --assembly GeoHex/bin/Release/net20/GeoHex.dll
WARNING: The runtime version supported by this application is unavailable.
Using default runtime: v4.0.30319
Assembly Table
Name:          GeoHex
Hash Algoritm: 0x00008004
Version:       0.0.1.0
Flags:         0x00000000
PublicKey:     BlobPtr (0x00000000)
	Zero sized public key
Culture:
```

このライブラリバージョンは `0.0.1.0` ってことがわかる
zf2でのルーティング設定

# Zendframework2 ルーティング設定


http://domain/controller/action　のようにアクセスさせてたい場合

以下のように'home'の中身を書き換える。

```php:module.config.php

return array(
    'router' => array(
        'routes' => array(
            'home' => array(
                'type' => 'Segment',
                'options' => array(
                    'route'    => '/[:controller[/:action]]',
                    'defaults' => array(
                        '__NAMESPACE__' => 'Application\Controller',
                        'controller' => 'Index',
                        'action'     => 'index',
                    ),
                ),
            ),

````

## 説明
■ 'type' => 'Segument'  
Segmentにすると、controllerとactionを、リクエスト時のそれとマッピングさせることができる
例）http://domain/user/add      userコントローラーのaddアクションが呼び出される
    http://domain/member/add　　memberコントローラーのaddアクションが呼び出される

一方、Literal(リテラル)というものがある。
これは、直接の意味合いをもつため、コントローラーとアクションを、作ったもを固定直接指定するようなイメージ。
リクエストとコントローラーが1対1であるようなイメージ。

なお、リテラル とは
a = 1 + 1 -->　これは「式」と呼ばれるが
1+1の結果を直接2として指定すること、つまりa=2とするのが「リテラル」


'options'の'route'
[]は省略可能なことをあらわす

'options'の'defaults'
たとえば上記の設定でhttp://domain/と呼ばれた場合、
Indexコントローラーのindexアクションがデフォルトで呼ばれる
pip で更新可能なパッケージを一覧表示

# pip のインストール済みパッケージの一覧表示

インストールされているパッケージの一覧は `pip list` や `pip freeze` で表示できる。が、オプションをつければ更新可能なパッケージの一覧や最新状態のパッケージ一覧も表示できる。
インストール済みパッケージを一括で更新したい場合はこれを使えば便利。

かなり昔は pip-tools の `pip-review` コマンドを使うしかなかったので pip のオプションでできるようになって便利。

**更新可能なパッケージ一覧表示**

```sh
$ pip list -o
google-api-python-client (1.5.0) - Latest: 1.5.1 [wheel]
Pillow (3.1.1) - Latest: 3.2.0 [sdist]
pytz (2015.7) - Latest: 2016.4 [wheel]
```
オプションは `-o` または `--outdated`。

**最新パッケージ一覧表示**

```sh
$ pip list -u
pip (8.1.2)
ujson (1.35)
wheel (0.29.0)
```

オプションは `-u` または `--uptodate`。

# 更新可能なパッケージの一括更新

全部最新にして問題なければ以下でOK。

```sh
$ pip list -o | awk '{print $1}' | xargs pip install -U
```