OmniAICreator/Qiita-1.07M huggingface dataset:
Code for Hakodate の長~い 2015年 を振り返る

[Civic Tech Advent Calendar 2015](http://qiita.com/advent-calendar/2015/civictech) の12月24日（クリスマスイブ）の記事です。

[Code for Hakodate](http://codeforhakodate.org) の杉本 涼([@ryo_sugryo](http://twitter.com/ryo_sugryo))と申します。
たぶん、Code for に関わっている方の中で最年少なのかなと思っています。（16歳です）

# Code for Hakodate と Code for DONAN の出会い
Code for Hakodate は、受験勉強がこれから忙しくなりそうな時の2014年8月30日に中学3年生の僕が立ち上げました。そして、2015年の3月まで受験勉強をして、第1志望校へ入学が決まりその後にとあるアイデアソンで出会った大学生からバスの研究をしている大学生を紹介してもらったんです。
それが、当時 Code for DONAN だった工藤さんです。他に僕と同じ活動をしている方々が、それも同じ地域でいるということに驚きました。そして、Code for DONAN の方々と話していく中で Code for Hakodate に合流することになりました。
Code for DONAN の活動については、[Code for DONAN が Code for Hakodate と合流合併するまでのおはなし](http://qiita.com/deckeye/items/35d3768d47eff4fe2d43) からご覧下さい。

**新Code for Hakodate = 
Code for DONANが、Code for Hakodate と合流後の Code for Hakodate**
# 新Code for Hakodate の活動
## 7月19日 Wikipedia タウン in 函館蔦屋書店
初めて、Wikipedia タウンを開催しました。今回は、函館蔦屋書店にある歴史的な記録についての書籍を貸していただき、それを使ってまちや建物の歴史を調査し、Wikipedia の編集方法を学んでいただきました。
![IMG_4063.JPG](https://qiita-image-store.s3.amazonaws.com/0/32913/5c0f38cb-1732-2f3c-33e6-ff2d566d5cdd.jpeg)

また、参加者の中には、また参加したいと言ってくださる方もいてとても嬉しかったです。
## 7月26日 JCデー
一般社団法人函館青年会議所 新幹線開業前イベント JCデー に、Code for Hakodate が、ブースを出し、ARを使った Open Lab を行いました。青年会議所の方々にも見ていただくことができました。

## 10月3日 HAKODATE Developer Conference
Code for Hakodate の活動を函館の開発者の方々に宣伝するために、LT に参加することを決めました。LT の持ち時間は５分なのに僕は、30枚ものスライドを作ってしまい **10秒/1枚** のペースで流すことになり、かなりの早口に。でも、参加したことで函館市の方々やこのイベントの主催 [はこだてIKA](http://hakoika.jp) の方々に会うことができました。

## 10月17日 Wikipedia タウン in 函館市地域まちづくりセンター＆函館市立中央図書館
今回の Wikipedia タウン では、函館に来た観光客の方が行かれることが多い 西部地区 と呼べれる地域にある歴史的建造物や坂を実際に見に行き、その後記事を書いていただくということをしました。そして、今回は、Wikipedia 日本語版管理者・編集者の日下九八 氏をゲストに迎えました。
また、[コミュニティFM](http://www.fmiruka.co.jp) や[地元ケーブルテレビ局](http://www.ncv.ne.jp)、[北海道新聞](http://dd.hokkaido-np.co.jp)に取材していただき、Wikipedia タウンの宣伝させていただきました。

## 11月24日 市長のタウントーキング
函館市の市長が、オープンデータをどのように考えられているか意見交換したいと前々から考えていたのですが、なかなか機会がなく アドバイザーの青田に相談したところ、[市長のタウントーキング](http://www.city.hakodate.hokkaido.jp/docs/2014021300245/)という場があることを紹介してもらい、参加することに。ですが、平日の真昼間でしたので学校の休みが取れるかどうかがわからかったのですが、無事校長先生の許可を頂き参加することができました。また、北海道新聞さんと函館新聞さんに取材していただきました。
[オープンデータ推進を提言　函中部高１年・杉本君　公共交通のアプリ開発 | 北海道新聞](https://web.archive.org/web/20151220082105/http://dd.hokkaido-np.co.jp/news/area/donan/1-0205853.html)
# これからの Code for Hakodate
まだ、1年しか経っていないのだなと思うといろいろなことをやってきているんだなと思いました。僕は、あまり時間をかけて振り返ってみることはしないのですが、よく見るとほぼ僕が、**これやってみよう** ということでしたことが多いなと。会ってから、1年も経っていませんが、Code for Hakodate のみんなが、僕の新幹線のようなスピードについてきてくれてありがとう。そして、Code for Hakodate の活動に賛同いただいた イベント参加者の方、公立はこだて未来大学の先生方、函館市役所の皆さま、函館バス株式会社の方々、函館中部高等学校の先生方、市立函館高等学校の教頭先生、日下さん、Code for Mori となったハウモリの皆さま、そして その他 ご迷惑をお掛けした皆さまに感謝を述べたいと思います。

ここで、Code for Hakodate は終わるわけではありません。
Pecily という北海道の南の地域の公共交通機関の路線・運賃・時刻表・運行情報のオープンデータプロジェクトや 5374.jp もスタートしています。そして、これからも **ICT（情報通信技術）を使って函館・道南地域の様々な問題を解決していきます**
ですので、これからもご迷惑をお掛けしますが Code for Hakodate をよろしくお願いします！
PowerShellの実行結果をVimに取り込む

## read:コマンドを使う
Vimにはカレントバッファにファイルを読み込む`read:`コマンドがあります。これと外部コマンド実行の`!`を組み合わせてシェルの実行結果をVimに取り込みます。

たとえばファイルのリスト出力を取り込みたければexコマンドで

```
:read: !gci
```

と入力してやると

```
シェルがコード 1 で終了しました

続けるにはENTERを押すかコマンドを入力してください
```

あれ？ENTER押してみるか。

```
 1
 2 'gci' は、内部コマンドまたは外部コマンド、
 3 操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```

...(´Д` )

## shellを指定しよう
うちで使ってるWindows版Vimは[香り屋](http://www.kaoriya.net)さんとこのものなんですが、デフォルトのシェル指定がcmd.exeです。

```
:set shell
  shell=C:\WINDOWS\system32\cmd.exe
```

Windowsに標準搭載されて久しいのに、いまだにメジャーになりきれていないPowerShell。

```
:set shell=powershell
:read !gci
```

シェルを切り替えることで

```
  1
  2
  3
  4     ディレクトリ: C:\Users\home
  5
  6
  7 Mode                LastWriteTime         Length Name
  8 ----                -------------         ------ ----
  9 d-r---       2015/09/18     21:41                3D Objects
 10 d-----       2015/11/03     18:11                chkopt
 11 d-r---       2015/11/19     21:15                Contacts
 12 d-r---       2015/07/10     20:04                Desktop
 13 d-r---       2015/11/14     19:49                Documents
 14 d-r---       2015/11/14     19:49                Downloads
 15 d-r---       2015/11/19     21:15                Favorites
 16 d-r---       2015/11/19     21:15                Links
```

でた。面倒なので_vimrcに`set shell=powershell`を書いておきましょう。

## Write-Hostがリダイレクトされない
もともとこれをやりたかった理由が、シェルスクリプトの実行結果を取り込めるといいなと思ったからなんですが、標準コマンドレットの出力は取り込めるものの`Write-Host`の出力は取り込めませんでした。

`Write-Output`で出力したものは取り込めます。

`Write-Host`と`Write-Output`の違いは、前者が標準出力限定に対して後者はデフォルトが標準出力。Vimの`:read`機能はおそらく画面出力をリダイレクトして出力結果を持ってきているんでしょうね。リダイレクト不可能な出力は取り込めないんでしょう。

装飾不要な出力は`Write-Output`を使うようにするしかないのかなぁ。

ということでちょっと中途半端な結果になってしまいました。PowerShellの仕様だからこれ以上は無理かな。
c++ builder > フォームやユニットにつけるキーワードについて

この記事は[Delphi Advent Calender 2015](http://qiita.com/advent-calendar/2015/delphi)の6日目の記事です。

やましょうさんお疲れ様でした。

<hr>

```txt:環境
C++ Builder XE4
+ Delphi XE関連
```

## 調査のとっかかり

設定項目を入力するフォームを用意したとします。その名前はoptionとします。
( 「設定」の英語訳については: [Properties / Options / Settings and Preferences / Configuration @ Visual Studio](http://qiita.com/7of9/items/4a0dc71a2802ac33d458) )


ここで、Form1のプロパティであるNameを`option`にしたとします。
次に、ユニットファイル名を`option.cpp`で保存しようとすると以下のエラーがでます。

> フォームまたはモジュール option はすでにプロジェクトに登録されています。

これがこの記事で書こうと思うキーワードについてのとっかかりです。

## キーワードの定義

ここでいう「キーワード」というのは、以下のようなものを指します。

- ユニットファイル Unit1.cpp の `Unit`
- フォーム名 Form1 の `Form`

キーワードをつけることで、この記事の背景にある、名前がかぶる問題は回避できます。

では、どういうキーワードをつけるのが今後のソースメンテナンスにとってよいのでしょうか？

## キーワード例

自分がこれまで扱ってきたものとそのキーワード例は以下の様なものです。

- ファイル > フォームのユニットファイル : Unit
- ファイル > スレッドファイル : Thread
- ファイル > 言語リソース : 任意 (LangResxxxなど)
- ファイル > C++ クラス : 任意 (Utilxxx, Calcxxx, ...)
- ファイル > C 関数群 : 任意 (Utilxxx, Calcxxx, ...)
- ファイル > .cppなしのヘッダファイル(.h) : 任意
- ファイル > プロジェクト(.cbprojなど) : 任意
- コンポーネント > フォーム : Form

「任意」との記載ではその時々で変えていますが、括弧内のものを使うことが多いです。

スレッドファイル(新規作成 -> スレッドオブジェクト)はデフォルトではユニットとして新規作成されますが、フォームのユニットと区別したいためにキーワードをThreadとしています。

C++クラスとC関数群は同じようなキーワード(Util, Calcなど)としていますが、C++とCは拡張子が変わりますので、区別できると考えています。
また、同時に同じ名前(UtilUDP.cppとUtilUDP.c)はないと考えていますが、あるようになった場合には別途検討することになります。
ただし、別の理由でC++クラスとC関数群を分けてグループ化したくなった場合は、キーワードの再検討をすることになります。

.cppなしのヘッダファイル(新規作成 -> ヘッダー)はデフォルトではFileキーワードが付きますが、ファイルにFileキーワードを付ける意味がないため、任意としています。
ヘッダーファイルについては、キーワードがない方が良い時もあり、キーワードなしにしている場合もあります。


## キーワード選択の根拠

IDEで「それ」を作った時に最初に付けられる名前に従っていると、記憶にたよらなくてよくなる、という考えでした。

しかしながら、こうして整理していきますと、IDEのデフォルトをキーワードとして使っているものはUnit, Formのみで、他は別途決めたキーワードということをこの記事を書きながら気づきました。


## キーワードの必要性

ここでキーワードをつける理由に戻りますと「名前がかぶることによりIDEが処理できなくなることを防ぐ」というのを大きな理由としています。

反対に、支障がない限りキーワードなしにしていいという考え方もあります。

キーワードをつける他の利点としては以下のようなものを考えています。

- キーワードをつけることで、それを見つけやすくする
- キーワードをつけることで、その機能をわかりやすくする
- キーワードをつけることで、プロジェクトの構造をわかりやすくする

ソースのメンテナンス時に有効に働くことを期待しています。

僕自身、ソースメンテナンスの時に「スレッドxxxを読みたい」「フォームxxxのデザインをすぐに見たい」「C++関数xxxのこの処理どうやっていただろう」などその時々にやりたいことを考えたあとに、すぐに関連するファイルを開きたい。そのためキーワード付けを意識しています。

考えている状況としては、１プロジェクトにおいてソース(.cpp)が最大で4０種類あり、そういうプロジェクト数が50を超す時、10年以上メンテナンスしやすいように。

ソースの構造を書いたドキュメントを用意するのも手ですが、ここではそのドキュメントを書かない場合で検討しています。

## 最後に

他の人がどういう名前付けをしているのかを知りたいというのがこの記事を書いた理由です。
コメント欄に「こういう付け方しているよ」や「こういう名前付けの情報があるよ」、「キーワードは考えない」、「別ドキュメントにしている」などをいただければ幸いです。

Project JEDI や Object Pascal Style Guide などを斜め読みしましたが、キーワードについてはコンポーネントのキーワード(TLabelのキーワードなど)は記載されていましたが、自分が知りたい上記のような情報は見つけられていません。
技術英語 > The question [is so broad]. It is difficult to respond. / Your point? / You hit the nail on the head.

@ Star Trek Voyager > ELOGIUM

子供を持つかどうか悩むNeelixがTuvokに相談している会話

> Neelix : Tell me what's it like being a father?
> Tuvok : The question <font color=red>is so broad</font>. It is difficult to respond.

字幕は上記であったが、「Tell me what's like being a father?」でいい(itが余分)のではと思う。

<hr>
関連して思い出しのは

> Your point? 

ソースは失念したが、Voyagerのエピソードで聞いた気がする。ドクターのセリフ。

「質問の焦点は何」や「何を聞きたいの？」という意味で使われていた。

フォーマルな場面で使えるかは未調査。

<hr>
関連して思い出したのは

You hit the nail on the head.
http://ejje.weblio.jp/content/hit+the+nail+on+the+head
カーネル探検(環境構築からstart_kernelまで)

### 概要
BIOSがMBRを読み込んでブートローダが動き出し、カーネルをメモリにロードして/sbin/initが動き出すまでの処理をデバッグするための自分めもめも。そして最近？は/sbin/initからsystemdに置き換わりつつあるらしいので、systemdを導入しているcentOS7を使用してsystemdから各プロセスを起動させる処理もデバッグできたらいいなぁ(でもきっとむり)。カーネル処理をみていくことでそこから色々派生していろんな知識を学べたらいいなぁ。そしてこのデバッグ経験を活かしてDockerなどのコンテナ技術をカーネル(cgroups、systemd)のコードから理解できるようになれればいいなぁ(でもきっとむり)。

### スタート地点
どこからデバッグしてみようかなぁと考えた。とりあえずアセンブラ部分は~~やめておこう~~後に取っておこうというとでブートローダ(Cの箇所もあるけど)とばし、カーネル処理のアセンブラ箇所(メモリ設定など)をとばしー、なんて思ってたらデバッグのスタート地点は王道のstart_kernelからに決定。ということで今回は環境構築してGDB起動してstart_kernel先頭まで。

### カーネル探検(環境構築からstart_kernelまで)
#### 概要
仮想マシン上のCentOS7カーネルをGDBでリモートデバッグする。

#### 準備
* ホストOS
  - Cent7
* ゲストOS
  - Cent7
* QEMU(2.4.1)
  - qemu-system-xxxコマンドは自分でmake && make install
* カーネルver
  - 3.10.0-229.el7.x86_64
  - Linux Cross Referenceで示すコードは参考までにこのバージョンでないものも示す。
* vmlinux
  - カーネルのデバッグ情報(シンボル)が含まれているカーネル。カーネルコンフィグでチェックするか、kernel-debuginfo install kernel-xxxxでバージョン指定して任意のvmllinuxをインストールする。ブートローダーがメモリにロード(解凍したやつ)するvmlinuzはデバッグ情報が含まれていない。
* GDB(gdb-7.6.1-64.el7.x86_64)
  - QEMUを使用して64bit版のカーネルをデバッグする場合、CPUを32bitから64bitに移行する箇所でQEMUとGDBの間で不具合がるよう。GDBにパッチをあてる解決が簡単らいいのでパッチをあてる必要がる。[パッチのdiff](http://www.cygwin.com/ml/gdb-patches/2012-03/msg00116.html)。このdiffの内容がパッチの内容でpatchコマンドでパッチを適用する。
  - GDBの最新を自分でビルドして入れるならシステムにncurses-develがないとtuiモードが使えずlayoutコマンドが動作しない。

#### 環境構築
1. ホストOS上でデバッグしたいOSを含む仮想マシンを作成(qemu-img、qemu-kvm)

```
$ qemu-img create -f raw xxx.img 4G
```
```
$ qemu-kvm -k ja -m 1024 -localtime -hda xxx.img -net nic,model=e1000 -net user -cdrom xxx.iso -boot d
```

2. 仮想マシンの起動はqemu-system-xxxコマンドを使う。実行するとに色々オプションを指定。-SはGDBが接続するまでOSの起動？を待ってくれるオプション。

```
$ qemu-system-x86_64 -S -s -snapshot -k ja -m 1024 -localtime -hda xxx.img -net nic,model=e1000 -net user -monitor stdio
```
3. ホストOSからGDBを使ってQEMU上で動作するCentOS7のカーネルに対してリモートアクセスしてカーネル動作をデバッグ

```
$ gdb vmlinxへのパス
```

その他：もしゲストOS上と異るバージョンのカーネルをデバッグしたい場合は、カーネルがそのバージョンの仮想マシンを作るか、ホストOS上でカーネルコンパイルして既存の仮想マシンに任意のカーネルバージョンをインストールすればよいみたい(試してない)。

#### start_kernel表示
アプリケーションをデバッグする場合
  
- gdb 実行ファイル

カーネルをデバッグする場合

1. gdb  vmlinux
2. (gdb) target remote localhot:1234
3. (gdb) b start_kernel
4. (gdb) c 
5. (gdb) layout src
![スナップショット1.png](https://qiita-image-store.s3.amazonaws.com/0/91729/536f73e3-1f48-a640-6918-f92d3993a2e4.png)
わー、バックトレースやレジスタの中身が分るのねー！スタックの中身もみれるのかな？？素敵！

### next
[カーネル探検2](http://qiita.com/saikoro-steak/items/60f5ab6cb9d0f825df25)

#### 参考
1. [新装改訂版 Linuxのブートプロセスをみる](http://www.amazon.co.jp/%E6%96%B0%E8%A3%85%E6%94%B9%E8%A8%82%E7%89%88-Linux%E3%81%AE%E3%83%96%E3%83%BC%E3%83%88%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%82%92%E3%81%BF%E3%82%8B-%E7%99%BD%E5%B4%8E%E5%8D%9A%E7%94%9F/dp/404891393X/ref=tmm_jp_oversized_meta_binding_title_0)
vagrant rails　設定


はじめは
[【Vitualbox + Vagrant】Railsの開発環境構築 part2 〜CentOS構築編〜](http://nekojarashi-daily-life.hatenablog.jp/entry/2015/07/09/071701)　に設定して

mysqlが動かなかったので　

``` /etc/yum.repos.d/epel.repo
#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
```
を下記に変更

```/etc/yum.repos.d/epel.repo
baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch

``` 


たぶん使うと思うので

```
$yum install ImageMagick

$yum install ImageMagick-devel
 
$yum install rmagick

```

データベース作って

```

$mysql -u root

mysql > CREATE DATABASE hoge_development;
 
Query OK, 1 row affected (0.00 sec)
```


確認

```
mysql> SHOW DATABASES;
```
*.ymlを作成して

ridgepole走らせて

```
$ bundle exec ridgepole --apply --file Schemafile --config config/database.yml 
```


socketの場所確認して

```config/database.yml
socket: /var/lib/mysql/mysql.sock
```
に変更

ポートフォワーディングの設定して

```Vagrantfile
  config.vm.network :"forwarded_port", guest: 3000, host: 3000

  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  config.vm.network "private_network", ip: "192.168.33.10"
```

を追加


ポートを確認

```
$netstat -anp
```


 3000 があいてないなら


etc/sysconfig/iptablesに
``` 
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3000 -j ACCEPT
```
を追加


起動


```
rails s -b 0.0.0.0
```



#参考
[Vagrant + VirtualBox で構築した環境を他の PC へコピー・移設する方法](http://jetglass.hatenablog.jp/entry/2015/08/10/182810)

[【Vitualbox + Vagrant】Railsの開発環境構築 part2 〜CentOS構築編〜](http://nekojarashi-daily-life.hatenablog.jp/entry/2015/07/09/071701)
[CentOS6でyumが繋がらなくなった](http://d.hatena.ne.jp/C_6B4A2B/20130427/1367073209)

[localhost:3000に接続できません[vagrant centos rails]](http://harapeko.wktk.so/blog/ruby/2013-11-22/1715)

[vagrantでlocalhost:3000にアクセスできない問題](http://taropohci.blogspot.jp/2014/03/ruby-on-railsvagrantlocalhost3000.html)
Rubyのmix-in ~モジュールのメソッドをインスタンスメソッドとして取り込む~

# ざっくりMix-inって?
モジュールをクラスに取り込んでそのクラスを拡張すること。
モジュールに機能を分離させることでクラスが肥大化するのを防げたりする。

# さっそく簡単な例
PersonクラスにWomanモジュールをインクルードしてみます。

```ruby:person.rb

module Woman
  def introduce
    puts "私は女性ですわ!!"
  end
end

class Person
  include Woman
end

person = Person.new
person.introduce #=> 私は女性ですわ!!
```

このようにPersonクラスでWomanモジュールをincludeすることで、WomanクラスのメソッドをPersonクラスのインスタンスメソッドとして使えるようになります。

## モジュールから取り込んだメソッドを上書きする
オーバーライドと同じです。なんらかわりません。

```ruby:person.rb
module Woman
  def introduce
    puts "私は女性ですわ!!"
  end
end

class Person
  include Woman

  def introduce
    super
    puts "あ、はじめまして"
  end
end

person = Person.new
person.introduce #=> "私は女性ですわ!!", "あ、はじめまして"と順に表示
```

## メソッド検索順
Mix-inを使った時のメソッド検索順にも、もちろんルールが有ります。
①元のクラスに同じ名前のメソッドが定義されている場合はそちらを優先

```ruby:fruit_1.rb
module Apple
  def name
    puts "りんご"
  end
end

class Fruit
  include Apple

  def name
    puts "果物"
  end
end

fruit = Fruit.new
fruit.name #=> 果物
p Fruit.ancestors #=> [Fruit, Apple, Object, Kernel, BasicObject]
```
※ ancestorsは「クラス、モジュールのスーパークラスとインクルードしているモジュール」を優先順位順に配列に格納して返してくれるメソッドです。

②同じクラスに複数のモジュールがincludeされている場合は、後からincludeした方を優先

```ruby:fruit_2.rb
module Apple
  def name
    puts "りんご"
  end
end

module Orange
  def name
    puts "オレンジ"
  end
end

class Fruit
  include Apple
  include Orange
end

fruit = Fruit.new
fruit.name #=> オレンジ
p Fruit.ancestors #=> [Fruit, Orange, Apple, Object, Kernel, BasicObject]
```

③ インクルードが入れ子になった場合も検索順は一列！！

```ruby:fruit_3.rb
module Apple
  def name
    puts "りんご"
  end
end

module Orange
  def name
    puts "オレンジ"
  end
end

module Grape
  include Orange
  def name
    puts "ぶどう"
  end
end

class Fruit
  include Apple
  include Grape
end

fruit = Fruit.new
fruit.name #=> ぶどう
p Fruit.ancestors #=> [Fruit, Grape, Orange, Apple, Object, Kernel, BasicObject]
```

# もうちょっと現実的な例
自作クラスに[Enumerableモジュール](http://docs.ruby-lang.org/ja/1.8.7/library/_builtin.html)を組み込んで遊んでみます。
Enumerableモジュールをincludeすることで「all?, any?, collect, map, count」とかいろんなメソッド使えるようになります。
Arrayクラス、Stringクラス、Hashクラスなどなどにもincludeされてます。

```ruby:fruit_enumerable.rb
class Fruit
  include Enumerable

  def initialize(*fruits)
    @fruits = fruits
  end

  def each
    for v in @fruits do
      yield v
    end
  end
end

fruits = Fruit.new('Banana', 'Apple', 'Orange', 'Grape')

fruits.count #=> 4
fruits.map { |f| f.upcase } #=> ["BANANA", "APPLE", "ORANGE", "GRAPE"]
fruits.all? { |f| f.length > 0 } #=> true
```

こんな感じで、Fruitクラスにはeachメソッドしかないのに、countメソッドやmapメソッド、all?メソッドなどを呼び出すことができました。

# 結局何が嬉しいの？
* Rubyのクラスは１つしか継承できないが、モジュールはいくらでもincludeできるのでいろんな機能拡張ができる
* 共通機能をモジュール内で定義して各クラスでincludeしてやればクラスが肥大化しないし、同じメソッドが増えなくてすむ
    * 例えば、開催期間を扱うPeriodモジュールがあって、ガチャクラス、クエストクラスにそれぞれincludeすれば開催中か判別するメソッドを共通化できるみたいな。

私レベルだと上の2つくらいしかぱっと思いつかないですが。。。他にもあったら教えて下さい。

次は、モジュールと特異メソッドについて勉強してまとめたいかな。。。
簡単な状態変更処理


### 状態変更とは

GUIが絡むプログラミングでは頻繁に記述すると思いますが、最近はいろいろなライブラリ内に隠蔽されているベースな部分だと思います。基本的にはObserverパターンをしようします。

[Observerパターン](https://ja.wikipedia.org/wiki/Observer_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)はGUIプログラミンでは頻繁に使用するので初耳の方はこちらを確認してください。


状態変更でよく使うのは、A状態に変更されたら、各オブジェクトがそれぞれ処理を実行するというものです。

例:
Formの確認ボタンが押されたら"確認画面に移動"、"送信ボタンを表示する"など...


### 実装

```Monitor.js

Monitor = function(){

};

Monitor.prototype['addListener'] = addListener;
Monitor.prototype['changeState'] = changeState
Monitor.prototype['notify']      = notify;

Monitor.listeners = {}; // リスナー

function addListener(state, scope, func){
    if(Monitor.listeners[state] == undefined ) Monitor.listeners[state] = [];
    Monitor.listeners[state].push({scope: scope, func: func});
}

function changeState(state){
    if(Monitor.listeners[state] == undefined ) throw new Error("指定された状態は存在しません。");
    this.notify(state);
}

/**
 * 通知処理
 */
function notify(state){
    for(var i = 0; i < Monitor.listeners[state].length; ++i){
        var obj = Monitor.listeners[state][i];
        obj.func.apply(obj.scope);
    }
}

```

次にStateクラスを定義します。

```state.js

State = function(){

};

State.current = State.ON_EDIT;

State.ON_EDIT            = 0;
State.ON_CONFIRM         = 1;
State.ON_COMPLETE        = 2;
State.ON_VALIDATE        = 3;
State.ON_SENDMAIL        = 4;
State.ON_SYSTEM_ERROR    = 99;

```

### 使い方

```main.js

var monitor = new Monitor();
monitor.addListener(State.ON_EDIT, this, this.onEdit);

// エディット処理
function onEdit(){
	console.log(" ON_EDITで処理実行");
}


// 状態変更
monitor.changeState(State.ONEDIT);

```
関数はモナドである

今更だけれど、ネット巡回していて気付いた。


http://www.geocities.jp/m_hiroi/func/haskell18.html

> Functor, Applicative で説明したように -> は中置演算子で、関数の型は (->) r a と書くこともできます。(->) r を型コンストラクタと考えると、関数のモナドの定義を導くことができます。


https://hackage.haskell.org/package/base-4.8.1.0/docs/src/GHC.Base.html#line-621

> ```hs
instance Monad ((->) r) where
    return = const
    f >>= k = \ r -> k (f r) r
```


というわけで、PHPのカリー化関数クラスはこうなった。(一部省略)

```php
<?php
class Func extends Curry implements Monad
{
    use MonadTrait;

    public function __construct(callable $f)
    {
        $this->value = static::curry($f);
    }

    // Functor
    public function fmap(callable $f)
    {
        return $this->compose($f);
    }

    // Applicative
    public static function pure($a)
    {
        return new static($a);
    }

    // Applicative
    public function ap(Applicative $f)
    {
        assert($f instanceof static);

        return $this->fmap($f);
    }

    // Monad
    public static function ret($value)
    {
        // const
        return new static(function($_) use ($value){
            return $value;
        });
    }

    // Monad
    public static function fail($msg = null)
    {
        throw new \RuntimeException($msg);
    }

    // Monad
    public function bind(callable $f)
    {
        return new static(function($a) use ($f){
            if (!($f instanceof self))
                $f = new self($f);
            return $f($this($a), $a);
        });
    }
}
```


データベースとかファイルとか何らかのリソースを操作するクラスがあるとする。
それに対して、何らかの処理をする関数がいくつかある。

```php
function getUser($userId, $db)
{
  return $db->getUser($userId);
}

function getFriends($user, $db)
{
  return $db->getAllFriends($user->myTeams);
}

function getFavorites($friends, $db)
{
  return $db->getFavorites($friends);
}
```

この場合、各関数のカリー化されたものがあるとすると

```php
$combine = $getUser($userId)
         ->bind($getFriends)
         ->bind($getFavorites);
$friendFavs = $combine($db);
```

関数をbindした後にdbを渡すと、全ての関数に連動してdbが行き渡る。
引数の順番が重要。

```hs
f >>= k = \ r -> k (f r) r
```

f と k を bind で繋げると、最後に適用する r が f と k にも適用されるようになっている。
Nginx で AND 条件を記述した話

プロキシ設定を書いている中で必要になってきたため、試したものをメモ。

ググったりしてみると Nginx の `if` では、論理 AND を使用する場合に、変数に文字列を保持して連結していき、最終的にこの変数を評価することで、論理 AND を実現している例が多数見つかった。

ただ、この書きかたは、お世辞にもきれいとはいえない。
少なくとも自分には我慢ならなかった。

そこで もう少しどうにか、きれいにならないかと試してみたのが以下。

```conf:/etc/nginx/sites-enabled/default
server {

        ...

        location / {
                # 変数の初期値に、真の値を設定しておく
                set $spring_xd_json 1;

                # Accept ヘッダに "application/json" が含まれない場合、
                # 偽の値で上書き
                if ($http_accept !~* application/json) {
                        set $spring_xd_json 0;
                }

                # Referer ヘッダが "/spring-xd/admin-ui/" で終わらない場合、
                # 偽の値で上書き
                if ($http_referer !~* /spring-xd/admin-ui/$) {
                        set $spring_xd_json 0;
                }

                # Accept ヘッダに "application/json" が含まれ、
                # かつ、Referer ヘッダが "/spring-xd/admin-ui/" で終わる場合、
                # 真の値のまま
                if ($spring_xd_json = 1) {
                        proxy_pass http://localhost:9393$request_uri;
                }
        }
}
```

記述例は Spring XD 向けのもの。

見ればわかるとおり、はじめに最終評価用の変数を用意しておき、初期値に最終的な `if` に入るための値を設定しておく。
その後 必要な分だけ、**否定条件を設定した `if`** を記述し、いずれかに引っかかってしまったら、最終的な `if` には入らない値で上書きされる、というもの。

文字列連結で、論理 AND を実現するよりも、幾分かきれいなものにできた。
CrystalでCバインディングを試してみる（構造体と共用体）

CrystalだとCバインディングによってC言語の機能が使えます。
構造体型や共用体も使えたりします。

Union（共用体）について

http://nanoappli.com/blog/archives/3846

構造体は身も蓋もない言い方をすると、C++のクラスからメソッド機能を取り払い、デフォルトのアクセサをpublicにしたもの、くらいの認識です。（最近の仕様で変わってるかもしれませんが）

Crystalで構造体と共用体を使用したい場合、以下のドキュメントに従うと
http://ja.crystal-lang.org/docs/syntax_and_semantics/c_bindings/union.html

こんな感じになります。

```crystal

# char型配列にデータを代入するため
lib C
  fun strcpy(s : LibC::Char*, a : LibC::Char*)
end

lib U
  # C では:
  #
  #  union Staff {
  #    int id;
  #    char name[4];
  #  };
  union Staff
    id : Int32
    name : LibC::Char[4]
  end
end

staff = U::Staff.new
staff.id = 65535
puts staff.name #=> [255,255,0,0]

# 以下は構造体との動作比較
lib C
  struct Staff
    id : Int32
    name : LibC::Char[4]
  end
end

staff_ = C::Staff.new
staff_.id = 65535
puts staff_.name #=> [0,0,0,0]
```

当然ですが、構造体だとメンバ同士はメモリは独立していますが、共用体だとアドレスを共有していることが分かります。
（どういう共用になるかはエンディアン次第）
CompassのSpriteが進化していた


Compassの最新バージョンのドキュメントを見ていたら、[Sprite機能](http://compass-style.org/help/tutorials/spriting/)が知らない間に進化していた。(元々あったのかもしれない)

## 全自動の例 (Basic Usage)

Compassのconfigで指定した画像フォルダに、

```
icons
├ icon-facebook.png
├ icon-twitter.png
└ icon-github.png
```

という風に画像が入っていたとして、


```html
<i class="icons-icon-facebook"></i>
<i class="icons-icon-twitter"></i>
<i class="icons-icon-github"></i>
```

```scss
@import "compass/utilities/sprites";
@import "icons/*.png";

@include all-icons-sprites;

.icons-sprite {
    display: inline-block;
    height: 48px;
    width: 48px;
}
```

sccss中の `icons` という部分が画像を入れたフォルダ名と連動します。

書き出されたCSSを見ると、最低限 `background-image` と `background-position` が定義されるだけなので、 `display`, `width`, `height` は自分で定義する。


## 自分で記述したい場合の例 (Selector Control)

あまりにも全自動で気持ち悪い場合は、
`@include all-#{ディレクトリ名}-sprites;` をやめて、

```html
<i class="icons-sprite icon-facebook"></i>
<i class="icons-sprite icon-twitter"></i>
<i class="icons-sprite icon-github"></i>
```

```scss
$icon-names: ( 'icon-facebook'
               'icon-twitter'
               'icon-github'
               );

.icons-sprite {
    display: inline-block;

    @each $icon-name in $icon-names {
        &.#{ $icon-name } {
            @include icons-sprite($icon-name);
            height: icons-sprite-height($icon-name);
            width: icons-sprite-width($icon-name);
        }
    }
}
```

としても良い。
こちらも `icons` という部分は画像を入れたフォルダ名と連動します。

`@include all-#{ディレクトリ名}-sprites;` 
を使用する場合、
`.#{ディレクトリ名}-sprite` 
に対して記述した内容は、
`.#{ディレクトリ名}-#{スプライト名}-sprite` 
すべてに対しても勝手に複製されるようなので、気がつかないうちにCSSが肥大化しように注意。

## Magic Selectors

aタグのhoverなどステートに対して、画像ファイルの命名規則と連動して、勝手にCSSを定義する機能もあるようです。上で発生した

> `.#{ディレクトリ名}-sprite` 
に対して記述した内容は、
`.#{ディレクトリ名}-#{スプライト名}-sprite` 
すべてに対しても勝手に複製されるようなので、気がつかないうちにCSSが肥大化しように注意。

も、この機能によるものと思われます。

[Sprite Magic Selectors | Compass Documentation](http://compass-style.org/help/tutorials/spriting/magic-selectors/)

できるだけ自分でコントロールしたい場合、
`@include all-#{ディレクトリ名}-sprites;` 
は使わないほうがシンプルになりそう。



## 参考

公式ドキュメント
[Spriting with Compass | Compass Documentation](http://compass-style.org/help/tutorials/spriting/)

スプライト画像の素材管理・自動書き出しについては、
[スプライト画像とSVGを効率良く書き出し・コーディングするための考察 [書き出し編]](http://qiita.com/soheikitada/items/1ef46137ce4e7fc298fb)
でまとめ中です。

## さいごに

実用を考えると、[Retinaディスプレイを想定した分岐](http://qiita.com/soheikitada/items/bc71997c6f1be6ba9b4d)などを加えていくので、もう少し複雑になります。

----

**[2015/12/5追記]**
色々考えると、Retina対応をするとけっこう複雑で、(おもにbackground-sizeの取り扱い)
[Using Compass Generated Sprite Sheets in Responsive Sass, by Jayson Jacobs.](http://www.hugeinc.com/ideas/perspective/using-compass-generated-sprite-sheets-in-responsive-sass) 
がベストアンサーな気がします。

（継続リサーチ中）
タブ区切りテキスト(TSV)を様々なデータ形式に変換するWEBサービスとライブラリ




ExcelやGoogle スプレッドシートからピピっとコピーしてできたようなタブ区切りテキスト（TSV）をささっと別のデータに変換できるようなサービスがほしかったので、以下のサービスをつくりました。

[Tsvert](https://tsvert.s3.ap-northeast-1.amazonaws.com/index.html)


TSVを別のデータ形式に変換する機能については、汎用的に使えそうなのでJavaScriptライブラリとしてきりだして、npmに公開しています。   

[high5/tsvert](https://github.com/high5/tsvert) 
[high5/tsvertのドキュメント](https://github.com/high5/tsvert/tree/master/translations/japanese) 


類似の機能を提供したサービスは探せばいろいろあったりするのですが、今回、公開したサービスでは, 変換できる形式のデータがいろいろあったり(JSON, SQLのinsert文, PHP, Ruby, Python)、オプションがいろいろあったりするなどの特徴があります。


例えば、次のようなデータを、

```TSV
id	name	type	price
1001	egg	food	200
1002	hook	dvd	999
1003	hammer	tool	300
1004	すし	食べ物	900
```

次のように変換します。 

```JSON
[
  {
    "id"   : 1001,
    "name" : "egg",
    "type" : "food",
    "price": 200
  },
  {
    "id"   : 1002,
    "name" : "hook",
    "type" : "dvd",
    "price": 999
  },
  {
    "id"   : 1003,
    "name" : "hammer",
    "type" : "tool",
    "price": 300
  },
  {
    "id"   : 1004,
    "name" : "すし",
    "type" : "食べ物",
    "price": 900
  }
];
```

TSVのヘッダー行が各行のkeyになります。
[サービス](https://tsvert.s3.ap-northeast-1.amazonaws.com/index.html)、[ライブラリ](https://github.com/high5/tsvert)のほうにより詳しい使用法がかかれています。
slackに登録した custom emoji を取得する

#はじめに
アドベントカレンダー公開に間に合ってなくてごめんなさい！

あるTeamで使っているcustom emojiを別のTeamに移行する場合などで

 - カスタム絵文字画像の取得
 - 再登録

これらが面倒なのに、slackのヘルプには、明確にどうするか記述がなく調べてみました。

#カスタム絵文字を登録する

こちらを参考に
https://get.slack.help/hc/en-us/articles/206870177-Creating-custom-emoji

<img width="400" alt="スクリーンショット 2015-12-06 2.23.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/57aa7d3b-8c11-ee09-5562-c2288ab07af8.png">


#カスタム絵文字の取得
##API:emoji.list

https://api.slack.com/methods/emoji.list

<img width="1039" alt="スクリーンショット 2015-12-06 1.56.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/c3c9f506-853a-6681-5319-682941c19648.png">

Testerを使うと取得するJsonのイメージがつきます。

<img width="500" alt="スクリーンショット 2015-12-06 1.59.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/bdf50736-bdfd-306a-b641-7a6bbf50509e.png">


##実行
用意しようとした機能をすでに実装されていた方がいたのでごちらを利用させていただきます
https://github.com/jkloo/slack-emojis

`requests`を利用しているのでインストールが必要な場合は下記を参考に

http://requests-docs-ja.readthedocs.org/en/latest/user/install/
<img width="400" alt="スクリーンショット 2015-12-06 2.08.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/f17834b6-0159-b347-f0a3-d1ed7dd59ace.png">


> $ sudo pip install requests

設定するオプションから

>$ python get_emojis.py 
usage: get_emojis.py [-h] [-o OUTPUT] [--trample] slack token
get_emojis.py: error: too few arguments

次のように設定します。

>$ python get_emojis.py `teamのサブドメイン` `token` -o `ダウンロードフォルダ`

#カスタム絵文字の登録
できれば一括登録したいのですが。

## API:みあたらない

## 実行
ポチポチ再登録？それはちょっと・・・

#さいごに
移行手段としての一括登録も用意したかったんですが間に合わず。
ブラウザからの登録時にリクエストを覗けば作れそうな・・・、公式APIで間に合うのが一番いいのですが
1年くらい前に作られた機能で現時点でこれだと、望み薄かも？

LINEスタンプみたいにキャラコラボで使えるようになると楽しそう。
中心極限定理で標本平均が正規分布に従う分布と従わない分布

[Julia Advent Calendar](http://qiita.com/advent-calendar/2015/julialang) 5日目の記事です。

中心極限定理によると、どのような母分布であっても標本数が十分大きければ、その標本平均は正規分布に従うのだそうです。
しかし、母分布の分散が有限ではない場合、標本平均はけっして正規分布には従わないようです。

どのような分布の場合に、どのくらいの数の標本を揃えれば標本平均が正規分布に従うのか Julia を使って調べてみましょう。

# 標本分布が正規分布に従うかどうかを Julia で調べる方法

標本分布が正規分布に従っているかどうかは、Kolmogorov-Smirnov 検定や Anderson-Darling 検定などの分布の比較を行う検定によって調べられます。正規分布との比較をする場合は Kolmogorov-Smirnov 検定よりも Anderson-Darling 検定の方が良いようです。

Julia には [HypothesisTests.jl](https://github.com/JuliaStats/HypothesisTests.jl) という仮説検定ライブラリがあります。[3日前に Anderson-Darling 検定が実装されています](https://github.com/JuliaStats/HypothesisTests.jl/pull/41)が、私が悪いのか実装が悪いのか分かりませんが上手く動いてないようなので、本記事では `ExactOneSampleKSTest` 関数による Kolmogorol-Smirnov 検定を使用します。

この関数は、帰無仮説 `h_0` として「与えられた数値配列が与えられた分布から生成されている」を設定します。本記事の用途としては、`xs` が検証したい標本であるとして以下の関数呼出の結果を見れば良いことになります。

```jl
ExactOneSampleKSTest(xs, Normal(mean(xs), std(xs)))
```

ここで、`Normal` は Distributions.jl ライブラリが提供する正規分布です。

# 関数定義

与えられた分布に従う乱数を指定された数だけ生成し、その標本平均が正規分布に従っているかどうかを検定し、その結果を表示する関数を以下のように定義します。

```jl
function testnormal(dist, n)
  means = [mean(rand(dist, n)) for i in 1:10000]
  print(ExactOneSampleKSTest(means, Normal(mean(means), std(means))))
  return means
end
```

試しに5つの正規乱数の平均が正規分布に従うかどうか確認してみましょう。

```
julia> testnormal(Normal(), 5)
Exact one sample Kolmogorov-Smirnov test
----------------------------------------
Population details:
    parameter of interest:   Supremum of CDF differences
    value under h_0:         0.0
    point estimate:          0.008045225323243144

Test summary:
    outcome with 95% confidence: fail to reject h_0
    two-sided p-value:           0.5341160627316476 (not significant)

Details:
    number of observations:   10000
```

`outcome with 95% confidence: fail to reject h_0` つまり帰無仮説を棄却できなかったということなので、5つの正規乱数の平均は正規分布に従うことが分かりました。まぁ、当たり前ですね。

# さまざまな分布のさまざまなサイズの標本について調べてみる

`testnormal` 関数を使って、さまざまな分布についてさまざまなサイズの標本の平均が正規分布に従うかどうか調べてみました。その結果は以下のノートブックをご覧ください。

https://github.com/mrkn/JuliaStatsExamples/blob/master/CentralLimitTheorem.ipynb

分布の種類ごとに結果をまとめたものが次の表です。

| 分布 | 標本平均が正規分布に従うことが確認できた最小標本数 |
| --- | --- |
| 正規分布 | 5 |
| 二項分布 | 2000 (だが、正規分布にならない場合もある) |
| 指数分布 | 1000 |
| Poisson 分布 | 2000 |
| 対数正規分布 | 5000 |
| 幾何分布 | 1000 (だが、正規分布にならない場合もある) |
| Pareto 分布 | N/A |
| Rayleigh 分布 | 100 |

標本平均が正規分布に従う標本サイズが分布によって異なっていることが分かると思います。

また、Pareto 分布は N=10000 で試しても p-value は 0.0 でした。パラメータ $\alpha$ が 1.0 の Pareto 分布は分散が無限大になるため、この結果は中心極限定理の帰結と整合しています。

# まとめ

本記事では、[Julia Advent Calendar](http://qiita.com/advent-calendar/2015/julialang) 5日目として、Julia を用いて中心極限定理の内容を実験により確認しました。その結果、分布によって標本平均が正規分布に従う標本数が異なっていることが確認できました。
[python] リストの要素の削除

# メモ：list().removeとdelの違い

リストの関数であるremoveは先頭から見てはじめに一致した要素の削除。
delは、引数で受けっとったオブジェクトの削除
リストの関数popを使うと、delと同じようなことができますが、こちらは要素のインデックスを指定します。
#
```test.
>>>a = [1,2,3,4,5,1]
>>>a.remove(a[5])
>>>a
[2,3,4,5,1]
>>>a = [1,2,3,4,5,1]
>>>del(a[5])
>>>a
[1,2,3,4,5]
>>>a = [1,2,3,4,5,1]
>>>a.pop(5)
1
>>>a
[1,2,3,4,5]
```

#まとめ
基本的にdelかpopを使ったほうが間違いが起きにくい
マイグレーションを行うmigratusを紹介

# はじめに
すいません、完全に言い訳ですが仕事忙しくて....アドベントカレンダー遅れちゃいました・・orz
ほんと、すいません。

# DBのマイグレーションを行う[migratus](https://github.com/yogthos/migratus)
今回はデータベースのマイグレーションを行うためのClojureのライブラリ、migratusを紹介します。

自分は普段はRailsを使って開発する機会が多く、Railsでのマイグレーションと似たことをClojureでも行えるようにしたいと思って、このライブラリを使っています。

# 導入

## インストール
まず[migratus](https://github.com/yogthos/migratus)とleinのmigratusプラグイン[lein-migratus](https://github.com/yogthos/migratus-lein)をproject.cljに記述してインストールします。
ちなみにDBにmysqlを使うため、java.jdbcとmysql-connector-javaも一緒にインストールします。

```clj:project.clj
(defproject migratus-test "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.7.0"]
                 [migratus "0.8.7"]
　               [org.clojure/java.jdbc "0.3.7"]
                 [mysql/mysql-connector-java "5.1.36"]]
  :plugins [migratus-lein "0.1.7"])
                 

```

```
$ lein deps
```

# 接続情報を記述する
DBにマイグレーションをかけるのでもちろん接続情報を伝える必要があります。
接続情報は以下のようにproject.cljの``:migratus:``ブロックに記述していきます。

```project.clj
:migratus {:store :database
            :migration-dir "migrations"
            :db {:classname "com.mysql.jdbc.Driver"
                 :subprotocol "mysql"
                 :subname "//localhost/workspace"
                 :user "admin"
                 :password "hogehoge"}
```

``:migration-dir``で上記のように"migrations"と指定すると、マイグレーションファイルがresources/migrations/以下にあると指定している意味になります。


# マイグレーションの書き方
migratusで記述するマイグレーションの内容はRailｓのようのDSLではなく、純粋なSQLを書きます。マイグレーションを適応するときに、ロールバックするときそれぞれで実行するSQLを記述します。シンプルですね！

## マイグレーションファイルを作る
マイグレーションファイルは命名規則に従ったファイル名をつけなければいけないのですが、lein-migratusプラグインを使って作ると勝手に命名規則にあったファイルを作ってくれるのでまずそれを利用してファイルを作ります。

```
$ lein migratus create users
creating migration files for users
$ ls resources/migrations                                                                                   
20151206003056-users.down.sql 20151206003056-users.up.sql
``` 

## migrationを書く
上記のようにlein-migratusプラグインでファイルを作成するとファイル名にupがついたファイルとdownがついたファイルがあります。

これはupがマイグレーションをすすめるとき、downが戻るときに実行するSQLを記述します。
以下に適当な例を載せておきます。

```sql:20151206003056-users.up.sql
CREATE TABLE IF NOT EXISTS users(
       `id` int(11) NOT NULL AUTO_INCREMENT,
       `account_name` varchar(255) NOT NULL,
       `password` varchar(255) NOT NULL,
       `email` varchar(255) NOT NULL,
       `created_at` datetime NOT NULL,
       `updated_at` datetime NOT NULL,
       PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--;;
ALTER TABLE users ADD INDEX user_email_idx(email);
```

```sql:20151206003056-users.down.sql
ALTER TABLE users DROP INDEX user_email_idx;
--;;
DROP TABLE users;

```

上記のように一回のマイグレーションで複数のSQLを実行する場合は``--;;``で区切ると上から順に実行されます。

## migrationを実行する

マイグレーションを前に進めるには以下のコマンドを実行します。

```
$ lein migratus migrate
```

マイグレーションを元に戻す場合は、以下のコマンドです

```
$ lein migratus rollback
```

簡単ですね！！
rubyを使っているときはDSLが定義されたライブラリ使うのが当たり前だったんですが、DBに関わることはSQLを直接書く方がわかりやすいですし覚えることが少ないので、こういうシンプルなツールはいいです^^
Anaconda3を入れた後，python2.7を使いたくなった時の環境構築法

virtualenvを使う必要もなく
$ conda create -n py27 python=2.7 anaconda
とすれば，{Anaconda3のパス}/env/py27 が作成される．

python2.7を使いたくなったら下記コマンド．

windowsでは
$ activate py27

python3に戻すときは下記コマンド．
$ deactivate

以上，非常に簡単.　Anaconda素晴らしい．

【追記】 macでは
python2.7を使うときは，　（anaconda3-2.5.0の場合）
$ source ~/.pyenv/versions/anaconda3-2.5.0/bin/activate py27
python3に戻すときは
$ source ~/.pyenv/versions/anaconda3-2.5.0/bin/deactivate

上記は長いので，　~/.bashrc　などに下記を追記しておくと便利
alias py2='source ~/.pyenv/versions/anaconda3-2.5.0/bin/activate py27'
alias py3='source ~/.pyenv/versions/anaconda3-2.5.0/bin/deactivate'

すると
$ py2
や
$ py3
でpythonのバージョンの切り替えができる．

### 参考URL
- http://stackoverflow.com/questions/26377742/how-do-i-get-anaconda3-to-see-python-2-7-after-installing-it
evalとsendを使ってみたら、コードがスッキリした話

仕事している時にevalとsendを教えてもらい、使ってみたらおお！って感動したので、書いてみようと思います。

## 使うまでに至った経緯
evalとかsendはメタプログラミングの一種のようです。
似たような処理をする時に共通化できるだけ共通化しようと思い、使いました。

evalは文字列をRubyのコードとしてみてくれます。
今回やりたかったのは、似たような名前のscopeを呼び出すときにまとめたかったのが始まり。

## こんな感じで書いた

こんな感じで使ってみました。

```
class Mail
  belongs_to :user

  scope mail_a, -> {where(a: true)}
  scope mail_b, -> {where(b: true)}
  scope mail_c, -> {where(c: true)}
end
```

```
class User
  has_one :mail

  def subscribe_mail_a?
    mail.mail_a
  end

  def subscribe_mail_b?
    mail.mail_b
  end

  def subscribe_mail_c?
    mail.mail_c
  end
end
```

というのをevalでやると、

```
class User
  has_one :mail

  def subscribe_mail?(name)
    eval("mail.mail_#{name}")
  end
end
```
と書くことができます。とってもスッキリしました！



そして似たようなメソッドとして、sendというのもあり、これを使うと

```
class User
  has_one :mail

  def subscribe_mail?(name)
    mail.send("mail_#{name}")
  end
end
```

という感じで書けるようです。引数を渡したい時は、
 ``` send("メソッド名",  "引数") ```と書くようです。


## 2つのメソッドの違い
何が違うのか、どっちを使った方がいいのかまで調べるつもりだったけど、まだよくわからないので、追記します。。。
websocket-railsでコネクションが張れない

# 動かない

websocketをいい感じにrailsで扱えるようにしてくれる、websocket-rails。

```rb:Gemfile
gem 'websocket-rails'
```

して、bundle installして云々。
導入記事を参考に写経してみたけれど、まったくうんともすんとも言わない。

logを見ると、

```text:log/websocket_rails.log
I [2015-11-29 15:29:35.322] [ConnectionManager] Connection opened: #<Connection::93f2bb052bac280682f9>
I [2015-11-29 15:29:46.407] [ConnectionManager] Connection closed: #<Connection::93f2bb052bac280682f9>
```
こんな調子で、establishedになる前に、タイムアウトしてコネクションが張れてない。
ブラウザ側は、 `ws://192.168.xx.xx:3000/websocket への接続に失敗しました。` とか言ってくる。

# 試したこと

* iptables OFFにしてみた。 -> 元からOFFだった
* VMWareの中のサーバーだったので、VMWareの中から繋いで試してみた。 -> だめっぽい
* webrickはwebsocketに対応してないかも？ と思いthinにしてみた。 -> 変わらない
* standaloneモードで起動してみる。 -> やはり繋がらない。
* サンプル(https://github.com/84yeti/websocketTest)をcloneしてきて試した。 -> 動いたぞ！

なんで手元のプロジェクトでは動かないのか...ひたすらdiffを試す作業。

# 原因

原因は、faye-websocketの仕様変更のようだ。faye-websocket v0.10.0までなら動く。
まじかよ...

# 対処

よって

```rb:Gemfile
gem 'websocket-rails'
gem 'faye-websocket', '0.10.0'
```

# たわごと

ライブラリ書くときは、ちゃんと依存バージョン書こうね！！！
ヌーラボ Backlogの管理についての考察

##はじめに
筆者は、ソフトウエア開発会社で、Backlogの管理を行っています。
Backlogは、非常にユーザーフレンドリーな作りをしているので、それほどITスキルが無くても運営できて楽ですよね。
しかしながら数年間使ってみて分かったのですが、管理者にとってBacklogは必ずしも痒いところに手が届くシステムではありません。
特に筆者の務める会社のように、年間かなりの数のプロジェクト（短期間のプロジェクトが多い）を管理する必要のある業態だと辛いものがあります。

##こんな所に困った
###ユーザーの管理
ユーザーが、どのプロジェクトに属しているのかは、プロジェクトのチームメンバーから知るしかありません。
つまり、どのプロジェクトにも属していない不要ユーザーを探すのは非常に面倒な操作が必要となります。
###プロジェクトの管理
プロジェクト自身に完了という概念はありません。
唯一あるのは、アーカイブという機能で、プロジェクト一覧から見えなくなるという機能です。
二度と利用しないであろうデータであっても容量を専有し続けることになります。

##Backlogが推奨するユーザーの管理とは
Backlogは、プロジェクト数課金では無く、容量課金となります。
そこは弊社のように、プロジェクト数がやたらと多い会社のニーズとマッチしています。
ただし、Backlogのビジネスモデルは、どんどんと過去データを積み上げさせて、契約プランを上位のものへ変えさせていくことを前提としているように見えます。
そのため、不要プロジェクトを簡単に整理できるような機能は、意図的に避けられているような気がします。
ユーザー一覧をファイルへ落とす要望が挙がっていても「なんで、そんな機能必要なの？」という旨の返事がされていたり。。。
まあ商売ですから仕方の無い部分もあるのでしょう。

##最終的に落ち着いた管理方法
筆者は最終的に、Webのみを使っての管理をあきらめました。
Backlogには、[Backlog API](http://developer.nulab-inc.com/ja/docs/backlog)が用意されていますので、機械的に情報をスクリーニングすることにしました。
色々とネットを検索してみたのですが、既存ツールなどは見つけることはできませんでしたので、仕方なくC#のライブラリを利用して自分でプログラムを書くことにした感じです。（他の人は、どんな管理をしているのだろう？）
[mtaniuchiさんが、Githubで公開されているCSJSONBacklogライブラリ](https://github.com/mtaniuchi/CSJSONBacklog)を利用させて頂き、フォークしたコードを[Github](https://github.com/takanemu/CSJSONBacklog/tree/GetGroupList)へ置きました。
「グループ一覧取得」と「プロジェクトの最近の活動の取得」機能は、未実装なようでしたので、私の方で追加しました。
コマンドラインプログラムで十分ですので、標準出力へ下記の情報を出力するようにしました。

- プロジェクトへ属していないユーザーの一覧
- ユーザーの居ないグループの一覧
- プロジェクトの最近の活動が、過去一ヶ月間無いプロジェクトの一覧
- プロジェクトの最近の活動が、過去一年間無いプロジェクトの一覧

プロジェクトの完了（厳密には１年の瑕疵担保期間の完了）にて、プロジェクトを削除すれば、芋づる式にユーザーとグループを削除することが出来るようになりました。
過去一ヶ月の活動が無いプロジェクトは、アーカイブ化します。
保守プロジェクトや社内プロジェクトなどもあるため機械的に、プロジェクトを削除する訳にはいきませんが、管理はだいぶ楽になりそうです。

##追記
[ヌーラボBacklog管理用アプリケーションを作ってみた。](http://qiita.com/takanemu/items/06935f9f88bd05b3f239)にて、WPFアプリケーションを作成しましたので、外部ツールを使って管理を検討されている方は参考にしてください。
elixirで数学関数をつかってみた

# はじめに
Elixirを触り数学関数を使ってみようとした時にすこしだけつまずいたので短いけどまとめる


# Elixirの数学モジュール
elixirで実行できる数学関数
以下のサイトを参考にして使いそうなものだけ実行してみる
[Elixir v1.2.0](http://elixir-lang.org/docs/master/elixir/Enum.html#min_by/2)

```lang:絶対値
iex(1)> abs -1
1
iex(2)> abs 1
1
```

```lang:整数の除算
iex(1)> div 4, 2
2
iex(2)> div 4, 3
1
```

```lang:最大値と最小値
# min
iex(1)> min 6, 2
2
# 少数の比較
iex(21)> min 0.111, 0.2256
0.111

# max
iex(2)> max 6, 2
6
# 少数の比較
iex(2)> max 0.111, 0.2256
0.2256

# 最小値と最大値
iex(3)> Enum.min_max([2, 3, 1])
{1, 3}
```

``` leng:四捨五入
iex(1)> round 5.11241
5
iex(2)> round 5.71241 
6
```

# Erlangのモジュールについて
数学関数がElixirで見つけられない場合はErlangのモジュールを使用する
以下のサイトから簡単なものだけ実行してみる
[Erlang--math](http://www.erlang.org/doc/man/math.html)

``` reng:π
iex(1)> :math.pi()
3.141592653589793
```

``` reng:三角関数
# sin
ex(1)> :math.sin(0.5)
0.479425538604203

# cos
iex(2)> :math.cos(0.5)
0.8775825618903728

# tan
iex(3)> :math.tan(0.5)
0.5463024898437905
```

# まとめ
+ ElixirでErlangのモジュールが使用できるので、ない場合はそちらを利用できるので便利





# 参考文献
> https://medium.com/@amuino/notes-on-elixir-math-a43e23e5068a#.wp3gjybqc
> http://www.erlang.org/doc/man/math.html
> http://elixir-lang.org/docs/master/elixir/Enum.html
Sequelizeで論理削除とUNIQUE制約の両立

## はじめに

近年、テーブル設計で論理削除を採用することが増えているのではと思っています。
それは、以下の様な事情が増えていると思うからです。

- Web APIのクライアントとしてネイティブアプリ・ハイブリッドアプリを開発している
- クライアント側のデータ更新は、基本的にサーバから取得したデータを元に行っている（サーバが正、クライアントが副 ）
- そのうちの「削除」についても、サーバから取得したデータの削除フラグを元に行っている

こういう事情のもとでは、サーバ側のDBで論理削除を採用するのが一般的なのかなと思います。

## 論理削除とUNIQUE制約について

※ 以下はMySQLでの経験を元にした話で、他のDBでは当てはまらない話があるかも知れません

論理削除のためのテーブル設計でよく
「emailカラムにUNIQUE制約かけたいが、削除されたユーザに関しては無視したい。削除されているのなら、同じemailのユーザをもう一度作れるべき」
という問題に遭遇すると思います。

解決方法は色々あるようですが、最近僕が使っているSequelizeというNode.js用のORMは論理削除のサポートがあり、DATETIME型のdeletedAtというカラムが使われます。
BOOLEANで非削除・削除を表すのではなく、 削除するときに削除日時を入れるわけです。
これなら、emailとdeletedAtの複合UNIQUEキーを付けてあげれば解決ですね。

- deletedAtが空（「空」については後述）で同じemailのユーザを複数作れないように、UNIQUE制約が効いてくれる
- deletedAtは削除する度に値が違うので、同じemailのユーザを複数回削除してもUNIQUE制約的に問題無い

**しかし！これには注意点があります。** 
deletedAtのデフォルト値（非削除状態を表す値）をNULLに設定してはいけません。
僕はこれでハマりました。
NULLは「値」というより「値が無い状態」という扱いのため、UNIQUE制約に縛られないのです。
emailとdeletedAtの複合UNIQUEキーがあり、deletedAtのデフォルトがNULLだと、emailが`1@example.com`でdeletedAtが `NULL`なレコードはガンガン作れてしまいます。。

なので、deletedAtのデフォルトには何か特定の日時を設定します。`1970-01-01 00:00:00` (UNIXエポック) が分かりやすくて良いと思います。

## やっとSequelizeの話

まさに先日これでハマったわけですが、Sequelize絡みでさらに困った展開となって行きました。
Sequelizeの論理削除サポートでは、「非削除の場合deletedAtはNULL」が前提となっていたのです。
deletedAtのデフォルトをNULL以外に変えても、SELECTクエリでは相変わらず`deletedAt is NULL`だったのです。
そして、意を決して相談して修正してpull requestしたところ、取り込んでもらえました。
この記事を書いている時点の最新バージョンv3.14.2では、deletedAtのデフォルトにNULL以外を設定しても論理削除サポートが正常に機能します。
モデルはこんな感じで定義すればOKです：

    var User = this.sequelize.define('user', {
      email: {
        type: Sequelize.STRING,
        unique: 'compositeUniqueKey' // 複合UNIQUEキーの指定
      },
      deletedAt: {
        type: Sequelize.DATE,
        unique: 'compositeUniqueKey', // 複合UNIQUEキーの指定
        defaultValue: new Date(0) // UNIXエポック
      }
    }, {
      paranoid: true, // 論理削除サポート
    });

※ 実はv3.9.0でPRを取り込んでもらったのですが、自分のテストコードに漏れがあったため、その後のバージョンで壊されてしまい、v3.14.2でそれを直すPRを取り込んでもらっています。

## おわりに

この記事を書く前に論理削除について改めてちょっと検索してみたのですが、かなり色々な議論があり、実はかなり深いテーマなんだなと思いました。
つい最近も、論理削除がテーマの勉強会が開かれていたり。。
これを期に「SQLアンチパターン」読んでみようと思います。
Mathematicaのわかりやすいイントロダクション 〜つまずき編〜

## 式の実行

[前回のイントロダクション](http://qiita.com/butchi_y/items/a00a4da881e3677345cc)で、Mathematicaは対話型インターフェイスだとご説明しましたね。

さて、ではとても簡単な式を実行してみましょう。

```mathematica
1 + 1
```

と。はい、Enter。

…あれ、結果が出てこない？

実はEnterキーは単なる改行です。
1つのテキストエリア（「セル」と呼びます）に複数行の命令を詰め込めるので。

実行するにはShift + Enterです。

```mathematica
2
```

と出ましたね。


## 関数の実行

次の式を実行してみましょう。

```mathematica
sin (pi/2)
```

EnterではなくShift + Enterですよ！

結果は

```mathematica
(pi sin)/2
```

あれ？

実はここでは3つの間違いを犯しています。

[Wolfram|Alphaでは実行できたではないか！](http://www.wolframalpha.com/input/?i=sin%28pi%2F2%29)と憤慨する方もいるかもしれませんが、
Wolfram|Alphaはかなり緩いんです。

### 組み込み定数は大文字で始まる

円周率$\pi$を表す定数は``Pi``です。
基本的に、Mathematicaが予め用意している定数は大文字で始まります。
エイリアス（また詳しく説明しようと思います）を使うと直接$\pi$の記号を円周率として使えます。

### 組み込み関数も大文字で始まる

正弦関数$\sin$を表す関数は``Sin``です。
関数名も、組み込みのものは大文字で始まります。
よくあるプログラミング言語ではクラスと関数を区別するために大文字・小文字を使い分けていますが、そのあたりのルールが違うのがハマりポイントです。

慣習的に、自分で定義する関数や定数は小文字で始めることになってます。

#### 脱線
別にユーザー定義の定数が大文字でも怒られはしません。むしろ怒られるのを制止しつつ組み込み定数・関数の上書きもできます。

```mathematica
Pi = 3;
```

こんなことをすると

<img width="784" alt="mathematica_set_pi_3.png" src="https://qiita-image-store.s3.amazonaws.com/0/6117/3d0b8f9e-e4a5-0652-7a19-0df92d20eab4.png">

怒られますね。

でも、

```mathematica
Unprotect[Pi];
Pi = 3;
Protect[Pi];
```

こうしたら

<img width="790" alt="mathematica_unprotect.png" src="https://qiita-image-store.s3.amazonaws.com/0/6117/0b05a103-d21a-5723-89fa-87271b93731c.png">

円周率がおよそ3！ていうか確実に3！

Unprotectはいざというときに使いましょう。
（具体的には、独自の代数を作った時の演算の拡張とか、ですかね。）

### 関数の実行は"[]"

正弦関数に代入するときは

```mathematica
Sin(x)
```

ではなく

```mathematica
Sin[x]
```

です。

ほとんどのプログラミング言語では"()"ですからね。一番直感的でないかもしれません。
（僕も初心者の頃は解せませんでした。）


## 配列ではなくリスト

"[]"が関数なら、配列はどうなんだろう？？

Mathematicaでは値の羅列のことを「リスト」と呼びます。（「配列」でよくない？）
定義するときはこうです。

```mathematica
li = {5, 3, 8}
```

アクセスするときはこうです。

```mathematica
li[[2]]
```

他になかなか見たことのない記号の使い方ですね。

ちなみにこれで返ってくるのは``3``です。

## リストのインデックス

…``3``だと？``8``ではなく？
そう、リストのインデックスは0から始まるのではなく、1から始まります。

では、

```mathematica
li[[0]]
```

と入れると何が返ってくるでしょう。エラーでしょうか？

正解は

```mathematica
List
```

です。
0番目に頭部（型みたいなもの）が入っているのです。
（ちなみに頭部はHeadという関数でも取得できます。）

ちなみに、最近になって連想配列的な「Association」もサポートされたので、用途によってはこちらも積極的に使っていきましょう。

```mathematica
<|a -> x, b -> y, c -> z|>
```

こんな感じです。（これもまた独特な書き方ですね。）


## 関数の宣言

```mathematica
f[x_] := x^2 + 2 x + 1
```

ポイントは
- 関数の代入と同じく"[]"を使うこと
- 引数の後ろには"_"を付けること
- 定義は":="を使うこと

です。

覚えてしまえばなんてことないのですが、
この書き方は「パターン」と「遅延評価」という独特の世界観の上に成り立っているので、なかなか難しいものです。

遅延評価だけ先に軽く説明しておきましょう。

これは普通の代入です。
0から9999までのランダムな整数を1回代入して、毎回同じ数が呼び出されます。

```mathematica
rand1 = RandomInteger[9999];
```

<img width="280" alt="mathematica_immediately.png" src="https://qiita-image-store.s3.amazonaws.com/0/6117/1e15a68b-a69e-5165-7491-4b8ff69b5524.png">


一方、こっちが遅延評価です。

```mathematica
rand2 := RandomInteger[9999];
```

<img width="290" alt="mathematica_delay.png" src="https://qiita-image-store.s3.amazonaws.com/0/6117/df6741d7-04f2-bce5-6ef8-0cf9005e34ad.png">

呼び出す度に、``RandomInteger``が実行されるので、毎回違う値が返ってきます。
構造体サブフィールドでのソート

V7R1からは、構造体配列のサブフィールドをキーにしてソートも出来る様になっています。
世の中当り前の事が、RPGの世界では未だに出来ないこともありますが、日々進歩していると言うことでしょう。ただし第２キーは指定出来ないので、第２キー以降のソート順については不明…。

```RPG:USR403.rpgle
     H****************************************************************
     H*-------------------------------*
     H*----<<日付・著作権    >>-----*
     H*-------------------------------*
     H DATEDIT(*YMD)
     H COPYRIGHT('(C) ushiday - ')
     H*-------------------------------*
     H*----<<コンパイル条件  >>-----*
     H*-------------------------------*
     H DFTACTGRP(*NO) ACTGRP(*NEW)
     H OPTION(*NOUNREF)
     H BNDDIR('QC2LE')
     F*----<<ファイル定義   >>-----*
     FITEM      IF   E           K DISK
     D*----<<変数定義 >>-----*
     D*
     D REC           E DS                  EXTNAME(ITEM : *INPUT)
     D                                     QUALIFIED
     D                                     DIM(10)
     D*
     D COUNT           S              2S 0 INZ
     D IX              S              2S 0 INZ
     D*
     D print           PR                  EXTPROC('print')                     標準出力関数
     D    msg                      1000A   VARYING CONST
     C*-------------------------------*
     C*----<<メインルーチン  >>-----*
     C*-------------------------------*
      /FREE

           print ( '---- PROGRAM START ----')    ;
           DOW COUNT <= 9   ;
               //読取り
               COUNT += 1 ;
               CLEAR REC(COUNT)      ;
               READ ITEM REC(COUNT)  ;
               IF %EOF ;
                 COUNT -= 1 ;
                 LEAVE ;
               ENDIF ;
           ENDDO ;

           IF  COUNT = *ZERO ;
               EXSR @END  ;
           ENDIF ;

           //コードと単価をそのまま出力
           FOR IX = 1 TO COUNT  ;
               print ( '(' + %EDITC(REC(IX).CODE :'X') + ')'
                           + %EDITC(REC(IX).PRICE :'3') +'円') ;

           ENDFOR ;

           print ( '==== PRICE SORT     ====')    ;
           //単価を昇順でソート
           SORTA REC(*).PRICE  ;

           //出力
           FOR IX = 1 TO COUNT  ;
               print ( '(' + %EDITC(REC(IX).CODE :'X') + ')'
                           + %EDITC(REC(IX).PRICE :'3') +'円') ;

           ENDFOR ;

           EXSR @END  ;

           //終了
           BEGSR   @END   ;
                print ( '---- PROGRAM END   ----')    ;

               *INLR = *ON    ;
               RETURN        ;
           ENDSR         ;

      /END-FREE
     P****************************************************************
     P** < print             >: 標準出力                          **
     P****************************************************************
     P print           B                   EXPORT
     P                 E 

```

●実行結果
![2015-12-04_192407.png](https://qiita-image-store.s3.amazonaws.com/0/100029/11608429-2891-7a05-faee-e8d15a7595d9.png)
Ruby on Railsのはじめかた。

Ruby on Railsをはじめるには、[「Ruby on Railsチュートリアル」](http://railstutorial.jp/)をやる。
以上。

　
　
　
てな手抜きはしませんｗ

まあ、Ruby on Railsを時々やる立場としては、一番つらいのが「流れが早い」こと。
PHPが農業のため池とすればｍRuby on Railsはラフティングをやる谷川の急流。

一昔前に学んだり使ったりしたことが、あっという間に廃れてしまう。

邪道かもしれないけど、こんな考え方で捉えると楽かも。

１．DBの設定情報は先に設定
２．呼び出されるコントローラーを全部作る（生成する）
３．各コントローラで使用するアクションを固める
４．DBのテーブル設計は初期のうちに固める
５．Scaffoldで生成できるものは作ってしまう
６．追加のモデルを作る
７．モデルのカスタマイズする
８．モデルの相関を張る
９．コントローラのアクションの詳細を実装する
１０．viewの実装をする
１１．テストをする

こんな感じです。

所詮、Webアプリケーションという点は共通なので、

Input：フォームからの入力？APIの呼び出し？他のアクションからの転送？
Output：DBへ保存？画面へ表示？JSONで出力？次のアクションへ転送？

という処理の入口と出口を把握し、

その入口と出口の間に、どんな処理が必要か？

処理：DBからのデータ取得、DBへのデータ登録、データ加工、処理判定、分岐など

そんな流れで実装するのですが、今まで一番辛かったのが、

ModelのActiveRecordの内部が複雑化していること。
DBからデータを様々な条件で抽出するだけでも、実装する方法が沢山あるので、
どれを選ぶが、どれが正解なんかは、ソースを納品する納品先が決めるの事なので
まあ、検収を完了するまでやり直しは覚悟をしましょう。

Rubyの性というか結構自由に実装出来てしまうので、王道の実装を示して欲しいというのが
実装する側の願いです。
機械的なテストだけでは、この辺りのやり直しは避けられないです。

あと、Ruby on Railsという名の通り、根本的な実装はRubyなので、Rubyの最低限というか
初心者以上の中級者程度のRubyの実装スキルも必要です。

最後に、Google先生に実装方法を聞いても、情報が古かったり、今だと廃れてしまったライブラリを
使用していたりする情報が検索結果のTOPに上がってくるので、情報が投稿された日時、対応するバージョン、
を気をつけましょう。あと、アクセス数稼ぎの転載クソブログも混ざっているので、騙されないように！

PHPと違い、検索結果で出てくる情報の有効性が低すぎるのは、なんとかなりませんかねぇ。。。。


まあ、Ruby on Railsに専従していればこんなことは無いと思いますが、
時々携わる人は苦労しますねｗ
Android MでBLE使うにはACCESS_COARSE_LOCATIONが必要だよ

そういうことです．

![image.png (44.0 kB)](https://img.esa.io/uploads/production/attachments/2063/2015/11/16/3140/f63c175b-9c3e-4eef-bf5a-1aa158036d06.png)

BluetoothやWi-Fiのような近傍のデバイスをスキャンする系のAPIは使いようによっては位置情報特定できちゃいますもんね．

> To provide users with greater data protection, starting in this release, Android removes programmatic access to the device’s local hardware identifier for apps using the Wi-Fi and Bluetooth APIs. The `WifiInfo.getMacAddress()` and the `BluetoothAdapter.getAddress()` methods now return a constant value of `02:00:00:00:00:00`.
>
> To access the hardware identifiers of nearby external devices via Bluetooth and Wi-Fi scans, your app must now have the `ACCESS_FINE_LOCATION` or `ACCESS_COARSE_LOCATION` permissions:
> 
> * `WifiManager.getScanResults()`
> * `BluetoothDevice.ACTION_FOUND`
> * `BluetoothLeScanner.startScan()`
>
> <cite>[Access to Hardware Identifier- Android 6.0 Changes | Android Developers](http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-hardware-id)</cite>

ということで，Android M（API Level 23）以降は`ACCESS_COARSE_LOCATION`か`ACCESS_FINE_LOCATION`のpermissionが必要です．