OmniAICreator/Qiita-1.07M huggingface dataset:
HTML要素名一覧

```json:html5--tag-name--array--multiple-lines.json
[  
  "a",
  "abbr",
  "address",
  "area",
  "article",
  "aside",
  "audio",
  "b",
  "base",
  "bdi",
  "bdo",
  "blockquote",
  "body",
  "br",
  "button",
  "canvas",
  "caption",
  "cite",
  "code",
  "col",
  "colgroup",
  "command",
  "datalist",
  "dd",
  "del",
  "details",
  "dfn",
  "div",
  "dl",
  "dt",
  "em",
  "embed",
  "fieldset",
  "figcaption",
  "figure",
  "footer",
  "form",
  "h1",
  "h2",
  "h3",
  "h4",
  "h5",
  "h6",
  "head",
  "header",
  "hr",
  "html",
  "i",
  "iframe",
  "img",
  "input",
  "ins",
  "kbd",
  "keygen",
  "label",
  "legend",
  "li",
  "link",
  "main",
  "map",
  "mark",
  "menu",
  "meta",
  "meter",
  "nav",
  "noscript",
  "object",
  "ol",
  "optgroup",
  "option",
  "output",
  "p",
  "param",
  "pre",
  "progress",
  "q",
  "rp",
  "rt",
  "ruby",
  "s",
  "samp",
  "script",
  "section",
  "select",
  "small",
  "source",
  "span",
  "strong",
  "style",
  "sub",
  "summary",
  "sup",
  "table",
  "tbody",
  "td",
  "textarea",
  "tfoot",
  "th",
  "thead",
  "time",
  "title",
  "tr",
  "track",
  "u",
  "ul",
  "var",
  "video",
  "wbr"
]
```

```json:html5--tag-name--array--single-line
["a", "abbr", "address", "area", "article", "aside", "audio", "b", "base", "bdi", "bdo", "blockquote", "body", "br", "button", "canvas", "caption", "cite", "code", "col", "colgroup", "command", "datalist", "dd", "del", "details", "dfn", "div", "dl", "dt", "em", "embed", "fieldset", "figcaption", "figure", "footer", "form", "h1", "h2", "h3", "h4", "h5", "h6", "head", "header", "hr", "html", "i", "iframe", "img", "input", "ins", "kbd", "keygen", "label", "legend", "li", "link", "main", "map", "mark", "menu", "meta", "meter", "nav", "noscript", "object", "ol", "optgroup", "option", "output", "p", "param", "pre", "progress", "q", "rp", "rt", "ruby", "s", "samp", "script", "section", "select", "small", "source", "span", "strong", "style", "sub", "summary", "sup", "table", "tbody", "td", "textarea", "tfoot", "th", "thead", "time", "title", "tr", "track", "u", "ul", "var", "video", "wbr"]
```

一覧は[こちら](https://gist.github.com/olscore/2c6a176c6f78a6dde9eb#file-all-html-tags-alphabetical-condensed-php)から拝借

参考: [HTML5/HTML5要素一覧［ABC順］ - TAG index](http://www.tagindex.com/html5/elements/abc.html)

間違えてるところあればご指摘ください。
OpenCV3のformatでMATLAB向けの出力をする

[こちらの記事](http://qiita.com/wakaba130/items/ae7cdd4b9a9c38fbc971)のようにOpenCV3からformatがMATLABに対応したらしいのですが，FMT_MATLABを指定するとMATLABでは読めない形式で吐きます．

そのうち修正されるでしょうが，次のように書くととりあえずMATLABで読める形式で出力できます．

```cpp:
cv::Mat matrix = cv::Mat::eye(3, 3, CV_64F);
std::ofstream ofs("save.m");
ofs << "matrix = " << cv::format(matrix, cv::Formatter::FMT_DEFAULT) << ";" << std::endl << std::endl;
```
jQueryでdata属性の値を正しく取得できないときに疑うこと

jQueryで、レスポンシブ対応のライブラリを書いていてハマりました。

```
<a href="#" class="trigger">クリック</a>
<div class="example" data-height="176">
    <p>画面幅によってここの行数が変わる</p>
</div>
```

雑に書くとこんな感じです。.triggerをクリックすると.exampleが自身の高さを利用した処理を行う、というものです。.exampleの中には長文が入るため、画面幅によって大幅に高さが変動します。

画面幅が変わったときだけカスタムデータ属性を更新しておけば、クリックしたときに最新の高さを調べ直さなくていいよね、と思っていたのですが…

何回やっても、**最初に画面をロードしたときの高さ**が返ってきてしまいます。

```
h = $('.example').data('height');

// hは常にロードしたときの高さになってしまう
```

クリックイベントに原因があるのでは…などと散々悩んだのですが、dataメソッドを使用していたからでした。

## jQueryのカスタムデータ属性の仕様

jQueryのdataメソッドは、基本的にキャッシュを参照しています。

- [jQueryのdata-*属性キャッシュ仕様と対策](https://w3g.jp/blog/jquery-data-attr-cache)
- [jQueryのカスタムデータ属性(data-*)の設定/取得の挙動が思ったのと違った件 - Qiita](http://qiita.com/Kta-M/items/2eda39750abd10df9801)

今回の場合、キャッシュは**クリックイベントが作成された時点の内容**なので、その後、HTMLの属性値が更新されていても反映されません。

## 対策

dataメソッドではなく、以下で処理します。

- attrメソッド
- JavaScript本来の関数（getAttribute）

getAttributeなら確実にキャッシュ参照を回避できるようですが、getElementsByClassNameが混ざると処理が複雑になるのでやめました。

素直に、クリックした都度innerHeightで高さを取得していればよかったかもしれません…
GetComponentで誤解してた

# GetComponentは継承を考慮してくれるっぽい
```C#
class TestA : MonoBehaviour {
   ...
}
class TestB : TestA {
   ...
}
```
と定義されたスクリプトを、GameObjectにアタッチし、

```C#
var a = testB.GetComponent<TestA>();
Debug.Log("testB.GetComponent<TestA>()->"+a );
var b = testB.GetComponent<TestB>();
Debug.Log("testB.GetComponent<TestB>()->"+b );
```

とした場合、

```C#
go.GetComponent<TestA>()->TestGameObject (TestB)
go.GetComponent<TestB>()->TestGameObject (TestB)
```
と、継承を考慮して返してくれる。無駄な処理を減らせる。

スクリプトは一つのGameObjectに、同じクラスでも複数アタッチできるっぽい。
```
var scripts = go.GetComponents<MonoBehaviour>();
```
で、全てのスクリプトをとってこれるっぽいな。（あんまり使い道はないが）
同じ系統のスクリプトは一つのみとかに制限する処理とか

```C#
Debug.Assert( go.GetComponents<TestA>().Length<=1 );
```
とかしてやればいいみたい。

---

放っておくと毎日何もしないので、せめて週１くらいでは何か残すぞ
wiringPiSetup*: You must only call this once per program run. This is a fatal error. Please fix your code.

raspberrypi3BでwiringPiの初期設定をしたときに

wiringPiSetup*: You must only call this once per program run. This is a fatal error. Please fix your code.

とエラーが出た。

これは

 wiringPiSetup(void)
 wiringPiSetupGpio(void)

この二つが競合してしまうためらしい。

対策はどちらかを消すか
http://nspg.sblo.jp/article/174485204.html

のサイトを参照（uninstallせずに再インストールだけでOK）。
Windows版のIntelliJ IDEAのTerminalでGit bashを起動する

Windows版のIntelliJ IDEAのTerminalでbashが使えるようにしてみました。  

試したのは以下の環境です。

- Windows10
- Git 2.10.2

bashはWindows版のGitに入っているものを使用します。

1.Settings->TerminalのShell pathに `<Gitをインストールしたフォルダ>¥bin¥bash.exe` を指定します。

![スクリーンショット 2016-11-21 22.28.05 のコピー.png](https://qiita-image-store.s3.amazonaws.com/0/387/fda0801f-7062-2348-c68c-481f13472ff1.png "スクリーンショット 2016-11-21 22.28.05 のコピー.png")

2.`alt`+`F12`でTerminalを開くと、あっさりとGit bashが起動しました。

![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/387/9bc79c43-a35f-8555-b94c-7a35b3cbb055.png "skitch.png")


ただし、このままだと日本語の処理がうまくいかない所がありました。  

- `ls`コマンドで日本語のファイル名が正しく表示できない
- コミットコメントに日本語を入力すると文字化けする(Editorはvimを使用）

3.これを回避するため、システム変数に`LANG=ja_JP.UTF8`を追加します。（変更したらWindowsの再起動が必要です）

![スクリーンショット 2016-11-24 23.31.03 のコピー.png](https://qiita-image-store.s3.amazonaws.com/0/387/7dbaa872-6d47-8d3d-752e-84049f87543d.png "スクリーンショット 2016-11-24 23.31.03 のコピー.png")

コメント頂きましたが、.bashrcに書いても良いです。

```bash
$ cat ~/.bashrc
export LANG='ja_JP.UTF-8'
```

この設定で上記の問題は解消されました。  

**2018/11/12 git、IntelliJどちらのアップデートによるものか不明ですが、久しぶりに試したところ下記問題は解消していました。**

~~ただし（使いこめば他にも問題が出る可能性もありますが）設定後の私の環境では少なくと２点おかしな挙動をしてます。~~

~~- 日本語入力中の変換候補がカーソルから離れた変な位置に表示される~~
~~- カーソルの上部に入力した文字の一部が残ることがある~~

~~これの解決方法は分かってません。~~  
~~自分にとっては許容範囲なのでそのまま使っていますが、神経質な方はやめておいた方が良いかもしれません。~~
BitbucketのPipelinesでrspecを実行して結果をSlackに送る

## 概要
この投稿では以下の方法について説明する。

- BitbucketのPipelinesを使ってRSpecを実行する。
- Pipelinesの実行結果をSlackに通知する。

類似の投稿はあると思うが、自分がささっと探したところ、ちょうど良い日本語の記事が見当たらなかったので、自分で書くことにした。

## 前提条件
- 以下の条件を満たすBitbucketのリポジトリが用意してあること。
    - bundleでgemをインストールするためのGemfileがルートディレクトリにあること。
        - 具体的には`bundle install`で必要なgemがインストールされること。
        - 最低限の内容を書くと、以下のようなGemfileになる。

        ```ruby
        source 'https://rubygems.org'
        gem 'rspec'
       ```
    - bundlerを使ってrspecが実行できること。
        - 具体的には`bundle exec rspec`が通ること。

- Slackのチームが用意してあること。

## BitbucketのPipelinesでRSpecを実行
+ Bitbucketのサイトを開き、「Pipelines」をクリック
+ 「Enable Pipelines」をクリック
+ Pipelinesの実行内容を設定するためのtemplateが提示されるので、Rubyを選択して「Next」をクリック
+ templateを編集できるのでrspecの実行コマンドを追記してコミット

```yaml
image: ruby:2.3.0

pipelines:
  default:
    - step:
        script: # Modify the commands below to build your repository.
          - bundler --version
          - bundle install
          - bundle exec rspec # これを追加
          - bundle exec rspec --format documentation # お好み次第で、こうでも良い
```
+ 確認ダイアログが出るので「この変更のプルリクエストを作成」にチェックを入れてコミット
    - bitbucket-pipelines.ymlというファイルがルートディレクトリに作られる。
+ この時点で、Pipelinesが実行される。
    - Pipelinesはリポジトリへのプッシュをトリガーにして実行される。
    - この場合、プルリクエストしたブランチのプッシュがトリガーとなるようだ。
+ プルリクエストを確認し、マージする。

## Pipelinesの実行結果をSlackに通知
※英語で良ければ、このページのSlack欄にすべて書いてある。
https://confluence.atlassian.com/bitbucket/notifications-for-bitbucket-pipelines-857053284.html

### SlackのチームにBitbucketのIntegrationをインストール
※Slackの無料プランではインストールできるIntegrationの上限が5個であることに注意

+ Slackのトップページから「Developer Tools」をクリック
+ Bitbucketで検索し、「Install」をクリック
+ 通知を送る先のチャンネルを選択して「Add Bitbucket Integration」をクリック
    - ここで新規にチャンネルを作ることもできる
+ 無事成功すれば、Bitbucket側の設定方法が書かれたページが表示される
    - このページをスクロールしていくと「Webhook URL」とうい欄があるので、ここに表示されるURLを控えておく
    - もちろん、このページは後から見ることもできる
        - Slackのトップページから「Developer Tools」、「Bitbucket」と辿り、「Configurations」の編集ボタンを押せば良い

### BitbucketのWebhookを設定
+ Bitbucketの「設定」を開き、Webhooksを選択
+ 「Add webhook」をクリック
+ Tilteを適当に(例えばSlack)入力し、URLには先程控えたSlackのWebhook URLを入力
+ Triggersは「Choose from a full list of triggers」を選択し、展開された項目から必要なものを選択
    - Pipelinesに直接関係あるのは以下の2項目
        - Build status created
        - Build status updated
    - 他の項目も併せて選択しても良い。特にリポジトリへのプッシュなどはチェックしておくと便利だろう。
+ 選択が終わったら「Save」をクリックして完了

## 実行
以上の設定をすると、以降のプッシュに対してPipelinesの処理(今回の場合はRSpecなど)が実行され、その結果がSlackに通知される。

## おまけ
### Pipelinesの機能
Pipelinesの結果はPipelinesのページにも表示されるが、その他、以下の箇所にも表示される。
- コミットの「Builds」
- ブランチの「Builds」
- プルリクエストの「Builds」
tableにrulesを追加して内側の線の表示を変える


###table rules=""
table要素に```rules=""```を追加し、内側の線の表示を変えることができる。


####実例
```
<table rules="none"> --- </table>
```


####rules属性と値
|属性           |値    |説明|
|:-------------|:-----|:--|
|rules=""|noen  |表示なし|
||rows|横のみ表示|
||cols|縦のみ表示|
||groups|グループ間のみ|
||all|全て表示|

何も指定しない場合`rules="none"`と同じ表示なしになる

#####border属性との関係
tableタグにborder属性を１以上指定した時点で、同時に
`rules="all"`を指定したと同じとなる。

また、そこにrules属性を加えると、その指定が優先される。
JavaScript Web Storageについて

Web Storageについてのメモ。

## Web Storageとはなんぞ

ブラウザに実装されているKey-Value型のデータストア
- データサイズの上限:5MB
- データの有効期限:なし
- データ通信:発生しない（サーバ側に送られたりしない）

## 種類

①ローカルストレージ
__localStorage__プロパティで使う

- オリジン単位でデータを管理。
- ウインドウやタブをまたいでデータの受け渡しが可能。
- ブラウザを閉じてもデータは残る

②セッションストレージ
__sessionStorage__プロパティで使う

- 現在のブラウザが開かれている間データが保持される。
- ブラウザが閉じられればデータは破棄される。
- ウインドウやタブをまたいでのデータ受け渡しはできない。

## どう使うか

chromeでは↓をコンソールに貼り付ければ実行可能

```js
{
    //ストレージの定義
    const storage = localStorage;

    /**
     * 値のセット手段
     */
    storage.setItem('test', 'hoge');
    storage.test2 = 'fuga';
    storage['test3'] = 'hogefuga';

    /**
     * 値の取り出し方
     */
    console.log(storage.getItem('test'));
    console.log(storage.test2);
    console.log(storage['test3']);
}
```

__データの削除__

```js
storage.removeItem('test');
delete storage.test2;
delete storage['test3'];
```

__全てのデータを削除__

```
storage.clear();
```

__データを取り出す__

```js
{
    const storage = localStorage;

    for (let i=0, limit=storage.length; i<limit; i++) {
        let k = storage.key(i);
        let v = storage[k];
        console.log(`${k} : ${v}`);
    } 
}
```

__オブジェクトを保存する__

```js
{
    const storage = localStorage;
    const test = {a: 'hoge', b: 'fuga'};

    storage.setItem('item', JSON.stringify(test));

    const data = JSON.parse(storage.getItem('item')); 

    console.log(data.a);
    console.log(data.b);
}
```

__モジュール例__

es6ではうまく書ききれなかったのでひとまずes5で

```js
var Store = function(appName) {
    this.app = appName;

    this.storage = localStorage;

    this.data = JSON.parse(this.storage[this.app] || '{}');
};

Store.prototype = {
    getItem: function (key) {
        return this.data[key]
    },
    
    setItem: function (key, value) {
        this.data[key] = value;
    },

    save: function () {
        this.storage[this.app] = JSON.stringify(this.data);
    }
};

//モジュールの利用
var sampleStore = new Store('test');
sampleStore.setItem('item', 'hoge');
console.log(sampleStore.getItem('item'));
sampleStore.save(); //確認
```

__イベントリスナーの登録__

```js
var sampleStorage = localStorage;
window.addEventListener('sampleStorage', function (e) {
    console.log(`changed: ${e.key}`);
    console.log(`previous: ${e.oldValue}`);
    console.log(`after: ${e.newValue}`);
    console.log(`event fired page: ${e.url}`);
});
sampleStorage.test2 = 'hoge';
```

同じurlのページ開いて、コンソールで検証してみてください。。


こんなことに使ってるから便利等あれば教えてください、、
こちらからは以上です。
CentOS7.2にPHPフレームワークLaravel5.3をインストールする

最近PHPをやり始めようと思って開発環境構築したときのメモ
#Laravelとは
 なんか最近流行っているPHPのフレームワークらしい。
 wikipediaによると
> Laravel は、MVCのWebアプリケーション開発用の無料・オープンソースのPHPで書かれたWebアプリケーションフレームワークである。

####[Laravel公式サイト](https://laravel.com/)


#導入時環境
 - Vagrant1.8.7
 - CentOS7.2

#EPEL, Remiを追加する。

 - EPEL  
 `sudo rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm`
 - Remi  
 `sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm`

#PHP7のインストール
 - 公式サイトによるとLaravel5.3をインストールすにはPHP5.6.4以上じゃないといけないらしいのでPHP7をインストールする。  
`sudo yum install --enablerepo=remi,remi-php70 php php-devel php-mbstring php-pdo php-xml php-zip`[^1]


#Composerのインストール
 - Laravelのインストールに必要らしいので入れる  
 `curl -sS https://getcomposer.org/installer | php`  
 `sudo mv composer.phar /usr/local/bin/composer`


#Laravelのインストール
 - 新規プロジェクトを作成する  
`composer create-project --prefer-dist laravel/laravel <test_project>`


#サーバ起動
 - プロジェクトディレクトリに移動  
 `cd <test_project>`
 - ローカル環境で開発しているとき  
 `php artisan serve`  
 http://localhost:8000 にアクセスしてLaravelって文字が見えれば成功
 - ローカル以外のとき（--host=0.0.0.0付けないと外部から見えないっぽい）  
`php artisan serve --host=0.0.0.0`  
 http://<サーバ起動した端末のIP>:8000 にアクセスしてLaravelって文字が見えれば成功



#参考
 - CentOS6／CentOS7にPHP5.6／PHP7をyumでインストール  
 http://qiita.com/ozawan/items/caf6e7ddec7c6b31f01e
 - Laravel公式ドキュメント  
 https://laravel.com/docs/5.3



#さ迷うことになった原因（同じことで、さ迷ってる人向け）
Composerでプロジェクト作成時に下記エラーが発生

```
  [RuntimeException]                                                            
  Failed to clone https://github.com/laravel/laravel.git, git was not found, c  
  heck that it is installed and in your PATH env.                               
  sh: git: command not found                                                    
 ```
git入れて、unzip入れてとかやってたけど、結局そんなの不要でphp-zipを入れたらそれだけで解決した。。。



[^1]: php-zipが必要なことがわかるのに丸一日以上さ迷った。。。
LuaスクリプトをLuaJITを使ってexe化する

Luaをexe化する際は、[LuaDist/srlua](https://github.com/LuaDist/srlua)というLuaのコンパイラとLuaスクリプトを一つのexeとして固めるツールが有名ですが(といいますか、これ以外知らない)、Luaの場合は実行速度がRubyよりも遅く、遅さが気になる場合があります。

なのでLuaJIT版を作りました。
なお、こちらは複数のLuaスクリプトをアーカイブしてexe内に取り込むようになっています。

[wordijp/cLuaJIT(github)](https://github.com/wordijp/cLuaJIT)

# 使い方

コマンド名はcluajitです、これは作成時にソースを流用させて頂いた[uLua](http://xn--pckzexbx21r8q9b.net/?page=nobu_mod_the_ulua)の名前にあやかっています。

```
# luajitと同じくスクリプトを実行
$ cluajit hello.lua
hello world

# 一端exe化して実行
$ cluajit hello.lua hello.exe -link
$ hello.exe
hello world

# モジュール用スクリプトもある場合は
$ cluajit hello.lua foo.lua hello.exe -link
$ hello.exe
hello world
from foo
```

# 速度比較

exe化したバイナリは内部でLuaJITが使われている為高速です、試しに[こちらのフィボナッチ数列のベンチマーク](http://h-miyako.hatenablog.com/entry/2015/01/23/060000)をもとにこちらでも計測してみます。

なお、各言語のバージョンは以下の通りです。

* Ruby(2.3.1)
* Lua(5.2.4)
* LuaJIT(2.0.4)
* cluajit(内部のLuaJITは 2.0.4)

計測に用いたソースコードも再掲しておきます。

```rb:Ruby
def fib(n)
  if (n < 2) then
    return n
  end
  return fib(n - 2) + fib(n - 1)
end

puts fib(42)
```

```lua:Lua
function fib(n)
  if n < 2 then
    return n
  end
  return fib(n - 2) + fib(n - 1)
end

print(fib(42))
```

これらのソースコードの実行時間を計測します、なお、cluajitは一端exe化してから実行しています。

|言語|実行時間|
|---|---|
|Ruby|31.023sec|
|Lua|43.881sec|
|LuaJIT|2.734sec|
|cluajit|2.858sec|

やはりLuaJITは速いです、exe化したら少し遅くなってますがこれくらいの誤差なら気にならないかと思います、なによりも配布時にバイナリ渡すだけで済むのは楽です。
Picassoでキャッシュの簡単設定


##要約
picassoのcacheの設定をいじってみた

##Picassoのキャッシュとは
picassoは一時的・ある一定の期間画像をキャッシュに保管しておくことができる。

###Picassoのメモリキャッシュ
- メモリの中の `external storage` の部分

	`external storage`はメモリの中の共通部分に当てはまる。

###Picassoのディスクキャッシュ
- メモリの中の `external storage` の部分
	
	`internal storage`はメモリの中の特定のアプリケーションのディレクトリの中に設けられた `cache/`ディレクトリ。
`cache/`ディレクトリの中を見てみると`picasso-cache`の領域が確保されていた。


##基本設定
Downloaderも設定することができる

```Java:app.gradle
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.squareup.okhttp:okhttp:2.4.0'
```



```Java:MainApplication
public class MainApplication extends Application implements Application.ActivityLifecycleCallbacks {

private final static SET_MAX_DISC_CACHE_SIZE;//ここにcacheのmaxサイズを設定することができる

    @Override
    public void onCreate() {
        //set cache and downloader to Picasso
        Picasso.Builder builder = new Picasso.Builder(this);
        builder.downloader(new OkHttpDownloader(this, Integer.MAX_VALUE));
        FincLruCache fincLruCache = new FincLruCache(SET_MAX_DISC_CACHE_SIZE);
        Picasso built = builder.memoryCache(fincLruCache).build();
        built.setIndicatorsEnabled(true);
        built.setLoggingEnabled(true);
        Picasso.setSingletonInstance(built);
	}
}
```

##画像をロードする時の設定

### MemoryPolicy
- `MemoryPolicy.NO_CACHE`
	memory cacheから探さないようにする

- `MemoryPolicy.NO_STORE`
	ロードしたimageをmemory cacheに入れないようにする

### NetworkPolicy

- `NetworkPolicy.NO_STORE`	
	disk cache に保存するのを避けるようにする
- `NetworkPolicy.OFFLINE`

	disk cacheのみから探すようにする


###DiskCacheに保存されるのを防ぎたいとき

```Java
Picasso.with(getActivity())
.load(imageUrl)
.networkPolicy(NetworkPolicy.NO_STORE)
.into(imageView)
```

###Cacheから探したい時
-> なかった時にnetworkから探すようにする

```Java
Picasso.with(getActivity())
.load(imageUrl)
.setworkPolicy(NetworkPolicy.OFFLINE)
.into(imageView, new Callback() {
    @Override
    public void onSuccess() {

    }

    @Override
    public void onError() {
        //Try again online if cache failed
        Picasso.with(getActivity())
                .load(imageUrl)
                .error(R.drawable.image)
　　　　　　　　　//エラー時の画像
                .placeholder(R.drawable.image)
                //読み込み時の画像
                .into(imageView, new Callback() {
            @Override
            public void onSuccess() {

            }
			 @Override
            public void onError() {
				//エラー処理
            }
        });
    }
});
```


##問題点など
- キャッシュはpicassoが用意している `LruCache`クラスを利用する。しかし、LRU(least recently used)で実装されているため、例えば特定のファイルなどを永続的に保存しておきたいなどということには使うことができない。
- 簡単に実装はできるがカスタマイズはしにくいので、これ以上のことを求めるとすればGlideなどを使うと良いかもしれない。
PentahoのインストールからHello worldまで

# Pentahoのインストール

## Javaのインストール
PentahoはJavaで実装されているため、JREのインストールが必要です。Javaがインストールされていない環境では、[Java](https://java.com/ja/download/)から入手してインストールしてください。

## Pentahoのダウンロード
Pentahoの各ツールは、[Pentaho Community](http://![spoon.png](https://qiita-image-store.s3.amazonaws.com/0/37377/e85e817a-8324-af10-8cc5-7e378d2d1e5c.png)community.pentaho.com/)の下のほうにあるDownloadsからダウンロードすることができます。
少し容量が大きいですが、[Business Analytics Platform](http://sourceforge.net/projects/pentaho/files/Business%20Intelligence%20Server/7.0/pentaho-server-ce-7.0.0.0-25.zip/download)と[Data Integration](http://sourceforge.net/projects/pentaho/files/Data%20Integration/7.0/pdi-ce-7.0.0.0-25.zip/download)をダウンロードします。
![ダウンロード.png](https://qiita-image-store.s3.amazonaws.com/0/37377/f85db191-c7a7-ad8a-7134-ea022be18745.png)

## Pentahoのインストール
適当なディレクトリ(例: C:\Pentahoや/home/ユーザー名/pentaho)に展開します。
![ディレクトリ.png](https://qiita-image-store.s3.amazonaws.com/0/37377/8c58267c-831f-2793-31e1-d304c45c6d0b.png)

# PentahoでHello World!

## Pentaho Data Integrationの起動
data-integration/spoon.bat(macosやlinuxではdata-integration/spoon.sh)を実行します。
![起動.png](https://qiita-image-store.s3.amazonaws.com/0/37377/779ade58-164b-8a4d-45f1-fe62f0f2d725.png)

うまくいけば、以下のスクリーンショットのような画面が立ち上がります。
![spoon.png](https://qiita-image-store.s3.amazonaws.com/0/37377/fb92b3d9-d848-0a4a-359a-0fe70b23cbef.png)

## 初めてのデータ変換
左上の新規作成っぽいボタンを押して、「データ変換」を新規作成します。
![データ変換.png](https://qiita-image-store.s3.amazonaws.com/0/37377/87d76a78-3814-8481-0432-805afb09282d.png)

こんな感じの画面になります。
![データ変換1.png](https://qiita-image-store.s3.amazonaws.com/0/37377/68df0b73-aff1-b4a7-2aee-d906137f1525.png)

左上のテキストボックスに「行」と入力し、「行生成」ステップを探し出します。
![データ変換2.png](https://qiita-image-store.s3.amazonaws.com/0/37377/686e44a3-3bb5-f8c8-f4fd-41d1c5b7ff8a.png)

見つけた「行生成」ステップをドラッグ＆ドロップで右側のキャンバスに配置し、ダブルクリックします。
設定ウィンドウが開くので、赤枠内を画像の通りに設定します。
![データ変換3.png](https://qiita-image-store.s3.amazonaws.com/0/37377/f361ec8a-992e-2904-72eb-ffafbc8a2e81.png)

キャンバス左上の三角形の再生ボタンを押すと、実行確認ウィンドウが開くので実行ボタンを押します。
![データ変換4.png](https://qiita-image-store.s3.amazonaws.com/0/37377/c1727cce-7ce0-ccd1-364e-ff8168c2fb25.png)

保存するように促されるので、適当なディレクトリ(デスクトップなど)に保存します。
ちょっと日本語が変ですね。
![データ変換5.png](https://qiita-image-store.s3.amazonaws.com/0/37377/605ed318-7be2-92e4-c5f6-6a0e13dfb553.png)

すると、データ変換が実行され、成功すれば緑のチェックマークが「行生成」アイコンの右上に表示されます。
この状態で、「行生成」ステップをクリックし選択した状態で、画面下部の「データをプレビュー」タブを選択すると実行結果が見ることができます。
![データ変換6.png](https://qiita-image-store.s3.amazonaws.com/0/37377/8be91bbb-064d-9a49-7bb1-77b3a7f5ef02.png)

Hello world!と表示されていれば成功です。

# 次回
次回は、Business Analytics Platformの起動からログイン、ダッシュボードのHello worldを紹介します。
require 'mathn' するとARのdatetimeの精度で死ぬ件

簡単に書くと、こういうことです。

```sql
mysql> show create table items \G
*************************** 1. row ***************************
       Table: items
Create Table: CREATE TABLE `items` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
```

```
irb(main):002:0> Item.new(name: 'foo').save
   (0.2ms)  BEGIN
  SQL (0.4ms)  INSERT INTO `items` (`name`, `created_at`, `updated_at`) VALUES ('foo', '2016-11-24 15:14:34', '2016-11-24 15:14:34')
   (0.8ms)  COMMIT
=> true
irb(main):003:0> require 'mathn'
=> true
irb(main):004:0> Item.new(name: 'foo').save
   (0.3ms)  BEGIN
  SQL (0.3ms)  INSERT INTO `items` (`name`, `created_at`, `updated_at`) VALUES ('foo', '2016-11-24 15:14:55.147015', '2016-11-24 15:14:55.147015')
   (0.6ms)  COMMIT
=> true
```

なにが起きたかおわかりだろうか？
`require 'mathn'`した後に`created_at`への`INSERT`には小数点以下がついています。

![スクリーンショット 2016-11-25 0.32.37.png](https://qiita-image-store.s3.amazonaws.com/0/20100/1e0515fa-2ee6-6d4b-a7c4-768857fc3d06.png)


# 何が起きたか？

MySQL5.6以降、datetimeでミリ秒がサポートされるようになったが、何も考えずに`Time.new`のミリ秒以下までINSERT文に含めると問題が多数発生するため、精度を見て小数点以下を付けたり付けなかったりするようになった。

精度を見て、小数点以下を削除するコードは以下の通り。

https://github.com/rails/rails/blob/v5.0.0.1/activemodel/lib/active_model/type/helpers/time_value.rb#L33

```rb
def apply_seconds_precision(value)
  return value unless precision && value.respond_to?(:usec)
  number_of_insignificant_digits = 6 - precision
  round_power = 10**number_of_insignificant_digits
  value.change(usec: value.usec / round_power * round_power)
end
```

さて、通常Rubyでは`123456 / 1000000 / 1000000`の結果は以下のようになる:

```rb
irb(main):002:0> 123456 / 1000000 / 1000000
=> 0
```

これが`mathn`を`require`するとどうなるかというと

```rb
irb(main):004:0> 123456 / 1000000 / 1000000
=> (1929/15625000000)
```

こうなります。

なんでこれがdatetimeの精度に影響するかというと、

```rb
  value.change(usec: value.usec / round_power * round_power)
```

この部分ですね。

割り算で小数点以下を消しているのですが、`mathn`を`require`すると、正確な計算をしようとするため、小数点以下が消えないのです。

# なんでこうなるの？

https://github.com/ruby/ruby/blob/v2_3_3/lib/mathn.rb#L73

```rb
class Fixnum
  remove_method :/

  ##
  # +/+ defines the Rational division for Fixnum.
  #
  #   1/3  # => (1/3)

  alias / quo
end
```

恐ろしい、恐ろしい。
筋トレと野菜が必要ですね。

# 関連

[Feature #10169: It might be better to make Mathn class deprecated - Ruby trunk - Ruby Issue Tracking System](https://bugs.ruby-lang.org/issues/10169)
readonlyな構造体で注意すべきコト

#どーいうことだってばよ

例えばこんな構造体をこさえたとする

```csharp
public class Counter
{
	public int Count { get; private set; }

	public void Incliment() => ++Count;

}


public struct SampleStruct
{
	public SampleStruct(int value):this()
	{
		Value = value;
		Counter=new Counter();
	}
	public int Value { get; set; }

	public int Count { get; private set; }

	public Counter Counter { get; }

	public void InclimentCount()
	{
		Counter.Incliment();
		++Count;
	}
}
```

でこいつが､何かしらのreadonlyなメンバフィールドになったとき､予想外の結果になるので注意しましょうってお話なので､一つおつきあい頂ければこれ幸い｡

#とりあえずこさえてみる

とりあえずこんな風にメンバフィールドとしてこさえてみる｡

```csharp

public class Envelope
{
	private readonly SampleStruct _immutable = new SampleStruct(42);
	private SampleStruct _mutable = new SampleStruct(42);
...

```

で､下記のようにメソッドを追加してみる｡

```csharp

public class Envelope
{
	private readonly SampleStruct _immutable = new SampleStruct { Value = 42};
	private SampleStruct _mutable = new SampleStruct {Value = 114514};

	public void SetValue(int value)
	{
		//CS1648が発生｡
		_immutable.Value = value;
		_mutable.Value = value;
	}
}

```

この場合､コメントにあるとおり､readonlyなメンバに対するプロパティの設定操作は許容されずコンパイルエラーになる｡
そりゃそーだ､なにせ読み取り専用なのだから｡

#内部状態を変更するメソッドはどーなるのか

内部状態を変更するメソッドを実行した場合､とても厄介なことになる｡
とりあえず､問題起こすサンプルは以下の通り｡

```csharp
public class Envelope
{
	private readonly SampleStruct _immutable = new SampleStruct { Value = 42};
	private SampleStruct _mutable = new SampleStruct {Value = 114514};

	public void InclimentCount()
	{
		_mutable.InclimentCount();
		_immutable.InclimentCount();


		//1
		Console.WriteLine($"_mutable.Count:{_mutable.Count}");
		//1
		Console.WriteLine($"_mutable.Counter:{_mutable.Counter.Count}");

		Console.WriteLine();
		//0のまま!
		Console.WriteLine($"_immutable.Count:{_immutable.Count}");

		//1
		Console.WriteLine($"_immutable.Counter:{_mutable.Counter.Count}");
	}

}
```

さてこの場合､結果は､値型のメンバフィールドの値型はreadonly制約が効くので変更されない｡
しかも､メソッド呼び出しそのものはコンパイルエラーもランタイムエラーも発生させず､結果が予想外になるというとんでもなく厄介な結果となる｡
蛇足ながら､なんでエラーにならず､結果が予想外になるかはコンパイル時に以下のような結果を生成するから

```csharp
public void DecompileIncliment()
{
	//_immutable.InclimentCount();
	SampleStruct anonymous = _immutable;
	anonymous.InclimentCount();
		

　　　　//0
	Console.WriteLine($"_immutable.Count:{_immutable.Count}");
	//1
	Console.WriteLine($"_immutable.Counter:{_immutable.Counter.Count}");

}
```



また､readonlyな値型の参照型メンバフィールドはしれっと変更できちゃうのでこれも又注意しないとマズい｡

#まとめ

ということで､readonlyな値型に対する間接的なmutableな操作は時として相当厄介なバグを生み出すので､注意すべきかと｡
おつきあい頂有り難うございました｡
【準備編】会社玄関ドアの開閉を検知してEC2のインスタンスの起動停止を行う

# 無駄なコストを払いたくない
皆さんEC2使われてますよね？
便利だからってインスタンスを増やすとコストとして跳ね返ってきます。
となると当然以下の様に考えます。

1. インスタンスが必要なのは営業時間の間
2. であればインスタンスを自動起動停止できれば良い
3. ドアの開閉を検知して起動停止すれば良いのでは？
4. 今流行のIoTと絡めたら面白そう

という事で、やってみました。
以下の4回に分けてお送りしたいと思います。

* 準備編
* 実装編
* テスト稼働編
* 実稼働編

# まずは下準備
* ドアの検知方法
* データの送信方法



## ドアの検知方法
ドアの検知は接触型か非接触型のどちらかになります。
接触型だと簡単そうですが面白くなさそうなので、非接触型にします。
「非接触型」「スイッチ」で調べると磁力でやるのが良さそうな事が分かりました。

ホール素子というもので、磁場の変化を読み取る事ができそうです。
詳しくはこちらを >> [ホール素子](http://www.nicera.co.jp/pro/hs/hs-01.html)
電磁誘導とはちょっと違うようです。

## データの送信方法
当然有線なんかでは送りたくないので無線で探します。
昔Arduinoを触ったことがあったので、ArduinoにWiFiモジュールでも乗せれば良いのでは？と思いましたが、時代は進化していました。

ESP8266というWiFiモジュールを使えば、何とArduinoのプログラムが書き込めるとのこと。
しかも安い。チップだけなら1000円もしないです。ただし、プログラムを書き込むにはUSB-シリアル変換と電源が必要です。
なんと、これらをセットにしたものが売ってました。便利な世の中です。
[スイッチサイエンス ESPr Developer](https://www.switch-science.com/catalog/2500/)

## 構想を練る
さて、これで下準備が整いました。
とりあえず連携イメージ図を描いてみました。ESP8266とEC2の間に何か増えてますが気にしない。

![イメージ図](https://qiita-image-store.s3.amazonaws.com/0/54521/8c74f121-9d30-1d7b-33c1-c04aaf81c215.png)
pythonでmultiprocessingを使って並列処理をする時に引数を複数取る方法

# サンプルコード
```py:sample.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from multiprocessing import Pool
from collections import Counter

# ここを並列処理する
def func(n, argument1, argument2):
    # 2倍して5を足す処理
    return n * argument1 + argument2

def wrapper(args):
    # argsは(i, 2, 5)となっている
    return func(*args)

def multi_process(sampleList):
    # プロセス数:8(8個のcpuで並列処理)
    p = Pool(8)
    output = p.map(wrapper, sampleList)
    # プロセスの終了
    p.close()
    return output

if __name__ == "__main__":
    # 100回の処理を並列処理で行う
    num = 100

    # (i, 2, 5)が引数になる
    sampleList = [(i, 2, 5) for i in range(num)]

    # sampleListの要素を2倍して5を足す
    output = multi_process(sampleList)
```
# 説明
pythonのバージョンは2.7.10です
コードを見ればわかると思いますが

- **multiprocessing**を使って並列処理をする場合、listにして渡すのが簡単です。
- **wrapper()**関数を間に挟むことで複数の引数を渡すことができます。
- 今回のサンプルではリストの最初の要素を全て2倍して5を足すという処理を行っています。
- プロセスの終了(**Pool.close()**)を忘れてしまうとプロセスを開きすぎて`Too many open files`というエラーが発生する可能性があります。
SSHのvimでマウス

```bash
set mouse=a
```

おなじみのマウスを有効にする設定。
しかし、ssh越しだと逆に何故か選択範囲コピーできなくなったなったので
コメントアウトしたらできるようになった。
あと、マウスの中ボタンでスクロールすることができなくなる。

---

```bash
set nonumber
set nonu # 省略した形
```

行番号を**消す**設定。
通常はもちろん表示されていると思うけど
コピーするとき邪魔になるとき使用するかも。
phpdbgの-eオプションの意味が1年くらいの期間で変わっていた

PHP同梱のデバッガ`phpdbg`の情報をネットで調べると、`phpdbg -e [file名]`のような起動オプションを紹介しているページが多く見つかります。実際、phpdbgの[公式マニュアル](http://phpdbg.com/docs/simples)にもそのように書いてあるわけですから、まさかこれが間違っているとは誰も思わないでしょう。

しかし、実際には`-e`オプションなしでも問題なく動きます。それどころか、`-e`オプションをつけると無駄なオペコードが発行されます。具体的には、次のようにすれば確認できます。

```php:foo.php
<?php
echo 1;
```

```
$ phpdbg -e foo.php
[Welcome to phpdbg, the interactive PHP debugger, v0.5.0]
To get help using phpdbg type "help" and press enter
[Please report bugs to <http://bugs.php.net/report.php>]
[Successful compilation of /private/tmp/foo.php]
prompt> print exec
[Context /private/tmp/foo.php (3 ops)]
L1-3 {main}() /private/tmp/foo.php - 0x106074000 + 3 ops
 L2    #0     EXT_STMT
 L2    #1     ECHO                    1
 L3    #2     RETURN                  1
prompt>
```

このように、`-e`オプションつきで実行すると3つのopcodeにコンパイルされているように見えます。

```
$ phpdbg foo.php
[Welcome to phpdbg, the interactive PHP debugger, v0.5.0]
To get help using phpdbg type "help" and press enter
[Please report bugs to <http://bugs.php.net/report.php>]
[Successful compilation of /private/tmp/foo.php]
prompt> print exec
[Context /private/tmp/foo.php (2 ops)]
L1-3 {main}() /private/tmp/foo.php - 0x10c874000 + 2 ops
 L2    #0     ECHO                    1
 L3    #1     RETURN                  1
prompt>
```

ところが、`-e`オプションなしだとopcode 2個になるようです。これはもちろん`-e`なしの方が通常のコンパイル結果になります。

# -eオプションの正体

GitHub上の履歴をたどってみたところ、以前`-e`は処理対象のファイル名を指定するためのオプション引数だったようです。これが、下記コミットのタイミング（2014年4月）でオプション指定が不要になりました。この時点では`-e`を指定してもしなくても同じ挙動だったようです。

- https://github.com/krakjoe/phpdbg/commit/0873f2bfb4f8ad0ecd5f4ae7805828ed34bc1565

ところが、2015年6月に`-e`オプションが復活しています。しかも昔と意味が変わっており、「EXT_STMT」などのopcodeを挿入するよ、という意味になっています。

- https://github.com/php/php-src/commit/0da4a3ec2c3bfe0bfddbd17e0c757f71ae8d661b

このオプションは最新のPHPでも維持されています。

オプションの意味が変わって復活してたということなら、ドキュメントの不整合があっても仕方がないというものですね。とはいえ公式サイトの記述くらいは直してほしい気もします。

phpdbgを弁護しておくと、`-e`を外したのは元々の作者の人で、新しい意味の`-e`を作ったのは最近活発にメンテナンスしている別の人です。

# -eオプションの使い道

新たに実装された方の`-e`オプションを指定すると、デフォルトでは何もしないopcode [^1] である「EXT_STMT」「EXT_FCALL_BEGIN」「EXT_FCALL_END」の3つが関数呼び出しの前後や各opcodeの前後などに挿入されます。

この機構はXdebugではカバレッジカウントに使われていたりしますが、phpdbg内で何に使われているかはわかりませんでした。実は何も使っていない可能性さえありそうです。

`phpdbg`で`help options`とすると次のように表示されます。

```
  -e                          Generate extended information for debugger/profiler
```

debugger/profilerというのは自分自身のことなのか、別のextensionやライブラリと組み合わせて使う想定なのか、ちょっとわかりませんでした。詳しい方がいらしたら教えてください。

[^1]: extensionなどでフックして利用するのが主目的だという認識です
いろいろめも

## 前提

```
brew install flac lame shntool
```

## CUE + FLAC to Splitted FLAC 

```
shnsplit -f *.cue -t "%n %t" -o flac *.flac
```

## FLAC to MP3

```bash:flac2mp3.sh
#!/bin/bash

for a in ./*.flac; do
  # give output correct extension
  OUTF="${a[@]/%flac/mp3}"

  # get the tags
  ARTIST=$(metaflac "$a" --show-tag=ARTIST | sed s/.*=//g)
  TITLE=$(metaflac "$a" --show-tag=TITLE | sed s/.*=//g)
  ALBUM=$(metaflac "$a" --show-tag=ALBUM | sed s/.*=//g)
  GENRE=$(metaflac "$a" --show-tag=GENRE | sed s/.*=//g)
  TRACKNUMBER=$(metaflac "$a" --show-tag=TRACKNUMBER | sed s/.*=//g)
  DATE=$(metaflac "$a" --show-tag=DATE | sed s/.*=//g)

  # stream flac into the lame encoder
  flac -c -d "$a" | lame -b 320 -q 0 --add-id3v2 --pad-id3v2 --ignore-tag-errors \
    --ta "$ARTIST" --tt "$TITLE" --tl "$ALBUM"  --tg "${GENRE:-12}" \
    --tn "${TRACKNUMBER:-0}" --ty "$DATE" - "$OUTF"
done
```

## SVG to PDF

```bash
#!/bin/sh

for file in *.svg
do
  echo "${file} -> ${file}.pdf"
  inkscape --without-gui --file="${file}" --export-pdf="${file}.pdf"
done
```
検索条件に集計関数を使用する


GROUP BY 句によって、元のテーブルをグループ分けして結果を得ることが出来るようになりました。ここでは、更にそのグループに対して条件を指定して選択する方法を考えます。

条件指定といえば、WHERE 句が真っ先に思い浮かぶかもしれません。しかし、WHERE 句はあくまで「レコード（行）」に対してのみしか条件を指定出来ないため、グループに対する条件指定（例えば、「含まれる行数が 2 行」や「平均値が 500」など）には使えないという制限があります。

WHEREでできないことは、HAVINGでできます。HAVINGはGROUP BYに対して使用します。


```sql
SELECT 集計キー1, 集計キー2, ...,
    集計関数(列名1), 集計関数(列名2), ...
FROM テーブル名
GROUP BY 集計キー1, 集計キー2, ...
HAVING 条件式
```

なお，HAVING句は必ずしもGROUP BY句と併用する必要はありません。グループ化して集計しない場合は以下のようにGROUP BY句を省略することができます。


```sql
SELECT 集計関数(列名1), 集計関数(列名2), ...
FROM テーブル名
HAVING 条件式
```

### サンプル

|従業員コード|従業員名|年齢|種別|
|:-----:|:-----:|:-----:|:-----:|
|A0001|チャーリー・ブラウン|15|人間|
|A0002|ペパーミント・パティ|15|人間|
|B0001|スヌーピー|4|犬|
|C0001|ウッドストック|3|鳥|


従業員マスタから平均年齢が15歳以上の種別を取得する場合は以下のようにSQLを書きます。なお以下のサンプルは分かりやすいようにAS句を使用して列に別名をつけています。

SQL

```sql
SELECT 種別, AVG(年齢) AS 年齢の平均
FROM 従業員マスタ
GROUP BY 種別
HAVING AVG(年齢) >= 15
```

結果

|種別|年齢の平均|
|:-----:|:-----:|
|人間|15|
[Rails] helper methodを特定のコントローラー、名前空間のviewに使いたい

エンジニア歴は数カ月のひよっこですが、
現在、Railsを使ったアプリケーション開発にアサインしています。

これから仕事、趣味コードでハマったことを色々書いていったり、アウトプットしながらエンジニアとしてレベルアップしていきたいです。

# やりたいこと
RailのHelperメソッド、非常に便利なんですが、Railsのデフォルトの挙動だと、`app/helpers`以下のファイルに記載されたメソッドのスコープが、アプリケーションview全てになってしまうんですよね。
つまり、ビューのどこからでも使えてしまうという問題があります。

たとえば、現在日時のフォーマットを作りたいメソッドをいくつか作ったとして

`app/views/students`（生徒） 以下のviewファイルでは
"2016/11/24"　と表示したい

`app/views/teachers`（先生）　以下のviewファイルでは
"16/11/24" と表示したいとする場合を考えます。

そこで、それぞれに対応するのヘルパーファイルを作って
 `view_today` メソッドでそれを実現したいとします。

```ruby:app/helpers/students
module StudentsHelper
  def view_today
    Time.now.strftime("%Y/%m/%d")
  end
end
```

```ruby:app/helpers/teachers
module TeachersHelper
  def view_today
    Time.now.strftime("%y/%m/%d")
  end
end
```

とした場合、helpersディレクトリ以下の `view_today` メソッドが競合してしまう！

つまり、 生徒に関する画面表示で、"16/11/24" と表示されたり、逆に先生に関する画面表示で、"2016/11/24"と表示されたりしてしまいます。 

そこで、helper methodを特定のviewに使いたいなーって思ったときに調べて解決策を見つけました。

# 具体的にどうやんの？
[rails gem　の githubではこのように書いてます。](https://github.com/rails/rails/commit/b8a742673dc4d2f116fb2961e6ac2a8b6c06ef36)


>　`config.action_controller.include_all_helpers` configures whether all view helpers are available everywhere or are scoped to the corresponding controller. If set to `false`, `UsersHelper` methods are only available for views rendered as part of `UsersController`. If `true`, `UsersHelper` methods are available everywhere. The default configuration behavior (when this option is not explicitly set to `true` or `false`) is that all view helpers are available to each controller.

簡単に訳すと、

```
`config/application.rb` ファイル内にある、
`config.action_controller.include_all_helper`の設定が
 `true` になっていると、ヘルパーメソッドのスコープは全てのviewになります。
（Railsのデフォルト設定）

しかし、それを`false`に設定すると、例えば`UsersHelper`だと、
`UsersController`からrenderされたviewだけで利用可能になるよ。
```

これですね！

ではやってみましょう。

```ruby:config/application.rb
    config.action_controller.include_all_helpers = false

```

としてあげると、先程と同じコードで

```ruby:app/helpers/students
module StudentsHelper
  def view_today
    Time.now.strftime("%Y/%m/%d")
  end
end
```

```ruby:app/helpers/teachers
module TeachersHelper
  def view_today
    Time.now.strftime("%y/%m/%d")
  end
end
```

`StudentsController < ApplicationController` 
の `index`や`new`画面等では確実に view_todayは "2016/11/24" になって、
`TeachersController < ApplicationController` 
の indexやnew画面等では確実に view_todayは "16/11/24" になります。


# 名前空間にもつかえる

`Hoges::ApplicationController　< ApplicationController`

`Hoges::Foos::ApplicationController < Hoges::ApplicationController`

のような形の名前空間を作った場合

`app/views/hoges/foos` 以下の viewファイルにだけ使えるヘルパーメソッドを定義したい！って場合には、

```ruby:config/application.rb
    config.action_controller.include_all_helpers = false

```
とした上で、

```ruby:app/helpers/hoges/foos/application_helper.rb
module Hoges::Foos::ApplicationHelper
  def view_today
    Time.now.strftime("%d/%m/%y") #24/11/16　と表示される
  end
end
```
とすればOKです。

この辺は、モデルに関するviewで使えるメソッドを定義できる[draper](https://github.com/drapergem/draper)よりも柔軟的に対応ができるかなって思います。色々使い分けしたいですね！
Unreal.jsの型定義ファイルを再生成してAPIを調べやすくする

# 問題

[Unreal.js](http://qiita.com/ConquestArrow/items/bb81ad5e63cf6bc4e549)はVSCodeなどの[補完が効くエディタ用に型定義ファイルを出力する機能](https://github.com/ncsoft/Unreal.js/wiki/Autocompletion)がある。

大変便利なのだが、[デフォルトで出力されているもの](https://github.com/ncsoft/Unreal.js/blob/master/Examples/Content/Scripts/typings/ue.d.ts)はAPIがただ羅列しているだけである。そのため内容を調べるには名前から類推するか、Unreal C++の元のAPIのマニュアルを探す手間が必要だった。

Unreal.jsはマニュアルが充実しているとは言い難いのでこれはなかなかつらいところである。

# 解決方法

結論から書くと、型定義ファイルを生成するメソッド `JavascriptContext.WriteDTS()` の第二引数を`true`にして型定義ファイルを生成すればOK。

```js:Sample
Context.WriteDTS(Context.Paths[0] + 'typings/ue.d.ts', true);
```

元のC++ APIのコメントがJSDocフォーマットで型定義ファイル内にも出力され、コードの補完時にAPIの説明を読むことができるようになる。

![Unreal-js_WriteDTS.png](https://qiita-image-store.s3.amazonaws.com/0/54764/88fa7c40-c0be-5bf2-07d7-4abf9a44f1f4.png)



# 説明

[公式wikiには書かれていない](https://github.com/ncsoft/Unreal.js/wiki/Visual-Studio-Code)が、型定義ファイル`ue.d.ts`の方に以下のように詳細が書かれている。

```ts
WriteDTS(Target: string,bIncludingTooltip: boolean): boolean;
```

第二引数をtrueにすると、メソッドやプロパティにコメントが出力され、（対応しているエディタなら）補完時に確認することができる。

# 注意点

## 型定義ファイルの肥大化

コメントが追加されることで型定義ファイルのサイズが非常に大きくなる（出力されるファイル数が増える）。エディタの補完動作がやや遅くなるので注意。

## ver.0.23 クラスのコメントが出力されない

なぜかクラスの説明が出力されない。[プルリクを取り込んでもらった](https://github.com/ncsoft/Unreal.js-core/pull/9/commits/461a8399884baf4fb1b65bb7791fd738224f230c)ので次のリリースからは出力されるようになるはず。

## APIのコメントは機械抽出

機械抽出したコメントを追加しているようなので、ほぼ意味をなしていないコメントや誤ったコメントを出力している例がある。最終的にはUnreal C++のAPIを確認する必要になることもあるだろう。

# まとめ

* 素の型定義ファイルはコメントがなくて辛い
* `WriteDTS()`の第二引数を`true`で再生成するとコメントが追加されて便利！
* 注意点は次の３つ
    1. 型定義ファイルがめっちゃでかくなる
    2. なぜかクラスのコメントが出力されない
    3. おかしなコメントが出力されることも
Railsでaccepts_nested_attributes_forを使ってNested Modelを新規作成するときの注意

# Nested model (attributes)とは
 Railsの超便利機能で、親と子の関係もしくは`has one`関係を`nested`と指定することで、
 親を作成時に同時に子も作成してしまうことができる。
 https://github.com/plataformatec/simple_form/wiki/Nested-Models

 指定するためには下記のようにする。

```app/models/parent.rb
class Parent < ApplicationRecord
  has_many :children
  accepts_nested_attributes_for :children
end
```

```app/models/child.rb
class Child < ApplicationRecord
  belongs_to :parent
end
```

# Nested attributesでのモデル作成が失敗してしまう場合
 例えば、`parent`を作成するフォームでnestedされた`child`を一緒に作成することを考える。
 フォームは下記のようになる。

```erb 
<%= simple_form_for @parent, :html => { :class => 'form-horizontal' } do |f| %>
  <%= f.input :name %>
  <%= f.simple_fields_for :children, @parent.children.build do |c| %>
    <%= c.input :name %>
  <% end %>

  <%= f.button :submit, :class => 'btn-primary' %>
  <%= link_to t('.cancel', :default => t("helpers.links.cancel")),
                parents_path, :class => 'btn btn-default' %>
<% end %>
```
 しかし、このフォームで更新ボタンを押すと、`Children parent must exist`とエラーを出してトランザクションがロールバックしてしまう。
 
# 理由と解決
 処理中、`Children`を作成するときに、`parent_id`が必要だと主張する。
 でも`Parent`も今作成中なわけなので、DBに登録して初めて得られるIDは持っていない。
 ここで、`Parent`と`Children`の意見が相反してエラーが発生しトランザクションがロールバックする。

 Rails 5.0ではこれを回避するための方法として、`inverse_of`が導入されており、
 親子両方のモデルに`inverse_of`を設定することで、id違反を解消してくれる。
http://stackoverflow.com/questions/39090576/rails-5-error-message-child-model-parent-model-must-exist

```app/models/parent.rb
class Parent < ApplicationRecord
  has_many :children, inverse_of: :parent
  accepts_nested_attributes_for :children
end
```

```app/models/child.rb
class Child < ApplicationRecord
  belongs_to :parent, inverse_of: :children
end
```

# Railsアプリサンプル

下記に置きました。`Parent`->`child`->`descendants`の３階層でのnestedを実現しようとして、
descendantsをちゃんと実装~~する前に力尽きました。でも、`parent`->`child`のnestedの更新は成功~~しています。

https://github.com/onelittlenightmusic/sample_nested_model_creation
未踏の応募資料を公開します 【統計的かな漢字変換】

2016年度の未踏事業の応募資料を公開します。
https://drive.google.com/file/d/0B3_gFEFI2149VEdKeWxsWnJsNlU/view?resourcekey=0-tiHOfGdyOg54X3ZUTVLzZA
テーマは「単語の共起情報を利用したかな漢字変換システム」です。

(資料内では「このひとことでげんきになった」を変換対象の文字列の例として挙げていますが，「けんきゅうする」の間違いです)

## なぜ公開するか
一言で言うと、落ちたからです。しかし誰かの趣味や研究テーマになれば、未踏に落ちたとしてもアイデアの有効活用にはなるだろうと考えてます。

## なぜ落ちたか
未踏の審査をして下さった方からは次のようなコメントを頂いています。

* 「提案手法なしとありとで、提示される候補を比較し、改善の程を評価するというのでは、ソフト開発ではなく研究となってしまいます」
* 「全く独自にかな漢字変換システムを全部作るのではなく、既存のかな漢字変換ソフトウェアに組み込むという方法を取らないと、なかなか世の中には受け入れてもらえないでしょう」
* 「共起情報ではなく、広い意味での熟語的な辞書をどんどん作っていくという方法ではだめでしょうか？」

### 提案手法なしとありとで改善の程を評価するというのでは、ソフト開発ではなく研究となってしまいます
全くそのとおりです。来年は気をつけます

### 広い意味での熟語的な辞書をどんどん作っていくという方法ではだめでしょうか
もちろん辞書を作ったほうがコストが低く済むなどの利点があります。
一方で、私は単語の情報をもっとぼんやりと(例えばword2vecのような形で)保持したほうが精度が上がるだろうと考えています。

### 既存のかな漢字変換にcontributeしないのはなぜ？
D言語で書いたからです。

## コード
途中まで作ったものが[GitHub](https://github.com/IshitaTakeshi/KanaKanjiConversion/)に置いてあります。
以下の部分は既に実装済みです。

* 2単語のつながりまたは2品詞のつながりを学習する部分
* 単語の出現頻度を計測する部分
* 経路探索アルゴリズム

内部で辞書として用いているTrie木も[D言語のライブラリ](https://github.com/IshitaTakeshi/DTrie)として公開しています。

## なぜD言語で書いたの？
1. 保守しやすいからです。D言語はC/C++に比べると読みやすく、また単体テストも自然に書けるようになっています
2. かな漢字変換はネイティブで動作する必要性があります。かな漢字変換を使うためにJavaやPythonの実行環境をユーザーにインストールさせるわけにはいきません
3. かな漢字変換は高速に、なめらかに動作する必要があります。RubyやPythonは遅すぎてとても使えません
4. 既存の資産を活用できるからです。D言語はC/C++のライブラリを呼び出すことができます

### Go言語とかHaskellもあるよ？
他にも優れた言語はたくさんありますが、習得するのが難しかったり、いまいち好きになれなかったりということがありました(例えばGoだと抽象化まわりが好きになれなかった)


## 作り続けないの？
作りたいとは思うのですが、今はもっと面白いと思える研究に取り組んでいるため、しばらくかな漢字変換には手を付けていません。また興味が湧いたら作ろうかなと思います。

## おわりに
来年もがんばる
zshで略語を展開する(vimのiabみたいなの)プラグイン作った

# はじめに
以下の記事で、zshのグローバルエイリアス(`alias -g`)の代わりに、vimのiabっぽい略語展開をする方法が紹介されています。

* [zshの個人的に便利だと思った機能（suffix alias、略語展開）](http://qiita.com/matsu_chara/items/8372616f52934c657214#略語展開iab)
* [[zsh]vimのiabのよう略語展開](http://d.hatena.ne.jp/rubikitch/20071104/1194183191)
* [examples:zleiab [ZshWiki]](http://zshwiki.org/home/examples/zleiab)

実際設定してみてむちゃくちゃ便利だったんですが（どう便利なのかは上の紹介を読んでみてください）、以下の点がちょっと不満になってしまいました。

* <kbd>Space</kbd>を押さずに<kbd>Enter</kbd>を押しちゃった場合に、略語が展開されない。（まぁ、これは`alias -g`で同じ定義をしたらよいのですが。）
* 展開する文字列を実行時に決定したい。（`alias -g B="\$(git symbolic-ref --short HEAD)"`って定義すると、`B`が現在のブランチ名に展開される、みたいなことがしたかった。）

# そんなわけで……
[zsh-abbrev-alias](https://github.com/momo-lab/zsh-abbrev-alias) ってプラグインを作ってみました。


インストールすると`abbrev-alias`というコマンド(というかzsh function)が追加されます。このコマンドを使ってエイリアスを登録すると、略語の展開対象として登録しつつ、`alias`コマンドでエイリアスの定義も行います。

# 使い方
## インストール

```zsh:.zshrc
zplug "momo-lab/zsh-abbrev-alias"
```

私は[zplug](https://github.com/zplug/zplug)を使っているので、それでしか動作確認してません。ごめんなさい。
プラグインマネージャを使っていれば、同じように設定したら動くと思います。たぶん。きっと。

## 略語の登録
ほぼ、`alias`と同じように使えます。

```zsh:.zshrc
abbrev-alias -g G="| grep"  # グローバルエイリアスの例題でよくあるやつ
```

とすると`G`というエイリアス＆略語が登録されます。

## 展開

```zsh
$ ps aux G
```
としたところで、<kbd>Space</kbd>を押すと、`G`が展開されて以下のようになります。

```zsh
$ ps aux | grep
```

便利！

展開をしたくない場合は、<kbd><kbd>Ctrl</kbd>+<kbd>x</kbd></kbd>してから<kbd>Space</kbd>を押してください。

また、aliasも同時に定義しているので、エイリアスを入力した後そのまま<kbd>Enter</kbd>を押しても大丈夫です。

## ３種類のタイプ
zsh-abbrev-aliasには３種類のタイプ（`-g`、`-c`、`-f`）があります。ここではそのそれぞれを紹介します。

### `-g` グローバルエイリアス
`alias -g name=value`のように動きます。エイリアスを入力して<kbd>Space</kbd>を押すと展開を行います。通常の`alias -g`の代わりに使うとよいです。

例は上述しているので省略します。

### `-c` コマンドエイリアス
`alias name=value`のように動きます。コマンドの先頭でこのエイリアスを入力して<kbd>Space</kbd>を押した場合にのみ展開を行います。通常の`alias`の代わりに使うとよいです。

```zsh:使用例
$ abbrev-alias gc="git commit -v"
$ gc                   # ←ここでSpaceキーを押すと…
　　↓
$ git commit -v        # ←このように展開されるので、オプションを消したりできます。

$  gc                  # ←このように、先頭にスペースなどの文字がある場合は展開しません。
```

### `-f` ファンクションエイリアス
`alias -g name=\$(value)`のように動きます。展開を行う際に、`value`の実行結果に置き換えてくれます。

```zsh:使用例
$ abbrev-alias -f B="git symbolic-ref --short HEAD"
$ git symbolic-ref --short HEAD
master
$ git push origin B         # ←ここでスペースキーを押すと
    ↓
$ git push origin master    # ←コマンドの実行結果が展開されます。
```

`alias -g B="\$(git symbolic-ref --short HEAD)"`というエイリアスも定義しているので、<kbd>Space</kbd>を押さずに<kbd>Enter</kbd>を押しても大丈夫です。

# 終わりに
もう、`alias`は全部、`abbrev-alias`に置換してもいいんじゃないかな、かな。

…とか言いつつ、今日一日でえいやって作ったものなので、バグやらなにやらありそうです。何かありましたら、PRでもissueでもここでのコメントでなんでもいいのでフィードバックいただけると嬉しいです。
Instabugの導入について

# 概要
InstabugというiOS、AndroidアプリのユーザーフィードバックをサポートしてくれるSDKの導入方法についてです
今回はiOSでの導入方法をまとめました。

# Instabugとは

https://instabug.com

- SDKのインストールと少しのコードだけで、アプリから問い合わせ機能を実装することができます。

<img width="434" alt="スクリーンショット 2016-11-24 13.04.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/69901/ad97732d-9295-baa0-5edb-23e401e79dab.png">


## Instabugでできること

- 運営への問い合わせ(チャット形式: 有料)
- バグ報告
- 改善提案
- スクリーンショット、画像の添付
- スクリーンショットに書き込み
- 動画の撮影

<div>
<img src="https://qiita-image-store.s3.amazonaws.com/0/69901/3c8701e7-d9e5-439e-479b-f20e89d759ec.png"  height=300 align="left">

<img src="https://qiita-image-store.s3.amazonaws.com/0/69901/62aedaa7-fde4-b107-de0a-931a7f81eac6.png" height=300>

<img src="https://qiita-image-store.s3.amazonaws.com/0/69901/69bc7b43-05ef-1985-bf6a-af261c8c0d91.png" height=300>

<img src="https://qiita-image-store.s3.amazonaws.com/0/69901/7a7032e5-0e21-6a2d-c761-02772a075c03.png" height=300>
</div>
また、Webサイトのダッシュボードも使いやすいです。
有料プランにはなりますが、3rd Party IntegrationとしてSlackやGithub、Trelloも使えるのは便利だと思います。

詳細はこちらhttps://instabug.com/



# 使い方

会員登録などは省きます。

## SDKの導入
InstabugのSDKを導入する方法はマニュアルもしくはCocoapodsの二種類があります。
Cocoapodsでインストールする手順は以下のとおりです。

**1. SDKのinstall**
Podfileに`pod 'Instabug'`を追加して`pod install`
**2. AppDelegateに設定**
AppDelegateに`import Instabug`を追加して`application:didFinishLaunchingWithOption:`に以下のコードを書くだけです。

```objc
Instabug.start(withToken: "token", invocationEvent: .shake)
```

これだけで、アプリを起動中にデバイスを振るとレポート画面が表示されます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/69901/3c8701e7-d9e5-439e-479b-f20e89d759ec.png"  height=300>



# Instabugの設定について
Instabugではバグレポート画面を表示するための動作方法の設定や、デザインの変更ができるメソッドがあります。

**バグレポートを表示する方法**

`IBGInvocationEvent`というenumで定義されています。
`start(withToken token: String, invocationEvent: IBGInvocationEvent)`と
`invoke(with invocationMode: IBGInvocationMode)`
のメソッドで設定できます


```objc
case none                // 自分でバグレポートの表示を実装する
case shake               // デバイスを振る
case twoFingersSwipeLeft // ２本指で左にスワイプ
case rightEdgePan        // デバイスの右端から左にスワイプ
case floatingButton      // 右下にfloatingButtonを表示
```	


**Instabugの説明表示**
ユーザーにInstabugの使い方を説明するメッセージを表示できます。
何も設定をしなければ、初回アプリ起動時に表示できますが、自分で制御することも可能です。

<img src="https://qiita-image-store.s3.amazonaws.com/0/69901/5662836b-911a-0836-4151-e8402f87b1df.jpeg" height=200>



```objc
Instabug.setIntroMessageEnabled(false) // 自動表示をOff
Instabug.showIntroMessage() // メッセージを表示
```



**表示変更**
テーマカラーとプライマリーカラー、テキストの変更ができます。

```objc
open class Instabug : NSObject {

...

setColorTheme(_ colorTheme: IBGColorTheme)
setPrimaryColor(_ color: UIColor)
setString(_ value: String, toKey key: IBGString)
```



# まとめ
- 導入方法も簡単で、無料プランでもある程度使えて便利なのでおすすめです！
- [有料プラン](https://instabug.com/pricing)になると、クラッシュ情報やAnalyticsを使うことができるので課金について検討してみたいと思います。
Power Shell で再帰的なスクリプトブロック２


下記の方法以外でも、自分自身を束縛するスクリプトブロックを作れたのでシェアです（誰得）。
他にも方法があれば教えてください。

* [Power Shell で再帰的なスクリプトブロックとパーサコンビネータ](http://qiita.com/yumura_s/items/122375fcad6c7954b298)


# $MyInvocation.MyCommand.ScriptBlock

```.ps1
$sb = {$MyInvocation.MyCommand.ScriptBlock}

$sb -eq (& $sb) # => True
```

# GetNewClosure()

以前の記事と同じ原理

```.ps1
$sb = &{
    $bind = @{}
    $bind._ = {$bind._}.GetNewClosure()
    $bind._
}

$sb -eq (& $sb) # => True
```

# New-Module

```.ps1
$sb = New-Module -AsCustomObject {
    $Script:bind = {$Script:bind} 
    Export-ModuleMember -Variable bind
} | Select-Object -ExpandProperty bind

$sb -eq (& $sb) # => True
```

# PSModuleInfo

```.ps1
$moduleInfo = New-Object System.Management.Automation.PSModuleInfo $true
$sb = $moduleInfo.NewBoundScriptBlock({$Script:bind})
& $moduleInfo {$Script:bind = $args[0]} $sb

$sb -eq (& $sb) # => True
```
enable_shared_from_this派生クラスの初期化パターン

enable_shared_from_thisから派生することで、クラスのメンバ関数内でshared_from_this関数により自身のshared_ptrを取得することができます。

大変便利なんですが、以下のような注意点があります。

- オブジェクトをshared_ptrで管理している必要がある
- コンストラクタ内でshared_from_this関数が使えない

# 初期化パターンのコード例

次のような初期化パターンにより、上記問題を解決することができます。

```cpp
#include <memory>

class Foo : public std::enable_shared_from_this<Foo>
{
    using SpFoo = std::shared_ptr<Foo>;
    
// 1.自由にコンストラクタを使用できないようにする
    Foo(){}
    
    void initialize()
    {
// 2.初期化時にshared_from_this()を使いたいときはinitialize関数内で使用
        auto sp = shared_from_this();
 
        // 何かの処理
    }

public:
// 3.利用者は必ずcreate関数経由でshared_ptr管理されたオブジェクトを使用
    static SpFoo create()
    {
        struct OBJ : Foo{};
        auto sp = std::make_shared<OBJ>();
// 4.create関数内で初期化処理を実施
        sp->initialize(); 
        return sp;
    }   
};

int main()
{
    auto foo = Foo::create();
    
    return 0;
}
```

# 初期化パターンのポイント

## 1.privateコンストラクタにする。
オブジェクトをshared_ptrで管理する必要があるため、コンストラクタをprivateにすることで自由にオブジェクトを生成できなくします。

## 2.初期化時にshared_from_this関数を使いたい場合はコンストラクタではなく、initialize関数に記載する。
コンストラクタではオブジェクトの生成が完了していないため、shared_from_this関数が動作しません。そのため、コンストラクタの後に実施する初期化関数でshared_from_thisが必要な初期化処理を記載します。

## 3.create関数でshared_ptrで管理されたオブジェクトを生成する。
create関数によりshared_ptrで管理されたオブジェクトを生成できるようにします。std::make_sharedでprivateコンストラクタを呼ぶにはちょっとしたテクニックが必要になります。

[クラス内テンプレートクラスと継承を利用してmake_sharedでprivateコンストラクタを呼ぶ](http://qiita.com/ToshiManaPlus1/items/b98e50fa3af771fd0d60)

## 4.create関数でオブジェクトを作ってからinitialize関数を実施する。
initialize関数の実施を利用者に任せてしまうと、初期化忘れが起きる可能性があります。そのため、create関数で得られたオブジェクトを返す前に初期化処理を実施します。
動的にdefault_url_options[:host]をセットする

```
Missing host to link to! Please provide the :host parameter, set default_url_options[:host]
```

というエラーに対処した話。Controllerなど以外では`request`の情報がないので`:host`を別途指定しないといけない。

やりたいこととしては`root_url`をController以外で使いたかったから。具体的にはWebhookで投げるテキストにURLを含めたかった。

```ruby
module Webhooks
  class Send
    include Rails.application.routes.url_helpers #root_urlを使うため。

    def initialize
    end

    def call
      url = root_url
    end
  end
end
```

普通はというかホスト名が決め打ちできるなら[Action Mailer の基礎 | Rails ガイド](http://railsguides.jp/action_mailer_basics.html#action-mailer%E3%81%AE%E3%83%93%E3%83%A5%E3%83%BC%E3%81%A7url%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B)にあるように、`config/application.rb`に書くのがいいようだが、今回はそうではない。
しかたがないので`ApplicationController`でセットするようにした

```ruby
class ApplicationController < ActionController::Base
  before_filter :set_host

  def set_host
    Rails.application.routes.default_url_options[:host] = request.host_with_port
  end
end
```