OmniAICreator/Qiita-1.07M huggingface dataset:
同人音楽超まとめ JSON API 解説

この解説は非公式のものです。
##そもそも同人音楽超まとめとは
ぜひこちらのリンクで試聴を聞きながらこの記事を読んでください。
（音がなります）
http://dm-matome.com/events/2015_m3_spring

同人音楽超まとめ（以下超まとめと呼びます）では
これまで知らなかったいいサークルと巡りあうために
サークル一つ15秒再生して一つのイベント3～4時間で回れるようにして
その情熱と多様性をくまなく汲み取っていこうというものです。
しかもデータは管理人さんたちが自力で探しては手入力という…
そんな血と汗のニオイがしそうなデータを活用できるのが
この超まとめのJSON APIなのです。
##で、「同人音楽超けんさく」なるものをつくりました
![d811b4dccbf95f9dd91c06cf226a67f6.png](https://qiita-image-store.s3.amazonaws.com/0/56968/d6a32c3a-d061-759f-fba9-8cb0b8909782.png)
http://dm-search.dojin.com/index.php
超まとめにはテキストによる検索に対応していないことと、
イベントを越えて作品、サークルを探す機能がないのでつくりました。
サークル名の検索結果URLを貼るだけでサークルの簡易宣伝ページが出来るとか
逆にイベントで見つけたサークルのこれまでの作品をチェックするなど
いろんな場面で活躍出来ると思います。
##JSON入手方法

![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/56968/be7f2b13-a68b-4428-284b-5b06d3fe3d7d.jpeg)

画像の位置にある「json 形式で表示」のリンクから取得してください。
各イベントごとJSONのおいているURLが別なので注意

##全体 一例
```
{"id":"580", //一意のid
"title":"Azure Hardcore vol.2", //作品タイトル
"circle":"AzureLine", //サークル名
"official_site_url":"http:\/\/circleazureline.sitemix.jp\/", //公式サイト
"type":"1", //試聴に利用しているサービスはなにか
"unique_parameter":"89550826", //サービスでどの曲かを示す部分
"short_mode_start":"474", //試聴開始時間
"source_sound_url":"http:\/\/soundcloud.com\/azure_line\/alcd-0007-azure-hardcore-vo-2", //試聴に使っているURL
"img":"http:\/\/dm-matome.com\/cache\/thumbnail\/580\/original.jpg"} //試聴
```
JSONを直に開くと日本語が崩れているがutf-8で表示すれば大丈夫
## 各種説明
###id
作品ごとに振られた整数の連番のid。
たぶん登録順に振られている。
イベント間でのダブりはない模様。
プレイリストの機能のパラメータとして利用することが可能
ttp://dm-matome.com/events/2015_m3_spring?checkList=一つ目のid.２つ目のid…
###title, circle
タイトルとサークル名。
全角英数字や記号を使われていることが多いので検索などの扱いには注意。
###official_site_url
公式サイト。作品の特設だったり、サークル全体のページだったりとまちまち。
###type
試聴に何を使っているかが決められている。
1. SoundCloud
2. YouTube
3. mp3
4. ニコニコ動画
5. 視聴なし
###unique_parameter
動画の埋め込みコードを使う際にその試聴動画を特定するのに必要な英数字。

ただしニコニコ動画にはsmとnmのパラメータとなる動画があり、
それぞれ埋め込みコードが違う。
どちらもtype:4として扱い、区別されていないので自前で判定する必要がある。

余談だがYouTubeとニコニコ動画は埋め込みで使えるunique_parameterはURLに記述されているが
SoundCloudはURLとは別にunique_parameterがある。
###short_mode_start
超まとめでの試聴を何秒目から開始するかを決めている。
埋め込みコードのパラメータで開始位置を決められる。
超まとめでは動画などのパラメータに指定しているか、超まとめ独自のプレイヤーから指定しているかは不明。
###source_sound_url
試聴に利用しているサービス、mp3のURL。
type:5の試聴がない場合、サークルや作品の特設サイトのURLがここに来る。
その場合、official_site_urlとは別のURLが貼られるケースも多い。
###img
同人音楽超まとめで試聴を再生していないとき表示している画像。
確認する限り、画像はすべて超まとめのドメイン上に置かれている。
一見、正方形のものが多いが、保存上はそうでもないものもある。
(CDジャケットは正方形なので自然と正方形の画像は多い傾向にある)
***
以上です。
この情報は2015/05/15の情報で、超まとめの管理人、開発者の見解は一切ないものなので間違っていたり、
網羅しきれていない部分があるので
補足事項や気がついたことがあればぜひツッコミお待ちしております。
Modern Web 2015 講者簡報


以我自己有聽的場次為主

*簡報所有權為發佈者擁有，錄音檔則為其他會眾分享*

協作文件：[hackpad](https://hackpad.com/modernweb2015--6j6ZC3T11J3)

# 第一天

## Brendan Eich - JavaScript at 20 Years

- Brendan Eich, [@BrendanEich](https://twitter.com/brendaneich)
- http://brendaneich.github.io/ModernWeb.tw-2015/ ([source](https://twitter.com/BrendanEich/status/599094008653041664))

## 蔡學鏞 - 三維架構方法

- 蔡學鏞 [微博](http://tw.weibo.com/rebol)
- [蔡学镛架构设计方法-2014-8-17.pdf](http://vdisk.weibo.com/s/q8FZMJO4W2qq) - 本次簡報還沒放出來，這是以前的簡報，也具參考價值

## Poga - 聽說 KKTIX 現在都是用 Go 寫的

- Poga [@devpoga](https://twitter.com/devpoga)
- http://www.slideshare.net/poga/kktix-go-modernweb-2015

## 唐鳳 - 開源之道，Open Source Enlightenment

- [簡報](http://www.slideshare.net/autang/open-sourceenlightenment2015)
- [簡報 + 附註](https://speakerdeck.com/audreyt/kai-yuan-zhi-dao-2015-fu-jiang-zhe-fu-zhu)
- 去年 Github Patchwork Taipei 的錄影 - https://www.youtube.com/watch?v=KqKwc4bcOhI

## 邱煜庭 - SEO真的只要做這些事就好

- 邱煜庭(小黑) [@backtrue](https://twitter.com/backtrue) [部落格](http://epromotor.pixnet.net/)
- http://bit.ly/MW2015Black
- 錄音檔 - https://drive.google.com/file/d/0B5zTPBGOMVdhc1RMTlI5Y2xaVDQ/view?usp=sharing

## Marty Hsu - Web + Arduino 實在有夠潮!
- Marty Hsu [webduino](http://webduino.io)
- http://www.slideshare.net/martyshu1/2015-web-conf-web-arduino
- 錄音檔 - https://drive.google.com/file/d/0B5zTPBGOMVdhQjJxaE94UDlvSXc/view?usp=sharing

## Paul Li - The Speed & The Enthusiasm (速度與激情)
- Paul Li [Facebook](https://www.facebook.com/mei.studio.li)
- http://goo.gl/Z7mu1B

# 第二天

## SPEEDING UP THE WEB WITH PHP 7
- Rasmus Lerdorf [@rasmus](http://twitter.com/@rasmus)
- http://talks.php.net/modernweb15#/

# 戚務漢(Caesar) - 從失敗中學習打造技術團隊

- Caesar [@clonncd](https://twitter.com/clonncd)
- 投影片

# GSLin - 用 Vagrant 與 Docker 拯救世界

- GSLin [@gslin](https://twitter.com/gslin)
- 投影片
『はじめてのパターン認識』章末問題 4.3 解答

テキストに載っている模範解答には下記の3点の問題があるように思います.
1. 微分可能でない点がある関数 $\mathcal{L}(s)=\sum_{i=1}^{N} \left|s-x_i\right|$ を微分している.
2. 微分可能でない点が最小値を取りうるか検証していない.
3. 微分係数が0になるような点が存在するか検証していない.

そのため, これを解消する自分なりの解答を作ってみます. なお, 以下では $\lceil x \rceil$ は $x$ 以上の最大の整数, $\lfloor x \rfloor$ は $x$ 以下の最大の整数を表すものとします.

---

$\varepsilon_i=x_i-s$ がラプラス分布に従うことから, $x_i$ の分布関数について

```math
f(x_i-s)=(\alpha/2)\exp\left(-\alpha\left|x_i-s\right|\right)
```
が成り立つ. よって尤度関数は

```math
L(s)=\prod_{i=1}^N (\alpha/2)\exp\left(-\alpha\left|x_i-s\right|\right)\\
\propto \exp \left(-\sum_{i=1}^N\left|s-x_i\right|\right)
```

よって尤度関数を最大化するためには連続関数 $\mathcal{L}(s)=\sum_{i=1}^{N} \left|s-x_i\right|$ を最小化すればよい.

$x_i$ が小さい順に並んでいるとしても一般性を失わない. また, $x_0=-\infty, x_{N+1}=\infty$ としておく. このとき, $x_k<s<x_{k+1}$ であれば, 

```math
\mathcal{L}(s)=\sum_{i=1}^k (s-x_i)-\sum_{i=k+1}^{N}(s-x_i)\\
=(2k-N)s-\sum_{i=1}^{k}x_i+\sum_{i=k+1}^{N}x_i
```
ここで,

```math
2k-N<0 \Leftrightarrow k<\frac{N}{2} \Leftrightarrow
 k+1\leq\left\lceil\frac{N}{2}\right\rceil \Leftrightarrow
 s < x_{\left\lceil N/2 \right\rceil}, \\
2k-N>0 \Leftrightarrow k>\frac{N}{2} \Leftrightarrow
 k \geq \left\lfloor\frac{N}{2}\right\rfloor+1
\Leftrightarrow s>x_{\lfloor N/2 \rfloor+1}
```
よって $\mathcal{L}(s)$ は, $s < x_{\lceil N/2 \rceil}$ のとき減少関数, $s > x_{\lfloor N/2 \rfloor+1}$ のとき増加関数になり逆も成り立つ. ゆえに, $\mathcal{L}(s)$ を最小化する $s$ は

```math
x_{\lceil N/2\rceil} \leq s \leq x_{\lfloor N/2 \rfloor+1}
```
を満たす $s$ であり, これが $s$ の最尤推定量である.

---

特に $x_i$ の中央値は最尤推定量のなす区間に含まれるほか, $N$ が奇数のときは最尤推定量は中央値ただひとつしかありません.
iOS＋実機で課金テストするために必要な準備

・itunes connect でアプリを登録する
・itunes connect で登録したアプリに課金アイテムを登録する
・itunes connect -> 契約・税金・口座情報を登録する(下記urlを参照)
・itunes connect ->ユーザーと役割->sandboxテスターにテストアカウントを登録する
・実機：普段ログインしているApple IDをログアウトする

http://blog.livedoor.jp/hinayukaringo/archives/3091936.html

こんくらい・・・？
Githubの草の色でひとの活動量を判断してはいけない理由

Githubの草が緑々しているのを見て、「おー、すごい活動してる！」とか思うのはちょっと待ってください。
また、草が黄色いからといって馬鹿にしてはいけません。

# こちらをごらんください。

## とあるGithub初心者の芝生

![SS 2015-05-15 23.30.23.png](https://qiita-image-store.s3.amazonaws.com/0/18740/bb34fa8c-927b-89a9-4345-f150d772b491.png)

14コミットで深い緑です。

## 私の芝生

https://github.com/DQNEO

![SS 2015-05-15 23.29.51.png](https://qiita-image-store.s3.amazonaws.com/0/18740/18bcdbe1-e987-f27c-ca24-4dbb95279a34.png)

82コミットしたのに黄色です。

私の芝生は、ある日突然、緑が生い茂っていた状態から一面黄色になってしまったのです。

# 1日に300コミットとかすると、一気に閾値があがって過去の草が全部黄色になる

<blockquote class="twitter-tweet" lang="en"><p lang="ja" dir="ltr">Githubの草生やし活動には落とし穴がある。&#10;1日300コミットとかすると、その瞬間に色の閾値が上がってしまい、過去1年内の濃い緑が全部薄い緑に変わってしまう。&#10;全俺が泣いた。&#10;これ豆な( ˘ω˘)</p>&mdash; DQNEO (@DQNEO) <a href="https://twitter.com/DQNEO/status/598506917221138432">May 13, 2015</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

(※300コミットは事故です。cloneしてpushしたら重複カウントされたっぽい)

芝生の色は、その人の過去１年間のなかでの相対的な高低差を表してるだけなのです。

# そうはいっても草生やすのは楽しい

草の色が励みになるのは事実なので、自己満足だと割りきって楽しみましょう！

# TIPS:自分の草を客観的に見る方法

自分の草の色を第三者の視点で見たい場合は、シークレットタブで自分のプロフィール画面を開くとよいでしょう。
【質問】脳波の波形を機械学習・パターン認識できるライブラリ教えてください！

初めてQiitaに投稿します。
記載の仕方や情報の不足があったら、ご指摘ください :sweat: 

#　脳波の波形を機械学習・パターン認識できるライブラリをご存知ないでしょうか？


複数の画像を思い浮かべた脳波のパターンを記憶しておき、
ある画像を思い浮かべて、どれを思い浮かべているかを判定したいと思っています。

それを実現するために波形を機械学習・パターン認識できるライブラリを探しています。
もしご存知でしたら教えていただけないでしょうか？
※些細な情報でもかまいません。
※言語は問いません。Javascript(Node.jsも)やJavaなら分かるのでその方が嬉しいですw


* * *
【実現したいイメージ】
①以下のように、事前に被験者に画像を思い浮かべてもらい、その脳波のパターンをプログラムに学習させておく。
　画像　　　　脳波の波形
「画像A」　：　〜^^〜
「画像B」　：　^^〜^^
「画像C」　：　^〜^^〜

②被験者に画像Aを思い浮かべてもらう。

③波形のパターンを比較し、プログラムが「画像A」と判断する。

④画像Aを表示する。


* * *

脳波の波形は、一度に8つ（α波、β波など）検出できるので、その複合的な値をパターンとして覚えさせたいです。

機械学習に関して知識がなく、さんざん調べたのですがそれらしき物がないため、ぜひ皆様のお力をいただければと思っております。

お助けください :persevere:
metric_fu を利用して Ruby のボットフレームワーク Ruboty と Lita の循環的複雑度を比較する

## <i class="fa fa-gears" style="font-size:1em;"></i> 概要
metric_fu を利用して Ruby のボットフレームワーク Ruboty と Lita の循環複雑度を比較します
## <i class="fa fa-search" style="font-size:1em;"></i> metric_fu について
metric_fu は Ruby の様々な静的解析ツールをまとめて提供してくれる gem です。
今回は、循環複雑度のみを参考にするため、 Saikuro の結果のみを確認します。
## <i class="fa fa-cloud-download" style="font-size:1em;"></i> インストール

~~~bash
$ gem install metric_fu
$ gem install ruboty
$ gem install lita
~~~

* metric_fu の実行

対象プロジェクトのルートフォルダで、 `metric_fu` を実行するだけです。
レポートは、デフォルトで %プロジェクトルート%/tmp/metric_fu/output/index.html に出力されます

~~~bash
$ cd /path/to/ruboty
$ metric_fu
******* STARTING METRIC cane
******* ENDING METRIC cane
******* STARTING METRIC churn
******* ENDING METRIC churn
******* STARTING METRIC flay
******* ENDING METRIC flay
******* STARTING METRIC flog
******* ENDING METRIC flog
******* STARTING METRIC saikuro
******* ENDING METRIC saikuro
******* STARTING METRIC reek
******* ENDING METRIC reek
******* STARTING METRIC roodi
******* ENDING METRIC roodi
******* STARTING METRIC stats
******* ENDING METRIC stats
******* STARTING METRIC hotspots
******* ENDING METRIC hotspots
******* SAVING REPORTS
~~~

## <i class="fa fa-check-circle" style="font-size:1em;"></i> 前提

|Name|Version|
|:--|:--|
|metric_fu|4.11.4|
|ruboty|1.2.2|
|lita|4.3.2|

## <i class="fa fa-recycle" style="font-size:1em;"></i> 循環複雑度
循環複雑度については下記参照。
<i class="fa fa-external-link" style="font-size:1em;"></i> [Hatena - TbpgrBlog - ＼バグだー！／ システムに巣食うバグさんからみた快適さ、循環複雑度（ Cyclomatic Complexity ） とは？ ＼バグだー！／](http://tbpgr.hatenablog.com/entry/2015/05/15/231825)

### 循環複雑度とバグ混入率

|循環的複雑度|複雑さ|バグ混入率|
|:--|:--|:--|
|10以下|シンプルなプログラム。リスクがほとんどない|25％|
|40以上|ほどほどの複雑さのコード。ややリスクがある|50％|
|50以上|かなり複雑なコード。リスクがある|70％|
|75以上|いかなる変更も誤修正を生む|98％|

### <i class="fa fa-gear" style="font-size:1em;"></i> Ruboty
メソッドの循環複雑度です。

なんと、 Max で 4 しかない非常に良い構造であることが分かります。
メソッドの行数も、ほとんどは 2 行から 4 行程度で、
もっとも行数が多いメソッドですら、 11 行です。

![ruboty.png](https://qiita-image-store.s3.amazonaws.com/0/43480/ff0b445e-6c1a-0958-4ed4-d08d203e485a.png)

### <i class="fa fa-gear" style="font-size:1em;"></i> Lita
メソッドの循環複雑度です。

Max で 9 と、 ruboty よりは複雑ですが、それでも「非常に良い構造」の範囲内です。
もっとも行数が多いメソッドは 30 行です。
しかし、一般的なスパゲッティコードなどと比べれば、かなり簡潔な処理でしょう。

![lita.png](https://qiita-image-store.s3.amazonaws.com/0/43480/a7d499f7-d366-26c7-f7db-d70c9c323b67.png)

## <i class="fa fa-flag-checkered" style="font-size:1em;"></i> 総括
Ruby の bot フレームワークはどちらも複雑度が低く、簡潔なメソッド群で構成されている、
ということが分かりました。

中でも、 Ruboty の複雑度の低さ、行数の少なさは群を抜いています。
なんだかライブラリの利用者として安心感がありますね。

## GitHub Repositories
* <i class="fa fa-external-link" style="font-size:1em;"></i> [metric_fu](https://github.com/metricfu/metric_fu)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [ruboty](https://github.com/r7kamura/ruboty)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [lita](https://github.com/jimmycuadra/lita)

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Info-Q - Cyclomatic Complexity Revisited](http://www.infoq.com/news/2008/03/cyclomaticcomplexity)
setTimeout(...,0)などの使いドコロ

# 0ミリ秒、お待ちください〜
クライアントサイドのJavaScriptを使っていると、`setTimeout()`はそこそこ使う機会が来る関数かと思います。これは、
1. 実行する関数
2. 待機時間（ミリ秒単位）

という2つの引数を取って、指定時間後に関数を実行する機能です。…そこまではいいのですが、ときどき第2引数に0を指定するような使い方があります。「0ミリ秒に実行」だと、そのまま実行しても何も変わらないような気がするのですが、いったいどういう意味があるのでしょうか。

# JavaScriptはシングルスレッド
`postMessage`やWeb Workerといった一部の機能を除いて、ブラウザ上のJavaScriptは**シングルスレッドで**動いています。つまり、関数に入っていないトップレベルコードなら読み込まれた時点から実行完了するまで、コールバック関数であれば呼び出されてからその関数を抜けるまで、そこにあるコードしか実行できません。

そういうわけで、その分割できない1ブロックで大量の処理を行おうとしてしまうと、ブラウザは入力すら受け付けない状態になり、さらに続けば「処理を中止しますか？」ダイアログを召喚することになってしまいます。

# 処理分割のためのsetTimeout
純粋なデータ処理であればWeb Workerに回す方法もありますが、DOM操作が多い場合にはそうも行きません。ただ、もちろんブラウザを固めたりしてはクライアントコードとして失格なので、`setTimeout`を使うことで処理を分割する手法が存在します。
## 内部動作
じつは、`setTimeout`はJavaScriptの言語機能ではなくてブラウザ側の機能です。これも**一種のイベントコールバック**だと考えるとスッキリします。
1. setTimeoutで関数を登録する
2. 登録した関数から抜けてブラウザに処理が戻る
3. ブラウザが（他の処理をしつつ）タイミングが来れば関数を呼び出す

0ミリ秒で登録した場合にも、いったんブラウザに戻ってからになるので、JavaScriptの実行中に溜まったイベントの処理なども行われます。

## 大量のDOM操作に使う
例えば、テーブルのセル1000個が入ったDOM配列があって、1セルごとに違った処理をしないといけないけど、1つに付き5ミリ秒かかってしまうとします。そのまま真っ正直に実行すれば5秒かかってしまい、操作性を落としてしまいます。このようなときに、`setTimeout`を使うことで、連続した実行時間を分割できます。

```js:tables.js
//tdsが、大量のテーブルセルが入ったDOM配列
var length=tds.length,start=0;
var MAX_EXECUTION_COUNT=100;
setTimeout(function loop(){
    for(var i=start;(i<start+MAX_EXECUTION_COUNT) && i<length ;++i){
        //tds[i]を使って作業をする
    }
    if(i<length){
        start += MAX_EXECUTION_COUNT;
        setTimeout(loop,0);
    }
},0);
```

よく、関数の引数として渡す関数リテラルが「無名関数」と呼ばれますが、上の例のように名前を付けることもできます（この名前は関数の中でのみ有効で、外のスコープを汚すことはありません）。
## 何かを待機する
もちろんコールバックがあるようなものであればそれで受け止めればいいのですが、そうでないものを待つ場合は`setTimeout`でブラウザに戻しつつ待たないとJavaScriptのループしか実行しなくなってしまって、待つべきイベントが実行されないことになってしまいます。

ここでは、とあるライブラリの動的ロードを待ってみます。

```js:load_lib.js
//正しく書くのが面倒なので、jQueryで書く
$('<script></script>').attr('src','https://some-cdn.com/some_library.js')
.appendTo('head');

//上の読み込みが済んでから実行するコード
(function onLoad(){
    if(!window.SomeLibrary){
        setTimeout(onLoad,0);
        return;
    }
    //以下、SomeLibraryを使ったコード
    SomeLibrary.useFeature();
})(); //その場で実行
```

もちろん、1ミリ秒でも早く実行したいのでなければ、0でなくてタイムラグを付けることも可能です。

# 余談
`setTimeout(0)`と書いても、実際には最低4ミリ秒の遅延が起きるとのことです。あと、`setTimeout`は数値を返して、その返り値を`clearTimeout`に渡せば実行を阻止できますが、あまり使う機会は来ない気もします（実行が終わった後に渡してもエラーは起きませんが、もちろん後の祭りです）。
サンプルサイトの作成備忘録

### secret_baseエラーに対する対処
rails sで上記エラー発生→config/secrets.ymlを作成で解決 (http://guides.rubyonrails.org/upgrading_ruby_on_rails.html#config-secrets-yml)

###bundle exec rubocop -a
robocop 単体ではコードの書き方判断のみだが、-a を付け加えることでコードの自動書き直しをしてくれる(バージョンの兼ね合いによる改善などに便利)

###strong parameters
rails3.2での脆弱性改善→受け取るパラメータの種類をきちんと定義するためprivate関数へ定義

##controllerを作成する意味
viewを作成する時のみ必要→なぜなのかについては、MVCアーキテクチャで確認(http://www.rubylife.jp/rails/ini/index7.html)

###同じ画面内で複数のモデル操作？→ただURLを作るだけ
resources :articles do
  resources :comments
end
→これだと、aritcle/:id/comment/:idというURLができてしまう

##login実装(今回は利用しない)
参考サイト：http://amigobellick.blog.fc2.com/blog-entry-10.html
http://ztbuz.hateblo.jp/entry/2013/12/29/091025

##passwordのハッシュ化
参考サイト:http://www.machu.jp/diary/20071023.html#p01

###model-attr_??? 思い出し
http://qiita.com/jun910/items/2a31a9163e9df4bd9134#attr_accessible-%E3%81%A8attr_accessor-%E3%81%AE%E9%81%95%E3%81%84

###特定のgemのみ実行
budle exec ***

###テーブルにカラムの追加
http://www.rubylife.jp/rails/model/index7.html#section2
ex.password_digest:string　をUserテーブルに追加
add_password_digest_to_users password_digest:string

##N対Nの従属関係をhas_many と　belongs_to 
参考サイト：http://hagetak.hatenablog.com/entry/2014/11/17/113720

##routeの必要タイミング
URLを作成するかどうか→処理するだけならいらない

###アプリケーションの他の場所で、現在ログイン中のユーザを取得するための機能作成
```
class ApplicationController < ActionController::Base  
  protect_from_forgery  
  force_ssl  
  private  
    
  def current_user  
    @current_user ||= User.find(session[:user_id]) if session[:user_id]  
  end  
    
  helper_method :current_user  
end 
```
参考サイト:ja.asciicasts.com/episodes/270-authentication-in-rails-3-1

###loginするためのフォームについて
> リソースであるテーブルデータを編集するためではないので、form_forではなくform_tagを使用しています。フォームはsessions_pathに送信されるので、新たにSessionsControllerを作成します。\

参考サイト:ja.asciicasts.com/episodes/270-authentication-in-rails-3-1

###中間テーブルとのリレーション(今回はtag,category)
collection_selectメソッドを利用
参考サイト：http://webos-goodies.jp/archives/50773406.html

#基本的に処理はmodelから！
なるべく、modelに処理を任せて、controllerなどの影響度を狭める→拡張や変更でmodelを書けばいい状態に設定しておく

#application_controller.rbで使うhelper_methodの意図
classで定義しているものにたいして、特定のメソッドをmoduleとして扱うため(moduleはhelperで定義されている)にhelper_methodを利用する。これは、moduleはオブジェクトの初期化などせず、ただ単に処理をするだけを期待するから

###予約投稿機能の実装について
参考サイト:http://qiita.com/seiya1121/items/ae74be7c7a1e6a22ea46
仕様書の書き方


仕様書を書く上で必要かなと思うことをまとめてみた。
対象者は、まだ仕様書なんて書いたことないよとか、何書くかいつも悩む、という方。

ここでいう仕様書とは、開発前の設計書というよりは、運用フェーズに引き渡す前に用意しておいたほうがよいドキュメント、という位置づけ。

## 仕様書の目的

* 仕様書を書く目的は、新しい人がチームに来た時に、スムーズに業務に取り組めること。
* また、「人は時間が経つと必ず忘れる」ので、将来の自分のためでもある。

## 大事なこと

1. 仕様書の目的を明確にする。
 * あれもこれも、と情報をたくさんのせても混乱する。
 * 「仕様書にもメンテナンスコストがかかる」ことに注意する。
2. 仕様書は正しい日本語で書く。
 * 主語をきちんと入れることが大事(〜のつもりで書いた、というのは知らない人には伝わらない)。
3. 情報は多すぎず、少なすぎず。
  * 条件について場合分けして整理したり、図を用いたりすると良い。
4. 前提と制約についてはしっかりと書く
 * 明らかに無駄な処理に見えても、過去の経緯や制約からそうせざるを得なかった、ということもある。
 * 仕様書に書いていないと、誰かが知らずに修正して、バグになる可能性もある。　　
5. 用語を統一すること
 * 同じものを指しているのに、あるところではAと言っていて、別のところではBと言っているというのは、読み手に混乱を招く。
 * 用語については、最初のページなどに用語集として書いておくと、なおわかりやすくなる。

## 書くべきこと
#### 仕様には大きく分けて以下のようなことを書いていくと良い。

1. 画面仕様
 * 各画面内での操作の動き、画面同士の関係を示す。
 * 全体構成図・遷移図もあるとわかりやすい。

2. 機能仕様
 * 個別の機能について、どういう目的で、何をするものなのかを示す。
 * 例えば、ユーザーの権限タイプによる挙動の違いなど、同じ機能を使う場合でも条件により処理が異なる時は、場合分けして整理しておくとわかりやすい。
 * 機能仕様は書いていくと細かくなりがちだが、「詳細ロジックはソースコードを読めば良い」ので、上述の前提や制約のようにソースを読んだだけではわかりづらいことを書いていくのが良い。
3. データ構造
 * テーブルデータ構造を示す。データが何を指しているのか、どういう制約があるのかを示す。
 * エンティティ間の関係性(カーディナリティ、オプショナリティ)も書いたER図がよい。

4. インフラ構成
 * どのバージョンのなんというミドルを使っているか、などくらいはまとめておく。
 * リクエスト制限、キャッシュ管理など、考慮が必要な情報があるなら、記載しておく。

4. その他
 * 外部システム連携など、必要に応じて記載していく。

## 最後に
 * レビューをしていると「そこはこういうつもりでした」と言う人が多い。単純な記入漏れの場合もあるかもしれないが、「わかってくれるだろう」という甘えが出ているときもあるかもしれない。
 * 基本的に、他人に自分の考えは伝わらないという前提で書いていったほうがよい。思いやりの気持ちで！
LGTM画像共有サービスをつくった話

## 概要

GitHubのPRでLGTM画像を貼ることが増えてきた。でもlgtm.inから探すのはけっこう面倒だったし、**ワンクリック**でGitHubに貼りたかった。
ということで、ワンクリックでLGTM画像をGitHubに貼ることが出来る「LGTM画像共有サービス」をつくったという話。

* Copyボタン押下で、クリップボードにMarkdown形式で画像URLをコピー
* Copyボタン押下で、画面下に他者の画面に画像が表示される
* 画像はlgtm.inから3枚ランダムに抽出

## 対応ブラウザ

いずれもPC版のみ対応

* GoogleChrome
* Firefox

## 環境

* ~~Heroku~~ EC2
* Node.js
* Express
* jade
* Socket.io
* jQuery
* node-validator

## 本題

LGTM-HUB
http://lgtm-hub.do7be.com/

## まとめ

~~herokuなので一定時間経つとサービス再起動で他の方の選択画像の情報が消えます。1枚も表示されなくても、誰も使ってないわけではないです！~~

AWSに移行しました！
Install windows10 on mac

# Install windows 10
http://itwebkatuyou.com/1613
http://pc-karuma.net/mac-bootcamp-windows8-install/
HDDは60GBで作成。

# Install boot camp
Boot Campコントロールパネルが見えない時は以下を再実行してみる。
E:\BootCamp\setup.exe

# Change keyboard
Change Key v1.50
http://satoshi.web5.jp/

変更内容
win → alt
alt → control
control → win
caps lock → control

# IME on/off
デフォルトは「option+~」で切り替えれます。
IMEの設定から「Ctrl+space」でも切り替えられるよう設定しました。

# Change scroll
http://pc-karuma.net/boot-camp-windows-scroll-natural/
regedit
``コンピューター¥HKEY_LOCAL_MACHINE¥SYSTEM¥ControlSet001¥Enum¥HID¥VID_****¥****¥Device Parameters``
FlipFlopWheelとFlipFlopHScrollの値を1に変更（複数あるのですべて変更する）
node.jsでJSONの不要な要素を削除したい


rssなんかをJSONに変換していらない要素を消したいケース。

```
delete jsonObject[key]
```

で、指定したキーの要素が削除できます。
rssをJSON化してtitleとsummaryとpubdateしか要らない！
というときは以下のように出来ます。
(変数"item"にrssをJSON化したオブジェクトが入っている場合）

```
var elements = ["title", "summary", "pubdate"]
for(var key in item) {
	if(elements.indexOf(key) < 0) {
		delete item[key];
	}
}
```
SBCLメモ: call調査

# SBCL探求メモ: call調査

## 起動
```
main (runtime.c)
|
+ load_core_file
|
+ create_initial_thread
  |
  + create_thread_struct
  |
  + initial_thread_trampoline 
    |
    + call_into_lisp_first_time / funcall0
```

## save core
```
save-lisp-and-die
|
+ (get-lisp-obj-address #'restart-lisp)
|  - これがcall先になる
+ save (define-alien-routine)
  |
  + save (runtime/save.c)
    |
    + save_to_filehandle
```

## sb!xc:compile-file
```
sb!xc:compile-file
|
+ sub-compile-file
  |
  + sub-sub-compile-file
    |
    + process-toplevel-form
      |
      + note-toplevel-form
      |  -> `x-compiling... `を表示
      + convert-and-maybe-compile
```

## convert-and-maybe-compile

```
convert-and-maybe-compile
|
+ ir1-toplevel
| |
| + ir1-convert-lambda-body
|   |
|   + ir1-convert-special-bindings
|     |
|     + ir1-convert-aux-bindings
|       |
|       + ir1-convert-progn-body
|         |
|         + ir1-convert
|           |
|           + ir1-convert-var
|             |
|             + reference-leaf
|             |
|             + reference-constant
|             |
|             + ir1-convert-functoid
|               -> def-ir1-translatorで定義した関数がinfoを経由して呼ばれる
|
+ compile-toplevel
|
+ hogehoge
```

## compile-toplevel

```
compile-toplevel
|
+ compile-component
  |
  + ir1-phases
  | |
  | + find-initial-dfo
  |   |
  |   + dfo-scavenge-dependency-graph
  |
  + %compile-component
    |
    + init-assembler
    |
    + ir2-convert
    |
    + ir2-optimize
    |
    + generate-code
    |
    + fasl-dump-component
    | |
    | + dump-after-code-object
    |   |
    |   + dump-code-object
    |     |
    |     + dump-object
    |       |
    |       + sub-dump-object
    |         -> listやsymbolなど、dumpするオブジェクトの種類に応じてdump処理を実行
    |
    + make-core-component

ir2-convert-conditional
|
+ (vop branch ...)
  - vopはマクロ (compiler/meta-vmdef.lisp)
  - branchは変数 (compiler/ppc/pred.lisp)
```

## sub-dump-object

symbolのdump: dump-symbol
その他の値のdump: dump-non-immediate-object
hardlink-osxで作成したディレクトリが削除できない問題


* [selkhateeb/hardlink](https://github.com/selkhateeb/hardlink)

Finderはもとよりrmコマンドでも削除できなくて困っていたのですが、ちゃんとreadmeに書いてありました。


```bash
$ hln -u destination
```

これで安全に削除できます。
DBLINK経由の操作のつまづきポイント

* TRUNCATE文は実行できない。

```
TRUNCATE TABLE TEST_TABLE@DBLINK


Error
[row:1,col:26] ORA-02021: リモート・データベースに対するDDL操作が無効です。
```

上記エラーが出る。
移行作業で、ターゲーット側にTRUNCATE＆INSERTする対象テーブルを管理するテーブルを作成して、ソース側からJP1からPL/SQLを実行するようなジョブを作りたかった。
TRUNCATEがソース側から実施できないため、管理テーブルのMVIEWをターゲーット側に作成して、TRUNCATEするようにして対処した。

* ソースデータベースにパーティション指定した、INSERT INTO ~ SELECT ができない
パーティション指定すると以下のエラーになる。
※SRC_TABLEとTGT_TABLEは同じカラム構成

```
INSERT INTO TGT_TABLE@DBLINK SELECT * FROM SRC_TABLE PARTITION (P_1505_15);

Error
[row:1,col:1] ORA-02070: データベースDBLINKはこのコンテキストではextended partition nameをサポートしません。

```

TGT_TABLEは1億件近いテーブルだが、日別のレンジパーティション構成なのでUSER_TAB_PARTITONを見て、INSERT＆COMMITするループのPL/SQLを作成したが、これができなかったので、パーティション名の命名規約から処理日（パーティションキー）をTO_CHAR＆TO_DATEで動的に作成してWHERE句指定することとした。

DBLINK越しのリモートデータベースへの操作はドキュメントで見当たらないのですが、まとまっている場所をご存知の方教えて下さい。
バージョンは11gR2 EEです。
Twitter Card-Summary Card with Large Imageの大きさの目安

#最低限担保する大きさ
下記ドキュメントを読むと、横280px以上、縦150px以上で、サイズは1MB以下の画像を用意する必要があることがわかります。

https://dev.twitter.com/cards/types/summary-large-image

```
URL to a unique image representing the content of the page. Do not use a generic image such as your website logo, author photo, or other image that spans multiple pages. Images for this Card should be at least 280px in width, and at least 150px in height. Image must be less than 1MB in size.
```

#じゃあ大きさはどうするのか
![](http://pthumbnails.5min.com/10366659/518332949_c_560_292.jpg)
ドキュメントに掲載されたtechcrunchの画像を参考にします。

こちらは　**横560px** **縦292px**　でした。これを基準にして画像を作成すれば、ドキュメントのTwitter cardのような画像は再現できるのではないでしょうか。
elementExists()でファイルがある時だけelementを出力する #CakePHP

CakePHP 2.3以降

`element.ctp`の有無を`elementExists()`でチェック、
ファイルがあれば出力、
表示したくない/必要なくなった後は`element.ctp`を削除し出力しない利用方法。

Viewの.ctpファイル内、

```php
<?php if ($this->elementExists('element')): ?>
<?php echo $this->element('element'); ?>
<?php endif; ?>
```

参考

* http://api.cakephp.org/2.3/class-View.html#_elementExists
TerminalからqicliコマンドでPepperのタブレットをネットワーク接続する

Pepperのタブレットは本体のWifiとは別のWifiネットワークでインターネットに接続しています。そのため、Web上の画像をタブレットに表示させたいときなど、インターネットに接続を試みるときに限ってタブレットがインターネットにつながってないという状況が良くあります。
アプリケーションの初期化処理でインターネットで必ず接続するという処理を入れてもいいのですが、基本的には一回接続設定するとつながった状態を維持するはずなので、アプリの組み込むのは少し違います。
そのため、アプリとは独立してTerminalから、qicliコマンドを実行してネットワーク接続する方法を紹介します。（今日アトリエアルデバラン秋葉原の方に教えていただいたのでその備忘）

## PepperへSSHで接続

以下でPepper本体にSSHで接続します。ユーザー/デフォルトパスワードは両方`nao`です。

```bash
% ssh nao@192.168.x.xxx
pass: nao
```

## Pepper内でqicliコマンドを実行

`qicli call [apiメソッド]` でAPIを直接実行できます。

今回利用したALTabletServiceのAPIはこちらです。
[ALTabletService API — Aldebaran 2.1.3.3 documentation](http://doc.aldebaran.com/2-1/naoqi/core/altabletservice-api.html)

* タブレットのWifiの状況をチェック

"IDLE"になっていました。

```
pepper [0] ~ $ qicli call ALTabletService.getWifiStatus
ALTabletService.getWifiStatus: "IDLE"
```

* enableWifiで有効にしてみる

"IDLE"のままです。

```
pepper [0] ~ $ qicli call ALTabletService.enableWifi
ALTabletService.enableWifi: null
pepper [0] ~ $ qicli call ALTabletService.getWifiStatus
ALTabletService.getWifiStatus: "IDLE"
```

* cofigureWifiで直接設定を行います。

`security`, `ssid`, `key` はそれぞれ置き換えてください。`security`は`wpa`, `wep`などです。詳細は、[ALTabletService API — Aldebaran 2.1.3.3 documentation](http://doc.aldebaran.com/2-1/naoqi/core/altabletservice-api.html)で確認して下さい。

```
pepper [0] ~ $ qicli call ALTabletService.configureWifi security ssid key
ALTabletService.configureWifi: true
pepper [0] ~ $ qicli call ALTabletService.getWifiStatus
ALTabletService.getWifiStatus: "CONNECTED"
```

これで、"CONNECTED"になりました。これでタブレットがネットワークに接続できるようになりました。
この方法だと、Pepperアプリを起動中でも、アプリと独立して実行できるので便利ですね。
Android 4.2.2から通知の挙動が若干変わっていた.

## 結論
Notification.PRIORITY_MINを設定すると4.2.2以降では

 - 音が鳴らない
 - LEDが光らない
 - ステータスバーにアイコンが出ない 

4.2.1以前では音がなることは確認しています。

## 詳細

4.2.2に入っている[Commit Comment](https://github.com/android/platform_frameworks_base/commit/526fa0e6d5cfe6ca3f390982c169b43fcb7d6f78)は以下の通りです。

```
commit 526fa0e6d5cfe6ca3f390982c169b43fcb7d6f78
Author: Daniel Sandler <dsandler@android.com>
Date:   Tue Dec 4 14:51:50 2012 -0500
 
PRIORITY_MIN notifications should be truly ambient.
    
If your notification is set to MIN priority, it will never
attempt to interrupt the user, either by an icon (already
implemented), or (new in this patch) by LED, vibration, or
```
上記は[4.2.2_r1](https://github.com/android/platform_frameworks_base/releases/tag/android-4.2.2_r1)から入っている模様。

[公式ドキュメント](http://developer.android.com/reference/android/app/Notification.html#PRIORITY_MIN)には全くビヘイビアについては触れられていないのでPRIORITY_MINを使う際には注意が必要となります。

```
public static final int PRIORITY_MIN

Added in API level 16
Lowest priority; these items might not be shown to the user except under special circumstances, such as detailed notification logs.

Constant Value: -2 (0xfffffffe)
```
メソッドの存在チェックメモ


##[method_exists関数](http://php.net/manual/ja/function.method-exists.php)

引数にオブジェクトのインタンスまたはクラス名と、メソッド名を指定すると、そのメソッドが対象クラスにあるかチェックする。
インスタンスメソッド、クラスメソッド共にチェック可能。
但し、インスタンスメソッド、クラスメソッドの判別できない。

##[function-exists関数](http://php.net/manual/ja/function.function-exists.php)

引数に関数名をしていると、その関数が存在するかチェックする。

##[ReflectionMethod クラス](http://php.net/manual/ja/class.reflectionmethod.php)
対象のオブジェクトのメソッドのアクセサの情報や、対象のメソッドがコンストラクタか、抽象メソッドかどうかも取得可能。
PHPUnitでテストデータが複数のパターンある場合に１つのテストケースで実行する方法


PHPUnitで1つのテストケース（テストメソッド）でテストデータが複数のパターンある場合は、以下のようなコードをよく書きます。

```
$this->assertTrue($this->isPlus(1));
$this->assertFalse($this->isPlus(0));
$this->assertFalse($this->isPlus(-1));
```

しかしdataProviderアノテーションを使うと、テストケースとテストデータを以下のように分離することが可能です。

```
/**
 * isPlusメソッドのテストデータ
 */
function forTestIsPlus(): array {
   return [
       [1, true],
       [0, false],
       [-1, false],
   ]; 
}

/**
 * isPlusメソッドのテスト
 * @dataProvider forTestIsPlus
 */
function testIsPlus($value, $excepted) {
     $this->assertSame($excepted, $this->isPlus($value));
}

```

ポイントは以下の3点。

* 必要なパターン分だけ、２次元配列で定義
* テストケース（テストメソッド）の引数分だけテストデータの要素が必要
* テストケース（テストメソッド）の引数に対してテストデータの要素数が足りないとエラーになる


#参考
[PHPUnitのアンチパターンとベストプラクティス](http://www.ryuzee.com/contents/blog/3982)
Thinking in React日本語まとめ

[Thinking in React](http://facebook.github.io/react/docs/thinking-in-react.html)を読んだので徐々に日本語でまとめていきます。

## Thinking in React
元ソースは[ブログ](http://facebook.github.io/react/blog/2013/11/05/thinking-in-react.html)です。 
Reactは巨大で、早いWebアプリをJavascriptで構築する代表的な手法で、スケールしやすい。 
ここでは検索できるテーブルを作りながら、Reactの素晴らしいパーツ使ってアプリの構築手順を見て行きましょう。

## Start with a mock
APIとデザイナーからのモックがあると仮定します。モックはあまりイケてません。
![thinking-in-react-mock.png](http://facebook.github.io/react/img/blog/thinking-in-react-mock.png "thinking-in-react-mock.png")

```json:APIのレスポンス
[
  {category: "Sporting Goods", price: "$49.99", stocked: true, name: "Football"},
  {category: "Sporting Goods", price: "$9.99", stocked: true, name: "Baseball"},
  {category: "Sporting Goods", price: "$29.99", stocked: false, name: "Basketball"},
  {category: "Electronics", price: "$99.99", stocked: true, name: "iPod Touch"},
  {category: "Electronics", price: "$399.99", stocked: false, name: "iPhone 5"},
  {category: "Electronics", price: "$199.99", stocked: true, name: "Nexus 7"}
];
```

## Step 1: UIをコンポーネントに分けてみる
まず行いたいのは、各コンポーネントに分けてそれぞれに名前を付けることでしょう。 
デザイナーとやっているのであれば、フォトショのレイヤー名がそれになるでしょう。 
コンポーネントにどうやって分けるって？新しいメソッドやオブジェクトを作る場合は、「単一責任の原則」に従うだけ。 


![](http://facebook.github.io/react/img/blog/thinking-in-react-components.png "thinking-in-react-components.png")

5個のコンポーネントがあります。
1. FilterableProductTable(オレンジ):全体を指します
2. SearchBar(青):ユーザーの入力を受け取ります
3. ProductTable(緑):データの表示、入力を元に絞り込みます
4. ProductCategoryRow(水色):それぞれのカテゴリ名を上部に表示します
5. ProductRow(赤):それぞれの商品名を表示します

ProductTableを見ると、自身のコンポーネントではない"Name", "Price"のヘッダがあります。これは好みが別れるところですが、今回の例ではProductTableの一部と見なします。

## Step 2: 静的な画面を作ってみる
書きかけ
## Step 3: Identify the minimal (but complete) representation of UI state
書きかけ
## Step 4: Identify where your state should live 
書きかけ
## Step 5: Add inverse data flow
書きかけ
gulpでruby-sassからnode-sassへ移行するときのハマりどころ

 
[node-sass 3.0](https://github.com/sass/node-sass/releases/tag/v3.0.0)が出て、Libsassも3.2に上がった。これによって@at-rootなど（個人的に）重要な機能が使えるようになったので移行した。
 
互換性に関しては[sass-compability](http://sass-compatibility.github.io/)が有用。

 
# なんでlibsassにしたいのか？
- gulp-sassのコンパイルが超早い。
	- 今回の環境では100ファイルぐらいで6〜8秒ぐらいなのが1〜2秒ぐらいになった。
- gulp-ruby-sassの独特な記法から逃れられる
- rubyを別途依存させる必要がない

とかあたり。

# ハマりどころ
互換性が担保されているとはいえ、ちょいちょい引っ掛かりがあった。

## 不正な色コードはエラーになる
 
今まではカラーコードが不正でも無視してくれていたが、libsassでは怒られてしまう。まあこれは普通になおすかそもそも効いてなかったので消せばよかった。
 
```scss
.foo{
  color: #12345
}
```
 
## IEのexpression構文がコケる
IEのexpression構文がどうもコケる。現在node-sassはlibsass3.2.2を利用しているようだが、[3.2.4では改善されるらしい。](https://github.com/sass/libsass/issues/1102)
 
```scss
html { 
  filter: expression(document.execCommand("BackgroundImageCache",false, true));
}
```
が、わりと古い対応だったので削った。
 
本気で対応したい場合はJavaScriptで書きなおしちゃうのが筋として良いかもしれない。
 
 
## @at-rootでの#{&}が不正なエラーになる。
 
これは一番変なハマり方した。
`@at-root`と`#{&}`の組み合わせでエラーになるようだ。
エラーメッセージも`unknown`となってしまってなかなか発見に時間がかかった。
 
```scss
@mixin box-sizing-border{
  @at-root{
    #{&}{
      box-sizing: border-box;
 
      *, *:before, *:after {
        box-sizing: inherit;
      }
    }
  }
}
```
 
この問題は一時変数に&を入れることで解決。
 
```scss
@mixin box-sizing-border{
  @at-root{
    $selector: &
    #{$selector}{
      box-sizing: border-box;
 
      *, *:before, *:after {
        box-sizing: inherit;
      }
    }
  }
}
```
 
完全にバグを踏んだ気がするので、[issue](https://github.com/sass/libsass/issues/1204)を報告してみたらこれも3.2.4で動くようになるから待っててねという感じっぽい。
 
## calcの中で`-o-calc`が動かない
`-o-calc(100% - 16px)`だと%とpxで計算しているぞと怒られてしまう。
 
おそらく[-ms-calcの対応issue](https://github.com/sass/libsass/pull/900)があるので、同様に`-o-calc`も入れなければなさそう。

今回の場合は別途で既に[autoprefixer](https://github.com/postcss/autoprefixer)を入れていて、その消し忘れだったのでさくっと消した。
おそらくそうでなくてもautopreifxerを使うようにシフトするのが良いだろうと思う。

 
## 相対パスが効かない？(エラーが出ない）
これはちょっと深くは未検証。pathオプションなどの問題かもしれない
 
だいたいこんな構成だったとして
 
```
sass
├── _basic.scss
└── application.scss
```
 
```application.scss
// 読み込まれない（エラー出ない）
@import "basic";			
 
// 読み込まれる
@import "sass/basic";

```
 
というように相対パスなら解決出来そうな（ruby-sassだとできていた）ものが読み込まれなくなっていた。
 
エラーも無かったのでdiffでやっと気づいた。あぶないあぶない。
pythonで散布図行列を描く

#概要
Rで散布図行列を描くときはpairs関数を使います．

```r
pairs(iris[1:4], main = "Edgar Anderson's Iris Data", pch = 21, bg = c("red", "green3", "blue")[unclass(iris$Species)])
```

![rmatrix.png](https://qiita-image-store.s3.amazonaws.com/0/58543/77a68b32-8195-b7d1-7a05-37febfc12b88.png)


これをpythonで描こうとしたのですが，お馴染みのmatplotlibには散布図行列を描く関数が実装されていないようです．

自分でsubplotを駆使して実装しても良いのですが，ここでは[seaborn](http://stanford.edu/~mwaskom/software/seaborn/)というグラフ描画ライブラリを使って散布図行列を描く方法を紹介します．

#Dependency
matplotlib (>=1.4)
seaborn (>=0.5)
どちらもpipでインストールできるはずです．

#ソースコード

```py
import matplotlib.pyplot as plt
import seaborn as sns

df = sns.load_dataset("iris")
sns.pairplot(df, hue="species", size=2.5)
plt.show()

```

#実行結果
![figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/58543/cad30981-2337-7724-ea7b-d496b10eb01e.png)

#その他
seabornには他にも様々なカッコいいグラフを描くためのツールがあります．
matplotlibのグラフに飽きた方はぜひ使ってみてください．

#参考
[Scatterplot Matrix](http://stanford.edu/~mwaskom/software/seaborn/examples/scatterplot_matrix.html)
laravel4でユーザー認証を行う


## セッションサーバーの設定
### memcachedをセッションサーバーに指定する場合
```php:app/config/session.php
<?php
...
'driver' => 'memcached',
'lifetime' => 60 * 30,
'expire_on_close' => false, // ブラウザを閉じた時にセッションを終了させるかどうか
...
```

### サーバーのhost名などを指定
```php:app/config/cache.php
<?php
...
/*  
|--------------------------------------------------------------------------
| Memcached Servers
|--------------------------------------------------------------------------
|
| Now you may specify an array of your Memcached servers that should be
| used when utilizing the Memcached cache driver. All of the servers
| should contain a value for "host", "port", and "weight" options.
|
*/

'memcached' => array(                                                                                                                                   
    array('host' => 100.000.1.00, 'port' => 99999, 'weight' => 100),
),  
...
```
## Userモデルの設定
Authクラスを使用するためには、UserInterfaceを実装する必要があり、下記のコードにある5つのメソッドが必要になります。今回はReminderやパスワードは必要ないため、処理は空にしてあります。

```php:user.php
class User extends Eloquent implements UserInterface
{
    // テーブル名
    protected $table = 'users';

    public function getAuthIdentifier ()
    {   
        return $this->getKey();
    }   

    public function getAuthPassword ()
    {   
        return null;
    }   

    public function getRememberToken()
    {   
        return null;
    }   

    public function getRememberTokenName()
    {   
        return null;
    }   

    public function setRememberToken($value)                                                                                                                  
    {   
        //  
    }   
}
```

## ログイン/ログアウトの実装
ログインとログアウトの部分のみ記載

```php:AuthController.php
<?php
...
public function login()
{
	// ソーシャルログインなどを行う
	...
	$user = User::create('name' => 'hogehoge', 'twitter_id' => 'hogehoge', facebook_id => 'bokeboke');
	Auth::login($user);
	...
}

public function logout()
{
	Auth::logout();
	
	// トップへ飛ばすなど
	...
}
```

## routesなどでの認証処理
デフォルトでauthやguestなどのfilterが用意されているので、routes内で認証チェックを行うようにします。

```php:routes.php
<?php
Route::group(['before' => 'auth'], function() {
    Route::get('/profile', 'ProfileController@index');
	...
}); 
```
Googleスプレッドシートでなんちゃってユニーク制約を実現する

# まえがき

商品管理とかをスプレッドシートを使って手軽に管理してたら、間違えて同一JANコードを複数商品に振ってしまって、それ気付かず同じバーコードを複数商品に貼ってAmazon倉庫に送って怒られた…。

何てことが無いように列にユニーク制約を設定したいなぁと思って解決した話。
（あ、DB管理くらいちゃんとしろよって話は無しで…(^^;）

# 数式で解決！

GASとか持ち出すのも大げさなのでセルの数式で解決した。

- A列のユニークチェックをしたい場合
- まずB1セルに `=IF(COUNTIF(A:A,A1)>1,"DUPLICATED!","OK")` と入力する。
- で、B1セルを縦にだーっとコピペする。
- 更にB列にカスタム書式で「DUPLICATEDを含んでたら赤字にする」とかを設定しておくとより分かりやすい。

結果、↓こんな感じになった。

![スクリーンショット 2015-05-15 18.32.09.png](https://qiita-image-store.s3.amazonaws.com/0/18726/309e1863-867b-0805-6ad6-2d4ba1a85d16.png)

気付ければ良いのです。
npm でコマンドラインツール開発事始め

npm でコマンドラインツール開発事始め
=====

node.js で Gmail API を叩きたい (https://github.com/takayukioda/cmail)
軌跡その2

Gmail をコマンドラインで確認できるツールを作りたい．  
開発言語は興味あるけど中々手が出せてなかった node.js で作りたい．

そんなわけで node.js の簡単な使い方を勉強

node.js のインストール
-----

node.js のインストール方法は色々ある

* [公式ホームページ](https://nodejs.org)からダウンロードしてインストール
* [Homebrew](http://brew.sh/) 等のパッケージ管理ツールからインストール
* [nvm](https://github.com/creationix/nvm) 等の node 用のバージョン管理ツールを利用してインストール

などなど．
自分はバージョンが頻繁に変わるらしいという事で nvm をインストールして，そこから最新版をインストールした．

プロジェクトの作成
-----
Node でプロジェクト情報を package.json に書くのだけども `npm init` コマンドを打つ事で対話的にプロジェクトの情報を入力できて，その情報を元に package.json を生成してくれる．

聞かれる内容は次の通り

* name
  - プロジェクトの名称
  - デフォルトでは今いるディレクトリの名前
* version
  - プロジェクトのバージョン
  - デフォルトでは `1.0.0`
* description
  - プロジェクトの概要
* entry point
  - モジュールの公開を行っているメインとなる js ソース
  - デフォルトでは index.js
* test command
  - テスト用のコマンド
* git repository
  - 公開されている Git のリポジトリ
* keywords
  - キーワード (npm の検索等で使われるのかな？)
* author
  - 開発者
* license
  - 開発物のライセンス
  - デフォルトでは [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/)

設定の修正
-----

また今回作るのはコマンドラインツールなので package.json に若干の修正が必要になる．  

* `main` プロパティの削除
  - このプロパティは他の js でロードされる場合に必要であって，コマンドラインツールでは別の設定が必要
* `preferGlobal` プロパティの追加
  - 値は `true`
  - `--global` オプションを使ってインストールする事を推奨するオプション
* `bin` プロパティの追加
  - `{ コマンド名: メインjsファイル }` で指定
  - `main` プロパティの代わりにこちらが必要になる

ちなみに自分が参考にしたサイトはこちら: [Writing Command Line Tool with Node](http://javascriptplayground.com/blog/2015/03/node-command-line-tool/)

これだけでコマンドラインツールのベース完成
-----
プロジェクトの設定をした後に `npm link` コマンドを実行するとシンボリックリンクが作成されて，一々インストールしなくてもコマンドが使えるようになる．

例えば上で紹介した `bin` プロパティが以下のような感じだったとすると

```json
{
  "bin": {
    "toolname": "index.js"
  }
}
```
`npm link` をした後に

```bash
$ toolname
```
ってしただけでもうコマンドになってる．
想像以上に簡単に設定できて若干腰を抜かしてたりしてなかったり．

以下が1分で作ったシンプルなコマンドラインツール．

```bash
da0shi@qiita [~/tmp/samplebox]$ cat package.json
{
  "name": "samplebox",
  "version": "1.0.0",
  "description": "",
  "bin": {
    "samplebox": "main.js"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

da0shi@qiita [~/tmp/samplebox]$ cat main.js
#!/usr/bin/env node

'use strict';

console.log(process.argv);
console.log(process.env.HOME);

da0shi@qiita [~/tmp/samplebox]$ npm link
/Users/da0shi/.nvm/versions/node/v0.12.2/bin/samplebox -> /Users/da0shi/.nvm/versions/node/v0.12.2/lib/node_modules/samplebox/main.js
/Users/da0shi/.nvm/versions/node/v0.12.2/lib/node_modules/samplebox -> /Users/da0shi/tmp/samplebox

da0shi@qiita [~/tmp/samplebox]$ samplebox
[ 'node',
  '/Users/da0shi/.nvm/versions/node/v0.12.2/bin/samplebox' ]
/Users/da0shi
```

引数と環境変数
-----
引数は `process.argv` で取得できる．

* node
* 実行ソースの場所

が必ず入っているみたい．

環境変数は `process.env` からアクセス可能．

* `process.env` で全ての環境変数
* `process.env.HOME` みたいな指定が可能

そんな感じで．
Gmail API 事始め

Gmail API 事始め
=====

node.js で Gmail API を叩きたい (https://github.com/da0shi/cmail)
軌跡その1

Gmail をコマンドラインで確認できるツールを作りたい．  
開発言語は興味あるけど中々手が出せてなかった node.js で作りたい

って思ったので Gmail API について調べた．

とりあえずは[公式ドキュメント](https://developers.google.com/gmail/api/)
-----
とりあえず "Gmail API" で調べたら，案の定[公式ドキュメント](https://developers.google.com/gmail/api/)がトップに出たのでまずは公式ドキュメントに目を通す事に．

ちなみにドキュメントはページの言語を「日本語」にするとページの1%未満が日本語化されるという素敵仕様になっているとか．

### Overview

#### Resources
Gmail API が権限を提供するのは以下の5つ

* Messages
  - 閲覧
  - 作成
  - 削除
  - ラベルの着脱
* Labels
  - システム設定のラベル
      * 閲覧
  - ユーザ設定のラベル
     * 閲覧
     * 作成
     * 更新
     * 削除
* Drafts
  - 閲覧
  - 作成
  - 更新
  - 削除
* History
  - 閲覧
* Threads
  - 閲覧
  - 更新
  - 削除

#### Scopes
4つのレベルで API の有効範囲を指定できる
必要最低限の scope を指定する事で誤った操作が出来ないようにするとちょっと安心．

* https://mail.google.com  
  全権限の付与
* https://www.googleapis.com/auth/gmail.modify  
  編集権限の付与
* https://www.googleapis.com/auth/gmail.readonly  
  閲覧権限の付与
* https://www.googleapis.com/auth/gmail.compose  
  下書きへの編集権限と送信権限の付与

と思ったら insert と labels のもう2つあるらしい...
これが [scope のドキュメント](https://developers.google.com/gmail/api/auth/scopes)
まぁ権限が極端に限定されてるからそこまで使う場面はなさそうだけど

API Key の作成
-----
[Google Developers Console](https://console.developers.google.com/)にアクセスしてプロジェクトを作成する

「API と認証」から Gmail API を有効にする

「認証情報」の「OAuth」で新しいクライアント ID を作成

* アプリケーションの種類 -> インストールされているアプリケーション
* インストールされているアプリケーションの種類 -> その他

を選択して作成．

ネイティブアプリケーションのクライアントID という項目ができて

* クライアントID
* クライアントシークレット
* リダイレクト URI

が表示されていたらOK

### JSON をダウンロード
という項目があるけど，その JSON ファイルをダウンロードすると client id, client secret だけでなく， code の生成に必要な auth uri や token の生成に必要な token uri ，更には redirect uri なども記載されている

プログラムの中で JSON ファイルを読み込むようにすることで事前の設定を色々と省略できるのでダウンロードしておく事をオススメします．
[リンクのメモ]NetBeansとGlassFishを使ってJavaEE7のWebSocketを遊ぶ。あとAWSでデプロイとか。

NetBeansとGlassFishを使ってJavaEE7のWebSocketを遊ぶ。あとAWSでデプロイとか。
http://blog.yujing.jp/entry/2013/07/14/190728
jQueryMobileのページ遷移イベントについて

調べるにあたり、[ここ](http://www.buildinsider.net/web/jquerymobileref/35)を参考にした。
その他に気づいたことをメモ。
なお、この記事では、jQueryMobileによるajaxによるページの読み込みを**ページ遷移**、それ以外のheadを含めて読み込むことを**ロード**と呼び分けているようだ、多分。
これら以外に、domに既にキャッシュとして存在しているページに表示を切り替える、**ページ切替**が存在する。

Ubuntu 14.04LTS
Mozilla Firefox 38.0

## ページ切替 時に発火するイベントについて
全部調べてはいないけれど、以下は確認した。
発生する：pagecontainershow, pagecontainerchange
発生しない：pagecontainerload, pagecreate

ページ遷移ともロードとも異なる。
ページを表示する度に行う処理はpagecontainrechangeなどで。

## prevPage プロパティについて
* ロード時は undefined なので注意。  
jQueryオブジェクトのメソッドを使うとエラー。当然といえば当然なのだけど、気づくまで時間がかかった。
メモ：jQueryMobileを利用するWebサイト作成での私の決め事、メモ

個人用メモ。

基本的に data-ajax='false' にはしない方針。

2015-05-15

# ページidを割り当てる
* ページ毎に、url依存あるいはアクセス日時などによる*id属性(ページid)*を付ける。
* ページ内でid属性をhtml要素に割り当てる場合は、*ページid*をprefixとして用いる。

# javascriptについて
## ページ毎に別に持つ必要の在る変数は、namespace的な仕組を使う
* 外からは page.*url*.*変数名* などでアクセスできるようにする。  
namespaceについては [このチートシート](http://qiita.com/mocha/items/c6a626416daaa04d0668)を参考に。

# GoogleMapを利用する場合
* メモリを食いそう（調べてはないけれど）なので、多くのページをキャッシュしないように。
* google.maps.Map オブジェクトを割り当てたHtml要素が削除されるとエラーが発生するので、pagecontainerremove イベントでオブジェクトを削除するように。Markerなども同様？
* 頻繁に地図を表示させるようなサイトの場合は、地図表示用のページを、サイトのどこからでも使えるように、data-dom-cache='true'を指定して作成しておくと便利。  
マーカーの配置やboundsの設定は、地図ページのpagecontainercreateイベント処理。
* google.maps.Map オブジェクトの生成は、pagecontainerchangeイベントで処理する  
pagecreate で生成すると、地図の表示領域が狭くなる。  
地図を描画するHtml要素が表示隠れている状態でオブジェクトを生成するとこうなるのではないかと。以前、jQuery.ui の dialog で地図を表示した時もそうだったし。
Imagemagickのコンパイル

##はじめに

ソースからimagemagickを作成する機会があったのでそのメモです。
CentOS 6.6
ImageMagick-6.9.1-2
gcc version 4.4.7

##ダウンロード

http://www.imagemagick.org/script/install-source.php
からimagemagick本体ダウンロード

http://www.imagemagick.org/download/delegates/
から
bzip2-1.0.6
jpeg-9a
libpng-1.6.16
をダウンロード
JPEGとPNGの変換ができるようにしています。bzip2はおまけです。いらないかもしれません。

## yumの導入

ここは試行錯誤でいれたのでもしかするといらないかも
```
yum install -y zlib-devel
yum install -y libjpeg-turbo-devel
```
tar.gzファイルを全て展開してください。
```
tar zxf *.tar.gz
```

## コンパイル

### bzip2

```
cd bzip2-1.0.6
```
Makefile中の CC=gccを CC=gcc -fPIC に変更します。あとはmake(なぜかconfigureはないです)
```
make; make  install
cd ../
```

### libpng

```
cd libpng-1.6.16
./configure
make
make install
cd ../
```

### libjpeg

```
cd jpeg-9a
./configure
make libdir=/usr/lib64
make libdir=/usr/lib64 install
cd ../
```

### ImageMagick

```
cd ImageMagick-6.9.1-2
./configure
make
make install
```

インストール後の確認

```
# identify --version
Version: ImageMagick 6.9.1-2 Q16 x86_64 2015-05-15 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2015 ImageMagick Studio LLC
License: http://www.imagemagick.org/script/license.php
Features: DPC OpenMP
Delegates (built-in): bzlib jng jpeg png zlib
```

Delegatesにjpeg,pngがはいっていれば成功です。
TableauServerのData Sourceをtabcmdで更新

## はじめに
Tableau Server上のDataSourceを利用してWorkSheetを表示することができるのですが、こちらの更新をtabcmdから更新する方法を紹介します。
Tableau Serverにはデータソースを自動で更新する手段が用意されているのですが、間隔が自由に設定できない問題点がありますので、こちらをWindowsのタスクスケジューラなどに登録することにより任意の間隔で更新が行えるようになります。

## tabcmdって？
Tableau Serverを外部（PowerShellなど)から操作できるコマンドラインツールです。

## 更新方法

まず、ログインし、その後、更新を行います。
refreshextractsを利用します。

> $ tabcmd.exe login -s http://hostname/t/site_name -u username -p password
> $ tabcmd.exe refreshextracts --datasource datasource_name


この処理をバッチなどに格納し、タスクスケジューラで実行することによりデータソースの更新を自動で行うことができます。
utcではなく日本時間でmigrationファイルを作りたかった結果


ruby on railsでmigrateファイルを作ろうとすると、どうしてもutc時間で生成され、9時間の時差が存在し、違和感を感じます。

time_zoneの設定など、オプションで何かできないかと試行錯誤していましたが、上手く行かず、
migrateしている時に参照している場所を見ていった結果、activerecord-4.2.0/lib/active_record/migration.rbの、next_migration_numberで取得されていました。

```ruby
   # Determines the version number of the next migration.
    def next_migration_number(number)
      if ActiveRecord::Base.timestamped_migrations
        [Time.now.utc.strftime("%Y%m%d%H%M%S"), "%.14d" % number].max
      else 
        SchemaMigration.normalize_migration_number(number)
      end  
    end  

```

常にutc強制だったようです。
Symbolic Brakepointを設定して、意味がわからないログの手がかりを掴んでみる

# ログは出てるが手がかりがないような場合ってありますよね
Xcodeでデバッグしていると、システム内部で何かしらのエラーが発生した時に以下のようなログが出力されることがあります。
ただ、どのメソッドやどの行の処理を実行した時に発生しているのかというところまでは確認できません。

```
This NSLayoutConstraint is being configured with a constant that exceeds internal limits.  A smaller value will be substituted, but this problem should be fixed. Break on void _NSLayoutConstraintNumberExceedsLimit() to debug.  This will be logged only once.  This may break in the future.
```

そんなときはSymbolic Brakepointを使い、どの処理を実行した時にログが吐かれているのか洗い出しましょう。

# Symbolic Brakepointを作成する
上記のログを参考に、Symbolic Brakepointを作成します。
## GUIから作成する
はじめに、XcodeのGUIから ```_NSLayoutConstraintNumberExceedsLimit``` という関数にブレークポイントを貼ってみます。
Brakepoint Navigatorの"+"ボタンから、"Add Symbolic Breakpoint..."を選択します。
![brakepointNavigator.png](https://qiita-image-store.s3.amazonaws.com/0/30970/03996429-8047-cc64-2261-35473d2c4b86.png)

"Symbol"に、```_NSLayoutConstraintNumberExceedsLimit``` を入力します。
![addSymbolicBrakepoint.png](https://qiita-image-store.s3.amazonaws.com/0/30970/1e1db9cc-1878-99e4-5d8f-9023f930a6bb.png)
関数のカッコをつけると、ブレークポイントを貼れないので注意しましょう。

この状態で上記のログが出力されるような処理を実行すると、```_NSLayoutConstraintNumberExceedsLimit()```が呼び出されたタイミングでブレークされます。あとはスタックトレースを追うなどして自分の好きなように解析していきましょう。

## デバッグコンソールから作成する
Symbolic Brakepointは、デバッグコンソールから設定することもできます。
```br s -n <someSymbolToBrake>(= brakepoint set -name <someSymbolToBrake>)```のコマンドを実行します。

```objc:デバッグコンソールでブレークポイントを設定する
(lldb) br s -n _NSLayoutConstraintNumberExceedsLimit
Breakpoint 11: where = Foundation`_NSLayoutConstraintNumberExceedsLimit, address = 0x00000001845d136c
```

このコマンドと引数で指定した場合、デバッグが終了するとブレークポイントも削除されてしまいます。
次に開始する時にも同じようにブレークさせたい場合、再度コマンドを入力しましょう。

なお、GUIから設定する時と同じように、関数名のカッコが残っているとエラーになります。

```objc:カッコをつけて指定しようとすると失敗する
(lldb) br s -n _NSLayoutConstraintNumberExceedsLimit()
Breakpoint 12: no locations (pending).
WARNING:  Unable to resolve breakpoint to any actual locations.
```
存在しなかったら git clone して、更新があったら git pull するシェルスクリプト

こんな感じでいいのかな？

```bash
#!/bin/bash
set -e

CLONE_TO=/path/to/clone
REPO_URL=git@github.com:sonots/alerty.git
BRANCH=master

if [ -d "$CLONE_TO" ]; then
  cd $CLONE_TO
  git fetch -p
  git checkout -q $BRANCH
  latest_rev=$(git ls-remote origin HEAD | awk '{print $1}')
  current_rev=$(git rev-parse HEAD)
  if [ "$latest_rev" != "$current_rev" ]; then
    git reset --hard $(git log --pretty=format:%H | tail -1)
    git pull
  fi
else
  git clone $REPO_URL $CLONE_TO
fi
```

追記: もう少ししっかりしたデプロイスクリプトを書いたらこうなった

```bash
#!/bin/bash
set -e

REPO_URL=git@github.com:sonots/alerty
BRANCH=master
CLONE_TO=alerty
KEEP_RELEASES=5

BASE_PATH=$(cd $CLONE_TO && pwd)
MIRROR_PATH="$BASE_PATH/repo"
RELEASES_PATH="$BASE_PATH/releases"
RELEASE_PATH="$RELEASES_PATH/$(date +%Y%m%d%H%M%S)"
CURRENT_PATH="$BASE_PATH/current"

# check
git ls-remote "$REPO_URL" > /dev/null
mkdir -p "$BASE_PATH"

# clone
if [ ! -f "$MIRROR_PATH/HEAD" ]; then
  git clone --mirror "$REPO_URL" "$MIRROR_PATH"
fi

# update
( cd "$MIRROR_PATH" && git remote update )

# create release
mkdir -p "$RELEASE_PATH"
( cd "$MIRROR_PATH" && git archive $BRANCH | tar -x -C "$RELEASE_PATH" )

# clean release
\ls -d "$RELEASES_PATH"/* | sort -nr | tail +$(expr $KEEP_RELEASES + 1) | xargs echo rm -rf
\ls -d "$RELEASES_PATH"/* | sort -nr | tail +$(expr $KEEP_RELEASES + 1) | xargs rm -rf

# symlink to current
echo ln -snf "$RELEASE_PATH" "$CURRENT_PATH"
ln -snf "$RELEASE_PATH" "$CURRENT_PATH"
```

これは capistrano の真似になっていて、

```
clone_to/repo
clone_to/releases
clone_to/releases/%Y%m%d%H%M%S
clone_to/current => clone_to/releases/最新
```

というディレクトリ構造を作ってくれる。git pull がないので安定する
Herokuのpluginをアンインストールする方法がわからなくて削除しました。

Herokuのプラグインをアンインストールする方法がわかりませんでした(^_^;)

# インストール済みpluginを確認
インストール済みのHerokuプラグインを確認します。

```bash:Herokuのプラグインを確認
heroku plugins
You have no installed plugins.
```

heroku plugins
=== Installed Plugins
heroku-accounts
```

# Herokuのpluginを削除
プラグインディレクトリを削除します。

```bash:Herokuのプラグインを削除
rm -rf ~/.heroku/plugins/heroku-accounts
```

# プラグインが削除されたか確認

```bash:Herokuのプラグインを確認
heroku plugins
You have no installed plugins.
```
プラグインが削除されたようです。

# 追記：plugins:uninstallでアンインストールできました
plugins:unistallでプラグイン名を指定するとアンインストールできるようです。

```
heroku plugins:uninstall プラグイン名
```

```
heroku plugins:uninstall heroku-accounts
Uninstalling heroku-accounts... done
```

# 参考

https://github.com/ddollar/heroku-accounts/issues/21
アカウント削除のユーザーディレクトリの保管

* 退職者が出たときなどでアカウントを削除したいときに

```
userdel -r taishokusha
```
のように"-r"をつけると
```
/home/taishokusha
```
のディレクトリごと消せる。


* しかしファイルを残しておきたい場合は

```
userdel taishokusha
```
でユーザ削除だけ行い、
```
mv /home/taishokusha /home/_void.taishokusha
```
などしてディレクトリを残しておくと分かりやすい