OmniAICreator/Qiita-1.07M huggingface dataset:
はてなのシロクマを屑籠に放り込むユーザースクリプト

# <i class="fa fa-cubes"></i> 概要

![SHIRO-KUMAKUZU-BAKO.JPG](https://qiita-image-store.s3.amazonaws.com/0/62354/dffb30ef-94f6-c1ce-0931-f68a7d2ea15a.jpeg)

です。
どう見てもはてなのシロクマを非表示にします。

こいつははてなブックマークをログインせずに見ているとランダム(かのように)に現れます。
こういったリマインダーは最近多いですが、手癖の動きをランダムに妨害されると結構イラっとしてしまいます。
かといって社用PCでログインする気もないので、表示条件を調べて黙殺します。

はてブは~~大喜利を楽しむ~~エンジニアが情報収集したり記事の真偽の目安にしたりと日常的に使う重要な場所なので、
逃れられぬリマインダーから逃げてしまいましょう。

# <i class="fa fa-cogs"></i> 動作確認環境

* `Windows7`
* `Firefox46`
* `Greasemonkey`
* はてなブックマーク非ログイン

# <i class="fa fa-code"></i> 結論コード

[rm_bear.user.js]

```js:rm_bear.user.js

// ==UserScript==
// @name        rm bear
// @description はてなブックマークの登録誘導を消す
// @namespace   khsk
// @include     http://b.hatena.ne.jp/*
// @version     1
// @grant       none
// ==/UserScript==

// ログイン済みユーザー？のフリをするなら
Hatena.Bookmark.user = true;
// visit回数の記録改変を気にしないなら
Hatena.Bookmark.cookie.set('vcount', 1);

```

# <i class="fa fa-search"></i> 調査メモ

まずは表示条件がわからないので、はてブを何回もリロードします。
![SHIRO-KUMAKUZU-BAKO.JPG](https://qiita-image-store.s3.amazonaws.com/0/62354/dffb30ef-94f6-c1ce-0931-f68a7d2ea15a.jpeg)
が出たらストップ。
うっかり更新しすぎる人はゲームのキャラメイクなどで理想的数値を再ロールする絶望を糧に心眼を養いましょう。

表示されたら開発者ツールのインスペクタを使い情報収集。

![gest_modal.JPG](https://qiita-image-store.s3.amazonaws.com/0/62354/3c50089c-435c-5afb-1e0b-e302c8128c3f.jpeg)

IDなどがあればと思いましたが、`src`属性でも多分大丈夫でしょう。
そのままデバッガに移動し、JavaScriptを調べます。

すべてのファイルから検索するために`!/guide/guest_modal`で検索

![debug_bear.png](https://qiita-image-store.s3.amazonaws.com/0/62354/4d6e76e0-db51-9af4-dc0e-6ed4b1c85591.png)

あとはネストとオブジェクトを辿って条件に入らなくしてやればいい。

```js
B.RegistReminder = {
    count: function () {
        if (B.user) {
            B.cookie.clear('vcount');
        } else {
            var vcount = B.cookie.get('vcount');
            vcount = vcount ? ++vcount : 1;
            B.cookie.set('vcount', vcount , '+10y');
            if (vcount % 40 == 0) {
```

うーん、やっぱり**regist**って使っていいのかしら。

どうやら40回ごとに表示されるようである。
体感では結構レアに感じてました。(この時の自分の`vcount`は約1500でした)

条件分岐から、`B.user`を`true`にするか、`vcount`の値を常に+1されても40で割り切れない値にしてやればいい。
`cookie`へのセット方法も書かれているのですぐ使える(+10yは有効期限？不明)。

`B`は何かと調べると、このファイルの先頭に書かれている。

```js

var Hatena = Hatena || {};

(function (Ten, Hatena) {

var B = Hatena.Bookmark = Hatena.Bookmark || {};
try { // 念のため例外補足
    var h = document.getElementsByTagName("html")[0]
    // for v3
    B.isV3EntryPage = (h.getAttribute("data-is-v3-entry-page") === "true");
} catch (err) {}

B.isLocal = !/(?:^|\.)(?:b|bkuma)\.hatena\.ne\.jp$/.test(location.hostname);

```

はい、グローバル変数の`Hatena`の`Bookmark`ですね。
グローバルにあればユーザースクリプトで参照できるので、`vcount`なりを直接書き換えてあげればOKです。

ちなみに`vcount`を39に設定すれば毎回表示させることができます。
クマに会いたくなったら(40で)割りきった気持ちになればF5を連打せずとも会えます。

なお、`user`を`true`にした場合の他への影響は未調査です。

# [熊野 ナンシー]

というらしいです。通称くまこ。

大きめの鼻とアンニュイな目からオスだと思ってました。
いや、今でも別熊の可能性が拭えませんが、しかしググりぢからが足りない。

***

くまこもいいけどくまみこChangもよろしくね。


[熊野 ナンシー]:http://b.hatena.ne.jp/guide/bkuma_girls#profile
[rm_bear.user.js]:https://gist.github.com/khsk/2126887fa6f6dc299a2f936a4dbbf882/raw/e85a9ce1f8a5b6643d896c7c6a5419f3b275ff91/rm_bear.user.js
Sublime2でhamlとbabelる

パス周りでやたらと苦労したので備忘録。

# 絶対パスで行く

rbenvとか使ってると、いろいろと苦労したので。。

##rbenv + haml
事前にrbenvのglobalにhamlをインストールしておく

```json|Haml.sublime-build
{
  "cmd": "haml",
  "selector": "text.haml",
  "working_dir": "${file_path}",
        
  "osx":
  {
    "cmd": ["/users/hiraotakenori/.rbenv/shims/haml","-E", "UTF-8", "$file", "$file_path/$file_base_name.html"]
  }
}
```


##rbenv + sass
事前にrbenvのglobalにsassをインストールしておく
sublime2がsassをsassと認識する必要があるので、Sassパッケージなどを入れて、sassを認識させておく。

```json|Saas.sublime-build
{
  "cmd": "sass",
  "selector": "source.sass",

  "osx":
  {
	  "cmd": ["/users/hiraotakenori/.rbenv/shims/sass", "$file:${file_path}/${file_base_name}.css"]
  }
}
```

##babel
事前にbabelを入れてes2015でコンパイルできるように設定しておく
> npm install babel-cli -g
> npm install --save-dev babel-preset-es2015

```json|.babelrc
{
  "presets": ["es2015"]
}
```


sublime2さんがbabelもnodeも認識してくれないので、絶対パスで。
sublime2にes6系のパッケージを入れて、es6=javascriptと覚えさせておく。

```json|Haml.sublime-build
{
  "cmd": "node",
  "selector": "source.js",
  "working_dir": "${file_path}",
        
  "osx":
  {
    "cmd": ["/usr/local/bin/node", "/usr/local/lib/node_modules/babel-cli/bin/babel", "$file", "--out-file", "$file_path/$file_base_name.js"]
  }
}
```


##SublimeOnSaveBuild
自動的にソースをビルドしてくれる素敵プラグイン。
jsをコンパイルされると変になりそうなので、外しておく。

```json|SublimeOnSaveBuild.sublime-settings
{
    "filename_filter": "\\.(es6|sass|less|scss|haml|coffee)$",
    "build_on_save": 1
}
```
プログラマの考え方がおもしろいほど身につく本より(Python)

チュートリアルもそこそこに
自分でプログラムを組めるようになることを
目標にすすめているので備忘録代わりにここに
残していきます。

きっと間違えていると思うのでご指摘お待ちしております。（見てくれてる人いるといいな）

<h1>カウントダウンとカウントアップ</h1>
問題：以下のコード内に書く式（expression)を考えてみよう。このプログラムは、5から１までの数を一行に１つずつ順番に表示するものである。
ーーーーーーーーーーーーーーーーーーーーーー
for (int row = 1; row <= 5; row++) {
    cout << expression << "\n";
}

ーーーーーーーーーーーーーーーーーーーーーー

<h2>自分の解答</h2>

```lang:test.py
w = 5
while w > 0:
    print(w)
    w -= 1

・・・
5
4
3
2
1

```

以上、この問題は本来のハッシュ記号で正方形を表示しなさいの簡略化した小問題でしたので次回まだ続きます。
JavaScriot で XML の文字列をDOMする


```javascript
var xmlStr = '<root><hoge></hoge></root>';

// Parsing
var xmlDoc = null;
try {
    if (window.DOMParser) {
        xmlDoc = (new window.DOMParser()).parseFromString(xmlStr, "text/xml");
    } else {
        xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async = "false";
        xmlDoc.loadXML(xmlStr);
    }
    if (!xmlDoc) {
        throw new Error('Unknown happening');
    }
} catch(e) {
    console.error("DOM にならん", e.message);
}
console.log(xmlDoc);


// Serializing
var strXml = null;
try {
    var xmlElement = xmlDoc.getElementsByTagName('hoge')[0];
    var attr = xmlDoc.createAttribute('name');
    attr.value = 'Kyoko Fukada';
    xmlElement.attributes.setNamedItem(attr);

    var xmlSerializer = new XMLSerializer();
    strXml = xmlSerializer.serializeToString(xmlDoc);
    if (!strXml) {
        throw new Error('Unknown case');
    }
} catch(e) {
    console.error("シリアライズできひん", e.message);
}
console.log(strXml);
```
vimperatorで左手小指を酷使しないために

vimperatorで左手小指を酷使しないために
===================================

左手の腱が痛い
-------------

最近、左手が腱鞘炎っぽい。
ひどくはないがここで無理するとひどくなりそう。
しかし、どうして「左手だけが?」と考えて思いあたったこと。
vimperatorだ。
僕のブラウジングのしかたはvimperatorのCtrl-dで画面を半スクロール
させながら読んだり、Ctrl-p, Ctrl-nでタブをきりかえたり、とCtrlキーを多用する。
またHHKBを愛用しているのでCtrlキーは左手小指のみの担当となる。
すると、「あー疲れたなー」とリラックスしてウェブページを読んでいるときも左手小指はずっとCtrlキーにのせっぱなしだったりする。
これだ!!

キーマップを変更
--------------

とりあえずCtrl-dとdとをいれかえるだけで小指の負担は相当へるはずだ。
ついでにタブ選択のときにCtrlキーに小指をおきつづけるくせもあるので

```vim:.vimperatorrc
noremap d <C-d>
noremap u <C-u>
noremap p <C-p>
noremap n <C-n>

noremap <C-d> d
noremap <C-u> u
noremap <C-p> p
noremap <C-n> n
```

とした。
これはよさそうだ。
まだ押しまちがいは多いがすぐに慣れるだろう。
GitHubで会社アカウントとプライベートアカウントを使い分ける SSH編

結構あるんじゃないでしょうか。

こちらを参考にさせて頂いたのですが、いくつかその通りいかない点があったのでまとめます。


> *GitHubで複数のアカウントを使う場合のSSHの設定*
http://qiita.com/merrill/items/80a8d8a152e2483fa587


すでにGitHubにアカウントは存在する前提です。


## 新しい公開鍵・秘密鍵を作成する

```sh
cd ~/.ssh
ssh-keygen -t rsa -C hogehoge@gmail.com  -f id_rsa_hogehoge_github

// hogehoge@gmail.com ... githubアカウントのメールアドレス
// id_rsa_hogehoge_github ... 鍵のファイル名
```

以下が生成されます。

id_rsa_hogehoge_github
id_rsa_hogehoge_github.pub


## 公開鍵をgithubに登録する

こちらから登録
https://github.com/settings/keys

id_rsa_hogehoge_github.pubの中身をまるっと貼り付ければOK

## .ssh/configの設定

```sh:.ssh/config
Host hogehoge-github.com
  HostName github.com
  IdentityFile ~/.ssh/id_rsa_hogehoge_github
  User git
  TCPKeepAlive yes
  IdentitiesOnly yes


# hogehoge-github.com は適当なホスト識別子
```

## Github上でリポジトリを作成する

以下から作成
https://github.com/new

ついでに.gitignore,licenseも生成してしまうのがおすすめ。


## リポジトリをcloneする

**ここがはまりました**

```ssh
git clone git@hogehoge-github.com:hogehoge/HogeProject.git


// hogehoge-github.com ... .ssh/configで指定したホスト識別子
// hogehoge ... githubのユーザー名
```

hogehoge-github.comでcloneさえできれば、pushも指定したアカウントで行われます。

## commit用のユーザー名、メールアドレスを変える

```sh
$ cd HogeProject
$ git config --local user.name 名前
$ git config --local user.email "メールアドレス"
```





とくにhttpsより難しいとは思いませんでした。
ご参考まで。
バイナリのRPATHの状態を確認する

Linuxでバイナリに設定されているRPATHを確認する方法まとめ

# 事前準備
適当なソースファイルを用意する。

```cpp:main.cpp
#include <iostream>

int main(int argc, char const* argv[])
{
        std::cout << "aaa" << std::endl;
        return 0;
}
```

```bash:RPATH付きでビルド
$ g++ -Wl,-rpath=/tmp main.cpp 
```

# 確認方法
## `readelf` で確認
`readelf` の Dynamic section にある `(RPATH)` を参照する

```bash:readelfのDynamicSectionを確認
$ readelf -d -w ./a.out
Dynamic section at offset 0xa98 contains 28 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000f (RPATH)              Library rpath: [/tmp]
<~ 後略 ~>

$ readelf -a -w ./a.out | grep RPATH
 0x000000000000000f (RPATH)              Library rpath: [/tmp]
```

## `objdump` で確認
objdump でも同様に確認できる

```bash:objdumpで確認
$ objdump -x ./a.out | grep RPATH
  RPATH                /tmp
```

# 参考
[とあるエンジニアの備忘log: Shared Object 入門](http://masahir0y.blogspot.jp/2013/01/shared-object.html)
[ld-linux.soの--inhibit-rpathオプション: RivIs's blog](http://rivis.air-nifty.com/blog/2014/12/ld-linuxso--inh.html)
[Is there a way to inspect the current rpath on Linux? - Stack Overflow](http://stackoverflow.com/questions/2836330/is-there-a-way-to-inspect-the-current-rpath-on-linux)
AWS CLIでAWS Account IDを取得する。

# はじめに
今回のAWS CLIアップデートでSTSにget-caller-identityというコマンドが追加されました。

**リリースノート**
https://aws.amazon.com/releasenotes/1133794697823335

STSは_Security Token Service_の略で[https://sts.amazonaws.com]()に単一エンドポイントを持つグローバルサービスです。
AWSの_Account_、_UserID_、_Arn_が取得できます。

```bash:コマンド
$ aws sts get-caller-identity
```
それでは実際にコマンドを試してみます。

## 1.バージョン確認
とりあえず、現在インストールされているCLIのバージョンを確認します。

```bash:バージョン確認
$ aws --version
aws-cli/1.10.16 Python/2.7.10 Darwin/15.4.0 botocore/1.4.7
```
get-caller-identityは今回(1.10.18)から追加されたコマンドのため今のバージョンでは利用できません。
試しに、このままのバージョン(1.10.16)でコマンドを実行してみます。

```bash:GetCallerIdentity
$ aws sts get-caller-identity
usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:

  aws help
  aws <command> help
  aws <command> <subcommand> help
aws: error: argument operation: Invalid choice, valid choices are:

assume-role                              | assume-role-with-saml
assume-role-with-web-identity            | decode-authorization-message
get-federation-token                     | get-session-token
help
```

案の定そのようなコマンドは無いと言われてしまいました。


## 2.アップグレード
それでは今回のバージョンへアップグレードします。

```bash:pipインストール
$  sudo pip install --upgrade awscli --ignore-installed six
```
バージョンを確認します。

```bash:バージョン確認
$ aws --version
aws-cli/1.10.18 Python/2.7.10 Darwin/15.4.0 botocore/1.4.9
```

アップデートが完了しました。

## 3.コマンド実行
では、コマンドを実行します。

```bash:GetCallerIdentity
$ aws sts get-caller-identity
{
    "Account": "123456789012",
    "UserId": "AIDA*****************",
    "Arn": "arn:aws:iam::123456789012:user/kohei"
}
```
無事、_AWS Account ID_が取得できているのが確認できます。

ちなみに今回取得できる値について簡単に説明しておきます。

- _Account_：AWSアカウントIDは、Amazonリソースネーム(ARN)を構築するのに使用する12桁の数字。
- _UserID_：現在のユーザーの一意のID。
- _Arn_：Amazonリソースネームの略で、AWSリソースを一意に識別する値。

# おわりに
このコマンドはグローバルエンドポイントを見に行って情報を取得してくれるためリージョンの指定などをすることなく実行できます。
これによって現在作業中のプロファイル情報がわかるので複数アカウント切り替えたりする環境ではとても役に立ちそうです。
技術英語 > リスニング > Endress+Hauser > The Temperature Law: E+H = degC > Part 4

温度測定の技術に関しての面白そうな動画
http://qiita.com/7of9/items/54a22186fe771e0329a9
のリスニングの続き

@ Endress+Hauser > The Temperature Law: E+H = degC
https://www.youtube.com/watch?v=vnLyPVAb81s&list=WL&index=45

赤文字ははっきり聞き取れない部分。
青文字はそのように聞き取れるが、文法的にしっくりいかない部分。

(4:55-)
The unique <font color=red>warm</font> concept, which answers all questions on your measuring point, whenever you want. From setup, order, installation, appropriate spare parts and accessories. The serial number is the key to each individual unit.

(5:14-)
How does Endress+Hauser change our world? For example, we make it more safe. In our research and development department, we simulate and test extreme cases, test products for ambitious applications, and develop new concept for plant-specific solutions.

(5:37-)
Our patented compact sensor technology, with seven times faster response time at half the immersion depth, is currently <font color=red>re sensation</font> in food and pharmacerutical industry. If an optimal solution hasn't been found yet, maybe it's been developed right now for tomorrow.

また二か所聞き取れなかった。

re sensation は the sensation かもしれない。
htmlを書くとき <br>か<br />か

htmlを書くとき、改行タグを、`<br>`ではなくて`<br />`と書かれてある場面によく出くわしますが、どちらを使えばいいのか悩みます、そこで調べてみました。

（参考）
https://teratail.com/questions/27157

結論としては、XHTMLの文法での作法が、単独のタグ`<br> <img>`など１対で囲まない場合に `<br /> <img />`と書くように決められているとのことでした。

これからhtml5で書くときには、 `<br> <br />`はどちらでもよく、
スラッシュはないほうを推奨されているようなので、html5では無しでOK、古いサイトを修正するとき、それがXHTMLだったときにはつける、というのが正しい書き方になるようです。
pentaho schema workbenchのインストールとredshiftとの接続設定

# install

https://sourceforge.net/projects/mondrian/?source=typ_redirect

```
cd schema-workbench
./workbench.sh

```

- driversに redshift用jdbc driverを配置
 - http://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/configure-jdbc-connection.htmlから取得して配置
- options -> 初期設定で redshiftを選んで設定
- testで接続確認
aタグ以外にもキーボードフォーカスをあてる方法

マウス操作ではなく Tab key でフォーカスを当てていき、Enterでリンクをクリックしたりできますが、div や span 要素にはフォーカスが通常あたらないところをあてるようにする方法のmemo

## `tabindex=""`を付与することで、Tab keyで引っかかるようになる

```html
<span tabIndex="0">spanにフォーカス</span>
<div tabIndex="0">divにフォーカス</div>
```

## 値には数値が入力可能
- 負の値を指定  
タブフォーカスから除外する
- 正の値を指定  
整数値で振られた順番にフォーカスがあたっていく
- `0`を指定  
`0`は整数値で指定された後に続いてフォーカスがあたるようになる(後回しになる)
  - `0`どうしは出現順にフォーカスがあたる模様
  - 全体的な指定が無い時は`tabindex="0"`としておくのが無難みたい

## `click`イベントをつけているときは'keypress'でも同様に動くようしておいた方がよさそう
`span`や`div`にフォーカスが当たるようになったのは良いけど、javascriptなどでclick functionで動かすようにしているものだと、フォーカスがあたっても動かないことがあるのでkeypressも入れておくと無難

```js
$(element).on('click', function(e) {
  // クリックしたら処理
});
```

　↓ jQueryの`.on()`はイベント名をスペース区切りで複数指定できるので`keypress` を加えておく

```js
$(element).on('click keypress', function(e) {
  // クリックしたら処理
});
```
bing画像検索を用いて典型的な画像を自動的に収集するPythonスクリプト


# 目的
今回のスクリプトでは，あるクエリに対する典型的な画像を自動的に収集する．
例えば，近年画像の分野で(元々は音声の分野だったが...)DeepLearningが流行っており，様々な学会で見かけたり，Shared Taskとして確立していたりする．
しかしながら，その学習データは膨大な数が必要で，収集からアノテーションまでにかける時間はかなりのコストが必要になる．

そこでDeepLearningをはじめとした機械学習に必要なタグ付き画像データを収集する！というような目的を想定して今回のスクリプトを作成した．

# 典型的な画像の収集
今回はbingの画像検索を利用して，画像収集の自動化を試みる．
下記のコードではクローリングやスクレイピングっぽいことを行っているが，今回は勉強のため便利なモジュール(BeautifulSoup，urllibなど)は使わずに実装した．

典型的な画像収集と銘打っているが，実際には検索上位N件を取ってくるだけの処理である．

```py:collect_img.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import os
import re
import commands as cmd


# クエリ検索したHTMLの取得
def get_HTML(query):

    html = cmd.getstatusoutput("wget -O - https://www.bing.com/images/search?q=" + query)

    return html

# jpg画像のURLを抽出
def extract_URL(html):

    url = []
    sentences = html[1].split('\n')
    ptn = re.compile('<a href="(.+\.jpg)" class="thumb"')

    for sent in sentences:
        if sent.find('<div class="item">') >= 0:
            element = sent.split('<div class="item">')

            for j in range(len(element)):
                mtch = re.match(ptn,element[j])
                if  mtch >= 0:
                    url.append(mtch.group(1))

    return url

# ローカルに画像を保存
def get_IMG(dir,url):

    for u in url:
        try:
            os.system("wget -P " + dir + " " + u)
        except:
            continue


if __name__ == "__main__":

    argvs = sys.argv # argvs[1]: 画像検索のクエリ, argvs[2]: 保存先のディレクトリ(保存したい時のみ)
    query = argvs[1] # some images  e.g. leopard

    html = get_HTML(query)

    url = extract_URL(html)

    for u in url:
        print u

    # 画像をローカルに保存したいときに有効にする
    #get_IMG(argvs[2],url)
```

# 実行
## 実行方法
コマンドラインから下記のようにして実行する．
ただし，引数dirはget_IMGを用いない(画像を保存しない)場合は指定しない．

```py:collect_img.py
$ python collect_img.py query dir
```

- query: 欲しい画像の検索ワード (e.g. leopard)
- dir: 画像保存先ディレクトリ (./img/*)

## 実行結果
今回は，クエリ"leopard"で収集した結果の一部について紹介する．
まず，取得できた画像のURLリストは以下のもの．（ただし一部のみ）

>http://images.china.cn/attachement/jpg/site1007/20120720/00016c8b5de01172f9e82e.jpg
http://farm2.static.flickr.com/1254/1174179702_fe9c9a5d2c_b.jpg
http://www.katzen-und-kater.de/Grosskatzen/Leopard/Leopard5.jpg
...

取得できた画像の一部がこちら．
![leopard](http://images.china.cn/attachement/jpg/site1007/20120720/00016c8b5de01172f9e82e.jpg)
![leopard](http://farm2.static.flickr.com/1254/1174179702_fe9c9a5d2c_b.jpg
)
![leopard](http://www.katzen-und-kater.de/Grosskatzen/Leopard/Leopard5.jpg
)

以上より，きちんと取得できていることがわかった．
といっても，画像の類似度計算を行ってノイズを削除したりしているわけではないし，単純に上位N件を取ってきているだけでしかない．（大量に延々と収集することも未実装なのでこれも課題）

# まとめ
今回は機械学習のアノテーション済み画像データの自動収集という目的(という建前)でbing画像検索から典型的な画像を収集するスクリプトを記述した．
アノテーションについては，クエリがそのまま使えるかと思う．
また，今後の課題は以下の2つが考えられる．

- 任意の数(または限りなく多く)の画像を収集すること
- 画像間の類似度などの基準をもってノイズとなる画像を削除すること

今回のスクリプトは画像検索の上位にくるものは典型的な画像であることが多いという，画像検索エンジンの特徴に依存しているため，特に上記2つ目の課題について真面目に考えたほうがいいと思う．
それについては，また今度実装しよう．
Expressのmorganと他のロガーを連携する

# はじめに

Node.jsのWebフレームワークExpressは`express-generator`を使うとアプリケーションの雛形を作成してくれます。
この雛形はHTTPリクエストロガーのmorganが含まれていますが、メッセージフォーマットくらいしかカスタマイズできません。
そこで他のロガーと連携してみました。ここではwinstonを使ってみます。

# 連携方法

GitHubのページでは以下のように`stream`プロパティでファイルに出力しています。

[expressjs/morgan # write logs to a file](https://github.com/expressjs/morgan#write-logs-to-a-file)

```js
// create a write stream (in append mode)
var accessLogStream = fs.createWriteStream(__dirname + '/access.log', {flags: 'a'})

// setup the logger
app.use(morgan('combined', {stream: accessLogStream}))
```

この`stream`プロパティがどのように使われているのか追跡すると以下のように`write`関数を呼び出しています。

[morgan / index.js#L130](https://github.com/expressjs/morgan/blob/871726c3f0941fe80494ba510decd735f1659206/index.js#L130)

```js
stream.write(line + '\n')
```

つまり、次のような形で他のロガーと連携できるはずです。

```js
app.use(require('morgan')({
    stream: {
        write: function(message) {
            // ここでmessageをログ出力すればよい！
        }
    }})
);
```

# winstonと連携する

winstonのカスタムロガーと連携する場合は以下のようなコードになります。

```js
// winstonでカスタムロガー作成
var winston = require('winston');
winston.emitErrs = true;

var logger = new winston.Logger({
    level: 'info',
    transports: [
        new (winston.transports.Console)({
            level: 'silly',
            handleExceptions: true,
            json: false,
            colorize: true
        }),
        new (winston.transports.File)({
            handleExceptions: true,
            json: false,
            colorize: false,
            filename: './logs/all-logs.log'
        })
    ]
});

// 連携用のwrite関数
logger.stream = {
    write: function (message) {
        logger.info(message);
    }
};

// morganと連携
app.use(require('morgan')({stream: logger.stream}));

// アプリログはlogger.info()などで出力する
```

# 参考

[stackoverflow # Node.js - logging / Use morgan and winston](http://stackoverflow.com/questions/27906551/node-js-logging-use-morgan-and-winston)
arduinoでps/2 mouse

#概要
arduino leonardoにps/2 マウスつないで、usbマウスをエミュレートしてみた。
#写真
![MVC-004S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/4d6020c1-0ef3-c32f-669a-591424028445.jpeg)

#回路図
![mouse.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/d2b775b0-96e9-2a8b-2292-8a590595c343.jpeg)

#サンプルコード
```
#include "ps2.h"

PS2 mos(6, 5);
void mos_init()
{
	mos.write(0xff);
	mos.read();
	mos.read();
	mos.read();
	mos.write(0xf0);
	mos.read();
	delayMicroseconds(100);
}
void setup()
{
	Serial.begin(115200);
	while (!Serial);
	Serial.println("Start");
	mos_init();
	Mouse.begin();
	Serial.println("OK");
}
void loop()
{
	char mstat;
	char mx;
	char my;
	mos.write(0xeb);
	mos.read();
	mstat = mos.read();
	mx = mos.read();
	my = mos.read();
	Serial.print(mstat, BIN);
	Serial.print("\tX=");
	Serial.print(mx, DEC);
	Serial.print("\tY=");
	Serial.print(my, DEC);
	Serial.println();
	//Mouse.press();
	Mouse.move(mx, my, 0);
	//Mouse.release();
	delay(100);
}

```
MacにHomebrewでPHP, Apache, MySQLを導入し、EC-CUBE2をインストール、ドメインを指定してアクセスする　参考にしたサイト一覧

お題

```
macのローカル環境に、homebrewを使って
apache
php
mysql
それぞれに接続するために必要な依存ライブラリを入れて
ec-cube.local
というドメインで、ローカルにアクセスして正常にページが表示されるようにしておいて欲しい
PHPは5.5系
mysqlは5.6系
```

MacにHomebrewでPHP, Apache, MySQLを導入する
http://vdeep.net/homebrew-php-apache-mysql

OS X YosemiteにHomebrew + DropboxでPHP環境構築　〜Apache, PHP, MySQL, ComposerをインストールしてFuelPHPの設定まで
http://qiita.com/saltyshiomix/items/aacb5f9635c0d3201174

Macのツールを楽にインストールできるパッケージ管理システムHomebrewの使い方
http://millkeyweb.com/installing-homebrew/

homebrewとは何者か。仕組みについて調べてみた
http://qiita.com/omega999/items/6f65217b81ad3fffe7e6

MacのApacheでヴァーチャルホストを使ってテスト環境の構築
http://howtohp.com/2011/08/21/mac-apache-virtual-host/

macでMAMPを使わずローカルサーバ構築してみる
http://qiita.com/SotaSuzuki/items/cafb8514304fdc249e53

必ず使える！Macのターミナルで使う基本UNIXコマンド15選
http://blog.nzakr.com/terminal-command/

Mac Finderのタイトルバーにフォルダのフルパスを表示する裏技
http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-display-the-full-path-of-folder-in-macos-finder-titlebar.html

ターミナルで便利な「open」コマンド
https://book.mynavi.jp/macfan/detail_summary/id=27268

Mac へ MySQL を Homebrew でインストールする手順
http://qiita.com/hkusu/items/cda3e8461e7a46ecf25d

Mysqlのパスワードの初期化方法
http://appstars.jp/archive/49

MySQL 5.7 をインストールしたら最初に行うセットアップ
http://weblabo.oscasierra.net/mysql-57-init-setup/

MySQL5.7.9を試した
http://qiita.com/ryouma_nagare/items/5e644ad2430e18a87bc2

Macローカル環境にEC-CUBEをインストールする
http://vdeep.net/ec-cube-local

EC-CUBEをmac内にインストールする方法
http://qiita.com/lighty/items/2a5431957cdf8543daac

EC-CUBE 2系のインストールでmysqlのエラーが出た
http://qiita.com/cs_sonar/items/d90b8e291c5ea5e2cc4b

---

MySQLの、「ポリシーに沿ったパスワード」が地味にわからなかった。。。

```
ポリシーの初期値はMEDIUMとなっており、

* 大文字／小文字／数字／記号の全てが入っている
* 長さが８文字以上

を満たす必要があります。
```
arduinoでps/2 keyboard

#概要
arduino leonardoにps/2 キーボードをつないで、usbキーボードをエミュレートしてみた。
#写真
![MVC-003S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/b13d23fe-e3cc-64e1-8410-9d3ec41256ca.jpeg)

#回路図
![key.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/2b2bc7d3-2fa3-bee3-52c7-5b112a15c3a0.jpeg)

#サンプルコード
```
#include "ps2.h"

#define PS2_TAB				9
#define PS2_ENTER			13
#define PS2_BACKSPACE		127
#define PS2_ESC				27
#define PS2_INSERT			0
#define PS2_DELETE			127
#define PS2_HOME			0
#define PS2_END				0
#define PS2_SCROLL			0
PS2 kbd(6, 5);
char key[140] = {
	0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, PS2_TAB, '`', 0,
	0, 0, 0, 0, 0, 'q', '1', 0,
	0, 0, 'z', 's', 'a', 'w', '2', 0,
	0, 'c', 'x', 'd', 'e', '4', '3', 0,
	0, ' ', 'v', 'f', 't', 'r', '5', 0,
	0, 'n', 'b', 'h', 'g', 'y', '6', 0,
	0, 0, 'm', 'j', 'u', '7', '8', 0,
	0, ',', 'k', 'i', 'o', '0', '9', 0,
	0, '.', '/', 'l', ';', 'p', '-', 0,
	0, 0, '\'', 0, '[', '=', 0, 0,
	0, 0, PS2_ENTER, ']', 0, '\\', 0, 0,
	0, 0, 0, 0, 0, 0, PS2_BACKSPACE, 0,
	0, '1', 0, '4', '7', 0, 0, 0,
	'0', '.', '2', '5', '6', '8', PS2_ESC, 0,
	0, '+', '3', '-', '*', '9', PS2_SCROLL, 0,
	0, 0, 0, 0
};
void kbd_init()
{
	char ack;
	kbd.write(0xff);
	ack = kbd.read();
	ack = kbd.read();
}
void setup()
{
	Serial.begin(115200);
	while (!Serial);
	Serial.println("Start");
	kbd_init();
	Keyboard.begin();
	Serial.println("OK");
}
void loop()
{
	unsigned char code;
	for ( ; ; )
	{
		code = kbd.read();
		code = key[code];
		Serial.println(code, HEX);
		Keyboard.print((char) code);
		code = kbd.read();
		code = kbd.read();
	}
}

```
ダブルクリックすると飛んでるWi-Fiの認証/暗号方式を一覧表示してくれるだけのコマンドファイルを作成する

```wifi-check.command
#!/bin/bash
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s
```

Macだと拡張子が`.command`であるファイルはダブルクリックで中身のshellを実行できます。

![スクリーンショット 2016-04-11 11.15.14.png](https://qiita-image-store.s3.amazonaws.com/0/4194/ae96d894-f3d2-19d0-8ad2-2b1f4ec40438.png)

これをダブルクリックすると

```bash
SSID BSSID             RSSI CHANNEL HT CC SECURITY (auth/unicast/group)
<YOUR SSID NAME> 10:6f:3f:8f:7e:e0 -48  11,-1   Y  -- WPA(PSK/AES,TKIP/TKIP) WPA2(PSK/AES,TKIP/TKIP) 
```

のように表示されます。
Zookeeperでleader、followerのノードを確認する

# はじめに
ZooKeeperアンサンブルとは、奇数台数によるZookeeperサーバのまとまりのことである。

ZooKeeperアンサンブルでは、リーダー選出という機構が備わっており、全ての書き込み処理系は奇数台のアンサンブルの中から選出されるリーダーとなるサーバを通して処理される。そのリーダーが選出されるタイミングは以下の2つである。

* 障害等によりリーダーに選出されているサーバが停止し、リーダーであることを放棄した時
* Zookeeperサーバの起動時

# leader、followerのノードを確認する
3台のZookeeperサーバを用いてアンサンブルを組んでいると想定する。以下の例では、Ubuntu 14.04を利用し、Zookeeperはaptリポジトリを用いている。3台のうち、zookeeper1のサーバがleaderに選出されていると想定する。以下のコマンドを実行することで各サーバがleaderなのかfollowerなのか確認できる。

```shell-session:zookeeper1
# /usr/share/zookeeper/bin/zkServer.sh status
JMX enabled by default
Using config: /etc/zookeeper/conf/zoo.cfg
Mode: leader
```

```shell-session:zookeeper2
# /usr/share/zookeeper/bin/zkServer.sh status
JMX enabled by default
Using config: /etc/zookeeper/conf/zoo.cfg
Mode: follower
```

```shell-session:zookeeper3
# /usr/share/zookeeper/bin/zkServer.sh status
JMX enabled by default
Using config: /etc/zookeeper/conf/zoo.cfg
Mode: follower
```

この状態でzookeeper1のプロセスを再起動する。

```shell-session:zookeeper1
# service zookeeper restart
```

再起動後、モードがleaderではなくfollowerに切り替わっている。

```shell-session:zookeeper1
# /usr/share/zookeeper/bin/zkServer.sh status
JMX enabled by default
Using config: /etc/zookeeper/conf/zoo.cfg
Mode: follower
```

その状態で、zookeeper2の状態を確認するとleaderに切り替わっていることが分かる。

```shell-session:zookeeper2
# /usr/share/zookeeper/bin/zkServer.sh status
JMX enabled by default
Using config: /etc/zookeeper/conf/zoo.cfg
Mode: leader
```
【備えあれば憂いなし】参加者視点で見る、IT勉強会に持って行くと便利なアイテム

こんにちはー！ニアです。
皆さんはIT勉強会に参加していますか？

今回は、IT勉強会に参加する時に持って行くと便利なアイテムを、私の場合での実例も交えて紹介していきます。

#1. PCやタブレット
ハンズオンのあるセミナーではほぼ必須ですが、それ以外でもメモを取ったり、セッションなどで紹介されたことを**自分のPCで実際に試してみたりする**時にも活用できます。

OSは普段使っているもので大丈夫です。ちなみに私が今まで参加した勉強会では、Windows or Macが多かったです。

##1.1. 【参考】私の場合
私はWindows 10のノートPCとWindows RT 8.1のタブレットの2つを持って行ってます。 普段はノートPCを使用しています。

#2. モバイルルーター or テザリング可能なスマートフォン
会場にゲスト用の無線LANが用意されていることが多いですが、なかった場合に備えて**モバイルルーター**または**テザリング可能なスマートフォン**を持って行くとよいでしょう。

電波状況にもよりますが、WiMAX / WiMAX2内蔵のPCを持って行くのも手です。

##2.1. 【参考】私の場合
私はテザリング可能なスマートフォンを持って行ってます。会場で無線LANが用意されているが、自分のノートPCでは接続できない時に、スマートフォンのテザリング機能でインターネットに接続することがあります。

#3. モバイルバッテリー
2.で挙げたモバイルルーターやスマートフォンを充電する時に使用します。容量は5000mAh以上あるとベターです。勉強会前日までにバッテリーは充電しておきましょう。

オススメは**AC充電機能付き**のモバイルバッテリーです。いざという時にUSB-AC充電器として活用したり、会場の電源からモバイルバッテリーを充電したりすることができます。

* [ハイブリッドモデルモバイルバッテリー搭載AC充電器 QE-AL301（Panasonic製）](http://panasonic.jp/battery/pocket/qe-al301/)
* [AC充電器一体型モバイルバッテリー DE-MB1L-3220BK（ELECOM製）](http://www2.elecom.co.jp/products/DE-MB1L-3220BK.html)

##3.1. 【参考】私の場合
私はQE-AL301を持って行ってます。バッテリー容量は7500mAh、USBポートは2つ、最大出力は1.8Aです。

![モバイルバッテリー](https://qiita-image-store.s3.amazonaws.com/0/78881/fdfccb5e-334a-4f70-e7da-f147fb92514f.jpeg)

#4. テーブルタップ
会場にあるコンセントの数は限られているので、持ち物に余裕があればテーブルタップを持って行くとよいでしょう。コードの長さ1～2mあれば十分です。コンセント数は4個以上あるとベターです。空いたコンセントは他の参加者とシェアするのもよいでしょう。

テーブルタップの代わりに、トリプルタップなどを持って行くのも手です。

##4.1. 【参考】私の場合
私は[ジョイントタップ（オーム電機製）](http://www.ohm-electric.co.jp/product/c23/c2306/)を持って行ってます。コードとタップを分離できるので、持ち運びしやすいです。

![テーブルタップ](https://qiita-image-store.s3.amazonaws.com/0/78881/1c4183ec-d180-cd53-5033-040af945a365.jpeg)


#5. 筆記用具
勉強会の後にアンケートを記入することがあります。ボールペンを1本以上持って行くとよいでしょう。

#6. 名刺
勉強会で他の参加者と知り合いになった時、名前やSNSアカウントなどを記載した名刺があれば、それを使って連絡先を伝えたり、繋がりを強化したりすることができます。

また勉強会によっては、名刺があれば受付をスムーズに行うことができます。

##6.1. 【参考】私の場合
私は個人用の名刺を持って行ってます。名刺には主に以下の8項目を載せています。

* 名前（ハンドルネーム、本名）
* アイコン
* Twitterのアカウント
* メールアドレス（個人用）
* ブログのURL
* GitHubのアカウント
* Qiitaのアカウント
* NuGet Galleryのアカウント


#7. おわりに
今回は、参加者視点で見た、IT勉強会に参加する時に持って行くと便利なアイテムを、私の場合での実例も交えて紹介しました。

今回紹介したアイテムの他にも、「これを持って行くと便利だよ～」という方は、コメントなどをしていただければと思います。

それでは、See you next!
OnsenUI 2 Beta + AngularJS 1.5 でAndroidのオプションメニューを作る

こんな感じのAndroidのオプションボタンを押したらポップップメニューが表示されるようなものを実装した時にハマったのでメモ。

<img src="https://qiita-image-store.s3.amazonaws.com/0/106886/8b81f75f-7e1b-7749-b0d0-8020a4b0def8.png" width=200px> → <img src="https://qiita-image-store.s3.amazonaws.com/0/106886/6a0a597e-dd54-c479-1e56-5c5d0a89202c.png" width=200px>

# 記事の対象者
- ons-popoverを使っている人

# 問題
ons-popoverは新しいスコープを作るらしく、メニュー項目にng-clickを仕込んでも動かない。

StackOverflowで探してみたが、[これ](http://ja.stackoverflow.com/questions/16417/onsenui%E3%81%AEpopover%E5%86%85%E3%81%A7ng-click%E3%81%8C%E5%8A%B9%E3%81%8B%E3%81%AA%E3%81%84)はなんかごちゃごちゃしてるし、[これ](http://stackoverflow.com/questions/12202067/angularjs-ng-click-broken-inside-a-popover)は動かない。
できれば$scopeを使うのは避けたい。

# 解決策（Beta.9まで）
document.getElementById()でDOMオブジェクトを抜き出してonclick属性を付与する。

```html
<ons-page>
    <!-- ドロップダウンメニュー -->
    <ons-toolbar>
        <div class="left">
            <ons-back-button></ons-back-button>
        </div>
        <div class="center">スケジュール詳細</div>
        <div class="right">
            <ons-if platform="android">
                <ons-toolbar-button id="menu" ng-click="$ctrl.showMenu()"><ons-icon icon="md-more-vert"></ons-icon></ons-toolbar-button>
            </ons-if>
        </div>
    </ons-toolbar>
    
    <!-- ドロップダウンメニュー -->
    <ons-template id="popover.html">
        <ons-popover cancelable cover-target ons-posthide="popover.destroy()" >
            <ons-list>
                <ons-list-item id="menu_edit" tappable>スケジュールを編集</ons-list-item>
                <ons-list-item id="menu_delete" tappable>スケジュールを削除</ons-list-item>
            </ons-list>
        </ons-popover>
    </ons-template>
</ons-page>
```

メニュー表示のタイミングでons.createPopoverを呼んでいるため。`ons-posthide="popover.destroy()`として毎回オブジェクトを破棄させている。

```js
// ポップアップメニューの表示
this.showMenu = function() {
    ons.createPopover('popover.html').then(function(popover) {
        popover.show('#menu');
        document.getElementById('menu_edit').onclick = function() {
            gotoEdit();
            popover.hide();
        }
        document.getElementById('menu_delete').onclick = function() {
            confirmDelete();
            popover.hide();
        }
    });
}
```

出来たはいいが全くAngular的ではない。
残念なことに、popover.destroy()は現行バージョンでは利用できない。
他に良い案がないか検討中。

# 結論
ons-popoverではng-clickは使えない。
document.getElementById().onclick にコールバックを設定しよう。
BluemixでIoT　温湿度、気圧を収集・蓄積・可視化＋LED制御 その５

##０．はじめに
[前回](http://qiita.com/hino9966/items/0086cff6be2c82335def)の続きです。今回はBluemix側のセットアップの続きを行います。

##１．必要なもの（今回準備したもの）
|項目|数量|メモ|
|---|:---:|---|

##２．参考にさせていただいたところ

##３．IBM Internet of Things Foundationの設定
　今回繋げるデバイス情報を登録します。
**①ダッシュボード画面から　Internet of Things Platform　を選択する。**
![image](https://qiita-image-store.s3.amazonaws.com/0/113879/b480bab5-97fe-5d0b-fb12-ff37805d2252.png)

**②Internet of Things Platformのページから ``ダッシュボードを起動`` をクリックする。**
![image](https://qiita-image-store.s3.amazonaws.com/0/113879/eec7a6ec-189c-a4c2-35c6-643e7d03d8b0.png)

**③デバイスの登録 ``Add Device``　をクリックする。**
![image](https://qiita-image-store.s3.amazonaws.com/0/113879/90de1775-9535-c6af-e803-bdf4a139de4d.png)

**④ ``デバイス・タイプの作成``　をクリックする。**
![image](https://qiita-image-store.s3.amazonaws.com/0/113879/fafc0743-2fa8-66a7-0871-10e53a778d99.png)

**⑤ ``デバイス・タイプの作成``　をクリックする。**
![image](https://qiita-image-store.s3.amazonaws.com/0/113879/eb25b98e-ad22-76fc-f21c-b79cc9cbff56.png)

**⑥ 名前を入力し、右下の　``次へ``　をクリックする。**
![image](https://qiita-image-store.s3.amazonaws.com/0/113879/5189eb27-1533-6e65-b888-c740e095f4c5.png)

**⑦ そのまま、右下の　``次へ``　をクリックする。**
![image](https://qiita-image-store.s3.amazonaws.com/0/113879/1c9b6236-b4d4-f7fe-9632-d438fbb75885.png)

**⑧ そのまま、右下の　``次へ``　をクリックする。**
![image](https://qiita-image-store.s3.amazonaws.com/0/113879/36f14e5a-6d29-b1cc-a3f4-9d0dd58f29a8.png)

**⑨ そのまま、右下の　``次へ``　をクリックする。**
![image](https://qiita-image-store.s3.amazonaws.com/0/113879/ad32177a-e1a0-e98c-8ac4-74313fc0e965.png)

**⑩ そのまま、右下の　``次へ``　をクリックする。**
![image](https://qiita-image-store.s3.amazonaws.com/0/113879/150f15bf-d51b-c066-a1a7-8aaa5cafd29b.png)

**⑪ Device IDを入力し、右下の　``次へ``　をクリックする。**
![image](https://qiita-image-store.s3.amazonaws.com/0/113879/0000bf97-7b20-8281-5ef7-9784b0c49011.png)

**⑫ そのまま、右下の　``次へ``　をクリックする。**
![image](https://qiita-image-store.s3.amazonaws.com/0/113879/e5490af0-f3e5-2c2a-33c4-47680f2eeaf7.png)

**⑬ そのまま、右下の　``次へ``　をクリックする。**
![image](https://qiita-image-store.s3.amazonaws.com/0/113879/2705f8cb-461f-a3e7-68ba-9ed07aaf2777.png)

**⑭ そのまま、右下の　``次へ``　をクリックする。**
![image](https://qiita-image-store.s3.amazonaws.com/0/113879/5e05bcb3-d787-9c72-c42c-488540ec857d.png)

**⑮ デバイスの資格情報が出力されるので、下図の赤枠部分の内容を控えておく。**
　*※この画面を閉じてしまうと、再度表示することができないので注意してください。忘れてしまった場合は、一旦デバイスを削除し、再度登録し直してください。*
![image](https://qiita-image-store.s3.amazonaws.com/0/113879/5a70f836-cb9b-f692-9dae-939117b9daa7.png)


以上で、IBM Internet of Things Foundationの設定は完了となります。

次回([その６](http://qiita.com/hino9966/items/a1f3bc7249935ceaccf2))は、MQTTの接続確認を行います。
Laravel4アプリをherokuへデプロイ(SQLite, Cloud9)

いろいろつまずいたので覚書です。
環境
IDE: Cloud9
言語: PHP 5.5.9
フレームワーク: Laravel 4.2
DB: SQLite
 

#準備
.gitファイルはcomposer.jsonと同じディレクトリ内

.gitignore編集 Procfile作成
[Laravel4 on Heroku](http://qiita.com/kaw9/items/a54f042b1335b7b1051a)

composer.jsonの編集
[HerokuとCloud9を利用してiPad開発](http://qiita.com/usk/items/3b82df311e4f9694459b)

無事デプロイ成功、しかしPHPのGDライブラリが見つからないとエラー、さらにドライバーも見つからないと。

#composer.jsonの設定
このエラーはコード内で実際にGDライブラリSQLiteをつかってたのでherokuに教えてあげる必要があります。

herokuへGDライブラリ、SQLiteドライバーをcomposer.json内のrequireに必要な項目を追加

[Heroku で SQLite を使う](http://takkyuuplayer.hatenablog.com/entry/2015/01/31/142136)
[Heroku - how to enable gd on heroku php application?](http://stackoverflow.com/questions/27380365/heroku-how-to-enable-gd-on-heroku-php-application)


```lang:composer.json
...
"require": {
		...
		"php": "5.5.*",
		"ext-gd": "*",
		"ext-pdo_sqlite": "*"
	},
...
```

そして
composer.lockを更新するため
`composer update`

してpushしてあげると無事デプロイできました。

参考にさせていただいたサイトの方々ありがとうございました。
僕がAWSでLINE botを作るなら

#検討すべき事項
下記の記事がとても参考になります。
[大量メッセージが来ても安心なLINE BOTサーバのアーキテクチャ](http://qiita.com/yoichiro@github/items/6d4c7309210af20a5c8f)

これを踏まえて、AWSでどのようにサービスを構築するか考えてみました。

#LINEからの通知をキューに突っ込む
LINE -> API Gateway -> AWS Lambda -> SNS -> SQS
すべてがマネージドサービスなので、安定かつ、スケーラブルにLINEからの通知を受け付けられるはずです。

下記の記事が参考になります。
[AWS Lambda + API GatewayでLINE BOT APIを叩いてみた](http://qiita.com/teyosh/items/567ee416c94c2af2fe91#comment-febc2d602fa2a094fac0)

#キューを処理する
SQS -> Elastic Beanstalk Worker + NAT Gateway
LINE側でアクセス元IPのホワイトリスト登録が必要なので、NAT Gatewayを噛ませます。（要試作）

NAT Gatewayは月5000円近くかかるので、試作であれば普通に自分のパソコンや、EC2のインスタンスのIPをホワイトリストに登録すれば問題ないと思います。
また、この部分はオンプレミスで動かすという選択肢もあります。


#キューを処理する(ボツ案)
SNSからもう一度lambdaに入れる方法もあります。
SNS -> Lambda + NAT Gateway
ただ、キューがないとサーバ側の保守が難しくなるので、試作以外では使わないほうが良さそうです。
Minimal CSOM callable page

詳しく調べてないけど、SPRibbonがないと、SP.ClientContext が動かない。

```aspx-cs
<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<%@ Page Language="C#" inherits="Microsoft.SharePoint.WebPartPages.WebPartPage, Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<html>
	<head runat="server">
		<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
		<meta http-equiv="X-UA-Compatible" content="IE=10"/>
		<meta http-equiv="Expires" content="0" />
		<SharePoint:ScriptLink language="javascript" name="core.js" OnDemand="true" runat="server" Localizable="false" />
	</head>
<body>
	<SharePoint:SharePointForm runat="server" onsubmit="return false;">
		<div style="display:none">
			<SharePoint:SPRibbon runat="server"></SharePoint:SPRibbon>
		</div>
		<SharePoint:FormDigest runat="server"/>
	</SharePoint:SharePointForm>
</body>
</html>
```
DBaaSサービス「Compose」に負荷をかけても、へっちゃらだった

PostgreSQLなんてPCにもすぐインストールできるわけだから、お金払ってわざわざDBaaS使うのはやっぱり重い処理を流したいときかなとおもって、負荷試験してみました。

## 結論：PCより断然性能良し！
PCだと最大で36.7倍の性能劣化が出ましたが、Compose上のPostgreSQLなら最大でも3.6倍の性能劣化。
PCのリソース状況を見たら、やはりすぐにCPUが100%に張り付いてしまいます・・・。
Composeは「自動でメモリ等のリソースをスケールしてくれる」とどっかに書いてあったので、それが良い感じで効いているっぽい・・！

![fuka.png](https://qiita-image-store.s3.amazonaws.com/0/119378/57a29c69-e25e-110b-6fc2-cb3e19e15958.png)


性能も良い感じだし、しかも前に記事を書いたように↓、HA構成を数分で組んでくれるCompose・・・なかなかやるな。
http://qiita.com/azzeten/items/a7a786701cf25ef1a087
Azure Automationで平日だけ実行する

AzureのAutomationで平日日中だけVMを稼働させたい、などというとき
管理ポータルから設定できるスケジュールでは
曜日別に7日おきに実行するようにスケジュールを設定する必要がありました。

さすがに大変なので、ジョブ自体は毎日実行にして
Runbookの内容を下記のように記述して、この処理の中で土日はスルーするようにしてみました。


```ps1:weekday.ps1
#土日非実施
$UTCTime = (Get-Date).ToUniversalTime()
$TZ = [System.TimeZoneInfo]::FindSystemTimeZoneById("Tokyo Standard Time")
$LocalTime = [System.TimeZoneInfo]::ConvertTimeFromUtc($UTCTime, $TZ)
$day = $LocalTime.DayOfWeek
if ($day -eq 'Saturday' -or $day -eq 'Sunday')
{
return
}
else
{
#ここに平日実行したい処理書く
}
```

曜日の記述を変えれば、特定の曜日だけ処理をしない
といった使い方ができます。

ちなみに日本時間ならTokyo Standard TimeのままでOKですが
他のタイムゾーンを指定する場合は下記のコマンドをpowershellで実行すると
設定できるタイムゾーンIDの一覧を見ることができます。

\[System.TimeZoneInfo]::GetSystemTimeZones()
デザインをサポートするツールを作り始めた(Kotlinで)

## https://github.com/mayahiro/DesignSupportTool

とりあえず、8dpのグリッドを描くやつ。

機能は徐々に追加していきたい。

今のところ、Kotlinらしさがあまり感じられませんが、今後きっと出てくるでしょう。。。

## どうでもいいはまり方をした

``` xml
<service
            android:name=".services.OverlayShowService"
            android:enabled="true" />
```

と書くべきところを

``` xml
<service
            android:name="services.OverlayShowService"
            android:enabled="true" />
```

と書いてしまって、「動かない。動かない。Kotlin難しい。」と小一時間悩んだのはいい思い出。。。
laravelで「コンストラクタインジェクションでインスタンス生成する」と決めて失敗した

タイトルの通りなんですが、laravelのプロジェクトで

```
コンストラクタインジェクションでライブラリやらモデルやらのインスタンス生成しよう！
```

と決めてしまって結構失敗したところがあったのでメモっておきます。

## 何が？

規模が大きくなってくると、コントローラーのメソッド数が増えて、使うビジネスロジックやモデルが増えて、ビジネスロジックが別のロジッククラスを呼んで、とかなっていって、結果、コントローラーのコンストラクタがレスポンス劣化の最大要因になってしまいました。
特にlaravelは性能自体いい方ではないので、結構顕著にダメージ与えてきます。

---

ということで、可読性的にはコンストラクタインジェクションは当然いいですが、1メソッドでしか使わないようなクラスまでコンストラクタで生成していると、結構性能劣化が激しくなる可能性があるので、サービスの規模を考えてケースバイケースしましょう、という話でした。
テスト自動化の為に最初から仕込んでおけるコト

# 自動テストしてますか？

自動テストをやろう、と思った時に何の準備もせずに始めると、後から大きな手戻り（というか「もう、自動テスト止めようぜ」という空気）になりがちです。

ここで言う「自動テスト」は、Selenium的なものを使った、統合したシステムテストの自動テストを対象にしています。

# いつでも同じ結果を返すように
原則はこれです。これが崩れると意味が無い。これが守れないようになってくると「これ意味あんのか？」となってしまい、自動テストへの熱意も薄れていきます。

# 立ちはだかるシステム日付(日時)
テスト前に前提条件のTableデータを登録する仕組みがあっても、そのシステムが「システム日付」を使っている場合、途端にスクリプトの難易度が上がる気がします。

## 単体テストなら
- 引数で日付を貰って処理を行う
- SQLで直接システム日付を参照せず、バインド変数化
- システム日付取得処理自体をMock化(好きじゃない)

することで回避することができます。作りの問題で容易に回避できます。


## ただ、Selenium的なものだと...
>TOP画面にはログインユーザが担当になっている「システム日付〜2日」分の未完了タスクをDBより検索し、表示する

ような機能をテストする場合、シナリオを取った時と実行する時のシステム日付が違えば結果も当然異なります。

あれ？昨日はうまくいったのに、今日はダメだな...となります。シナリオ取ってくれた人のモチベーションも急下降です。

## DBのデータをシナリオを流す日付に合わせて都度変える
うーん。面倒ですよねぇ。

## システム日付を固定化する

`# date -s "04/01 00:00 2016"`

マジですか。

## システム日付はUtilから取得
プログラムでシステム日付を直接取得するのではなく、共通処理からといいうのはどうでしょう？

✕

```scala:
val now = LocalDate.now()
val nowDateTime = LocalDateTime.now()
```


◯

```scala:
val now = CurrentDateUtil.now()
val nowDateTime = CurrentDateUtil.nowDateTime() 
```

共通処理CurrentDateUtilよりシステム日付を取得することをルール化します。


共通処理の中身はこんな感じ

```scala:
object CurrentDateUtil {  
  private val fixDate = System.getProperty("fixDate", "") match { 
    case date if !date.isEmpty => Option(DateTimeFormat.forPattern("yyyy-MM-dd").parseLocalDate(date))     
    case _ => None 
  }
  def now = { 
    if(fixDate.isEmpty) LocalDate.now() else fixDate.get   
  }
 }
```

JVMの引数に指定されていれば固定日付を返します。
ex.) -DfixDate=2016-04-01

前提条件のシステム日付を決めて

- 前提条件のデータ登録
- Seleniumシナリオ記録

し、

- Seleniumシナリオ再生時

にはJVMのパラメータを設定しておくことで、システム日付が固定の状態でテストを実行できます。これで、いつ動かしても結果は同じになります。

# まとめ
システムができてから自動化の取り組みをしたのでは遅いかもしれません。
ツールの使い方だけ習熟してもどうにもならないことありますし、せっかくの自動化への熱い思いを持続させるために、システム開発の初期段階から自動化しやすいように作れる箇所があるはずです。

いつか「テスト自動化やろう！」と思った時の参考になれば幸いです。
初心者が最尤推定について書いてみた。

※当記事は[ITエンジニアのための機械学習理論入門](http://www.amazon.co.jp/dp/4774176982)を参考に作成しています。
**間違いなどございましたらコメントよろしくお願い致します。**

尤度関数を用いて最尤推定を行ってみます。
が、まずは尤度関数を理解する必要があるかと思われます。

## 尤度関数
> 尤度関数（ゆうどかんすう）とは統計学において、ある前提条件に従って結果が出現する場合に、逆に観察結果からみて前提条件が「何々であった」と推測する尤もらしさ（もっともらしさ）を表す数値を、「何々」を変数とする関数として捉えたものである。また単に尤度ともいう。 - Wikipedia


下記の記事も参考になると思います。
http://qiita.com/kenmatsu4/items/b28d1b3b3d291d0cc698

今回は**トレーニングセットは、最も発生確率が高いデータである**と推測して尤度関数を考えていきます。
※もちろんトレーニングセットが最も発生確率が高いとは言えません。あくまでも前提として。
判定自体は結果を元に判定というおまかせ設定で。

# 本題
尤度関数について理解してもらったところで、先に結論から話すと今回の推定では
**尤度関数(尤度)が最大となるようにパラメータを設定することが目的です。**

## 進め方
パラメトリックモデルの3つのステップで進め、最終的に統計モデルを決定します。
1. モデル（数式）を設定
2. パラメータの評価基準を設定
3. 最良のパラメータを設定

ですが、ただ闇雲にモデルを設定することは難しいです。
なのである程度何らかの仮定を起きつつ進めます。


## 仮定
今回は下記の点について前提に進めていきます。

* データの誤差
    * 標準偏差δ

* パラメトリックモデル
    * 多項式である

```math
f(x)= w_0 + w_1 x + w_2 x^2 + ・・・ + w_M x^M \\
=\sum_{m=0}^M w_m x^m
```


## モデル（数式）を設定
仮定を元に下記の事が言えます。

```math
観測点x_nでの観測値t_nはf(x_n)±δに散らばる
```

これは、μを中心として、およそμ±δの範囲に乱数が散らばる。
よって、平均μ、分散の正規分布で表すことができます。(分散は標準偏差δの二乗)


```math
N(x｜μ, δ^2) = \frac{1}{\sqrt{2πδ^2}} e ^\frac{-1(x-μ)^2}{\sqrt{2δ^2}} 

```

今回は観測値はxではなく、tなので下記のものに置き換えると
下記のような数式となります。

```math
観測値: x=t
\\
中心: μ = f(x_n)
\\
N(t｜f(x_n), δ^2) = \frac{1}{\sqrt{2πδ^2}} e ^\frac{-1(t-f(x_n))^2}{\sqrt{2δ^2}} 
```

## パラメータの評価基準を設定

上の数式を利用することでとある観測点xで観測値tとなる確率を求めることが可能です。
ということは、トレーニングセットのデータが得られる確率Pを算出することが出来るということです。

```math
P = \prod_{n=1}^n N(t｜f(x_n), δ^2)
```

※全積である理由は全ての観測点で特定の観測値が得られる確率を求めるから。

求めた確率Pはパラメータにより値が変動します。
ということは、確率Pはパラメータの関数と考えることが可能であり確率Pは尤度関数と見ることができます。

※パラメータ: 係数wと標準偏差δ

## 最良のパラメータを設定
尤度関数が得られたところで、各パラメータが最大となるように計算します。(ごにょ)
実際に計算するときは、尤度関数自体を計算するのは大変だから対数をとって、パラメータが最大となるように計算します。

```math
 w = (Φ^TΦ)^{-1}Φ^T t
\\
Φ = \left(
    \begin{array}{ccc}
      x_1^0 & ・・・ & x_1^M \\
       ・ & ・・・ &  ・ \\
      x_N^0 & ・・・ & x_N^M
    \end{array}
  \right)
\\
ただし、M + 1 < N
\\
\\
δ = E_{RMS} = \sqrt{\frac{1}{N} \sum_{n=1}^N \{\sum_{m=0}^M w_m x_n^m - t_n\}^2}
```



## オーバーフィッティングの発生検知
最良のパラメータを算出することが出来ましたが、これはトレーニングセットのデータでの話です。
算出した標準偏差の範囲に収まるかどうかはわかりません。

そのため、他のデータセットでオーバーフィッティングが発生するか検証してみる必要があります。

オーバーフィッティングの検証は各次数における尤度関数の値の変化で行います。
尤度関数の値が増加しなくなるタイミングからオーバーフィッティングしていることが言えます。

また、検証するデータ数を増加すればするだけオーバーフィッティングの発生を抑えることができます。
ということは、ある次数におけるオーバーフィッティングの発生する地点の明確化ができます。

ここで複数のデータセットを用いてオーバーフィッティングが発生する次数からf(x)を算出することが出来る？


#### 最小二乗法との違い
誤差である標準偏差(分散)を算出することができる。
Windows(Win7)でコマンドラインからTypescriptを使用

##概要
　[ここ](http://qiita.com/siouxcitizen/items/63e17ccae386ffa17563)にあるようにNode.jsをインストール後、Windows(Win7)64bit版でコマンドライン(コマンドプロンプトからの操作)でTypescriptのインストール・設定を行ったときの記録です。　Node.jsは20160406時点の最新安定板のバージョン5.10.0を使用して作業を行いました。

　やっている作業は単純にTypescriptの機能だけを取り込んで、Typescriptファイル作成、Javascriptファイルに変換、HTMLファイルよりJavascriptファイルを読み込み・表示、となります。
　

##Node.jsのnpmによるTypescriptのインストール

```　
npm install typescript --save-dev
または
npm install typescript -D
```
を使用したインストールもあるようですが、


今回はわかりやく自PCのどこからでもTypescriptコマンドが使用できるように以下のようにグローバルインストールを行いました。

```
npm install -g typescript
```

Typescript用の作業用の適当なフォルダを作成し(フォルダ名テキトーでOK)

```
mkdir Typescript
cd Typescript
```

自分の場合さらにもう少しフォルダ構成を切り分けるために、最初のTypescriptプログラム用フォルダとして以下のようなフォルダも作成(フォルダ名テキトーでOK)してその中で作業

```
mkdir FirstApp
cd FirstApp
```

最終的には作成した
.../Typescript/FirstApp　
フォルダ下に
hello.ts　　hello.js　　index.html
の３ファイルがある構成になりました。

以下、サンプルを参考に実際に作成したファイルです。

##Typescriptファイル作成、コンパイル、実行(HTMLよりJS取込表示)
作業用フォルダ内にてソースファイルの　hello.ts　を作成

```ts:hello.ts
class Greeter {
    private greeting: string;
    constructor(message: string) {
        this.greeting = message;
    }
    public greet() {
        console.log("Hello, " + this.greeting);
    }
}
var greeter = new Greeter("TypeScript");
greeter.greet();
```

hello.tsをtscコマンドでコンパイルしhello.jsを生成

```
tsc hello.ts
```

```js:hello.js
var Greeter = (function () {
    function Greeter(message) {
        this.greeting = message;
    }
    Greeter.prototype.greet = function () {
        console.log("Hello, " + this.greeting);
    };
    return Greeter;
}());
var greeter = new Greeter("TypeScript");
greeter.greet();
```

変換した　hello.js　を取り込み・表示する　index.html　を作成

```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Hello Typescript!</title>
  </head>
  <body>
    <h1>Hello Typescript!</h1>
    <script type="text/javascript" src="hello.js">
    </script> 
  </body>
</html>
```

あとはindex.htmlを開くと以下のように表示されました。　表示に使用したブラウザはFirefoxのVer.45.0.1です。
console.logによる出力はFirefoxのコンソール表示で見ることができます。　コンソール表示はFirefoxの「ツール」→「Web 開発」→「Web コンソール」→画面下部の「コンソール」タブ選択から表示させることができます。

![ThubmNailOfFirstTypescriptProgram01.png](https://qiita-image-store.s3.amazonaws.com/0/51306/c16e170f-afbd-0a97-95e8-86d84d754964.png)


参考サイト　Typescriptインストール・設定　
[TypeScriptを始める – tscコマンド、Grunt導入、型定義ファイルの使用、tslintで構文チェックなど](http://mae.chab.in/archives/2525)
[ TypeScript プログラミング >はじめに >インストール](http://docs.solab.jp/typescript/first/install/)
[TypeScript の開発環境構築と周辺ツールの紹介](https://html5experts.jp/vvakame/17004/)
Ext JS 6 でのアイコン指定

Sencha Ext JS 6 では FontAwesome がバンドルされています。
ボタンのアイコンなどはこれで指定するとイメージとか用意しなくていいし便利です。それにRetina などで表示したときに綺麗です。

指定の仕方は簡単です。

### iconClsで

iconCls コンフィグでアイコンを指定する場合は、`x-fa` というクラスとアイコン名を指定します。アイコン名は[FontAwesome cheetsheet](https://fortawesome.github.io/Font-Awesome/cheatsheet/) に載っている名前です。

次のように指定します。

    iconCls: 'x-fa fa-home'

### glyph で

glyph で指定することも可能です。
その場合は、Cheetsheet の名前の横に置いている16進コードを使います。
さきほどの fa-home アイコンなら、 `[&#xf015;]` と表示されていると思います。
この x以降を使い、後に `@FontAwesome` をつけます。

次のように指定します。

    glyph   : 'xf019@FontAwesome'

コンポーネントの中にアイコンを表示したいときには

```js
html: '<i class="fa fa-compass"></i>',
```
と、`<i>` タグにクラスをセットします。
技術英語 > リスニング > Endress+Hauser > The Temperature Law: E+H = degC > Part 3

温度測定の技術に関しての面白そうな動画
http://qiita.com/7of9/items/a4ee56642b4c1eaaccf6
のリスニングの続き

@ Endress+Hauser > The Temperature Law: E+H = degC
https://www.youtube.com/watch?v=vnLyPVAb81s&list=WL&index=45
赤文字ははっきり聞き取れない部分。
青文字はそのように聞き取れるが、文法的にしっくりいかない部分。

(3:30-)
How can the sensor signal be transmitted, both stably and compatibly? This is done using our transmitters. They convert sensor values into standard signals, and can easily be tied into all systems. 

(3:35-)
Security, accuracy, flexibility and cost efficiency, are very good reasons for using temperature transmitters that reliably contribute to optimizing processes. 

(4:16-)
Top quality, we <font color=blue>either</font>, people for process automation make sure of that. For example, by using automatic optical inspection, certified inspection procedures and test methods guarantee security at all intersections.

(4:37-)
From non-destructive material's testing to 100% X-ray inspection, traceability of every detail of every single module within our product is the basis of Endress+Hauser's <font color=red>where enables</font> asset management. 


微妙に聞き取れないのが２カ所あった。
1バイト中の0-7ビットの内容を7-0ビットに反転させるメソッド

標題を実現するメソッドを考えていたが、ちょっと面倒だと思った。
ググると素晴らしいメソッドを発見した。

http://graphics.stanford.edu/~seander/bithacks.html#ReverseParallel

上記はパッと見何をやっているかわからなかった。
だが2進数で見ると動きが理解できたので8ビット版を作ることができた。

```javascript
  function rev(x){
    x = x & 0xff;// 8bit整数
    x = ((x & 0x55) << 1) | ((x >>> 1) & 0x55);
    x = ((x & 0x33) << 2) | ((x >>> 2) & 0x33);
    x = ((x & 0x0F) << 4) | ((x >>> 4) & 0x0F);
    return x;
  }
```


まず最初のこれ。

```
    x = ((x & 0x55) << 1) | ((x >>> 1) & 0x55);
```
xには`10100101(0xa5)`の値が入っているとする。
これは以下のような動きをする。まず最初の`x & 0x55`。これはxの値と2進数の`01010101(0x55)`とのビット単位での`and`演算を行う。なので、
<pre>
    x ... 10100101 
      and
0x55  ... 01010101 
      =   00000101
</pre>

次にこの値を左に1つシフトする。
<pre>
00000101 << 1 => 00001010 ... (1)
</pre>

になる。

次に `x >>> 1`だが、これはxの値を1つ右にシフトする演算である。

<pre>
x >>> 1 => 10100101 >>> 1 => 01010010
</pre>

でこの値と`and`演算をする。

<pre>
         01010010
         and
0x55 ... 01010101 
      =  01010000 ... (2)
</pre>

となる。そして(1)と(2)の値のor演算を行う。

<pre>
         00001010 ... (1)
         or
         01010000 ... (2)
       = 01011010 ... (3)
</pre>

となる。最初の値と(3)の値を比べると、2ビットごとに各ビットが入れ替わっていることがわかる。
続いて2ビットのペア、4ビットのペアでも行うことで8ビットのビット反転が完成する。

```js
  function rev(x){
    x = x & 0xff;
    // (a) 0bitと1bit、2bitと3bit、4bitと5bit、6bitと7ビットの入れ替え
    x = ((x & 0x55) << 1) | ((x >>> 1) & 0x55);
    // (b) 0-1bitと2-3bit、4-5bitと6-7bitの入れ替え
    x = ((x & 0x33) << 2) | ((x >>> 2) & 0x33);
    // (c) 0-3bit、4-7bitの入れ替え
    x = ((x & 0x0F) << 4) | ((x >>> 4) & 0x0F);
    return x;
  }
 
```
ソース中の(a),(b),(c)のビット単位での動きは、xの値が`10000100(0x84)`の場合は以下のとおりである。
見事に反転している。

```
bit 7   6     5   4     3   2     1   0
---------------------------------------------
(a) 1<->0  |  0<->0  |  0<->1  |  0<->0  2ビットごとに区切り各ビットを入れ替え
    0   1     0   0     1   0     0   0
(b)(0   1)<->(0   0) | (1   0)<->(0   0) 4ビットを2ビットのペアで区切り、ペアを入れ替え
    0   0     0   1     0   0     1   0 
(c)(0   0     0   1)<->(0   0     1   0) 8ビットを4ビットのペアで区切り、ペアを入れ替え
    0   0     1   0     0   0     0    1
```

理屈としてはわかったけど、最初にこれを考えた人はすごいなと思った。
技術英語 > contact bounce

@ Adam Taylor MicroZed Chronicles - Using the Zynq 101 [Kindle Edition]
No. 606/2129

pushbuttonの処理に関連して

> contact bounce,

chattering のことなのだろう

[チャタリング対策のしかた @ Electronic Lives Mfg](http://elm-chan.org/docs/tec/te01.html)
関連 http://elm-chan.org/cc.html