OmniAICreator/Qiita-1.07M huggingface dataset:
nmf

```math
\begin{equation}
X \in \mathbb{R}^{\ge 0 , M \times N}
\end{equation}
```


```math
\begin{equation}
X_{ij} = \mbox{振幅}
\end{equation}
```

```math
\begin{equation}

X \approx W H

\end{equation}
```


```math
\begin{equation}
W \in \mathbb{R}^{\ge 0 , M \times R}
\end{equation}
```

```math
\begin{equation}
H \in \mathbb{R}^{\ge 0 , R \times N}
\end{equation}
```

```math
\begin{equation}
x_{ij} \approx \sum_{k} w_{ik} h_{kj}
\end{equation}
```

```math
\begin{eqnarray}
 ||X - WH ||_{F} &=& 
\sum_{ij} \left(x_{ij} - (WH)_{ij}\right)^2 \\ 
&=& 
\sum_{ij} \left(x_{ij} - \sum_{k} w_{ik} h_{kj}\right)^2 \\ 
&\ge& 0
\end{eqnarray}
```


```math
\begin{eqnarray}
 \left| X \odot \log\left(\frac{X}{WH}\right) - X + W H \right| 
&=& \sum_{ij} 
 x_{ij} \log\left(\frac{x_{ij}}{(WH)_{ij}}\right) - x_{ij} + (WH)_{ij} \\
&\ge& 0
\end{eqnarray}
```


```math
\begin{eqnarray}
F = \left| X \odot \log\left(\frac{X}{WH}\right) - X + W H \right| 
&=& \sum_{ij} 
 - x_{ij} \log\left(\sum_{k} w_{ik}h_{kj}\right) + \sum_{k} w_{ik}h_{kj} + \alpha\\
&\le&- \sum_{ijk} x_{ij} \lambda_{ijk} \log(\frac{w_{ik}h_{kj}}{\lambda_{ijk}})
 + \sum_{k} w_{ik}h_{kj} + \alpha
\end{eqnarray}
```


```math
\begin{eqnarray}
 \sum_{k} \lambda_{ijk} = 1, ^{\forall}i, j
\end{eqnarray}
```


```math
\begin{eqnarray}
 \lambda_{ijk} = \frac{w_{ik} h_{kj}}{\sum_{k} w_{ik} h_{kj}}
\end{eqnarray}
```



```math
\begin{eqnarray}
h_{kj} &=& \frac{\sum_{i} x_{ij} \lambda_{ijk}}{\sum_{i} w_{ik}} \\
w_{ik} &=& \frac{\sum_{j} x_{ij} \lambda_{ijk}}{\sum_{j} h_{kj}} \\
\end{eqnarray}
```
GitHubで差分を見る時にPlantUMLを描画させる


PlantUMLでいろんな図を書いているのですが、GitHubのPullRequestで差分として表示されるPlantUMLはただのテキストにしか見えないのでレビューし辛いです。

差分見る画面
<img width="1394" alt="diff.png" src="https://qiita-image-store.s3.amazonaws.com/0/113398/2fd7aeab-8e21-f29d-5e4c-9f041dba1aeb.png">

いちいちブランチを手元に持ってきて、エディタで開いて図にしなければなりません。

なんか良い方法はないかと思い探してみたら、Chrome拡張がありました。

[PlantUML Viewer](https://chrome.google.com/webstore/detail/plantuml-viewer/legbfeljfbjgfifnkmpoajgpgejojooj?hl=ja)

入れるだけです。

PullRequestの画面からファイルの画面まで行って、直接テキストで見るボタンを押す
<img width="1394" alt="raw.png" src="https://qiita-image-store.s3.amazonaws.com/0/113398/9325e51f-3d76-3ff2-bbcf-ccaeb73ec94a.png">

拡張入れる前
<img width="1394" alt="text.png" src="https://qiita-image-store.s3.amazonaws.com/0/113398/b3365884-1b7b-830b-5bb6-0dcd25836b6a.png">

入れた後　図だ！！
<img width="1394" alt="viewing.png" src="https://qiita-image-store.s3.amazonaws.com/0/113398/24045856-ef6b-c1ff-32a0-2b8cdd4867e5.png">


らくちんだ

適当なファイルを僕のGitHubに置いてあるので、適当に試しに見てみるのにでも使ってみてください。

+ [クラス](https://raw.githubusercontent.com/suzuki-hoge/dev-note/1827d2aea34b6ce5e285bda37df8bb5b3d66cb6b/online-plant-viewing/doc/foo_class.puml)
+ [シーケンス](https://raw.githubusercontent.com/suzuki-hoge/dev-note/1827d2aea34b6ce5e285bda37df8bb5b3d66cb6b/online-plant-viewing/doc/foo_seq.puml)
+ [ステート](https://raw.githubusercontent.com/suzuki-hoge/dev-note/1827d2aea34b6ce5e285bda37df8bb5b3d66cb6b/online-plant-viewing/doc/foo_state.puml)
Qiitaのフィードをフィルタリングできるuser scriptを作った

Qiitaでフィードを見てるといろんな情報が流れてきます

* フォローしているユーザがストックした記事
* フォローしているユーザがいいねした記事
* フォローしているタグの新着記事
* フォローしているユーザがコメントした記事
* フォローしているユーザがフォローしたユーザ/タグ
* フォローしているユーザの投稿した記事その他

フィードを使っていてこんなことを感じませんか？

* タグの新着記事だけ表示したい
* ストックやいいねだけを表示したい
* フォローしているユーザがフォローした情報は非表示にしたい
* などなど

しかし、今のQiitaではそれができません。
なので、これらの情報を自分好みに表示したり非表示にしたりするUser Scriptを作ってみました。

* [ABCanG/qiita-feed-filter](https://github.com/ABCanG/qiita-feed-filter)
* [直接インストール](https://github.com/ABCanG/qiita-feed-filter/raw/master/qiita-feed-filter.user.js)

利用するには[Tampermonkey](https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?hl=ja)や[Greasemonkey](https://addons.mozilla.org/ja/firefox/addon/greasemonkey/)をインストールしておいてください


インストールすると、Qiitaのフィードのタブの下にこのようなチェックボックスが現れます。
チェックした情報はlocalstorageに保存されるようになっています。

![](https://github.com/ABCanG/qiita-feed-filter/raw/master/screenshot.png)


Qiitaの実装が変わると動かなくなるかもしれませんが、可能な限り対応していきたいと思ってます。
ソフトウェアの不具合対策検討方法

先日、[ソフトウェアの不具合修正の手順](http://qiita.com/imtnd/items/4bc94020df1ea6438025)という記事を書きましたが、その続きです。

不具合対策を検討するときには、モデリングしながらすすめると頭の中が整理しやすくなります。

# モデリング手法
モデリング手法としては、TOCfe(教育のためのTOC)の中で紹介されているロジックブランチを使用します。

#ロジックブランチ
ロジックブランチを簡単に説明します。
下の図を見てください。
![ロジックブランチ1.png](https://qiita-image-store.s3.amazonaws.com/0/84075/9048d243-91e2-75a5-2fde-a80d3a473858.png)

これは、もし"B"ならば"A"になる　という図です。
Bには原因が入り、Aには結果が入ります。


![ロジックブランチ2.png](https://qiita-image-store.s3.amazonaws.com/0/84075/1df6f025-6428-7494-2b2c-35ab1579a390.png)

これは、もし"B"ならば"A"になる　or もし"C"ならば"A"になるという図です。
BとCには原因が入り、Aには結果が入ります。

![ロジックブランチ3.png](https://qiita-image-store.s3.amazonaws.com/0/84075/1655b981-c788-ea4e-2c61-4286894e89d3.png)

これは、もし"B"かつ、もし"C"ならば"A"になるという図です。
BとCには原因が入り、Aには結果が入ります。
２つ目と違うのは、BとC両方の原因があったときにAになるということです。


# 不具合対策検討方法
さて、上記の図示方法で、不具合原因を探っていくとどうなるのかを紹介します。
[ソフトウェアの不具合修正の手順](http://qiita.com/imtnd/items/4bc94020df1ea6438025)の順序で紹介していきますが、記載している不具合原因などは適当に書いるためあまり深くは考えないでください。

## 1.不具合を再現させる
とりあえず、どうやってでも良いので不具合を再現させてみます。
すると、直接不具合に関係している原因は何か分かっていませんが、下記のように図示することが出来ます。原因はもっとたくさん思いつくかもしれません。
原因になりそうなことをすべて書き出しておきます。

![不具合1.png](https://qiita-image-store.s3.amazonaws.com/0/84075/408602c8-108c-4274-784c-da2acebd5ad2.png)


## 2.不具合の再現性の向上施策を検討する
次に、上記の図を整理していきます。
不具合が再現した時に原因だと思われている事項を一つ一つ検証していき、関係ない物は除外するなどして整理していきます。

その中で、更に不具合原因の因果関係が整理されることもあるかもしれません。
<img width="150" alt="不具合2.png" src="https://qiita-image-store.s3.amazonaws.com/0/84075/d5927204-46d3-29c2-9057-7b18b26e77c9.png">
この図は、もし"アクセスが集中している"まらば"CPU負荷が高くなる"　さらに、もし"CPU負荷が高い"ならば"不具合Aが発生する"という図になります。
こういった因果関係などを整理して、不具合の原因を探っていきます。


## 3.不具合の対策の検討
次に不具合対策の検討です。
上記の2.不具合の再現性の向上施策を検討する にて不具合の原因を整理して結果下記のようになったとします。


![不具合3.png](https://qiita-image-store.s3.amazonaws.com/0/84075/886966e7-baa2-7d00-bf1e-49b75017c554.png)

この図で示しているのは、不具合Aが発生するのは３つの複合原因によって発生しているということです。
不具合Aが発生しているのは、"ネットワークの回線品質が良くない" and "CPUの負荷が高い"　and "その他、該当プロセスにコーディングミスがある"　ためだと考える事ができます。
これらは、andで繋がっているため、３つのうちどれか一つを最低でも修正すれば不具合は発生しなくなるわけです。
そのため、この図が正しいとした場合、不具合の対策方法としては下記の３つが考えられます。

- ネットワークの回線品質を良くする
- CPUの負荷を減らせるようにする
- コーディングミスを修正する

実際の対策方法としては、コーディングミスの修正になるかもしれません。
しかし、もし他の選択肢が取れる場合はソースコードを修正しなくても良いということになるかもしれません。


レガシーなシステムなどでは、ソースコードを修正することによる影響範囲等の特定はかなり難しくなります。そのため、不具合対策の対策方法を複数考えておけるということはとても大切なことになります。


# 参考
TOCfEの思考プロセスについては[考える力をつける3つの道具](https://www.amazon.co.jp/dp/4478027730)の本を参考にしてください。
ELB + EC2 + nginxでメンテナンスページを出す


nginxの設定で詰まったのでメモ。
特定IPのみサイトアクセスを許可し、それ以外のIPには許可しない設定をここでは行う。

# ELBを利用していない場合
remote_addrで接続元IPが取得できるので、それで判定する。
書き方例は以下


```
  ### Start - Show the maintenance page.
   error_page 503 @maintenance;
   location @maintenance {rewrite ^(.*)$ /maintenance.html break;}
   set $flg "true";
   if ($remote_addr = "127.0.0.1" ) {set $flg "false";}
   if ($remote_addr ~ ^192\.168\. ) {set $flg "false";}
   if ($remote_addr = "111.111.111.111"   ) {set $flg "false";}
   if ($request_uri ~ .*\.(jpg|txt|JPG|gif|GIF|png|PNG|swf|SWF|css|CSS|js|JS|inc|INC|ico|ICO)){set $flg "false";}
   if ($flg = "true") {return 503;}
  ###  End  - Show the maintenance page.
```


# ELBを利用している場合

ELBを利用している場合は、
remote_addrはELBのIPが返ってくる。
http_x_forwarded_forが実際の接続元IPとなることに注意する。
書き方例は以下


```
  ### Start - Show the maintenance page.
   error_page 503 @maintenance;
   location @maintenance {rewrite ^(.*)$ /maintenance.html break;}
   set $flg "true";
   if ($remote_addr = "127.0.0.1" ) {set $flg "false";}
   if ($remote_addr ~ ^192\.168\. ) {set $flg "false";}
   if ($http_x_forwarded_for = "111.111.111.111"   ) {set $flg "false";}
   if ($request_uri ~ .*\.(jpg|txt|JPG|gif|GIF|png|PNG|swf|SWF|css|CSS|js|JS|inc|INC|ico|ICO)){set $flg "false";}
   if ($flg = "true") {return 503;}
  ###  End  - Show the maintenance page.
```
[Ubuntu][apt] /var/lib/apt/lists/lockが不正な状態になった場合の対応メモ

VirtualBox上のUbuntuで以下のようになって、`apt-get` などの操作ができなくなってしまった。
実際に使用している別のプロセスは存在していないため、なにかしら不正な状態になっていることが考えられる。

環境は Windows7 + VirtualBox + Ubuntu 16.04

```console:エラーログ例
$ sudo apt-get update
E: ロック /var/lib/apt/lists/lock が取得できませんでした - open (11: リソースが一時的に利用できません)
E: ディレクトリ /var/lib/apt/lists/ をロックできません
E: ロック /var/lib/dpkg/lock が取得できませんでした - open (11: リソースが一時的に利用できません)
E: 管理用ディレクトリ (/var/lib/dpkg/) をロックできません。これを使う別のプロセスが動いていませんか?
```

対処に関して、以下のページが参考になった。
[dpkgのlock解除 - ロボットと趣味と自堕落と](http://inside-my-box.hatenablog.com/entry/2015/05/29/013008)

```console:対応
$ sudo rm /var/lib/apt/lists/lock
$ sudo rm /var/lib/dpkg/lock
```

とはいっても、やっていることとしては lock ファイルを思いきって消してしまっているだけだけれども。
(リンク先ではリカバリーコンソール上で削除している）

以前も同様の状態になったことがあるため、再現性のある不具合であるようだ。


# 参考
[dpkgのlock解除 - ロボットと趣味と自堕落と](http://inside-my-box.hatenablog.com/entry/2015/05/29/013008)
オレオレmacの設定備忘録

いつもmacの設定を忘れるので、設定したらメモするようにする。
基本は最小限の設定で済むようにする。

# デスクトップの位置を自動で並び替えないようにする
メーラーでリンクを踏むとブラウザに飛ぶが、一番はじにおいやっておいたメーラーがブラウザの横に勝手に並び替えられるのがうざいので、設定を切る  
システム環境設定 -> Mission Control -> 最新の使用状況に基づいて操作スペースを自動的に並べ替えるのチェックを外す　
![スクリーンショット 2015-10-03 2.11.20.png](https://qiita-image-store.s3.amazonaws.com/0/67119/adc1ab87-0007-a054-ea41-7d4f98cc6eff.png)

# xcodeを入れる
macローカルのgitコマンドを使うためにはxcodeを入れないといけないので入れる。

# dotfileを設定する
https://github.com/koh110/dotfiles
cloneしてきてdeploy.shを叩く

```
./deploy.sh
```

# homebrewを入れる
これはもう外せないので取り敢えず入れておく。  

```
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

# chromeを入れる
## 拡張
[Vimium](https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb)

# alfredを入れる
https://www.alfredapp.com/
mac本体のSpotlight検索とショートカットが被っているのでSpotlightを解除

# iterm2を入れる
iterm2のターミナル全画面表示切り替え機能は、開発効率に関わってくるのでiterm2は入れる。以下参照
http://qiita.com/koh110/items/b7e9471330308fdb7250

# atomを入れる
色々拡張を入れる。以下参照
http://qiita.com/koh110/items/712340045ff68ff1b804
Tips & tricks (日々更新）

## Tip 1.1 : Select2コントロールの内容を再度初期化せずに更新する

```
//ajaxを実行して新内容を取得する
success:function (result, textStatus, xhr) {
   if(result.success){
      $items = result.items;
      //元のコンテンツをクリアする
      $('#opt-select2').html('').select2({data: [{id: null, text: null}]});
      var data = [];
      jQuery.each($items, function(key, value){
         var item_obj = value;
         data.push({id:item.id, text: item.text});
      });
      $("#opt-select2").html('').select2({data: $(data)});
   }else{
      ...
   }
```
## Tip 1.2 : Select2のPlaceholderをjQueryで設定する

```
//ajaxを実行して新内容を取得する
success:function (result, textStatus, xhr) {
   if(result.success){
      $items = result.items;
      //元のコンテンツをクリアする
      $('#opt-select2').html('').select2({data: [{id: null, text: null}]});
      var data = [id:'', text:'']; //Placeholderを表示するように用意する
      jQuery.each($items, function(key, value){
         var item_obj = value;
         data.push({id:item.id, text: item.text});
      });
      $("#opt-select2").html('').select2({data: $(data)});
      $("#opt-select2").select2({placeholder: 'New Place holder', allowClear:true});
   }else{
      ...
   }
```

## Tip 2:  Bootstrap wysihtml5-editorの内容を設定する

```
var iframe = $('#wysihtml5-editor-div').find('iframe');
//書かれていた内容を削除する
$(iframe).contents().find('.wysihtml5-editor').html('');
//新内容を記入する
$('#wysihtml5-editor-div').data("wysihtml5").editor.setValue($new_content);

```
## Tip3 : AdminLTEに含むBootstrap wysihtml5-editorライブラリのバグ

Tip2で参照されていたeditorはいつもnullである場合は使っているライブラリを確認してください。一応最新版のAdminLTEに含むライブラリだとこの既存バグは存在されています。修正法は以下になります。

```bootstrap-wysihtml5.js
 createEditor: function(options) {
            options = options || {};
            
            // Add the toolbar to a clone of the options object so multiple instances
            // of the WYISYWG don't break because "toolbar" is already defined
            options = $.extend(true, {}, options);
            options.toolbar = this.toolbar[0];

            var editor = new wysi.Editor(this.el[0], options);

            if(options && options.events) {
                for(var eventName in options.events) {
                    editor.on(eventName, options.events[eventName]);
                }
            }
            return editor; //＜ーこのラインを追加する
        },
```
あるいは修正した版をダウンロードして切り替える
[bootstrap-wysihtml5](https://raw.githubusercontent.com/jhollingworth/bootstrap-wysihtml5/master/src/bootstrap-wysihtml5.js)

<To be continue>
例えばこんな条件判定の方法

switch 文を使わない書き方とやらが気になってたので、なんとなく自分なりに考えてみた。
メリットはたいして感じないけど。

```js
const switcher = (val, obj) => {
  return Object.entries(obj).some((arr) => {
    const [ cond, fn ] = arr;
    const isSame = val === cond;
    if(isSame) fn();
    return isSame;
  });
};

const isMatch = switcher('b', {  // 例外処理する場合は代入
  a() {
    console.log('1');
  },
  b() {
    console.log('2');
  },
  c() {
    console.log('3');
  },
});

// 例外処理
if(!isMatch) throw new Error('Not match conditions.');
```

default 的にマッチしない場合の処理も書けるけど、同列には書けないので例外処理の場合とかだけかな。
あとは switcher 関数の書き方によっては、パターンマッチとかもできるかと。

ただまあ some メソッド内で関数実行してるのはどうだろう感はあるけどね。
FreeBSD + Dovecot 2.2.27

FreeBSD に Dovecot 2.2.27 をインストールしてみたのでメモ。
（注：まだ書きかけです）

# 環境

1. [FreeBSD 11.0 (VirtualBox)](http://qiita.com/ken1ma/items/86748d03c2e8c192dce6)

# 方針

1. ports を使ってインストール
    1. `pkg` でインストールできるのはバージョン 2.2.25_5 でちょっと古い。

            % pkg search dovecot2 | grep -v plugin
            dovecot2-2.2.25_5              Secure, fast and powerful IMAP and POP3 server

      1. `dovecot` パッケージはバージョン 1.2.17 なので `dovecot2` を使用

2. ports を更新する
    1. FreeBSD 11.0 に同梱されている ports では `dovecot2` のバージョンは 2.2.24 でちょっと古い

            % grep ^PORTVERSION /usr/ports/mail/dovecot2/Makefile
            PORTVERSION=	2.2.24

3. IMAP のみで POP3 は使わない
4. SSL 必須
5. PAM でパスワード認証
6. maildir 形式

# ports を更新

1. `/usr/ports` を更新

    ```
% sudo portsnap fetch
% sudo portsnap extract
```

2. dovecot2 のバージョンを確認

    ```
% grep ^PORTVERSION /usr/ports/mail/dovecot2/Makefile
PORTVERSION=	2.2.27
```

# Dovecot インストール

1. `make`

    ```
% cd /usr/ports/mail/dovecot2
% sudo make install
```

1. ![Screen Shot 2016-12-27 at 9.51.24.png](https://qiita-image-store.s3.amazonaws.com/0/131106/7dfc596a-aaf6-f894-d45f-f3eeb6cdabdf.png)
    1. デフォルトの設定のまま続行


# Dovecot 設定

1. `/usr/local/etc/dovecot/dovecot.conf` を作成

        # only imap (no pop3)
        # lmtp is to be used by smtpd
        protocols = imap lmtp
        
        ssl = required
        ssl_cert = </etc/mail/certs/host.cert
        ssl_key = </etc/mail/certs/host.key
        
        # used in Message-Id and LMTP replies
        hostname = mail.mydomain.jp
        
        # use maildir rather than mbox
        mail_location = maildir:~/Maildir
        
        # don't let users log in as system users
        first_valid_uid = 1000
        first_valid_gid = 1000
        
        # PAM authentication
        passdb {
        	driver = pam
        	# use /etc/pam.d/imap
        	args = %s
        }
        
        # Get uid, gid, home from /etc/passwd through nsswitch
        userdb {
        	driver = passwd
        }
        
        #service auth {
        	# smtp-auth
        #	unix_listener /var/spool/smtpd/private/auth {
        #		mode = 0666
        #	}
        #}
        
        # special mailboxes
        namespace inbox {
        	inbox = yes
        
        	mailbox Drafts {
        		special_use = \Drafts
        	}
        
        	mailbox Junk {
        		special_use = \Junk
        	}
        
        	mailbox Trash {
        		special_use = \Trash
        	}
        
        	mailbox Sent {
        		special_use = \Sent
        	}
        
        	mailbox virtual/All {
        		special_use = \All
        	}
        
        	mailbox virtual/Flagged {
        		special_use = \Flagged
        	}
        }

2. `/etc/pam.d/imap` は FreeBSD 11.0 にバンドルされているものをそのまま使う

        auth            required        pam_unix.so             no_warn try_first_pass
        account         required        pam_unix.so

# Dovecot 起動

1. サービスを有効にする

    1. `/etc/rc.conf` に追加

            dovecot_enable="YES"

2. 起動

        $ sudo service dovecot start
【翻訳】scikit-learn 0.18 チュートリアル 外部リソース、ビデオ、トーク

http://scikit-learn.org/0.18/presentations.html を google翻訳した

[チュートリアル 目次](http://qiita.com/nazoking@github/items/5160c11d1a5b3fe8f34c) / [前のチュートリアル](http://qiita.com/nazoking@github/items/de71ad4e50ab79d998e2)

----

# 外部リソース、ビデオ、トーク

書かれたチュートリアルについては、ドキュメントの[チュートリアルのセクション](http://qiita.com/nazoking@github/items/5160c11d1a5b3fe8f34c)を参照してください。

## 初めて科学的なPythonをお使いですか？

科学的なPythonエコシステムを新しく始めるときは、 [Python Scientific Lecture Notes](http://www.scipy-lectures.org/)（訳注：[日本語訳版がここに](http://www.turbare.net/transl/scipy-lecture-notes/index.html) ） を強くお勧めします。これは、あなたの基礎を少し見つけるのを助け、間違いなくあなたの scikit-learn を学ぶ経験を向上させます。
scikit-learnを最大限に活用するには、NumPy配列の基本的な理解が推奨されます。

## 外部チュートリアル

特定の科目分野に合わせたオンラインチュートリアルがいくつか用意されています。

  - [PythonでNeuroImagingのための機械学習](http://nilearn.github.io/)
  - [天文学データ解析のための機械学習](https://github.com/astroML/sklearn_tutorial)

## ビデオ

  - Scipy 2013での [ガイ・バロックウ](http://gael-varoquaux.info/)、[ジェイク・バンダープラス](http://staff.washington.edu/jakevdp)、[オリビエ・グリゼル](https://twitter.com/ogrisel) による scikit-learn [第1部](https://conference.scipy.org/scipy2013/tutorial_detail.php?id=107) と [第2部](https://conference.scipy.org/scipy2013/tutorial_detail.php?id=111) を紹介します。 ノートブックは [github](https://github.com/jakevdp/sklearn_scipy2013) に。
  - ICML 2010での[Gael Varoquaux](http://gael-varoquaux.info/) による [scikit-learn の紹介]
    - scikit の非常に早い段階からの3分のビデオで、私たちが従う基本的な考え方とアプローチを説明します。
  - SciPy 2011での [Gael Varoquaux](http://gael-varoquaux.info/) による [scikit-learnでの統計学習入門](http://archive.org/search.php?query=scikit-learn)
    - 1時間の4つのセッションで構成される広範なチュートリアル。このチュートリアルでは、機械学習の基本、多くのアルゴリズム、scikit-learnを使用してそれらを適用する方法について説明します。対応する資料は、scikit-learnドキュメントのセクション [科学的データ処理の統計学習のチュートリアル](http://qiita.com/nazoking@github/items/051911b0062a0bf48dc3) にあります。
  - PyCon 2011での [Olivier Grisel](https://twitter.com/ogrisel) によるscikit-learnと [NLTKによるテキスト分類のための統計学習](http://www.pyvideo.org/video/417/pycon-2011--statistical-machine-learning-for-text) （[スライド](http://www.slideshare.net/ogrisel/statistical-machine-learning-for-text-classification-with-scikitlearn-and-nltk)）
    - テキスト分類への30分の紹介。 NLTK と scikit-learn を使用して実際のテキスト分類タスクを解決し、クラウドベースのソリューションと比較する方法を説明します。
  - PyCon 2012での [Olivier Grisel](https://twitter.com/ogrisel) による[Python で scikit-learn を使ったインタラクティブな予測分析の紹介](https://www.youtube.com/watch?v=Zd5dfooZWG4)
    - scikit-learnを使った予測タスクの3時間の紹介。
  - 2012年PyDataワークショップでの [Jake Vanderplas](http://staff.washington.edu/jakevdp) の [scikit-learn - Pythonによる機械学習](https://newcircle.com/s/post/1152/scikit-learn_machine_learning_in_python)
    - シキット学習機能のインタラクティブなデモンストレーション75分。
  - PyData NYC 2012でのJake Vanderplasによる [scikit-learnチュートリアル](https://vimeo.com/53062607)
    - プレゼンテーションは、オンラインチュートリアル、45分を使用しています。

----

[チュートリアル 目次](http://qiita.com/nazoking@github/items/5160c11d1a5b3fe8f34c)

©2010 - 2016、scikit-learn developers（BSDライセンス）。
PostgreSQL 便利クエリ集

いろんなところから集めてきてます。

# バージョン

```
$ psql --version
psql (PostgreSQL) 9.3.5
```

# 容量使っているテーブル上位10を表示したい

参考：http://qiita.com/awakia/items/99c3d114aa16099e825d

```
SELECT
  pgn.nspname,
  relname,
  pg_size_pretty(relpages::bigint * 8 * 1024) AS size,
  CASE
    WHEN relkind = 't'
    THEN (SELECT pgd.relname FROM pg_class pgd WHERE pgd.reltoastrelid = pg.oid)
    WHEN nspname = 'pg_toast' AND relkind = 'i'
    THEN (SELECT pgt.relname FROM pg_class pgt WHERE SUBSTRING(pgt.relname FROM 10) = REPLACE(SUBSTRING(pg.relname FROM 10), '_index', ''))
    ELSE (SELECT pgc.relname FROM pg_class pgc WHERE pg.reltoastrelid = pgc.oid)
  END::varchar AS refrelname,
  CASE
    WHEN nspname = 'pg_toast' AND relkind = 'i'
    THEN (SELECT pgts.relname FROM pg_class pgts WHERE pgts.reltoastrelid = (SELECT pgt.oid FROM pg_class pgt WHERE SUBSTRING(pgt.relname FROM 10) = REPLACE(SUBSTRING(pg.relname FROM 10), '_index', '')))
  END AS relidxrefrelname,
  relfilenode,
  relkind,
  reltuples::bigint,
  relpages
FROM pg_class pg, pg_namespace pgn
WHERE pg.relnamespace = pgn.oid AND pgn.nspname NOT IN ('information_schema', 'pg_catalog')
ORDER BY relpages DESC
limit 10; 
```

# テーブルごとのvacuumの最後の実行時間が知りたい

```
select * from pg_stat_all_tables where relname = 'テーブル名';
```

# デッドロックの状況が知りたい
参考：http://longkey1.net/blog/2012/11/08/postgresql-practice-when-deadlock/
参考：http://zx.jpn.org/b/20141026/386/postgresql/postgresql-howto-find-lock-sql

```
select *
from pg_locks
left join pg_stat_activity using(pid);
```

## ついでにロックを解除
プロセスID = pid

```
SELECT pg_cancel_backend(プロセスID);
```

# 文字列をbase64エンコード/デコード
## エンコード
```
select encode('dummy', 'base64');
```

## デコード
```
select encode(decode('ZHVtbXk=', 'base64'), 'escape');
```
jsdoでshadertoy sandbox

#概要
思えば、jsdoでshadertoyのコードを実行したいだけの一年だった。

#写真
![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/I/y/g/IygL.jpg?t=1481797787)

#成果物
39個のリンクがある。
http://jsdo.it/ohisama1/MNUz

#記事リンク

http://qiita.com/ohisama@github/items/5501086139319ea9ebb8
http://qiita.com/ohisama@github/items/b11b2864ae0ef65fe238
http://qiita.com/ohisama@github/items/29a16de03af0b06875d3
http://qiita.com/ohisama@github/items/d42f6e4423eeb8071f88
http://qiita.com/ohisama@github/items/e994e26282f47aab6e2f
http://qiita.com/ohisama@github/items/c6d03c727d9ee2601e49
http://qiita.com/ohisama@github/items/45e1838d24377602f707

#力不足
buf a b c d が、どうしても、実装できない。
どんなトリック使っているのか、検討もつかない。
http://jsdo.it/ohisama1/GOw3
どなたか、ヒント下さい。
rails api mode に対してcurl で postした時にはまったので深掘りしていく

scaffold で以下の雛形を作成してそこにデータを保存して行く。　何でも屋みたいになってきていて嫌だけど、僕の特技は最短でキャッチアップしてそれっぽいもの作ることなのでまぁ苦ではないんだけど、、、

４月には何をどうするか決めて、それ以外の余計なものをできるだけ減らしていこうと思う。あとは色々な人にあって話して、方向性決めて行こう。



```
curl -H "Content-Type: application/json" -d '{"user":{"name": "u-kan", "body": "bodybody"}}' http://localhost:3000/users
```

### 一応解説

#### curl 
terminalからhttpリクエストを送信する。超便利。

#### -H オプション

ヘッダを追加できる。これ必須。恐らく、rails内部でのencoding処理とかが少し変わってくるんだと思う。

```
Content-Type: application/json

```

実験

```
# content-typeを指定した場合のserver側で受け取ったhash
{"user"=>{"name"=>"u-kan", "body"=>"bodybody"}}

# 指定しなかった場合
{"{\"user\":{\"name\": \"u-kan\", \"body\": \"bodybody\"}}"=>nil}
```

content-typeによって処理が違うらしい。ここで疑問。
#### curl でPOSTした場合の defaultのcontent-typeって何？

以下のコマンドを叩くと、curlコマンドを叩いた時のログを特定のfileに出力できる。 --trace-asciiの他のオプションに、--traceってのもあるんだけどこっちだとbinaryが出力されちゃうので注意。（[参考：curlコマンドの使い方](http://qiita.com/yasuhiroki/items/a569d3371a66e365316f)）

```
curl -d '{"user":{"name": "u-kan", "body": "tarou"}}' http://localhost:3000/users --trace-ascii tmp.log
```

結果の一部はこんな感じ。

```tmp.log
Content-Type: application/x-www-form-urlencoded
```

どうやらx-www-form-urlencodedってのがdefaultっぽい。こいつが何者か[調べて見る](https://wiki.suikawiki.org/n/application%2Fx-www-form-urlencoded)と、広く使われてるけど結構仕様が固まってないフォーム提出形式の１種らしい。

とりあえず、理由はぐぐってもなかなかでてこないんだけど、忘れずに指定すればおっけー

泣き言なのですが、これの理由がわからないので、誰か教えてくださるととても助かります。。泣

#### -d　オプション

これは送るデータを指定できる。ファイルを送ったりもできるし色々便利っぽいけど、疲れちゃったのでまた今度
初心者が先輩からもらったワークフローに関する超初級フィードバックまとめ（IP）

プロジェクトのルールや規則はチームによって異なると思いますが、ここでは入門者がプロジェクトに関わっていく上でもらった超初級なフィードバックを備忘録としてまとめておきたいと思います。随時更新予定です。

#ワークフロー全般に関するフィードバック
1. <a href="http://qiita.com/weedslayer/items/ee4bef1a7fcb870b659c#%E3%83%97%E3%83%AB%E3%83%AA%E3%82%AF%E3%82%92%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AF%E5%BF%85%E3%81%9Aupdate-from-master%E3%82%92%E3%81%99%E3%82%8B">プルリクをするときは必ずUpdate from masterをする。</a>（2016/12/26 Mon）
2. <a href="http://qiita.com/weedslayer/items/ee4bef1a7fcb870b659c#%E3%83%97%E3%83%AB%E3%83%AA%E3%82%AF%E5%89%8D%E3%81%ABpcspiphone5--6--6plus%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C%E3%81%AE%E7%92%B0%E5%A2%83%E3%81%A7%E6%AD%A3%E3%81%97%E3%81%8F%E5%8B%95%E4%BD%9C%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8">プルリク前にPC/SP(iphone5 , 6 , 6plus)それぞれの環境で正しく動作しているか確認すること</a>（2016/12/26 Mon）
3. <a href="http://qiita.com/weedslayer/items/ee4bef1a7fcb870b659c#%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%AE%E5%91%BD%E5%90%8D%E8%A6%8F%E5%89%87%E3%82%92%E8%A6%9A%E3%81%88%E3%82%8B" target="_blank">ブランチの命名規則を覚える</a>（2016/12/26 Mon）

##プルリクをするときは必ずUpdate from masterをする。
自分がコードを書いてる間に他の人もコードを書いてアップデートしているから、それを自分のソースコードにも反映してプルリクをすること。最悪の場合、そのままmasterにsyncしてdeployしてしまうと他の人のアップデートが本番のソースコードから消える。また、アップデートする際は必ずコンフリクトを起こしてないか確認し、コンフリクトしている場合は解消すること。

##プルリク前にPC/SP(iphone5 , 6 , 6plus)それぞれの環境で正しく動作しているか確認すること
iphoneのバージョンによって画面の大きさが違うので一度作業を終えたら全てのバージョンで正しく想定通りの挙動を確認できるかという作業を怠ってはいけない。Chromeのdevtoolをつかってサイズを変えて確認していくのが王道だと思います。

##ブランチの命名規則を覚える
1. github上でissueをきる。
2. ブランチを切る。その際にissueの番号を先頭につける（i.g. xxx-implement-youtube-embeds）
3. 作業開始

その他コミットの頻度やブランチを切ったあとのワークフローについては以下を参照。

- <a href="http://qiita.com/weedslayer/items/02501c50c5d7c44b21cc" target="_blank">備忘録としてのgit/hubを使った基本的なワークフロー</a>
- <a href="http://qiita.com/kozyty@github/items/87fa95a236b6142f7c10" target="_blank">Git 作業における commit と push の頻度について</a>

個人的にはcommit/push単位とその理由が参考になりました。

>コミットの最大粒度は1タスク
>たとえタスクが途中でもキリが良ければ即コミット

>コミットの頻度を細かくする理由

>- 自身の見積もり精度やタスク管理能力向上
- 複数タスクが混在したコミットは悪
- コミットとタグの相性UP
- Pivotalなどの外部サービスとの連携が容易
- 履歴を参照する際のコスト低下(log, reset, bisect, rebase時など）
- 自分や他人がみてもcommit内容の把握が容易
- プッシュの頻度を細かくする理由

>大きなコンフリクト発生頻度低下

>- git pull の頻度も自然と上昇
- チーム間での状況共有が容易
- コードは即他人に晒すという意識向上
PHPMailerの脆弱性CVE-2016-10033はWordPressにどの程度影響するのだろうか

まず前提として、PHPMailerの脆弱性は
https://github.com/opsxcq/exploit-CVE-2016-10033/blob/master/www/index.php#L33
この箇所のコード、外部からの入力`$email`を送信者アドレスとして`$phpmailer->setFrom($email, $name)`と設定することで発生する。
または直接`$phpmailer->Sender = $email`としても同じ。

それ以外では`PHPMailer`の`Sender`プロパティが書き換わることは無く脆弱性も発生しないという認識なんだけれども。合ってるだろうか。

WordPressのメール送信は`wp_mail`という関数で実行されていて、そこには

```php
       /**
         * Filters the email address to send from.
         *
         * @since 2.2.0
         *
         * @param string $from_email Email address to send from.
         */
        $from_email = apply_filters( 'wp_mail_from', $from_email );

        /**
         * Filters the name to associate with the "from" email address.
         *
         * @since 2.3.0
         *
         * @param string $from_name Name associated with the "from" email address.
         */
        $from_name = apply_filters( 'wp_mail_from_name', $from_name );

        $phpmailer->setFrom( $from_email, $from_name, false );
```
とある。基本的に送信者は全体で共通になっている。かつ第三引数が`false`なので`Sender`が書き換わらない。


WordPressの他のメール送信機能では、例えばプラグインのContact Form 7がある。
が、デフォルトの送信者アドレスは固定になっている。

http://ryus.co.jp/blog/contactform7-error/
こちらに書かれているように`[your-name] <[your-email]>`という設定になっているとフォームの入力値が設定される。
しかし、そもそもContact Form 7は`PHPMailer`の`setFrom`を呼び出しておらず、`Sender`が設定されない。
なので、`Sender`を書き換えるには上記設定に加えて
http://2inc.org/blog/2013/08/05/3459/
ここに書かれているようなカスタマイズをしないといけない。（ここでは固定値なのでもうひと手間かかる）

ここまでやって得られるのは`Return-Path`書き換えによるSPFレコード不一致によるスパム判定なので、WordPressで該当する人は多くないんじゃないだろうか。
SPFレコードが使われるようになってから、送信者アドレス（`From`でなく`Return-Path`）をフォームの入力値で書き換えること自体がおかしいとも言える。


まあでもContact Form 7はたまたま該当機能を使っていなかっただけで、PHPMailerの

```php
    /**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param boolean $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return boolean
     */
    public function setFrom($address, $name = '', $auto = true)
```

`$auto = true` が初期値になっているので、`From`を変えたいだけなのに`Return-Path`も変わってしまってSPFでエラーになるし脆弱性も発生するしという状況もあるのかもしれない。
Parallelsのwindowsでログインできなくなった時のリセット方法

![スクリーンショット 2016-12-28 12.14.03.png](https://qiita-image-store.s3.amazonaws.com/0/1901/1bc298c5-5454-0eca-7786-d2c6956f1048.png)

[Parallels](http://www.parallels.com/jp/)でWindowsを利用していて、ログインできなくなった時のリセット方法です。

環境

* macOS Sierra
* Parallels Desktop 12 for Mac
* Windows 10

## 仮想OSのリストを表示して、UUIDを確認します

```
$ prlctl list --all
```

```
MacminiSSD:~ srea$ prlctl list --all
UUID                                    STATUS       IP_ADDR         NAME
{825ddef4-3f6c-43e4-b622-8ab19720c1d8}  running      -               Windows 10
{c6713007-7c6e-4998-ae16-75737d968fca}  running      -               Windows 10 2
```

## リセットしたいUUIDをコピーしてローカルアカウントを設定

```
prlctl set {UUID} --userpasswd {user id}:{password}
```

```
MacminiSSD:~ srea$ prlctl set abcdefgh-3f6c-43e4-b622-8ab19720c1d8 --userpasswd srea:srea
Authentication tokens updated successfully.
Success. The operation was successfully completed.

The VM has been successfully configured.

```

## 以上で完了です

上記で設定したアカウント情報で、ログインしてみましょう

[Original](https://tamazawa.net/2016/12/28/parallelsのwindowsでログインできなくなった時のリセット方/)
モナドのまほう　第15話『babylon.jsの水面マテリアルの流れは絶えずして』

[第一話](http://qiita.com/hiruberuto/items/5321d8cebce7b87851f6) / [前回](http://qiita.com/hiruberuto/items/910354220d14d597b876) / [デモ](https://aratama.github.io/cubbit/) / [ステま](http://magicofstella.com/)

ゲームを作る日記です。ステラのまほうのアニメの続きを観たすぎたので、この記事のタイトルを変えました。

# 水面マテリアルを移植しました

バグで動かなかったbabylonjsの水面マテリアルですが、悪さをしていたデコレータの部分をコメントアウトし、バグを回避する形にして無理やり使えるようにしました。ソフトウェア開発なんてどうせ最後はこういう力技です。

![water.png](https://qiita-image-store.s3.amazonaws.com/0/64695/daacae26-e650-1dc8-859c-38107335864b.png)

おーキレイキレイ。風で水面にさざ波が立っていて、デモを動かすとわかると思いますがちゃんとアニメーションもしています。本作のややディフォルメされたグラフィックデザインの中にあってはちょっとわざとらしい感もありますが、以前のゼリーみたいな水面とは段違いです。そしてかなり重いです。水面のレンダリングリストに入っているのがスカイボックスだけならまあなんとかというところなんですが、周囲の地形まで水面に反映させようとすると重くてゲームになりません。すごいグラボのマシンを持っているひとならいいのかもしれませんが……。あと何か微妙に反射が変な部分がありますし、設定をオフにしても再読込するまで重いままになるバグがあります。

# 多言語化しました

多言語化しました。コンフィグ画面で日本語と英語を切り替えることができます。英語だってだけで敬遠する人も多いでしょうし、私も英語でキャラクターのセリフを書くのはさすがにキツいです。シナリオはたぶん一旦日本語で書いてから英語に翻訳する形になりそうです。

![malti.png](https://qiita-image-store.s3.amazonaws.com/0/64695/bc490cbd-f286-eaf5-3526-f855fa0cee55.png)

テキストデータはハードコーディングされています。編集には再コンパイルが必要ですが、まあ書くのはどうせぜんぶ私なので問題はないでしょう。最初にアクセスしたときに`navigator.language`プロパティを読み取って言語を判定し、デフォルト値として使用しています。




# アツマールのメモ

ニコニコのRPGアツマールのAPIドキュメントが公開されたようです。自分で調べる必要なかったですね。

* [ニコニコ自作ゲームフェス
RPGアツマール ゲームAPI仕様書](http://ch.nicovideo.jp/indies-game/blomaga/ar1163608)

[rpgatsumaru.js](http://html5.nicogame.jp/core/player/js/rpgatsumaru.js)ってのがAPIを提供しているみたいですが、このあたりを眺めただけじゃ使い方はよくわからないです。そのうちコメント対応の実験してみます。

* [【ゲーム企画支援】全力ゲーミング!!!参加募集開始](http://blog.nicovideo.jp/atsumaru/2016/12/post-1.html)

ふむふむ。企画書書いて採用されれば３０万円くれて、他にもいろいろ特典があるみたいです。私はプロモーション活動はすごく苦手なので、プロモーション打ってくれるなら嬉しいですね。

> ・制作方法はRPGアツマールに投稿できるHTML5ゲーム形式であれば自由です。ツクールMVである必要はありません。

アツマールはツクールMV製以外は考慮に入っていないのかと思っていましたが、HTMLゲームなら別に構わないみたいですね。APIも公開されたことだし。

> また、完成したゲームについては、本サイト**だけ**に投稿頂くことを予め承諾します。

OH……アツマール『だけ』っていう条件はなかなか厳しいですね。アツマール専用に企画を立てろってことでしょう。今作ってるゲームはオンラインマルチプレイ前提で、アツマールからではFirebaseに接続不可なので、技術的制限もあって私はそもそもまったく対象外のようです（まあシングルプレイモードはあるんですが）。別のゲームをつくる余裕はないので、誰かフリゲを作る予定のある人は応募してみてはどうでしょうか。

# TODOリスト

マルチプレイヤーモードよりもシングルプレイヤーモードのほうが作業量が多い！　ので、ひと通り形になったら、ひとまずマルチプレイヤーモードの完成を目指すのが良さそうです。

#### モード共通

* 操作ガイド（簡単だが面倒くさい）
* 全画面対応（簡単）
* ゲームパッド対応（簡単）
* 一人称視点での地形編集のバグ修正及び機能拡充（簡単）
* ブロックの種類の拡充(簡単だが作業はエンドレス）
* BGM製作（難しい。やりたいが作曲ノウハウがゼロ。素材で代替可能なので優先順位低）
* ~~リソース取得の遅延（難しいし面倒くさい）現状の最初に一括してダウンロードするのは、安心ではありますがとにかく遅い！でも最初にロードしてしまったほうがプレイ時のストレスが小さいんですよね。シーンの切替時に長いロードが挟まるのは嬉しくない~~ いろいろ考えましたが、どんなに時間がかかろうが最初にすべてのリソースを読んでしまったほうがプレイが快適だという結論に。コンパイルが遅延されているせいでキャラクターモデルが一瞬不自然に表示されてしまう問題を、むしろどうするか……。

#### マルチプレイヤーモード

* マルチプレイ用キャラクターモデル作成（難しくはないが作業量が多い）

#### シングルプレイヤーモード

* RPGアツマールのコメント機能対応実験（簡単）
* 表情アニメーション（難しい）（具体的には[スクストのコレ](http://www.jp.square-enix.com/info/images/image_technical_seminar2014_06/pdf/SQEX_DevCon_sugimoto.pdf)を実装したいです）
* フルモーションシーン（プログラミング側は簡単だがBlender側が大変)
* シナリオ執筆（わりと難しい。フルモーションシーンが流せるようになってから？）




前に買ったゲームパッド、どこ行ったんだろ……。

# 次のお話

* [第16話](http://qiita.com/hiruberuto/items/02cea526f5487d579cec)
RuntimePermissionに対応する

## RuntimePermissionに対応する

RuntimePermissionについてはこちらを参照
https://developer.android.com/training/permissions/requesting.html

独自で権限チェックを行っていましたがコードがすっきりしそうなので以下のライブラリを使用しました。

PermissionsDispatcher
https://github.com/hotchemi/PermissionsDispatcher

上記GitHubにも使用方法が記載されていますが、備忘のために簡単に使い方・使用感などをまとめたいと思います

## class

権限を要求するクラスに@RuntimePermissionsを付与します。
これにより
上記のクラス名 + PermissionsDispatcher というクラスが自動生成されます。
一度アプリを実行しないと生成されないのでご注意ください。

## gradle

Gradleに以下を追加します。
この時点での最新バージョンは2.2.1でした。

``` app.build.gradle

dependencies {

    compile 'com.github.hotchemi:permissionsdispatcher:2.2.1'
    annotationProcessor 'com.github.hotchemi:permissionsdispatcher-processor:2.2.1'

}

```

## 権限を要求するメソッド

NeedsPermissionが必要なメソッド名がneedMethodであればその部分を
needMethodWithCheck()に変更し呼び出します。

上記のクラス名 + PermissionsDispatcher.needMethodWithCheck()
という形になります。

## 各アノテーションについて

```
@NeedsPermission(Manifest.permission.CAMERA)
```
パーミッションが必要なメソッドにつけるアノテーション
ここで権限が必要な処理を行います

```
@OnShowRationale(Manifest.permission.CAMERA)
```
許可しないを1回されているユーザに対して何をするか。
これは仕様により行いたい事は色々です。

再度権限を要求するようであれば以下のような実装で問題ない

```
@OnShowRationale(Manifest.permission.CAMERA)
public void onRationale(PermissionRequest request) {
    request.proceed();
}
```

```
@OnPermissionDenied(Manifest.permission.CAMERA)
```

許可しないをタップされた後の処理を記載します。

```
@OnPermissionDenied(Manifest.permission.CAMERA)
public void onPermissionDenied() {
    // 許可されなかった場合に行う処理
}
```

```
@OnNeverAskAgain(Manifest.permission.CAMERA)
```

今後は表示しない（許可しないを1回おされていると表示されます）
が選択されてしまった場合にとるアクションを記載します。

ただしこのライブラリの場合は、一度選択されてしまうと毎回この中の
処理が実行されてしまうためダイアログなどを表示していた場合はかなりくどい展開となります。

そのあたりは仕様次第なところがありますが念のため

## まとめ

今回は既存の自前チェックをライブラリでおきかえるという使用方法でしたが
特にハマりどころもなく簡単にのせかえでき便利でした。

一点だけハマったのは既存コードの置き換えだったためNeedsPermissionが必要な
メソッドがprivateになっていて予期した動作にならなかった事くらいでした。

皆様も便利にRuntimePermissionに対応してしまいましょう。
MongoDB distinct & Mongoose by  node.js


# ▪️今日のお悩み

- MongoDBでdistinctってどうするの？
- それをnode.jsで組み込みたいのだけど・・・。

# ▪️解決

## > MongoDBでのコマンド
- [db\.collection\.distinct\(\) — MongoDB Manual 3\.4](https://docs.mongodb.com/manual/reference/method/db.collection.distinct/#distinct-method-options)


- サンプルデータ
    - [MongoDB aggregateion 簡単サンプルコマンド & Mongoose\#Aggregate\(\) by node\.js \- Qiita](http://qiita.com/bohebohechan/items/d18d0f90fd770a1d6d54#-aggregation%E3%81%99%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E6%BA%96%E5%82%99)

- 実行コマンド

```
> db.topics.distinct("room");
[ "room_1", "room_2" ]
>
```



## > Mongoose by  node.js

```
//distinct function
function getDistinctRoom(callback){
    TopicModel.find().distinct('room',function(err,result){
        if(err){
            console.log(err);
            callback(err);
        }
        callback(null,result);
    });
}
```
caskで入れたVagrantのバージョンアップ


```bash
$ vagrant -v
Vagrant 1.8.1
```

だったのでcaskでアップデートしたかったんだけど
`update`でも`install`でも上手くいかなくて
最終的に`reinsall`が正解だったということを知った

```bash
$ brew cask reinstall vagrant
```

↓

ちゃんと1.9.1になりました。

```bash
$ vagrant -v
Vagrant 1.9.1
```
Haxeでデータベースにアクセスしてみる

Haxeでデータベースにアクセスしてみる初めの一歩です。

Haxeには`sys.db.*`というモジュール下にデータベースに接続・操作するためのクラスが配置されています。

dbモジュールは、python, neko, java, macro, cpp, lua, phpで利用できるとドキュメントに記載されています。

macroで利用出来るなんて面白そうですね！

---

この投稿ではHaxeでDBアクセス事始めということで簡単なデータベース操作をするコードを見てみます。

```hx
class Main {
    static function main() {
        #if php
        // DBとのコネクションを確立します
        var con = Sqlite.open("sample.db");

        // トランザクションの開始
        con.startTransaction();

        try {
            // テーブルを作成して、データを登録します
            con.request("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT);");
            con.request("INSERT OR IGNORE INTO users (id, name) VALUES (1, '太郎'), (2, '次郎'), (3, '三郎');");
            con.commit();

            // 登録したデータを取得します
            var resultSet = con.request("SELECT * FROM users;");
            trace(resultSet.results());
        } catch(e: Dynamic) {
            // 例外がスローされたらロールバック
            trace(e);
            con.rollback();
        }

        con.close();
        #end
    }
}
```

これがDBアクセスの一連の流れになるコードです。
どの言語を利用しても、このあたりのコードはだいたい同じですね。

実際には、このような操作をより抽象化したクラスが用意されているのでそちらを利用することになると思います。
Let's Chat で特定文字列を別のサイトにリンクする

Let's Chat のメッセージ中、 `@matobaa` や `#slug` と書くと名前やRoomへのリンクになります。これ、たとえば `rfc:2882` と書いたら rfc-editor.org にある[RFC2822のページ](https://www.rfc-editor.org/rfc/rfc2822.txt)にジャンプできたりしたら便利になりますよね。

Let's Chat ではそのための仕組みが準備されていました。

# テンプレートを書けます

extra/replacements/local.yml に以下のように書くことで実現できます:

```yaml
- regex: \brfc:(\d{1,6})
  template: <a href="https://www.rfc-editor.org/rfc/rfc$1.txt" target="_blank">rfc:$1</a>
- regex: \bth:([\w:]+)\b
  template: <a href="https://trac-hacks.org/intertrac/$1" target="_blank">th:$1</a>
```

これで　ITSのチケットと連携したり、コミットログと紐づけたり、[InterTrac](https://trac.edgewall.org/wiki/1.1/InterTrac) のようなことを実現できますね!!

# fileスキーマもね

IE11とChromeで、file:スキーマのリンクが使えるようにしよう。

```yaml
- regex: \bfile:(.*)
  template: <a href="file:$1" onclick="javascript:this.href=decodeURI(this.href); return true;" target="_blank">file:$1</a>
```

Chromeの場合、そのままではfileリンクは開けないですが、起動時オプションで ` --allow-file-access-from-files` を追加してやれば、file:リンクも開けるようになります。便利!!

Safari、Firefoxは使っていないのでわかりません。だれか試してもらえるとうれしい。
[:mag:]ってなに？

気になったこと：[:mag:](https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=qiita) のこと。
```[:mag:](https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=qiita)``` のようにしてGoogleへの検索結果を表示するなどの表現が行える。
***
<font color=red>結論：``` ` ``` で囲われた文字列がQiitaで定義されている絵文字のキーワードであれば、絵文字に代わる。 ```:mag:``` なら :mag: となる。定義されていないキーワードは、そのまま表示される。例：```:hoge:```と記述→:hoge:
上記の例では、これを利用し、リンクテキスト内の表示を絵文字だけにし、URLをGoogleの検索結果としている。
***
つい最近、ygknさん(ヤギちゃん？)の記事「[ググり方の作法](http://qiita.com/ygkn/items/5febd0dfedcd989dc49a)」で、検索マークのボタンでGoogleの検索に飛んでいるのを見ました。

あら、やだ、なに、これ便利。
っと思い、早速どうやっているか、「Markdownで本文を見る」で確認してみて、どのように実現しているかがわかりましたので、試してみます。

Google側で検索を行った後にurlをコピペして、
```
[:mag:](https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=%E3%81%BB%E3%81%92)
```
のようにします。

例：
ほげって結局なんなのさ。検索 [:mag:](https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=%E3%81%BB%E3%81%92) してみた。

```
ほげって結局なんなのさ。検索 [:mag:](https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=%E3%81%BB%E3%81%92) してみた。
```

はぇ～ それにしても、いろいろあるなぁ～。

でも、```[:mag:]```でそのまま検索 [:mag:](https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=%5B:mag:%5D) してみましたが、それらしい情報を見つけられず。
[Markdown記法 チートシート](http://qiita.com/items/c686397e4a0f4f11683d) にもないし、あるぇ～？ 隠し機能？？
まぁとりあえず、使っていきながら考えてみます。

# 追記
yuku_tさん、ygknさんにコメントを頂き、次の記事を作成しました。

- [Markdown記法の理解が不十分で絵文字機能も理解していなかった](http://qiita.com/rrryutaro/items/e723fcfbf6dfc87c15fd)

また、今回記事の元となった表現は、次のような点でよい表現だと考えていますので、今後とも利用していこうと考えています。

- 何々を検索したとあるが、実際にどのような検索を行ったのかの状況を再現するのによい（例えば今回次のように検索していた [:mag:](https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=%5B%3Amag%3A%5D)）
- 記事の投稿から時間が経過しても、検索用の情報を用意しておくことで、その時点での最新情報に素早くアクセスできる。投稿者が後々になっても最新情報を取得できるであろうキーワードを準備しておくことで、記事の劣化が防げるのでは

以上
何らかの事情でbluetoothでWindowsからMacのファイルをBluetoothで操作する場合の対処法

bluetoothは大量のデータ転送をするための規格ではないので本来邪道ですし，大変遅いです

- WindowsとMacの双方でbluetoothを有効にし、いずれかを検出可能にしてペアリングしておく
- Macのシステム環境設定→共有→Bluetooth共有をオンにする。
    - ペアリングしたデバイスしかアクセスできないので、ブラウズを許可するフォルダは比較的広くとってOK
- Windows 10側のクライアントは[BlueFTP](https://www.microsoft.com/ja-jp/store/p/bluetooth-file-transfer-blueftp/9nblggh627zb)がお勧め
- そのままでもWindows 10の設定→デバイス→bluetooth→Bluetoothでファイルを送信または受信します で送ることができる
よく使うJavaジェネリックス

ジェネリックス(総称型)の使い方が混乱したのでよく使う例を書いてみました。

# クラスの引数として決めるたい

```java
public class Foo<T> {
    T t;
    public T get() {
        return t;
    }
    public void set(T t) {
        this.t = t;
    }
}
```
複数をパラメータを利用するときは```Foo<T, U>```とカンマで区切っておけばいいです。

# サブクラスを強制しておきたい

```java
public class Foo<T extends Parent> {
    T t;
    public T get() {
        return t;
    }
    public void set(T t) {
        this.t = t;
    }
}
```

# あるメソッドを使うときだけ
クラス全体で指定しておくと一時的に決めたいときに不便です。
例えば、Listを配列に変換したいときに

```java
List list = new ArrayList<String>();
list.add("foo1");
list.add("foo2");
list.add("foo3");
String[] strList = list.toArray(new String[list.size()]);
```
のようにtoArrayメソッドを使うことがあると思います。このときの実装は

```java
public class Foo {
    public <T> T get(T t) {
        return t;
    }
}
```

このとき引数の型を見てTが決定されます。

*※話はそれますが、java8以降ラムダ式が導入され、List(Collection)がとても使いやすくなったので配列に変換する実装にしないほうがよさそうです。*

# インスタンスは生成できない
当然といえば当然ですが、```new T()```なることはできません。理由はTが何者であるかわからない以上、インスタンスが生成できる保証がないからでしょう。

```java
public class Foo<T extends Parent> {
    public T get() {
        return new T(); // できない!!
    }
}
```

`new T()`するようなコーディングを実現するにはjavaリファクタリングを利用してClassクラスからインスタンスを生成するとできるみたいですが、パフォーマンスが非常に落ちるようです。
CSS3 border-image が便利すぎ

背景画像を9スライスで表現するには、以前はDOMとCSSを駆使していましたが、CSS3の border-image を使うことでDOMを増やすことなく9スライス背景画像を使えるようになっていました。　とっても便利すぎたので、メモ。

ツールもあります。
こちらのサイトでは、指定した画像を9スライスしたCSSを簡単に作成することができます。
http://border-image.com/

あと、できたCSSに追加で下記も含めると幸せになりそうです。
`box-sizing: content-box;`

他にも下記のような指定で、さらに外側に border-image を表示することも可能です。
`border-image-outset: 50px 30px 60px !important;`
Perlで既存Excelファイルにデータを書き込んで保存する方法(前ゼロが消えない方法)

# 結論
Spreadsheet::ParseExcel::SaveParserとWriteExcelの合わせ技で解決できた！

# 1.素直にParseExcel::SaveParserを使用してみる
```pl
# ベースとなるxlsファイルを読み込む
my $base_xls_path = $FindBin::Bin . '/base/filename.xls';
my $parser = Spreadsheet::ParseExcel::SaveParser->new();
my $template = $parser->Parse($base_xls_path);

my $worksheet = $template->worksheet(0);

# ファイルに書き込み
my $row = 0;
for my $list_data (@xls_datas) {
    $worksheet->AddCell($row, 0, $list_data->{氏名});
    $worksheet->AddCell($row, 1, $list_data->{郵便番号});
    $worksheet->AddCell($row, 2, $list_data->{電話番号});

    $row++;
}

# 名前を付けて保存
my $dl_file = 'new.xls';
my $save_xls_path = $FindBin::Bin . '/' . $dl_file;
$template->SaveAs($save_xls_path);
```
よし！これで行けるはず！！
と思ったら、電話番号の先頭0が消えてしまうという。
Excelめ！

# 2.SaveParserからWriteExcelオブジェクトが取得できることが判明！
試行錯誤していると、下記の記事にたどりつく。
http://www.perlmonks.org/?node_id=1056659

> (和訳)SaveParserからWriteExcelが使えるよ

実際にやってみた。

```pl
# ベースとなるxlsファイルを読み込む
my $base_xls_path = $FindBin::Bin . '/base/filename.xls';
my $parser = Spreadsheet::ParseExcel::SaveParser->new();
my $template = $parser->Parse($base_xls_path);

# 名前を付けて保存
my $dl_file = 'new.xls';
my $save_xls_path = $FindBin::Bin . '/' . $dl_file;
my $workbook = $template->SaveAs($save_xls_path); # WriteExcelオブジェクトが返却される
# デフォルトフォント設定
my $default_format = Spreadsheet::WriteExcel::Format->new(
    15, # default font
    font => 'ＭＳ Ｐゴシック',
    size => 11, # フォントサイズ
    text_wrap => 1, # セル内改行のために必要
    border => 1
);
$workbook->{_formats}->[15] = $default_format;
my $worksheet = $workbook->sheets(0);

# 送付リストファイルに書き込み
my $row = 0;
for my $list_data (@xls_datas) {
    $worksheet->write_string($row, 0, $list_data->{氏名});
    $worksheet->write_string($row, 1, $list_data->{郵便番号});
    $worksheet->write_string($row, 2, $list_data->{電話番号});

    $row++;
}

$workbook->close();
```
rails5 で ruby2.3 --> ruby2.4 バージョンアップ時トラブル

# 前提
- rails5.0.0.1
- ruby2.3.3 で動いていた
- ruby2.4.0 にしたら動かなくなった

# トラブル
## therubyracer
エラー:

```
therubyracer-0.12.2/lib/v8/conversion.rb:23:in `include': wrong argument type Class (expected Module) (TypeError)
```

対応:
therubyracer を消した
参考: http://naruse.hateblo.jp/entry/2016/01/08/134941

## FactoryGirl
エラー: 

```ruby
after(:create, &:some_method)
```

```
NoMethodError: undefined method `some_method' for #<FactoryGirl::SyntaxRunner:0x007ff8a37f17e8>
```

対応: 
エラーが起こる箇所を下記に書き換えたらなぜか直った

```ruby
after(:create) do |model|
  model.some_method
end
```

参考:ruby のバグの模様 https://bugs.ruby-lang.org/issues/13074

## rails 5.0.0.1
エラー:
Authlogic のパスワード設定処理で下記エラーが発生

```
ArgumentError:
       key must be 32 bytes
```

対応:
rails を 5.0.0.1 から 5.0.1 にした。
こちらの PR で直った模様 https://github.com/rails/rails/pull/25192
switch_pointを使いながら、発行SQLと接続先情報を一緒にログに落としてみる

このエントリーは、Money Forward Advent Calendar 2016の記事です。

終わってみたら空きがあったので、埋めてみました。

# SwitchPoint
負荷分散などの目的で、read SQLはSlaveへ向ける、などの処理を記述する場合、switch pointなどのgemを使用するかと思います。

https://github.com/eagletmt/switch_point

その際、SELECT文が正しく readonly DBに向けて発行されているのか？
などを確認したくなりました。

# ARPRoxy
https://github.com/cookpad/arproxy

arproxyは、ActiveRecordが発行したSQLがDB Adapterによって実行される直前に処理を差し込むことができます。

[Arproxy ActiveRecordが発行したSQLを加工できるGem - 酒と泪とRubyとRailsと](http://morizyun.github.io/blog/arproxy-active-record-sql-gem-proxy/)
こちらの記事が分かりやすい

# ログに落としてみよう
switch_pointの情報は、 `def execute` 内で

````rb
$ self.proxy_chain.connection.instance_variable_get(:@config)[:switch_point]
=> {:name=>:hoge_db, :mode=>:writable}
```
という感じで取得できそうです。


## Loggerに
```rb
  class SwitchPointConnectionLog < Arproxy::Base
    def execute(sql, name=nil)
      database_config = self.proxy_chain.connection.instance_variable_get(:@config)

      Rails.logger.debug "host: #{database_config[:host]}, database: #{database_config[:database]}, switch_point: #{database_config[:switch_point]}"

      super(sql, name)
    end
  end

  Arproxy.configure do |config|
    config.adapter = "mysql2"
    config.use SwitchPointConnectionLog
  end
  Arproxy.enable!
```

## SQL Commentに
Loggerだと、SQLと同じ行に出力されないので

```rb
  class SwitchPointConnectionLogToSqlComment < Arproxy::Base
    def execute(sql, name=nil)
      database_config = self.proxy_chain.connection.instance_variable_get(:@config)

      sql += " /* host: #{database_config[:host]}, database: #{database_config[:database]}, switch_point: #{database_config[:switch_point]} */"

      super(sql, name)
    end
  end

  Arproxy.configure do |config|
    config.adapter = "mysql2"
    config.use SwitchPointConnectionLogToSqlComment
  end
  Arproxy.enable!
```

```rb
December 26, 2016 12:12345 [DEBUG] SQL (1.1ms)  UPDATE `hoge_db`.`users` SET `updated_at` = '2016-12-26 12:34:56' WHERE `hoge_db`.`users`.`id` = 1 /* host: localhost, database: hoge_db, switch_point: {:name=>:hoge_db, :mode=>:writable} */ (pid:12345)
```

もともと開発時に欲しかっただけなので、実際には、 `if Rails.env.development?` な条件にしてます。
ERB内で多重読み込みしてネストされたリストを出力する

## 何をするの？

ERB 内で多重読み込みしてネストされたリストを出力してみます。

```
Fun
  Sport
    Surfing
    Extreme knitting
  Friends
Work
  Reports
    Annual
    Status
  Trips
```

## コード

```rb
require 'erb'

MY_CATEGORIES = <<SPEC
Fun
<%= ERB.new(FUN, nil, '-', 'funs').result(binding) -%>
Work
<%= ERB.new(WORK, nil, '-', 'works').result(binding) -%>
SPEC

FUN = <<SPEC
  Sport
<%= ERB.new(SPORT, nil, '-', 'sports').result(binding) -%>
  Friends
SPEC

SPORT = <<SPEC
    Surfing
    Extreme knitting
SPEC

WORK = <<SPEC
  Reports
<%= ERB.new(REPORT, nil, '-', 'reports').result(binding) -%>
  Trips
SPEC

REPORT = <<SPEC
    Annual
    Status
SPEC

puts ERB.new(MY_CATEGORIES, nil, '-').result(binding)

# Fun
#   Sport
#     Surfing
#     Extreme knitting
#   Friends
# Work
#   Reports
#     Annual
#     Status
#   Trips
```

## まとめ的なもの

https://docs.ruby-lang.org/en/2.4.0/ERB.html#method-c-new

`eoutvar` の指定が必要でした。
HaxeはPHP7に対応しました

Haxe3.4からHaxeはPHP7に対応したコードを出力してくれるようになりました。

HaxeのPHP対応はやる気が無いなんて言われていましたが、そんなこともなかったんですね！
喜ばしいことです。

さて、軽くHaxeが出力するPHPのコードを見てみましょう。

> PHP7に対応したコードを出力するには`-D php7`というコンパイルフラグを設定しておく必要があります。
>
> これを設定しないとPHP7に対応していない、これまで通りのコードが出力されるので注意して下さい。

定番のHello worldで見てみましょう。

```hx
class Main {
    static function main() {
        #if php
        php.Lib.print("Hello world");
        #end
    }
}
```

さて、このようなコードはこれまではHaxeが独自定義するオブジェクトでラップされまくったPHPコードになっていたわけですがどのようにかわったのでしょうか？

```php
<?php
/**
 * Generated by Haxe 3.4.0
 */

use \php\Boot;

class Main {
	/**
	 * @return void
	 */
	static public function main () {
		echo("Hello world!!");
	}


	/**
	 * @return void
	 */
	public function __construct () {
	}
}


Boot::registerClass(Main::class, 'Main');
```

はい、大変スッキリしたコードになりました。
可読性も十分にあります。

PHPで開発する時、DocCommentを書くのが一般的ですがHaxeが出力するPHPのコードにもしっかりDocCommentが付与されています。

このコードをそのままPHPStromなんかで利用しても補完が効くようになるので素晴らしいですね。

ちなみに、`php.Lib.print`はPHP7非対応版だと、専用のprint関数を呼び出していましたが、
PHP7対応版では文字列はそのまま`echo`し、文字列以外はそのオブジェクトを文字列に変換して`echo`するように変わっています。

~~PHPといえば配列ですが、Haxe3.4から`php.NativeArray`という型が提供されるようになるようです。~~
`php.NativeArray`は昔からありました…

ちょっと使い方までは調べられなかったのですが、名前から察するにPHPの配列をそのままの形で出力してくれるものかもしれません。

そうだとすると、パフォーマンスの面でもメリットを傍受できるのでHaxeでPHPというのもそれなりに実用度が高くなってくるかもしれませんね。