OmniAICreator/Qiita-1.07M huggingface dataset:
ActiveRecordを使ってDBを操作する雑スクリプトを書く流れ


## ディレクリを作る
```
$ mkdir zatsu
$ cd zatsu/
$ bundle init
Writing new Gemfile to /Users/hogelog/tmp/zatsu/Gemfile
```

## ライブラリをインストール
ActiveRecordをGemfileに追加。他に使用するライブラリがある場合もGemfileに記述。
とりあえずここではスクリプトからMySQLに接続するのでmysql2ライブラリも追加。

```ruby:Gemfile
source "https://rubygems.org"

gem "activerecord"
gem "mysql2"
```

```
$ bundle install
...
```

## スクリプトを書く
```ruby:zatsu.rb
require "active_record"

ActiveRecord::Base.establish_connection(
  adapter: "mysql2",
  host: "localhost",
  username: "root",
  database: "sample",
)

class Article < ActiveRecord::Base
end

# 以下上記モデルを使った処理など
```
DB接続設定などもスクリプト中に書く。
これでActiveRecord+Rubyを使って柔軟にDB操作をおこなうことができる。
SQLだけじゃ足りないけど真面目にプログラム書く必要までないときはよくやる。


会社のGitHub Enterpriseだとまるっと個人的雑スクリプトリポジトリを作ってそこに放り込んでる。

## 実行する
```
$ bundle exec ruby zatsu.rb
```

うまくいったりいかなかったりする。いかなかったらなおす。うまくいったら喜ぶ。

## ログを取る
ものによってはログをとる。

```ruby:logging.rb
require "logger"

@logger = Logger.new(STDERR)
@logger.info "hoge"
```

```
$ bundle exec ruby logging.rb 
I, [2015-11-26T01:56:02.763632 #26408]  INFO -- : hoge
```



以上。
HP Stream 11の無線デバイス(rtl8732be)のドライバを野良ビルド(ただしyaourtを使う)

```sh
lspci
```

の結果，無線デバイスとして

```
01:00.0 Network controller: Realtek Semiconductor Co., Ltd. RTL8723BE PCIe Wireless Network Adapter
```

が表示される方．

```sh
sudo pacman -S linux-headers
yaourt -S rtlwifi_new-dkms
```

これでドライバを有志が作っているモノに変更出来ます．

たまに無線LANが切れることがある…という症状が解消出来るかもしれません．

rtl8723beは私の場合ですが，その他のrtlなんちゃらでも何かしら問題がある人はこれで解消出来るかもしれません．

ちなみに，Ubuntuでのこれのビルドとインストール方法は[過去に書きました](http://qiita.com/ka_/items/671bc04e7ee28c92cdf8)．
processingで綺麗な方程式を可視化する


![cli.jpg](https://qiita-image-store.s3.amazonaws.com/0/100800/3135407a-9216-f0ca-56b9-19376dd6a6a0.jpeg)


世の中には様々な数式が存在していてその中一つにClifford Attractorというものがあります
xn+1 = sin(a yn) + c cos(a xn)
yn+1 = sin(b xn) + d cos(b yn)
と非常にシンプルですが計算を繰り返す事でとても綺麗な数式です



ネットとかでsourcecodeがあるのか調べてみましたがなっかったので（もしあったらすいません...）
式を解析して書きました　独学なのでこの解析が正解どうかはわかりませんが


```clifford_attractor.pde
int count=40000;

float x=1;
float y=1;
float z=1;

float a=1.4;
float b=1.6;
float c=1;
float d=1.7;

float xn;
float yn;
float zn;

float rotate_x;
float rotate_y;




float [][] points=new float[3][count];

void setup(){
size(750,400,P3D);

//xn+1= sin(a*yn)-c*cos(a*xn)
//yn+1= sin(b*xn)-d*cos(d*yn)
//zn+1= sin(xn)

for(int i=0;i<count;i++){
 
xn= sin(a*y)-c*cos(a*x);
yn= sin(b*x)-d*cos(d*y);
zn= sin(x);

x=xn;
y=yn;
z=zn;

points[0][i]=x*100;
points[1][i]=y*50;
points[2][i]=z*100;

}

}

void draw(){
background(#000000);
 fill(#FFFFFF);
translate(width/2,height/2);

rotateX(rotate_x);
rotateY(rotate_y);

for(int i=0;i<count;i++){
 pushMatrix();

  beginShape(POINTS);
  vertex(points[0][i],points[1][i],points[2][i]);
  endShape();

stroke(#FFFFFF);
popMatrix();
 
}

 rotate_x+=0.03;
 rotate_y+=0.03;

}
```
ちなみにZ座標の式zn= sin(x)は奥行きを出したかったので僕が適当に書いたものです
100行のないのでコピペして使って下さい
PVectorクラスやシェーダーなど使ってアニメーションさせたら面白いかもですね～。
参考サイト
http://paulbourke.net/fractals/clifford/
brillo emulatorで中を覗いてみよう iptable編

[前回](http://qiita.com/hidenorly/items/7a3edcc73ba2d5b7a706) psの結果を見てみましたので、IOTというのもあり、iptableの中を見てみましょう

# iptable --listの結果

```
# iptables --list                                                              
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     udp  --  anywhere             anywhere             udp spts:bootps:bootpc dpts:bootps:bootpc
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:5555
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     udp  --  anywhere             224.0.0.251          udp dpt:mdns

Chain FORWARD (policy DROP)
target     prot opt source               destination         

Chain OUTPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     udp  --  anywhere             anywhere             udp spts:bootps:bootpc dpts:bootps:bootpc
ACCEPT     all  --  anywhere             anywhere             state NEW,RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere            
```

つづく。
extensionがわからないので理解する

extensionを使うとストラクチャや型に対して機能を追加できるとのこと。

いまいちわからないので動かして理解してみます。

プリミティブな型IntにもつかえるようなのでIntに自身の値を表示するfunctionを追加してみます。


```lang:extension.swift

var tmp :Int = 5
print(tmp) //定石の表示方法

extension Int {
    func p() ->Int{ //Int型に自身の値をprintする機能pを追加
    print(String(self) )
        
        return 0
    }
}

tmp.p()  //5　Int型に拡張した機能pで値を表示
print(tmp.p() ) //0

```

どういう時に役に立つのかまだわかりませんが動きが分かったのでここまで。
HARK をインストールした仮想環境を vagrant で作る

# 何をするのか

HARK をインストールした仮想環境を Vagrant で作った。

追記 (2015/11/29)
  ソースからコンパイルする版を作った。
  http://qiita.com/mzmttks/items/a8aa095712078b41f2fd

# 準備

* vagrant をインストールする
* 次のコマンドを実行

```bash
mkdir hark
cd hark

Vagrantfile  # 下記のファイルを作成
playbook.yml # 下記のファイルを作成

vagrant up
```
* ブラウザで http://192.168.33.10:3000 にアクセス


## Vagrantfile

IP アドレスが重複している時は、 192.168.33.10 を別の何かに変える。

```rb
# -*- mode: ruby -*-
# vi: set ft=ruby :


Vagrant.configure('2') do |config|

  config.vm.hostname = "hark"

  config.vm.provider "virtualbox" do |provider, override|
    override.vm.box = "ubuntu/trusty64"
    override.vm.network "private_network", ip: "192.168.33.10"
    override.vm.network :forwarded_port, host: 3000, guest: 3000

    # Display the VirtualBox GUI when booting the machine
    provider.gui = false

    # Customize the amount of memory on the VM:
    provider.memory = "1024"
  end

  config.vm.provision :ansible do |ansible|
    ansible.playbook = "playbook.yml"  # playbookファイル名
    ansible.host_key_checking = false
  end
end
```

## Playbook

```yaml
- hosts: all
  sudo: yes
  tasks:
    - name: add HARK repository
      apt_repository:
        repo: 'deb http://archive.hark.jp/harkrepos trusty non-free'
        state: present
    - name: upgrade system
      apt: upgrade=dist update_cache=yes
    - name: install HARK packages
      apt: name={{ item }} state=present force=yes
      with_items:
        - harkfd
        - hark-sss
        - hark-designer
        - hark-python
        - hark-binaural
        - hark-binaural+

    - name: install npm and nodejs
      apt: name={{ item }} state=present force=yes
      with_items:
        - npm
        - nodejs-legacy
   
    - name: install dependent packages
      shell: npm install
      args:
        chdir: /usr/bin/hark-designer

    - name: install pm2
      npm: name={{ item }} global=yes
      with_items:
        - pm2

    - name: run hark designer
      shell: pm2 start app.js --node-args "app.js allowremote"
      args:
        chdir: /usr/bin/hark-designer
    - command: pm2 startup
    - command: pm2 save
```
KVMの仕組み


### KVMとQEMU
プロセスメモリの仮想化、Java仮想マシン、RubyマシンYARV、ネットワークの仮想化などなど、とかくこの世の中仮想しまくっっている。ということでこの前ハードウェア(CPUと各デバイス)をまるごと仮想化する仕組みKVMとQEMUをCentOS7上で操作してみたので自分なりに用語などまとめてみた。

#### KVM
##### KVMってなに？
* カーネル・モジュール。カーネルの機能。ロードするだけで仮想化機能使える。
* 実体はこの`/dev/kvm`デバイスファイル？。これを各プロセスがオープンすることで各プロセスが独自のメモリそして`ソフトウェア的なCPU`をもつこと。なのでKVMはこの一連の仕組の枠組みといえるはず。

##### タイプ 
* ハイパーバイザ(完全仮想化)というタイプに分類。完全とはBIOSも含めたハードウェアを全部を仮想化すること。
* 同用語として仮想マシンモニタ

#### CPU
* KVMを使用するにはCPUが仮想化に対応してないとだめ。対応しているかどうかは簡単にコマンドで調べられる。
* ゲストOSの命令はセンシティブ命令。CPUの仮想化機能はこれを感知するようになっている。
* 仮想化に対応しているCPUはカーネルモード、ユーザーモードの他にゲストモードがある。
  - ゲストモード
     + 仮想マシン上のOSが動作している間はCPUはこのモードっぽい
     + VMX non-root
         - 仮想マシン上のOSがユーザーモードの時
     + VMX root 
         - 仮想マシン上のOSがカーネルモードの時。この時CPUは仮想マシン上のOSの命令を感知して`KVMに制御を渡す`。KVMモジュールからソフトウェア的に作成したCPUが実行されるみたいなイメージをもっている。

#### /dev/kvm
~~~txt
$ qemu-img create -f qcow vm-disk.img 4G
~~~
↑例えばこんな感じで実行すると、内部で/dev/kvmが使用されるよう。他にもvirt-managerやvirt-installなどすると/dev/kvmをオープンしてるはずたぶん。要するに仮想マシンを起動？、生成する際に/dev/kvmをオープンしているみたい。あとはオープンで取得したfd(オープンしたプロセスと結びついているファイル構造体など)をもとにkvm_create関数(仮想CPU(その情報を表わせ構造体のこと)を作成)したり、load_file関数によって、指定されたVMのアドレス空間に仮想マシンイメージがロードされるみたい。
詳しくは(こういう詳しい本欲しい)
https://www.ibm.com/developerworks/jp/linux/library/l-linux-kvm/

* 下をみれば起動のイメージが湧く！！
./linux-2.6.20/drivers/kvm/kvm_main.c

~~~C
int main()
{
        void *vm_mem;

        kvm = kvm_init(&test_callbacks, 0);
        if (!kvm) {
            fprintf(stderr, "kvm_init failed\n");
            return 1;
        }
        if (kvm_create(kvm, 128 * 1024 * 1024, &vm_mem) < 0) {
            kvm_finalize(kvm);
            fprintf(stderr, "kvm_create failed\n");
            return 1;
        }
        if (ac > 1)
            if (strcmp(av[1], "-32") != 0)
                load_file(vm_mem + 0xf0000, av[1]);
            else
                enter_32(kvm);
        if (ac > 2)
            load_file(vm_mem + 0x100000, av[2]);
        kvm_show_regs(kvm, 0);

        kvm_run(kvm, 0);

        return 0;
}
~~~

#### QEMU
KVMは上で述べた様に複数のオペレーティング・システム用にソフトウェア的にメモリ、CPUを仮想化するもの。これに対してQEMUはゲストOSからの入出力I/O(ディスク、ネットワークetc)を仮想化するもの。KVMはこのQEMUの力を借りている。QEMUにもCPUを仮想化する機能があるが、KVMはこの機能を使用せずにCPUの仮想機能を使用して仮想化を実現している。KVMはCPUを仮想化、QEMUはI/Oを仮想化といった具合に分担してマシンを仮想化している。

#### DOCKER
今度はDOCKER！！！！
Vimmerの人達が怖すぎてプルプルしても聞けないVimの設定 【autocmd】


時間があるときにエンジニアがやることといえば

* 積んだゲームをひたすらやる
* 見逃した映画をひたすら見る
* 途方も無い距離自転車で漕いでみる
   * 俺だけか・・・・
* dotfileを整理する
	* vimrcを整理する
	* vimrcを整理する
	* vimrcを整理する
	* vimrcを整理する

そうだ。vimrcを整理しよう

## 俺のvimrc見ろ的なやつを見て適当に今まで入れてたなんて・・・・・

口が裂けてもいえない（あ・・・・言っている・・・・）


## 環境

* macosx10.11(El capitan)
	* Vim 7.4


## 参考にしたサイト

* [Vim のカスタマイズ 〜autocmd で自動処理〜](http://vimblog.hatenablog.com/entry/vimrc_autocmd)
* [おさらい autocmd/augroup](http://qiita.com/s_of_p/items/b61e4c3a0c7ee279848a)

## autocmdとは？

特定のイベント(ウィンドウを開いた時、INSERTモードに切り替えた時、INSERTモードから戻る時etc...)などで自動で処理を追加することができる。

特定のイベントの一覧は[Vim documentation: autocmd](http://vim-jp.org/vimdoc-ja/autocmd.html#autocmd-events-abc)を参照してください。

##　基本的なautocmdの書き方のフォーマット

```.vimrc
if has("autocmd")
  augroup {autocmdグループ名(任意の名前)}
    autocmd!
    autocmd {イベント1},{イベント2...(以下,イベント名で複数のイベントの追加が可能)} * {イベント発生時に行うこと}
  augroup END
endif " has("autocmd")
```

### if has("autocmd")

その通りでvimにautocmdの機能があった場合実行する。
古いvimとかでautocmdがない場合で.vimrcの読込みでエラーにさせないため

### augroup

[おさらい autocmd/augroup](http://qiita.com/s_of_p/items/b61e4c3a0c7ee279848a#1-3)で記載されている通りautocmdをグループ化するもの。

自分の任意のグループ名を記載する


### autocmd!

以下[Vim のカスタマイズ 〜autocmd で自動処理〜](http://vimblog.hatenablog.com/entry/vimrc_autocmd)を参照で

> autocmd にグループを指定しておくと、そのグループの autocmd をまとめて解除することが出来ます。これは、同じ autocmd が何度も繰り返し登録されるのを避けるのに使われます。
また、グループは、augroup コマンドにより、一括指定することも出来ます。
このグループ指定と、それを用いた事前一括解除を怠ると、.vimrc が複数回読み込まれた時に自動処理が何重にも登録されることになり、Vim が重くなったり、異常な動作をする原因になるので注意しましょう。


augroup!を入れておけば何重にもautocmdが登録されることはないらいしいので入れておこう。

### autocmd {イベント1},{イベント2...(以下,イベント名で複数のイベントの追加が可能)} * {イベント発生時に行うこと}

ここにイベント発生時に実行したいことを記載する

例として、外部で変更のあったファイルを自動的に読み直すautocmdの場合はこんな感じ

* [checktime](http://vim-jp.org/vimdoc-ja/editing.html#:checktime)はファイル(バッファ)の読み直しの時に実行するコマンド


```.vimrc
" インサートモードに切り替わるとき、別のウィンドウに入った後にchecktimeを実行する
autocmd InsertEnter,WinEnter * checktime
```

### 外部で変更のあったファイルを自動的に読み直すautocmdの場合はこんな感じ

```.vimrc
 ファイルの自動読み直しの設定でInsertモードに切り替わった時とウィンドウが移動した時にフ>ァイルを読み直すようにする
if has("autocmd")
  augroup vimrc-checktime
    autocmd!
    autocmd InsertEnter,WinEnter * checktime
  augroup END
endif " has("autocmd")
```

## 最後に

vimrcの設定でautocmdでなんじゃろ？ってやつの疑問が一つすっきりしたニャーー・・・・
Chrome OSにおけるWeb Bluetoothの実装状況

# はじめに
Web Bluetoothで遊んでいてChrome OSでうまく動作しなかったのでcrbug.comの関連バグに書き込んだりしてたら[François](https://plus.google.com/+FrancoisBeaufort/)がハングアウトで色々と教えてくれた。日本語の情報もまだあまりないと思うので、せっかくだからメモとして共有します。

注意：あくまで個人の趣味で調べた情報です。間違った点、曖昧な点も含まれることをご了承ください。

# chrome://flags/#enable-web-bluetooth
利用の際にはフラグをオンにする必要があります。このフラグを立てていると最初にブラウザを起動した際に、危険なフラグが有効になっている旨を伝えるメッセージが表示されるようになります。これは後述のChooser UIが実装されていない事に起因するものかと思われます。ウェブサイト上でボタンクリック等のユーザアクションを起こした際、一切の通知なしにBLEデバイスにアクセスが発生するリスクがありますので、その点を理解した上で利用してください。

# requestDevice()
## Chrome 47 (Beta)
このバージョンではnameとnamePrefixが使えないようです。services: [UUID]形式のフィルタでマッチさせる必要があります。この際の注意点ですが~~（もしかしたら、デバイス依存の話かもしれないのですが）~~Chrome OSレベルでデバイスをペアリングさせておく必要があります。シェルフのBluetoothメニューにBLEデバイスも列挙されているはずなので、事前にクリックしてペアリングした状態でAPIを呼ぶ必要があります。

2015/12/2 補足: konashi2.0.0がアドバタイズしているデータがサービスのUUIDを含んでいないのが理由でペアリングが必要となっています。konashi.jsからOTA Updateを使って2015/10/30に提供されたkonashi2.1.3-rc3にアップデートする事でサービスのUUIDがアドバタイズされるようです。

## Chrome 48 (Dev)
nameとnamePrefixでマッチできるようになっています。name、namePrefixで探す場合に限ってはOSレベルでのペアリングは不要です。

~~OSレベルでのペアリングはリクエストが返してくるBluetoothDeviceオブジェクトにも影響しているようで、ペアリングしていればBluetoothDevice.uuidsにデバイスが提供しているサービスの配列が格納されます。ペアリングしていなければ配列は空。この違いもあってUUIDでのマッチングはペアリング必須になっている気がします。~~

2015/12/2 補足: この時点で返ってくるBluetoothDeviceオブジェクトが持つ情報は、アドバタイズされている情報に依存しているようです。

## 共通の問題
Chooser UIと呼ばれる、requestDevice()時に現れるデバイス選択UIが実装されていません。フィルタにかかるデバイスが唯一の時にはUIなしで該当デバイスの情報が帰ってきます。複数のデバイスがマッチする状況では試していません。セキュリティ的には穴がある状況ですが、色々と実験コードを書くにはむしろ好都合というか、テスト時の工程が減るので楽です。

# Notifications
Chrome 48以降に限定ですがnotificationsが動作しているようです。AndroidではAPIは見えているけど動作はしない（イベントが一切通知されない）状況なので、この点に関してはChrome OSが一番実装が進んでいます。

# まとめ
以上、簡単ですが利用の際における注意点のまとめでした。オフィシャルな情報はGitHub上にスペックと一緒にまとめられていますので、英語ですが参考になるかと思います。

- [WebBluetoothCG / web-bluetooth - Implementation Status](https://github.com/WebBluetoothCG/web-bluetooth/blob/gh-pages/implementation-status.md)
AzureFileを自分のPCにマウントしてみよう

##前書き
2015年9月末のAzureCon2015でGAが発表されたAzureFileですが、なんとsmb3.0に対応しています。
445ポートを開ければ手元のPCにAzureFileをネットワークドライブとしてマウントすることができます。
対応してるOSは下記のとおりです。

| 対応OS     | 対応SMBバージョン |
|:-----------|------------:|
| Windows Server 2012   |SMB 3.0|
| Windows Server 2012 R2|SMB 3.0|
| Windows 10            |SMB 3.0|

ちょうど手元のPCをすべてWindows10に変更したので試してみました。

##事前準備：ルータのポート設定
smbは445ポートを利用するのでルータに445ポートを開けてあげる必要があります。
ルータの種類によってやり方はまちまちのようです。
私のルータはNEC製だったので参考程度にポートの開け方を記載しておきます。

Atermの場合はポートマッピングでマウントしたいPCのIPアドレスと紐づけて445ポートを解放してください。

![rooter.png](https://qiita-image-store.s3.amazonaws.com/0/93820/979fba59-5717-4f88-08f9-49073e743ac8.png)

大概のルータは445ポートをデフォルトで閉じていることが多いです。
Atermもデフォルトでパケットフィルタ設定で445ポートのパケット通信を破棄する設定になっているので削除しました。
ルータに依って嵌りポイントは違うのでトライ＆エラーが必要です。

##①AzureFileを作成しよう
AzureFileの作成はAzurePortalで行ってください。
ちなみに現在ではAzure新ポータルもしくはPowerShellでしか作成は行えません。

ストレージアカウントにファイルがあるので選択します。
Fileサービスの概要が表示されます。最初は何も設定されていないので「ファイル共有がみつかりません。」と表示されています。
![storage1.png](https://qiita-image-store.s3.amazonaws.com/0/93820/94897c31-69cb-755b-1d22-5974508fb9f0.png)


ファイル共有の部分を選択するとFileサービスの詳細が表示されます。
ファイル共有を選択すると新しいファイル共有の追加設定を行えるので、名前とクォータを入力して作成します。ここでは名前を「storage]、クォータを「1000」GBにしています。

![storage2.png](https://qiita-image-store.s3.amazonaws.com/0/93820/9815ea71-2236-374f-4574-f4af163a50b4.png)

これで設定は完了です。


##②マウントしてみよう
AzurePortalでAzureFileを作成したら下記のマウント用のコマンドを実行します。

`net use [ドライブレター]: \\[ストレージアカウント].file.core.windows.net\ファイル共有名 /u:[ストレージ名] [ストレージキー]`

必要な情報はAzurePortalで取得できます。

コマンドプロンプトを通常起動して上記のコマンドを実行してみましょう。
※重要なとこはマスクしてます。

![CMD.png](https://qiita-image-store.s3.amazonaws.com/0/93820/4accfbeb-d640-950f-74a3-a301000a53c1.png)

コマンドプロンプトを管理者権限で実行しなくてもマウント出来るみたいです。
「エラー53：ネットワークパスがみつかりません」が出た場合はルータの設定を見直してください。

##③利用してみよう
正常にマウントされると下図のようにアクセスることが出来ます。

![mount.png](https://qiita-image-store.s3.amazonaws.com/0/93820/ce476fab-7630-a87d-d0e5-87b2bde9885d.png)

あとはフォルダを作るなりファイルをコピーするなりで立派なネットワークドライブになります。
ファイル倉庫にする等、利用用途は色々とありそうです。

**※ファイル容量によって費用が発生するので注意が必要です。用法・容量を守って正しく使いましょう。**
Angular2 Event


チュートリアルをやってみて何となく掴んだAngular2のイベントについてのまとめ。keyupとかclickとか簡単なもの。

> **Angular2 DEVELOPER GUIDES**
> 3. User Input
> https://angular.io/docs/ts/latest/guide/user-input.html

## ビルトインのイベント

### 1系

```
<input ng-keyup="func()" ...
```

### 2だとこうなる

#### 記法

(イベント名)="評価する式"

```
<input (keyup)="func()" ...
```

#### $event

1系と同じく`$event`がある。
`$event.target`でHTMLInputElementが取得できる。

```
<input (keyup)="func($event)" ...

func(event){
	this.value = event.target.value;
}
```

#### $eventの代わりにテンプレートの変数を使う

inputをテンプレート内の変数として宣言する。
`$event`を使うよりもこっちが推奨されている。

```
<input #input (keyup)="func(input)" ...

func(input){
	this.value = input.value;
}
```

#### Enterキーイベント

Enterキーに反応するイベントがサポートされるようになった。

```
<input #input (keyup.enter)="func(input)" ...
```

## カスタムイベント

### 1系

ディレクティブ内で渡された関数を実行する。例えばこんな感じ。

```
.directive('sample', function(){
	return {
		scope: {
			greeting: '&'
		},
		link: function(scope){
			scope.greeting({message:'hello'});
		}
	};
})
```

### 2だとどうなる？

上記の例をAngular2のComponentで定義してみる。
独自のタイミングでイベントを発生させるには **EventEmitter** でカスタムイベントを定義する。

#### ボタンクリックでイベントを発火するComponent

```
import {... ,EventEmitter} from 'angular2/angular2';

@Component({
  selector: 'greeting',
  events: ['greetingMessage']
})
@View({
  template: `
    <button class="btn btn-default btn-sm" (click)="greeting('hello')">hello</button>
  `
})
export class GreetingComponent {
  private greetingMessage = new EventEmitter();
  
  greeting(message) { 
    this.greetingMessage.next(message);
  }
}
```

まずEventEmitterの定義をangular2/coreからインポート。

```
import {... ,EventEmitter} from 'angular2/angular2';
```

インスタンスを作成する。
この時のインスタンス名がイベント名となる。

```
private greetingMessage = new EventEmitter();
```

EventEmitter.next()でイベントが発火する。

```
this.greetingMessage.next(message);
```

#### イベント発火を検知する上位Component

```
@Component({
  selector: 'my-app'
})
@View({
  template: `
    <greeting (greeting-message)="onGreeting($event)"></greeting>
    <p>{{message}}</p>
  `,
  directives: [GreetingComponent]
})
class AppComponent {
  onGreeting(event){
    this.message = event;
  }
}
```

GreetingComponentで定義したカスタムイベント`(greeting-message)`が使えるようになる。(CamelCaseはハイフンにする必要がある)

```
<greeting (greeting-message)="onGreeting($event)">
```

`.next()`に渡したパラメータを受け取れる。

```
onGreeting(event){}
```

[plunker](http://plnkr.co/edit/jeSM9LphbQxVDJvReyr7?p=preview)


## Outputアノテーション

通常はEventEmitterの名前=イベント名になるが、変更する事ができる。

```
import {... ,Output} from 'angular2/angular2';

@Component({
  ...
})
@View({
  template: `
    ...
  `
})
export class GreetingComponent {
  @Output('greeting') greetingMessage = new EventEmitter();
  
  greeting(message) { 
    ...
  }
}
```

イベント名を`greeting`に変更。

```
@Output('greeting') greetingMessage = new EventEmitter();
```

上位Componentも検知するイベント名を`greeting`に変更する。

```
@View({
  template: `
    <greeting (greeting)="onGreeting($event)"></greeting>
    ...
  `
```

[plunker](http://plnkr.co/edit/HXO7Noxcmt2VYTlpYSOi?p=preview)

# メモ

* typescriptの型宣言ができてないので、いつか直す。
vi 操作備忘録（vitutorより抜粋)

## 前提知識
vi のキー操作でもカーソル移動( hjkl )、 保存、終了は知っている程度。
おまけ程度に検索とか文字削除くらいも知っていますが。

## 置き換え(上書き)
| key | description        |    
|:---:|:-------------------|
|r    |一文字だけ上書き    |
|R    |挿入モード抜けるまで|

## カーソルジャンプ
| key | description            |    
|:---:|:-----------------------|
|^    |行頭に移動              |
|$    |行末に移動              |
|w    |空白含む単語の末尾      |
|e    |空白含まない単語の末尾  |
|b    |現在の単語の先頭に移動  |

## 画面の分割
| key | description            |    
|:---:|:-----------------------|
|C-w v|垂直に分割する          |
|C-w s|水平に分割する          |

## 画面の移動

| key | description            |    
|:---:|:-----------------------|
|C-w w|順番に移動する          |

## 画面の削除

| key    | description              |    
|:------:|:-------------------------|
|C-w c   |アクティブな画面を閉じる  |
|:clo[se]|アクティブな画面を閉じる  |
|C-w o   |アクティブな画面だけにする|
|:on[ly] |アクティブな画面だけにする|


## 画面のサイズ変更

| key       | description              |    
|:---------:|:-------------------------|
|C-w =      |画面を均等なサイズにする  |
|C-w _      |画面の高さを最大化する    |
|C-w <pipe> |画面の幅を最大化する      |
「移動中央値」の計算

# まず移動平均について
時系列データの傾向を知るために使われるものに移動平均というのがあります。例えば8,9,7,9,8,9,11,8,...というデータ系列があった時、それをそのまま見るのではなく最初の5つ「8,9,7,9,8」の平均8、次の5つ「9,7,9,8,9」の平均8.4、……と平均したものを見ていったほうが上昇・下降傾向がわかりやすくなります。
![https://commons.wikimedia.org/wiki/File:Moving_average_004.svg](https://qiita-image-store.s3.amazonaws.com/0/49529/eac90b58-7e1b-feb7-707a-c0d4170e9ae5.png)
このグラフでは青い線が元のデータ、赤い線が移動平均になってます。

# 「移動中央値」
さて、これを平均ではなく中央値でやりたい場合があると思います。中央値というのは「データを順番に並べた時真ん中に来る数」のことで、平均よりも外れ値の影響を受けにくいという性質があります。例えば「8,9,7,9,8」に「1000」が加わったら要素が一つ加わっただけなのに平均は跳ね上がりますが、中央値はほとんど変化しません。そこで「移動平均」ではなく「移動中央値」の計算を考えます。

# 移動平均の計算
移動平均を計算する場合毎回平均を1から計算する必要はありません。1回平均を計算すれば後は出て行く数と新しく入ってくる数による平均の変化さえ計算すれば大丈夫です。具体的には以下の様な式になります。
```
mean(i+1) = mean(i)+(new-old)/n
```
new,oldはそれぞれ新しく入ってくる数、出て行く数を表しています。

# 「移動中央値」の計算
## 奇数個の系列データの「移動中央値」
「移動中央値」の場合やや複雑になりますが同じように考えて計算していけます。まず最初に新しく入った数と出て行く数（以下new,oldと表記します）がともに元の中央値より大きい場合を考えます。この場合元の中央値の順番は変わらないので値はそのままです。new,oldが共に元の中央値より小さい場合も同様です。
ではnewが元の中央値より大きくoldが小さい場合はどうか。この場合中央値より大きい数が一つ増え中央値より小さい数が一つ減るわけですから元の中央値の順番は一つ下がります。そのため、元の中央値より大きい数の中で最小のものが新しい中央値になります。newが元の中央値より小さくoldが大きい場合は逆になります。
なお、正確には中央値と等しい数が半数以上含まれてる場合上記と関係なく新しい中央値は元の中央値と同じになります。

## 偶数個の系列データの「移動中央値」
上では奇数個のデータの中央値の計算の話をしましたが、偶数個だと中央値が「真ん中の2つの数の平均」になるのでさらに複雑になります。しかし基本の考え方は同じです。newとoldが真ん中の2つの数より共に大きい場合、小さい場合、一方だけ大きい場合……など場合分けして考えていけば出すことができます。

#ソースコード
以上のアルゴリズムを実装したqueueをGithubにあげているので使ってみたい方、詳しいアルゴリズムを知りたい方は見てください
https://github.com/lamrongol/QueueWithMovingStat

#計算量
最後に計算量について。newとoldが共に中央値より大きい場合など中央値に変化がない場合は定数回の比較のみなので計算量はO(1)、それ以外の場合はすべての要素を走査する必要があるのでO(n)になります。
OS X 10.10.11 El Capitan にCocoaPodsをインストールする

#El Capitanのrootless

OS X 10.10.11 El Capitanになり、rootlessが動作しており、rootlessの管理範囲内である `/usr/bin` には `pod` を配置できないため、

`sudo gem install cocoapods` 

というコマンドを打つと

`Operation not permitted`

というエラーになります。

#Sudo-less installation

[CocoaPodsのインストールガイド](https://guides.cocoapods.org/using/getting-started.html#getting-started)に従い、ユーザーディレクトリにインストールすることで回避します。

まずは、ホームディレクトリにある（なければ作成する）`.bash_profile` に以下を追記します。

```
export GEM_HOME=$HOME/.gem
export PATH=$GEM_HOME/ruby/2.0.0/bin:$PATH   #(CocoaPodsのインストールガイドでは export PATH=$GEM_HOME/bin:$PATH になっている)
```

.bash_profileの再設定を読み込み、確認します。

```
$ source .bash_profile
$ echo $PATH
```

そして、`--user-install` オプションを付けて、CocoaPodsをインストールします。

```
gem install cocoapods --user-install
gem which cocoapods
/Users/ユーザ名/.gem/ruby/2.0.0/gems/cocoapods-0.39.0/lib/cocoapods.rb
pod --version
インストールされたバージョン
```

#その他
`/usr/bin/local`にインストールするなどもありますね。

`sudo gem install -n /usr/local/bin cocoapods`
Kobitoが壊れた時の対処法


ある日突然、Kobitoが起動しなくなりました。
復旧方法を以下に記載します。

![スクリーンショット 2015-11-25 22.27.02.png](https://qiita-image-store.s3.amazonaws.com/0/27794/98a8f1bc-fd20-8b4a-75c8-efa1bebad315.png "スクリーンショット 2015-11-25 22.27.02.png")


## データのバックアップ

* Kobitoをメモ帳として使っている場合にメモしているデータが消えてしまうのは防がなくてはなりません。
* バックアップを取りましょう

### バックアップの取り方

* 以下コマンドを実行にてカレントディレクトリにKobitoのデータがバックアップされます。   ※ バックアップディレクトリは任意なものにしてください

```
cp -R ~/Library/Containers/com.qiita.Kobito ./
```


## Kobitoの削除

* [AppCleaner](https://freemacsoft.net/appcleaner/)にてKobitoの削除を行う。
* この時注意しなくてはいけないのはKobitoのアプリ以外はチェックを外すこと。

![スクリーンショット 2015-11-25 22.28.54.png](https://qiita-image-store.s3.amazonaws.com/0/27794/bb4ddd1f-8848-6a77-2988-f975323db92a.png "スクリーンショット 2015-11-25 22.28.54.png")

## Kobitoのインストール
* App Storeを起動し、Kobitoをインストールしてください。


## 確認
* Kobitoを起動し、データが残っているか確認しましょう。
残っていなければ、バックアップを使って、なんとか戻しましょう。
【メモ】IntelliJ14のクリーンアップ

自分用メモ

```bash
rm -rf /Applications/IntelliJ IDEA 14.app
rm -rf /Users/ユーザ/Library/Preferences/com.jetbrains.intellij.plist
rm -rf /Users/ユーザ/Library/Application\ Support/IntelliJIdea14
rm -rf /Users/ユーザ/Library/Logs/IntelliJIdea13
rm -rf /Users/ユーザ/Library/Preferences/IntelliJIdea13
```

これで設定含めて綺麗になるはず。
VersionUpの準備のため、一旦クリーンに。
Vagrant コマンド覚書

# Usage:
```
vagrant [options] <command> [<args>]
```

# Option:
## -v, --version
バージョンを表示する。

## -h, --help
ヘルプを表示する。

# Common commands:
## vagrant box
box のインストールや削除など box 管理用のコマンドを実行する。

## vagrant connect
共有 vagrant 環境へリモート接続する。

## vagrant destroy
vagrant マシーンを停止し、削除する。

## vagrant global-status
作成済み vagrant 環境のステータスを下記の形式で一覧表示する。

```
id       name    provider   state    directory                               
-----------------------------------------------------
7fb8c14  default virtualbox poweroff C:/Users/vagrant 
```

## vagrant halt
vagrant マシーンを停止する。

## vagrant help
サブコマンドのヘルプを表示する。

## vagrant init
Vagrantfile を生成し、新しい vagrant 環境を作成する。

## vagrant login
[HashiCorp's Atlas](https://atlas.hashicorp.com) へログインする。

## vagrant package
起動中の vagrant 環境をパッケージ化し、 box を作成する。

## vagrant plugin
プラグインのインストール、アンインストール、更新など、プラグインの管理用コマンドを実行する。

## vagrant provision
vagrant マシーンのプロビジョンを実行する。

## vagrant push
設定したデプロイ先へコードをデプロイする。

## vagrant rdp
RDP 接続を実行する。

## vagrant reload
vagrant マシーンを再起動し、新しい Vagrantfile の設定を読み込む。

## vagrant resume
一時停止していた vagrant マシーンを再開する。

## vagrant share
vagrant 環境を共有する。

## vagrant ssh
SSH 接続を実行する。

## vagrant ssh-config
OpenSSH 認証の設定を出力する。

## vagrant status
vagrant マシーンのステータスを表示する。

## vagrant suspend
vagrant マシーンを一時停止する。

## vagrant up
vagrant 環境の開始とプロビジョンを実行する。

## vagrant version
現在インストールされている vagrant のバージョンと、最新版のバージョンを表示する。

## vagrant COMMAND -h
個々のコマンドのヘルプを表示する。

## vagrant list-commands
全サブコマンドのヘルプを表示する。

## vagrant docker-logs
Docker コンテナのログを出力する。

## vagrant docker-run
使い捨てのコマンドをコンテナへ実行する。

## vagrant rsync
共有フォルダをリモートマシンと rsync で同期する。

## vagrant rsync-auto
共有フォルダ内のファイル更新を rsync で自動同期する。
Address Sanitizerでメモリ不正アクセスを検知する


メモリの不正アクセスによる不具合は再現率が低かったりしてデバッグが難しかったりしますが、XCode7で追加されたAddress Sanitizerを使うとXCodeが検知してくれるよ、という機能です。

[こちら](http://useyourloaf.com/blog/using-the-address-sanitizer.html)を参考にしました。

##Address Sanitizerを有効にする
あからさまに不正アクセスするサンプルを用意しましょう。

```
- (void)viewDidLoad {
    [super viewDidLoad];

    char *buffer = malloc(80);
    buffer[80] = 'Y';
    free(buffer);
}
```

このまま実行しても何事もなく動いちゃったりします。
Address Sanitizerを有効にしてみましょう。

![screen1.png](https://qiita-image-store.s3.amazonaws.com/0/77573/e4f94c35-1116-64a7-32e9-68f2b52f9747.png "screen1.png")


ここからEdit Schemeを選択します。

![screen2.png](https://qiita-image-store.s3.amazonaws.com/0/77573/8ab74737-7ed0-e7da-4593-f0bbbebebe33.png "screen2.png")


"Enable Address Sanitizer"をチェックします。
この状態で実行してみましょう。

![screen3.png](https://qiita-image-store.s3.amazonaws.com/0/77573/452c996b-91c9-ca6b-6ae6-546649ed02de.png "screen3.png")


はい、怒られました。
開発中は有効にしておくと良いかもしれません。

ただし、この機能が有効なのはObjective-CなどC系の言語のみです。
Swiftをお使いの場合は意味がないのでOFFのままで良いでしょう。
mysql　des-key-file　の設定方法

DBダンプされても暗号化したカラムが読めないようにする為に調査。
AESで暗号化したかったけど、外部キーが設定出来ないのでdesで暗号化することにした。
des_decrypt,des_encrptは外部ファイルにキーが置けるので暗号強度は置いといて
こっちの設定を調査した。
確認したのは、centos6 mysql 5.1.73

#des-key-fileの設定方法
##暗号キーファイルを用意する
今回は /etc/deskey.txt で説明

```lang:/etc/deskey.txt
0 hoge
```

##mysqlの設定
/etc/my.cnf
の[mysqld]の下に←ここが重要
最終行に追加してハマった

```lang:/etc/my.cnf
#des key file
des-key-file=/etc/deskey.txt
```
を追加

#確認方法

```lang:sql
select convert(des_decrypt(des_encrypt('au'),'hoge') using utf8)
```

##誰か教えて
設定ファイルが変更になり、暗号化キーが変わっているのは確認できたんだけど
数字を引数にすると複合化できない...なんでだろう
その内調べる予定
```lang:sql
select convert(des_decrypt(des_encrypt('au',0),'hoge') using utf8)
```
↑これはOK
```lang:sql
select convert(des_decrypt(des_encrypt('au',0),0) using utf8)
```
↑これはNG
んんんんんん、誰か知ってたら教えて
LicenceFinder で Rails プロジェクトで使用しているパッケージのライセンスを出力する

# はじめに

お客さんから、「このアプリが使ってるパッケージのライセンスどーなってるの？」って聞かれて、「ほとんど MIT ですよー」で終わらせてくれなかった（当然ですが・・）ので、wiki へまとめて markdown ファイルで展開するようにしてました。

そして、Gemfile 変更時に wiki をメンテナンスしてたのですが、当然のごとく更新漏れなどがおきます。

手動のメンテナンスに疲れたので、いいものないか探してたら LicenseFinder: https://github.com/pivotal/LicenseFinder なる期待どおりのものがあったので、紹介します。

# インストール

Gemfile へ LicenseFinder を追加して、`bundle install`

```
gem 'license_finder', :group => :development
```

# 使い方

ライセンスの一覧を確認するなら、プロジェクト下で `licence_finder` コマンドを実行するだけです。

```
% license_finder
...................................Dependencies that need approval:
actionmailer, 4.2.4, MIT
actionpack, 4.2.4, MIT
actionview, 4.2.4, MIT
activejob, 4.2.4, MIT
activemodel, 4.2.4, MIT
activerecord, 4.2.4, MIT
activesupport, 4.2.4, MIT
annotate, 2.6.10, ruby
...
```

このままでは、提出資料としての体裁が味気ないので、`report --format html` オプションを指定します。

```
% license_finder report --format html > licence.html
```

出力結果:

![スクリーンショット 2015-11-25 20.51.07.png](https://qiita-image-store.s3.amazonaws.com/0/69965/a13de259-eeb5-6c80-014a-fe04fdab535c.png)


大方の目的（ライセンスの一覧を可視化して、ライセンス形態を確認する）は果たせるのですが、LicenceFinder ではライセンスの承認リストを設定できるので、もう少しがんばってみる。

```
$ license_finder whitelist add MIT  # 承認するライセンス形態を指定
```

また、中にはライセンス形態が不明確な `unknown` となるものもあるので、そこは個別に確認してパッケージ指定で承認リストへ追加します。（実際に rdoc のライセンスを確認しにいくと GPLv2 のようだが・・）

```
$ license_finder approval add rdoc  # 承認するパッケージを指定
```

承認リスト設定後の出力結果:

![スクリーンショット 2015-11-25 20.55.13.png](https://qiita-image-store.s3.amazonaws.com/0/69965/1f272e1e-1c05-7a2b-99ad-695a5b5a4cda.png)


MIT など承認リストへ追加したライセンスが unapproved からはずれました。

承認リストはデフォルトで `doc/dependency_decisions.yml` となっていますが、`--decisions_file` で指定できるので `~/.licence_finder/dependency_decisions.yml` などを指定すると他のプロジェクトでも使い回しできそうです。


# 最後に

定期的に提出するドキュメントは自動生成できると幸せですね。

Rails 以外でも以下のパッケージ管理をサポートしているようなので、ライセンスが気になる方は試してみてはいかがでしょうか。

* Gemfile (for bundler)
* requirements.txt (for pip)
* package.json (for npm)
* pom.xml (for maven)
* build.gradle (for gradle)
* bower.json (for bower)
* Podfile (for CocoaPods)
* rebar.config (for rebar)
* packages/ directory (for Nuget)


# 参考

* https://github.com/pivotal/LicenseFinder
UIImageのデータをCIFilterを使って切り取る方法


UIImageの画像を指定のサイズで切り取りたいときの話。

##準備
`CoreImage.framework`を追加し、ヘッダーファイルにインポートしておく。

```objectivec:.h
#import <CoreImage/CoreImage.h>
```

##実装
UIImageを用意する部分は省略。

```objectivec:.m
//UIImageをCIImageに変換
CIImage* ciImage = [[CIImage alloc]]initWithImage:uiimage];

//CIFilter生成
CIFilter* cifilter = [CIFilter filterWithName:@"CICrop"];
//トリミング開始位置と切り取るサイズ
[cifilter setValue:[CIVector vectorWithX:x
                                       Y:y
                                       Z:width
                                       W:height]
            forKey:@"inputRectangle"];
//CIFilterにCIImageのセット
[cifilter setValue:ciImage forKey:@"inputImage"];
//結果の取り出し
CIImage* filteredImage = cifilter.outputImage;

//UIImageに変換する
UIImage* resultImage = [UIImage imageWithCIImage:filteredImage];
```
カスタムUIのチェックボックス・ラジオボタン

チェックボックス・ラジオボタンをカスタマイズする機会があったので、シンプル版をまとめました。

## イメージ

![UIイメージ](https://qiita-image-store.s3.amazonaws.com/0/6117/d5065163-744f-dcf9-763c-52870a20052b.png)

## デモ

SCSS版: http://jsdo.it/butchi/wXVq
生CSS版: http://jsdo.it/butchi/00EB

## ポイント

- input要素の代わりに擬似要素を使って部品の見た目を整えます。
- inputは空要素のため、それ自身にbefore/after擬似要素を設定できません。
そのため、隣接セレクタ"+"（場合によっては兄弟セレクタ"~"）を使って
隣接要素にbefore/afterを設定します。
- タブでの挙動を保証するため、input要素を``display: none``にはしません。

## アドバイス

- 今回はbeforeに未チェック時の背景、afterにチェック時の点を割り当てましたが、
スプライト画像で未チェック・チェックを切り替える場合は
beforeだけにしてbackground-positionを切り替えるといいと思います。
- beforeだけの場合は擬似要素を``position: absolute``ではなく``position: relative``にした方が収まりがいいかもしれません。
- 実際実装した時はチェック時にCSSアニメーションさせましたが、それもそれなりに大変でした。

## ソース
（CSS版）

```css
body {
    background-color: #fff;
}

input[type="checkbox"],
input[type="radio"] {
    position: absolute;
    width:    0;
    height:   0;
    top:      0;
    left:     0;
    opacity:  0;
}

input[type="checkbox"] + *,
input[type="radio"] + * {
    position: relative;
    display: inline-block;

    box-sizing: border-box;
}

[type="checkbox"] + * {
    margin-left:  17px;
    padding-left: -3px;

    line-height: 12px;
}

[type="checkbox"] + *::before,
[type="checkbox"] + *::after {
    content:    "";
    display:    block;
    position:   absolute;
    box-sizing: border-box;
    width:      12px;
    height:     12px;
    left:       -14px;
    top:        0px;
}

[type="checkbox"] + *::before {
    background-color: #fff;
    border: 1px solid #000;
}

[type="checkbox"]:checked + *::after {
    position: absolute;
    width:  6px;
    height: 6px;
    margin-left: 3px;
    margin-top:  3px;
    background: #000;
}

[type="radio"] + * {
    margin-left:  17px;
    padding-left: 0;

    line-height: 16px;
}

[type="radio"] + *::before,
[type="radio"] + *::after {
    box-sizing: border-box;
    content:    "";
    display:    block;
    position:   absolute;
    width:      16px;
    height:     16px;
    left:       -16px;
    top:        0px;
}

[type="radio"] + *::before {
    background-color: #fff;
    border: 1px solid #000;

    border-radius: 16px;
}

[type="radio"]:checked + *::after {
    position: absolute;
    width:       8px;
    height:      8px;
    margin-left: 4px;
    margin-top:  4px;
    background:  #000;

    border-radius: 8px;
}

[type="checkbox"]:disabled + *::before,
[type="checkbox"]:disabled + *::after,
[type="radio"]:disabled + *::before,
[type="checkbox"]:disabled + *::after {
    opacity: 0.25;
}

[type="checkbox"]:focus + *::before,
[type="radio"]:focus + *::before {
    box-shadow: 1px 1px 0px #000;
}
```
最近のWindowsはインストール時点のDPI=96ではないらしい

https://msdn.microsoft.com/ja-jp/library/dn528846.aspx

|ディスプレイ サイズ|ディスプレイの解像度|水平 (ピクセル)|垂直 (ピクセル)|パネル DPI|スケーリング レベル|Note|
|:-----------|:-----------|:-----------|:-----------|:-----------|:-----------|:-----------|
|10.6"|HD|1366|768|148|100%|安いノート
|11.6"|HD|1366|768|135|100%|
|13.3"|HD|1366|768|118|100%|
|10.6"|FHD|1920|1080|208|150%|Surface Pro
|15.4"|FHD|1920|1080|143|125%|PanelDPIによってスケーリング変わる
|17"|FHD|1920|1080|130|125%|
|11.6"|WUXGA|1920|1200|195|150%|
|13.3"|WUXGA|1920|1200|170|150%|
|13.3"|QHD|2560|1440|221|200%|
|24"|QHD|2560|1440|122|125%|PanelDPIによってスケーリング変わる
|15.6"|QHD+|3200|1800|235|200%|
|23”|QFHD (4K)|3840|2160|192|200%|
|55”|QFHD (4K)|3840|2160|***|300%|Win10+4KTVでこれが既定値
コマンドラインからIntentをbroadcastする


以下のような感じで、adb shellからIntentをブロードキャストできます

```zsh:zsh
% adb shell
$ am broadcast -a <ACTION名> --es <KEY> <VALUE>
```

今回は、以下のようにしてみました。

```zsh:zsh
$ am broadcast -a ACTION_TEST --es "from" "adbから来たよ"
```

コマンドオプションの`--es`は`putExtra(String name, String value)`に該当します。
ちなみに`putExtra(String name, int value)`なら、`--ei`になります。

次に、`BroadcastReceiver`クラスを継承した、Intentを受け取るクラスをつくります。

```java
public class TestReceiver extends BroadcastReceiver {

　　@Override
　　public void onReceive(Context context, Intent intent) {

   　　Bundle extras = intent.getExtras();　　　　
　　　　Log.e("TAG",extras.getString("from"));
   }

}
```

そして、AndroidManifestに以下を追記します。
receiverには、BroadcastReceiverを継承したクラス名と、
actionには、そのクラスが受け取るインテントのaction名を記述します。

```java
<receiver android:name=".TestReceiver" >
    <intent-filter>
        <action android:name="ACTION_TEST"/>
    </intent-filter>
</receiver>
```

※ホントは、名前がかぶらないように通常はaction名にはアプリのpackage名を先頭にいれるのが慣例のようです。


これで、完了です。

adb shellからコマンドを叩けば、`adbから来ました`とログが吐かれるはずです。

おわり。

`
特徴量作成(UCLよりbalanceデータ)


https://archive.ics.uci.edu/ml/datasets/Balance+Scale

```r

bd=read.csv("https://archive.ics.uci.edu/ml/machine-learning-databases/balance-scale/balance-scale.data")

> head(bd)
  B X1 X1.1 X1.2 X1.3
1 R  1    1    1    2
2 R  1    1    1    3
3 R  1    1    1    4
4 R  1    1    1    5
5 R  1    1    2    1
6 R  1    1    2    2

```

天秤の傾き/釣り合いの判定。
Bが目的変数で、釣り合い・左・右のどれかになります。
他は距離と質量。知識があれば２列目*３列目がモーメントになるので、その特徴量で判定すればOK。

試しにそのままでランダムフォレストでやってみると

```r
tuneRF(y=bd[,1],x=bd[,-1],doBest = T)
Confusion matrix:
  B   L   R class.error
B 0   6  33  1.00000000
L 0 187  14  0.06965174
R 0   3 257  0.01153846
```
B(釣り合い）が全然識別出来てないです。

４つの特徴量から２つずつ選び、4C2=6種類の交互作用項を追加します。

```r
cbs=combn(c(2:5),2)
nfuture=data.frame(matrix(0,nrow=nrow(bd)))  #新しい特徴量
for(j in 1:ncol(cbs)){
  f1=cbs[1,j]
  f2=cbs[2,j]
  nfuture[[paste("f",f1,f2,sep="")]]=bd[,f1]*bd[,f2]
}
nfuture=nfuture[,-1]
ndf=cbind(bd,nfuture)

trow=sample(500,100)
test=ndf[trow,]
ndf=ndf[-trow,]

```


```r
tuneRF(y=ndf[,1],x=ndf[,-1],doBest = T)
rf=randomForest(B~.,ndf)
p.rf=predict(rf,newdata=test)

table(test[,1],p.rf)
# p.rf
# B  L  R
# B  7  1  4
# L  3 38  1
# R  1  0 45
```
少しはマシに・・・。
で、特徴量削除すべきなので、本命の多項Logit＆Lasso回帰。alpha=1がLassoの指定です。

```r
gnet.cvlasso=cv.glmnet(x=as.matrix(ndf[,-1]),y=ndf[,1],family="multinomial",alpha=1,type.measure="class")

table(test[,1],prd)
     B  L  R
  B 12  0  0
  L  0 42  0
  R  0  0 46
'''
Ruby、Railsで時間を扱う際利用しそうなモジュール群

#はじめに#
こちらは個人的なログも含まれておりますので、頻繁に更新しますことをご了承下さい。またコメント等をしていただいたら、最適なものを選択、もしくは参考に逐一更新していきます。その他追加条件としては、なるべくRailsに依存しない書き方（Rubyのみの環境でも動く？）を推奨してやっていきたいと思います。


環境（一応）
Rails 4.2.1
Ruby  2.1.5


#指定した一定の期間を取得したい時#
```
# ====================================================================================================
# 指定した一定の期間を取得するモジュールです
# 戻り値例（within_this_monthの場合）
# Sun, 01 Nov 2015 00:00:00 JST +09:00..Mon, 30 Nov 2015 23:59:59 JST +09:00
# また引数（整数）を入れればその数だけシフトします。（１を入れたら来月中、-１を入れたら先月中）
# ====================================================================================================
# 今年中
def within_this_year(shift = 0)
    (Time.current + shift.year).all_year
end

# 今月中
def within_this_month(shift = 0)
    (Time.current + shift.month).all_month
end

# 今週中
def within_this_week(shift = 0)
    (Time.current + shift.week).all_week
end

# 今日中
def within_this_day(shift = 0)
    (Time.current + shift.day).all_day
end
```
また [jnchito](http://qiita.com/jnchito)さん のコメントとリンクを参考にさせていただき更新いたしました。ありがとうございます。

.
.
.
.
.
.
.
.
.
.
.
.
.
記事追加中
AzureStorageのBlobを一覧で取得する

初めての投稿となります。
お手柔らかによろしくお願いします。

AzureStorageをクラウドストレージとして利用されている方は沢山いらっしゃると思います。
最近の話ですがOneDriveに利用制限が設けられたのも数十TB利用しているユーザが多く居るからだと言われています。

そんなにストレージを利用していると何をどれだけ上げているのか知りたくなると思います。
というわけでBlobの情報を取得する方法を書いていきたいと思います。

**前提：StorageLibrary6.1.0 VisualStudio2015を使用**

##事前準備
NugetマネージャでStorageLibraryを取得しましょう。
「ツール」 → 「Nugetパッケージマネージャ」 → 「ソリューションのNugetパッケージの管理」から開けます。検索に「AzureStorage」と入れると一覧が取得できるの「WindowsAzure.Storage」を選択してインストールしてください。
![Nuget管理.png](https://qiita-image-store.s3.amazonaws.com/0/93820/c9b89234-2e21-8fe7-c7dd-8f47cee86bdb.png)


インストール中に下記の質問がありますが、迷わずOKしてください。
インストール先のプロジェクト及びインストールするDLLの一覧がひょっじされています。
![プレビュー管理.png](https://qiita-image-store.s3.amazonaws.com/0/93820/4b452694-f9d7-3f36-4223-ef642dad87d4.png)


ライセンスへの同意確認が表示されますので、迷わず同意してください。
Microsoft製のパッケージなので基本的に問題ないです。
![プレビュー管理2.png](https://qiita-image-store.s3.amazonaws.com/0/93820/6044b9d4-3100-25da-60f9-ff049eb50cfc.png)


インストールが完了した後は「フィルター」を「インストール済み」にしてインストール済み一覧に表示されていることを確認します。インストール済みだとボタンがアンインストールに変わります。
![Nuget管理2.png](https://qiita-image-store.s3.amazonaws.com/0/93820/2a64bd6b-de51-8e50-d489-9eb73ce30077.png)

これで事前準備完了です。

それではここからコードを記載していきます。
抜粋で記載するのでコピペしても動かないので予めご了承ください。

##①ストレージアカウントインスタンスを作成します。
```lang:C#
//ストレージアカウントの作成
var scaa = new StorageCredentialsAccountAndKey([ストレージ名], [ストレージKEY]);
var storageAccount = new CloudStorageAccount(scaa, false);
```
ここの設定はお作法ですので詳細は割愛します。


##②Blob操作用のクライアントインスタンスを作成します。
```lang:C#
//BlobClientの作成
CloudBlobClient blobStorage = storageAccount.CreateCloudBlobClient();
```
ここもお作法です。


##③Blob操作用のOptionの設定を行います。
```lang:C#
//ブロブの情報を取得するための設定
var blobRequestOptions = new BlobRequestOptions();
blobRequestOptions.BlobListingDetails = BlobListingDetails.Metadata;
blobRequestOptions.UseFlatBlobListing = true;
```
ここで重要になるのが「UseFlatBlobListing」です。
この設定はデータの取得方法の設定になります。
設定をTrueにすることで階層を無視したFlatなBlob情報を取得できるようになります。


##④Blobを取得します。
```lang:C#
long fileCount = 0;
long count = 0;

//コンテナ名を指定してコンテナ情報を取得する。
CloudBlobContainer blobContainer = blobStorage.GetContainerReference([コンテナ名]);

//継続トークン
ResultContinuation blobtoken = null;

do
{
    var blobResult = blobContainer.ListBlobsSegmented(1000, blobtoken, blobRequestOptions);

　　//継続トークの取得
    blobtoken = blobResult.ContinuationToken;
    
　　//取得したBlob情報を直接取得
　　var blobList = blobResult.Results.ToList();

    foreach (var item in blobList)
    {
 　　　  //件数をカウント
        fileCount++;　　　　 
        //blob容量を取得しカウント
        count += ((Microsoft.WindowsAzure.StorageClient.CloudBlob)(item)).Properties.Length;
    }

} while (blobtoken != null);
```

コンテナ名を指定してコンテナ情報を取得します。
コンテナ内のBlobを参照するために「ListBlobsSegmented」を使用します。
第一引数は一度のリクエストで取得する件数です。一度のリクエストで取得できる件数はMAX5000件なため5000以上の値を設定しても5000件のレスポンスになります。ここでは1000件を指定しているので一度のリクエストで1000件ずつ参照します。
第2引数は継続トークンの指定、第3引数はリクエストオプションになります。

ここで重要になるのはdo~while文です。
Blobから「ListBlobsSegmented」で参照する度に継続トークンを確認し、後判断でnullになるまで繰り返します。


上記の方法でBlobの一覧を取得することが出来ます。


**余談**
500万Blobを調査するのに3時間40分かかりました。
1回のリクエストで取得できるBlob数は最大5000までなのでBlob数が多ければ多いほど時間がかかるのは仕方ありません。
バッチにしてバックグラウンドで実行しておけばいつかは終わるでしょう。


長々と記載しましたがお付き合い頂きありがとうございます。
ご意見・ご感想があればコメントをよろしくお願いします。
Rails 4.2 を使っていて MySQL 5.7.x にしてしまった人へ



## Rails 4.2 & MySQL 5.7.x でエラーしてしまう

下のイシューによると、Rails 4.2 系で MySQL 5.7.x を使おうとするとエラーしてしまうようです。


[MySQL 5.7.8 Mysql::Error: SELECT command denied to user 'rails'@'localhost' for table 'session_variables': SHOW VARIABLES WHERE Variable_name = 'character_set_client' (ActiveRecord::StatementInvalid) · Issue #21108 · rails/rails](https://github.com/rails/rails/issues/21108)

下のプルリクエストで直るようですが、まだリリースされていません。
[MySQL 5.7 support for 4-2-stable by yahonda · Pull Request #22383 · rails/rails](https://github.com/rails/rails/pull/22383)

## 解決策1: GitHub にある Rails gem のコードを使う。

自分は、とりあえず 5.7.x を検証するためにも、このまま使おうと思うので、正式リリースまで Gemfile を以下のように書き換えます。

```ruby
gem 'rails', git: 'git://github.com/rails/rails.git', branch: '4-2-stable'
```

`bundle install` をお忘れなく。

```bash
bundle install
```

参考URL
http://stackoverflow.com/a/6120126/


## 解決策2: MySQL のバージョンを戻す

なお、Homebrew などを使っていて、アップデートされてしまったバージョンを戻したい場合は

```bash
$ brew info mysql
```

で、まだローカルにファイルがあるものを出します。

この際、5.6.x のイメージがまだ残っている場合はその旨が表示されます。
もし表示されない場合は少し面倒です…。

### MySQL 5.6.x がある場合

```bash
$ brew switch mysql 5.6.27
```

と打ってバージョンを戻しましょう。

参考URL
http://stackoverflow.com/a/4158763/

### MySQL 5.6.x が見当たらない場合

ない場合は、[Homebrew/homebrew-versions](https://github.com/Homebrew/homebrew-versions) で古いバージョンを取得する必要があります。

:exclamation: **注意** :exclamation: 下記方法はデータベースをインストールし直す方法なので、バックアップが必要な場合は `mysqldump` などでとっておくことをオススメします。

1. `brew tap` で `homewbrew/versions` を有効にします。

    ```bash
    $ brew tap homebrew/versions
    ```

1. MySQL 5.6 をインストールします。

    ```bash
    $ brew install mysql56
    ```

1. 既存の MySQL をバックアップします。

    ```bash
    $ mv /usr/local/var/mysql /usr/local/var/mysql.bak
    ```

1. MySQL のインストール作業を行います。

    ```bash
    $ unset TMPDIR
    $ mysql_install_db --verbose --user=`whoami` --basedir="$(brew --prefix mysql56)" --datadir=/usr/local/var/mysql --tmpdir=/tmp
    $ mysql.server start
    $ mysql_secure_installation
    ```

どちらを行った場合でも `mysql2` gem を利用している場合は `gem pristine` でバイナリをコンパイルし直す必要があると思うのでお忘れなく〜

    ```bash
    $ gem pristine mysql2
    ```


## 解決策3: 自分のローカルにあるコピーを改変する

解決策1 だと `rake db:migrate` のたびに `Gemfile` を変えたり変えなかったりするのが面倒なので、自分のローカルにある ActiveRecord のソースを変更してしまう、という手もあります。

具体的には [こちらのプルリクエスト](https://github.com/rails/rails/pull/22383/files) の内容を参考にして、

[`activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb` の608 行](https://github.com/rails/rails/pull/22383/files#diff-98ce5dc0cd01f8b0435ff6feac10d8a8R606)ぐらいの

```diff
        def show_variable(name)
-         variables = select_all("SHOW VARIABLES LIKE '#{name}'", 'SCHEMA')
+         variables = select_all("select @@#{name} as 'Value'", 'SCHEMA')
          variables.first['Value'] unless variables.empty?
+       rescue ActiveRecord::StatementInvalid
+         nil
        end
```

となっているので、自分のローカルも変えてしまいましょう。
自分の場合は、一応改変したことが分かるように元の行はコメントアウトだけにしてます。


```ruby
      def show_variable(name)
        # variables = select_all("SHOW VARIABLES LIKE '#{name}'", 'SCHEMA')
        variables = select_all("select @@#{name} as 'Value'", 'SCHEMA')
        variables.first['Value'] unless variables.empty?
      end
```
fast_blankと日本語環境

RubyGemsには多様なGemがありますが、中にはRubyでも可能なことをC言語で実装して、高速化を図っているものがあります。今回は、そんな`fast_blank`を使っていたら引っかかったところがあった、そんな話です。

# まず、`blank?`って？
[こちら](http://qiita.com/somewhatgood@github/items/b74107480ee3821784e6)の記事を見てもらうとわかりやすいですが、`blank?`メソッドは、`nil?`だけではなく「空っぽい」オブジェクトに対して`true`を返す、ActiveSupport（Rails拡張）のメソッドです。具体的には、`empty?`があるものはその値につなぐ、文字列の場合は「ホワイトスペースだけ」なら`true`、というようになっています。

# じつは、おそい
[ActiveSupportのコード](https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/object/blank.rb#L99)を見れば、`String#blank?`の実装はごくシンプルです。

```rb:lib/active_support/core_ext/object/blank.rb
class String
  BLANK_RE = /\A[[:space:]]*\z/

  # A string is blank if it's empty or contains whitespaces only:
  #
  #   ''.blank?       # => true
  #   '   '.blank?    # => true
  #   "\t\n\r".blank? # => true
  #   ' blah '.blank? # => false
  #
  # Unicode whitespace is supported:
  #
  #   "\u00a0".blank? # => true
  #
  # @return [true, false]
  def blank?
    BLANK_RE === self
  end
end
```

`Regexp#===`が正規表現にヒットするかどうかの判定、ということさえわかれば、まさに「見ての通り」といった実装です。ただし、文字列に正規表現をヒットさせるという都合上、処理は意外と遅いです。

# `fast_blank`の登場
そこで、この`String#blank?`を高速化するためのGemとして、[`fast_blank`](https://github.com/SamSaffron/fast_blank)があります。原理はシンプルで、「正規表現は使わずに、Cで繰り返し処理」というものでした。

こんな粒度でCエクステンションを入れて速くなるものなのかという疑問もありましたが、実際に速くなっているようです（GitHubのページにも測定結果があります）。

# 問題になる非互換
ただし、（Gem作者からすれば意図的ではあるのですが）`fast_blank`で入る`String#blank?`は、ActiveSupport版のものと違って、ASCIIの改行や空白しか考慮しないようになっています。つまり、**全角スペース**だけの文字列の場合、ActiveSupport版は`blank?`が`true`になりますが、`fast_blank`版では`false`を返してしまいます。

この非互換が致命的に効いてくる場面は少ないかもしれませんが、日本語には全角スペースが現れてしまうので、放置するよりは対策したほうがいいでしょう。幸い、`fast_blank`でも空白の基準をActiveSupportと揃えた`blank_as?`メソッドを用意しているので、これに差し替えておきましょう。

```rb:config/initializers/fast_blank.rb
if String.method_defined?(:blank_as?)
  class String
    alias_method :blank?, :blank_as?
  end
end
```

もし何かの都合で`fast_blank`がなくてもエラーが出ないよう、外側に`if`を入れてあります。また、`present?`は、

```rb:lib/active_support/core_ext/object/blank.rb
class Object
  # 中略
  def present?
    !blank?
  end

  # RDoc略
  def presence
    self if present?
  end
end
```
というような実装なので、`blank?`さえ入れ替えればすべてが元に戻ります。
PHP（PDO）でファイルをMySQLに保存するときに変更しなければいけない点

# ファイルを物理ファイルではなく、データベースに保存する

## tableの設計

* おそらく2択

### MEDIUMBLOB
* およそ 16MB(2^24 - 1)
* 常識的な添付ファイルで使えるサイズ。 

### LONGBLOB
* およそ 4GB(2^32 - 1)
* 本当に4GBを格納するつもりならば考え直した方が良い。 
* とはいえ、16MB以上であれば必然的にこのサイズ。

### TINYBLOB
* およそ 255B
* テキストくらいしかないだろうし、それならバイナリで持たせる必要ないかな。

### BLOB
* およそ 64KB
* プロフィール画像とか？
* 昔、BLOBってんだからバイナリ無制限に入るんだろうとか思ってた。そもそも無制限とかありえないし実際全然入らなかった死にたい。

## MySQLの設定

### max_allowed_packet

#### 確認

> show variables like 'max_allowed_packet';
| max_allowed_packet　| 1048576 |

* クライアントからサーバに送ることができるパケットの最大値設定
* この値を超えるとエラーを吐くので、割とすぐ気付く。
* デフォルトでは1MB
* **最大値でも1GB**
   * なので、LONGBLOBの最大の4GBは保存できない。 


#### 変更

* 設定変更と一時変更の2種類があり、一時変更にはさらに一時全体変更と、一時一部変更の2種類がある。
* 設定変更はMySQLサーバーとしての設定を変更する。
* 一時全体変更は、変更以後接続する場合に適用される。ただし、再起動するとリセットされる
* 一時一部変更は、今接続している自分自身にのみ適用される。PHPから使うのでこの設定を使うことは多分無い。

##### 設定変更

* my.cnfを変更

```my.cnf
[mysqld]
max_allowed_packet=16MB
```

* 反映には再起動が必要。

##### 一時全体変更

> set global max_allowed_packet = 10475520;

* 変更直後はSESSIONの値が適用されているので、一度接続しなおす必要がある。

##### 一時一部変更

> set max_allowed_packet = 10475520;

* 省略。

#### まとめ

* 運用環境で突然再起動なんてできないだろうし、かといって一生再起動しないというパターンもあり得ないので、結局set globalで一時的に変更して、再起動した時用にmy.cnfも修正する必要に迫られると思われる。



## PHP（PDO）の設定

### MYSQL_ATTR_MAX_BUFFER_SIZE

* PDOが読み出すバッファの最大サイズ。デフォルト1MB。
* 最大サイズを超えていてもエラーは出ない。
* 1MBを超えているファイルをダウンロードする場合にキッチリ1MBになっていたらこれが原因の可能性大。

#### 変更

* 接続後の変更は不可で、PDOのコンストラクタに渡す必要がある。

```php
new PDO("mysql:host=$host; dbname=$dbname", $user, $password,
           array(PDO::MYSQL_ATTR_MAX_BUFFER_SIZE=>1024*1024*10));//バイトで指定
```

## 出力時の設定

* BLOBでファイルデータのみ格納している状態では適切なmime-typeを判別することは不可能なので、DB格納時に調べてファイル情報としてファイル名他と共に保存するのが良いと思う。

# まとめ

* ファイルは物理ファイルとして保存して、パス情報等のみ保存する方法は、SQLアンチパターン「ファントムファイル」としても挙げられているので、じゃあDBにファイルを保存しようとした結果がこの有様です。

* 実装さえ終われば、二度目以降は同じ失敗しないだろうし、トランザクション管理もバックアップもほぼ何も考えなくて良いので、今後もファイルは積極的にDBに持たせていきたい。
Scala(Java)でresourcesフォルダ内のファイル一覧を取得する方法

resourcesフォルダ内にregressionというフォルダが有りその中のファイル一覧を取得したい場合以下のようにします(jarファイル化した場合でも使えます）。

```scala
val uri = getClass.getResource("/regression/").toURI
var myPath: Path = null

if (uri.getScheme == "jar") {
	val fileSystem = FileSystems.newFileSystem(uri, Collections.emptyMap[String, Object]())
	myPath = fileSystem.getPath("/regression/");
} else {
	myPath = Paths.get(uri);
}

val walk = Files.walk(myPath, 1)
val it = walk.sorted().iterator()
it.next()//最初の一つ目はregressionフォルダ自体なので飛ばす
while (it.hasNext) {
	val path = it.next()
	println(path.toAbsolutePath.toString)
}
```

2015/12/07追記
`FileSystems.newFileSystem`関数は全く別の場所でも2回実行されると`java.nio.file.FileSystemAlreadyExistsException`というエラーが起きてしまうので、一つテキトーなパスで`fileSystem`変数を作ったらそれを使いまわさなければいけないようです。


参考リンク
[java - How do I list the files inside a JAR file? - Stack Overflow](http://stackoverflow.com/questions/1429172/how-do-i-list-the-files-inside-a-jar-file/28057735#28057735 "java - How do I list the files inside a JAR file? - Stack Overflow")
coffeescriptでrailsの環境変数を利用する

```env.js.coffee.erb
window.ENV = {}
window.ENV.RailsEnv = "<%= Rails.env %>"
```

```application.js
//= require env
```

```hoge.coffee
console.log window.ENV.RailsEnv
```




![AA_koronbia.jpg](https://qiita-image-store.s3.amazonaws.com/0/24979/14b2e14f-3ba1-45c6-a414-af3313e2d670.jpeg)
powershell > サブフォルダ内のcppファイルに対して、大文字小文字を区別してキーワードで検索する > -caseSensitiveをつける > Get-ChildItem D:\WORK *.cpp -Recurse | Select-String -caseSensitive -pattern Interval

http://qiita.com/7of9/items/7e5839cce963290ae658
のキーワード検索をしていて、大文字小文字の区別が気になった。

https://technet.microsoft.com/en-us/library/ff730968.aspx
> A bonus Select-String T ip. By default, Select-String does case-insensitive matching; that means the letter case is ignored which, in turn, means that both FAILURE and failure will be tagged as matches. If you’d prefer to perform a case-sensitive match, in which FAILURE and failure do not match, <font color=red>then simply add the –caseSensitive parameter.</font>

以下でIntervalの検索ができた (intervalやINTERVALは排除)

```findkeywordCaseSensitive.bat
powershell "Get-ChildItem D:\WORK *.cpp -Recurse | Select-String -caseSensitive -pattern Interval" > file4.txt
```