OmniAICreator/Qiita-1.07M huggingface dataset:
NCMBとMONACAを使ってアプリ開発（パーミッションが複数ある時の動き/aclとRoleを整理/会員がグループを作れるようにする）

#今回したいこと
今回したいことは、「あるユーザーが所属しているRoleのリストがほしい」ということ。
（Roleにグルーピングした際、Role所属ユーザー一覧は取れるが、ユーザーがどのRoleに所属しているか取るのが簡単にできない。全部のRoleに該当のユーザーがいるか見るという恐ろしいことが必要そう）

そのため、Userのaclに所属ロールを登録することで、ロールリストを取れるのではないか、という考え方。ロールリストが取れた後、ロールに所属している人のオブジェクト情報を取れるか確認。これができればグルーピング機能としては調査完了。

#パーミッションって何？
![ニフティクラウドmobile_backend.jpg](https://qiita-image-store.s3.amazonaws.com/0/124604/02ef5b31-8133-fb83-84e5-d62d99ee04f1.jpeg)
この赤枠の部分。aclを編集できるのがパーミッション？

#そもそもパーミッションって複数つけられるの？
つけれました。コンソールからでもプログラムからでも。JS的には以下を参照。

[NCMBの参考ページ：アクセス権限設定](http://mb.cloud.nifty.com/doc/current/datastore/contents_monaca.html)
[メソッドとかの元となるrole.js](http://mb.cloud.nifty.com/assets/sdk_doc/javascript/jsdoc/files/lib_acl.js.html#l5)

#それで読み込みをする際にはどういう挙動なのか？
例：
ユーザーA：自分の会員権限のみ　←NCMBでのUSERでのデフォルト
ユーザーB:ロールA
ユーザーC：全体
ユーザーD：ロールAとロールB
ユーザーE：ロールAと全体

##予想
ユーザーAでNCMB.User.fetchAll()
→結果：A/C/E
ユーザーBでNCMB.User.fetchAll()
→結果：全員
ユーザーCでNCMB.User.fetchAll()
→結果C/E
ユーザーDでNCMB.User.fetchAll()
→B/C/D/E
ユーザーEでNCMB.User.fetchAll()
→B/C/D/E

##結果
自分とCとEしか見れない。（同じロールの人の情報がみれず、[全体]ロールしか取得できない）
→Roleでの絞り込みが必要なのだろうか？そしたらロール毎回書かないといけないからちょっとめんどいな。
　いったんデフォルトUser新規作成時のaclは全体にしないと全員が見れないから微妙。全員が見れるレコードにしておき、データ取得の際にaclを見るようにして、その際にrole絞りで、グルーピングでのデータ取得をする使い方なのかな？

##次の予想
ユーザーAのacl取得　NCMB.acl.get(read,userインスタンス)
→A
`
RoleAでNCMB.Role.fetchAll()
                .then(function(result){
                    result.fetchUser();
                })
                .then(function(user){
                    user情報が取得;
                })
`

ッて感じでいいのかな。
明日ソースを書いて確認してみる（未確認さーせん）

#そもそも勘違いしているかもしれない。aclとRoleってなにかを整理するのが先かも
 - Role:役、役割、任務、役目、本務
 - acl:Access control list（([NCMB/アクセス権限設定](http://mb.cloud.nifty.com/doc/current/datastore/contents_monaca.html))の記事的には「アクセス権限」となっている
 - permission:許可、許諾、認可、許し、(…が)許可

つまり、Roleは「役割」でしかなくて、aclが「アクセスに関する制御情報」をもっている。
Roleで権限を整理しようとしたのが誤っている気がしてきた。（Role別に権限を付与してあげることもできるってだけだった。）

#ということでaclを整理する
##まずはuserのみ
上記を元に、「ユーザーをキーにしてアクセス権限が付与される」のではないかと推測した。次の２パターンのうちどちらかだと思われる。
1.自分のaclに他の人の権限を付与して見れるようにする（自分→相手の発想）
2.相手が自分をaclに入ってると見れる（相手が許可するの発想）

結論「２．」だった。まあpermissionなんだから当然かと（許可をするというのが普通の感覚なのかと）。例にする。

Aユーザー：permissionは自分だけ
Bユーザー：permissionはAユーザーと自分
Cユーザー：permissionはAユーザーだけ

AユーザーでUSERをfetchAllすると、A,B,Cがとれる
BユーザーでUSERをfetchAllすると、Bだけがとれる
CユーザーでUSERをfetchAllすると、とれない
→つまり、permissionっていうのは「他のどの人からのアクセスを許可するか」ということであるみたい。
（もしかしたらふつうのコトかもしれないが自分には非常にしっくりきた難しいことでした）

##Roleはどうなる？
Roleはちょっと複雑だけど、文章にするとこんな感じ。
「レコードのaclで、パーミッションとしてRoleを付与すると、そのRoleクラスのbelongUserフィールドにふくまれるユーザーからのアクセスを許可することとなる」
Userクラスにある、「アクセスする側の人」のaclに同じRoleが必要なのかと思ってたのだが、それが大きな勘違いで自分の理解を阻害していた。結局aclは「他からのアクセス許可」でしかない。つまり私はこんな勘違いをしていた。「自分が誰にアクセスできるかを定義できるものがあるはず」と。そうではなく、あるのは「他の人からのアクセスを許可するかどうか」しかないので、それの集積で権限が決まるようだ。
ということで、roleに所属させて、かつそのroleから見れるようにaclをいじれば、そのレコードを見れるようになる。

#ということで会員がグループを作れるようにするためには
roleクラスにレコードを作りつつ、そのレコードに所属している人のaclにそのRoleからのアクセス許可として、パーミッションを付与してあげればOK。ソース的なのは明日。
スキャンしたpdfファイルにOCR処理を行い,テキスト埋め込みpdfを作成する

# はじめに

スキャナーで取り込んだ書籍や,ダウンロードしてきた論文pdf等は,内部にテキストデータが保持されていません。よって,検索などの機能を使うことができず,不便な思いをすることがありました。

そこで,[OCR(光学文字認識)](https://ja.wikipedia.org/wiki/%E5%85%89%E5%AD%A6%E6%96%87%E5%AD%97%E8%AA%8D%E8%AD%98#OCR.E3.82.BD.E3.83.95.E3.83.88.E3.82.A6.E3.82.A7.E3.82.A2)エンジンである[Tesseract](https://github.com/tesseract-ocr/tesseract)を用いて,画像から文字の抽出を行い,それらの文字データをpdfに埋め込んだ形でpdfファイルに保存する方法を調べてみました。

大まかな手順は

1. pdf から 画像形式(png or ppm)へ変換
2. 画像ファイルに対し,tesseractを用いて文字認識,抽出,文字データの埋め込まれたpdfの作成
3. 作成されたpdfファイル群を一つのpdfファイルにまとめる

です。以下では,順に説明していきます。

# 0. tesseractのインストール

と,その前に,tesseractのインストールを行います。[Wiki](https://github.com/tesseract-ocr/tesseract/wiki)にも書いてあることをそのまま書きます。詳しくはそちらを見てください。

## Linux の場合:

**apt**

```
sudo apt-get install tesseract-ocr tesseract-ocr-jpn
```

**pacman**

```
pacman -S tesseract tesseract-data-eng tesseract-data-jpn
```

**rpm**

[tesseract Download (DEB, RPM, TGZ, TXZ)](https://pkgs.org/download/tesseract)

## Mac OS X の場合:

**MacPorts**

```
sudo port install tesseract tesseract-jpn
```

**Homebrew**

```
brew install tesseract tesseract-jpn
```

## Windows の場合:

[ここ(https://github.com/tesseract-ocr/tesseract/wiki)](https://github.com/tesseract-ocr/tesseract/wiki)からインストーラをダウンロードしてインストール

日本語データは[tesseract-ocr/tessdata](https://github.com/tesseract-ocr/tessdata)から[zipダウンロード](https://github.com/tesseract-ocr/tessdata/archive/master.zip)できるので,ダウンロード,解凍して,`C:\Program Files\Tesseract OCR\tessdata`的なところにおく。

[MSYS2の場合](https://github.com/tesseract-ocr/tesseract/wiki#msys2)

[Cygwinの場合](https://github.com/tesseract-ocr/tesseract/wiki#cygwin)

# 1. pdfから画像へ変換

僕がUbuntuを使用しているので,それに従った形で進めていきます。ご了承ください。

[`pdftoppm`](http://linux.die.net/man/1/pdftoppm)コマンドを用いて,pdfをpng形式に変換します。

```
mkdir foo.d
pdftoppm -png foo.pdf foo.d/page
```

のようにすると,foo.dディレクトリ以下に,`page-nnnnnn.png`(`nnnnnn`はページ番号)のように画像ファイルが作られていきます。

ページ端に黒い線があったりする場合には,この時点で`-x`,`-y`,`-W`,`-H`オプションを指定することによって切り取っておくことをおすすめします。

# 2. 画像ファイルに対し,tesseractを用いて文字抽出,文字データの埋め込まれたpdf作成

[Wiki](https://github.com/tesseract-ocr/tesseract/wiki)にあるとおり,言語を指定したり,バージョン3.03以降であればデータが埋め込まれた状態でpdf出力することができます。

したがって,先ほどの例で言えば`foo.d`ディレクトリ以下の`page-001.png`みたいなファイルに対して,それぞれ

`tesseract page-001.png -l eng+jpn pdf`

のようにすれば,文字認識され,そのデータが埋め込まれた`page-001.pdf`が作成されます。

```
find "./foo.d" -type f -name "*.png" | sed 's/\.png$//' | xargs -P8 -n1 -I% tesseract %.png % -l eng+jpn pdf
```

のように`xargs`を使えば,`foo.d`以下のpngファイルに対し,並列処理で実行できます。


# 3. 作成されたpdfファイル群を一つのpdfファイルにまとめる

[`pdftk`](https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/)コマンドを使います。

`foo.d`ディレクトリ以下のpdfファイルを,ページ番号順にまとめて`foo-ocr.pdf`として保存したいとき,以下のようにします。

```
pdftk ./foo.d/*.pdf cat output "foo-ocr.pdf"
```

残ったpngファイルやpdfファイルが不要な場合は`foo.d`ディレクトリを削除します。

# シェルスクリプト化 (pdfocr)

以上の3つの過程をシェルスクリプトにまとめたものです。ご自由にお使いください。

>[dotfiles/pdfocr at master · ssh0/dotfiles](https://github.com/ssh0/dotfiles/blob/master/bin/pdfocr)

```
pdfocr foo.pdf
```

とすると,同じディレクトリ内に文字データが埋め込まれた`foo-ocr.pdf`というpdfファイルが作成されます。

# まとめ

スキャンしたpdfに対しても検索出来るようになり,便利になりました。ただし,tesseractが動いている間はCPU使用率がマックスになりますし,できた後のpdfは大体2倍くらいの容量になるので注意してください。また,自分でtesseract触ったことのある人なら分かるかと思いますが,まだまだ精度的な面で発展の余地があります。気休め程度に思って使ってみるのがいいと思います。
openSSL更新メモ

OpenSSLに2件の深刻な脆弱性--早急にパッチの適用を
http://japan.zdnet.com/article/35082166/

この件を受けてサーバーのopensslの更新を行いましたが
今まであんまり正しく意識して使っていなかった事が露呈した。

【手順について】

http://qiita.com/ksugawara61/items/2dc6abd50077fd4b0c87

こちらの記事を参考に1.0.1tを入れる（？）ところまではうまくいった

【各サービスの再起動】

再起動後、、、、

\#sshd -V
sshd: illegal option -- V
OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013
usage: sshd [-46DdeiqTt] [-b bits] [-C connection_spec] [-c host_cert_file]
            [-f config_file] [-g login_grace_time] [-h host_key_file]
            [-k key_gen_time] [-o option] [-p port] [-u len]

あっれ・・・
1.0.1e-fipsのままか、、、
バージョン上がってない？

\# openssl version
OpenSSL 1.0.1t  3 May 2016

あがってるよなぁ、、、
謎。。。



以下追記

結論からいうと、
よくわかんないけどパッケージとかのからみで
無理やりビルドしたものを使うのが得策とは限らない・・・
（気がしてきた）
ちょっとまだ理解しきれてないけど、とりあえず
その結論へ至るまでにたどったページのリンクを列挙


【パッケージ】Linuxの「パッケージ」と「yum」と「rpm」について勉強したのでまとめてみた。
http://qiita.com/sksmnagisa/items/05a6f8a707010b8bea56

CVE-2016-2105、CVE-2016-2106、CVE-2016-2107、CVE-2016-2108、CVE-2016-2109、CVE-2016-2176 (OpenSSL 2016 年 5 月 3 日) の解決方法
https://access.redhat.com/ja/solutions/2310151

epelレポジトリでのopensslのバージョンアップについて
https://teratail.com/questions/35877
Skypeの多重起動(特にMac(備忘))

## 警告
2017年11月18日において、少なくとも macOS においては、このやり方でデスクトップアプリの Skype を多重起動させることはできません。

## 参考元
- http://loumo.jp/wp/archive/20150822000044/
- http://onlinepckan.net/tool/skypetechnique.html
- 公式っぽいところの情報源がないのでみんなどうやって探してるのか知りたい

## やりかた例(参考元の引用)

`$ open -na /Applications/Skype.app --args -DataPath /Users/$(whoami)/Library/Application\ Support/Skype2`

- つまり -DataPath オプションで、異なる保存先を指定する
- open の -n は2つめ以降のアプリを新しく立ち上げる指定
- open の -a はアプリケーションを起動するという指定
- open の --args は、そのアプリのコマンドライン引数として、それに続く文字列を渡す
- `Application\ Support` の `\ ` は、スペースで区切らないようにしてる
- `$(whoami)` は今のユーザ名を取ってくる
vvvvでトンネル系のループ映像を作る


# こんな感じのパッチで
![patch.PNG](https://qiita-image-store.s3.amazonaws.com/0/26489/b721ff7a-81a6-d83d-b169-34eb3d4e2426.png)

# こんな感じの出力になる
![https://gyazo.com/ee67e097db1c2b2145455f9f04942897](https://i.gyazo.com/ee67e097db1c2b2145455f9f04942897.gif)

# パッチはGitHubにおいてある
[vvvv-sandbox/HexTunnel.v4p at master · clomie/vvvv-sandbox](https://github.com/clomie/vvvv-sandbox/blob/master/HexTunnel.v4p)

# B-Splineで3D空間上に曲線を描く
直線上に図形が並んでてもあんまりおもしろくないので、3D空間上に曲線を作る。
曲線はB-Splineノードで生成する。`Topology`に`Closed`を指定すると始点と終点でスムーズに値が変化するので扱いやすい。
X軸とY軸の値それぞれに対してB-Splineノードを使ってSpreadを生成しても別に問題はないけど、`Controls per Curve`ピンとかをうまく使ってあげると、1つのノードで複数パターン分のSpreadが生成できる。
![bspline.PNG](https://qiita-image-store.s3.amazonaws.com/0/26489/e6f5654a-8866-bb6d-6662-370935f7c16b.png)
![https://gyazo.com/d2ec055c4a53123fef40a6666e91dca8](https://i.gyazo.com/d2ec055c4a53123fef40a6666e91dca8.gif)

# 図形の配置と向きについて
B-Splineノードで生成した座標上に対し、一定の間隔で図形を配置する。
Z軸の値はLinearSpreadとMapを組み合わせて生成していて、LFOノードで移動させている。配置した図形の中をカメラ(視点)が移動するのではなく、カメラはほとんどXY平面上を向きを変えながら移動し、Z軸方向には図形自体が移動するようなイメージ。

Transformノードの`Rotate`ピンは、トンネル感を出すために、1つ前の図形が1つ後の図形の方向を向くように設定する。
隣り合う座標同士をPairwiseで対にして引き算すると、ある座標から次の座標へのベクトルが取得できる。ここで取得したベクトルは方向(Direction)を表すものなので、これを各XYZ軸ごとの回転量(Rotate)に変換するためにPolarノードを使う。
この部分はArrow(EX9)ノード内部のパッチがベースにしたけど、正直言って何故Polarノードを使うとうまく向きが設定できるのかは自分で納得の行く理解ができていないので、使い方が微妙に間違ってるかも。

![hex.PNG](https://qiita-image-store.s3.amazonaws.com/0/26489/fefbac39-e397-71b1-7cdf-3cc1bf1d6f86.png)
![https://gyazo.com/3014920bc76f1d9467e39bbd84aa3f5b](https://i.gyazo.com/3014920bc76f1d9467e39bbd84aa3f5b.gif)

# カメラ制御について
LookAtノードとPerspectiveノードを組み合わせて使う方法と、Cameraノードを使う方法がある。
視点についてはZ軸方向にはほとんど移動せず、XY座標と向きのみが変化する。つまり曲線を作っている座標からZ軸の値が小さい順に2つのXYZ座標を取り出す。
LookAtノードの場合はそれぞれ視点の位置、視点の向きに設定すればOK。
Camera(Transform Softimage)ノードを使う場合は、視点の向きに当たる座標を`Initial Interest`ピンへ、TransformのRotateにも設定したように起点から次点への向きをPolarノードで再計算したものをそれぞれ`Initial Yaw` / `Initial Pitch` / `Initial Distance`へ設定する。

# その他
Fogをかける。DX9の場合はFog(EX9.RenderState)ノードで簡単に設定できる。DX11の場合は自前でシェーダを書くなりする必要があるっぽい。DX11でDX9並に簡単かつ汎用的にFogかける方法ってないのかな……。
あとは、RendererのDepth Bufferを有効化する必要がある。有効化しないと図形の前後関係がうまいこと描画されない。
その他細かい設定値などは直接パッチを見てください。
Scala わからないことリスト

- this.type とシングルトンタイプ
- explicitly typed self reference
- Higher kinded type parameter
- for 内包表記(sequence comprehension) ではなぜ、"{}" が推奨されるのか
- trait A { val str: String } が new できる

### Self Type Annotation

- Dependency Injection と Cake Pattern の理解が必要みたい
- [Scalaにおける最適なDependency Injectionの方法を考察する](http://qiita.com/pab_tech/items/1c0bdbc8a61949891f1f)

DI を考えた場合、コンストラクタ引数で注入するやり方は分かる。
trait はコンストラクタ引数を定義できない。
抽象クラスではなく、trait で定義するのは多重継承できないから。
Self Type Annotation を用いなくても、mix-in で同じことはできる。依存している事が分かり易いのがメリットか？

(http://eed3si9n.com/ja/real-world-scala-dependency-injection-di)
この記事の中の、構造的部分型というのはわかる。

[Scala: Understanding the self type annotation and how it relates to the Cake Pattern](http://marcus-christie.blogspot.com/2014/03/scala-understanding-self-type.html)
[Cake Pattern in Scala / Self type annotations / Explicitly Typed Self References - explained](https://coderwall.com/p/t_rapw/cake-pattern-in-scala-self-type-annotations-explicitly-typed-self-references-explained)
(http://qiita.com/mizunowanko/items/53eed059fc044c5aa5dc)
(http://daimatz.net/text/2014/0128-cake-pattern.html)
(http://tototoshi.hatenablog.com/entry/2014/06/04/195928)
(http://okapies.hateblo.jp/entry/2013/07/15/232456)

### 関数とメソッドの違い

http://tkawachi.github.io/blog/2014/11/26/1/

### 継承における "=>"

Effective Scala[http://twitter.github.io/effectivescala] から

```scala
trait SocketFactory extends (SocketAddress => Socket)
```

Function1[SocketAddress, Socket] と同等らしい。
http://www.scala-lang.org/api/current/scala/Function1.html

```scala
trait Function1[T1, R]{
  def apply(v1: T1): R
}
```

A.apply() は A() だけど、case class やコンパニオンオブジェクトで定義すればいいのでは？

### scalatest Prop、メソッドにブロックを渡している？
- Pass code block as argument to a function
- http://alvinalexander.com/scala/passing-function-to-function-argument-anonymous

```
forAll { (n: Int, d: Int) =>
```

### 名前渡し引数

関数を引数にするのと何が違う？

```
引数: => 型
```

### 丸括弧("()") の省略

- 文脈によって異なる
- { ... } は ({ ... }) の場合が多い
- ; の省略もあるので、そこにも注意する

```
forAll { ... }
```

http://stackoverflow.com/questions/4386127/what-is-the-formal-difference-in-scala-between-braces-and-parentheses-and-when

```scala
1       // literal
(1)     // expression
{1}     // block of code
({1})   // expression with a block of code
{(1)}   // block of code with an expression
({(1)}) // you get the drift...
```


### Abstrract Class の自己参照

Programing in Scala 3rd, Section 20.10 から

```scala
abstract class AbstractCurrency {
  type Currency <: AbstractCurrency
```

abstract class を継承して、さらに abstract class を作る。
なぜ具象クラスではいけないのか？

```scala
abstract class Dollar extends AbstractCurrency {
  type Currency = Dollar
  def designation = "USD"
}
```

### 型パラメータと非変、共変、反変、上限境界、下限境界

これは自分でクラスを設計しないとわからなそう。
このあと Abstract Type もあるが、自分が使うところをイメージできない

http://techblog.reraku.co.jp/entry/2016/06/12/135411
http://takafumi-s.hatenablog.com/entry/2015/08/20/122350
http://hogepiyo.hatenablog.jp/entry/2015/05/31/225103
【Java】副作用がないことを明示するためにprivate staticメソッドを利用する

# 概要
privateなインスタンスメソッドをstatic(クラスメソッド)に変更することで、副作用が無いことを明示できるという<Strike>方法</Strike>小手先テクニックを紹介します。

# どんな場合
例えばこんな感じの汚いインスタンスメソッドがあったとすると、

```java
    private void example(List hoge) {
    	String message;
    	if (hoge == null) {
    		message = "hoge is empty";
    	} else if (hoge.size() < 3) {
    		message = "hoge is small";
    	} else {
    		message = "hoge is big!";
    	}
    	
    	// do something...
    }
```

リファクタリングでこんな風にメソッド分割をすると思います。

```java
	private void example(List hoge) {
		String message = messageFromHoge(hoge);
		
		// do something...
	}
	
	private String messageFromHoge(List hoge) {
		if (hoge == null) {
			return "hoge is empty";
		} else if (hoge.size() < 3) {
			return "hoge is small";
		} else {
			return "hoge is big!";
		}
	}
```

別にこれでもいいんですが、もしこの分割されたメソッドが実は

```java
public class Example {
	
	private String fieldA;
	
	private void example(List hoge) {
		String message = messageFromHoge(hoge);
		
		// do something...
	}
	
	private String messageFromHoge(List hoge) {
		
		fieldA = null; // Oops!!
		
		if (hoge == null) {
			return "hoge is empty";
		} else if (hoge.size() < 3) {
			return "hoge is small";
		} else {
			return "hoge is big!";
		}
	}
}
```

このように、フィールド変数に余計なことをしてしまっているかもしれません。 
考え過ぎかもしれません。でももっと複雑になっていけば、ついうっかりこんな感じのことをしてしまうかもしれません。


# staticにして回避する
ではここで、インスタンスメソッド「messageFromHoge」をクラスメソッドとして定義し直します。

```java
public class Example {
	
	private String fieldA;
	
	private void example(List hoge) {
		String message = messageFromHoge(hoge);
		
		// do something...
	}
	
	private static String messageFromHoge(List hoge) {
		
		fieldA = null; // コンパイルエラー！！！！！！！！！
		
		if (hoge == null) {
			return "hoge is empty";
		} else if (hoge.size() < 3) {
			return "hoge is small";
		} else {
			return "hoge is big!";
		}
	}
}
```

そうすると、当然ながらフィールド変数へのアクセスはできず、コンパイルエラーになってくれます。 

# 軽い解説
インスタンスメソッドはフィールド変数へ<b>アクセスできる可能性があります</b>が、クラスメソッドではそのようなことはありません。 
privateなクラスメソッドは、引数にのみ依存し、外界へ副作用をもたらすことはありません。 

つまり、privateメソッドを作成する際、フィールド変数に依存する処理はインスタンスメソッド、フィールド変数に依存しない処理をクラスメソッドとすることで、影響範囲や役割を明示することができます。
array_reduce を使い倒す

# array_reduce を使い倒す

## やりたいこと

配列の中から

- 小文字ではじまる要素を抽出して
- 先頭に "!" プレフィックスを付けたい


## array_filter + array_map

```php
function f1($array)
{
    return array_map(function ($item) {
        return '!' . $item;
    }, array_filter($array, function ($item) {
        return ctype_lower($item[0]);
    }));
}
var_dump(f1(['Aa', 'bb', 'cC', 'DD']));
/*
array(2) {
  [1] =>
  string(3) "!bb"
  [2] =>
  string(3) "!cC"
}
*/
```

array_filter + array_map で実装したものです。
おそらく真っ先に頭に浮かぶ実装だと思いますし、何も間違っていないと思います。
ただ、php の array_*** 周りの引数は順番に統一性がなく、無名関数が出てくると途端に視認性が悪くなります。
例えば私は上の関数はパッと見「map してから filter する」ようにしか見えません。まず処理部分に視線が奪われるからです。

```php
function f1_($array)
{
    return array_map(array_filter($array, function ($item) {
        return ctype_lower($item[0]);
    }, function ($item) {
        return '!' . $item;
    }));
}
```

こう書ければいいのに array_map が空気を読んでいないんです（多分可変引数のためなんだろうけど）。
まぁそもそもワンライナーで書かなきゃ済む話なんですけどね。


## array_reduce

```php
function f2($array)
{
    return array_reduce($array, function ($carry, $item) {
        if (ctype_lower($item[0])) {
            $carry[] = '!' . $item;
        }
        return $carry;
    }, []);
}
var_dump(f2(['Aa', 'bb', 'cC', 'DD']));
/*
array(2) {
  [0] =>
  string(3) "!bb"
  [1] =>
  string(3) "!cC"
}
*/
```

array_reduce で実装したものです。
array_reduce はその関数名から配列→スカラー値にする関数に感じてしまいますが、別にそんなことはなく「今までの結果が引数で渡ってくる array_walk」のように捉えることが出来ます。
filter + map が1つの関数に集約され、個人的にはとても読みやすいです。

余談ですが、array_reduce 版だとキーが死んで数値連番になります。
が、こういった処理の場合、たいてい数値連番を期待していて、後で array_values をカマしたりするのでむしろ都合がいいくらいです。

ちなみにキーが死んで困る場合は array_keys + use でこうするのが好みです。

```php
function f2_($array)
{
    return array_reduce(array_keys($array), function ($carry, $item) use ($array) {
        if (ctype_lower($array[$item][0])) {
            $carry[$item] = '!' . $array[$item];
        }
        return $carry;
    }, []);
}
var_dump(f2_(['Aa', 'bb', 'cC', 'DD']));
/*
array(2) {
  [1] =>
  string(3) "!bb"
  [2] =>
  string(3) "!cC"
}
*/
```


## foreach

```php
function f3($array)
{
    $result = [];
    foreach ($array as $key => $item) {
        if (ctype_lower($item[0])) {
            $result[$key] = '!' . $item;
        }
    }
    return $result;
}
var_dump(f3(['Aa', 'bb', 'cC', 'DD']));
/*
array(2) {
  [1] =>
  string(3) "!bb"
  [2] =>
  string(3) "!cC"
}
*/
```

foreach で実装したものです。
ぶっちゃけ一番わかりや（ｒｙ

## まとめ

個人的に `array_reduce` は結構好きな関数で、もっと使われて欲しいんですが、どうも

- 不必要な参照、use してたり
- array_sum, array_product などで十分だったり

なサンプルが多く、あんまりしっかり使われることがない印象です。
ので紹介も兼ねてこんな記事を書いてみました。

特に filter + map って相性が抜群で、非常にしばしば出てくる処理なので array_reduce で書き換えたくなったりします。

なお「文字列の1文字目を `[0]` でアクセス」してるのは単にサボってるだけです。
本題ではないのであまり突っ込まないでください。
MySQL foreign keyミスを正す

`Cannot add foreign key constraint`

が出た。
マジで情報少ない。

という時に、スべきことはこれ。

```mysql
source sample.sql; // mysqlに入って、エラー起こる時のSQLを実行する。
show errors;    // エラーを確認。たぶん、 `Cannot add foreign key constraint` っていわれるだけ
show warnings;  // こいつが超大事。なんのテーブルで何がダメか教えてくれた.
```

show warningsした結果がこれ。
`Create table 'your_db/your_table' with foreign key constraint failed. There is no index in the referenced table where the referenced columns appear as the first columns.`

no index言ってる。
foreign key貼る時に、貼られる側(1vsnの、1の方)のidにindexが貼られていなかった。

```mysql
show index from 'your_table';   // check!!
show create table 'your_table'; // check!!
create index pu_control_id_idx on pu_control(id);  // index貼る
```

無事、完了。
ElCapitan + pyenv


pyenv で zlib が無いと言われたら

```
% pyenv install 2.7.11
Downloading Python-2.7.11.tgz...
 -> https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tgz
Installing Python-2.7.11...
ERROR: The Python zlib extension was not compiled. Missing the zlib?
```

xcode-select コマンドで Developer tools をインストールします。

```
% xcode-select --install
xcode-select: note: install requested for command line developer tools
```


これでインストールできます。

```
% pyenv install 2.7.11
Downloading Python-2.7.11.tgz...
-> https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tgz
Installing Python-2.7.11...
Installed Python-2.7.11 to /usr/local/opt/pyenv/versions/2.7.11
```
【Node.js】querystring.parseでクエリ文字列のパース

クエリ文字列をオブジェクト形式に変換してくれる便利な奴。
<sub>※Nodeのバージョンは6.1です。

### 標準ライブラリ querystring

```js
// 標準ライブラリなので、パッケージインストールは不要。
const querystring = require('querystring')

console.log(querystring)
// { unescapeBuffer: [Function],
//   unescape: [Function],
//   escape: [Function],
//   encode: [Function],
//   stringify: [Function],
//   decode: [Function],
//   parse: [Function] } ← コレ
```

### キホン

```text
querystring.parse(str[, sep][, eq][, options])
```


## 使い方一覧

```js
const parse = querystring.parse
```

### シンプルパース
```js
// 文字列をオブジェクト形式に変換する。
console.log(parse("login=yes")) // { login: 'yes' }
```

### 割り当て文字指定
```js
// デフォルトでは、=を割り当て文字として認識。
console.log(parse("login>yes")) // { 'login>yes': '' } parse失敗。

// 第三引数に割り当て文字を指定できる。
console.log(parse("login>yes", null, ">")) // { login: 'yes' } parse成功。
```

### セパレータ指定
```js
// 複数対応可能。
console.log(parse("login=yes&member=no")) // { login: 'yes', member: 'no' }

// 第二引数にセパレータを指定可能。
console.log(parse("login=yes/member=no")) // { login: 'yes/member=no' } parse失敗。
console.log(parse("login=yes/member=no", "/")) // { login: 'yes', member: 'no' } parse成功。
```

### オプション指定

```js
// 第四引数はオプション。

// maxKeysで個数制限。
console.log(parse("login=yes&member=no", null, null, {maxKeys: 1})) // { login: 'yes' } 1つだけparse

// decodeURIComponentでdecode指定。
console.log(parse('%D6%D0%CE%C4=yes&メンバー=no')) // { '����': 'yes', 'メンバー': 'no' } デコード失敗
console.log(parse('%D6%D0%CE%C4=yes&メンバー=no', null, null, {decodeURIComponent: gbkDecodeURIComponent})) // { '中文': yes, foo: 'bar' }

```

公式Doc：https://nodejs.org/api/querystring.html#querystring_querystring_parse_str_sep_eq_options
rubyで3つの値が同一かを確認する方法

3つの値が同一かを確認する方法

他にいいやり方があると思いますが、自分のやり方です。

```rb
a = 1
b = 1
c = 1

[a, b, c].uniq.count == 1
```

配列にして、重複を削除してから個数を数えます。

これで**true or false**で値が返って来ます。

もっといい方法があると思うのですが、ご存知の方がいたら、教えて下さい。
(Raspbian) AK-020で3Gモデム自動接続(毎回のejectとmodprobeなし)


Soracomから販売されている、エイビット製AK-020を使ってSoracomに自動接続します。

基本的には[AK-020 を Raspbian で使う(とりあえず版)](http://qiita.com/j3tm0t0/items/08c199fb8863b69e1139)を元にしていますが、以下が異なります。

 - ejectなしでusb_modeswitchを使って自動的にモデムモードに移行
 - modprobeなしで接続時に自動的にドライバをロード

#依存パッケージのインストール

```
pi@raspberrypi:~ $ sudo apt-get install -y wvdial usb-modeswitch
```

#wvdialの設定
`/etc/wvdial.conf`と**`/etc/ppp/peers/wvdial`**を編集してください。
[参考](http://qiita.com/j3tm0t0/items/08c199fb8863b69e1139)と同じです。

#usb_modeswitchの設定

まずはudevの設定をします。
`/lib/udev/rules.d/40-usb_modeswitch.rules`にAK-020が接続されたときにusb_modeswitchが動作するように記述します。
以下を**最下行から２行目**に記述します。

```/lib/udev/rules.d/40-usb_modeswitch.rules
#ABIT AK-020
ATTRS{idVendor}=="15eb", ATTRS{idProduct}=="a403", RUN+="usb_modeswitch '%b/%k'"
```

usb_modeswitchの設定ファイルを記述します。以下のファイルを`/etc/usb_modeswitch.d/15eb:a403`に新規に作成してください。

```
DefaultVendor = 0x15eb
DefaultProduct = 0xa403
TargetVendor = 0x15eb
TargetProduct = 0x7d0e

StandardEject = 1
```
それぞれのProductIDはeject前と後の値です。
StandardEjectでモデムモードに移行していますが、usb_modeswitchの[他のデバイスの設定](http://www.draisberghof.de/usb_modeswitch/device_reference.txt)と同じように、`MessageContent`で移行したほうが良いと思います。
私はSniffUsbで解析するためのWindowsマシンがないので断念しました。


#usbserialドライバの設定

`/etc/rc.local`の適当な位置に、AK-020に対してusbserialドライバを使用する設定を書きます。

```/etc/rc.local
modprobe -v option
echo "15eb 7d0e" > /sys/bus/usb-serial/drivers/option1/new_id
```

これで、抜き差しするたびにmodprobe usbserialしなくても自動的に`/dev/ttyUSB*`として認識されます。

#デバイス名を固定する
なぜか私の環境では、初回起動時は`/dev/ttyUSB2`~`/dev/ttyUSB5`に割り振られるが、再起動後は`/dev/ttyUSB0`~`/dev/ttyUSB3`にポート番号が変わる挙動をするため、モデムとして用いるポートにシンボリックリンクを貼って常に同じ名前でアクセスできるようにします。

[Raspberry PiでUSBモデム挿入時にSORACOMへ自動接続する](http://qiita.com/gimy/items/1d49f8e08210e9c9f20a)を参考に。
ttyUSB0~ttyUSB3のうち、wvdialなどのツールではttyUSB0を使ってダイアルします。
参考元より、`sudo udevadm`で調べてみると、同じように`bNumEndpoints`と`bInterfaceNumber`で判別できそうでした。

よって、参考と同じ要領で以下のファイルを作成します。

```/etc/udev/rules.d/10-soracom.rules
ATTRS{../idVendor}=="15eb", ATTRS{../idProduct}=="7d0e", ATTRS{bNumEndpoints}=="03", ATTRS{bInterfaceNumber}=="02", SYMLINK+="modem"
```
再起動すると、`/dev/modem`が現れており、これを使って`pon`や`wvdial`でppp接続できるようになると思います。
wvdialの設定で使用するデバイスを/dev/modemに変更しておきましょう

#起動時にppp接続
wvdialを使って、起動時に自動的にppp接続してみます。
[参考元](http://qiita.com/j3tm0t0/items/08c199fb8863b69e1139)と同じように、先ほどの/etc/rc.localの中に追加した下に以下を追加しますが、私の環境では`sleep 3`でしばらく待ってからでないと、/dev/modemが見つからずエラーになるようでした。

```/etc/rc.local
echo waiting for modem device
for i in {1..30}
do
  [ -e /dev/modem ] && break
  echo -n .
  sleep 1
done
[ $i = 30 ] && ( echo modem not found ; exit 1 )

sleep 3
wvdial > /home/pi/wvdial.log 2>&1 &
```
## 補足
`sleep 3`が必要な理由は、どうやら何度か接続/切断を繰りかえすような挙動をし、`/dev/modem`があることを確認してもその次のタイミングには存在しないようになってしまうからでした。一定時間経てば安定するので、3秒待っています。
もう少し根本から治す賢い方法があると思いますが、なにが原因かわかりませんでした。



#参考ページ
[AK-020 を Raspbian で使う(とりあえず版)](http://qiita.com/j3tm0t0/items/08c199fb8863b69e1139)
[デバイス名を固定する](http://qiita.com/osada9000/items/3e6ff429ba782624def1)
Yosemiteのインストールに失敗

クリーンインストールしようかと思って昔のを探してきたら、

「アプリケーションを検証できません。ダウンロード中に破損したか不正に変更された可能性があります」

とか言って失敗

(http://applech2.com/archives/47995014.html)

を参考にして、、時刻があやしいと踏んだ。

コンソールを開いて、
```
date 0000121215
```
で過去に戻ってやり直し。

上手く動きました。、
Swift2のArray.flatmapっぽい使い方ができるRxSwift拡張の提案


ご存知のとおり、Swift2からのArray.flatmap()は、Optionalを返す関数を渡すとArrayに戻してくれて、かつnilを捨ててくれるという便利機能が実装されています。

参考: Swift 2.0の新しいflatMapが便利過ぎる
http://qiita.com/koher/items/6a95cb8edb04fb81f787


RxSwiftのObservableにも同じ使い勝手で使えるflatmapを実装することができます。
便利そうな気もしますが、わかりにくいかもしれません。


```swift

extension Observable {
    /**
    example:
    Observable<String>.of("1", "a", "3", "4")
            .flatMap { Int($0) }
            .subscribeNext { print("\($0)") }
    result:
    1
    3
    4
    */
    func flatMap<T>(selector: (E) throws -> T?) -> Observable<T> {
        return flatMap { try selector($0).map { Observable<T>.just($0) } ?? Observable<T>.empty() }
    }
}

extension Driver {
    /**
    example:
    Driver<String>.of("1", "a", "3", "4")
            .flatMap { Int($0) }
            .driveNext { print("\($0)") }
    result:
    1
    3
    4
    */
    func flatMap<T>(selector: (E) -> T?) -> Driver<T> {
        return flatMap { selector($0).map { Driver<T>.just($0) } ?? Driver<T>.empty() }
    }
}
```

# 例

たとえばこんな処理が、、、

```swift
Observable<String>.of("1", "a", "3", "4", "5", "c", "d", "8")
    .map { (v : String) -> Int? in return Int(v) }      // <- Int(String)が 失敗したときnilを返す
    .filter { (v : Int?) -> Bool in return (v != nil) } // <- 失敗した結果を捨てる
    .map { (v : Int?) -> Int in return v! }             // <- Optionalをunwrap
    .subscribeNext { print("\($0)") }
    
```

または、RxSwiftExt ( https://github.com/RxSwiftCommunity/RxSwiftExt ) をお使いの場合はこんな感じになると思いますが、、

```swift
Observable<String>.of("1", "a", "3", "4", "5", "c", "d", "8")
    .map { (v : String) -> Int? in return Int(v) }
    .unwrap ()
    .subscribeNext { print("\($0)") }

```

こんな感じで書けるようになります

```swift
Observable<String>.of("1", "a", "3", "4", "5", "c", "d", "8")
    .flatMap { (v : String) -> Int? in return Int(v) }
    .subscribeNext { print("\($0)") }
```

しかしやはり、便利そうな気もしますが、わかりにくいかもしれません。

gistはこちら
https://gist.github.com/gamako/01a3646103f065473ade766f9ad21287
MacにLaravel入れてみる

MacにLaravel入れてみたメモ。

PHPはインストール済み。

```
$ php -v
PHP 5.5.27 (cli) (built: Jul 23 2015 00:21:59) 
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies
```

## composerのインストール

```
$ curl -sS https://getcomposer.org/installer | php
```

なんか出た

```
Downloading 1.1.1...

Composer successfully installed to: /Users/you-me/composer.phar
Use it: php composer.phar
Some settings on your machine may cause stability issues with Composer.
If you encounter issues, try to change the following:

The OpenSSL library (0.9.8zc) used by PHP does not support TLSv1.2 or TLSv1.1.
If possible you should upgrade OpenSSL to version 1.0.1 or above.
```

PATHを通す。（$PATHに追加でうまくいかなかったのでとりあえずファイルをコピー）

```
$ echo $PATH
$ mv composer.phar /usr/local/bin/composer
```

結果

```
$ composer -V
Composer version 1.1.1 2016-05-17 12:25:44
```


## LaravelインストーラのDL

```
$ composer global require "laravel/installer=~1.1"
```

結果

```
$ composer global require "laravel/installer=~1.1"
Changed current directory to /Users/you-me/.composer
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing symfony/process (v3.0.6)
    Downloading: 100%         

  - Installing symfony/polyfill-mbstring (v1.1.1)
    Downloading: 100%         

  - Installing symfony/console (v3.0.6)
    Downloading: 100%         

  - Installing guzzlehttp/promises (1.1.0)
    Downloading: 100%         

  - Installing psr/http-message (1.0)
    Downloading: 100%         

  - Installing guzzlehttp/psr7 (1.3.0)
    Downloading: 100%         

  - Installing guzzlehttp/guzzle (6.2.0)
    Downloading: 100%         

  - Installing laravel/installer (v1.3.3)
    Downloading: 100%         

symfony/console suggests installing symfony/event-dispatcher ()
symfony/console suggests installing psr/log (For using the console logger)
Writing lock file
Generating autoload files
```

プロジェクトの作成

```
$ composer create-project laravel/laravel test-project --prefer-dist
```

最新版がだーーーっとDLされてきて終わり。

起動確認する。

```
$ cd test-project
$ php artisan serve
```

http://localhost:8000/　にアクセスしてLaravelのページが出たら完了。

参考）
http://readouble.com/laravel/4/2/0/ja/quick.html
http://qiita.com/edisonthk/items/17bbcf3e4ac782bdff16
Erlang/OTP 19.0 （2016年6月リリース予定）のハイライト

来月（2016年6月）に正式リリースが予定されている Erlang/OTP 19.0 について、リリース候補版（rc1）の配布が始まっています。

Erlang はスケールしやすく、分散処理や耐障害性に優れたアプリケーションを作るための動的型付けの関数型言語。OTP は17年に及ぶ実運用で鍛えぬかれた、ライブラリ、ツール、mnesia 分散データベースなどの標準アプリケーションの総称です。

## ソースコード

GitHub から、タグ `OTP-19.0-rc1` で、ソースコードを取得してください。

- https://github.com/erlang/otp/tree/OTP-19.0-rc1

kerl を使ってビルドするのが簡単でしょう。

- [kerlでGitHub版のErlangをインストールする](http://qiita.com/jj1bdx/items/4f7d7b5a53fcec32ab8d)

## ドキュメント

ドキュメントはこちらにあります。

- http://www.erlang.org/documentation/doc-8.0-rc1/doc/

## 主な新機能と改良点

19.0 の主な新機能と改良点は以下の通りです。（[Erlang/OTP 19.0-rc1 is available for testing](http://www.erlang.org/news/103) で紹介されている内容を参考にしました）

- **コンパイラ、stdlib:**
  * 新しいプリプロセッサ・マクロ `?FUNCTION_NAME`, `?FUNCTION_ARITY` が追加されました。
  * 新しいプリプロセッサ・ディレクティブ `-error(Term)` と `-warning(Term)` が追加されました。これらは、コンパイルエラーや警告を出すために使います。
- **gen_statem:** ステートマシンのビヘイビアが追加されました。
- **mnesia_ext:** mnesia に外部ストレージをプラグインするための、実験的な API が設けられました。
- **crypto:** OpenSSL の EVP インターフェイスを使用するように変更されました。これにより、全体的な性能が向上し、また、ハードウェアによるアクセラレーションが可能になりました。
- **ssh:** `gen_statem` ビヘイビアを採用し、性能が向上しました。
- **dialyzer:** map 型のサポートが、型スペックと型分析の両方で大幅に拡張されました。
- **erts:**
  * `erlang:open_port(spawn, ...)` （外部プロセスの実行）が３倍から５倍高速化されました。
  * トレーシング機能が大幅に改良されました。スケーラビリティとスピードの向上、send/receive 関連のマッチ・スペックの追加、Linux の LTTng 対応などなど。
  * dirty scheduler が改良されました。
  * メッセージキューで参照されているデータの扱いを、プロセスごとに設定できるようになりました。これらのデータをガベージコレクションの対象外にしたりできます。
  * `max_heap_size` プロセスフラグが追加されました。

## リリースノート

詳しくはリリースノートを参照してください。

- http://www.erlang.org/download/OTP-19.0-rc1.README
Kotlin で Espresso を動作させるまでのメモ

# Overview
Kotlin で [Espresso](https://developer.android.com/training/testing/ui-testing/espresso-testing.html) を動作させるまでのメモ。

```diff:gradle
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -11,6 +11,7 @@ android {
         targetSdkVersion 23
         versionCode 1
         versionName "1.0"
+        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
     }
     buildTypes {
         release {
@@ -26,6 +27,10 @@ android {
 dependencies {
     compile fileTree(include: ['*.jar'], dir: 'libs')
     testCompile 'junit:junit:4.12'
+    androidTestCompile "com.android.support:support-annotations:${android_support_version}"
+    androidTestCompile "com.android.support.test:runner:${support_test_version}"
+    androidTestCompile "com.android.support.test:rules:${support_test_version}"
+    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1'
     compile "org.jetbrains.kotlin:kotlin-stdlib:${kotlin_version}"
     compile "org.jetbrains.kotlin:kotlin-reflect:${kotlin_version}"
     compile "com.android.support:appcompat-v7:${android_support_version}"

 buildscript {
     ext.android_support_version = '23.4.0'
     ext.kotlin_version = '1.0.1-2'
     ext.stetho_version = '1.3.1'
+    ext.support_test_version = '0.4.1'
     ext.retrofit_version = '2.0.2'
     repositories {
         mavenCentral()
```

`@Rule @JvmField` としないと `@Rule 'mActivityRule' must be public` というエラーが出て動作しない。
[stackoverflow](http://stackoverflow.com/questions/29945087/kotlin-and-new-activitytestrule-the-rule-must-be-public)

```kotlin:TestClass
package com.sampo02.libsearch

import android.support.test.espresso.Espresso
import android.support.test.espresso.action.ViewActions
import android.support.test.espresso.matcher.ViewMatchers
import android.support.test.rule.ActivityTestRule
import android.support.test.runner.AndroidJUnit4
import android.test.suitebuilder.annotation.LargeTest

import com.sampo02.libsearch.activities.MapsActivity

import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
@LargeTest
class MapsActivityTest {

    @Rule @JvmField
    val mActivityRule = ActivityTestRule(MapsActivity::class.java)

    @Test
    fun onClickTest() {
        Espresso.onView(ViewMatchers.withId(R.id.search_library)).perform(ViewActions.click())
    }
}
```

これで Run したら動いた。
この記事とは関係ないけど diff のハイライトいいね！
本日のエラー（2016-05-17）


## php
```
PHP Warning:  file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 
```

php.iniの設定が宜しくなかったようで、php.iniの記述を以下に変えてあげると解消された。
ってか自分でいつものサーバー構築んときに設定変えてるなｗ
[サーバー構築](http://qiita.com/macer_fkm/items/93eba31c88a312acdbcc)

```
allow_url_fopen=on
```
[参考:Server configuration by allow_url_fopen=0 in](http://stackoverflow.com/questions/21677579/server-configuration-by-allow-url-fopen-0-in)

## javasctipt

```
hoge.split is not a function(anonymous function) 
```

動的に変わるカンマ区切りの値を`split`で分割していましたが、ある場面で値が１つしかない状態でエラー。（※区切る対象が無い状況）
でも別の`split`は値が１つしかなくても（※区切る対象が無くても）動いてるんですけどねぇ。。。

[参考:What is causing the following error: “string.split is not a function” in javascript?](http://stackoverflow.com/questions/10145946/what-is-causing-the-following-error-string-split-is-not-a-function-in-javascr)

上記URLを参考に`hoge`を取得するときに` + ''`を付けてやると動いた。

```
// 修正前
var hoge = document.location;

// 修正後
var hoge = document.location + '';
```

苦手な英語を頑張って読んでみたが...
オブジェクトのままじゃダメだよって事でおk?（汗）
【Google Maps JavaScript API v3】すべてのマーカーを地図の中に収める【LatLngBounds】


デモ：http://mo49.tokyo/qiita/20160517/bounds.html

```javascript
var locations = [
   ['東京タワー', 35.658581, 139.745433],
   ['スカイツリー', 35.789966, 139.821961],
   ['東京ドーム', 35.705471, 139.751801],
   ['ランドマークタワー', 35.454948, 139.631429]
];

var map = new google.maps.Map(document.getElementById('map'));
var bounds = new google.maps.LatLngBounds();
var infoWindow = new google.maps.InfoWindow();
var marker;

for (var i = 0; i < locations.length; i++) {
  marker = new google.maps.Marker({
    position: new google.maps.LatLng(locations[i][1], locations[i][2]),
    map: map
  });
  // 地図表示領域をマーカー位置に合わせて拡大
  bounds.extend (marker.position);

  google.maps.event.addListener(marker, 'click', (function(marker, i) {
    return function() {
      infoWindow.setContent('観光スポット名：' + '<br>' + locations[i][0]);
      infoWindow.open(map, marker);
    }
  })(marker, i));
}

// 引数に指定した矩形領域を地図に収める
map.fitBounds (bounds);
```

> 参考
[LatLngBoundsクラスの解説](https://syncer.jp/google-maps-javascript-api-matome/latlngbounds/)
[fitBounds() - Mapクラスのメソッド](https://syncer.jp/google-maps-javascript-api-matome/map/method/fitbounds/)
[GoogleMap v3 マーカー位置にあわせて表示領域を自動調整する](http://onlineconsultant.jp/pukiwiki/?GoogleMap%20v3%20%E3%83%9E%E3%83%BC%E3%82%AB%E3%83%BC%E4%BD%8D%E7%BD%AE%E3%81%AB%E3%81%82%E3%82%8F%E3%81%9B%E3%81%A6%E8%A1%A8%E7%A4%BA%E9%A0%98%E5%9F%9F%E3%82%92%E8%87%AA%E5%8B%95%E8%AA%BF%E6%95%B4%E3%81%99%E3%82%8B)
【Google Maps JavaScript API v3】現在地の取得【getCurrentPosition】


デモ：https://secure2305.sakura.ne.jp/mental-energy.jp/test/geolocation.html

```javascript
navigator.geolocation.getCurrentPosition(success, error);

// 成功
function success(position) {
  var data = position.coords;
  var lat = data.latitude;
  var lng = data.longitude;
  var latlng = new google.maps.LatLng(lat, lng);
  $('.lat').text(lat);
  $('.lng').text(lng);

  // map
  var canvas = document.getElementById('map-canvas');
  var mapOptions = {
    zoom: 15,
    center: latlng,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  }
  var map = new google.maps.Map(canvas, mapOptions);

  // marker
  var markerOptions = {
    map: map,
    position: latlng,
    draggable: true
  }
  new google.maps.Marker(markerOptions);

};

// 失敗
function error(error) {
  var errorMessage = {
    0: "原因不明のエラーが発生しました…。" ,
    1: "位置情報の取得が許可されませんでした…。" ,
    2: "電波状況などで位置情報が取得できませんでした…。" ,
    3: "位置情報の取得に時間がかかり過ぎてタイムアウトしました…。" ,
  } ;
  console.log( errorMessage[error.code] ) ;
}
```

GPSに対応しているスマホだけでなく、現在位置を設定できるデスクトップPCでも利用可能。
MBPからのhttp通信だとエラー。設定の問題か。

```error
getCurrentPosition() and watchPosition() are deprecated on insecure origins. To use this feature, you should consider switching your application to a secure origin, such as HTTPS. See https://goo.gl/rStTGz for more details.
```


> 参考
[Google Maps JavaScript API v3の使い方まとめ (サンプルコード付き)](https://syncer.jp/google-maps-javascript-api-matome)
MacのTerminalからScreenSaverを起動する

#なぜそうしたいのか

カフェで、
よし！`git push`して、今日の作業は終わりだ！
席から離れて、ホワイトモカをもう一杯注文しよ！

とすると、こんな画面のまま席から離れちゃうｗ
![img.JPG](https://qiita-image-store.s3.amazonaws.com/0/62774/b7da4086-7c14-b7e3-4879-84114bc80877.jpeg)

変なクラッカーに勘違いされないため、command lineからもScreenSaverにアクセスしよと決めた！
↑単純に隠したいときに使いたいため

#ScreenSaverってどこ？
まずスクリーンセーバーはappの一つで、/System/Library/Framworks/配下にある。
Bashで以下のように起動できる。

```bash:terminal.app
$ open /System/Library/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app
```

#.bash_profileでaliasを追加
ここままだと毎回これを入力するのがめんどいのでaliasの設定を行う。
.bash_profileか.bashrcで設定

```bash:.bash_profile
alias ss='open /System/Library/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app/'
```

あと、単にディスプレイをスリープさせたい時は

```bash:terminal.app
pmset displaysleepnow
```

ssはscreensaverの略で使用したけど、すでに使用されているのであれば、ほかの考えてくださいｗ


#最後におすすめScreenSaver
Apple TV　第４世代にあるスクリーンセーバーは実は、github上で公開されている。

[Aerial - Github](https://github.com/JohnCoates/Aerial)

かなり綺麗ので、お気に入りｗ
raspberry pi のシリアルポートでコンソールを使う

HDMIのモニターがない、無線LAN、有線LANで接続できない場合に、
シリアルポート接続でコンソールを使うと便利です。


#設定確認環境
raspberry pi側のOSにNOOBS
PC側のOSにWindows7(Windows10)
動作確認にはraspberry pi 2を使用


#raspberry pi 以外に用意するもの

- コンソールを動かすPC、Windowsかmacなどのパソコンを用意する。
- ＵＳＢシリアル変換モジュール

ＵＳＢシリアル変換モジュールは秋月の超小型ＵＳＢシリアル変換モジュール(通販コード　M-08461)が６００円と安く、
コネクタがＵＳＢマイクロＢなのでお勧め。ピンは半田付けする必要があるがそんなに難しくありません。
![M-08461 (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/11566/6bebbcb5-902d-5732-39ee-21482a02086c.jpeg)



#接続方法

３本を接続するだけです。
グラウンドとTX,RXを互い違いで接続する。

raspberry pi側  　  　　ＵＳＢシリアル変換モジュール
　　　　Ground(6)  <--->　Ground 
　　　　　　Tx(8)  <--->  Rx 
　　　　　 Rx(10)  <--->  Tx 



![20150823004314.png](https://qiita-image-store.s3.amazonaws.com/0/11566/9d0ceb3d-20ad-0cf1-468d-8e04caaa7b96.png)


#コンソール
初期設定でシリアルポートが有効になっているので特に設定しなくて動作します。

コンソールソフトにはTeraTermで確認しました。

設定は転送速度を115200bpsにします

![スクリーンショット 2016-05-17 07.48.31.png](https://qiita-image-store.s3.amazonaws.com/0/11566/e0954732-bdb4-14b3-b70c-ea1baaa24423.png)



※未確認ですがRaspberry Pi 3の場合は「ボーレート」が「72000」に変更になっているようです。
Jupyter Notebookでギリシャ文字を簡単に入力するには

# ギリシャ文字の入力方法
Jupyter NotebookのCodeセルで、

```
\delta
```
と入力してTabキーを押してみると、あら不思議

```
δ
```
に変わります。

先頭を大文字にすると、

```
\Delta
```

大文字になります。

```
Δ
```

# どんな文字が入力できる？
途中まで打ち込んでTabキーを押せば候補が出てきます。

## ギリシャ文字
例：

|   入力  | 文字 |
|---------|:----:|
| \\alpha | α    |
| \\beta  | β    |
| \\gamma | γ    |
| \\Alpha | Α    |
| \\Beta  | Β    |
| \\Gamma | Γ    |

入力方法はLaTeXに合わせてあるみたいです。
[LaTeXコマンド集 - ギリシャ文字](http://www.latex-cmd.com/special/greek.html)

## 上付き文字・下付き文字
例：

| 入力  | 文字  |
| ----  | :---: |
| x\\^i | $x^i$ |
| x\\_i | $x_i$ |

ただし、使える文字と使えない文字があります。
アルファベットの小文字はだいたい使えるみたいです。

## 微分のドット記法
例：

| 入力    | 文字        |
| ------- | :---------: |
| x\dot   | $\dot{x}$   |
| x\ddot  | $\ddot{x}$  |
| x\dddot | $\dddot{x}$ |

微分を表すときに使うあれです。ニュートンの記法というらしいです。
[ニュートンの記法 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%88%E3%83%B3%E3%81%AE%E8%A8%98%E6%B3%95)

## 太字
例：

|   入力  | 文字 |
|---------|------|
| \\Bbbx  | 𝕩    |
| \\BbbX  | 𝕏    |

どう呼ぶのかわからないので「太字」としましたが、集合を表すときに使う文字のようです。

# 使いどころ
Python 3なら変数名にUnicode文字が使えるので、数式をプログラムにするときには便利なんではないでしょうか。

```
u = 20.0
Δt = 0.0005
ΔL = 0.1
C = u * Δt / ΔL
```

ただし、どんな文字でも使えるというわけではありません。
使えるについては文字はこちらの記事が参考になります。
[Python 3 の変数名に使える文字たち - Qiita](http://qiita.com/yukinoi/items/e521e8f6b085a51de90b)

# Jupyter Notebook以外は？
IPython (`ipython` で起動）
Jupyter QtConsole （`jupyter qtconsole` で起動）
でも使えます。
latexの参考文献でエラーが出た時のメモ(BibTeX未使用)

参考文献をBibTeXを使わないでthebibliography環境で書こうとしたときに遭遇したエラー。その時の私の状況はというと,LaTexをテキストエディタのAtomで書いており,「latexmk -pvc」で自動コンパイルするようにしていた。

```
\begin{thebibliography}{9}
 \bibitem{label} xxx,‘‘aaaa''
\end{thebibliography}
```

と書いてコンパイルしたところ,
「Something’s wrong–perhaps a missing \item.」
というエラーが\bibitemを書いているにも関わらず発生。ググって調べるも,BibTeXの.bblファイルが壊れているわけでもないし,学校の講義で配布されたレジュメに記載された参考文献の書き方と比べても間違えてる点は見当たらないしで,かれこれ2時間ほど悩まされた。こうなったらヤケだと,ところどころ空行をいれる。駄目だ。じゃあ\bibitemの著者名から先を改行しよう。

```
\begin{thebibliography}{9}
 \bibitem{label}
  xxx,‘‘aaaa''
\end{thebibliography}
```

・・・あっ,通った。詳しいことはよくわからないけど,\bibitemの後ろに文献情報を記述するのがまずかったみたい。だけど,調べたWebサイトのソースコードも学校でもらったレジュメのサンプルソースも改行してないんだよなぁ。
Androidで画像を使ってSwitchをカスタマイズしたい

Androidのレイアウトをカスタマイズするときの自分用メモ。
Switch編。

# AppCompat v21 の SwitchCompat 使おう
Androidには `Switch` というコンポーネントもあるけれど、これを使うとAndroid4系とAndroid5系で表示が全然違ってくるので、両方のOSで共通のデザインを使いたいのならば `android.support.v7.widget.SwitchCompat` を使う。
以下のような感じ。

```xml
<android.support.v7.widget.SwitchCompat
    android:id="@+id/switch"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@null"
    android:thumb="@drawable/switch_thumb"
    app:track="@drawable/switch_background" />
```
`android:background="@null"` にしているのはタッチフィードバックを消したかったからです。
`android:thumb`がスイッチのつまみ、 `app:track`がスイッチの背景の調整項目です。


# つまみを変更したい
ここでは、画像素材を使って、スイッチがONの時、スイッチがOFFの時、スイッチを押した時の状態でつまみを変化させます。
`btn_default` がスイッチがONの時のつまみの素材
`btn_disable` がスイッチがOFFの時のつまみの素材
`btn_hover` がスイッチが押された時のつまみの素材とすると、以下のように設定できる。

```xml:switch_thumb.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/btn_hover" android:state_checked="true" android:state_pressed="true" />
    <item android:drawable="@drawable/btn_hover" android:state_focused="true" />
    <item android:drawable="@drawable/btn_disable" android:state_checked="false" />
    <item android:drawable="@drawable/btn_default" />
</selector>
```
`android:state_checked`がスイッチのON/OFFの状態
`android:state_pressed`がつまみが押された状態
`android:state_focused`がつまみがフォーカスされた状態
定義リストを頭から見ていって初めにマッチしたものが使われるので、定義する順番にも気をつける。


# 背景を変更したい
ここでは、画像素材を使って、スイッチがONの時、スイッチがOFFの時の状態で背景を変化させます。
`btn_base_on`がスイッチがONの状態の背景画像、
`btn_base_off`がスイッチがOFFの状態の背景画像とすると、以下のように設定できる。

```xml:switch_background.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true">
        <layer-list>
            <item android:drawable="@drawable/sound_btn_base_on" />
        </layer-list>
    </item>
    <item>
        <layer-list>
            <item android:drawable="@drawable/sound_btn_base_off" />
        </layer-list>
    </item>

</selector>
```
スイッチのON/OFFの状態でしか扱わないので、`android:state_checked`だけで条件分岐できます。

今回は画像を使ったAndroidのスイッチのカスタマイズのメモでした。
画像を用意できれば割りと簡単にカスタマイズできます。
まぁ、マテリアルデザインが適用されているのでデフォルトのままでも十分な気はするのですけれどね。
UIパーツをアプリの世界観に合わせる必要もある場合があるので。
Path.Combine(a, b, c)をUnityで

C#のSystem.IO.PathにはCombineというメソッドがあります。
これは2つのパスを合成するメソッドで
`Path.Combine("Hoge", "Foo.txt");`
とすると`Hoge/Foo.txt`を返してくれます。

`Path.Combine("Hoge/", "Foo.txt");`
でも同じ結果を返してくれるので便利です。

ただ、3つ以上のパスを合成する場合
`Path.Combine(a, b, c);`
と書けるのは.Net 4以降です。

Unityは.Net 2なので、そのままでは書けませんが、Linqを使うと簡単に書けます。
`new[] { a, b, c }.Aggregate(Path.Combine);`

benri✌('ω')✌
SublimeTextのR-BoxとR-SnippetsでR言語の開発環境を整えてみる

R言語の開発環境
---

みなさんはR言語を使っていますか?

僕は普段R言語を使うことがありますが、これまでは[RStudio](http://www.rstudio.com/)で開発をしてきました。
他の多くの方も賞賛する、R開発環境のデファクトスタンダードであるRStudioですが、個人的にはいくつかの不満がありました。

例えば

* リファクタリングが弱い (特に変数名の一括置換)
* リフォーマットができない
* ウインドウのカスタマイズ性が低い

などの点です。

そこで開発環境の乗り換えを検討してみたのですが、補完が効くエディタとなると、どれもいまいちな感じでした。
メジャーなところだと[emacas](https://www.gnu.org/software/emacs/)と[SublimeText](http://www.sublimetext.com/3)が有力候補として残ったので、自分は慣れている後者を選んでみました。

結論から言うと、RStudioに比べてとても快適でビルトインの関数は補完もしっかり効いています。
マルチカーソルの機能もあって、リファクタリング作業も非常に編集が楽になったと感じています。

![compl.png](https://qiita-image-store.s3.amazonaws.com/0/17214/47030100-2071-5ac3-665c-2c2ac3b76023.png)

このように補完も効くし

![exec.PNG](https://qiita-image-store.s3.amazonaws.com/0/17214/e0b74606-fd50-4abc-d652-cf00b829a2e9.png)

R GUIでの実行もできます。

ただし、パッケージのインストール中に設定で少しハマりどころがあったので紹介しておこうと思います。

開発環境
---

Windowsで開発していますが、たぶんMacやLinuxでも同様の方法で解消可能だと思います。

* Windows 10 Pro 64bit
* Sublime Text 3 Build 3114
* R 3.3.0

R-BoxとR Snnipet
---

SublimeText には[R-Box](https://packagecontrol.io/packages/R-Box)(Rのrepl実行用プラグイン)と[R-Snippets](https://packagecontrol.io/packages/R-snippets)(スニペットセット)が用意されていますので、[Package Control](https://packagecontrol.io/installation)からインストールするだけで開発環境が整います。
なんて便利!!

本来はインストール後に任意のRファイル内で`Ctrl+Enter`すれば、自動的にR GUIが立ち上がるはずです。

ところが自分はこれらのプラグインを入れてみたものの、**GUI画面が立ち上がる様子が一切ありませんでした。**
また**R-Boxのユーザー設定も見なおしてみたのですが、やはり一切反応なし。**

これはなぜかというと、R-Boxでは**R GUIを起動させるために[SendTextPlus](https://packagecontrol.io/packages/SendTextPlus)という別のパッケージを利用していて、その設定が正しくなかったため起動しなかった**のです。
図にするとこんな感じ。

![zu.png](https://qiita-image-store.s3.amazonaws.com/0/17214/3ccb3ead-0a59-2706-9110-b89837ad16e2.png)

R-Boxをインストールするときにセットで入ってくるのですが、特に見向きもせずスルーしていたので気づくのに時間がかかってしまいました。

起動しないエラーを解消するには、SendTextPlusのユーザー設定に以下を記述します。

```json
{
	"R64" : "C:\\Program Files\\R\\R-3.3.0\\bin\\x64\\Rgui.exe", // 各自のRgui.exeのパスを設定
	"prog": "R64"
}
```

progには他のGUIアプリケーションも指定できて、例えば[Sublime REPL](https://packagecontrol.io/packages/SublimeREPL)を使いたい場合は`"prog": "SublimeREPL"`としてあげればSublimeREPLでも起動します。
これなら、RStudioのような開発環境がSublime Textでも十分再現可能になりますね。

参考
---

* [Sublime Text における R 言語の関数補完について](http://qiita.com/yuntas/items/bed913260ac81621e956)
* [RStudio より軽くてサクサク。Sublime で R コンソールと連携](http://hikaru1122.hatenadiary.jp/entry/2015/10/30/154835)
Mac OS 10.11.5 でvmware fusion上のdockerコンテナに接続できなくなったら

Mac OS　をホストに、vmware fusionでubuntuをゲストにしてdocker開発環境を作っていたのですが、Mac OSを10.11.5にアップデートしてから docker コンテナに接続できなくなって困りました。どうもゲスト側でtcp4でlistenしている場合は接続できて、tcp6のみでlistenしている場合は接続できない模様。

vmwareのNAT設定まわりに問題があるようだ。まずはゲストOSに入って `ip a` で`eth0`や`ens33`あたりのipv6アドレスを確認してみる。ここでは、`fe80::xxx:xxxx:xxxx:xxxx/64` が得られたと仮定する。

続いてホストのMac環境に移り、以下を実行。

```shell-session
sudo ifconfig vmnet1 inet6 fe80::xxx:xxxx:xxxx:xxxx prefixlen 64
sudo sysctl -w net.inet6.ip6.use_tempaddr=1
sudo sysctl -w net.inet6.ip6.forwarding=1
sudo rtadvd -s vmnet1
```

これで普通にipv4アドレスでホストからコンテナにtelnet接続できるようになる。
Azure Machine LearningでMNIST入門

# Azure Machine LearningでMNIST

## ML Studioへアクセス

2016年5月現在、新ポータルからはMachine Learningを使えないので、[旧ポータル](https://manage.windowsazure.com/)からAzureにアクセス

左側メニューからMACHINE LEARNINGを選択

左下の新規をクリックして、DATA SERVICES>MACHINE LEARNING>簡易作成を選択

適当に項目を埋めて、MLワークスペースを作成

作成したワークスペースを選択し、ML Studioにサインイン

## EXPERIMENTS作成

左側メニューからEXPERIMENTS選択

左下のNEWをクリックして、Blank Experimentを選択

アイテムを検索するなどして、ドラッグアンドドロップし、各アイテムを以下のようにつなぐ

![azureml_sample.png](https://qiita-image-store.s3.amazonaws.com/0/103085/83685735-5d84-47ae-e22f-45199b899bc6.png)

- MNIST Train 60k(学習用データ)
- MNIST Test 10k(検証用データ)
- Multiclass Neural Network(学習モデル、Machine Learning>Initialize Model>Classificationの他のMulticlass~でも可)
- Train Model(学習するところ)
- Score Model(検証するところ)
- Evaluate Model(評価するところ、下の○を押してVisualizeを選択すると正解率などの結果が見れる)

Train Modelの赤い!をクリックし、Launch column selectorを実行

Labelカラムのみを右側に移動

![azureml_column.png](https://qiita-image-store.s3.amazonaws.com/0/103085/39513d8b-1897-f325-20bd-b62426bc2232.png)

RUNして、しばらく待つ

完了!!

基本的には、
モデルと学習用データからトレーニング→学習済みモデルと検証用データから検証
という流れ
自分のやりたいことが分類なのか回帰なのかといったことがわかってくると、簡単に機械学習可能

## WEB API化

SET UP WEB SERVICEからPredictive Web Serviceを選択
RUNを実行
DEPLOY WEB SERVICEを選択

完了!!

API keyやEndpointなどの情報が表示されるので、それを使ってWEB SERVICEを構築可能

*ワークスペースを残しておくと(大した金額ではないが)課金され続けるので、不要なら削除*