OmniAICreator/Qiita-1.07M huggingface dataset:
自宅LAN内のサーバに同じホスト名でSSHしたい


# 外から自宅鯖に繋ぐ設定について
自宅内に複数のサーバがあって、外からssh出来るように例えば以下のように静的NATの設定をルータにしてあったとする。（この辺の設定は各ご家庭のルータによるので割愛）

```
グローバルIP:22016 → 192.168.1.16:22
グローバルIP:22017 → 192.168.1.17:22
```

この時点で外から自宅の `192.168.1.１６` の鯖に繋ぐには以下のようにして繋がるわけだ。

```
ssh home.example.jp:22016
```

で、普段持ち歩く Macbook から外から簡単に繋げられるよう、まず以下の様な設定が元々してあったんだ。

```~/.ssh/config
Host h16
  HostName home.example.jp
  Port 22016

Host h17
  HostName home.example.jp
  Port 22017
```

これで外から自宅の `192.168.1.１６` の鯖に繋ぐには以下のように出来るようになる。

```
ssh h16
```

うん、便利。

# 問題と解決

## 問題：自宅LAN内から同じホスト名で繋げられない

うちの自宅ルータは糞なので、LAN内のアドレスから自分のグローバルアドレスに繋げることが出来ない！（多分ルータ内部のNAT実装が微妙で書き換えしくってるんだろうなぁ…。）

なので自宅からは `home.example.jp:22016` とかのアドレスではタイムアウトしちゃって繋ぐことが出来ない。ので当然 `ssh h16` とかも出来ない。
しかたがないのでこないだ迄は以下のように設定を追加して `ssh h16l` とかで繋げてたんだわ。

```
Host h16
  HostName home.example.jp
  Port 22016
Host h16l
  HostName 192.168.1.16
  Port 22

Host h17
  HostName home.example.jp
  Port 22017
Host h17l
  HostName 192.168.1.17
  Port 22
```

まぁ、何もないよりは大分楽っちゃ楽なんだがやっぱし時々、自宅なのに l 無しで繋げようとしたりその逆だったりで接続待ちと見せかけてタイムアウトとか言うことがしばしばありストレスが溜まってた。

ちなみに自宅LAN内にローカルDNSリゾレーションサーバ立てて一部ホストはローカルIP返してそれ以外は外部リゾルバにパススルーとかすればいいんじゃね？って意見もあるかと思う。が面倒くさい。昔やってたこともあるけど、DNS立てるのがまず面倒だし、DNS担当のLAN内サーバのメンテ中とか解決できなくてやっぱし不便だし、労多くして益少なしで嫌だった。
特に可用性確保が面倒くさい。こういうのは99.9%使えてても使えない0.1%の時のストレスが半端ないからなー。

## 解決： Match 便利！

でも最近は心穏やかさ。EL Capitanにアップデートした際に OpenSSH が上がって `~/.ssh/config` で `Match` が使えるようになったからね！

今は以下の様な設定が書いてあり、外でも自宅でも `ssh h16` で目的のサーバに繋げられるようになっている。

```~/.ssh/config
Match host h16 exec "/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I | grep -qE '^ +SSID: KWZ-HOME-[ag]$'"
  HostName 192.168.1.16
  Port 22
Host h16
  HostName home.example.jp
  Port 22016

Match host h17 exec "/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I | grep -qE '^ +SSID: KWZ-HOME-[ag]$'"
  HostName 192.168.1.17
  Port 22
Host h17
  HostName home.example.jp
  Port 22017
```

これは何かっていうと、今までは `Host` によるホスト名の条件分岐（精々ワイルドカードが使える程度） しかできなかったのが、`Match` を使うことでホスト名マッチングの他に、接続先または接続元のユーザ名や、果てはローカルコマンドの実行結果を複数ANDで組み合わせて条件が書けるようになったのだ（詳しくは`man ssh_config`）。

上記の設定ではまず `host h16` の部分がホスト名一致、続いて `exec "（略）"` が書いてある。これは exec に渡したコマンドの終了ステータスが `0` なら真という条件になる。

ちなみに `/(略)/airport -I` は例えば以下の様な出力が出てくる。

```
     agrCtlRSSI: -57
     agrExtRSSI: 0
    agrCtlNoise: -87
    agrExtNoise: 0
          state: running
        op mode: station
     lastTxRate: 130
        maxRate: 144
lastAssocStatus: 0
    802.11 auth: open
      link auth: wpa2-psk
          BSSID: 1c:b1:7f:70:16:20
           SSID: KWZ-HOME-a
            MCS: 15
        channel: 11
```

これは現在接続中の WiFi 情報で、`Match exec` の中ではこの出力に `grep -qE '^ +SSID: KWZ-HOME-[ag]$'` と grep をかけている。`KWZ-HOME-[ag]` は自宅WiFiの SSID (例)です。電波帯別に2種類のSSIDがあるのでこのどっちかにつながってたら自宅と判定しているわけだ。

うん凄い快適。

ちなみに `Match` に複数条件を書くと前の条件から順にテストして true なら次の式をテストし、一つでも失敗したらそれより右のチェックは行わないという仕様なので、頭に `host h16` と書いておくことで `h16` というホスト名で接続しようとした時のみに後半のコマンドが実行されるので無駄に exec される事が避けられるようにしている。

ちなみに `ssh_config` の設定は上の方で確定した設定は後半でマッチしても上書きされない、設定項目毎に先勝ちルールなのでその点を考慮しつつ設定を書く場所の順番を決めましょう。
IPアドレスについて【メモ】

とりあえずIPv4の話。

# IPアドレスの振り方
IPアドレスを管理している団体**IANA**(**I**nternet **A**ssigned **N**umbers **A**uthority)が分配している。

IANAは、IPアドレスを5地域に分配。

* アジア：APNIC
* ヨーロッパ：RIPENCC
* 北アメリカ：ARIN
* ラテンアメリカ・カリブ海：LACNIC
* アフリカ：AFRINIC

そして、それぞれの地域で各国の代表団体にIPアドレスを分配。
日本では**JPNIC**(日本ネットワークインフォメーションセンター)が代表団体。
その代表団体は、更にプロバイダとかそういうところにIPアドレスを分配している。

# サーバーのIPアドレス
**固定IPアドレス**を設定する。
前述のとおり、プロバイダ等のいろんな事業者にIPが配分されているので、サーバーを立てる際はそこからIPアドレスをもらって設定する。


# クライアントのIPアドレス
**動的IPアドレス**を設定する。
前述のとおり、プロバイダ等のいろんな事業者にIPが配分されており、事業者は接続拠点単位でIPアドレス群をプールしているので、そこから1つ貸出をする。
切断されたときはそのIPアドレスをもう一度プールに戻して、他のユーザーが使えるようにする。
そのため、接続するたびに異なるIPアドレスが割り当てられる。

# ルータを使用する場合
IPアドレスは1台しか接続できないので、複数台で使用したい場合にはルータが必要。
ルータには**NAT**(**N**etwork **A**dress **T**ranslation)というIPアドレスの変換機能が内蔵されている。
※NAT：多対多で変換する。一対多の場合はNAPT、もしくはIPマスカレードというらしい。
※企業ではNATをオフにして使うことが多い。

ルータにプロバイダから割り当てられたIPアドレスを設定し、クライアントにはルータに設定されているIPアドレスのプールから一つを割り当てる。
ルータに設定されているIPアドレスのプールは**プライベートIPアドレス**という。

## プライベートアドレス
 クラス|範囲 |サブネットマスク
|:-----------------|:------------------|:------------------|
|A|10.0.0.0～10.255.255.255 |255.0.0.0|
|B|172.16.0.0～172.31.255.255|255.255.0.0|
|C|192.168.0.0～192.168.255.255|255.255.255.0|


Aクラスは大規模ネットワーク向け、
Bクラスは中規模ネットワーク向け、
Cクラスは小規模ネットワーク向け。

**サブネットマスク**とは、プライベートIPアドレスを**ネットワーク部**と**ホスト部**にわける場合の、どこまでがネットワーク部になるかを示したもの。
ネットワーク部は固定で、ホスト部を各機器に割り当てる。割当には**DHCP**というプロトコルが使用されることが多い。


## 端末割当不可のもの
 アドレス|理由 |
|:-----------------|:------------------|
|X.X.X.0|ネットワークアドレス|
|X.X.X.1|ルーター自身のアドレス(に設定されていることが多い)|
|X.X.X.255|ブロードキャストアドレス|

**ネットワークアドレス**は、ネットワーク自身を表すアドレス。
**ブロードキャストアドレス**はネットワーク内に接続されているものにデータを送信される場合のアドレス。


## DHCP
IPアドレス等のネットワークの設定情報をクライアントに送る仕組み。
クライアント・サーバー方式で、DHCPサーバがネットワークアドレスを動的に割り当て、設定情報をクライアント側に送る。
(家とかだとルータが兼務してくれてたりするやうだ)
めざせpythonライブラリマスター （65）geopy

#【ライブラリ説明】
　住所→緯度経度　緯度経度→住所　変換ができる

#【プログラム】
　今回はvirtualenv上で実行したらUnicodeEncodeErrorが出たため、
　Anaconda2にダイレクトにpip installしました。
　ちなみにデフォルトエンコーディングをutf-8にしています。
　　参考サイト→[pythonのデフォルトエンコーディングをutf-8に変更する](http://qiita.com/puriketu99/items/55e04332881d7b679b00)

```py
# -*- coding: utf-8 -*-

from geopy.geocoders import Nominatim

geolocator = Nominatim()
location = geolocator.geocode("東京駅")
print (location.latitude, location.longitude)
# (35.68018575, 139.768196161308)

location = geolocator.reverse("35.68018575, 139.768196161")
print (location.address)
# 東京駅, 外堀通り, 中央区, 東京都, 100-6633, 日本
```
　ちなみに時々タイムアウトエラーがでます。

#【参考サイト】
　[pypi](https://pypi.python.org/pypi/geopy/1.11.0)
　[github](https://github.com/geopy/geopy)
画像をランダムで表示させる

##仕様
ロードの度に表示される画像がランダムで切り替わるようにしたい。

##js
```js:js
var randomImg = function () {
    var $target = $('[data-randomimg]'),
        //表示させたい画像の個数を配列に入れる
        ary = [1,2,3], 
        //ランダムで配列内の数字を取得
        i = ary[Math.floor(Math.random() * ary.length)],
        src;
    if(!$target.length) return;
    src = 'img/img_' + i + '.gif';
    $target.attr('src',src);
};

$(function () {
    randomImg();
});
```

##まとめ
わざわざ配列に画像の個数を入れるのがなんとも。
AWSのCognitoのUser PoolをiOSアプリで使うために参考にしたサイト集


業務でログイン機能のあるアプリを作成することになり、バックエンドにAWSを使うことになりました。
AWSの認証機能Cognitoが最近、よりユーザー管理がやりやすい機能「User Pool」をリリースしました。

いろいろ試行錯誤を続けてこのCognito User PoolでiOSのログイン機能を使ってみようと参考になった記事を一覧にしようと思います。




## 手順を教えてくれる記事

* [[新機能] Amazon Cognito に待望のユーザー認証基盤「User Pools」が追加されました！](http://dev.classmethod.jp/cloud/aws/cognito-user-pool/)

サンプルがObjective-Cだけど、コンソールのやり方まであるのでとってもわかりやすい。


* [Swift から AWS Cognito User Pools を使ってみた](http://qiita.com/ketancho/items/f96378723a29cf802354)

サンプルをSwiftで確認したい人向け。
AWSのフレームワークはObjective-Cで書かれているのでBridging-Header ファイルが必要みたい。
ここを気づかないでちょっとハマったからこの記事はおすすめです。


## 公式のリンク

### Cocoapod
* https://cocoapods.org/pods/AWSCognito

iOS9の方法がが参考になった。


### Github サンプルリンク


* https://github.com/awslabs/aws-sdk-ios-samples/tree/master/CognitoYourUserPools-Sample/Objective-C/

Cognito User Poolを使うサンプル。
言語はObjective-C。


* http://mobile.awsblog.com/post/TxGNH1AUKDRZDH/Announcing-Your-User-Pools-in-Amazon-Cognito

上記CognitoYourUserPools-Sampleの使い方を紹介するAWS公式ブログ。
Cognito User Poolをidentity pool に紐付けるやり方が最後に載っていた。
とても参考になる。紐付けるものなのか。。

* https://github.com/awslabs/aws-sdk-ios-samples/issues/77

AWSCognitoIdentityUserPool でUserPoolのインスタンスをSwiftでどう書くのかを教えてくれた。
サンプルコードがObjcなのでSwiftのコンバートにすこし手間取った。

## 最後に
随時更新予定
cocos2d-x 2.2.6 最小限の変更で libpng 脆弱性対応 

Googleよりlibpngの脆弱性に関するメールが届きました。デベロッパーコンソールにはこんなアイコンとメッセージが。

![image](https://qiita-image-store.s3.amazonaws.com/0/112613/635af3b1-bd35-abc8-f104-9b3503d7394e.png)

今後のアプリアップデートでは対応必須となるとのことで、以下の手順で実際に対応してみました。

まずcocos2d-xのフォーラムでスレが立ってたので、その手順で試しました。
http://discuss.cocos2d-x.org/t/cocos2d-x-2-2-6-android-security-issue-with-libpng-1-2-46-cve-2015-8540/30189

しかしこちらの環境では、zlibを追加するとzip_support 以下のファイルでコンパイルエラーが出ました。エラーを修正することも可能ですが、変更を最小限にしたかったため、

- libpngの脆弱性を回避できる程度のlibpngバージョン
- zlibに依存しないもの

を探してみました。

見つかったのがこちら。
https://github.com/cocos2d/cocos2d-x-3rd-party-libs-bin/tree/v3-deps-11

このパッケージをダウンロードして以下の手順でlibpngを置き換えました。

- 元々のlibpngをバックアップ。
- このパッケージのpngフォルダをlibpngに改名して配置。
- 新しいlibpngはフォルダ構成が元々のと若干違うので、元々のlibpngと同じ構成に修正。
- Android.mkも若干内容が違うので修正。

これでビルドも無事通り、早速アプリをアップデート。以下のようにデベロッパーコンソールから警告アイコンが消えました。

![image](https://qiita-image-store.s3.amazonaws.com/0/112613/06917fda-0fbf-9424-b312-5527e8adabb5.png)

ちなみにアルファ版としてリリースしただけでは消えず、製品版としてリリースしたときに消えました。アルファ版としてリリースした時点で、問題が解消したかどうかが知りたいところですね。
minitestでモジュールメソッドにstubを使う

# minitestとは

minitestはruby標準のテスティングフレームワーク。
標準だけど、[いろいろ経緯があって](http://qiita.com/jnchito/items/ff4f7a23addbd8dbc460)、バージョンや対応状況がコロコロ変わっていまいち広まってないみたい。
RSpecを使う人が多い中、minitestに関する情報はぐぐってもあんまりない状態(；´Д｀)

# モジュールメソッドにstubを使う方法

minitestでmockやstubを使う方法はこちら。
http://blog.willnet.in/entry/2012/12/05/004010

ただモジュールメソッドに対して適用する方法はなかなか見つからなかった。
いろいろ試してやっとできたので、紹介します。

以下は指定桁のランダムなhexを生成するという、stub置き換え対象のモジュールメソッド。

```rb
require 'securerandom'

module TestModule
  module_function

  def hex(length)
    SecureRandom.hex(length).slice(0, length)
  end
end
```

こういうのをメソッドを利用したクラスをテストするとき、stubに置き換えないとランダムな値のハンドリングがやりづらいという話。
以下がhexメソッドをstubに置き換えたテストケース。

```rb
require "minitest/autorun"

describe TestModule, :hex do
  describe "when length is passed" do
    it "should return hex value" do

      test_module_mock = MiniTest::Mock.new
      test_module_mock.expect :call, "0123456789abcdef", [16]

      TestModule.stub :hex, test_module_mock do
        hex = TestModule.hex 16
        hex.must_equal "0123456789abcdef"
        test_module_mock.verify
      end
    end
  end
end
```

ポイントは、

```
test_module_mock.expect :call, "0123456789abcdef", [16]
```

といった形でMockオブジェクトに対して `:call` メソッドを定義するのと、

```
TestModule.stub :hex, test_module_mock
```

とstubに置き換えたいメソッドを指定するところ。
なんで`:call`なのと思ったら、minitestのstubメソッドの実装にコメントで書いてあった。

```rb
  # Add a temporary stubbed method replacing +name+ for the duration
  # of the +block+. If +val_or_callable+ responds to #call, then it
  # returns the result of calling it, otherwise returns the value
  # as-is. If stubbed method yields a block, +block_args+ will be
  # passed along. Cleans up the stub at the end of the +block+. The
  # method +name+ must exist before stubbing.
```

実装でいうとこのあたり

```rb
    metaclass.send :define_method, name do |*args, &blk|
      ret = if val_or_callable.respond_to? :call then
              val_or_callable.call(*args)
            else
              val_or_callable
            end

      blk.call(*block_args) if blk

      ret
    end
```
miniestに関してはほんとに情報少ないので、ちょっと探してだめなら実装見た方がよっぽど早そうです。
中国画像処理のベンチャー企業SenseTime

画像処理のアプリ結構流行ってるので、自分にも少し研究しました。一応faceuというアプリを参考してdemoを作ってみました。使ってみるどころこのアプリ使っている画像処理のライブラリーを趣味になり、調べたところSenseTimeという会社のsdkを使っている
#SenseTimeとは？
中国は今創業ブームです、そのブームに乗り、ベンチャー企業は大勢立ち上げた、その一つはSenseTime([商汤科技](http://www.sensetime.com/))です。本社は香港、京都にも分社があり。
開発チームはほどんど海外有名大学卒業、画像処理分野の名人香港中文大学の[汤晓欧](https://www.ie.cuhk.edu.hk/people/xotang.shtml)教授と共同研究している。大手取引先はNVIDIAや中国公安第三研究所、DeNAなど
ちなみに今年sensetimeと同じく画像処理のベンチャー企業Face++との間競争はだんだん激しくなり、ネット上は結構炎上する
S3のWebsiteHostingによるWebサイトを特定のIPにのみ限定公開する方法 


S3のバケットポリシーを以下のようにする。
ポイントは **デフォルト拒否** にして、 **特定のIPのみ許可** というポリシーにする点。

許可するIPのみでは条件としては不十分なので、このようなポリシーにしましょう。

```
{
    "Version": "2012-10-17",
    "Id": "S3PolicyId1",
    "Statement": [
        {
            "Sid": "IPDeny",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::<your buckect>/*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "xxx.xxx.xxx.xxx/32",
                        "xxx.xxx.xxx.xxx/32",
                    ]
                }
            }
        },
        {
            "Sid": "IPAllow",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::<your buckect>/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "xxx.xxx.xxx.xxx/32",
                        "xxx.xxx.xxx.xxx/32"
                    ]
                }
            }
        }
    ]
}
```
【Rails】Unicornで動かす時の手順メモ

# Gemを追記する

```
gem 'unicorn'
```

# Install

```
bundle install
```

# config/unicorn.rbを追加

```
touch config/unicorn.rb
```

```config/unicorn.rb
# -*- coding: utf-8 -*-
worker_processes Integer(ENV['WEB_CONCURRENCY'] || 1)
timeout 150
preload_app true

# listen 8080
listen '/tmp/unicorn.sock'
pid '/tmp/unicorn.pid'
```

# 一旦portでListenして確認する

```config/unicorn.rb
listen 8080
# listen '/tmp/unicorn.sock' => コメントアウト
# pid '/tmp/unicorn.pid' => コメントアウト
```

```
bundle exec unicorn_rails -c config/unicorn.rb -E development
```
動くか確認する

# 動いたらngnxを設定する

```
upstream unicorn {
  server unix:/tmp/unicorn.sock;
}

server {
  listen 80;
  server_name sample.com;

  access_log /var/log/nginx/sample_access.log;
  error_log /var/log/nginx/sample_error.log;

  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://unicorn;
  }
}
```

```config/unicorn.rb
#listen 8080 => コメントアウト
listen '/tmp/unicorn.sock' 
pid '/tmp/unicorn.pid'
```

# nginxをリスタートする

```
sudo nginx -t
sudo service nginx reload
sudo service nginx restart
```
複数のインスタンスに一発でタグを設定する方法


あんまり使うことはないかもしれませんが、GCEのインスタンスのタグをファイアウォールルール以外でグルーピングしたりしたいときとかに使えるかなと思ったんで共有。
Developer Consoleでやります。

## ラベル

けっこうコンソール上で対象のリソースをフィルタリングする機能がインスタンスに限らず用意されてます。
インスタンスに関しては、実はこのラベルというもの、タグです。

**Ω Ω Ω< な、なんだってー!!**

![Compute_Engine_-_honto-development.png](https://qiita-image-store.s3.amazonaws.com/0/8637/f9ba3e2a-0e4e-0192-2192-e00785ebfb8c.png "Compute_Engine_-_honto-development.png")

## あとは簡単

インスタンスの一覧から対象のインスタンスをチェックボックスONにしてください。

![Compute_Engine_-_honto-development.png](https://qiita-image-store.s3.amazonaws.com/0/8637/32340153-f6d1-c9b8-c95d-874ff87cbb9f.png "Compute_Engine_-_honto-development.png")

で、先述のラベルボタンを押すと右に設定されているラベルが表示されます。

![Compute_Engine_-_honto-development.png](https://qiita-image-store.s3.amazonaws.com/0/8637/39ca62be-4a99-9cc5-aa3b-d06fde38b213.png "Compute_Engine_-_honto-development.png")


値は入れなくてもいいです。
選択したインスタンスにタグの一括登録・削除できますよ。
erlang + rebar3 + cowboyの最小構成


並列分散処理を得意とするerlangという関数型言語に興味のある方は多いではないでしょうか？
自分は身近にerlang識者がいたため、興味を持つ事になりました。
今回は、そんなerlangの入門として **「erlang + rebar3 + cowboy」** でHTTPサーバを構築したいと思います。

# erlangについて
並列分散処理に強い関数型言語。
OTP（Open Telecom Platform）フレームワークがすばらしい。

参考書の受け売りなので、ニュアンスが間違っているかもですが、大体こんな感じで書いてました。

# rebar3について
Erlangアプリケーションのコンパイル等一括で行ってくれる便利なツール。
また、erlangモジュール等のdependencies（依存関係）を一括管理してくれたりもしています。
rebar3より以前にrebarが存在しましたが2016年6月現在は非推奨となっており、rebar3の利用を勧められます。

# cowboyについて
Erlangで書かれた、小型かつ高速なHTTPサーバモジュール。

# 環境とIDE
* mac osx 10.9.5
* Erlang/OTP 17.5
* eclipse neon + erl ide

# rebar3インストール
rebar3のインストールはhomebrewを利用します。

```
$ brew install homebrew/versions/rebar3
```

# テンプレート作成
rebar3を利用してerl_baseテンプレートを作成します。

```
$ rebar3 new app erl_base
```

### フォルダ構成
```
erl_base(workfolder)
├─LICENSE
├─README.md
├─rebar.config
└─src
 　└─erl_base
 　 　├─erl_base.app.src
 　 　├─erl_base_app.erl
 　 　└─erl_base_sup.erl 
```

# deps（依存関係）設定
rebar.configのdepsにcowboyを追加します。
今回はcowboyだけ使うのでこれだけです。

``` rebar.config 
{erl_opts, [debug_info]}.
{deps, [
  {cowboy, ".*", {git, "git://github.com/ninenines/cowboy", {tag, "2.0.0-pre.3"}}}
]}.
```

erl_base.app.srcのapplicationsにcowboyを追加します。

``` src/erl_base.app.src
………
  {applications,
   [kernel,
    stdlib,
    cowboy
   ]},
………
```

# httpサーバ処理部分実装
erl_base.erlでは各アプリケーションを順番にstartさせています。

``` src/erl_base.erl
-module(erl_base).

-export([start/0]).

start() ->
    ok = application:start(crypto),
    ok = application:start(ranch),
    ok = application:start(cowlib),
    ok = application:start(cowboy),
    ok = application:start(erl_base).
```

erl_base_handler.erlファイルを作成します。
ここでは単純なjsonデータを返すような処理を実装しています。

``` src/erl_base_handler.erl
-module(erl_base_handler).

-export([init/2]).

init(Req, Opts) ->
  Req2 = cowboy_req:reply(200, [
    {<<"content-type">>, <<"application/json">>}
  ], <<"{'message': 'Hello world!'}">>, Req),
  {ok, Req2, Opts}.
```

最後にerl_base_app.erlにcowboy:start_httpを設置してhttpサーバ立ち上げ処理を実装します。
先ほど作成したerl_base_handlerをここで設定して `http://127.0.0.1/`にアクセスが来た時に処理を行うように対応しました。 

``` src/erl_base_app.erl 
………
start(_StartType, _StartArgs) ->
    Dispatch = cowboy_router:compile([
      {'_', [
        {"/", erl_base_handler, []}
      ]}
    ]),
    {ok, _} = cowboy:start_http(http, 100, [{port, 8010}], [
      {env, [{dispatch, Dispatch}]}
    ]),
    erl_base_sup:start_link().

………
```

# rebarでupgradeとcompile
depsに設定したcowboy等をupgradeしてcompileします

```
$ rebar3 upgrade
$ rebar3 compile
```

# サーバ起動
サーバを起動させます。

```
$ erl -pa ebin _build/default/lib/*/ebin -s erl_base -noshell
```

erlangが実行されたら
http://localhost:8010/
をブラウザーで確認してみると下図のようなページが表示されます。

<img width="592" alt="スクリーンショット 2016-06-21 17.01.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/98305/433aaec8-d05c-cc6c-1036-56ab2699c8d9.png">

また、サーバ起動をdaemon化させたい場合は以下のコマンドで実現出来ます。

```
$ erl -pa ebin _build/default/lib/*/ebin -s erl_base -noshell -detached
```

# github
上記対応を行ったソースコードをgithubにあげているので、興味がある方はcloneしてみて下さい。
https://github.com/yu-sa/erl_base

# まとめ
* すごく単純なページならすぐ立ち上げられるようです。
* まだ、並列処理の部分は全く触っていないので、ここからスタートして色々試して見たいです。
CakePHP　取得したデータを連結してセレクトボックスなどに表示する

#概要
findを使って取得したデータを連結してセレクトボックスに表示する

こんなかんじ
都道府県テーブルのidカラムとnameカラムをセレクトボックスに表示する
　[id] name
![image](https://qiita-image-store.s3.amazonaws.com/0/108485/680e1f6d-7d1e-b3d0-87e5-09a3daef3ff2.png)

# やってみよう
## 1. Controllerの処理
Hash::combineとfindはallを使って

```
 $this->set('bar', Hash::combine(
            $this->foo->region->find('all',['order' => ['region.id' => 'DESC']]),
            '{n}.region.id',
            [
                '[%1$s] %2$s',
                '{n}.region.id',
                '{n}.region.name',
            ]
        ));
```

## 2. Viewの処理
inputタグを使う
```
<td><?= $this->Form->input('region_id', ['class'   => 'w60par frmInDesign']) ?></td>
```
【Rails】websocket-railsをスタンドアローンモードで動かす

websocket-railsをunicornで動かすにはスタンドアローンモードじゃないとダメみたい。

> WebsocketRails can now be started as a standalone server to support non-eventmachine based web servers such as Phusion Passenger or Unicorn. The standalone server requires an active Redis server to enable publishing channel events to the WebSocket server from anywhere in your application.

# 環境
ubuntu 14.04

# redisをインストールする

スタンドアローンモードで動かすにはredisが必要なのでインストールする

```
sudo apt-get update
sudo apt-get -y install redis-server
```

```
redis-server --version
=> Redis server v=2.8.4
```
version 2.8.4が入りました

# スタンドアローンモードにする

```config/initializers/websocket_rails.rb
config.standalone = true
config.standalone_port = 3000 # なぜか3000じゃないと動かない
config.synchronize = false
config.redis_options = {:host => 'localhost', :port => '6379'}
```

# 起動と停止

起動

```
rake websocket_rails:start_server
```

停止

```
rake websocket_rails:stop_server
```

# 参考

https://github.com/websocket-rails/websocket-rails/wiki/Standalone-Server-Mode

https://github.com/syossan27/til/blob/master/rails/use-websocket-rails.md

http://qiita.com/Sert/items/6212cc46bdd8954f283b
既に入っている**envを全てanyenv管理にする

こんな状況。goenv入れようと思ったらインストールよく分からんの人だったので、anyenvから入れたら速攻入った。
もうanyenv管理してやろと思い、入れなおしは面倒だった。
なんとかanyenvそのまま突っ込めないかなと思ったら突っ込めた話。

# 現状
```
$ ls -d ~/.*env
/Users/hoge/.anyenv
/Users/hoge/.pyenv
/Users/hoge/.rbenv
```

# 移動
```
$ mv .rbenv ~/.anyenv/envs/rbenv
$ mv .pyenv ~/.anyenv/envs/pyenv
```

# ファイル編集
**\_profile の修正。こんな感じのやつらのパスを通さないようにする。

```
$ vim ~/.bash_profile
#export PATH="$HOME/.rbenv/bin:$PATH"
#eval "$(rbenv init -)"

#export PYENV_ROOT="$HOME/.pyenv"                                                                                                     
#export PATH="$PYENV_ROOT/bin:$PATH"                                                                                                  
#eval "$(pyenv init -)"   
```

# 確認
ターミナル再起動。

```
$ anyenv versions
goenv:
1.5
pyenv:
  system
* 2.7.11 (set by /Users/hoge/.anyenv/envs/pyenv/version)
  3.5.1
rbenv:
  system
* 2.2.2 (set by /Users/hoge/.anyenv/envs/rbenv/version)
  2.3.0-preview1
```

♡anyenv
Redux + React (Example: Todo List) の構成図

[Example: Todo List | Redux](http://redux.js.org/docs/basics/ExampleTodoList.html) に載っているサンプルアプリケーションの構成図を書いてみました。

<a data-flickr-embed="true"  href="https://www.flickr.com/photos/128994071@N07/27233941814/in/dateposted-public/" title="Redux_React_TodoList"><img src="https://c7.staticflickr.com/8/7138/27233941814_2690bfbbb6_c.jpg" width="800" height="670" alt="Redux_React_TodoList"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>

参考にしたサイト
-------------

- [Read Me | Redux](http://redux.js.org/)
ArduboyPlayTune について

備忘録も兼ねてメモしておく。
Arduboy のサンプルに [Tunes](https://github.com/Arduboy/Arduboy/tree/master/examples/Tunes) というのがあった。
そのサンプルにある一番最初の `score[]` が楽譜を意味するバイナリデータなんだけど、今回はこれを読みたい。
MIDIファイルから変換してくれるツールもあるので読めるようになる必要はないんだけど、バイナリデータがあったら読みたくなるのが世の常なのでしかたないね。


## 使われているライブラリ
[ArduboyPlayTune](https://github.com/Arduboy/ArduboyPlayTune)
これがそれ。
どうやらベースは Arduino の [Playtune](https://github.com/LenShustek/arduino-playtune) ライブラリらしい。

#楽譜のフォーマット
Playtune の楽譜バイトストリームはシンプルな「音符のON/OFF」コマンドと「停止」コマンドの3つで構成されている。

バイトの最上位ビットが1だった場合は以下のコマンドを意味する。

- **9t nn**： 音源 t の音符 nn を再生する。<br />
  音源の番号(t)は 0からスタートして、いくつ設定できるかはハードによって違う。<br />
音符の番号(nn)は 半音階(クロマティックスケール)のMIDI番号。<br />
60(10進数)で真ん中の C を表し、69で真ん中の A (440.0Hz)を表す。<br />
一番高い音は 127 で 12,543.9Hz の G
　
- **8t**：音源 t の音符を止める
- **F0**：楽譜終了(演奏の終了)
- **E0**：楽譜終了(最初からもう一度)

バイトの最上位ビットが0だった場合は停止コマンドを意味する。
最上位ビットを除いた7ビットとそれに続く8ビットでビッグエンディアンの 15ビット整数として扱い、その値が次のコマンドを実行するまでの停止ミリ秒を表す。
例えば `07 D0` だった場合は、 `0x07D0` ＝ `2000` なので 2000ミリ秒停止する。
停止コマンドが実行され停止している間は前に再生された音符が再生され続ける。

## とてもシンプル
なんか特にメモする必要ないくらいシンプルだった。
楽譜データはプログラムと一緒に Flashメモリ("PROGMEM")に格納して使う。
上で書いた音源の指定は Arduboy の場合は `0, 1, 2` の3つまでっぽい。


ちなみにMIDIファイルから変換してくれるツールはこれ
https://github.com/LenShustek/miditones
macでAtomをScalaに対応させる方法

macでAtomをScalaに対応させる方法を調べるのに苦労したため、同様に困っている方がいるのではと思い記事に書いておきます。

ターミナルを起動して、```
$ apm install language-scala
```以上。

Atomを使う人にとっては基本だから調べても書いてないんですかね？
トランザクションの隔離レベルの設定とtx_isolationのメモ

調査したので、メモを残した。

```
mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.6.10    |
+-----------+
```

トランザクションの隔離レベルは、変数を見ればわかる。
MySQLの場合、デフォルトは「REPEATABLEｰREAD」。

```
mysql> SELECT @@global.tx_isolation, @@session.tx_isolation;
+-----------------------+------------------------+
| @@global.tx_isolation | @@session.tx_isolation |
+-----------------------+------------------------+
| REPEATABLE-READ       | REPEATABLE-READ        |
+-----------------------+------------------------+
```

隔離レベルを設定するには、SET TRANSACTION構文を用いる。
TRANSACTIONには3つのスコープがある

* グローバル
* セッション
* 直後のトランザクション

「GLOBAL」も「SESSION」も指定しなければ、直後のトランザクションに対して適用される。

```
mysql> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

mysql> SELECT @@global.tx_isolation, @@session.tx_isolation;
+-----------------------+------------------------+
| @@global.tx_isolation | @@session.tx_isolation |
+-----------------------+------------------------+
| REPEATABLE-READ       | REPEATABLE-READ        |
+-----------------------+------------------------+
```
グローバルでも、セッションでもないので、変数の値は変わらない。

「SESSION」を指定すれば、そのセッションのそれ以降のすべてのセッションに適用される。

```
mysql> SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;

mysql> SELECT @@global.tx_isolation, @@session.tx_isolation;
+-----------------------+------------------------+
| @@global.tx_isolation | @@session.tx_isolation |
+-----------------------+------------------------+
| REPEATABLE-READ       | SERIALIZABLE           |
+-----------------------+------------------------+
```
セッションのtx_isolationが「SERIALIZABLE」に変わっている。


「GLOBAL」を指定すれば、それ以降に開始されたすべてのセッションに適用される。

```
mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

mysql> SELECT @@global.tx_isolation, @@session.tx_isolation;
+-----------------------+------------------------+
| @@global.tx_isolation | @@session.tx_isolation |
+-----------------------+------------------------+
| READ-UNCOMMITTED      | SERIALIZABLE           |
+-----------------------+------------------------+
```
グローバルのtx_isolationが「READ-UNCOMMITTED」に変わっている。

再接続すると、グローバルの設定がセッションに反映される。

```
mysql> CONNECT;
Connection id:    2
Current database: *** NONE ***

mysql> SELECT @@global.tx_isolation, @@session.tx_isolation;
+-----------------------+------------------------+
| @@global.tx_isolation | @@session.tx_isolation |
+-----------------------+------------------------+
| READ-UNCOMMITTED      | READ-UNCOMMITTED       |
+-----------------------+------------------------+
```
セッションのtx_isolationがグローバルと同じ「READ_UNCOMMITTED」に変わっている。
Zybo > Chronicles blog 49 > AMPの使用 > 7. OCMによるCore同士の通信 > memory map配置の調整 > System Level Control Registers / OCM Configuration register / by setting the appropriate RAM Hi bits

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Adam-Taylor-s-MicroZed-Chronicles-Part-49-Using-the-Zynq-SoC-s/ba-p/518579

Core0, Core1のOCM(4つの64Kbyte regions)の配置に関して

> The OCM memory map can be re organized so that it’s completely contiguous and located at the end of the address space. You can set this configuration using the <font color=red>System Level Control Registers</font>, <font color=red>the OCM Configuration register</font>, and by setting the <font color=red>appropriate RAM Hi bits</font>.
技術英語 > ex stock

ex stock

http://dictionary.cambridge.org/dictionary/english/ex-stock

> used to describe goods that buyers can have immediately because the seller has a supply of them available:

<hr>
上記を初めて見て混乱した理由は ex(元)の接頭辞を思い出したため。
ex-wife, ex-husbandなど。

ex stockのexのlong formは未消化のまま。
KUSANAGI for ConoHaのDBサーバ変更

お久しぶりのスズムシ[@rinri_suzu](https://twitter.com/rinri_suzu)です。

ConoHaでもKUSANAGIが使えるようになり、爆速Wordpressを体感している方も多いと思います。
ただ、KUSANAGIテンプレートをそのまま適用すると、DBサービスもKUSANAGIサーバに含まれてしまうので、スケールアップ・ダウンが難しくなってしまいます。

今回は、KUSANAGIを既に使用している状態から、DBを外部DBサーバに設定する方法です。

KUSANAGIを使用していて、スケールアップ・ダウンを心配すること自体が蛇足なのかもしれませんが・・・


#１.DBサーバの準備
DBを外に出すため、DBサーバの立ち上げを行います。
今回は、ConoHaの「アプリケーションサーバー」のテンプレート「DBサービス」を使用します。

ConoHaのDBサービスを使用する理由として・・・
　・phpMyAdminが使える
　・DBサーバのDMZ化（ローカルネットワーク）が簡単に行える
　・APIからDBをカスタマイズ出来る

ConoHaのDBサービス追加に関する作業手順は４つです。
　1)DBサーバの追加
　2)データベースの追加
　3)一般ユーザー（KUSANAGIで使用するユーザー）の追加
　4)phpMyAdminユーザー（データインポート作業用ユーザー）の追加

DBサーバの追加方法は[このべん　データベースサーバーを使う](https://www.conoha.jp/conoben/archives/9117)を参考ください。

※ConoHaのDBサービスでは、データベース・ユーザー名の前にプレフィックス文字がランダムで付与されます。

#3.KUSANAGIデータのエクスポート
このべんでは、データのエクスポート方法として、[All-in-One WP Migrationプラグインを使用した移行方法](https://www.conoha.jp/conoben/archives/3839)が紹介されています。
この方法が一番簡単にデータを吸い出せると思います。

KUSANAGIにSSHでログインし、コマンドラインでデータエクスポートでも当然OKです。

コマンドラインでのエクスポート（データベース名指定）

```
# mysqldump -u root -p [KUSANAGIで設定したデータベース名] > dump.sql
```


#4.DBサーバへのインポート
ConoHaのDBサービスを利用する場合、インポート作業はphpMyAdminで行います。

手順は非常に簡単でして・・・
　1)phpMyAdminにログイン
　2)インポート先データベース名を選択
　3)データファイルを取り込んで完了


【コマンドラインでエクスポートを行った場合のインポート手順】
![9.png](https://qiita-image-store.s3.amazonaws.com/0/100025/a0837915-b39a-eb9d-0d58-d4085275c7ca.png)

#4.wp-config.phpの変更
KUSANAGIのDB接続先の変更はwp-config.phpを書き換える必要があります。

wp-config.phpは通常であれば、/home/kusanagi/任意のプロファイル名/DocumentRoot　配下に保存されています。


wp-config.phpで編集する箇所はこの４カ所です

```wp-config.php
/** WordPress のためのデータベース名 */
define('DB_NAME', 'データベース名');

/** MySQL データベースのユーザー名 */
define('DB_USER', '一般ユーザー');

/** MySQL データベースのパスワード */
define('DB_PASSWORD', '一般ユーザーパスワード');

/** MySQL のホスト名 */
define('DB_HOST', '接続先ホスト名【グローバルネットワーク　もしくは　プライベートネットワーク】');
```


後はKUSANAGIで正しく内容が反映されているか確認するだけです。
動作確認後、KUSANAGIで動いていたDBサービスは停止、もしくは削除していた方が無難でしょう


(´・ω・`)これでYahoo砲も怖くないですね
UE4でHTC Vive(VR HMD)向けアプリをパッケージする時の注意点

UE4でHTC Vive向けのアプリをパッケージする際に、あるトラブルがあったので書きます。

#現象
UE4でHTC Vive向けのアプリを作成したのでパッケージングしたところ、Windowsアプリとして起動するだけでHTC Viveのヘッドマウントディスプレイに映らないといった現象がありました。

この時の嘆きのTwitterです。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">なぜかue4でパッケージしたヤツがviveで動かない！<br>何か設定がいるのか？</p>&mdash; 荻野雄季@東ゲ部スパイ (@YuukiOgino) <a href="https://twitter.com/YuukiOgino/status/745257414392373248">2016年6月21日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ただ普通にWindows用にパッケージしただけではHTC Viveに映りません。

※UE4.12.3で検証

#解決方法

エピックゲームズジャパンの下田様から、以下のRetweetを頂きました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/YuukiOgino">@YuukiOgino</a> Vive側の表示にならないという事でしたらどなたかが「stereo on」というコマンドを起動時に呼ぶようにすることで出来たと呟かれていた気がします。</p>&mdash; シモダジュンヤ Jun Shimoda (@junyash) <a href="https://twitter.com/junyash/status/745276107885150208">2016年6月21日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

なるほど！
早速頂いた情報を元に処理を一つ追加しました。

レベルブループリントのBeginPlayに以下の処理を追加します。

<img width="511" alt="execute.png" src="https://qiita-image-store.s3.amazonaws.com/0/104377/956669bd-7d6c-defa-03e3-0295354be418.png">

Execute Console CommandのCommandに「Stereo On」と記入するだけです。
これでHTC Viveのヘッドマウントディスプレイに、自分が作成したアプリが正常に表示されるようになります。

#お礼

下田様、お忙しい中お答えいただき、ありがとうございます！

#追記(2016/6/22)

alwei様から、この記事に書いた処理はOculus Rift CV1など最近のＶＲヘッドマウントディスプレイでは共通であるとリツイートがありました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">これはOculus Rift CV1など最近のVR HMDで共通ですね。僕もVRハッカソンで使いました。 <a href="https://t.co/9Phsmiw1Wv">https://t.co/9Phsmiw1Wv</a></p>&mdash; alwei@C90日-西ｄ64b (@aizen76) <a href="https://twitter.com/aizen76/status/745568913673465856">2016年6月22日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

この作業はＶＲ開発を行うのであれば必須です。
UE4でVRヘッドマウントディスプレイ向けのアプリをパッケージングをする時は、必ず「Stereo On」を記入しましょう。
diskutilでフォーマットできない時

#環境
MacOSX El Capitan 10.11.5
USBメモリ SP Silicon Power 8GB USB3.0

#エラーメッセージ
diskutilでUSBをフォーマットしようとしたら以下のようなエラーが出た
```Erase process has failed. Press done to continue```

#データを全てnullで埋める
フォーマットしたいUSBのパスを確認(今回は/dev/disk2)
```$sudo diskutil list ```
/dev/disk2 をアンマウント
```$sudo diskutil unmountDisk force /dev/disk2```
/dev/disk2をnullで埋める
```$sudo dd if=/dev/zero of=/dev/disk2 bs=1024```

#diskutilでフォーマット
diskutilでフォーマットできるようになってる。
FAT32など、必要な形式でフォーマットする。
Python リスト内包表記とジェネレータ

# Python リスト内包表記とジェネレータ
どちらもリストを生成するものだが、使いどころが違うので軽くまとめる。

## リスト内包表記
よくあるmap的なメソッドの書き方の一つ。Pythonにもmapメソッドはあるがリスト内包表記のほうが高速なのでこっちを使おう。

### リスト内包表記とmap

リスト内包表記

``` Python
names = ['Alice', 'Bob', 'Carl', 'Dave']

[name[0] for name in names] # => ['A', 'B', 'C', 'D']
```

mapメソッド

``` Python
names = ['Alice', 'Bob', 'Carl', 'Dave']

map(lambda name: name[0], names) # => ['A', 'B', 'C', 'D']
```

### if リスト内包表記
リストから条件に当てはまる要素のリストを新たに作りたいとき使える。
if を続けることで複数の条件を書くことも可能だし、もちろんandでも書ける。

``` Python
names = ['Alice', 'Bob', 'Carl', 'Dave']

[name for name in names if len(name) == 4] # => ['Carl', 'Dave']

[name for name in names if not len(name) == 4] # => ['Alice', 'Bob']

[name for name in words if not len(name) == 4 if len(name) < 5] # => ['Bob']

[name for name in words if not len(name) == 4 and len(name) < 5] # => ['Bob']

```

### 複数変数
zipを使うことで同時に複数リストから新たなリストを作ることができる。

``` Python
namesA = ['Alice', 'Bob', 'Carl', 'Dave']
namesB = ['Peter', 'Micheal', 'John', 'Harry']

[" ".join([x, y]) for x, y in zip(namesA, namesB)]
# => ['Alice Peter', 'Bob Micheal', 'Carl John', 'Dave Harry']


```

forを重ねることで多重ループを表現できる。


``` Python
namesA = ['Alice', 'Bob', 'Carl', 'Dave']
namesB = ['Peter', 'Micheal', 'John', 'Harry']

[" ".join([x, y]) for x in namesA for y in namesB]
# => ['Alice Peter',
#     'Alice Micheal',
#     'Alice John',
#     'Bob Peter',
#     'Bob Micheal',
#     'Bob John',
#     'Carl Peter',
#     'Carl Micheal',
#     'Carl John',
#     'Dave Peter',
#     'Dave Micheal',
#     'Dave John']
```

## ジェネレータ
ジェネレータは定義された式から要素を生成する事ができる。  
nextでジェネレータから値を取り出す事ができる。

```Python
g = (x ** 2 for x in range(5))

next(g) # => 0
next(g) # => 1
next(g) # => 4
next(g) # => 16
next(g) # StopIteration

```
ジェネレータを使うことで条件に合致したところで値を生成するのをストップしたりできる。ほかにも使いドコロはありますが。


*****
おまけ itertools

Pythonのモジュールにitertoolsというものがあって、これはいい感じにイテレータを生成するメソッドが実装されている。

たとえば組み合わせを列挙したいとき

```Python
import itertools
itertools.combinations('ABCD', 2) # => (A,B) (A,C) (A,D) (B,C) (B,D) (C,D)

```
これはあくまでイテレータを生成するのであってlistを生成するわけではないので注意。

***

このようなちょっとした記法とかを問題を解きながら学べるのがこれ。
[Udacity Design of computer programming](https://www.udacity.com/course/design-of-computer-programs--cs212)

pythonで機械学習をしている（しようとしている）ブログ  
[努力1mmブログ](http://takamichiblog.hatenablog.com/)
SVGとかCSSでマスクとかクリッピング

# Path2D

Canvasの新しいAPIらしい。
https://developer.mozilla.org/ja/docs/Web/API/Path2D/Path2D

SVGのパスの```ｄ=""```入れれば、そのパスが描画される。

https://github.com/google/canvas-5-polyfill
んで、これがPolyfill。
中に入ってる、svgpath.jsというParserが優秀っぽい？

Snap.svgでアニメーションさせたやつをCanvasで使うパターンもありかも？

# SVGマスク
SVGのなかで、```mask="url(#maskimg)"```これで画像マスクしてくれるらしい。
IE9〜対応なんでコレ結構あり？




# 色々書こうとしたけど、下のリンクがわかりやすいので諦めます。
https://codepen.io/yoksel/full/fsdbu/
ディレクトリ内のPNGファイルから一括でWebPを生成するシェルスクリプト

# この記事について
とあるAndroidアプリの画像リソース削減のために、webpコマンドラインツールの`cwebp`コマンドを利用してPNGファイルからWebPを生成しようと思ったのですが、すでに画像が多数使われているアプリなので、1ファイルずつコマンドを打って変換するのは辛いと感じました。そこで、ディレクトリ内のPNGファイルから一括でWebPを生成するシェルスクリプトを書きました。シェルスクリプト自体初めて書いたので、拙いスクリプトかと思いますがお納めください。

# 動作環境
- Mac OS X (El Capitan)
- webpコマンドラインツールがインストールされている

webpコマンドラインツールがインストールされていない場合は、

```
$ brew install webp
```

でインストールしておいてください。

# スクリプト
以下のスクリプトを書きました。

``` convert_png2webp.sh
for pngFile in *.png
do
    echo "start converting "$pngFile
    base=`basename $pngFile .png`
    cwebp $pngFile -o $base".webp" >/dev/null 2>&1
    echo "complete"
done
```

## 使い方
一括変換したいPNGが入ったディレクトリで、このスクリプトを実行してください。たとえば、"hoge.png"、"fuga.png"というPNGファイルが入っているディレクトリでこのスクリプトを実行すると、"hoge.webp"、"fuga.webp"というWebPファイルが生成されます。webp変換のオプションを利用したい場合は、適宜`cwebp`コマンドにオプションをつけてください。
毎日ブログを書く習慣を作るために、まずはGCP上でWordPressブログを立ち上げてみた

Google Cloud Platform上でWordPressを立ち上げてみた。Google Cloud Launcherで簡単に立ち上がるが、少しだけハマリポイントがあった。

前提条件は以下の2つ。

- Google Cloud Platformを既に使っている
- 独自ドメインを持っている（必須ではない）

スクリーンショット付きの解説記事は立ち上げたWordPress上に記載したのでそちらを参照のこと。

[毎日ブログを書く習慣を作るために、まずはGCP上でWordPressブログを立ち上げてみた](http://blog.apitore.com/2016/06/22/blog/)

次回は、Qiitaのようなマークダウン記法でのブログ執筆をWordPressでも出来ないか、WordPressのカスタマイズについて調べてみよう。
railsのscopeって何なんだ？

最近Railsを触っていてよく見かける

```app/model/hoge.rb
class Article < ActiveRecord::Base
  scope :published, -> { where(published: true) }
end
```
この<Font color="red">scope</font>!

分からないので調べてみました。



#1.scopeの使用方法

scopeを使用する理由
→よく利用する検索条件をあらかじめ準備することが出来る

```app/model/hoge.rb
class Article < ActiveRecord::Base
  scope :hogehoge, -> { where(published: true) }
end
```

スコープはモデルに定義するとクラスメソッドのように呼出せます！！

呼び出し方はいかの通りです！！

```app/controllers/hoge.controller.rb
Article.hogehoge # => hogehogeカラムが"true"のArticle達を取得
```

コントローラー側で書くロジックがすっきりしそうですね！

scopeなら再利用できるのでさらに便利です！！

もう少し開発していく中で気付いた点あれば付け加えて書きたいと思います！！
Homebrewがコケた時の対処法


HomebrewでComposerをインストールした時に、下記のようなエラーでインストールできなかった。

```
Error: An unexpected error occurred during the `brew link` step
The formula built, but is not symlinked into /usr/local
Permission denied - /usr/local/lib/php
Error: Permission denied - /usr/local/lib/php
```

```brew doctor```を打つと、解決方法を教えてくれる。

```
$ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry and just ignore them. Thanks!

Warning: /usr/local/lib isn't writable.

This can happen if you "sudo make install" software that isn't managed
by Homebrew. If a formula tries to write a file to this directory, the
install will fail during the link step.

You should probably change the ownership and permissions of /usr/local/lib
back to your user account.
  sudo chown -R $(whoami) /usr/local/lib

Warning: You have unlinked kegs in your Cellar
Leaving kegs unlinked can lead to build-trouble and cause brews that depend on
those kegs to fail to run properly once built. Run `brew link` on these:
    freetype
    jpeg
    libpng
    php71
    unixodbc
```

```sudo chown -R $(whoami) /usr/local/lib``` を実行
QiitaのスライドをMIDIでめくる

## Qiitaの[スライドモード](http://qiita.com/Qiita/items/4ff5873776992f0511d6)
投稿記事がそのままスライドに

- シンプルで便利
- フルスクリーンでプレゼンにも使える

---

## リモートでめくりたい

- Chrome拡張機能を使えばできそう
- JSなのでWeb MIDI APIが使える
- MIDI note on を受けたら⏪⏩ボタンをクリック

---

## できた

---

https://vine.co/v/5B51OYl130r
[![vine](https://qiita-image-store.s3.amazonaws.com/0/22455/33942b56-d260-2e09-22fd-b8f29e1011a6.png)](https://vine.co/v/5B51OYl130r)

---

```javascript:manifest.json
{
  "manifest_version": 2,
  "name": "QMidiCon",
  "description": "MIDI control pager for Qiita slide mode",
  "version": "1.0",
  "content_scripts": [
    {
      "matches": ["http://qiita.com/*"],
      "js": ["main.js"]
    }
  ]
}

```

---

```javascript:main.js
(function() {

	function nextSlide() {
		var btn = document.querySelectorAll(".slide_controller_btn");
		btn[1].click();
	}

	function prevSlide() {
		var btn = document.querySelectorAll(".slide_controller_btn");
		btn[0].click();
	}

	var MidiInterface = function() {
		var self = this;

		navigator.requestMIDIAccess().then(
			function(midi) {
				if (midi === undefined) return;
				for (var input of midi.inputs.values()) {
					input.onmidimessage = self.onMidi;
				}
			},
			function(msg) { console.log(msg); });

		this.onMidi = function(e) {
			if (e.data.length >= 3) {
				if (((e.data[0] & 0xF0) === 0x90) && (e.data[2] > 0)) {
					// note on
					if (e.data[1] % 2 === 0) { // note number
						nextSlide();
					} else {
						prevSlide();
					}
				}
			}
		}
	}

	var midi;
	midi = new MidiInterface();
})();
```

---
## 導入方法

- download https://github.com/aike/QMidiCon
- Chromeの「環境設定」→「拡張機能」
- 「デベロッパーモード」をチェック
- 「パッケージ化されていない拡張機能を読み込む」
- manifest.jsonとmain.jsがあるフォルダを選択
- Qiita側の設定不要！(他人のスライドでもOK)

---
## 実行方法

- MIDI機器を接続
- Chrome再起動
- Qiitaのスライドを開く（フルスクリーン可）
- ノートナンバーが偶数（ex. ド）で次のページ
- ノートナンバーが奇数（ex. シ）で前のページ

---
## スマホ

- [Web MIDI Browser](http://www.taktech.org/takm/WebMIDIBrowser/Web_MIDI_Browser.html) by Takashi Mizuhiki
- [Midisentation](http://aikelab.net/midisentation) by aike

を使えばMIDI over BLEで接続したiPhoneからも操作できる

---
# https://github.com/aike/QMidiCon
finatra はじめの一歩

playframework以外も触りたいなと思ったので、手を付けてみます。

構成としては finatra + quill あたりで考えています。

新しくスライドモード付いたみたいなんでお試し

---

# Finatra
http://twitter.github.io/finatra/

*Fast, testable, Scala services built on TwitterServer and Finagle.*

だそうです。

---

# とりあえず
finatra の公式のexampleをパクります
https://github.com/twitter/finatra/tree/master/examples/hello-world

---

普通に `sbt run` しようとしたら以下のようなエラーが出たので
↓のブログを参考に `sbt run -admin.port=:9001` とかやってみましたが、なぜか認識してくれず。。。
http://befool.co.jp/blog/chainzhang/tasting-twitter-finatra/
→コメント頂きました。（2016/07/14） `sbt 'run -admin.port=:9001'`で良いそうです。

```
org.jboss.netty.channel.ChannelException: Failed to bind to: 0.0.0.0/0.0.0.0:9990
        at org.jboss.netty.bootstrap.ServerBootstrap.bind(ServerBootstrap.java:272)
        at com.twitter.finagle.netty3.Netty3Listener$$anon$1.<init>(Netty3Listener.scala:338)
        at com.twitter.finagle.netty3.Netty3Listener.listen(Netty3Listener.scala:318)
        at com.twitter.finagle.server.StdStackServer$$anon$1.<init>(StackServer.scala:260)
        at com.twitter.finagle.server.StdStackServer$class.serve(StackServer.scala:212)
        at com.twitter.finagle.Http$Server.serve(Http.scala:306)
        at com.twitter.finagle.Server$class.serve(Server.scala:113)
        at com.twitter.finagle.Http$Server.serve(Http.scala:306)
        at com.twitter.server.AdminHttpServer$class.com$twitter$server$AdminHttpServer$$startServer(AdminHttpServer.scal
a:210)
```

---

しょうがないのでoverrideします

```scala:HelloWorldServer.scala

package helloworld

import com.twitter.finagle.http.{Request, Response}
import com.twitter.finatra.http.HttpServer
import com.twitter.finatra.http.filters.{CommonFilters, LoggingMDCFilter, TraceIdMDCFilter}
import com.twitter.finatra.http.routing.HttpRouter

object HelloWorldServerMain extends HelloWorldServer

class HelloWorldServer extends HttpServer {

  /*
   * Since Heroku only supports a single port per service,
   * we disable the Admin HTTP Server
   */
  override val disableAdminHttpServer = true

  override val defaultFinatraHttpPort = ":9000"
  override val defaultHttpPort = 9001

  override def configureHttp(router: HttpRouter) {
    router
      .filter[LoggingMDCFilter[Request, Response]]
      .filter[TraceIdMDCFilter[Request, Response]]
      .filter[CommonFilters]
      .add[HelloWorldController]
  }
}
```

---

# GET
これで `sbt run` で起動できるようになったので

`"http://localhost:9000/hi?name=World"`
で `Hello World` が返って来ます。

![2016-06-22_00h15_28.png](https://qiita-image-store.s3.amazonaws.com/0/39243/421a870f-eea2-bbf6-d5bc-5055abdc5513.png)

---

# post

![2016-06-22_00h31_06.png](https://qiita-image-store.s3.amazonaws.com/0/39243/d1150500-1e37-4640-26b7-9fb080ee2a49.png)

なんと！case classを定義しただけなのに動作します。
playframeworkだったら Json.reads とか定義しないとダメなのに！

---

↓
https://github.com/FScoward/handshake-api/tree/0.1
リンクのテキストを自動でドメイン名のみ表示する

リンク先のURLが長いときれいに見えないので、ドメイン名のみ表示する方法を探していたところありました。

```rb
URL.parse("http://example.com/hogehoge/hogehoge/").host

=> example.com
```

参考
http://stackoverflow.com/questions/8855236/given-a-url-how-can-i-get-just-the-domain
docker初心者がdocker童貞を喪失した時のメモ - インストール編

表題が若干ネタ気味ですが、勉強した時のメモを書き残してみます。

docker聞いたことあるけどvagrantやvirtualboxと何が違うのから始まったのですが、以下のサイトが参考になりました。
http://paiza.hatenablog.com/entry/docker_intro

今回はwindows10で導入しました。windowsの場合はdockerをvirtual-box状のlinux仮想マシン上で起動する形になります。
面倒な設定はいらず、Docker Toolboxをインストールするだけで全部できてしまいます。

[Docker Toolbox ダウンロード](https://www.docker.com/products/docker-toolbox)

![03.png](https://qiita-image-store.s3.amazonaws.com/0/10877/1d2084e8-99ad-8fdb-753f-8290c9fa6a38.png)

自環境では既にvirtual-boxは導入済みだったのでチェックを外しました。
まだ何も環境が構築されていない場合はFull Installationでいいかと思います。

インストール完了後、お決まりらしいのでこちらで動作確認します。

```bash
$ docker run hello-world
Hello from Docker.
This message shows that your installation appears to be working correctly.
```

こんなメッセージが出れば成功です。

次は好きなOSを起動してみましょう。自分はcentOSで環境構築したいので以下のようにやりました。

参考にしたのは、[mats116](http://qiita.com/mats116) さんの[Docker上でCentOSを動かす] (http://qiita.com/mats116/items/90a5d1490b38903b30ad) です。
※1年以上経過している記事らしいのでご了承ください。(それにしても自分勉強のタイミングが遅い。)

参照記事の焼き増しになってしまい恐縮ですが、

```bash
$ docker run centos /bin/echo ok
```
echoでokを出力するだけなのですが、この時点でcentosのコンテナがpullされてきます。


実際に中に入ってみます。コンテナを起動します。

```bash
$ docker run -i -t -d centos /bin/bash
```

オプションについては以下を参照ください。
http://docs.docker.jp/engine/reference/run.html

次に、現在動作しているプロセスを確認します。

```bash
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
ffe640193458        centos              "/bin/bash"         About a minute ago   Up 47 seconds                           pedantic_swirles
```

動作していればこんな感じでプロセスのリストが出ます。
表示されたプロセスを指定して、コンテナの中に入ってみます。

```bash
$ docker attach ffe640193458
[root@ffe640193458 /]#
```

無事入れました。

次回はdockerにもろもろインストールしてコンテナファイルを別のサーバーに適用していく過程を書いていきます。
scpどうすんの、とかもろもろ疑問があるのですがそれはまた次回から。
Ubuntu起動と同時に自動でターミナルを開く


UbuntuのGUIを開いたら何をしますか？
そう！ターミナルを開きますよね。
毎回手動で開くのが面倒なので起動（ログイン）時に自動で開くようにしました。

:::note info
Ubuntu 14.04/16.04/18.04/20.04 on VirtualBox で動作確認しました。
:::

## 方法

以下のファイルを作ります。

```
~/.config/autostart/gnome-terminal.desktop
```

ディレクトリが無かったら作ってください。（`$ mkdir -p ~/.config/autostart`）
ファイルの中身は以下のようにします。

```
[Desktop Entry]
Exec=gnome-terminal --maximize
Type=Application
```

`gnome-terminal`はターミナルを開くコマンドです。
`--maximize`は無くてもOKですが、どうせ毎回最大化するのと、
自分の環境だと`--maximize`無しだと左のLauncherと被ってしまったので付けました。

これで次回ログイン時から、ログインと同時にターミナルが開きます！やったー。
Vagrantfile 覚書

``vagrant init`` で生成される Vagrantfile のコメントの日本語訳。

#Vagrant.configure
Vagrant の設定を下記のブロック内へ記述する。
Vagrant.configure に記述されている “2” は設定のバージョンを表す。
(旧式の設定書式との後方互換をサポートしている)
設定について理解を深めたうえで変更を行うこと。

```rb
Vagrant.configure(2) do |config|
   config.プロパティ名 = 値
   .
   .
   .
   .
   .
   .
end
```

最も一般的な設定オプションを以下に記載する。
詳細は [オンラインドキュメント](https://docs.vagrantup.com/) を参照。

##config.vm.box
Vagrant の開発環境では box が必要となる。
ユーザは [box の検索](https://atlas.hashicorp.com/search) を行うことができる。

```rb
config.vm.box = "ubuntu/xenial32"
```

##config.vm.box_check_update
box の更新確認を無効化する。本設定を無効化した場合、
ユーザが ``vagrant box outdated`` を実行した時に box の更新確認が行われる。
更新確認の無効化は推奨しない。

```rb
config.vm.box_check_update = false
```

##config.vm.network(ポート転送)
ポート転送の関連付けを作成する。
ホストマシンのポートからゲストマシンのポートへの接続を許可する。
下記の例では “localhost:8080” からゲストマシンの 80 番ポートへ接続する。

```rb
config.vm.network "forwarded_port", guest: 80, host: 8080
```

##config.vm.network(プライベートネットワーク)
プライベートネットワークを作成する。ゲストマシンへ指定した IP を割当て、 
host-only ネットワークを介した接続を許可する。

```rb
config.vm.network "private_network", ip: "192.168.33.10"
```

##config.vm.network(パブリックネットワーク)
パブリックネットワークを作成する。一般的なブリッジネットワークを作成する。
ブリッジネットワークはネットワーク上の他の端末から接続することができる。

```rb
config.vm.network "public_network"
```

##config.vm.synced_folder
ゲストマシンへ共有フォルダを登録する。
最初の引数はホストマシンに実在するフォルダのパスを指定する。
第二引数はゲストマシンのマウントパスを指定する。
第三引数は省略することができる。

```rb
config.vm.synced_folder "../data", "/vagrant_data"
```

##config.vm.provider
プロバイダの設定を行う。
ユーザは任意のプロバイダを Vagrant へ適用することができる。
以下へ Virtual Box を使用する場合の例を掲載する:

```rb
config.vm.provider "virtualbox" do |vb|
   vb.プロパティ名 = 値
   .
   .
   .
   .
   .
   .
end
```

###vb.gui
仮想マシン起動時に VirtualBox GUI を表示する。

```rb
vb.gui = true
```

###vb.memory
仮想マシンのメモリー容量を設定する。

```rb
vb.memory = "1024"
```

プロバイダで使用できるオプションの詳細についてはオンラインドキュメントを参照。

##config.push
Vagrant Push による Atlas へのプッシュ方法を定義する。
FTP や Heroku 等、 [他のプッシュ方法](https://docs.vagrantup.com/v2/push/atlas.html) を利用することもできる。

```rb
config.push.define "atlas" do |push|
   push.app = "YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME"
end
```

##config.vm.provision
shell script によるプロビジョニングを有効にする。
プロビジョナとして Puppet, Chef, Ansible, Salt, Docker を
利用することができる。詳細は [オンラインドキュメント](https://www.vagrantup.com/docs/provisioning/) を参照。

```rb
config.vm.provision "shell", inline: <<-SHELL
   sudo apt-get update
   sudo apt-get install -y apache2
SHELL
```
MySQL の検索結果を Json array型で出力する利用例（stored function）


こんにちは。
MySQL の ```GROUP_CONCAT``` + Json の array型 [^1] の利用として、 stored function を作って試しました。自己レコードを除く検索を行うという例です（```other_ids ```：  Json の array型）。

[^1]: 「[MySQL の検索結果を Json array型にする方法](http://qiita.com/kkdd/items/f9c0b064439d450501b3)」

```mysql
CREATE TABLE my_table (id integer not null);
INSERT INTO my_table (id) VALUES (1), (2), (3), (4);
CREATE FUNCTION other_ids (id_excluded integer) RETURNS json DETERMINISTIC RETURN (select CAST(CONCAT('[', GROUP_CONCAT(id), ']') as JSON) FROM my_table WHERE id != id_excluded);
SELECT id, other_ids(id) as other_ids, JSON_OBJECT(CAST(id as CHAR), other_ids(id)) as json_object from my_table;

+------+-------------+------------------+
|   id | other_ids   | json_object      |
|------+-------------+------------------|
|    1 | [2, 3, 4]   | {"1": [2, 3, 4]} |
|    2 | [1, 3, 4]   | {"2": [1, 3, 4]} |
|    3 | [1, 2, 4]   | {"3": [1, 2, 4]} |
|    4 | [1, 2, 3]   | {"4": [1, 2, 3]} |
+------+-------------+------------------+
```

なお、temporary table の場合は、エラーとなりますが（```Can't reopen table```）、もう一つ同一内容の temporary table を作れば回避できます。

```mysql
CREATE temporary TABLE my_table (id integer not null);
CREATE temporary TABLE my_table_clone like my_table;
INSERT INTO my_table (id) VALUES (1), (2), (3), (4);
INSERT INTO my_table_clone SELECT * FROM my_table;
CREATE FUNCTION other_ids (id_excluded integer) RETURNS json DETERMINISTIC RETURN (select CAST(CONCAT('[', GROUP_CONCAT(id), ']') as JSON) FROM my_table WHERE id != id_excluded);
SELECT id, other_ids(id) as other_ids, JSON_OBJECT(CAST(id as CHAR), other_ids(id)) as json_object from my_table_clone;
```
-----------------