OmniAICreator/Qiita-1.07M huggingface dataset:
mrubyでWebSocketを使ってみた


Asmod4nさんの[mruby-websockets](https://github.com/Asmod4n/mruby-websockets)を動かしてみます。

# 環境

- OSX ElCapitan

# 手順

依存ライブラリはぜんぶbrewで入れらるので入れます。

```bash
brew install libressl
brew install wslay
brew install libsodium
```

次に、mrubyのheadをcloneしてきます。

理由-----------

最初、mruby-cliで生成した雛形からビルドしようとしていたのだが、

```
error: implicit declaration of function 'mrb_int_mul_overflow'
```

というのがでた。
`mrb_int_mul_overflow`はmruby-websocketが依存している[mruby-sysrandomで使われている](https://github.com/miminashi/mruby-sysrandom/blob/master/src/mrb_sysrandom.c#L130)ようなのだけど、この関数はmruby 1.2.0には[存在しない](https://github.com/mruby/mruby/compare/1.2.0...master#diff-71a5c753cbb98ea43f24eefde5198648R66)。

mruby-cliが取得してくるmrubyがリリース版（1.2.0）だったので、`mrb_int_mul_overflow`が存在しないようだった。

-------理由終わり

```bash
git clone https://github.com/mruby/mruby.git
cd mruby
```

次に、`build_config.rb`を編集します。

```ruby
MRuby::Build.new do |conf|
  # load specific toolchain settings

  # Gets set by the VS command prompts.
  if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR']
    toolchain :visualcpp
  else
    toolchain :gcc
  end

  enable_debug

  conf.gem :github => 'Asmod4n/mruby-websockets' do |g|
    g.cc.include_paths << '/usr/local/opt/libressl/include'
    g.linker.library_paths << '/usr/local/opt/libressl/lib'
  end
  conf.gem :github => 'Asmod4n/mruby-poll'
  conf.gem :github => 'Asmod4n/mruby-tls' do |g|
    g.cc.include_paths << '/usr/local/opt/libressl/include'
    g.linker.library_paths << '/usr/local/opt/libressl/lib'
  end
  conf.gem :github => 'Asmod4n/mruby-wslay' do |g|
    g.cc.include_paths << '/usr/local/opt/wslay/include'
    g.cc.include_paths << '/usr/local/opt/libsodium/include'
    g.linker.library_paths << '/usr/local/opt/wslay/lib'
    g.linker.library_paths << '/usr/local/opt/libsodium/lib'
  end
end
```

ビルドします。

```bash
rake
```

`bin/mirb`ができているはずなので、実行してみます。

```bash
./bin/mirb
```

mirbが起動したら、`echo.websocket.org`を利用して、WebSocketで通信できるかどうか試してみます。

```irb
mirb - Embeddable Interactive Ruby Shell

> WebSocket
 => WebSocket
> client = WebSocket::Client.new(:ws, "echo.websocket.org", 80, "/")
 => #<WebSocket::Client:0x7fea1a81fdb0 @connection=#<WebSocket::WsConnection:0x7fea1a81fd20>>
> client.send "hallo"
 => #<WebSocket::Client:0x7fea1a81fdb0 @connection=#<WebSocket::WsConnection:0x7fea1a81fd20>>
> client.recv
 => #<struct Wslay::Event::OnMsgRecvArg rsv=0, opcode=:text_frame, msg="hallo", status_code=nil>
> client.close
 => [#<struct Wslay::Event::OnMsgRecvArg rsv=0, opcode=:connection_close, msg="\003\350", status_code=:normal_closure>]
```

いけましたね。


# 参考

http://qiita.com/bamchoh/items/6fc41e1c830a3a3b56a8
Visual Studio 2015 を日本語化する

Visual Studio Community 2015 Update 3 を日本語化したときのメモです。
こちらの記事をまるまる参考にさせていただきました。

Visual Studio 2015 Community の日本語化
http://qiita.com/tadnakam/items/8d89dc17d3f1733c1a56

# (1) Microsoft Visual Studio 2015 Language Packのインストール

公式よりダウンロード
https://www.microsoft.com/ja-jp/download/details.aspx?id=48157

<img width="684" alt="301.png" src="https://qiita-image-store.s3.amazonaws.com/0/154834/8101c087-3d40-f31a-5295-5920a7552f77.png">

vs_langpack.exe を実行するとインストールが始まる（けっこう時間かかる）
<img width="684" alt="302.png" src="https://qiita-image-store.s3.amazonaws.com/0/154834/1a918c33-30ce-5a6c-66c0-fd9af320ee2c.png">

完了
<img width="684" alt="303.png" src="https://qiita-image-store.s3.amazonaws.com/0/154834/9ae31c22-1290-09cc-b80a-98d912c0092c.png">

# (2) Visual Studio の設定

Visual Studio 2015 を起動し、Microsoftアカウントでサインイン
<img width="684" alt="304.png" src="https://qiita-image-store.s3.amazonaws.com/0/154834/ed9b45f9-efc8-6c18-034d-7b3c4a98ae3c.png">

「Tools」→「Options」
<img width="684" alt="305.png" src="https://qiita-image-store.s3.amazonaws.com/0/154834/aa5b602e-1ebf-00fc-cc3e-e7f221f1013d.png">

「International Settings」で日本語を選んで「OK」を押す
<img width="684" alt="306.png" src="https://qiita-image-store.s3.amazonaws.com/0/154834/72da107e-7d25-6a5a-6f10-501f54b0c301.png">

無事日本語化されました。
<img width="684" alt="307.png" src="https://qiita-image-store.s3.amazonaws.com/0/154834/0b8e8e83-5ded-4161-8821-2bf36809c95c.png">

Visual Studio Community 2015 Update 3 の日本語化は以上です。
Unity 5.5.1f1で、Google VR SDK for Unity ver 1.10.0をimportすると出るエラーの解決方法

UnityにGoogle VRをimportしたらエラーが出たので、その解決をメモ

# 環境
- 開発
    - macOS
- ツール等
    - Unity: ver 5.5.1f1
    - Google VR SDK for Unity: ver 1.10.0

# 現象
以下のエラーが出る。

```:Console
Assets/GoogleVR/Scripts/Video/GvrVideoPlayerTexture.cs(595,7): 
error CS1622: Cannot return a value from iterators. 
Use the yield return statement to return a value, or yield break to end the iteration
```

# 解決法
Assets/GoogleVR/Scripts/Video/GvrVideoPlayerTexture.csの
`CallPluginAtEndOfFrames`の~~`
return false;`をコメントアウト~~
ではなくて、
`yield return null;`に書き換える
が正解だと思われる。

#### 補足
```csharp:GvrVideoPlayerTexture.cs(591行〜)
  private IEnumerator CallPluginAtEndOfFrames() {
    if (processingRunning) {
      Debug.LogError("CallPluginAtEndOfFrames invoked while already running.");
      Debug.LogError(StackTraceUtility.ExtractStackTrace());
      return false;
    }
```

処理の内容的に、
**`if (processingRunning)`だったら、エラーログを吐いて終了**を意図しているっぽい。
かつ、この関数は`IEnumerator`の型なので、終了するための`yield return null;`と書き換えるのが正しいはず。


以上。
標準コレクションメソッドによる再帰しないフィボナッチ数列

与えられた数を超えないフィボナッチ数列を求めたい。 [^出典元]
入力:`Int` (例:100)
出力:`List[Int]` (例:List(1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89))

Scalaの標準コレクションが持っているメソッドも便利なので、場面に応じて使っていきましょう、の布教記事です。

## ボトムアップ（再帰あり）

再帰を使って書く場合、いい感じで書くと

``` 再帰あり.scala
  def fibStream(a:Int, b:Int):Stream[Int] = a #:: fibStream(a+b,a);
  def fibList(l:Int) = fibStream(1,0).takeWhile(_ <= l).toList;
```

こんな感じになります。fibStreamを隠したければ、fibListの中に持ってきてnexted functionにしてもいいかもしれません。

## ボトムアップ(再帰なし)

``` 再帰なし.scala
def fibList(l:Int):List[Int] = {
  Iterator.continually(()) //無限のイテレータを作る。中身はいらないので Unit ()
    .scanLeft(1,0)((z,_) => (z._1 + z._2, z._1 )) // scanを使って、 F_{n+1} = (fib_{n+1}, fib_n) を作る
    .map(z=>z._1) // f_n = F_n の第一要素
    .takeWhile(_ <= l) // f_nがlを超えない間とり続ける
    .toList // イテレータをリスト化
}
```

n番目の要素が、長さnのフィボナッチ数列の末尾の2要素であるようなベクトル列Fを考えると、

``` math
F_n = (fib_n,fib_{n-1})
```

以下のようなベクトル（プログラム上はタプル）の並びになります。
 (1,0), (1,1), (2,1), (3,2), (5,3), (8,5), (13,8)
こうすると、

``` math
F_n = ({F_{n-1}}^1+{F_{n-1}}^2 ,{F_{n-1}}^1)
```

のように、F_{n-1} のみで F_n を表すことができます。
F_n が 一つ前の値 F_{n-1} と イテレータのn番目（今回は使わない）の要素から求めれらる場合は、
Scalaではreduce(F_nを返す)やscan(F_1 ・・・ F_nのコレクションを返す)系のメソッドを使うときれいに書けます。

（布教記事なのにこの例だと再帰ありの方が短いなあ、、、という後悔は置いておいて、）
必ずしも再帰を使わなくても、reduce, scan, foldなどメソッドを活用すれば "Scalaっぽく"（forやwhileを使わなくても）、きれいに書ける場面もあります。
再帰で書くとトップダウン[^2]になりがちですが、reduce,scan,foldを使えばボトムアップ[^3]でしか書けないので、パフォーマンスが必要な際の思考の整理にも良いかもしれません。[^4]
場面によって最適な方法を使い分けていきたいですね。

[^出典元]: http://qiita.com/okoshi/items/26d237861b4976a5d032 こちらの問題設定を借用。コメント欄に長く書きすぎたので本記事に。
[^2]: `fib(n) = fib(n-1)+fib(n-2)` みたいなやつ。直観的に書きやすいが、その反面、効率の悪い処理も書き放題なので、メモ化とかもせずに適当に書くと遅かったりする
[^3]: 動的計画法ライクな解法
[^4]: この1行は、なんか雰囲気でそれっぽいことを言って、まとめっぽくしているだけなので、深い洞察はないです
Goでビルドが遅くなってきたらやってること

自分のプロジェクトでビルドの速度低下が問題になりつつあったので、原因になっていそうなライブラリを事前にビルドして、$GOPATH/pkgにアーカイブをインストールしたら、ビルドが速くなったので大変ありがたかったというお話です。


#やること

go build に -i を付けてビルドする。ただそれだけです。

そこそこのコード量がある[github.com/aws/aws-sdk-go](https://github.com/aws/aws-sdk-go)を利用する[自前のコード](https://github.com/kai-zoa/d4aws)があったので、こちらで試してみます。


#まずはフルビルドしてみる

まずは -a 付けてフルビルドすると、どれくらいかかるか見てみます。

```bash
$ time go build -a ./main.go
go build -a ./main.go  28.13s user 4.30s system 223% cpu 14.517 total
```

**30秒** 近くかかりました。


#一部のライブラリを事前にインストールしてからビルド

awsのライブラリを指定して -i 付きで先にビルドとアーカイブのインストールを実行しておきます。

```bash
$ go build -i ./vendor/github.com/aws/...

# インストールされてるか確認
$ ls $GOPATH/pkg/darwin_amd64/github.com/kai-zoa/d4aws/vendor/github.com/aws/aws-sdk-go/service
acm.a cloudsearch.a cognitosync.a ecs.a health.a ...
```


それでは -a を付けずにビルドしてみると、

```bash
$ time go build ./main.go
go build ./main.go  1.86s user 0.33s system 135% cpu 1.615 total
```

**2秒未満っ**、とても速い！（当然ですが）


#インストール済みアーカイブの削除

そして、アーカイブを消したい場合は go clean -i で消せます。

```bash
$ go clean -i ./vendor/github.com/aws/...
```

#-installsuffixをつけてビルドしているときは‥

アーカイブのビルド時も-installsuffixをつけてください。アーカイブのインストール先は`$GOPATH/pkg/$GOOS_$GOARCH[_installsuffix]`になるので、本体のビルド時とサフィックスを揃えないとアーカイブを探すパスが異なってしまい、せっかくの事前ビルドも意味がないです。

揃っていれば問題なし。

```bash
$ go build -i -installsuffix foo ./vendor/github.com/pkg/errors/...
$ go build -i -installsuffix foo ./main.go
```

#詳しくは`go build -x`

上記で、go build や go clean が何をしているか、アーカイブがインストールされているときは実際にビルドが省略されているのかを詳しく見てみたい人は -x を付けて実行してみてください。

実際にgoコマンドが実行する内部のコマンドが全て出力されるので、読むと勉強になります。
codecs と pandas を使う時の注意


## 環境

### バージョン

```console
$ python --version
Python 2.7.12 :: Continuum Analytics, Inc.
$ pip freeze | grep pandas
pandas==0.19.1
```

### サンプルファイル

```console
$ file --mime sample.tsv
sample.tsv: text/plain; charset=utf-8
$ cat sample.tsv
ID	言語
1	日本語
2	英語
```

## codecs

まず `codecs` ですが

```python
>>> open("sample.tsv", "r").read()
'ID\t\xe8\xa8\x80\xe8\xaa\x9e\n1\t\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e\n2\t\xe8\x8b\xb1\xe8\xaa\x9e\n'
>>> import codecs
>>> codecs.open("sample.tsv", "r", "utf-8").read()
u'ID\t\u8a00\u8a9e\n1\t\u65e5\u672c\u8a9e\n2\t\u82f1\u8a9e\n'
```

`codecs` で読み込むと `unicode` にしてくれます。

## pandas

`tsv` を読み込む時に便利な `read_table` 関数。

```python
>>> import pandas as pd
>>> df = pd.read_table(open("sample.tsv", "r"))
>>> df
   ID   言語
0   1  日本語
1   2   英語
>>> df.columns
Index([u'ID', u'言語'], dtype='object')
>>> df[u"言語"]
Traceback (most recent call last):
  ...
KeyError: u'\u8a00\u8a9e'
>>> list(df.columns)
['ID', '\xe8\xa8\x80\xe8\xaa\x9e']
>>> type(list(df.columns)[1])
<type 'str'>
>>> df["言語"]
0    日本語
1     英語
Name: 言語, dtype: object
```

`df.columns` の表示に `u` が着いてるのはよくわかりませんが、
文字列の型が `str` なのは納得ですね。

## codecs & pandas

### with `read_table`

では　`codecs` を使って `read_table` で読み込むと

```python
>>> df = pd.read_table(codecs.open("sample.tsv", "r", "utf-8"))
>>> df
   ID   言語
0   1  日本語
1   2   英語
>>> df[u"言語"]
Traceback (most recent call last):
  ...
KeyError: u'\u8a00\u8a9e'
>>> df["言語"]
0    日本語
1     英語
Name: 言語, dtype: object
```

なぜか `str` になるみたいです。

### without `read_table`

```python
>>> from collections import defaultdict
>>> data = defaultdict(list)
>>> f = codecs.open("sample.tsv", "r", "utf-8")
>>> labels = f.readline()[:-1].split("\t") # 改行以外をタブで分割
>>> values = f.readline()[:-1].split("\t") # 改行以外をタブで分割
>>> for label, value in zip(labels, values):
...     data[label].append(value)
... 
>>> df = pd.DataFrame(data)
>>> df
  ID   言語
0  1  日本語
>>> df["言語"]
Traceback (most recent call last):
  ...
KeyError: '\xe8\xa8\x80\xe8\xaa\x9e'
>>> df[u"言語"]
0    日本語
Name: 言語, dtype: object
>>> list(df.columns)
[u'ID', u'\u8a00\u8a9e']
>>> type(list(df.columns)[1])
<type 'unicode'>
```

`read_table` を使わずに
 `codecs` で読み込んだ場合は、
 想定通りでした。
SQLについての個人的まとめ

#この記事について#
自分の備忘録として、SQL全般についての自分の考えや調べたことを記載していきます。
経験が浅いので、間違っていることもあると思いますがご容赦ください。

##Select文の実行順序##
[なんとなく書いていたSQLのSELECT文を根本から理解する](http://kaya-soft.com/sqlserver2008-toranomaki/beginner/select_master2/)

##結合について##

内部結合(inner join)と外部結合(outer join)について、まとめます。

<b>結合条件の厳しさ</b>
結合の際に両方のテーブルに条件にあうレコードが無いと結果が返ってこないので、内部結合の方が厳しいです。
何にも考えず、とりあえず内部結合で!　はやめましょう。
「え、なんで内部結合を使うの?」と指摘されて、答えられないといけません。

<b>結合条件のカラムのnull許容</b>
SQLを設計するにあたり、片方のテーブルの結合に使うカラムの値がnullの値を許容する場合は内部結合ではなく外部結合を検討するようにしましょう。

<b>内部結合の結果、検索結果が取得できないと困る!とき</b>
例
マスタテーブルとトランザクションテーブルを結合し、検索結果を後の処理で使う際、
データが取れないと困るときがある場合は外部結合を検討するようにしましょう。

<b>外部結合 LEFT OUTER JOIN </b>
左に書いたテーブルのすべてのデータ + 結合条件に指定されたデータを返します。

検索結果のイメージとしては右にくっついているテーブルのデータが歯抜けになります。
下は■が左のテーブルのカラムのデータ、右がテーブルのカラムのデータを示します。

■ ■ ● ●
■ ■         ←歯抜けになる。
■ ■ ● ●
■ ■ ● ●

<b>外部結合 RIGHT OUTER JOIN </b>
右に書いたテーブルのすべてのデータ + 結合条件に指定されたデータを返します。

検索結果のイメージとしては左にくっついているテーブルのデータが歯抜けになります。
下は■が左のテーブルのカラムのデータ、右がテーブルのカラムのデータを示します。

■ ■ ● ●
    ● ●     ←歯抜けになる。
■ ■ ● ●
■ ■ ● ●

<b>結合したうえでさらにデータを絞りたい</b>
Where句で更にデータを絞りましょう。

<b>複数INNER JOINする際の順序について</b>
2つのテーブルを結合したテーブルを更に結合するときは以下の例のように書くことができます。

例
select
・
・
・
from
aテーブル 
inner join 
bテーブル
inner join
cテーブル

#データの絞り込み#

<b>主キーでないカラムでの絞り込み</b>
一意のレコードがヒットせずに、複数のレコードがする可能性があります。

複数主キーがある場合に注意が必要です。

例
2つ主キーがあるテーブルがあり、そのうち1つの主キー、残り一つを主キーで検索すると、複数のデータがヒットする可能性があります。

#SQLの検証#

<b>コードに埋め込まれたSQLが怪しいな、と思ったら</b>
以下のような検証をしてみましょう。

コードに書かれているSQLを整形し、実際に流れるかを試す
JOIN部分を1つずつ消し、どこのテーブルのデータが無いかを調べる

#as句について#
as句は省略可能です。
[検索結果の列名を別名で表示する](http://www.sql-reference.com/select/as.html)

#小技#
| 事項       |       説明|       参照|
|:-----------------|:------------------|:------------------|
|マテリアライズドビュー|ビューは複数のテーブルから作られた仮想的なテーブルであるが、<br>こちらは複数のテーブルから作られた実体を持ったテーブルのこと。<br>中身を最新化するには、再計算する必要があり、方法として、完全リフレッシュ、高速リフレッシュがある|[マテリアライズド・ビュー](http://www.ne.jp/asahi/hishidama/home/tech/oracle/mview.html)|
|文字列結合|csv形式で出したいときに利用|[文字列を連結する](http://www.sql-reference.com/string/concatenate.html)|


#参考#
[これでわかった!? LEFT / RIGHT JOIN.](http://qiita.com/zaburo/items/548b3c40fee68cd1e3b7)

[表の検索(SELECT)](http://pgcafe.moo.jp/SQL/main_2.htm)
rsyncで一部のサブディレクトリの中身だけをコピー

一言で書くと：末尾が`a`か`c`で終わるディレクトリにマッチさせたいときに`--include='*{a,c}/'`だとダメで`--include='*'{a,c}'/'`とする必要があるという話。

多階層になっているフォルダから一部のファイルだけを`rsync`したいとする。`rsync`の`--include`、`--exclude`が複雑怪奇なのはよく知られている[[Link]](http://tech.nitoyon.com/ja/blog/2013/03/26/rsync-include-exclude/)が、試行錯誤が必要だったパターンがあったのでメモ。

次のようなフォルダ構成から、`hoge_a/f1`と`hoge_c/f1`の下のpngファイルだけをrsyncしたいとする。ディレクトリとしては`hoge_b`もあるのがポイントで。

```
project
│   ...
│
└───hoge_a
│   │   ...
│   │
│   └───f1
│   |   │   fuga.png
│   |   │   ...
│  ...
│
└───hoge_b
│   │   ...
│   │
│   └───f1
│   |   │   piyo.png
│   |   │   ...
│  ...
└───hoge_c
│   │   ...
│   │
│   └───f1
│   |   │   foo.png
│   |   │   ...
│  ...
```

サフィクスが`a`と`c`のディレクトリだけ対象にしたいので、次のように`*{a,c}`でフィルタリングしようとしてもうまくいかない。

```
$ rsync -ahv --include='*{a,c}/f1/*.png' \
             --include='*/' \
             --exclude='*' \
             remotehost:~/project/ ~/project/
```

次のように`{a,c}`をクオーテーションの外に書くと無事コピーが開始される。理由は知らない。

```
$ rsync -ahv --include='*'{a,c}'/f1/*.png' \
             --include='*/' \
             --exclude='*' \
             remotehost:~/project/ ~/project/
```
haproxy1.6のstats(GUI)

haproxy1.6で記載の仕方が変わったようなので記載

#global
`stats socket /var/lib/haproxy/stats`
最低限これだけあればいいはず

#listen
よくあるサンプルを使うと
please use the 'bind' keyword for listening addresses.
とか怒られます。

```
listen  stats
        bind 0.0.0.0:1936
        mode http
        maxconn 10
        stats enable
        stats hide-version
        stats refresh 30s
        stats show-node
        #stats auth admin:password
        stats uri /
```
自分はこれで動作しました。
Ruby｜特異クラスにクラス変数を定義してみる


特異クラスにも定義できるのかな？と思ったのでやったことメモです。

## 動作環境

Ruby 2.3.1
OS X El Capitan 10.11.6

## やったこと

まず、クラスメソッドを定義する方法で定義してみました。

```ruby
class C
  class << self
    @@val = 100
  end
end

C.singleton_class.class_variables #=> []
C.class_variables #=> [:@@val]
```

むむ、なんかうまくいかない。。。

なんでこれがうまく行くと思ったかというと、クラスインスタンス変数は思った通りの動きをしているからなんです。

```ruby
class D
  @val = 20 # クラスDのクラスインスタンス変数
  class << self
    @val = 10 # 特異クラスのクラスインスタンス変数

    def get_val
      @val
    end
  end
end

p D.get_val #=> 20
p D.singleton_class.instance_variable_get(:@val) #=> 10
```

クラス変数については、どうやら[ここ](http://blog.honeybadger.io/lexical-scoping-and-ruby-class-variables/)を参考にしますと
クラス変数のスコープはレキシカルスコープに従うとこのこと

つまり、この場合でいうと`D`にあるように振る舞うということになります。

なので、トップレベルで似たようなことをすると・・・

```ruby
class E
end

class << E
  @@val = 100 # warning: class variable access from toplevel
end
```

ワーニングでましたね:sob:

ひとまず、`class_variable_set`を使うしか方法はないのかな？と思っています。

```ruby
class D
end

D.singleton_class.class_variable_set(:@@val, 100)
p D.singleton_class.class_variable_get(:@@val)
```
CentOS 7で太字フォントを綺麗に表示する

## <i class="fa fa-cube" style="font-size:1em;"></i> 概要
デフォルトではターミナルで太字フォントが次のように表示されます。

![Screenshot from 2017-01-28 21-18-08.png](https://qiita-image-store.s3.amazonaws.com/0/66410/5b111c13-658f-c25b-ffbf-c4a5d578d4bc.png)

これをアンチエイリアスが効いていないから、と思うかもしれません。
ですが、実際にはフォントヒンティングという最適化技術が原因です。
フォントヒンティングを無効化すると次のように表示されるようになります。

![Screenshot from 2017-01-28 21-13-54.png](https://qiita-image-store.s3.amazonaws.com/0/66410/93d205fe-8f50-88a2-82cc-3aadee867d10.png)

## <i class="fa fa-cube" style="font-size:1em;"></i> フォントヒンティングを無効化する方法


1. ``` ~/.config/fontconfig/ ``` に ``` fonts.conf ``` を作成します。

1. 作成した ```fonts.conf``` に以下の内容を記述し保存します。

    ```xml:fonts.conf
    <?xml version='1.0'?>
    <!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
    <fontconfig>
    	<match target="font">
    		<edit mode="assign" name="hinting">
    			<bool>false</bool>
    		</edit>
    	</match>
    </fontconfig>
    
    ```
1. 次のコマンドを実行します。
```$ fc-cache```

成功していれば、ターミナル再起動で変更が反映されていることを確認できます。

## <i class="fa fa-cube" style="font-size:1em;"></i> 備考
* 上の例では全てのフォントがフォントヒンティングなしになります。  
特に違和感を感じることはないと思いますが太字フォントでのみ無効化させたい等の場合は  
この記事の下部、参考に詳しい情報が載っています。  
<br>
* Linuxのフォント設定をネットで調べると ```~/.config/fontconfig/fonts.conf``` ではなく  
```~/.fonts.conf``` を編集する方法が見つかるかもしれません。  
ですが、こちらは最近は使われなくなっているらしく、  
その関係か ```~/.fonts.conf``` があると ```~/.config/fontconfig/``` に ```fonts.conf``` として移動し  
```~/.fonts.conf``` がシンボリックリンクに変更されます。  
そのため、```~/.fonts.conf``` を削除しても設定が残ることになるので注意してください。

> ```ノート: 設定ファイルとディレクトリ: ~/.fonts.conf, ~/.fonts.conf.d, ~/.fontconfig/*.cache-* は fontconfig 2.10.1 から使われなくなりました (upstream commit) 次のバージョンのパッケージからデフォルトで読み込まれなくなります。代わりに $XDG_CONFIG_HOME/fontconfig/fonts.conf, $XDG_CONFIG_HOME/fontconfig/conf.d/NN-name.conf, $XDG_CACHE_HOME/fontconfig/*.cache-* を各々使って下さい。二番目のディレクトリを使う場合、ファイルの名前は NN-name.conf という決まりに従って下さい (NN は2桁の数字です、例: 00, 10, 99)。```
> <cite>_— 引用元: [arclinux/フォント設定#Fontconfig 設定](https://wiki.archlinuxjp.org/index.php/%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E8%A8%AD%E5%AE%9A#Fontconfig_.E8.A8.AD.E5.AE.9A)_</cite>  

<br>

* 確認バージョン: CentOS Linux release 7.3.1611 (Core) 

## <i class="fa fa-book" style="font-size:1em;"></i> 参考

[arclinux/フォント設定](https://wiki.archlinuxjp.org/index.php/%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E8%A8%AD%E5%AE%9A)
[arclinux/フォント設定/サンプル#斜体や太字でヒンティングを無効化](https://wiki.archlinuxjp.org/index.php/%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E8%A8%AD%E5%AE%9A/%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB#.E6.96.9C.E4.BD.93.E3.82.84.E5.A4.AA.E5.AD.97.E3.81.A7.E3.83.92.E3.83.B3.E3.83.86.E3.82.A3.E3.83.B3.E3.82.B0.E3.82.92.E7.84.A1.E5.8A.B9.E5.8C.96)
[Qiita の記事の見出しに Font-Awesome を利用して見栄えを良くする #qiita](http://qiita.com/tbpgr/items/361d8aaa38fb57d75216)
ST_GeomFromEWKTとST_GeometryFromTextのどちらを使うべきか

#Well-known textからGEOMETRY型への変換関数
　CSV等のテキストデータから、PostGISのジオメトリ型を生成する場合、[Well-known text](https://ja.wikipedia.org/wiki/Well-known_text)形式で記述することにより、ポイント、ライン、ポリゴン等の多彩な表現が可能です。
　PostGISでは、ST_GeometryFromText関数とバージョン1.5から追加されたST_GeomFromEWKTの２つがあります。本投稿は両者の違いを認識し、より使いこなせればと思い調査いたしました。

##WKTとEWKTの関係
- **Well-known text(WKT)** : Open Geospatial Consortium (OGC) により策定された標準化された規格であり、PostGIS以外にもDB2等の他のRDBでも用いられています。
- **Enhance Well-known text(EWKT)** : PostGISが独自に拡張（Enhance）したWKTで標準化されているものではありません。両者の包含関係は下図の用になります。
<img width="700" alt="スクリーンショット 2017-01-28 22.29.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/53918/d34583b8-d463-aa8d-5ccb-ee1a3c7643c0.png">

##EWKTの拡張内容
### PostGIS 1.5で拡張されたもの
- SRIDの記述
- 3次元データへの対応
- 曲線ストリング（CIRCULARSTRING）の対応

### PostGIS 2.0から拡張されたもの
- 多面体サーフェス
- 三角形と不整三角形網(TIN)

#記述例
ST_GeomFromEWKTとST_GeometryFromTextの具体的な利用法を記載します。

##Well-known textの記述例
北緯35度、東経140度のポイントデータを記述する場合、型と座標を下記のように表現します。

```text:wkt_point
POINT(140 35)
```


## Well-known textからGeometry型への変換
標準的なWKTの場合に於いては、2つの関数に違いはありません。

- ST_GeometryFromTextの場合

```SQL
SELECT ST_GeometryFromText('POINT(140 35)')
```
- ST_GeomFromEWKTの場合

```SQL
SELECT ST_GeomFromEWKT('POINT(140 35)')
```

## ジオメトリオブジェクトにSRIDを設定
旧日本測地系(4301)を設定してみます。EWKTには直接SRIDを表記可能です。

- ST_GeometryFromTextの場合

```SQL
-- 第2引数を用いる方法
SELECT ST_GeometryFromText('POINT(140 35)' , 4301 );

-- ST_SetSRIDを用いる方法
SELECT ST_SetSRID( ST_GeometryFromText('POINT(140 35)'), 4301 );
```
- ST_GeomFromEWKTの場合

```SQL
SELECT ST_GeomFromEWKT('SRID=4301;POINT(140 35)');
```
EWKTのSRIDを記載するにはWKTの前に`SRID=番号;`という書式で表記します。

## PostGISでの動作実験
　ST_GeometryFromTextにEWKTを入力した場合どうなるか調査しました。ST_GeometryFromTextがEWKTを受け入れない仕様でしたら、下記のSQLはエラーが返って来ることが期待されます。
　SRIDの入力を拒否するのであれば、SRIDが未知であるため１行目は-1 が返却される事が期待出来ます。

```SQL:EWKT_Test
-- test1
SELECT ST_GeometryFromText('SRID=4301;POINT(140 35 10 1)');

-- test2
SELECT ST_GeomFromEWKT('SRID=4301;POINT(140 35 10 1)') ;

-- test3
SELECT 'SRID=4301;POINT(140 35 10 1)'::geometry ;

-- test4
SELECT CAST( 'SRID=4301;POINT(140 35 10 1)' AS geometry )  ;

-- test5
SELECT 'SRID=4301;POINT(140 35 10 1)'::geography ;

```

|No| テストケース      | 動作結果 |    WARNING出力    |
|:-:|:-----------------|:------------------:|:------------------:|
|1|ST_GeometryFromTextにEWKT|◯|有り|
|2|ST_GeomFromEWKTにEWKT|◯||
|3|EWKTをキャスト演算子でキャスト|◯||
|4|EWKTをキャスト関数でキャスト|◯||
|5|EWKTをキャスト演算子でGEOGRAPHY型にキャスト|△||
（動作確認時の環境 PostGIS 2.1 USE_GEOS=1 USE_PROJ=1 USE_STATS=1　）

 - **テストケース1** ST_GeometryFromTextについては、`WARNING:  OGC WKT expected, EWKT provided - use 
GeomFromEWKT() for this` というEWKTが入力されていることへのWARNINGメッセージが出力されました。
 - **テストケース5** GEOGRAPHY型にキャストされましたが、旧日本測地系のSRIDが指定しましたが、測地変換はされませんでした。 

# まとめ
 「どちらを使うべきか？」という検討では、現在のPostGISの動作ではST_GeometryFromTextもEWKTを受け入れますが、WARNINGメッセージが出力されることが確認されました。EWKTを利用する際には、ST_GeometryFromTextやST_GeomFromTextは利用しないほうが良いと思われます。
　また、キャスト演算子やキャスト関数では、ST_GeomFromEWKTと同様の動作を確認しました。
アイコンフォント全部入りのフォント

参考：
グラフィカルなEmacsに、フォントでアイコンを表現する (FontAwesome使用)
http://qiita.com/ShingoFukuyama/items/81cdf4415e7ba1fb1deb

Windows上からMobaXtermでssh接続して仕事をしている場合や、emacsを-nwで使っている場合など、つまりはグラフィカルじゃない状況だと、このようなゆるふわなフォントアイコンを使うことが出来ないのでありました（多分）。

しかしながら、Powerline用のフォントのように、フォントを弄くればできるんじゃないか？と調べて行くうちに、下記のものに行き当たりました。

Nerd-fonts
https://github.com/ryanoasis/nerd-fonts

FontAwasome始め様々なアイコンフォントを入れられるだけいれてやれい、というようなフォントのようです。もちろんPowerlineも入っております。

リポジトリ中に用意されているフォントは、英字のフォントが多いですが、フォントを合成するためのスクリプトも同梱されているため、fontforgeをインストールしてスクリプトを実行してやれば、RictyDiminishedなどの日本語もナイスなフォントにも適用できました。

```bash
sudo apt-get install fontforge python-fontforge

git clone https://github.com/ryanoasis/nerd-fonts
cd nerd-fonts
./font-patcher --fontawesome --fontawesomeextension \
               --powerline --powerlineextra <patch対象のフォント>
```

font-patcherにはどのアイコンフォントを導入するかのオプションがありますが、組み合わせによっては上書きされてしまったりで、よくわからないことになったので、当初の目的であったfontawesome（とPowerline）だけにしました。またオプションなしでもデフォルトでSeti-UI, Deviconは入るみたいです。

これで、メジャーモードの表示とかを各言語のロゴとかにしたらキュートなんじゃないかと思っています。
[cyphejor](https://github.com/mrkkrp/cyphejor)とか使えばできそうだなぁ。

# 課題

- どこにどのグリフがあるのか、ちょっとわからなかったので、結局fontforgeでみながらやっていたりします。
- やはりものによっては、特にアスペクト比が横に長いフォントは端が切れてしまったりします。font-patcherをみながら、縮尺を変えたりする必要がありそうです。
- emojiも私の環境ではあまりいい感じに表示されないのですが([emojify](https://github.com/mrowa44/emojify)とか、emojif prifixとか、してみたいのです)これも同様の手法で合成したフォントを作れないかなぁと思っています。
    - http://qiita.com/polamjag/items/7295a15fca6a9eeb5d84
【AutoLayout】UILabelの幅を文字列の長さに合わせて可変にする方法

# デモ
![autoWidth.gif](https://qiita-image-store.s3.amazonaws.com/0/135478/db2aee00-f95c-9235-5049-47d0dd2d7712.gif)

# 手順
UILabelを設置したらAutoLayoutでwidthを適当な値で設定します。
![01.png](https://qiita-image-store.s3.amazonaws.com/0/135478/6cd94e3f-9ad6-3cf7-0144-fba551e0c23b.png)

次に先程設定した制約を編集していきます。
Constantという項目がありますので「≧」を選択してください。
これで右側の数字よりwidthが大きくなった場合、自動的に幅を文字列の長さに合わせる設定になります。
![02.png](https://qiita-image-store.s3.amazonaws.com/0/135478/01152af8-a627-7db8-0526-6fe50ac53dcb.png)

# デモのコード
```ViewController.swift
import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var textField: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        textField.delegate = self
    }

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        label.text = textField.text
        return true
    }
}
```
[AWS]セキュリティグループの上限の考え方を再確認する

#はじめに
セキュリティグループに設定可能なルールの上限数について、
ざっくりとした認識だけを持っておりました。

- 1つのEC2にセキュリティグループ5個まで
- 1つのセキュリティグループにルール50個まで
- 両者を乗算した数が250を超えてはいけない

ここで、こんなことをしたいなーとなった時に、実現できるのか気になったため確認しました。

- 1つのEC2インスタンスに下記3個のセキュリティグループをアタッチ
    - セキュリティグループ1：ルール数　10個
    - セキュリティグループ2：ルール数　10個
    - セキュリティグループ3：ルール数　230個

##追記
- この記事では単に「セキュリティグループ」と書いてしまいましたが、正確には「EC2-VPC用のセキュリティグループ」です。
    - それ以外に何かあるの？という方は以下をご参照ください。
    - http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_SecurityGroups.html#VPC_Security_Group_Differences
- 上限数は将来的に変更される可能性もあるので、都度最新の情報を参照してください。
    - http://docs.aws.amazon.com/ja_jp/general/latest/gr/aws_service_limits.html


#ドキュメントを確認する
こちらを参照します。
http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_Appendix_Limits.html#vpc-limits-security-groups

###今回の肝になる項目
- ①セキュリティグループ当たりのインバウンドルールまたはアウトバウンドルールの数
- ②ネットワークインターフェイス当たりのセキュリティグループ

###肝にはならないけど個人的に「そうかぁ」と思った項目

- 「ルール数」はインバウンド/アウトバウンドそれぞれに適用される
    - つまり①が「50」だったら、イン/アウトそれぞれ50まで設定可能であり、「合わせて50」ではない
- 「EC2インスタンスあたり」ではなく「ネットワークインターフェースあたり」である
    - 複数ENIをアタッチするケースでは上限の考え方が少し変わるということですね
- 上限緩和の単位はリージョン
    - 個別のセキュリティグループに対してのみの緩和はできない

#ドキュメントの読み取り方に悩む

要は制限における対象が「上限値」なのか「実際の設定数」なのかという部分です。

>セキュリティグループあたりのインバウンドまたはアウトバウンドルールの制限数とネットワークインターフェイスあたりのセキュリティグループの制限数を乗算した値は 250 を超えることができません。

「①×②が250を超えてはいけないという意味だな。」
（対象は「上限値」だな）

>たとえば、制限を 100 個まで増やす場合は、ネットワークインターフェイスあたりのセキュリティグループの数を 2 に減らします。

「"ネットワークインターフェイスあたりのセキュリティグループの数"って言うのはどっちの話だ！！？？」
（②そのものを2にする必要はなくて、実際にアタッチする個数が2になるよう気をつければ良かったりするのか！！？？）

#サポートに聞いてみる
聞いてみました。
###A.「上限値」です。
上限値でした。

記事を書く上で改めて確認すると「そうとしか読み取れないだろ」と思わなくもないですが、上限値でした。

###つまり
①を「100」に上限緩和したい場合は、同時に②を「2」に引き下げる申請が必要とのことです。

「はじめに」で想定していたケースでは、①を（少なくとも230まで）引き上げる時点で、②を「1」まで引き下げなくてはいけないので、実現不可でした。

#おわりに
残念ながら想定していた設定の仕方はできませんでした。
250という数字が多いのか少ないのか、というときっと「多い」のでしょうね。

同じ「送信元/先IP」でも「ポート」や「プロトコル」を細かく設定すればルール数はその分かさんでいきますし、逆に「ポート」が同一でも「送信元/先IP」を/32といった細かい数字で設定すればルール数は多くなります。

そこらへんはある程度合算した値で設定して、細かい部分のセキュリティの担保は他のサービスを組み合わせたりして別途検討してね~というのがAWS（ないしクラウド）の思想なのかな、と個人的に思いました。

＃ご意見ありましたらコメントいただけると幸いです！

以上です。
BluemixでPHP拡張モジュールを有効にする方法

#BluemixのPHP環境について
BluemixのCloud Foundry アプリ「PHP」は、デフォルトではmysql, mbstringなどの拡張モジュールが無効となっており、Bluemix上でphpMyAdminやWordPressを動かしたいと思ったときに筆者がつまずくポイントになりました。

#PHP拡張モジュール有効化手順
1.アプリのルート直下に「.bp-config」というフォルダを作成
2.「.bp-config」フォルダ内に「options.json」というファイルを追加
3.「options.json」の内容を以下のように記載

```
{
    "PHP_EXTENSIONS": [ "mysql", "mbstring", ...(有効にしたい拡張モジュール名を追加)]
}
```

4.アプリのルート直下に「composer.json」というファイルを追加
5.「composer.json」の内容を以下のように記載(中括弧のみ)
```{}
```
これで、アプリをデプロイすれば、PHP拡張モジュールが有効になります。
Heroku上のLaravelでRedisを使う

Heroku上に公開するLaravelアプリケーションでキャッシュサーバとしてRedisを使う場合の方法について。

# 前提
HerokuにはRedisのアドオンがいくつかありますが、[Heroku Redis](https://elements.heroku.com/addons/heroku-redis)を使うことを前提にします[^1]。

[^1]: ほかのアドオンでもおそらく似たようなやり方になると思われます。たとえばRedis To Goというアドオンならば環境変数 REDISTOGO_URL を参照することになるようです。

# アドオンの導入
まずheroku-redisアドオンを有効にしておきます。

```
heroku addons:create heroku-redis:hobby-dev
```

アドオンを有効にするとアプリケーションに環境変数 REDIS_URL がセットされます。

![REDIS_URL.png](https://qiita-image-store.s3.amazonaws.com/0/41007/9d48f4d2-735c-6368-15bc-e2ab06ea77a6.png)

セキュリティのためほぼモザイクにしていますが、 `redis://USERNAME:PASSWORD@HOST:PORT` の形式になっています。

# URLを分解する
LaravelのRedisを含むデータベース設定はURLはそのまま使えないので、分解することになります。

```database.php
    'redis' => [

        'cluster' => false,

        'default' => [
            'host' => env('REDIS_HOST', 'localhost'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', 6379),
            'database' => 0,
        ],

    ],
```

標準で[^2]上記のように環境変数をセットする形になっているので、URLを分解し環境変数にセットします。
このため、database.phpの `<?php` の直後に下記を加えます。

[^2]: [GitHubのLaravelのリポジトリがこうなっているため](https://github.com/laravel/laravel/blob/master/config/database.php)

```database.php
if (getenv('REDIS_URL')) {
    $url = parse_url(getenv('REDIS_URL'));

    putenv('REDIS_HOST='.$url['host']);
    putenv('REDIS_PORT='.$url['port']);
    putenv('REDIS_PASSWORD='.$url['pass']);
}
```

これを加えてデプロイするとHeroku上でRedisが使えるようになっているはずです。
仕様としてのVim


# エディタとしてのVim

エディタとしてのVimは確かに良いものだと思う、それでもやっぱり最近のエディタと比べると機能不足だなぁと思う部分もある。プラグインを使えばいろいろできるし、シンプルだからこそいいということもあるけど、自分の場合はプラグインはほぼまったくといっていいほど使わないし、設定ファイルも最低限しか書かない。というのも結局のところ自分がVimに求めているのはVim特有の編集のしやすさや使い勝手なんだと思う。単純にプラグインを導入していない、設定ファイルもあまり書いていない状態のVimと同じくらいのスピードで編集できるなら別にVimでなくてもいいってことになる。

# Vimでなくてもいいのでは？

決して自分はVimのアンチなんかではない、Vimは素晴らしいエディタだとおもう。それでもVimというひとつのソフトウェアにその能力を閉じ込めておくのはもったいないと思う。Vimを使うことによって得られる編集スピードと例えばEclipseのようなIDEを使うことによって得られる開発効率と、両方のメリットを得られたら素晴らしいのではないかとおもう。

この考えにいたったのはAtomのvim-modeやEclipseのvrapper、EmacsのEvil、VisualStudioのVsVimを使ってみてからだ、どれも優秀なプラグインで、まるでVimであるかのような操作感と編集スピードが得られた。

さらに最近では新しいVimとしてNeoVimの開発が進んでいる、ますます本家Vimを使う必要はなくなってきてしまったのではないかと思う。

# 仕様としてのVim

ここまできて言いたいのはVimはECMAScriptやHTMLのように仕様としてまとめて様々なIDEやエディタに組み込めるようにしておくといいんじゃないかってこと。そうすればたとえばIDEのFeatureに「Support: Vim Level 1」とか書いておけばどんな操作感まで可能なのかわかるし、IDEやプラグイン開発者もVim互換な機能を作りやすい、NeoVimのようなプロジェクトももっとできて、いろいろなエディタやIDEでVimの操作感を使えるようになるんじゃないかな、ちょっとだけそんなことを思ってみた。
vue.jsでmouseoverした時だけ表示する方法

jQueryだと、`mouseover`を使うことになると思います。

ただし、vueで使用すると、mouseoverした瞬間だけ、メソッドが実行されます。

なんで、正確にmouseoverした時だけ表示する方法です。

結論から言うと、`mouseenter`と`mouseleave`を使います。

```vue.js
  const topicForm = Vue.extend({
    data: function() {
      return {
        LinkIconActive: false,
        ImageIconActive: false
      }
    },
    methods: {
      LinkIconDescriptionShow: function() {
        return this.LinkIconActive = true
      },
      LinkIconDescriptionHidden: function() {
        return this.LinkIconActive = false
      }
    }
  })

```

```html.slim
i.fa.fa-link.@mouseenter="LinkIconDescriptionShow" @mouseleave="LinkIconDescriptionHidden"
```

methodsが二つ生えて、ダサいけど、こんな感じになるかと思います。

もっといい書き方があれば、教えて下さいm(_ _)m
typingsから@typesに移行した話

TypeScriptで開発を行う上で避けて通れないのが、型定義ファイルの取扱ですが、@typesを用いれば[TypeScriptのブログ](https://blogs.msdn.microsoft.com/typescript/2016/06/15/the-future-of-declaration-files/)に紹介されているように、tsdやtypingsを入れることなくnpmのみで完結するらしいので重い腰を上げて移行してみました。

~~tsdからtypingsに移行する時も腰が重かった...~~

結論から言うとtsd -> typingsの時よりはるかに楽でした。

# サンプル

typingsで入れたchart.jsの定義を@typesで入れ直してみます。

## @typesに使いたい定義があるか見てみる

[TypeSearch](https://microsoft.github.io/TypeSearch/)

こちらのサイトで検索すると、chart.jsは

https://www.npmjs.com/package/@types/chartjs

とのこと

## インストール

```
npm i -S @types/chartjs
```

これで終了です

## typingsで入れたやつを消す

```
typings uninstall -S chart.js
```

## 完全移行できる場合は

- typingsディレクトリを削除
- typings.jsonを削除
- package.jsonからtypingsを削除

してしまえばよいと思います。

## 結論

ビルド時に typings install を行う必要がなくなるのと、コマンドを覚える必要がなくなるので、移行するメリットは十分にあるかなと思いました。

~~次のツールになるまで何年使えるかな？~~
Raspberry Pi 防犯赤外線カメラ(Python編)

我が家に設置した赤外線防犯カメラを
作成した時の覚書です。
（初期導入の内容で現在とは大分異なります）

# 【使用する物】
Raspberry Pi 2 Model B：アマゾン　5,562円
赤外線カメラ NoIR Camera Board 790-2811：アマゾン　4,590円
焦電人感センサ：秋月電子　400円
赤色LED(3mm)：秋月電子　10円
カーボン抵抗（220kΩ）：千石電商　16円

# 【前提条件】
・「RPi.GPIO」を導入済み
・CSIカメラポートにカメラを接続済み
・「raspi-config」にてカメラを有効にしている事
・焦電人感センサのVCCおよびGND端子を接続済みで、
　OUT端子を任意のGPIOに接続されている事（ここでは5番を使用）
・センサー検知確認用のLEDが接続されている事
　（ここでは6番ポートに抵抗を挟んで接続）

# 【カメラ動作チェック：コマンド】
**静止画**
$ raspistill -o test.jpg
　
**動画**
$ raspivid -o test.h264

# 【Pythonのカメラ制御環境】
$ sudo apt-get update
$ sudo apt-get install python-picamera

# 【Python単体の静止画テスト】
```Python:StillTest.py
# coding: utf-8

import picamera
import time
 
camera = picamera.PiCamera()

camera.led = True
camera.start_preview()
time.sleep(3)

camera.capture('test.jpg')

camera.stop_preview()
camera.led = False

camera.close()
```

# 【Python単体の動画テスト】
```Python:MovieTest.py
# coding: utf-8

import picamera
import time

camera = picamera.PiCamera()

camera.led = True
camera.start_preview()

camera.start_recording('test.h264')
camera.wait_recording(5)
camera.stop_recording()

camera.stop_preview()
camera.led = False

camera.close()
```

# 【Python単体のセンサーテスト】
```Python:SensorTest.py
# coding: utf-8

import RPi.GPIO as GPIO
import time

SLEEP_TIME = 1
INTAVAL_TIME = 1

GPIO.cleanup()
GPIO.setmode(GPIO.BCM)

SENSOR = 5
GPIO.setup(SENSOR, GPIO.IN)

LED = 6
GPIO.setup(LED, GPIO.OUT) 

intaval = time.time() - INTAVAL_TIME

while True:
#	print GPIO.input(SENSOR)
	GPIO.output(LED, GPIO.LOW)

	if( GPIO.input(SENSOR) == GPIO.HIGH ) and ( intaval + INTAVAL_TIME < time.time() ):
		intaval = time.time()
#		print "!! Detection !!"
		GPIO.output(LED, GPIO.HIGH)

	time.sleep(SLEEP_TIME)
```

# 【Pythonのセンサー＆カメラ連携テスト(静止画)】
```Python:StillSensorTest.py
# coding: utf-8

import datetime

import picamera
import time

import RPi.GPIO as GPIO
import time

SLEEP_TIME = 1
INTAVAL_TIME = 1

GPIO.cleanup()
GPIO.setmode(GPIO.BCM)

SENSOR = 5
GPIO.setup(SENSOR, GPIO.IN)

LED = 6
GPIO.setup(LED, GPIO.OUT) 

intaval = time.time() - INTAVAL_TIME

camera = picamera.PiCamera()

while True:
	if( GPIO.input(SENSOR) == GPIO.HIGH ) and ( intaval + INTAVAL_TIME < time.time() ):
		intaval = time.time()

		GPIO.output(LED, GPIO.HIGH)

		camera.led = True
		camera.start_preview()
		time.sleep(1)

		NowTime = datetime.datetime.now()
		camera.capture(NowTime.strftime("%Y%m%d_%H:%M:%S") + '.jpg')

		camera.stop_preview()
		camera.led = False

		GPIO.output(LED, GPIO.LOW)

	time.sleep(SLEEP_TIME)
```

# 【残りの覚書】
・センサー検知のタイムスタンプ（Python → MySQL）
・画像の保存先を年月日フォルダに格納（Python → File）
・PHPからカメラ制御、DB＆画像を参照、Python実行
　（PHP → DB or Python or Command or File）
・スマホアプリで外部から制御、参照（JavaScript → PHP）

https://github.com/Naoki-Takamatsu/Raspberry-Pi_Test
行列の形を保ったままapply

行列の形を保ったまま関数を適応する方法についてのメモ

```R
m <- c(1:9, 3, 3)

structure(sapply(m, sqrt), dim=m))
structure(vapply(m, sqrt, numeric(1)), dim=m))

m[] <- sapply(m, sqrt)
m[] <- vapply(m, sqrt, numeric(1))
```
(初心者向け) TestFlightの内部テスターの利用

# TestFlight
TestFlightとはiTunes Connectに統合されたアプリケーションのテスト配信を可能とするシステムです。リリース前のアプリケーションを限定されたテスターに配布して、動作検証を行うことを目的としています。リリース方法は以下の2種類があります。

### 内部テスト
iTunes Connectのユーザー向けにアプリケーションを配布する方法です。外部テストと異なり、アプリケーションの監査なしで配布が可能です。

### 外部テスト
iTunes Connectのアカウントを持たない外部のユーザーに対してアプリケーションを配布する方法です。最大2000ユーザーまで配布可能です。ただし、アプリケーションの監査が入るため配布まで時間がかかります。

今回は内部テストを行います。

# iTunes Connectユーザーの追加
テスターをiTunes Connectのユーザーとして追加します。iTunes Connectにログインしてユーザーと役割を選択してユーザーを追加します。TestFlightの内部テスターとなれる権限はよくわからなかったのですが、とりあえずDeveloperを選択しておけば内部テスターに追加されました。

![スクリーンショット 2017-01-28 17.27.47.png](https://qiita-image-store.s3.amazonaws.com/0/85182/5b67e31c-8809-df9f-c4ca-902278c9518f.png)

![スクリーンショット 2017-01-28 17.46.24.png](https://qiita-image-store.s3.amazonaws.com/0/85182/dd710986-bbdb-10b0-73a2-d9bce9447fce.png)

# アプリケーションをiTunes Connectにアップロードする
アプリケーションは[前回の記事](http://qiita.com/yokobonbon/items/d1f4f824ff1dbc738ad0)で使用したアプリケーションを利用します。Ad Hoc配信のプロビジョニンングプロファイルを使ったアプリケーションになります。

まずiTunes Connect上にアプリケーションを登録します。マイAppで+を押して登録します。

![スクリーンショット 2017-01-28 18.01.52.png](https://qiita-image-store.s3.amazonaws.com/0/85182/23301050-da23-698f-698a-8419697c7ab1.png)

Xcode上でProduct -> Archiveを選択。Upload to App Storeを選択する。

<img width="1224" alt="スクリーンショット 2017-01-28 17.55.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/a001fd9f-70ef-b7e2-f061-0657d9c44313.png">

開発チームを選択する。

<img width="1224" alt="スクリーンショット 2017-01-28 17.55.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/d5ed6254-b188-1058-01af-29c1c93ed91b.png">

ここでなぜかエラーがでてアップロードできない現象にあたりました。<font color=red>アイコンを設定していないとiTunes Connectへのアップロードに失敗するようです。</font> また社内のネットワークからのアップロードの場合もプロクシが越えられず失敗するようです。

Uploadはしばらく時間がかかりました。実際にiTunes Connectに表示されるまでもしばらく時間がかかります。

# 内部テストの開始
テスト対象のバージョンとテスターを選択してテストを開始します。iPhoneにTestFlightアプリケーションをインストールするとアプリケーションが利用可能となります。

<img width="888" alt="スクリーンショット 2017-01-28 21.39.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/a43b13a6-63a5-25b4-dc06-031c84634135.png">

上記のテストを開始するとメールがテスターに飛びます。テスターがメールに記述されているリンクからアプリケーションの利用が可能になります。

<img width="710" alt="スクリーンショット 2017-01-28 21.58.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/3a6d1ca9-de83-e8b0-8333-1da7ce30457a.png">

# 追記
iOS Development CertificateではTestFlightに出せないと考えていたのですが、TestFlightに普通にアップロードしてテストすることができました。TestFlight経由でのリリースの制限がまだよく理解できていないので、今後も継続して調査します。
Java doubleをゼロ除算しても例外発生しない

Effective JavaでEnumについて勉強してて、Enumが想定している通りになっているか確認するのにテストを書いていて少しはまったのでメモ

書いていたEnum
<pre>
public enum Operator {

　　　　　　　　// 他にPLUSとかある。
    DIVIDE("/") {
        double apply(double x, double y) { return x / y; }
    };
    private final String symbol;
    Operator(String symbol) { this.symbol = symbol;}
    @Override public String toString() { return symbol;}
    
　　　　　　　　abstract double apply(double x, double y);
}
</pre>

このクラスに対してテストクラス作成
<pre>
public class OperatorTest {

    @Rule
    public ExpectedException thrown = ExpectedException.none();
    
    @Test
    public void zeroDivide() {

        thrown.expect(ArithmeticException.class);
　　　　　　　}
}
</pre>

テスト失敗。
何気なく、0で除算したら例外発生するよなと思ってテスト書いてみたけど、
double型を0で割っても例外発生しないのですね。


こうすれば通る。
<pre>
@Test
public void zeroDivide() {
    assertThat(Operator.DIVIDE.apply(11, 0), is(Double.POSITIVE_INFINITY));
}
</pre>
3週間勉強してJava Bronzeに合格した

# 動機
仕事でソースコードを読んでいて、クラスってなんだ？
オブジェクト指向わからんぞ？
ってなったので、オブジェクト指向といえばJavaだろ（偏見）と勉強してみることにした。

ただ勉強するだけでは面白くないので、モチベを上げるために上記資格を受験することに決定。
知識を体系的に学ぶには資格は向いてると思っているのもあり。

# 状況の整理
- Javaは書いたことも今まで勉強したこともない
- 業務でコードを書くも、周りから学んだこともなく、クラスとかなにそれ状態
- 誰か助けて

# 勉強方法
勉強できる時間は仕事が終わって帰宅してからになるので、あまり時間は取れないと思うので、1冊をしっかりと読み込む方針に決定。

公式テキストか黒本か悩んだ結果。
[黒本](https://www.amazon.co.jp//dp/4844338293/ref=sr_1_1?ie=UTF8&qid=1485608656&sr=8-1)を使うことにしました。
この本を3周ほどして試験に挑みます。

# 結果
本日(2017/1/28)無事に解答率78％（60%以上で合格）で無事に合格することができました。
間違えた問題は継承関係とポリモーフィズムが大半で、復習を兼ねて勉強しようと思います。

ポリモーフィズムに関しては解説などを読んでもイマイチ理解ができないので、わりと真剣に悩んでいます。

これからJava Silverの試験勉強に向けて頑張ります。
ネストしたループ構造の内側から外側のループをredoする

久しぶりの投稿です。相変わらず Rubyist です。よろしくお願いします。

# なぜ内側から外側のループを redo したいの？
内側ループの中でエラーが生じたときに、外側ループを同じループでやり直しをさせたいことがあったのです。

# まずは `redo` の復習
`redo` って何だっけ？滅多に使わないから忘れるよね。

>##redo
例:

>```ruby
redo
```
文法:

>```ruby
redo
```
ループ条件のチェックを行なわず、現在の繰り返しをやり直します。
[制御構造 (Ruby 2.4.0)](https://docs.ruby-lang.org/ja/latest/doc/spec=2fcontrol.html#redo)

常に `redo` するなんてあり得ないので `if` 修飾子つけたり (`redo if ~~`) など、何かの条件を付けて書きますよね。

あと念のためですが

>ループとは

>- `while`
- `until`
- `for`
- イテレータ

>のいずれかを指します。

# ループ構造をネストさせると `redo` はどこをやり直す？
さきほどの記載にも
> 現在の繰り返しをやり直します。

とあったように、いまの繰り返し（ループ）をやり直します。つまりは最も内側のループをやり直します。

# 外側のループを `redo` したいのだけど
大域脱出（`catch` と `throw`）を使います。
具体的には [`Kernel.#catch`](https://docs.ruby-lang.org/ja/latest/method/Kernel/m/catch.html) のブロックを目的のループのすぐ内側に作ります。

## `catch` と `throw` の復習
>```ruby
result = catch do |tag|
  for i in 1..2
    for j in 1..2
      for k in 1..2
        throw tag, k
      end
    end
  end
end

>p result #=> 1
```
>[module function `Kernel.#catch` (Ruby 2.4.0)](https://docs.ruby-lang.org/ja/latest/method/Kernel/m/catch.html)

<br>
> `throw` は同じ tag を指定した `catch` のブロックの終わりまでジャンプします。
[module function `Kernel.#throw` (Ruby 2.4.0)](https://docs.ruby-lang.org/ja/latest/method/Kernel/m/throw.html)

上記の例では、`throw tag, k` によって `catch` ブロックの終わりの `end` までジャンプします。`throw` の第二引数 `k` が `catch` ブロックの返値になるので、変数 `result` は `1` になっています。

## では実際に外側ループの `redo` をやってみよう
外側ループを5周させますが、内側ループ（3周）の間にエラーが生じたら外側ループをやり直しさせます。

```ruby
5.times do |i|
  redo_flag = catch :redo_outer_loop_from_deep_loop do
    3.times do |j|
      begin
        p [i, j]
        raise RuntimeError if rand(10) == 0
      rescue => ex
        throw :redo_outer_loop_from_deep_loop, ex
      end
    end
  end
  p redo_flag #debug
  redo if redo_flag.class == RuntimeError
end
```
試しに実行させてみます。

```
[0, 0]
[0, 1]
#<RuntimeError: RuntimeError> # debug 出力
[0, 0]
[0, 1]
[0, 2]
#<RuntimeError: RuntimeError> # debug 出力
[0, 0]
[0, 1]
[0, 2]
3                             # debug 出力
[1, 0]
[1, 1]
#<RuntimeError: RuntimeError> # debug出力
[1, 0]
[1, 1]
[1, 2]
3                             # debug 出力
[2, 0]
#<RuntimeError: RuntimeError> # debug 出力
[2, 0]
[2, 1]
[2, 2]
3                             # debug 出力
[3, 0]
[3, 1]
[3, 2]
3                             # debug 出力
[4, 0]
#<RuntimeError: RuntimeError> # debug 出力
[4, 0]
[4, 1]
[4, 2]
3                             # debug 出力
=> 5
```
外側ループを5周させることが出来ていますし、内側ループのなかで `RuntimeError` エラーが生じたときには外側ループをやり直しさせることも出来ています。
なお debug 出力として `3` が返っているのは、内側ループが `3.times` ブロックであり、その返値が `3` になるためです。

# おねがい
もうちょっとキレイな書き方があれば教えてください。
【iOS】UILabelにPaddingをつける（Swift3対応）


## はじめに

以下の記事を**いいね**や**ストック**してくれる人がまだいるので、**Swift3**対応したやつに書き換えました。

[【iOS】UILabelにPaddingをつける - Qiita](http://qiita.com/ryokosuge/items/d5d291129da1bc8baea6)

ほぼ同じ内容ですが、Playgroundで遊んでみたのでそちらも参考にしてもらえればと思います。

## PaddingLabel

```swift:PaddingLabel.swift
class PaddingLabel: UILabel {
    
    @IBInspectable var padding: UIEdgeInsets = UIEdgeInsets(top: 4, left: 8, bottom: 4, right: 8)
    
    override func drawText(in rect: CGRect) {
        let newRect = UIEdgeInsetsInsetRect(rect, padding)
        super.drawText(in: newRect)
    }
    
    override var intrinsicContentSize: CGSize {
        var contentSize = super.intrinsicContentSize
        contentSize.height += padding.top + padding.bottom
        contentSize.width += padding.left + padding.right
        return contentSize
    }
    
}
```

`@IBInspectable`は無駄ですが、つけてみました。

## Playgroundとスクショ

以下`Playground`のソースコードとスクショです。

```swift:PaddingLabel.playground
//: Playground - noun: a place where people can play

import UIKit
import PlaygroundSupport

class PaddingLabel: UILabel {
    
    @IBInspectable var padding: UIEdgeInsets = UIEdgeInsets(top: 4, left: 8, bottom: 4, right: 8)
    
    override func drawText(in rect: CGRect) {
        let newRect = UIEdgeInsetsInsetRect(rect, padding)
        super.drawText(in: newRect)
    }
    
    override var intrinsicContentSize: CGSize {
        var contentSize = super.intrinsicContentSize
        contentSize.height += padding.top + padding.bottom
        contentSize.width += padding.left + padding.right
        return contentSize
    }
    
}

// preview
let previewSize = CGSize(width: 300, height: 300)
let view = UIView(frame: CGRect(origin: .zero, size: previewSize))
view.backgroundColor = .white

PlaygroundPage.current.liveView = view

let frame = CGRect(origin: CGPoint(x: 50, y: 10), size: CGSize(width: 200, height: 40))
let paddingLabel = PaddingLabel(frame: frame)
paddingLabel.backgroundColor = .black
paddingLabel.textColor = .white
paddingLabel.text = "padding label"
paddingLabel.font = UIFont.systemFont(ofSize: 22)
view.addSubview(paddingLabel)

let normalLabel = UILabel(frame: CGRect(x: 50, y: paddingLabel.frame.maxY + 20, width: 200, height: 40))
normalLabel.backgroundColor = .black
normalLabel.textColor = .white
normalLabel.text = "normal label"
normalLabel.font = UIFont.systemFont(ofSize: 22)

view.addSubview(normalLabel)
```

![スクリーンショット 2017-01-28 21.48.28.png](https://qiita-image-store.s3.amazonaws.com/0/47302/051960db-e71f-9d85-1148-20111174cb31.png "スクリーンショット 2017-01-28 21.48.28.png")

左にうまくPaddingが取れているのがわかるかと思います。

日本語フォントで英字を扱うときに沈んだりするのを回避するので`UILabel`に高さの制限をつけるのもありかと思いますが、ソースコードで解決するのもいいかなと思います。

## 終わりに

このまま昔書いたソースコードをSwift3で書き直していこうと思います。

以上です。
TriggerとOutlookを使って１タップで出社遅延連絡をする

自身はきちんと間に合うように出社したとしても、電車遅延や天候などによって時間どおりに出社できないことが分かると、上司にその旨を伝えることがあると思います。アプリを開いて、宛先を設定してメールを書くのも煩わしいので、Microsoft Flowを使って事前に準備しておけば効率的です。設定も5分もあればできますので紹介します。

#テンプレートの選択

<br>

今回はこのテンプレートを改良するところからスタートします。
（イチから作ってもそれほど難しくありませんが。。。）

<br>

![WS000016.JPG](https://qiita-image-store.s3.amazonaws.com/0/159178/4fe2ba24-d6d4-6782-dcdb-5d93d629dfb0.jpeg)

<br>

テンプレートはメールで知らせるだけでなく、Outlookのスケジュールも「病欠という」ステータスでブロックできるという優れもの。次回やってみたいと思います。

<br>

![WS000017.JPG](https://qiita-image-store.s3.amazonaws.com/0/159178/01037d5e-7d28-749e-852b-aa85dff91101.jpeg)

<br>

何度もいいますが、つなげるアプリ同士のアカウントは持っておく必要があります。

<br>

![WS0000118.jpg](https://qiita-image-store.s3.amazonaws.com/0/159178/c7c0116e-371a-a4e1-19df-b974d9571e87.jpeg)

<br>

テンプレートを開いて、一番最後のOutlookスケジュールを登録する「Create event」は今回不要なので削除しておきます。


![WS000019.JPG](https://qiita-image-store.s3.amazonaws.com/0/159178/5b969dcf-c156-a220-c46b-f1a1b6b56e4d.jpeg)


#テンプレートのカスタマイズ

<br>

では、次に今回作成するアプリ用にカスタマイズをしていきます。
手動でトリガーを起こす際に、メッセージを設定するとこで連携先のアプリ（今回はOutlook）にその値を引き継ぐことができます。

<br>

![WS000018.JPG](https://qiita-image-store.s3.amazonaws.com/0/159178/815280a9-28b1-8385-1a84-ffd89454a4bb.jpeg)

<br>

今回の場合だと、「遅れる時間をいれてください」とプロンプトを表示させて、遅れる時間を入力させるようにします。そうするとToken nameである、「Delay」にその値が設定されます。

<br>

これでトリガーの設定は一旦終わります。

<br>

次に宛先の設定です。送付先（今回は自分自身）および件名を入れて、本文を記載します。本文は固定の文以外にあらかじめ変数を入れておいて、その時々によって値を変更することができます。

<br>

本文の右下に「動的なコンテンツの追加」というリンクがあるので、それを押下すると対象となるコンテンツ一覧が以下のように表示されます。

<br>

![WS0000241.jpg](https://qiita-image-store.s3.amazonaws.com/0/159178/7d7f5bd9-4c45-0fdb-edf4-97ca4fed8b36.jpeg)

<br>

見ていただくと、その一覧の中に先ほどトリガーで設定した「Delay」が表示されているのが分かります。これが先ほど自分で設定したコンテンツになります。それをメールの文章に埋め込んでおくことによって、前回は30分だったけど、今回は1時間というように中身を変えずに使いまわしをすることができます。


#フローの実行

スマホからFlowを起動をして「ボタン」をタップすると、先ほど登録したアプリが表示されます。

<br>

![Screenshot_2017-01-28-20-37-14.png](https://qiita-image-store.s3.amazonaws.com/0/159178/f652d311-e1f8-fd16-e4f7-ab320b284e30.png)


<br>

アプリをタップすると、先ほど設定したプロンプトが表示されますので、そこに時間を入れます。

<br>

![Screenshot_2017-01-28-20-37-32.png](https://qiita-image-store.s3.amazonaws.com/0/159178/d4545946-73db-09bf-716d-784769029e8c.png)

<br>

すぐにメールが以下のように届きますので、確認すると「Delay」の箇所に正しく先ほど入力した時間が埋め込まれているのが分かります。

<br>

![WS000023.JPG](https://qiita-image-store.s3.amazonaws.com/0/159178/b51bb834-5ea7-7a2f-bf4b-deb07a5007d0.jpeg)

<br>


#まとめ

今回説明したような時間だけでなく、理由をきちんと伝えたい場合や出社遅延だけでなく病欠の際にも使いたい場合などはもっと埋め込み文字を増やしてやればもっと汎用的なものになると思います。埋め込み文字ばかりになると、結局イチからやっているのとあまり変わりなくなってしまうので要注意ですwwww
boost::program_optionsでは短いオプション名の指定に注意

boostを導入しOSに依存しないオプションを使えるようになりました。
凄く小さいところでハマったのでメモします。

# ハマリポイント
```shell-session:失敗例
$ ./src/main --help
Allowed options:
  -  [ --help ]         produce help message
  -  [ --greet ] arg    hi
```

```shell-session:成功例
$ ./src/main --help
Allowed options:
  -a [ --help ]         produce help message
  -b [ --greet ] arg    hi
```

何が違うのかパット見わからないと思いますが、短いオプション名が消えてしまっています。

# 原因
`add_options()`する際に、短いオプション名の前に空白を入れてしまっていたことでした。すなわち、

誤: `("help, a", "produce help message")`
　　　　　↓
正: `("help,a", "produce help message")`

最終的なソースファイルが以下になります。

```cpp
#include <iostream>
#include <boost/program_options.hpp>

namespace po = boost::program_options;

int main(int argc, char* argv[]){
    po::options_description desc("Allowed options");
    desc.add_options()
        ("help,a", "produce help message")  // option名にスペースを入れない！
        ("greet,b", po::value<std::string>(), "hi")
    ;
    po::variables_map vm;
    po::store(po::parse_command_line(argc, argv, desc), vm);
    po::notify(vm);

    if (vm.count("help")) {
        std::cout << desc << std::endl;
        return 0;
    }
    return 0;
}

```
WebRTCのgetUserMediaで取得した映像ストリームをVideoタグに表示する際のautoplayの有無による挙動の違いについて調べた

この記事は諸事情により、[このリンク先](https://sublimer.hatenablog.com/entry/2017/01/28/000000)に移行しました。
This article has moved to [this link](https://sublimer.hatenablog.com/entry/2017/01/28/000000) due to various reasons.