OmniAICreator/Qiita-1.07M huggingface dataset:
class定義、新旧スタイルで@propertyの動作が異なる件




[property](http://docs.python.jp/2/library/functions.html#property) についてのメモ

2 系にて[^1]。

[^1]: 3系では、無条件に新スタイルとして判断されるから、オールドスタイルの書き方でもトラブルが起こらない。

旧スタイルの機能じゃないものを、旧スタイルで書いている訳だから、これで嵌るのは、 100% ユーザ側のポカなわけだけど。




```python:foo.py
class New(object):
    def __init__(self):
        self._x = 10

    @property
    def x(self):
        return self._x * 2

    @x.setter
    def x(self, v):
        self._x = v

class Old():
    def __init__(self):
        self._x = 10

    @property
    def x(self):
        return self._x * 2

    @x.setter
    def x(self, v):
        self._x = v

if __name__ == '__main__':
    n = New()
    n.x = 10
    print ( n.x )

    o = Old()
    o.x = 10
    print ( o.x )
```

`New` も `Old` も `class` 宣言の行以外は全く同じ。

```shell-session:
$ python foo.py
20
10
```

色々と調べた[^2]けど、↓が一番直観的

[^2]: `Python` 版の `Data::Dumper` はないかとか `B::Deparse` はないかとか、、、

```Python:main以降を変更
if __name__ == '__main__':
    n = New()
    print (vars(n))
    n.x = 2
    print (vars(n))

    o = Old()
    print (vars(o))
    o.x = 2
    print (vars(o))
```

```shell-session:
$ python foo.py
{'_x': 10}
{'_x': 2}
{'_x': 10}
{'x': 2, '_x': 10}
```

要するに、Old は、

```
class Old():
    def __init__(self):
        self._x = 10

if __name__ == '__main__':
    o = Old()
    print (vars(o))
    o.x = 2
    print (vars(o))
```

を実行してるのと同じこと。
Excelのコピー貼り付けで、未結合セルの値を結合セルに一気に入れる方法

|A列～C列を結合したセル|
|-----------------:|
||
||
||
||
||
||

|コピーしたい値が入ったセル(結合していない)|
|-----------------:|
|aaaa|
|bbbb|
|cccc|
|あああ|
|いいい|
|ううう|

上の表に普通にコピペするとセルの結合が解除されてしまう。
うまくコピペするには、貼り付けのオプションで数式として貼り付けるとうまくいく。
SDカード書き込み速度比較（SanDisk 48MB/s vs 80MB/s）


あきばお〜に売っている16GBのSDカード2種類にRaspbianのイメージを書き込む速度を比較してみる。

48MB/sのほうは[これ](http://www.akibaoo.co.jp/c/item/0619659134020/)
80MB/sのほうは[これ](http://www.akibaoo.co.jp/c/item/0619659134648/)

カードリーダはiBUFFALOの[BSCR04U2](http://buffalo.jp/products/catalog/supply/peripheral/cardreader/cardreader/bscr04u2/)を使用。
緑がかわいいんだよ、緑が。

書き込むイメージは、[2016-11-25-raspbian-jessie-lite.img](https://www.raspberrypi.org/downloads/raspbian/)

書き込みに使ったパソコンは、MacBook Pro (Retina 13-inch, Early 2015) El Capitan


# 書き込みコマンド

```bash
sudo time dd if=2016-11-25-raspbian-jessie-lite.img of=/dev/disk2 bs=1m
```

# 結果

## 48MB/s

```
1326+0 records in
1326+0 records out
1390411776 bytes transferred in 146.290596 secs (9504451 bytes/sec)
      146.31 real         0.00 user         6.96 sys
```

## 80MB/s

```
1326+0 records in
1326+0 records out
1390411776 bytes transferred in 146.285450 secs (9504785 bytes/sec)
      146.32 real         0.00 user         7.25 sys
```

# まとめ

結果が1秒も違わなかったので、完全にカードリーダがボトルネックになってる模様。
色がかわいいけどこいつはもうお払い箱だな。
チーム内コミュニケーション、主に愛想笑いと大きな声で話すことについて

下請けCOBOLERとして生きていた頃のノウハウ Advent Calendar 2016の８日目の記事です。

## 愛想や正直な態度が良いチームを作る

当たり前ですが愛想というものはとても重要で、仕事の出来不出来以上に人間の印象に残ります。
自分がいたチームのリーダーはその点とても勉強になる方で、ピンチの時(バッチが落ちる等の未知の本番障害が発生)はおどけた感じで、大きな声でよーしじゃあみんな頑張ろうかって鼓舞して仕事をしやすくしてくれる感じの方でした。
ピンチの時にリーダーがイライラしたりして周囲が委縮するような雰囲気を作ってはいけないとわかっていたのでしょう。※1)
よいチーム作りは常に炎上に追われた環境ではとても重要になってきます。(ある意味では戦友に近い感じでしょうか)
(ちなみにそのリーダーも普段は鬼レビューでした)

##大きな声ではっきり話そう
打ち合わせやレビューの際はいろいろ指摘を受けると思います。
何を言ってるのか分からないこともあると思います。
そういう時はとにかく分からないということを伝えましょう。
説明する際は、とにかく大きな声で話しましょう。
声が小さいだけでこいつは自信がないんだなって思われてしまいます。

ちなみに筆者は何を言ってるか分からないが、とにかく何かを説明しようとしていると昔言われたことがあります。
重要なのは何かを伝えようとしている感じだと思います。

##リーダーの指摘がよく分からないとき
　とりあえずなんとかして相手の言おうとしてることを理解しようという態度を示して下さい
「えーと、これは、〇〇なことでよろしいでしょうか？」みたいな聞き方が良いと思います、そんな仮説も立てれないぐらいイミフな時は
「えーと、(困り顔)　こちらは、すみません、ちょっとよく分からなかったんですけど・・」のように相手のパス力のなさを責めずにこちらのキャッチ力のなさを全面に出しましょう。

ちなみに**分かってないけど分かりましたというのは最悪です。**

##凡ミスをしたとき
愛想笑いしつつあースミマセン！すぐに直しますと言いましょう、ミスはミスなのでへらへらすることじゃないんですが、指摘した側もそんなに緊張感のある指摘をしてるつもりはないので愛想笑いで和ませましょう。

##重大なミスをしたとき
愛想笑いしちゃいけません。
めっちゃかちこちになった雰囲気を見せましょう。

どちらも<font color="Red">重要なのはすぐに直します、対処しますという姿勢を見せることだと思います。</font>


とにかく下請けさんは愛想が良くて無理難題でも頑張って何とかしようとする人が重宝される気がします。


---
※1)個人的な感想ですが、ピンチの時にイライラする人はリーダーに向いてないと思ってますが、上に立つか下につくかは結局は会社の営業力の差でしかないのでいろんなタイプのリーダーがいると思います。
mqttでmythingsを発火させる。

#概要
思えば、mqttからmythingsを、発火させたいだけの、一年だった。
実は、mythingsから、mqttでactionを受けるサンプルはあるが、
mqttからトリガーを引く、サンプルは、なかった。

#写真
![mas.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/ca2b4713-853d-e213-a1c8-f73f2434da64.jpeg)

#仕掛け
残念ながら、meshbluのmqttブローカーから直接、発火できなかった。
node-redが、仲を取り持つ。
IOT端末から、meshbluへmqttをpubしたら、node-redで受け取り、http経由でmythingsを
発火させる。
以下に、各ノードの設定を記す。
#mqtt node
```
broker: meshblu url
port: 1883
username: trigger-1 uuid
password: trigger-1 token
topic: trigger-1 uuid
```
#json node
置くだけ。

#function node

```
var p = msg.payload.data.payload;
msg.payload = p;
msg.headers = {
    "meshblu_auth_uuid": "trigger-1 uuid", 
    "meshblu_auth_token": "trigger-1 token"
};
return msg;
```

#http reqest node

```
Method: post
url: meshblu url
```

#iot端末

```
mosquitto_pub \
  -h meshblu url  \
  -p 1883 \
  -t message \
  -m '{"devices": ["trigger-1 uuid"], "payload": {"text1":"255"}}' \
  -u trigger-1 uuid \
  -P trigger-1 token \
  -d
```
#mythingsアプリの設定
```
idcfで条件を満たしたら、自分に通知する。
トリガー: trigger-1
メッセージ: {{text1}}
```
3つのテーブルをJOINするSQL

```
SELECT t1.name AS tbl_one_name, t3.name AS tbl_three_name
  FROM tbl_one t1
  INNER JOIN tbl_two t2 ON t1.col = t2.col
  INNER JOIN tbl_three t3 ON t2.col_another = t3.col;
```
３つのテーブルをJOINする。tbl_oneにtbl_twoをJOINして、さらにtbl_twoにtbl_threeをJOINする。テーブル名にはエイリアスをつける。
[Guzzle]Guzzleを使って並列処理を書く

# Guzzleでの並列処理

並列処理はどうやってやるのか調べた。
本当に基本的な使い方だと思いますが、忘れないように残しておく。

Guzzle : https://github.com/guzzle/guzzle
Document : http://docs.guzzlephp.org/en/latest/


> GuzzleはComposerなどでインストールしてください

## 処理

```php
<?php

$client = new \GuzzleHttp\Client();

$promises[] = $client->requestAsync('GET', 'http://hogehoge');
$promises[] = $client->requestAsync('GET', 'http://hogehoge');
$promises[] = $client->requestAsync('GET', 'http://hogehoge');
$promises[] = $client->requestAsync('GET', 'http://hogehoge');
$promises[] = $client->requestAsync('GET', 'http://hogehoge');

$responses = \GuzzleHttp\Promise\all($promises)->wait();

$result = [];
foreach ($responses as $response) {
    $result[] =　$response->getBody()->getContents();
}

var_dump($result);
```

指摘ありましたら、宜しくお願い致します。
cv::waitKeyとstd::this_thread::sleep_for

## cv::imshowをwhile文のなかでひたすら呼びまくると、画像が更新できない。

```
while(true){
  if(flag) img = cv::imread("img.png");
  else img = cv::imread("img2.png");
  flag = !flag;
  cv::imshow("window", img);
}
```
gif画像
[![https://gyazo.com/84cd0ee729675695a25adee06b04fc18](https://i.gyazo.com/84cd0ee729675695a25adee06b04fc18.gif)](https://gyazo.com/84cd0ee729675695a25adee06b04fc18)

## cv::waitKeyを入れると画像が更新される。

```
while(true){
  if(flag) img = cv::imread("img.png");
  else img = cv::imread("img2.png");
  flag = !flag;
  cv::imshow("window", img);
  cv::waitKey(33); // new line
}

```
gif画像
[![https://gyazo.com/582e14c35762993b9b7fa9ddeb341bde](https://i.gyazo.com/582e14c35762993b9b7fa9ddeb341bde.gif)](https://gyazo.com/582e14c35762993b9b7fa9ddeb341bde)

## cv::waitKeyの代わりにstd::this_thread::sleep_forを使うと、また更新できなくなる。

```
while(true){
  if(flag) img = cv::imread("img.png");
  else img = cv::imread("img2.png");
  flag = !flag;
  cv::imshow("window", img);
  // cv::waitKey(33);
  std::this_thread::sleep_for(std::chrono::milliseconds(33)); // new line
}

```
[![https://gyazo.com/0b660432e65b4ce98c220d3313c64461](https://i.gyazo.com/0b660432e65b4ce98c220d3313c64461.gif)](https://gyazo.com/0b660432e65b4ce98c220d3313c64461)


おそらく、std::this_thread::sleep_for (boost::this_thread::sleep など、その他のthreadをsleepをするようなやつも同じ) がスレッド自体をsleepさせる一方で、cv::waitKeyは、opencvの処理をするためにその先に進まなくしている。
Heroku Scheduler を 毎月 毎週で実行する


こちらの記事が参考になる
https://blog.dbrgn.ch/2013/10/4/heroku-schedule-weekly-monthly-tasks/

毎週月曜実行

````
[ "$(date +%u)" = 1 ] && echo "happy monday"
````

毎月はじめに実行

````
[ "$(date +%d)" = 01 ] && echo "happy new month"
````

毎年 12/24 に実行

````
[ "$(date +%m)" = 12 ] && [ "$(date +%d)" = 24 ] && echo "happy holiday"
````
EC-CUBE 3.0系の公式プラグインをバージョンアップしていってる件

本当は3.0.13について書きたかったんですが、3.0.13を固めるのは16日以降だったので日を改めることにしました。

そこで、今日は 3.0系のプラグインの状況について書きます。

## 全体的にやってること

+ [プラグインベストプラクティス](http://ec-cube.github.io/plugin_bp_about)に則った実装に変更することで、競合などのトラブルが発生しにくいプラグインに。書き直し。
+ フロントへの差込みを行うプラグインに対しては、差込みタグ対応。(フロントのカスタマイズをやりやすくなる)
+ あらためてテストを再実施して品質の強化。
+ CIツール カバレッジなど周辺サービスとの連携。参考になります。

## リリース済みプラグイン

### [おすすめ商品管理](http://www.ec-cube.net/products/detail.php?product_id=1067)
+ 軽微な不具合修正。
+ 管理画面でのおすすめ商品の並べ替えがたりやすく。
	
### [関連商品](http://www.ec-cube.net/products/detail.php?product_id=962)
+ フロントのデザインをリニューアル。
+ 差込位置変更タグ「<!--# related-product-plugin-tag #-->」に対応。
	
### [メーカー管理](http://www.ec-cube.net/products/detail.php?product_id=963)
+ フロントのデザインを見直し。
+ 差込位置変更タグ「<!--# maker-plugin-tag #-->」に対応。
+ 管理画面からメーカーの作成がやりやすく。
		
### [カテゴリコンテンツ](http://www.ec-cube.net/products/detail.php?product_id=1070)

+ 差込位置変更タグ「<!--# category-content-plugin-tag #-->」に対応。
		
### [帳票出力](http://www.ec-cube.net/products/detail.php?product_id=959)
+ 帳票出力時に使用するロゴ/PDFファイルの差し替えに対応。
+ 帳票出力時の設定(タイトル/メッセージ/備考)をデフォルト値として保存する対応。

## 今後の予定

こちらはまだ開発中のため実際のリリース時にはすこし内容が変更になる可能性もあります。
	
### 年内にリリース予定

+ メルマガ管理
  - 配信時の機能強化。(履歴確認や失敗時の再配信が可能に)
  - HTMLメルマガの配信に対応。
  - テストメール送信機能を追加。
+ 商品レビュー
  - フロントのデザインを見直し。
  - 差込位置変更タグに対応。
  - レビューの表示件数のカスタマイズ。
+ クーポン
  - クーポン作成時のオプションを追加
  - 「全商品」をクーポンの対象にすることができる
  - クーポンが利用可能な下限金額を設定できる
  - 会員ログインでの購入時のみ使用できるクーポンを作成できる
  - 同じ会員が何度でも利用できるクーポンを作成できる(現在は利用１回のみが作成可能)
			
### プラグインのフロントのカスタマイズについて

実際にプラグインを利用していくと、見た目について変えたくなる部分などでてくると思います。こちらについては、@ryo_endo の以下の記事が参考になると思いますので合わせてお読みください。
http://qiita.com/ryo-endo/items/cd8fe44666034c572b8a
rubyの引数にblock statement渡してみる

プログラミング言語におけるブロック（block）とは、複数個（0個以上～2個以上。言語により異なる）の文などのコードのまとまりのことである。

引数にblock statementを渡すと似たような処理をしているメソッドをまとめられたりする
#例えばこんなメソッドの違いを吸収
メソッドの上下部分が一緒なら中央をまとめれば良いが
中央が違うとなるとまとめにくい。

以下コピペすれば多分動くので是非

```rb
def sum_can_mod_4
  a = [1,2,3,4,5,6,7,8,9,10,11,12]
  a.inject(0) do |sum, num|
                  #numを4で割り切れる時加算
    sum += num if num % 4 == 0
    sum
  end
end

def sum_can_mod_2
  a = [1,2,3,4,5,6,7,8,9,10,11,12]
  a.inject(0) do |sum, num|
                  #numを2で割り切れる時加算
    sum += num if num % 2 == 0
    sum
  end
end

sum_can_mod_2
sum_can_mod_4
```

```zsh:実行してみる
[13] pry(main)> sum_can_mod_2
=> 42
[14] pry(main)> sum_can_mod_4
=> 24
```

でもこれDryじゃない
引数にblockを渡すという発想

```rb
def sum(&block)
  a = [1,2,3,4,5,6,7,8,9,10,11,12]
  a.inject(0) do |sum, num|
    sum += num if yield num
    sum
  end
end

p sum{|num| num % 2 == 0}
p sum{|num| num % 4 == 0}
p sum{|num| num % 6 == 0}

```

yieldを用いることで一旦呼び出し元に制御を戻してくれる。
引数として処理中のnumを渡して

```rb
p sum{|num| num % 2 == 0}
```

呼び出し元からtrue falseの判定をしてあげると1メソッドでまとまる


全部この本に書いてあることをちょっと抽出して自分なりにまとめただけなので是非こちらを参照くださいm(_ _)m
http://amzn.asia/4t446rn
僕がQiitaに記事を書く理由


Stylez Advent Calendar 2016 - Qiita
http://qiita.com/advent-calendar/2016/stylez

株式会社スタイルズの Adventカレンダー 1日目です。

表題倒れになってしまうかもしれませんが、つらつらとQiitaに記事を書く理由を書きたいと思います。

いくつか記事を書くモチベーションがあります。
私の書く記事にはどうもいくつかの種類があるようです。

* 仕事中にこまったこと(ググっても情報がなくて苦労したけど何とか上手くいった)について  
　　これが一番多い
* お仕事として情報拡散(それによる知名度アップ)  
　　これはお仕事なので当然
* あまり他の人が体験したことがないことについて  
　　技術力はない割に出たがりなので。。
* 自分がやってみた自慢話  

に分かれる気がします。

これらは、結局ある意味自己満足だったり、(私を見て見て！といった)承認欲求の産物であるわけですが、
それにしても、日々Google先生に教えてもらった皆様の苦労に対する恩返しという面があると思っています。

どれだけアウトプットができてるか、役に立っているかと言われると非常にニッチな話を投稿しているケースが多いですし、Qiita自体あまりGoogle先生に引っかからないという(インクリメンツさんごめんなさい)面もあるのですが、

・自分が誰かのナレッジ(Google先生経由)で楽をしている分
・自分が苦労したときに、アウトプットすることで誰かが楽になればいいんじゃないかな
と思っているわけです。

当然、記事を書くことにより役に立ったと言われると嬉しいです。
逆に、変なもの書いちゃった、読みにくかったかも？と思うこともあるので日本語力のなさにがっかりすることもたまにあります。

リードオンリーも良いですが、皆さんもたまには何か書いてみるのもよいのではないでしょうか？
Pug(Jade)の応用記法について

HTMLをPug(Jade)で書くのは慣れたから、
どんどんPug(Jade)の機能使っていきたいぜー！ってなってきた時のために
さくっと使いやすい応用記法をまとめました。

まだ「HTMLをPug(Jade)で書くことが慣れてないのよ」って方は、
こちらの記事を参考にしてもらえると良いかと思います
[Pug(Jade)の基本記法について](http://qiita.com/yasui05821/items/135d168eddd6ae6c3409)

## 共通部分をパーツ化できる　include
- 様々な箇所で共通ファイルを呼び出して使える
- 共通パーツ化したファイルはコンパイルされない仕組みを作っておくと良い



head部分などは毎回同じ記述になるので別ファイルを作ってしまう
今回はcommonフォルダの中に_head.pugファイルを作成。

▼Pug(Jade)

```pug
//- common/_head.pug
head
  title サイトタイトル
  script(src='/javascripts/jquery.js')
  script(src='/javascripts/app.js')
```

`include ファイルのパス`で任意のファイルを呼び出すことができます

```pug
//- index.pug
doctype html
html

  include commmon/_head.pug
  // commmonフォルダのhead.pugをインクルード

  body
    h1 こんにちは
```


common/head.pngがインクルードされてコンパイルされる

▽HTML

```html
<!DOCTYPE html>
<html>

<head>
  <title>サイトタイトル</title>
  <script src="/javascripts/jquery.js"></script>
  <script src="/javascripts/app.js"></script>
</head>

<body>
  <h1>こんにちは</h1>
</body>

</html>
```

------

#### 「共通パーツ化したファイルはコンパイルされない仕組みを作っておくと良い」
↑なのですが、私の場合、接頭語にアンダーバーを入れると、読み込まれないという記述をいれて対処してます。
▼gulpfile.js

```js
gulp.task('pug', () => {
  return gulp.src(['./pug/**/*.pug', '!./pug/**/_*.pug'])
    .pipe(pug({
      pretty: true
    }))
    .pipe(gulp.dest('./html/'));
});
```

## 繰り返しの記述をループで処理できる　for、each


### forの場合

▼Pug(Jade)

```pug
- for (var x = 0; x < 3; x++)
  li item
```

▽HTML

```html
<li>item</li>
<li>item</li>
<li>item</li>
```

------

### eachの場合

▼Pug(Jade)

```pug
ul
  - var list = ["りんご", "レモン", "バナナ"]
  each item in list
      li= item
```

▽HTML

```html
  <ul>
    <li>りんご</li>
    <li>レモン</li>
    <li>バナナ</li>
  </ul>
```


## 変数が使える Interpolation
- 繰り返し出て来る共通の単語など、変数化すると便利
- 変更に強いHTMLがつくれる

▼Pug(Jade)

変数は`- var 変数名 = "値"`で定義して、
`#{変数名}`で呼び出せます。

```pug
- var word = "犬"

h1 #{word}のサイトへようこそ！
P ここは#{word}好きによる#{word}好きのためのサイトです。

p あなたは#{word}を飼っていますか？？
```

▽HTML

```html
<h1>犬のサイトへようこそ！</h1>
<P>ここは犬好きによる犬好きのためのサイトです。</P>

<p>あなたは犬を飼っていますか？？</p>
```

突然の仕様変更で犬→猫になったとしても、
`- var word = "犬"`を`- var word = "猫"`に帰るだけで、
`#{word}`の部分すべてに、「猫」が反映されます。

## テンプレートがつくれる Extends
- 同じようなレイアウトページを量産する時に便利


▼Pug(Jade)

まず、レイアウトのベースになるファイルを作成します。

```pug
//- _layout.pug
doctype html
html
  head
    block title
      title ページタイトル
  body
    block content
```

ファイルごとに違うコンテンツを入れたい部分は`block 名前`で囲っておく。

　

サンプルとしてpage1.pugをつくります
レイアウトを適用したいファイルに`extends レイアウトファイルのパス`を挿入する
`block 名前`ごとに入れたい要素を記述します

```pug
extends _layout.pug

block title
  title １ページ目

block content
  h1 これは１ページ目です
```

　

page2.pugも同じように一部変えて作ります。

```pug
extends _layout.pug

block title
  title ２ページ目

block content
  h4 これは２ページ目です
  P 1ページ目は面白かったですか？
```

▽HTML

page1.pug

```html
<!DOCTYPE html>
<html>
  <head>
    <title>1ページ目</title>
  </head>
  <body>
    <h1>これは1ページ目です</h1>
  </body>
</html>
```

page2.pug

```html
<!DOCTYPE html>
<html>
  <head>
    <title>２ページ目</title>
  </head>
  <body>
    <h4>これは２ページ目です</h4>
    <P>1ページ目は面白かったですか？</P>
  </body>
</html>
```


## 関連リンク
Getting Started Pug（公式サイト）
https://pugjs.org/api/getting-started.html
もっと機能を知りたい方は、公式のドキュメントを参照していただけると良いかと思います
GitBook で環境毎の変数を扱う

[ GitBook](https://github.com/GitbookIO/gitbook) とは [Sphinx](https://github.com/sphinx-doc/sphinx) などと同じように Markdown で書かれたドキュメントを綺麗な見た目で PDF や eBook 形式に変換してくれるツールです。今回は GitBook のドキュメント内で変数を扱う際に、 `NODE_ENV` など環境によってその変数の値を変えたい場合のやり方について紹介します。

そもそも GitBook にはドキュメントのルートディレクトリに `book.js` という名前の JavaScript ファイルを置くことで build や serve 時に動的な処理を挟み込む仕組みがあります。`book.js` 内で自前で書いてしまってもいいのですが、今回は Node ライブラリを組み合わせることで手間をかけずに実現したいと思います。

### ライブラリのインストール

`node-config` をインストールします。

```sh
$ cd /path/to/doc_root
$ npm install conifg
```

本来は `package.json` を使って依存を管理しますが、そのあたりのセットアップから始めると長くなってしまうので、ここでは簡単にインストールします。

### 設定ファイルの準備

`node-config` はいろいろなやり方をサポートしているのでかならずしもこの手順でないとダメなわけではないです。詳細は `node-config` のドキュメントでも読んでみてください。

まず、基本的な設定は `default.json` というファイルで管理します。

```sh
$ cd /path/to/doc_root
$ mkdir config
$ vi config/default.json
```

```json:default.json
{
  "variables": {
    "key": "value",
    "hello": "world"
  }
}
```

環境毎の設定は <環境名>.json という名前で作成します。 


```sh
$ vi config/test.json
```

```json:test.json
{
  "variables": {
    "key": "value",
    "hello": "gitbook"
  }
}
```

このとき、 `default.json` と被っている要素については環境毎の内容で上書きされます。こうすることで重複して管理しなくてもよくなります。

```bash
$ ls -l config
total 8
-rw-r--r-- 1 hiyosi staff 66 12 15 15:03 default.json
-rw-r--r-- 1 hiyosi staff 68 12 15 15:03 test.json
```

最後にこれらの設定ファイルを `node-config` を使って読み込むような `book.js` を準備します。

```sh
$ vi book.js
```

```javascript:book.js
var conf = require('config');

module.exports = conf;
```

### ビルド

環境名はビルド時に `NODE_ENV` の値を見るので、export するなり、ビルド時に渡すなりしてあげればよいです。

```sh
$ export NODE_ENV=test
$ gitbook build
```

```sh
$ NODE_ENV=test gitbook build
```

ちなみに、後者のように都度環境変数を渡す場合においては `gitbook serve` を実行する際にも環境変数を渡す必要があることに注意が必要です(sserveするとビルドが走るため)

### 変数の呼び出し

読み込んだ JSON　ファイルの内容は `book.json` で扱っていたときと同様に `book` 変数からたどることができます。
https://toolchain.gitbook.com/templating/variables.html

```
book.[CONFIGURATION_DATA]
```

先ほど設定した内容だと、テンプレート内からは以下のように呼び出すことができます。

```
{{ book.hello }} // ビルドすると環境変数の値により world または gitbook が出力される
```

### まとめ

`NODE_ENV` と `node-config` を使って GitBook 内で簡単に環境毎の変数を手軽に扱う方法を紹介しました。仕事などで使う場合には、ある箇所は公開する際に隠したいという要望や、ドキュメント内の URL を環境毎に変更したいといった要望が出てくると思います。それ毎にドキュメントを分けたり条件分岐したりもいいのですが、今回のような方法を使うことですっきりと管理できると思いますので、よければ使ってみてください。

### P.S.

GitBook とは関係ないですが、Sphinx で Markdown を変換する方法も試してみたところテーブルが崩れてしまったのが残念でした・・・ (recommonmark のせい？)
ゾゾタウンのAMP対応状況について調べてみた。


AMPについて、インターネット上にも情報が少ないので、調べたことをどんどん発信していこうと思います。その二弾です。

第一弾：[楽天レシピのAMP対応状況について調べてみた。](http://qiita.com/i3mato/items/d43f77121f859beacc58)

今回は、ゾゾタウンのAMP対応状況についてです。
ファッション系ECサイトでAMPの実装を考えている方の参考になればと思います。

## AMP対応状況
| ページ名 | 通常ページ | AMPページ |
|:-----------|------------:|------------:|
| トップ     | http://zozo.jp/sp/ |     未対応     |
| 商品一覧       |    http://zozo.jp/sp/brand/adidas/ |     未対応    |
| 商品詳細      | http://zozo.jp/sp/shop/freaksstore/goods/14446560/  |     http://zozo.jp/amp/shop/freaksstore/goods/14446560/     |

## AMPページ確認方法
/sp/を/amp/に変更するとAMPページになりますが、2016/12/15(木)17時23分現在で、ゾゾタウンは/amp/ページの実装を一旦止めているみたいでして、すぐにリダイレクトされてしまい、実際のAMPページを確認することはできません。

が、、、

CDN上にAMPページがまだ残っているものもあるので、下のリンクから確認できます。
https://www.google.co.jp/amp/zozo.jp/amp/shop/freaksstore/goods/14446560/
（PCで開くとリダイレクトされるのでスマホから確認してください）

## AMP実装方法
サブディレクトリ形式（トップドメイン直下に/amp/）

## CDN上のAMPページとパラメータ

https://www.google.co.jp/amp/zozo.jp/amp/shop/freaksstore/goods/14446560/
特にパラメータの設定はしていませんが、サブディレクトリ形式なので、必要ないですね。

## AMPページからの内部リンクパラメータ
アクセス解析用の内部リンクパラメータは設置されていませんでしたが、現在、AMPページが稼働していないことを考えると、仕方がないですね。


## 最後に

下記ファッション系ECサイトを調べてみましたが、いずれもAMPは未対応でした。

* UNIQLO（ユニクロ）
* GU（ジーユー）
* MAGASEEK（マガシーク）
* DHOLIC（ディーホリック）
* RyuRyu（リュリュ）

そのため、ゾゾタウンのAMP対応はとても早い展開で良かったのですが、現在、AMP非対応なのは残念です。

## 最後に、もう一つ

ちなみに、AMPプロジェクトでは、ECサイトへとても力を入れており、フォームの実装、商品一覧はすでに対応済みで、今後ログインや決済周りもよりユーザビリティを向上できるように進めているそうです。

こちらのリンクから、AMPのECサイトの商品一覧ページのサンプルサイトを閲覧できるので、ECサイトでの導入を考えている方には参考になるかと思います。
https://ampbyexample.com/samples_templates/product_listing/preview/
さまざまなバージョン番号早見表

#はじめに

さほど役に立たないネタです。

ソフトウェア開発をしていると、対象物のバージョンを意識せざるを得ない状況になることが多々ありますが、商品名としてのバージョン番号と実際のバージョン番号が違っていたり、内部にさらに別のバージョン番号があったりして、たまに悩まされます(Java、お前のことだ！！)。

ということで、いくつか集めてみました。あまり古いものまで書くと量が多くなるので、そこそこ新しいものに限ってあります。

#Android SDK

|名称|コードネーム|API Level|
|:--|:--|:--|
|Android 4.4|Kit Kat|19|
|Android 5.0|Lolipop|21|
|Android 5.1|Lolipop|22|
|Android 6.0|Marshmallow|23|
|Android 7.0|Nougat|24|

#Java Standard Edition

|名称|APIバージョン|クラスファイルバージョン|
|:--|:--|:--|
|J2SE 1.3|1.3|47|
|J2SE 1.4|1.4|48|
|J2SE 5.0|1.5|49|
|Java SE 6|1.6|50|
|Java SE 7|1.7|51|
|Java SE 8|1.8|52|

#Microsoft Visual Studio

|名称|内部バージョン|
|:--|:--|
|Visual Studio.NET|7|
|Visual Studio.NET 2003|7.1|
|Visual Studio 2005|8|
|Visual Studio 2008|9|
|Visual Studio 2010|10|
|Visual Studio 2012|11|
|Visual Studio 2013|12|
|Visual Studio 2015|14|

#Microsoft Windows

|名称|内部バージョン|
|:--|:--|
|Windows 2000|5.0|
|Windows XP (32bit)|5.1|
|Windows XP (64bit)|5.2|
|Windows Vista|6.0|
|Windows 7|6.1|
|Windows 8|6.2|
|Windows 8.1|6.3|
|Windows 10|10.0|

#Apple Macintosh

|名称|内部バージョン|
|:--|:--|
|Mac OS X Lion|v10.7|
|OS X Mountain Lion|v10.8|
|OS X Mavericks|v10.9| 
|OS X Yosemite|v10.10|
|OS X El Capitan|v10.11|
|macOS Sierra|v10.12|

#Unity

|名称|内部バージョン|
|:--|:--|
|Unity 5.6|5.6.0b1|
|Unity 2017|???|

#おわりに

途中でバージョンのルールが変わったり、逆に名称が変わったのに内部バージョンは連続性があったり、いきなり数字が飛んだり、味わい深いですね。

なんといっても目下の注目はUnity。次回からルールが変わって西暦表記になりますが、内部バージョンはどうなるのか？ 小数点は付くのか？ 変更による何らかのトラブルは発生するのか？…など、興味は尽きません！！
Appiumを使ったテスト自動化のおはなし【Android/java】

WithOne AdventCalendar 15日目の記事です。

今日のテーマはappiumを使ったテスト自動化についてです。

# 1.appiumとは
seleniumをmobile用に拡張されたオープンソースのテストフレームワークで、対応しているOSはAndroid,ios,FirefoxOSです。
テスト自動化のためのツールには様々な種類がありますが、appiumの特徴としてあげられるのはこの2つです。
1.テストするアプリに手をいれない（⇒リリースする予定のアプリでテスト可能）
2.多くの言語（java,Ruby,Python,C#,Objective-C,JavaScript ,php）に対応している

# 2.環境構築
## 2.1 事前準備
　・テストケースをかいておく
## 2.2 インストール
以下の3つをインストール
  ・java JDK(http://www.oracle.com/technetwork/jp/java/javase/overview/index.html)
  ・Androidstudio(https://developer.android.com/studio/index.html?hl=ja)
  ・Aappium(http://appium.io/)
# 3.手順
## 3.1 実装
テスト自動化では操作部分（ボタンのクリックやウィンドウを閉じる、スクロールなど）を書いてあげます。

![Image 1.png](https://qiita-image-store.s3.amazonaws.com/0/152432/479c3db2-a8e5-f3a8-10ca-4e903265c6e2.png)

上記は、よく使用するほんの一部です。
他にも期待値や結果値の出力をテキストに出力したりなど、クリック1つで自動で操作をしつつ自動でエビデンスの取得をすることも可能です。
これで、エビデンスも分かりやすく、デザイン崩れやバグが容易に発見できます。

## 3.2 テスト実行
1.テストをしたい実機または仮想デバイスのadbを有効にする

2.appiumを起動し、ドロイドくんを押下した先に端末詳細を記載して再生ボタンを押す
![Appium.png](https://qiita-image-store.s3.amazonaws.com/0/152432/585f2f3d-13ed-b595-893b-7b56df0a6ef6.png)

3.androidstudioからソースを流す

…このあとはクリック等なにもしなくてもどんどん自動で動いてくれます！！

# 4.さいごに
テスト自動化を行うことで試験期間（時間）の短縮や試験工数の低減が測られたり、人的ミスを防ぐことが可能です。
なんといっても、スマートフォンの画面が何もせず自動的に動いている様子はなかなかおもしろいです。
機会がありましたら、ぜひお試しください！！
Groongaにおける位置情報の取り扱いと地図情報の相性

[Groonga Advent Calendar 2016](http://qiita.com/advent-calendar/2016/groonga) 12日目は、先月開催した[新リリース自慢会](http://groonga.org/ja/blog/2016/12/02/new-release-event.html)で出てきた話題の1つを取り上げます。

## Groongaの位置情報検索機能

Groongaは位置情報を使用した検索に対応しています。この機能は、[ぐるなび](https://www.gnavi.co.jp/)の店舗検索のように「指定した地点の周囲にある地点のレコードを検索したい」という場面で使われます。

Groongaがどのように位置情報を保存して高速な検索を実現しているのかについては、以下の記事に図入りの詳しい解説がありますので、そちらも是非併せてご覧下さい。

 * [groongaで高速な位置情報検索 - ククログ(2011-09-13)](http://www.clear-code.com/blog/2011/9/13.html "groongaで高速な位置情報検索 - ククログ(2011-09-13)")

## 様々な位置情報の表し方

Groongaは位置情報を緯度・経度の座標で表現します。しかし、位置にはそれ以外の表し方もあります。

 * 地図上を一定の大きさの四角形で区切った「メッシュ」を単位とする表し方。
 * 地図上を都道府県や市町村の境で区切った図形「シェイプ」を単位とする表し方。
 * 「東京都豊島区南大塚3-29-9」のような住所表記。
 * 京都での伝統的な[「上ル」「下ル」のような交差点の曲がり方ベースでの住所表記](http://www.syasin.biz/page/agarusagaru/)。

ぐるなびの店舗検索のようなユースケースでは店舗の住所を緯度・経度へ変換してGroongaのデータベースに投入する必要がありますが、これは一般的な検索インデックス構築の際の「正規化（ノーマライズ）」にあたる操作と言えます。緯度・経度へ変換することさえできれば、Groongaはどんな位置情報でも容易に検索できると言えます。

## Groongaで検索しにくいパターン

しかし、位置情報を使った検索には「地点ベースの検索」以外にも以下のようなパターンがあります。

 * ある地点の座標から、その地点が含まれるメッシュを特定する。
   ![（現在位置とそれが含まれるメッシュのイメージ）](https://qiita-image-store.s3.amazonaws.com/0/15623/0604e808-ce0d-5c6f-9f48-3bf178a50790.jpeg)
 * 現在位置の座標から、都道府県・町名などを取得する（＝現在位置が含まれているシェイプを特定する）。
   ![（現在位置とそれが含まれるシェイプのイメージ）](https://qiita-image-store.s3.amazonaws.com/0/15623/cbef7f5f-f289-6316-a4ae-29073d4bdd59.jpeg)

メッシュやシェイプは地点ではなく面積を持った範囲を表す物なので、地点をベースに検索するGroongaではうまく取り扱う事ができません。これはどういう事でしょうか。

ある特定の1つのメッシュやシェイプにその地点が含まれるかどうかの「当たり判定」は、メッシュと同じ大きさの矩形に地点が含まれるかどうかを検索すればできます。が、実際にはメッシュはたくさんあるので、メッシュの個数分だけ当たり判定を繰り返すのは効率が悪いです。これが、地点からそれが含まれるメッシュやシェイプを高速に見付けたいというニーズが生まれる理由です。

Groongaを使ってメッシュやシェイプとの当たり判定を効率よく行うためには、各メッシュ（シェイプ）の範囲内の地点をランダムにサンプリングして登録しておいたり、メッシュの四隅のように代表的な地点を登録しておいたりしてGroongaで「地点」として検索できるようにした上で、それらの点が確実に1つ以上含まれる大きさの円や矩形で検索し、ヒットした結果をさらに詳細に絞り込んでいく、というような工夫が必要になります。
![（サンプリングした地点を使ってメッシュを検索するイメージ）](https://qiita-image-store.s3.amazonaws.com/0/15623/ddc40458-2846-2a49-ca7e-7ddcd8617dc0.jpeg)


## 住所表記の正規化

「上ル」「下ル」のような京都の伝統的な住所表記は碁盤の目状の町の作りに由来していますが、同じ地点を表すのに「この角を西に進んでから、次の角を北に進む」のと「この角を北に進んでから、次の角を西に進む」というような複数のルートがあり得ます。そのため、同じ住所なのに複数の表記が生まれることになります。
![（京都の住所表記のイメージ）](https://qiita-image-store.s3.amazonaws.com/0/15623/e40e6d9b-e814-5c82-749b-f964c87938e2.jpeg)

座標で検索する場合には問題ありませんが、住所表記で検索しようとすると表記に無数のパターンがあることが問題になります。なので、検索対象のデータも検索クエリも、「必ず先に北に進む」のようなルールに基づいて正規化しなくてはなりません。が、これを自動的に行うためには高度な判断が必要になってきます。

なお、Groongaには文字列の編集距離（文字列Aを何手改変すれば文字列Bに辿り着けるか、という形で2つの文字列の間の「似ている度合い」「異なっている度合い」を数値化した物）を使ったあいまい検索機能があります。京都の住所表記のような特異な例の正規化には利用できませんが、一般的な住所表記の多少の表記揺らぎはこれによっても吸収できるでしょう。

以上、[Groonga Advent Calendar 2016](http://qiita.com/advent-calendar/2016/groonga) 12日目としてGroongaの位置情報の取り扱いと地図情報の相性について述べました。引き続きGroonga Advent Calendarをお楽しみ下さい！
さいたまげーむすに在籍して1年が経過しました。

Advent Calendar 2016 の17日目は、同じくさいたまげーむす所属のeewanoが担当します。

2015年の10月に、初めて「さいたまげーむす」の勉強会に参加してから、大宮にあるコワーキングスペース7Fで本格的にUnityの勉強と自作ゲームの開発を開始しました。元からアクションゲームと迷路探索ゲームを作りたかった訳ですが、当初はC#のプログラミング知識もほとんど無く、ひたすらUnity関連の書籍を読んで使えそうな所は参考にし、2015年12月に初めてアクションゲームを製作しました。
* * *
#**【スケルトンがひたすら走る！】**
左が初代。右が現在のVer3.0です。
![RunUnityChan01.png](https://qiita-image-store.s3.amazonaws.com/0/153239/153437ac-6c64-c937-698f-964d6b363e09.png)  ![RunSkeleton01.png](https://qiita-image-store.s3.amazonaws.com/0/153239/152011ce-cc9f-158c-bad0-4aff04123d34.png)
**<font color="MediumVioletRed">※初代はやはり質素。随分と殺風景なオープニング画面だ。</font>**

当初のプレイヤーモデルはお馴染み、Unityちゃんでした。が、処理が重く（特に髪の毛が揺れる処理がキツイらしい）、スマホだと動きがカクカクになってしまった為、急遽低負荷のスケルトンモデルに変更。今度はそれなりにスムーズに動く様になったので一安心です。・・・まあ、キャラは逆に華が無くなりましたが（汗）。

![RunUnityChan02.png](https://qiita-image-store.s3.amazonaws.com/0/153239/08288949-5034-a24b-468b-590cd20020b8.png)　![RunSkeleton02.png](https://qiita-image-store.s3.amazonaws.com/0/153239/0c8c9507-acb8-a6f1-6a75-8240731e1a13.png)
**<font color="MediumVioletRed" font size="6">※初代は影の処理をリアルタイムで入れていた為、とにかく重い。ボタンも、押した感覚が無い。</font>**

こうやって初代のUnityちゃんタイプと現在のスケルトンタイプを見比べると、確実に勉強の成果が出て、進歩したんだなと思いました。ステージ数を2つに増やし、ハイスコアの表示の改良やアイテムの追加、そして利き手の設定等、書籍では学べなかった内容にもチャレンジして頑張ってきた成果がこれなんだなと実感します。
* * *
#**【迷路探索ゲーム】**
![The_Maze_Demo02.png](https://qiita-image-store.s3.amazonaws.com/0/153239/d8a35a54-c78d-f282-4e54-e3356cc43ad4.png)

![The_Maze_Demo03.png](https://qiita-image-store.s3.amazonaws.com/0/153239/9e78f64a-6a7d-0c83-916c-675c88adebc3.png)


本腰入れて作ったこのゲーム。当初もUnityちゃんをモデルにしていましたが、これまた処理の関係で変更。初めてのリリースは恐らく今年の2月位でしたが、リリースしてから気付く、「これはマズイ」感・・。GUIや敵との接触エフェクト等、見直すべき項目がわんさかと出てきました。それもあって、マイナーチェンジに伴い、スクリプトにEvent処理を実装して1から作り直した経緯があります。その期間は約3週間超え･･。以前と動きを変えずにスクリプトの中身を大幅に変更していくのがこれ程辛いものだったとは！？とグロッキーになる位、大変な作業でしたが、そのおかげか、より安定した動作になり、3面まで迷路が完成してアップデート出来ました。アイディアが出ればもっと面数を増やしていきたいもんです。
* * *
・・・・さいたまげーむすに入って、スマホアプリを正式にリリース出来たり、勉強会の講師をやったりと、ようやく新たな業界で生活する為の下地が出来た様で良かったです。とにかく、さいたまげーむすには感謝致します。後は、実際に現場に入って仕事が出来るのが最終目標ですね。さいたまげーむすでは圧倒的に最年長でありながら、技術的にもキャリア的にも一番下っぱの自分ですが、無事この業界で仕事が出来るか、それとも敗者となるか・・。これからが頑張り時ですね。


自作も含め、メンバーの方でリリースした「さいたまげーむすライト」のページ。
***https://play.google.com/store/apps/developer?id=さいたまげーむすライト***

そして、お世話になっている「さいたまげーむす」のページがこちらです。
***http://saitamagame.com/***
mysqli_driver クラスは、インスタンスを生成しても、同じグローバル変数への参照になる


MySQLiで、`PDO::ERRMODE_EXCEPTION` みたいな設定にしたかった。
別のインスタンスを作っても、特に `mysqli` オブエジェクトとの関連付けをする感じのものがないから、どのインスタンスで設定してもグローバルな設定にされるのかなぁって感じがしたので、確かめた。

```php:
<?php
$d1 = new mysqli_driver();
$d2 = new mysqli_driver();

echo $d1->report_mode.PHP_EOL; // 0 (=MYSQLI_REPORT_NONE)
echo $d2->report_mode.PHP_EOL; // 0

$d1->report_mode = MYSQLI_REPORT_ALL;

echo $d1->report_mode.PHP_EOL; // 255
echo $d2->report_mode.PHP_EOL; // 255  ←????!!!!!wwwwww

echo spl_object_hash($d1).PHP_EOL; 
  // 000000007d27830c0000000039102951
echo spl_object_hash($d2).PHP_EOL;
  // 000000007d27830f0000000039102951

var_dump($d1);
var_dump($d2);
```

オブジェクトハッシュは違うらしい。

```text:var_dumpの結果
object(mysqli_driver)#1 (6) {
  ["client_info"]=>
  string(79) "mysqlnd 5.0.12-dev - 20150407 - $Id: 241ae00989d1995ffcbbf63d579943635faf9972 $"
  ["client_version"]=>
  int(50012)
  ["driver_version"]=>
  int(101009)
  ["embedded"]=>
  bool(false)
  ["reconnect"]=>
  bool(false)
  ["report_mode"]=>
  int(255)
}
object(mysqli_driver)#2 (6) {
  ["client_info"]=>
  string(79) "mysqlnd 5.0.12-dev - 20150407 - $Id: 241ae00989d1995ffcbbf63d579943635faf9972 $"
  ["client_version"]=>
  int(50012)
  ["driver_version"]=>
  int(101009)
  ["embedded"]=>
  bool(false)
  ["reconnect"]=>
  bool(false)
  ["report_mode"]=>
  int(255)
}
```


## 内部実装はどうなっているのか

[$mysqli_driver->report_mode](http://php.net/mysqli-driver.report-mode)くらいしか使わないので、これだけ追ってみました。

例によって、自己解釈コメント付き。


*家帰ったら追記する*

* [githubで検索した結果のページ](https://github.com/php/php-src/search?l=C&q=report_mode&utf8=%E2%9C%93)
* 例として、mysqli::__construct() で接続失敗したときにthrowする経路を示す
* [HHVMだと挙動が違う。](https://3v4l.org/330o6)
Python初心者がJSONでiTunesのランキングを取ってくるだけのものをつくってみた

勉強用にランキング情報取ってきてただ表示するだけのものを作成してみました。
Python初めて書いたので…
エラー関係がさっぱりわかんなくて苦労した…


```
import json
import urllib.request

url = urllib.request.urlopen('https://itunes.apple.com/jp/rss/topfreeapplications/limit=10/json')
ranking = url.read()

encodeing= url.info().get_content_charset('utf-8')
jsonDecodeing = json.loads(ranking.decode(encodeing))
i=0
for kind in jsonDecodeing['feed']['entry']:
    i+=1
    print ( i, kind['title']['label'])
```

ということで実行結果はこんな感じ・・・

```
1 Super Mario Run - Nintendo Co., Ltd.
2 Goat Simulator - Coffee Stain Studios
3 Coke ON コカ·コーラの自販機がおトクに楽しくなるアプリ - Coca-Cola
4 Lep's World 3 無料 - スーパー最高のプラットフォーマーゲーム - nerByte GmbH
5 当たる占い師【水晶玉子】◆あなただけの特別鑑定書≪無料占いあり≫ - pocke, Inc
6 実況パワフルサッカー - KONAMI
7 スノー SNOW - 自撮り、顔認識スタンプ、ウケるカメラ - CampMobile Inc.
8 脱出ゲーム サンタの部屋 - Tatsuya Kishi
9 STAR OCEAN -anamnesis- - SQUARE ENIX INC
10 民放公式テレビポータル「TVer（ティーバー）」 - PRESENTCAST INC.
```

大したことはやってないけど・・・
FacebookのOGPのクエリのエスケープでハマった件

TwitterとFacebookで様子が違ってハマったのでメモ

# 状況
brightcoveでは
`https://players.brightcove.net/<account-id>/default_default/index.html?videoId=<video-id>`
として動画が得られる他
`https://players.brightcove.net/<account-id>/default_default/index.html?videoId=ref:<video-reference-id>`
とすることで、Brightcove側で振られる動画IDのほかに、自分で指定できる「参照ID」で動画を得ることができる。

FacebookとTwitterでOGPを指定して動画を流そうとしたところ、TwitterではうまくいったもののFacebookでは失敗した
（TwitterはOGPじゃなく`twitter:player`の指定になるがまあ）

# 原因と検証
Open Graphオブジェクトデバッガー (https://developers.facebook.com/tools/debug/og/object/) で確認したところ、セミコロンが`%3A`にエンコードされている。
brightcove側でデコードは行わないため、動画が見つからなく失敗している

なんとなく何がエンコードされたか検証してみる

| 文字 | エンコード結果 |
|---|---|
| ! | %21 |
| " | %22 |
| # | # |
| $ | パースエラー |
| % | %25 |
| & | & |
| ' | %27 |
| ( | %28 |
| ) | %29 |
| * | %2A |
| + | + |
| , | %2C |
| - | - |
| . | . |
| / | %2F |
| : | %3A |
| ; | %3B |
| < | %3C |
| = | = |
| > | %3E |
| ? | %3F |
| @ | %40 |
| [ | %5B |
| \ | %5C |
| ] | %5D |
| ^ | %5E |
| _ | _ |
| ` | %60 |
| { | %7B |
| ｜ | %7C |
| } | %7D |
| ~ | %7E |

わっかんねー
組み込みの関数でこんなエスケープ返すのってなんかあんのかな
自分で組んだのかな

他にもエスケープに関していろいろ調べてた人がいたので確認する
[HTTPのクエリパラメータにコロン(:)を書くのは不正なのか。](http://koseki.hatenablog.com/entry/20120212/uricolon)

**わけわっっっっっかんねー**

# まとめ
エスケープはよくわかんない
（ogpとtwitter cardは同じじゃないけど）どちらにも同様に動画流そうとすると違いにハマるかもしれない
一応Brightcove側にデコードしてくれないか聞いてみるけど……

あとついでに、Qiitaのマークダウンで、表中に`|`(vertical line)をいれようとしてエスケープしてもうまくいかなかった
上のは全角になってる
Ruby 2.3 のぼっち演算子を使うときにやりがちなミス

Ruby 2.3 で導入された `&.` 演算子（**safe navigation operator** = ぼっち演算子）を使うときに、個人的に何度かやらかした間違いを書いておきます。

```ruby
# 誤
object&.foo.bar
# 正
object&.foo&.bar
```

間違い例の場合、 `NoMethodError` が発生します。

```ruby
irb(main):001:0> nil&.foo&.bar
=> nil
irb(main):002:0> nil&.foo.bar
NoMethodError: undefined method `bar' for nil:NilClass
        from (irb):2
        from /home/key-amb/.rbenv/versions/2.3.1/bin/irb:11:in `<main>'
```


## 参考
- [NEWS for Ruby 2.3.0 (Ruby 2.3.0)](https://docs.ruby-lang.org/ja/latest/doc/news=2f2_3_0.html "NEWS for Ruby 2.3.0 (Ruby 2.3.0)")
dockerコンテナにhubotをインストールする話

# 前提事項
  - alpineのBaseImageを使っていること
  - Node.jsがインストールされていること

# 起きたこと
  - エラーが起きる

      ```
[/home/hubot # yo hubot
/usr/lib/node_modules/yo/node_modules/configstore/index.js:53
				throw err;
				^
Error: EACCES: permission denied, open '/root/.config/configstore/insight-yo.json'
You don't have access to this file.
      ```

# どうしたか
  - dockerでのhubotに関する記事がありました
    http://qiita.com/tubone/items/11a7ceb3e7013139abab

  - alpineでも同じで、ユーザを作成した
    ` adduser myhubot `
  - sudoersにそのユーザを入れた（これはいるのか？）
    ` vi /etc/sudoers `

    ```
    ##
    ## User privilege specification
    ##
    root ALL=(ALL) ALL
    myhubot ALL=(ALL) ALL
    ```
  - /home/myhubot/hubot というディレクトリを作成して、"yo hubot"と入力

# 結果
とりあえず動いたのでこれでよしとする。このあとはhubotとslackをつなぐところ。。。
楽天レシピのAMP対応状況について調べてみた。


AMPについて、インターネット上にも情報が少ないので、調べたことについてどんどん発信していこうと思います。

今回は、楽天レシピのAMP対応状況についてです。
レシピ系サイトでAMPの実装を考えている方に参考になればと思います。

## AMP対応状況
| ページ名 | 通常ページ | AMPページ |
|:-----------|------------:|------------:|
| トップ     | http://recipe.rakuten.co.jp/ |     未対応     |
| レシピ一覧       |    http://recipe.rakuten.co.jp/category/15/ |     未対応    |
| レシピ詳細      | http://recipe.rakuten.co.jp/recipe/1790006679/  |     http://recipe.rakuten.co.jp/recipe/1790006679/amp/     |

## AMPページ確認方法
URLの末尾に/amp/を挿入するだけで確認可能です。（ただしレシピ詳細ページのみ）

## AMP実装方法
サブディレクトリ形式

## CDN上のAMPページとパラメータ

https://www.google.co.jp/amp/recipe.rakuten.co.jp/recipe/1790006679/amp/
特にパラメータの設定はしていませんが、サブディレクトリ形式なので、必要ないですね。

## AMPページからの内部リンクパラメータ
アクセス解析用にパラメータが設置されていました。

| 設置箇所 | パラメータ |
|:-----------|:------------|
| ロゴ（トップヘ）       | ?l-id=amp_logo |
| レシピタイトル     | ?l-id=amp_rcptitle |
| 作った人ページ | ?l-id=amp_user |
| つくったよ一覧         | ?l-id=amp_tsukuttayo  |
| このレシピを見る       |       ?l-id=amp_rcpmore |
| レシピ人気ランキング    | ?l-id=amp_rcpranking |
| ランキングをもっと見る  | ?l-id=amp_rankingmore |
情報元：http://recipe.rakuten.co.jp/recipe/1790006679/amp/

基本的に内部リンクはAMPからのアクセスだと解析するためにパラメータが設置されていましたが、フッターメニューの「お問い合わせ」と「利用規約」にはパラメータの設置はなかったです。

このampパラメータの設置のお陰で例えば、google analytics、search consoleを確認した時に、ampページからの流入かどうかが判断つくので、良い感じですね。

## 最後に
他に人気のレシピサイトであるクックパッドとNadia（今まで知らなかったですが）のAMP対応状況を確認しましたが、どちらもまだ未対応でした。

楽天レシピは新しい技術への対応が早いように思えます。
また、進展ありましたら、共有します。
PCANetを実装してみた

PCANetというニューラルネットワークを実装しました。

* [論文 (arXiv)](https://arxiv.org/abs/1404.3606)
* [実装 (GitHub)](https://github.com/IshitaTakeshi/PCANet)

# PCANetの概要
PCANetはその名の通り，ネットワークの重みをPCA(主成分分析)によって計算するCNNの一種です。

## 利点
PCANetには次のような特徴があります。

* PCAで重みを計算するため学習が非常に高速である
* PCANetそのものの学習は教師ラベルを必要としない
* 調整が必要なハイパーパラメータが無い
* モデルが比較的単純なため実装しやすい

### 教師ラベルを必要としない
PCANetは，画像から切り出したパッチをベクトルとみなし，その主成分をネットワークの重みとしています。
一般的なCNNでは，目標とする出力とネットワークの出力の差をネットワーク全体に逆伝搬することで学習を行っています。一方でPCANetは画像さえ与えられればあとはPCAをかけるだけで学習ができてしまうため，教師ラベルを必要としません。

## 欠点
モデルが線形な演算やヒストグラム計算のみで構成されているため，非線形なモデルと比べると表現力は劣るようです。例えば[CIFAR10での識別精度は80%に達していません](http://rodrigob.github.io/are_we_there_yet/build/classification_datasets_results.html#43494641522d3130)。

「DeepLearningやるほどの計算量が無い，でもHoGだと精度が悪い」などというときにはPCANetを使うといいかもしれません。

# 実装について
## 論文中にわからない部分がある

```
We then subtract patch mean from each patch
```

とありますが，データセット内の全ての画像から抽出したパッチの平均なのか，それとも画像1枚ごとに抽出したパッチの平均なのかがわかっていません．私は画像間の輝度差を消せるので多分後者だろうと思っています。

### mini-batchが使えない
PCAは基本的にバッチ処理なので，mini-batchのようにデータを小さなバッチに切り分けて学習することができません。このため非常に大きなデータを使って学習する際はメモリが足りなくなってしまいます。
実装上の解決策として，

* [逐次学習可能なPCA](http://ttic.uchicago.edu/~dgarber/papers/onlinepca.pdf)を使う
* mini-batchの各バッチに対してPCAを適用し，各バッチの主成分の和を重みとする

などが考えられるため，今後必要に応じて改善していきます。
pepper オートノマスライフについて

#pepper君をよりリアルにする為のオートノマスライフ

今日はオートノマスライフについて調べました。
すぐに忘れてしまう自分の為にもめもめもめも、、、、、。
以下URL参考になりました。
http://qiita.com/Atelier-Akihabara/items/555989ab1d7d7e63e520
http://qiita.com/Atelier-Akihabara/items/01c9203aed68efa1bd70

アプリを作成しているとスタートからエンドまでがアプリの世界だけで完了してしまうので、いまいちペッパーの挙動にリアルさが感じられなくしらべていたらオートノマスライフという文言を発見！！これはいいのではと思い調査！

##オートノマスライフの４つの状態
- Solitary (ひとりぼっち)
- Interactive (人間との対面)
- Safeguard (安全確保)
- Disabled (無効)

##今日の作業
今回は近づいた時に自分の顔を認識して” おーい、○○ー。元気？” というようにしゃべりかけてくるようにしました。InteractiveアクティビティでLaunchpad/NumPeopleZone3に人が入ればというのをトリガーに設定しました。あ、これ知らん人でも反応するかもしれない？？ちょっとそこは調査しないと！
とりあえずpepper再起動後もうまく僕の顔を認識して名前をよんでもらえるようになりましたー！少し友達になれた気が、、、。
非エンジニアがAtom使っている話

はじめまして、teaeastと申します。
非エンジニアで、スマホゲームの開発にかかわっています。
完全に勢いでアドベントカレンダーに登録したのでおびえています。
いじめないでください。

そんな感じで、非エンジニアの私がAtomを使いだした経緯と所感について書いていこうと思います。

## 導入の経緯
### SublimeTextとの出会い
現在ではあまりやっていませんが、以前の職場ではプランナーもスクリプトを打つ必要がありました。
といってもゲームの実装でどうしても必要な部分だけ書くといった感じ。

学校でプログラムをやったことなどなく、途方に暮れていた私に同期のプログラマーさんが教えてくれたのが、かの有名な「Sublime Text」でした。
恋するエディタの名前通り、めっちゃ使いやすかったです。
見た目から入る派かつ、フォントスキーな私はまずUIに一目ぼれ。
以来、多岐にわたって使用していました。

### SublimeTextとの別れ
職場が変わり、スクリプトを打つ機会も減りました。
変わって利用する機会が増えたのがHTMLとCSS。
かわらずSublimeTextを使っていたのですが、二つ問題がありました。

#### 有償にしなければならないが、クレカ使えない問題
こちらは、もう完全に私個人の問題なんですが、
「ぜってーにクレカ持たねぇ」という厄介なポリシーがありまして……。
クレカを持つと際限なくソシャゲにぶっこむだろうなぁという
自分の理性のなさを信じた結果です。
理性本当にないので。本当にないので。
実際あまり不便に感じていなかったのでいまだにクレカ持ってないです。

#### ShiftJISへの変換がたまにバグる問題
こっちのが大きかったです。
変換するためのパッケージをいれたりしたんですが、たまに私のやり方がまずいのか、
変換ができなくなってウィンドウを謎文字が覆いつくすんですよね。
わりとせっかちな方なのでとても気になりました。


そんなわけで、SublimeTextと別れることを決意しました。


## Atomとの出会い、そして。
そんな中で出会ったのがAtomでした。
UIがあまり変わらない、かつShiftJISへの変換が簡単にできるということでためしにダウンロードしました。
正直、「どうせSublimeのがいいんでしょ？」と昔の男を忘れられない月９主人公のような気持ちだったのですが、
くつがえりました。

### ShiftJIS変換簡単すぎる……！
右下の文字コード変換ボタンでラクラク。
ためしにいろんな文字コードに変換できるので、たまに謎文字を作り出して遊んでいます。
### 日本語そのまま入る！！
Sublimeでは、自分で調べて対応しない限り日本語入力が綺麗にできないという仕様がありました。ウィンドウ外に出る日本語に切れそうになったことも幾度かありました。
それが、Atomでは何の対応も必要なく、そのまま入ります。
これは、HTMLやCSSだけではなくちょっと日本語で「お昼　肉食べること」などメモしたい時にも役立ちます。
同じく非エンジニアの方にこのエディタを勧めやすくもなりました。
### 色が優しい
初期設定の色がSublimeより優しく、眼に痛くないです。
これは長時間の作業をする方に推したいポイントです。
![ebf01518ef9eccc85eed8139d0925aea.png](https://qiita-image-store.s3.amazonaws.com/0/143987/2216c23f-35e7-f4f0-e7b5-554a7913ca57.png)
比較するとこんな感じ。
そしてほどよい「プログラム書いてる感」。テンションが上がります。


## まとめ
というわけで、Atomは非エンジニアでも楽しく便利に使える素敵なエディタだということがわかってもらえたのでは……と思います。
比較しましたけど、Sublimeもいいエディタであるのは違いありません。
自分にマッチしたエディタを使って楽しくお仕事できるのが一番だと思います。
その中の選択肢の一つにAtomを入れていただければという話です。



他にもこんなすごいエディタがあるよ～というオススメありましたらお教えください！
長い日本語をしっかり綺麗に見れて、かつ文字数もわかりやすい素敵なエディタを探しております。エディタ王に、俺はなる！
sbtのいろいろな最小構成設定(コピペ用)

Scalaの分離されている標準ライブラリなどを使うためのbuild.sbt設定コピペ集。

## Parser combinator


```scala:build.sbt
libraryDependencies ++= Seq(
  "org.scala-lang.modules" %% "scala-parser-combinators" % "1.0.4"
)
```

```scala:code
import scala.util.parsing.combinator._

// 大体の場合はRegexParsersでOK
class MyParser extends RegexParsers { ... } 
```


versionが変わってる可能性あるので、最新は[こちら](https://github.com/scala/scala-parser-combinators)を確認してください。


## Reflection

```scala:build.sbt
libraryDependencies ++= Seq(
  "org.scala-lang" % "scala-reflect" % scalaVersion.value
)
```

```scala:code
import scala.reflect.runtime.universe._

def hoge[T]()(implicit tt: TypeTag[T]) = {
  val t: Type = tt.tpe
}
```


## Macro

Macroは別プロジェクトにしておかないと使えないので、大体の場合はサブプロジェクト化すると思います。

```scala:build.sbt
lazy val root = (project in file(".")).
  dependsOn(macroProject)

lazy val macroProject = (project in file("macro")).settings(commonSettings:_*).
  settings(
    libraryDependencies ++= Seq(
      "org.scala-lang" % "scala-reflect" % scalaVersion.value
    )
  ) 


```

```scala:code
import scala.reflect.macros.Context
import scala.language.experimental.macros

object MyMacro {
  def myImpl(c: Context)
            (arg1: c.Expr[Boolean], arg2: c.Expr[Any]): c.Expr[String] = {
    import c.universe._

    c.Expr(q"val a = 2;a.toString()")
  }
}

// usage
def myFunc(arg1: Boolean, args: Any) : String = macro MyMacro.myImpl

```


## Scala meta

Scala metaの場合は、compiler pluginを使用することになるので、その設定も必要です。

```scala:build.sbt
lazy val root = (project in file(".")).
  dependsOn(scalaMetaProject)

lazy val scalaMetaProject = (project in file("scala-meta")).
  settings(
    libraryDependencies ++= Seq(
      "org.scalameta" %% "scalameta" % "1.3.0"
    ),
    addCompilerPlugin(
      "org.scalameta" % "paradise" % "3.0.0-M5" cross CrossVersion.full),
    scalacOptions += "-Xplugin-require:macroparadise"
  )

```

```scala:code
import scala.meta._
import scala.collection.immutable.Seq

class MyMeta extends scala.annotation.StaticAnnotation {

  inline def apply(defn: Any): Any = meta {
    defn match{
      case cls: Defn.Class => ...
      case func: Defn.Def => ...
    }
  }
}

//usage

@MyMeta class ModifiedClass{
  @MyMeta def hoge() = ...
}

```

metaは、アノテーションの形で使用します。そのため、アノテーションを付ける事のできるtrait,class,object,val,var,defなどほぼ全てのマクロ化が出来るようになっています。

最新バージョンや設定方法が変わっている場合は、ここを参考にすると良いです。
https://github.com/scalameta/tutorial


## XML

```scala:build.sbt
libraryDependencies ++= Seq(
  "org.scala-lang.modules" %% "scala-xml" % "1.0.6"
)
```

```scala:code
val xml = <hello>world</hello>
```


最新バージョンは[こちら](https://github.com/scala/scala-module-dependency-sample)で確認して下さい。
LaravelでCSRF Tokenエラーを拾う


多くのサイトで紹介されているやり方では、セッションタイムアウトは拾えたがCSRFは拾えなかった。

```php:app/Exceptions/Handler.php
public function render($request, Exception $exception)
{
    if ($exception instanceof TokenMismatchException){
      // 処理
    }
    return parent::render($request, $exception);
}
```

しかし、これだとCSRFトークンのエラーが拾えなかったので、`get_class()`で拾ったら、どっちも拾えた。

```php:app/Exceptions/Handler.php
public function render($request, Exception $exception)
{
  if (get_class($exception) == 'Illuminate\Session\TokenMismatchException'){
    // 処理
  }
  return parent::render($request, $exception);
}
```

セッションタイムアウトとCSRFエラーを使い分けたかったら、先に、`$exception instanceof TokenMismatchException`で判定すればよい。
schemaライブラリのmarshmallowの使い方のメモ

## marshmallow ?

このライブラリのこと。schemaライブラリ。

- [marshmallow-code/marshmallow: A lightweight library for converting complex objects to and from simple Python datatypes.](https://github.com/marshmallow-code/marshmallow)

## quick startを読む

quick startを読む

- https://marshmallow.readthedocs.io/en/latest/quickstart.html

結構細かく書かれているので読むと良い。

雑な使い方は以下のようなもの(quick startはもっと詳しい)。

### schema定義

```python
from marshmallow import Schema, fields

# schema 定義
class Perseon(Schema):
    name = fields.String()
    age = fields.Integer()
```

### schemaの利用(load/dump)

```python
# load(json.loads的なイメージ)
data, errs = Person().load({"name": "foo", "age": "10"})

# dump
dumped, errs = Person().dump(data)
```

`load()` ,`dump()` で返される値は `data,errors`を値に持つnamedtuple。なので `Person.dump(data).data` などと書く事もできる。

### strict mode

defaultではvalidationに引っかかってもエラーにならない。エラーにするにはstrict modeを有効にする。

```python
Person(strict=True).load({})
```

## 読んだ後の話

以下の点に注意

- defaultではstrict modeがfalse
- schema定義に存在しない値は自動で消される
- `required=True` は明示的に付けないとrequiredにならない
- defaultでdumpの `update_fields=True`

### defaultではstrict modeがfalse

個人的にはdefaultでtrueが良いので基本的にはMetaでstrict=Trueにしている。

```python
class Person(Schema):
    name = fields.String()

    class Meta:
        strict = True

Person().load({})  # marshmallow.ValidationError
```

strictを外したい時に明示的に `strict=False` を渡している。

```
data, err = Person(strict=False).load({})
```


### schema定義に存在しない値は自動で消される

schema定義に存在しない値は自動で消される。必要なフィールドはしっかり定義してあげないとだめなので注意。

```python
class Person(Schema):
    name = fields.String()

data, _ = Person().load({"name": "foo", "age": 20})
print(data)  # => {"name": "foo"}
```

### `required=True` は明示的に付けないとrequiredにならない

このnameはrequiredにならない。明示的にrequiredを付けないとだめ。

```python
class Person(Schema):
    name = fields.String()
```

こう。

```python
class Person(Schema):
    name = fields.String(required=True)
```

これはMetaでfieldsを指定する時も同様。つまりMeta.fieldsでrequiredなfieldsを定義できない

```python
class Person(Schema):
    class Meta:
        filds = ("name",)
```

### defaultでdumpの `update_fields=True`

これは細かい話だけれど。パフォーマンスのベンチマークをしたい場合に注意。marshmallowはデフォルトでupdate_fieldsがtrueになっている。これは渡されたデータの値を利用して自動で定義されたfieldなどの型に対する扱いを良い感じに変更するというような機能。たとえば数値を渡したあとには単なるfields.Fieldからfields.Integerになるみたいなもの。

便利なのだけれど。結構負荷が掛かる処理ではあるので速度が気になる場合にはoffにすると良い。尚metaでは指定はできない模様。

```
schema.dump(data, update_fields=False)
```

困った時にはソースコードを読めば解決する。
プログラミング初心者の学習まとめ < Scss & 要素について >

# これはなに ？
- @atsushi-watanabe が自己学習として取り組んだプログラミングの内容を備忘録を目的にまとめたものです。

# 目的
- & （アンパサンド）を使ってみよう

# & （アンパサンド）とは

- 親セレクタの参照ができる記述

# 記述方法（セレクタ・擬似セレクタの前）

```:html
<p class="test1">
hogehoge
</p>

```

```:scss
.test1{
  font-size: 40px;
  color: #000000;
  margin-top: 250px;
  text-align: center;
  
  &:hover{
  font-weight: bold;
  color: blue;
  }
}
```
![ezgif.com-dff4f9cff0.gif](https://qiita-image-store.s3.amazonaws.com/0/143062/1872b7f6-d18e-e063-7b3e-7be86f0e553a.gif)


###### 参考
- [[Sass]親セレクタの参照ができる&(アンパサンド)の使い方](http://cappee.net/coding/sass-scss/sass-ampersand)
- こちらを参考にさせていただきました。ありがとうございます。
bitbarで特定のタグがついたQiita:Teamの記事の一覧を表示してブラウザで開けるようにする

# TL;DR
- 特定のタグの記事一覧をmacのツールバーからブラウザで開けるようにする
- bitbarのpluginとして動かす

# script

```tag_latest.1h.rb
#!/usr/bin/env /Users/NAME/.rbenv/shims/ruby

require 'qiita'
client = Qiita::Client.new(
  access_token: 'ACCESS_TOKEN_HERE',
  team: 'YOUR TEAME NAME'
)
params = {query: 'tag:TAGNAME'}

list = client.list_items(params).body

puts 'Qiita:Team'
puts '---'
list.each do |item|
  puts "#{item['title']} | href=#{item['url']}"
end
puts 'Reload | color=red refresh=true'
```

## 設定など
- rubyのpathは適宜設定をする
- access_tokenはqiita:teamのread権限をつけて生成する
- teamの設定をする
- 取得したいタグを設定する
- gem qiita が必要なので scriptのruby のpathが通っているところで ``` gem install qiita ``` などしておく
- scriptに実行権限を付与する

# まとめ
- 特定のタグがついた議事録一覧などを一撃でみれるようになってとても捗る
正規表現を使ってコミュニケートを柔軟にする in 伺か

#よくあるコミュニケートの問題

ゴーストのコミュニケート反応を見ていると、たまに「こんにちは」で反応しても「こんにちはー！」や「こんちは！」など判定キーワードが少しでも違うと反応しないものがあります。
そんな場合は、正規表現を使ってコミュニケートを実装するとより柔軟に対応できます。

#つかいかた
YAYAではRE_SEARCH(入力, 正規表現)で入力に正規表現にマッチする文字列が含まれているかどうかを判定できます。
たとえば次のような使い方ができます:(inputboxなどでreference[0]にユーザーの入力が格納される場合を想定)

```JavaScript
if (RE_SEARCH(reference[0], 'こんに?ち[はわ]|今日[はわ]|コンニチ[ハワ]')){
	<<"
	テスト００：こんにちは、%(username)。
	">>
}
```

......意味が分からない!って人は次の解説をどうぞ

#正規表現って?
文字列のパターンを記述するための表記法です。YAYA以外にもRubyやPerlなどに標準ライブラリとして搭載されています。また、テキストエディタの色分けなどもこれを利用して作られています。
##普通の文字列
その文字が含まれていればマッチします。例えば「やあ」なら「やあ、なにしてるの？」や「いやあああ」などにマッチします。
##この中のどれか(or)
「|」を使います。意味は条件分岐のorと同じです。例えば「こんにちは|今日は|コンニチハ」は「こんにちは！」や「今日は、何してるの？」「コンニチハオヒガラモヨク」などにマッチします。

##文頭、文末
^AAAでAAAが文頭の場合、AAA$でAAAが文末の場合として判定します。例えば「^やあ」なら「やあ、調子はどう？」や「やあやあ我こそは」にマッチします。
また、「かよ$」なら「またおまえかよ」や「ライフはわずかよ」などにマッチします。
両方を使った場合、つまり「^はい$」なら文頭かつ文末なので「はい」しかマッチしません。
($は演算子の前すべての文字(^は後)で判定されます。従って実際に使う場合は後述する「()」でマッチさせたい部分を囲っておくことを推奨します)
##どれか1文字
[]で、[]の中の文字どれか1文字、という意味になります。例えば「こんにち[はわ]」なら「こんにちはー」や「こんにちわ！！！」などにマッチします。
全角/半角の表記ブレを吸収する用途にも使えます。
##なんでもいいから1文字
「.」でなにか1文字を表します。例えば「これが...だ！」なら「これがスイカだ！」や「これがとうふだ！」などにマッチします。
##繰り返し
「+」は直前の1文字が1回以上連続する場合、「\*」は直前の1文字が0回以上連続する場合にマッチします。例えば
「は+」なら「ははは」や「あはははは」、「あは！」などにマッチします。
「あう*」なら「あ」や「あうううう」などにマッチします。
##あってもいいしなくてもいい
「?」で「直前の1文字があってもなくてもいい」という意味になります。例えば「こんに?ちは」なら「こんちはー」や「こんにちは」などにマッチします。

##グループ分け
上述の演算子の評価順序は丸括弧「()」で指定できます。例えば
「(もち)+」なら「おもちもちもち」や「もち」などにマッチします。
「(好き|すき)です」なら「好きですよ」や「だいすきです」などにマッチします。

##エスケープシーケンス
演算子として使われてしまっている文字を判定として使いたい場合はエスケープシーケンスとしてバックスラッシュ「\」を使います。
例えば「なに(\?|？)」は「えーっと、なに？」や「なに?」などにマッチします。
##かつ(and)
正規表現にはandに対応する演算子は用意されていません。しかし以上の演算子を組み合わせることでandを表現することができます。具体的には
　　　　　　　　　　　　　　　**^(?=.\*りんご)(?=.\*みかん)**
で「文中に「りんご」と「みかん」(連続している必要はない)が両方含まれている場合にマッチ」という意味になります。例えば
^(?=.\*(私|わたし|僕|ぼく|俺|おれ))(?=.\*(\?|？)$)で「僕は何をしてるんだ？」や「それって私の本?」などにマッチします。
#最初のコードの意味
これらを踏まえて、最初のコードに書かれていた正規表現を翻訳すると**入力された文字列の中に「こんにちはorこんちはorこんにちわorこんちわor今日はor今日わorコンニチハorコンニチワ」が含まれていたならtrue、含まれていないならfalse**という意味になります。
このように正規表現をうまく使えば、だいぶすっきりと文章の判定が可能になります。
ぜひ、ゴーストのコミュニケート反応に使ってみよう
###Tips

```JavaScript
if (RE_SEARCH(reference[0], '(なの|の|かしら|か)(？|\?)?$')){
	<<"
	テスト０８：そうなんじゃない？
	">>

	<<"
	テスト０８：さあ、なんだろうね？
	">>
}
```

とするとほとんどのTrue/Falseを問う疑問文に「そうなんじゃない？」または「さあ、なんだろうね？」と答えるので、"会話が成り立っているように"みえる。
コミュニケート反応の条件分岐の最後の方でこういったものを入れておくと、自然に会話が成り立ちやすい
C++でJavaのProperties+α

# Properties on C++

std::unordered_mapとboost::lexical_castを使用して，JavaのPropertiesのようなクラスを作ってみました．
[実装コード](https://gist.github.com/tell/4bbcca7e69a9db1f37a6880099e821bd)はgistに置きました．

## 機能

Javaの[Properties](http://docs.oracle.com/javase/8/docs/api/java/util/Properties.html)はいわゆるmapであり，キーと値の型は文字列(String)です．

整数値や浮動小数点数値をキーで引いたり保存したりする機能があると便利そうだと思ったことと，その値をどのような型で扱うかはクライアントコードが知っているはずなので，型を明示的に指定するgetterを追加しました．

JavaのPropertiesはデフォルト値を設定できるようですが，その機能は実装していません．

## 実装

型変換機能はboost::lexical_castを使って実装しました．

setterはlexical_castを使い，引数に渡された値を文字列表現に変換して保存します．

getterは，文字列型を返せばよい場合はキーで引いた値をそのまま返し，型が指定されている場合はlexical_castを使って変換を試みます．
返り値の型はboost::optionalであり，変換に成功した場合はその値，失敗した場合はnoneを返します．

# 本当にやりたかったこと

とあるプロジェクトで，整数値や浮動小数点数値のグローバル変数があちこちにあり，それぞれの変数の依存関係が把握し辛い，という状況が生じました．
そこで，どのようなグローバル変数があり，どこで書き換えられて，どこで参照されているのかを把握したかったので，今回紹介するようなクラスを作りました．

[実装コード](https://gist.github.com/tell/4bbcca7e69a9db1f37a6880099e821bd)には実装していないけど，setterとgetterでログを吐かせるつもりでした．

しかし，これは実行時チェックなので，ログを追ったり，問題が生じた時には再現させるという作業が発生し，一般にこれは容易ではないので，問題解決にはなっていない気がします．

…ここで紹介するクラスを使用するより，グローバル変数を減らすためのリファクタリングを素直に試みた方が良いかもしれません．
しかし，そのリファクタリングのノウハウについては詳しくない…どうすればよいだろう？
C++修行は続く…