OmniAICreator/Qiita-1.07M huggingface dataset:
さくらのVPS(Cent OS6.8)でLet's Encryptを自動更新する方法

#Cent OSのVPSでLet's Encryptに対応させる

[Let's Encryptを用いてさくらVPSをHTTPS対応させる - Qiita](http://qiita.com/kz_morita/items/ba9c171633ca54d72d2a)

こちらに書かれている記事とほとんど同一の方法で対応しました。
バーチャルホストによる対応も一緒です。

#Let's Encryptを自動更新させる

[Let's EncryptのSSL証明書を自動更新して、結果をメール通知するスクリプトを書いてみた（WEBROOT、NGINX用） - KITA Eng.](http://kitaeng.hateblo.jp/entry/2016/01/31/135554)

更新方法としてはこちらに書いてあるスクリプトを参考に設置してみたものの、動かしてみると`No package python-virtualenv available.`みたいなエラーが出て、動きません。Pythonのバージョン違いが原因ですね。

そのためsclで対応しますが、こちらのコードではsclに対応した書き方ではないため、少し改良したのが以下のコードです。あとnginx用だったので、apache用にも変更してます。

```/root/crontab/letsencrypt-renew.sh
#
# Copyright (c) 2016 Katsuya SAITO
#
# @(#) letsencrypt_cert_autoupdate_webroot.sh ver.0.1.0 2016.01.31
#
#######################################################

# CONFIGURE SECTION ---#

CMD_PATH=/home/user/letsencrypt
LOG_FILE=/var/log/letsencrypt/renew.log
CN="domain"
MAIL_TO="root"
today=`date +%F-%a-%T`

echo "# Let's Encrypt Cert autopudate Start: $today" >$LOG_FILE
/etc/init.d/httpd stop
scl enable python27 "$CMD_PATH/letsencrypt-auto certonly --standalone -d $CN --renew-by-default" >>$LOG_FILE
/etc/init.d/httpd start
today=`date +%F-%a-%T`
echo "# Let's Encrypt Cert AutoUpdate End: $today" >>$LOG_FILE

cat -v $LOG_FILE | mail -s "[Let's Encrypt Auto Update] Update Report for $CN" $MAIL_TO

exit 0
```

ポイントは
`scl enable python27 "$CMD_PATH/letsencrypt-auto certonly --standalone -d $CN --renew-by-default"`
のところかと思います。
sclをcronで利用するには、
`scl enable cmd_name bash`
ではなく、
`scl enable cmd_name ""`
というようにsclで処理を囲んであげる必要があるようです。

更新に成功すると、以下のようなメールが飛んで来ます。

```renew-success-mail
# Let's Encrypt Cert autopudate Start: 2016-07-01-M-eM-^\M-^_-03:00:00
Upgrading certbot-auto 0.8.0 to 0.8.1...
Replacing certbot-auto...
Creating virtual environment...
Installing Python packages...
Installation succeeded.
Version: 1.1-20080819
Version: 1.1-20080819
^[[?1034hIMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/domain-name/fullchain.pem. Your cert will
   expire on 2016-09-30. To obtain a new or tweaked version of this
   certificate in the future, simply run letsencrypt-auto again. To
   non-interactively renew *all* of your certificates, run
   "letsencrypt-auto renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

# Let's Encrypt Cert AutoUpdate End: 2016-07-01-M-eM-^\M-^_-03:01:28
```

あとはこれをcronで
`sh letsencrypt-renew.sh`
とかで月一回動かしてあげれば、自動更新されると思います。
複数ドメインをVirtual Hostで運用していても、ドメイン別に用意すればよいので管理が楽になると思います。

```sample
0 3 1 * * sh /home/domain1/crontab/letsencrypt-renew.sh
0 3 1 * * sh /home/domain2/crontab/letsencrypt-renew.sh
```
2次元配列や辞書や独自クラスのリストのソートの方法



### 2次元配列のソート

```py
>>> hoge = [[10,4],[4,9],[5,0],[4,5],[2,0],[3,5]]
>>> sorted(hoge)
[[2, 0], [3, 5], [4, 5], [4, 9], [5, 0], [10, 4]]
>>> sorted(hoge, key=lambda x:x[1])
[[5, 0], [2, 0], [10, 4], [4, 5], [3, 5], [4, 9]]    # 2番目の要素でソート
>>> hoge
[[10, 4], [4, 9], [5, 0], [4, 5], [2, 0], [3, 5]]    # sortedでは元の配列は変化しない
>>> hoge.sort(key=lambda x:x[0])
>>> hoge
[[2, 0], [3, 5], [4, 9], [4, 5], [5, 0], [10, 4]]    # 先頭要素でソートすると [4, 9], [4, 5] の順序
>>> hoge.sort()
>>> hoge
[[2, 0], [3, 5], [4, 5], [4, 9], [5, 0], [10, 4]]    # 全要素でソートすると [4, 5], [4, 9] の順序
```


### 辞書をソート by key

```py
>>> d = {'Yamada': 100, 'Sato': 50, 'Kobayashi': 75}
>>> sorted( d.items() )
[('Kobayashi', 75), ('Sato', 50), ('Yamada', 100)]
```

### 辞書をソート by value

```py
>>> sorted(d.items(), key=lambda x:x[1])
[('Sato', 50), ('Kobayashi', 75), ('Yamada', 100)]
```

### 独自クラスのリストをソート

準備

```py
>>> class Seiseki:
...     def __init__(self, name, tensu):
...             self.name = name
...             self.tensu = tensu
...     def output(self):
...             print("Name:{0}, Tensu:{1}".format(self.name, self.tensu))
... 
>>> ll = [Seiseki('Yamada', 100), Seiseki('Sato', 50), Seiseki('Kobayashi', 75)]
>>> for l in ll:
...     l.output()

Name:Yamada, Tensu:100
Name:Sato, Tensu:50
Name:Kobayashi, Tensu:75

```

#### sort by name

```py
>>> ll.sort(key=lambda x: x.name)
>>> for l in ll:
...     l.output()
... 
Name:Kobayashi, Tensu:75
Name:Sato, Tensu:50
Name:Yamada, Tensu:100
```

#### sort by tensu

```py
>>> ll.sort(key=lambda x: x.tensu)
>>> for l in ll:
...     l.output()
... 
Name:Sato, Tensu:50
Name:Kobayashi, Tensu:75
Name:Yamada, Tensu:100
```
VBAHaskellの紹介 その26（パイプライン演算子）

昨日(2016年7月3日)、[「F#談話室(23)」](http://connpass.com/event/32747/)というconnpassの勉強会に誘われて出席した。F#のことは全く知らないし、話し合われていた内容のことは理解できなかったが「パイプライン便利だよー、パイプライン。」という言葉が気になったので、それがどういうものか質問してみた。

[MSDN](https://msdn.microsoft.com/ja-jp/library/dd233229(v=vs.120).aspx)を見ると、「パイプライン処理を使用すると、複数の関数呼び出しを一連の操作として連結することができます。」として以下のような例が出ている。

```fsharp
let function1 x = x + 1
let function2 x = x * 2
let result = 100 |> function1 |> function2
```
上の場合、結果は 202 になる。← (100 + 1) * 2

懇親会の席でいろいろ聞いて「メソッドチェーンと意味合いは同様だけれども、外部関数を連結させられるのがポイントだ」とその場では理解した。とにかく左から右につなげて書くことで便利になる場合もあるのだろう。そこから先はまだわからない。

とりあえずパイプライン演算もどきをネタとしてVBAHaskellに追加してみる。

VBAでは構文上の制約から、メソッドチェーンで表現せざるを得ないし、処理の開始と終了はそれぞれ「オブジェクトの生成」と「値の取り出し」という形で明示的に書くしかなさそうだ。たいていの場合オブジェクトは使い捨てで十分だからNewするのではなく、**pipe**というファクトリ関数に初期値を与えて生成することにした。値の取り出しはProperty Getでいいだろう。
結論としては、下のような書き方のパイプラインもどきとなった。（コメントは削除する必要がある）

```vbnet
? pipe(3) _                 ' 初期値 3 でオブジェクト生成
 .→(p_plus(10)) _           ' + 10
 .→(p_mult(10)) _           ' * 10
 .→(p_minus(, 3)) _         ' - 3
 .val                       ' 結果の取り出し
 127 
```
F#のような簡潔さはないし、もともとVBAHaskellにはfoldl_Funsやfoldr_Funsといった関数合成の方法はある。しかしそれらは関数列を配列で与えるので1回走らせたらそれで終わりだ。パイプラインの書き方だと途中経過を見たあと処理を再開をするといった使い方ができるので、使い道はあるかもしれない。

クラスモジュール（[vh_pipe.cls](https://github.com/mYmd/VBA/blob/master/vh_pipe.cls)）はかなり簡単にできた。
値を保持するVariant変数**ret**を持ち、与えられた関数を適用した結果をswapで上書きしていくだけだ。

```vbnet
'vh_pipe.cls
    Private ret As Variant

Public Function →(ByRef fun As Variant) As vh_pipe
    swapVariant ret, applyFun(ret, fun)
    Set → = Me
End Function
```

* * *
[VBAHaskellの紹介 その25（乱数生成：メルセンヌ・ツイスタ mt19937）](http://qiita.com/mmYYmmdd/items/2a2d3c7544ad4dc01955)
[VBAHaskellの紹介　その1　（最初はmapF）](http://qiita.com/mmYYmmdd/items/c731edf943acc0a0ebe9)
[GitHub VBAHaskell](https://github.com/mYmd/VBA)
[リファレンス](http://home.b07.itscom.net/m-yamada/vh_Manual/VBAHaskell_reference.htm)
Goのtime.Timeをきちんと検証したことなかったので気になってたことを試してみた。

今回の検証はこちらで再現できます。
https://play.golang.org/p/rFNAYZj-Xn

# time.Unix()について振り返り

Godocを見るとこうなっている

```go
func Unix(sec int64, nsec int64) Time
```

`sec` にUnix秒を、`nsec` にナノ秒を渡してあげるとtime.Time型が返ってきます。

# secにマイナス値って渡せるの？

Unixタイムスタンプで管理されてるはずなので、secとnsecが0の場合は
`1970-01-01 00:00:00 +0000 UTC` が返ってくるはず！！

その場合、それ以前の日付って設定出来るの？

## 0の場合を確認する

```go
package main

import (
	"fmt"
	"time"
)

func main() {
	base := time.Unix(0, 0)
	fmt.Printf("Base: %s\n", base.UTC())
	// Base: 1970-01-01 00:00:00 +0000 UTC
}
```

`1970-01-01 00:00:00 +0000 UTC` が返ってきた（想定通り）

## マイナスの場合を確認する

```go
package main

import (
	"fmt"
	"time"
)

func main() {
	minus := time.Unix(-10000, 0)
	fmt.Printf("Minus: %s\n", minus.UTC())
	// Minus: 1969-12-31 21:13:20 +0000 UTC
}
```

`1970-01-01 00:00:00` 以前の日時が返ってきた！！　Σ(ﾟ∀ﾟﾉ)ﾉｷｬｰ
これは他の言語の日付処理から考えると結構すごい。

# int64の最大値設定したらどうなるの？

```go
package main

import (
	"fmt"
	"time"
)

func main() {
	max := time.Unix(9223372036854775807, 0)
	fmt.Printf("Max: %s\n", max.UTC())
	// Max: 219250468-12-04 15:30:07 +0000 UTC
}
```

きちんと値が返ってきた！！
これで219250467年までは安泰だわ
**( ﾟ∀ﾟ)ｱﾊﾊﾊ八八八ﾉ ヽﾉ ヽﾉ ヽ**
ってそんな生きれないし...

# int64の最小値設定したらどうなるの？

## 最小値設定する

```go
package main

import (
	"fmt"
	"time"
)

func main() {
	min := time.Unix(-9223372036854775807, 0)
	fmt.Printf("Min: %s\n", min.UTC())
	// Min: 219250468-12-04 15:30:09 +0000 UTC
}
```

未来の日付が返ってきた。
予想してたけど、ちょっと残念

## どこらへんまでまともに動くのか？

```go
package main

import (
	"fmt"
	"time"
)

func main() {
	min2 := time.Unix(-9223372006854775807, 0)
	fmt.Printf("Min2: %s\n", min2.UTC())
	// Min2: -219245579-09-25 13:49:53 +0000 UTC
}
```

どこまでいけるかはわからないけど、それなりの値を設定しても問題なく動く。
こんな値設定する機会は滅多にないから大丈夫かな
ちなみに2億年前って恐竜が出現しはじめたあたり
ロードバランサーの基本とELB


ロードバランサについて知らなかったので調べてまとめてみました。ついでにAWSのELBについても触れています。

# ロードバランサとは何か？

外部からの処理要求を複数の装置に振り分けることで、処理要求先の装置の負荷を分散させる装置。負荷（load）を分散（Balance）させる。一言で言うと「負荷分散装置」。

そしてこれがもたらす効能は主に「可用性」である。

前提としては、処理応答するサーバーが複数台数あること。

# どうでもいい例
閑話休題。
ここは駐車場である。駐車場は3エリア（Webサーバ）ありそれぞれに駐車場管理者がおり、またどこの駐車場が空いているかチェックしている振り分け担当者（ロードバランサ）がいる。日曜日になると、大混雑する（アクセス過多）。

振り分け担当者は3つの駐車場がどれくらい空いているかを駐車場管理者と連絡を取って空き具合を確認し、駐車場に来た新しい車を振り分ける役割をしている。
振り分け方法として一番簡単なのは、各駐車場に対して順繰りに車を振り分ける方法だ（ラウンドロビン方式）。駐車場のサイズが全部一緒であれば、このやり方は一定確率でうまくいくだろう。しかし、駐車場のサイズが違う場合は、このやり方ではうまくいかない。適宜駐車場の管理人と連絡し、各々の駐車スペースの占有率等を確認する必要がある（ヘルスチェック）。

...という風に、考えると理解しやすいかもしれない。



以下、ロードバランサ機能を述べる。
だいたい3つくらいである。

+ リクエストの振り分け
+ セッション維持
+ 振り分け先の故障監視

## リクエストの振り分け
名前の由来でもある機能。どう振り分けるかという部分でいろいろ違いがある。がシンプルに考えると、優先すべき箇所として大きく2つに分けられる。と思う。

+ 通信の状態
+ 振り分け先のサーバの状態

前者の場合、コネクションの数やデータ通信量がどうかという部分で振り分ける。後者の場合、CPU、メモリ、応答時間が短い等を優先させる。

## セッションの維持
同じユーザから来た処理要求を同じところに振り分けること。これはどうして必要かというと、ログインする必要のあるサービスでは、ログインした次の画面で、別のサーバーに飛ばされると、またログインをやり直してユーザーの認証を行わなければならないからである（ログインしたという情報は基本的に、サーバ間をまたぐことができない。）

というわけで、ログインした後からは同じサーバに接続をし続ける必要があり、それを可能にするため要求元のIPアドレスや、ブラウザにcookieを埋め込んで判別を行っている。

+ ヘルスチェック
LBが振り分ける先のサーバが正常に稼働しているか否かを常にチェックする仕組み。これにより、ダウンしているサーバには処理要求を振り分けない戸言うことができるようになる。これは可用性に大いに貢献している。


さて、これがAWSでも提供されているのである。Elastic Load Balancingと呼ばれるサービスだ。

# AWS ELBについて
AWSのクラウド上で利用できるロードバランシングサービス。
前提としてはAWSのEC2に振り分ける。

# 特徴
### スケーラブル
ELB自体も負荷の増減に応じて自動でスケーラブルに設定可能。ただこれはアクセス数がスパイクしたときには対応不可能。リクエスト数の急増の場合はHTTP ステータスは503を返すようになっている。
これに対する解決策としてはPre-Warming等がある。

### 安価な従量課金
そうらしい。正直コストに関して判断できません。。

### 運用が簡単
管理コンソールでぽちぽち。

### セッションの維持
スティッキーセッションと呼ばれる。同じユーザから来たリクエストを全て同じEC2インスタンスに送信する。ELBの独自のセッションCookieにより実現されている。デフォルトでは無効になていおり、自分で有効にする必要がある。




# 参考
こちらを参考にさせていただきました。
http://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-elastic-load-balancing

追記) ELBのベストプラクティス
http://aws.amazon.com/articles/1636185810492479
JAX-RSのBean Validationの基礎

JAX-RSにはBean Validationを使って渡されるパラメータを検証することができる。その使い方。

```build.gradle
    compile group: 'org.glassfish.jersey.ext', name: 'jersey-bean-validation', version: '2.23.1'
```

アノテーションを使ってパラメータを記述する。

```Hello.java
package example.jaxrs;

import javax.validation.constraints.NotNull;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;

@Path("/")
public class HelloValidateResource {
    @GET
    public String index(@NotNull @QueryParam("name") String name) {
        return "Hello " + name;
    }

}
```

これでGETでnameを受け取り，値無しは不許可ということになる。テストで確認する。

```HelloTest.groovy
package example.jaxrs

import org.glassfish.jersey.server.ResourceConfig
import org.glassfish.jersey.test.JerseyTest
import spock.lang.Shared
import spock.lang.Specification

import javax.ws.rs.core.Application

class HelloValidateResourceTest extends Specification {
    @Shared
    def jerseyTest = new JerseyTest() {
        @Override
        protected Application configure() {
            return new ResourceConfig(HelloValidateResource.class)
        }
    }

    def setupSpec() {
        jerseyTest.setUp()
    }

    def cleanupSpec() {
        jerseyTest.tearDown()
    }

    def "test index"() {
        when:
        def response = jerseyTest.target("/").queryParam("name", "World").request().get()

        then:
        response.getStatus() == 200
        response.readEntity(String.class) == "Hello World"
    }

    def "test fail"() {
        when:
        def response = jerseyTest.target("/").request().get()

        then:
        response.getStatus() != 200
    }

}
```
"test fail" にあるようにパラメータを省略するとHTTPリクエストが200にならない。
GithubのDeploy Keysを登録してパスワードなしでアクセスする



`EC2` に構築したサーバーからGithubにアクセスして`git clone` してビルド＆デプロイがしたい。  
自動化する仕組みは色々あるけれど、今回は単純に自作のシェルを叩くだけ。

そのとき発生するのがパスワード問題。シェルに組み込んでおいたり、どこかのファイルに保存したりすればできるのだが、パスワードを平で保存するのはよろしくない。

`Github` に公開鍵を登録して `SSH` でアクセスすることができるので試してみる。

鍵をつくる
-----

`EC2` に構築したサーバーにログインして、以下を実行する。

```
cd ~

ssh-keygen -t rsa
```

パスフレーズを聞かれるので適当にいれる。

```
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hoge/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/hoge/.ssh/id_rsa.
Your public key has been saved in /home/hoge/.ssh/id_rsa.pub.

```

すると `~/.ssh` 以下に2ファイルできる。

```
ls ~/.ssh

id_rsa
id_rsa.pub

```

`id_rsa.pub`の中身をコピーしておく。


GithubにDeploy Keyを登録する
----

各レポジトリの `Settings` に `Deploy Keys` メニューがある。

![Screen Shot 2016-07-03 at 10.37.58.png](https://qiita-image-store.s3.amazonaws.com/0/10058/456468ad-f4eb-c42a-8c34-6dcf25f153f2.png "Screen Shot 2016-07-03 at 10.37.58.png")

`Add deploy key` を押す。

![Screen Shot 2016-07-03 at 10.39.42.png](https://qiita-image-store.s3.amazonaws.com/0/10058/48b41011-4048-0ab4-48d6-bad93a809537.png "Screen Shot 2016-07-03 at 10.39.42.png")

 - Title・・・識別できるような名前（EC2とか）
 - Key  ・・・先ほど作成した `id_rsa.pub` ファイルの中身
 - Allow write access・・・書き込みが必要かどうか。今回は不要。

Keyの中身は

```
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABA.....
```

のようになっているはず。これをそのまま貼り付ける。

![Screen Shot 2016-07-03 at 10.45.27.png](https://qiita-image-store.s3.amazonaws.com/0/10058/93d5e4ce-597e-8a6f-bee9-197bc4099c6b.png "Screen Shot 2016-07-03 at 10.45.27.png")

こんな感じで登録される。

EC2からcloneしてみる
----

アクセスするためのURLがいつもと異なり、`git@`ではじまる。

```
git clone git@github.com:yourname/yourrepo.git
```

これでパスワードなしでアクセスすることができた。

まとめ
----

 - やりたいことはできた
 - 普段からローカルPCでやるとセキュリティ上よろしくないかな
 - Github便利
仕切り直し！　Windowsで始める Ruby on Rails Tutorial

Ruby on Rails Tutorial をする！と意気込んで mac に環境を作ってから、
公私ともに手一杯になってしまい早1年…以上？ (x x;
やっといろいろを片付けて…ってまだ片付いてないんですが、
なんとか仕切り直すぞ！ってところまでは戻ってこれました。
そして、寂しいことにこの間にmacがご臨終に…(T T)
手元にあるのは win10 に update した VAIO のみ。
6月に MacBook 出たら買うか…とか思ってたんですが、出なかったですね。
欲しい時が買い時といっても、そうそう買い替えができない身なので完全にタイミング逃した感があって、「今買う？」となったまま選べません。
とりあえずwin10でどこまでできるか、やってみてから考えたいと思います。

そんなこんなでまず『windowsに環境構築』から。。。
と思ってみていたら、クラウド環境があるんですね…しかも無料の。
これを利用してみようかと思います。
　　
  
## Cloud9 とは

[Cloud9 (https://c9.io)](https://c9.io)は、クラウド上の統合開発環境(IDE)です。
ブラウザ上に、ファイルブラウザがあって、Wordpress、PHP、Ruby、Ruby on Rails、Node.js、C++ 等のコーディングができるテキストエディタがあって、コマンドラインターミナルもあります。
エディタは、VIM/Emacs/Sublimeから選択できるみたいです。
作成したら実行ボタンがあるので、テスト実行もできます。
GitHubやHerokuとも連携できるみたいです。
ここまでくると至れり尽くせりなのでは…
アカウントを取って、ログインするとWORKSPACEで言語を選んだりするだけで始められるので、環境構築でめげることがありません。
これあれば Rails Tutorial できるかな？
  
  
## Cloud9 のアカウント登録
アカウントの取り方は、[Cloud9入門 (全8回)@ドットインストール](http://dotinstall.com/lessons/basic_c9) を参考にさせていただきました。

しかし、残念なことに 2016.07.14 AWSに買収されたからなのか、クレジットカードを登録しないとアカウントを取れなくなってしまいました。。。
私の乏しい英語力では怪しいのですが、「プラン変更しない限り課金しないんだけどクレジット登録してね」ということみたいです。
アカウント登録中に使用目的を選択するんですが、どれを選択してもクレジット登録になってしまいました。
う~ん。。。
これ回避できる方法あるのかなぁ…


## さっそくRails Tutorial のワークスペースを作成…
ワークスペースを作成するときに「Private」と「Public」の選択が必要です。
無料プランは、Private 1つが条件なので「Public」を選択します。
「Public」を選択しておくと、いくつか手順は必要ですが、他の人と共有することができます。
共有については、[プログラミングの開発環境に便利！Cloud9の使い方【Rails・WordPressテンプレートの解説あり】](http://techacademy.jp/magazine/6168) が詳しかったです。
あれ？　テンプレートの中に「Rails tutorial」がありますね。
Ruby のアイコンに "RAILS" って書いてるし…
どう違うのかな？ 
チュートリアルに何か記載されてたりするのかな…
  
  
## さて Ruby on Rails Tutorial を最初から！
あ。。。
1年の空白をがっちり認識しました。
チュートリアルがバージョンアップ (第2版→第3版)してます！
Rails も4.0→4.2へ。
第1章は環境構築が書かれていたはずなんですが、Cloud9 利用推奨に変わってます！
環境どうしよう…とか思わずに、素直にチュートリアルから確認するべきでした。。。
Cloud9 のワークスペース での選択は「Rails Tutorial」ですね。
環境準備はほんとに手軽になりました。
じゃぁ、さっそく始めます！
Xcodeチートシート

自分用チートシート。随時更新。

## ウィンドウ、エリア
| ショートカットキー | 効果 |
|--------|--------|
| Cmd + Sft + 1       | Welcom to Xcode(起動画面)の表示       |
| Cmd + F1       | Xcode内のWindow切替       |
| Cmd + 0       | 左ペイン表示/非表示       |
| Cmd + Alt + 0       | 右ペイン表示/非表示       |
| Cmd + Sft + Y        | デバッグエリア表示/非表示       |


## ストーリーボード
| ショートカットキー | 効果 |
|--------|--------|
| Cmd + Alt + Sft + D (※)      | Show Docment Outline       |
| DocmentOutlineでitemをAlt + クリック       | itemの名前変更       |
| ダブルクリック       | 縮小表示/標準表示切り替え       |
| 右 + クリック / Ctrl + クリック       | 縮小率メニューを表示       |

(※)カスタムキー
[StoryBoardの「Show Document Outline」をショートカットに設定]
(http://d.hatena.ne.jp/tanaponchikidun/20120610/1339321305)


## ファイル操作、ヘルプ
| ショートカットキー | 効果 |
|--------|--------|
|Cmd + Sft + O |名前を入力してファイルを開く|
|Cmd + 2 | クラス名の一覧からファイルを開く|
|Ctr + Cmd + ← |一つ前開いたファイルに戻す|
|Ctr + Cmd + → |一つ後開いたファイルに進む|
|Cmd + '|次のエラーにジャンプ|
|Cmd + "|前のエラーにジャンプ|
|Cmd + ソース内のクラス名やメソッド名をクリック | クラスやメソッドの定義にジャンプ|
|Cmd + Ctrl + J (↑と同じ) | クラスやメソッドの定義にジャンプ|
|Opt + ソース内のクラス名やメソッド名をクリック | クラスやメソッドをリファレンスで検索|
|Ctrl + . |入力補完|
|Cmd + Alt + ,|Assistant Editor / Primary Editorで開く|
|Alt + ファイル選択 | 2画面表示（アシスタントエディタ）になり、選択したファイルを右側に表示する |

## 検索
| ショートカットキー | 効果 |
|--------|--------|
|Cmd + F |検索|
|Cmd + G |検索において該当した次の検索結果に移動する|
|Shft + Cmd + G |検索において該当した一つ前の検索結果に移動する|
|Shift + Cmd + F|ワークスペース内のすべてのファイルからgrep 検索|
|Ctr + 6 |Source Editor上部にあるメニューを開く > 絞り込み入力|
|メソッドを選択 + Ctr + 1 > Callers|メソッドの呼び出し元を表示する(※)|
(※)または Assistant editor を開き、表示するコードを "Callers" に変更。
あとは左のエディタでメソッドにカーソルを合わせることで、自動的に呼び出し元のコードが表示される。
(呼び出し元が複数ある場合は最初を表示)


[コード追跡に役立つ Xcode の機能](http://qiita.com/imk2o/items/6ae9168cc6b00047649e)

## ビルド、デバッグと実行
| ショートカットキー | 効果 |
|--------|--------|
|Cmd + R |実行|
|Cmd + B |ビルド|
|Cmd + . |停止|
|Cmd + Ctrl + Y |Continue|
|F6 |Step Over|
|F7 |Step Into|
|F8 |Step Out|
|Cmd + \ |BreakPoint 追加/削除|

## コード編集
| ショートカットキー | 効果 |
|--------|--------|
|Cmd + Z |戻す|
|Cmd + Shft + Z |進む|
|Ctrl + I |選択範囲所在行のインデントを自動的に前後のソースに合わせる|
|Cmd + / |カーソル位置または選択範囲をコメントアウト.もう一度押すと、コメントアウトを解除する|
|Cmd + [ |カーソル行または選択されている行インデントを下げる|
|Cmd + ] |カーソル行または選択されている行インデントを上げる|
|Cmd + ← |カーソルを行頭へ移動|
|Cmd + → |カーソルを行末へ移動|
|Cmd + ↑ |カーソルをファイルの先頭へ移動|
|Cmd + ↓ |カーソルをファイルの最後へ移動|
|Cmd + Alt + ← |ソースを折りたたみする|
|Cmd + Alt + → |カーソルを折りたたみから展開する|
|Cmd + Ctr + E|選択中のテキストと同じ部分をまとめて変更する|
|Ctrl + E|行の最後に移動|
|Ctrl + A|行の最初に移動|
|Ctrl + D|右の1文字削除|
|Opt + →|右の1単語分移動|
|Cmd + Shft + → |現在のカーソルの位置からその行の最後までを選択|
|Cmd + Shft + ← |現在のカーソルの位置からその行の最初までを選択|
|Cmd + K|カーソル位置から行端までを切り取り|
|Alt + マウス|マウスカーソルが＋の状態で矩形選択|

[【開発効率アップ↑】Xcodeでよく使うショートカットまとめのまとめと解説](http://qiita.com/snow_richisland/items/0df7764938e59a8572b3)


## シュミレータ
| ショートカットキー | 効果 |
|--------|--------|
| Cmd + →      | 右回転       |
| Cmd + ←      | 左回転       |
| Cmd + S       | スクリーンショット       |
| Cmd + Sft + H       | ホームボタン       |

[Swift でアプリ開発を1ヶ月やってみて感じた Xcode の効率的な使い方と、Web と連動するときのプラクティス](http://qiita.com/merrill/items/079999aa064f0df9baf7)
spark (pyspark) をCSVを取り込むだけに使う　しかもwindows 10 で、(1)　インストールまで

## spark で、CSV を取り込むだけで結構苦労したという話です。

nysol と比べてベンチマークでどのくらい性能がでるのかをチェックするために、spark installしました。
local から、csv 読み込むだけで、しかも,windows 10 なので多くの人にとっては、あまり意味のない記述かなと思います。その点はご容赦ください。

2016/07/24　時点の情報です。かなりのスピードで変わるので、情報が正しくない可能性が、かなりあります。

今回は、インストールでエラーなしのところまでです。

### **ポイントは、**

* python は、anaconda python3をいれておきます。
* どのバージョンをダウンロードするか？ 2系で、prebuild がいいです。
* 必要な環境設定 java　は、
* 環境変数 java_home,spark_home,hadoop_home　などを設定
* Hadoop 用のプログラムとか、ディレクトリとかつくる
* conf 設定(log と、default に少し）

### **python anaconda3**

* python は何をいれてもよいと思いますが、anaconda が便利だと思ってつかっています。python3 です。

### **2系 prebuild**

* make しなくていいので prebuild がいいと思います。
* prebuild には、Hadoop対応の機能がついています。CSV取り込みには不要です。。。
* 2系なのは、csv 取り込み機能がデフォルトでついているためです。

### **java**

* 7,8 どちらでもいいみたい。
* jre でもいいような気がします。(maven で  build しないためかも）
* JAVA_HOME を設定するのはお約束

### **環境変数**

* spark の名前でどこかにinstallしたことにします。
* spark_home,hadoop_home をその spark のインストール先に設定します
* hadoop は、うまくうごかないでしょうけど、今回は、local で、CSV読み込みなのでこのようにします。

### **hadoop対応**

* hadoop 用にいくつか設定しないとエラーになるので、適当に設定します。
* bin 以下にいれるアプリがあります。[winutils](https://github.com/steveloughran/winutils/tree/master/hadoop-2.6.0/bin) がいいようです。winutils、hadoopごとにありますので、注意が必要です。
* /tmp/hive をつくり、winutils　で、パーミッション設定 winutils chmod 777 /tmp/hive します。

### **conf 設定**

* conf 以下に少し設定（しなくてもいいのかも）
* log4j.properties で、log4j.rootCategory=ERROR, console　と設定して、余計なログ出力を抑制
* spark-defaults.conf で、spark.master local と設定、local で、CSV読み込むだけの設定のはず。
reduceでwith_indexする方法


以下の方法で出来ると思ったらできなかった

```rb
# これはダメ
words.reduce.with_index do |array, word, index|
  中略~
end
```

each_with_indexをreduceに渡したら出来た

```rb
# これでOK
words.each_with_index.reduce do |array, (word, index)|
  中略
end
```
型変換前(#{attr}_before_type_cast)のValidationの汎用化

# 動機

- 型変換されるアトリビュートで『入力そのまま』をバリデーションしたいことがある
    - 型変換されるアトリビュートのバリデーションは基本的に型変換後の値に対して行われる。
    - 例えば、validates numericalityはonly integerでも+,-記号は通すが、純粋に数字列を許容する際はformatでやりたい
- #{attr}_before_type_castを使う手がある。しかし、
- #{attr}_before_type_castに対して直接バリデーションすると、errorsもその名前になってしまう。
    - バリデーションの対象は#{attr}_before_type_castだが、メッセージその他はattrを対象としているように見せたい。
- #{attr}_before_type_castのバリデーションに汎用性を持たせたい

# 方法

_before_type_castをラップするValidatorを作る。
使い方はコメントの通り。

```before_type_cast_validator.rb
class BeforeTypeCastValidator < ActiveModel::EachValidator
  # usage
  #
  #  validates :age, before_type_cast: {
  #    delegate_to: :format, if_value_class: String, options: {
  #      with: /\A[0-9]+\z/,
  #      message: "数字のみ"
  #    },
  #  }
  #
  # if_value_classオプションを指定した場合、実際のValidatorのif条件に指定される
  # 指定されなければBasicObjectなので何でも引っ掛かる(指定せずと同じ)

  def initialize(options)
    if options[:delegate_to].blank?
      raise ArgumentError 'BeforeTypeCastValidator needs :delegate_to option'
    end

    validator_name = options[:delegate_to].to_sym
    if_klass = options[:if_value_class] || BasicObject

    options[:attributes].each do |attr|
      uncast_attr_name = "#{attr.to_s}_before_type_cast".to_sym

      delegate_options = options[:options].dup
      delegate_options[:if] = ->(record) {
        record.respond_to?(uncast_attr_name) &&
          record.send(uncast_attr_name).present? &&
          record.send(uncast_attr_name).kind_of?(if_klass)
      }

      options[:class].class_eval do
        validates uncast_attr_name, { validator_name => delegate_options }
      end
    end

    super(options)
  end

  def validate_each(record, attribute, value)
    # error messages from 'xxx_before_type_cast' to 'xxx'
    
    uncast_attr_name = "#{attribute}_before_type_cast".to_sym
    
    return unless record.errors.has_key?(uncast_attr_name)

    errors = record.errors.delete uncast_attr_name
    errors.each do |error|
      record.errors.add attribute, error
    end
  end
end
```
GTX970 ⇒ GTX 1070に交換メモ

#はじめに
Chainerを使って、ディープラーニングを趣味で試しているのですが、
使っているGPU（GTX970、4GB）のメモリが少ないため、GTX1070(8GB)に交換してみました。

##環境
OS：Windows 7 Professional
CPU:Core i5-6600
交換前GPU：GeForce GTX 970 JetStream(Palit Microsystems)
交換後GPU：GeForce GTX 1070 AMP Edition ZT-P10700C-10P(ZOTAC) 約54,000円（7/24現在）

##交換前に

- NVIDIAの名前がついているソフトをすべてアンインストール

##交換
- 補助電源(6pin×2)をはずす
- ねじをはずす 
- ロックをはずして、スロットからGTX970を引き抜く
- スロットにGTX1070をさす
- ねじをとめる
- 補助電源(8pin×2)を付ける
（6pinと6pin線の横にあった2pinを使って、8pinに接続した）




##交換後
- NVIDIAドライバ　ダウンロード・インストール
- CUDA Toolkit 8 RC　ダウンロード・インストール
- cuDNN v5 (May 27, 2016), for CUDA 8.0 RC　ダウンロード・コピー
(Nvidiaに登録、ログインが必要）


- Chainerを一度アンインストール

```
pip uninstall chainer
```

- Chainerを再インストール（キャッシュが残っているため --no-cache-dir -vvvv が必要)

```
pip install chainer --no-cache-dir -vvvv
```

#速度結果
Chainerのサンプルのmnistの実行時間を比較
（6万枚トレーニング、1万枚テスト、バッチサイズ100枚、20エポック）

- GPU計算　交換前 GTX970:　89秒
- GPU計算　交換後 GTX1070:　84秒
- CPU計算（交換後）:　1050秒

この条件では交換の効果は小さかったのですが、
おそらくフルでGPUを使っていないことが要因のようです。
バッチサイズを10000枚にすると、交換後 GTX1070で8秒でした。
PostgreSQLでダンプされたバイナリファイルをインポートする手順

PostgreSQLを全く触った事がなく、ダンプされたバイナリファイルのインポート(postgreSQLではリストアという)の手順がわからなかったので、メモしておきます。

* * *

バイナリファイルの場合は`pg_restore`コマンドを使う必要があるようです。
`pg_restore -U postgres -d データベース名 ファイルまでのパス`
例：`pg_restore -U postgres -d hoge /Users/hogeuser/121949-31352139-13r45(バイナリファイルはこんな感じ)`
subprocess.callの実行時エラー対処方法

## 発生事象

[【スタダ】ポケモンGOがリリースされたら電話掛かってくるスクリプト](http://qiita.com/haminiku/items/991d4ac380ca3ef29dd1)
上の記事を丸パクリしてスクリプトをcron実行させようとした時に
pythonのsubprocessモジュールでコマンド実行時に以下のエラーが発生

```python
python poke_check.py 
Traceback (most recent call last):
  File "poke_check.py", line 47, in <module>
    start()
  File "poke_check.py", line 43, in start
    subprocess.call("echo 'not open'")
  File "/usr/lib/python2.7/subprocess.py", line 522, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1335, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory
```

## 原因・解決策

http://stackoverflow.com/questions/18962785/oserror-errno-2-no-such-file-or-directory-while-using-python-subprocess-in-dj

上記のstackoverflowの記事により解決。

実行したいコマンドを文字列で渡す場合はフラグが必要みたい。

```python
subprocess.call("（実行したいコマンド）", shell=True)
```
brew linkapps したアプリが Spotlight でヒットしないとお嘆きのあなたに

小ネタ。

```sh
$ brew install macvim
$ brew linkapps macvim
$ ll /Applications/MacVim.app
lrwxr-xr-x 1 delphinus admin 45  7 24 21:50 /Applications/MacVim.app -> /usr/local/Cellar/macvim/7.4-104_1/MacVim.app
```

`brew linkapps` コマンドを使うと `/Applications` フォルダにシンボリックリンクを作ってくれるので Finder からダブルクリックして簡単に起動できるようになります。

でもこれ、Spotlight で検索できないんですよね。

そんなときの Tips。

# シンボリックリンクじゃなくてエイリアスを使う

1. Finder で <kbd>⌘G</kbd> して `/usr/local/Cellar/macvim/7.4-104_1`（バージョンによって違う）に移動。
2. 右クリックして**エイリアスを作成**。
3. `MacVim のエイリアス`というファイルができるので <kbd>⌘C</kbd> でコピー。
4. <kbd>⌘G</kbd> で `/Applications` に移動。
5. <kbd>⌥⌘V</kbd> で貼り付けて移動。

これで OK！ Spotlight でもヒットするはずです。

# 右クリックとかかったるい！ CLI 最高！

な人向け。

```sh
osascript -e 'tell application "Finder" to make alias file to POSIX file "/usr/local/Cellar/macvim/7.4-104-1/MacVim.app" at POSIX file "/Applications"'
```

早い！

### 参考

* [MacVim.app doesn't show up in spotlight · Issue #8970 · Homebrew/legacy-homebrew](https://github.com/Homebrew/legacy-homebrew/issues/8970)
* [osx - How do I create a Macintosh Finder Alias From the Command Line? - Stack Overflow](http://stackoverflow.com/questions/7072208/how-do-i-create-a-macintosh-finder-alias-from-the-command-line/10067437)
Milkcocoa SDK for UWP and .NET Framework

UWPアプリから利用できる、Milkcocoa SDKの使い方を解説します。

#経緯
[名古屋版IoT縛りの勉強会! IoTLT vol1](http://iotlt.connpass.com/event/27556/)でMilkcocoaを知りました。
上記で知り合った、ウフル川野氏に聞いたところ、Win10 IoT Core向けのSDKは無いということだったので、作ることに。
![20160724A.png](https://qiita-image-store.s3.amazonaws.com/0/109634/3ed20c13-d8af-3b82-2ac9-df2d5341d738.png)

#動作確認
* UWP / Windows 10 Professional / Surface Pro 2
* UWP / Windows 10 Mobile / MADOSMA
* UWP / Windows 10 IoT Core / Raspberry Pi 2/3
* WPF / Windows 10 Professional / Surface Pro 2
* Console / Windows 10 Professional / Surface Pro 2

>~~まだIoTCoreで動作確認していなかった、、、。~~
>動きました。(^O^)／
>
>~~ニーズがあれば、、、WPFやWinFormといった.NET Frameworkにも対応したいと思っています。~~
>.NET Frameworkに対応しました。

#SDKのインストール方法
（nugetにアップロードしてありますので）Visual Studioのnugetパッケージマネージャーコンソールで、
```Install-Package Milkcocoa```
を実行してください。
>本SDKのパッケージページは[こちら](https://www.nuget.org/packages/Milkcocoa/)です。

#プログラミング（送信編）
Milkcocoaサイトのdashboardで”アプリ”を作ってください。
UWPアプリからは、app_id（赤枠部分）を使って”アプリ”に接続しますので、メモしておきましょう。

![20160724B.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/1fd66898-a606-bc2f-a6ef-3c8fdf0bc1e0.png)

UWPアプリでは、Milkcocoaクラスをインスタンス化するときに、app_idを指定します。".mlkcca.com"を忘れないように。

```csharp
private Milkcocoa.Milkcocoa Milkcocoa;
Milkcocoa = new Milkcocoa.Milkcocoa("iceinixlzq3.mlkcca.com");
```

dataStoreメソッドにデータストアのパスを指定してDataStoreインスタンスを取得し、pushメソッドで送信します。
パスは"/"区切りで階層指定できます。
pushメソッドの引数はdynamic型で、自動的にJSON形式に変換してデータストアに送ります。

```csharp
Milkcocoa.dataStore("message").push(new { content = "My first data!" });
```

dashboardで確認すると、データストアにJSON形式で格納されたことがわかります。

![20160724C.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/1d88505c-e85b-d048-b45f-6c0108284b1c.png)

#プログラミング（受信編）

>書いている途中。

```csharp
void MilkcocoaCallback(Milkcocoa.MilkcocoaDataStoreEventArgs e)
{
    System.Diagnostics.Debug.WriteLine(string.Format("{0:HH:mm:ss.fff} Sub  {1}", DateTime.Now, e.path));
}
```

```csharp
Milkcocoa.dataStore("message").on("push", MilkcocoaCallback);
```

#サンプルプログラム

[github](https://github.com/matsujirushi/MilkcocoaSample)にサンプルプログラムを公開しています。

![20160724D.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/45b0ac92-d2b4-347b-0013-ccf903b94b07.png)


#対応しているMilkcocoa API
2016/8/27時点の[Milkcocoa APIリファレンス](https://mlkcca.com/document/api-js.html)に対する対応一覧です。

|クラス|メソッド|対応|補足|
|:--|:--|:--|:--|
|Milkcocoa|new Milkcocoa()|○|secureで暗号化を指定。|
||connectWithApiKey()|×|
||dataStore()|○|
||authWithToken()|×|
||logout()|×|
||user()|×|
||MakeHostString()|☆|v1.0追加機能。（@Fumiya_Kumeさんthx）|
|DataStore|push()|○|
||set()|×|
||remove()|×|
||send()|○|
||on()|○|
||off()|○|
||get()|×|
||stream()|×|
||history()|○|
||child()|×|
|Stream|||対応していません。m(__)m|
|History|sort()|○|
||size()|×|
||limit()|○|
||span()|×|
||on()|×|
||run()|○|

#改定履歴
##v1.3
- Milkcocoaサーバーとの接続を暗号化通信に変更しました。コンストラクタのsecureで暗号化無しも可能。

##v1.2
- .NET Frameworkに対応しました。v4.5以降で使用できます。

##v1.1
- Releaseビルドのとき、イベントを受信するとMissingMetadataExceptionに対処しました。[#1](https://github.com/matsujirushi/MilkcocoaSample/issues/1)
ECCUBE3  開発者ドキュメントのチュートリアルを実際に動作させてみる①

ECCUBE 開発者ドキュメント

友人から、「バグが多すぎて動かない」
「順番通りやったが途中で内容がとんでいる」
ので助けてほしいという連絡が来た。

とはいえ、私もECCUBEやsilexが詳しくないので
悪戦苦闘するであろうこと請け合いだが
なんとか最後まで辿り着いてみたい。

http://ec-cube.github.io/

こちらのチュートリアルの順番どおり進める

URLを設定しよう

    ルーティングとコントローラープロバイダー

コントローラーからビューを表示してみよう

    ビューのレンダリング

画面に変数を渡してみよう

    Twig構文とView変数



ここまで問題なく動作

フォームを表示してみよう

    Formとフォームビルダー

むむ、
\$builder = $app['form.factory']->createBuilder('form', null, array())★ここからフォーム定義を追加

ここは最後にセミコロン（;）が必要だが抜けている 追加。


星印（★）のコメントはなんのためにあるんだろうか
ひとまず sublime textの機能で一括してコメントアウトに書き換える

もうひとつ


以下の様にcrud_test.twigを修正します。

    crud_test.twig

このファイルはホントは
crud_top.twig のことかと思われる

途中でファイル名を変えたのでしょう
ここだけ変更されていなかった


ひとまずこれでここまでは動作


フォーム情報を整理して入力値チェックも追加しよう

    FormType


おや？最後 例として表示されている画像と
実際の出力結果がずれている

画像では投稿者ハンドルネームなるものが
登場するのだがFormType を見る限り
ないのでこれはあとから登場するのだろうか

気になるがこのまま進めてみる

いや！ダメだ！
そもそも送信ボタンがない！
画像に見られるこの内容で「投稿する」
ボタンが存在していない。

まいった、
バリデーションなどもあるが普通にHTMLで書いてしまって
いいのだろうか。
form widget で作り出すような感じだが調べてないのでひとまず
\<button type="submit" class="btn btn-default">投稿する\</button>
これで動作確認。


データーベースを作成しよう

    本章は「開発ガイドライン」で説明を行なっているために、本チュートリアルのテーブル定義のみ、記述します。
    詳しい作成方法は以下を参照ください。
        マイグレーションガイド
        本チュートリアルのテーブル定義

Doctrineのためにデーターベース構造を設定しよう

    データーベーススキーマ定義

！詳しい作成方法は以下を参照ください、という表現からすると
ひとまずは読み飛ばしてもかまわない詳細がのっているという意味合いにとれるが
（どうやら友人は読み飛ばしている）
データベースのスキーマ定義の章を読む限り
チュートリアルとして必須の項目らしい。

リンク部分がタブで下がっているため必要なら読むようなニュアンスがある
おそらく本チュートリアルのテーブル定義は必須でしょう。

今日はここまで。
後日続きから頑張ってみます。

バグ直しなどでじつのところかなり時間を割いてしまった。
この先もこれが続くのだろうか。

他にも動作検証されてる方がいらっしゃいましたら
アドバイスいただけるとありがたいです。
Github のチュートリアルも一応確認してます。
【iOS】Storyboard上で5.5インチ端末のフォントサイズを変更する

iPhone 6s PlusやiPhone 6 Plusといった5.5インチの端末はサイズが大きいため、それに合わせてフォントサイズを大きくしたいと考えることがあるかと思います。
landscape（横向き）のフォントサイズであればSize Classを使うことで対応することができますが、portrait（縦向き）では対応することができません。
そのため、Storyboard上で5.5インチのフォントサイズを変更する方法について考えてみました。


# 実装
まずは、3.5 / 4.0 / 4.7 / 5.5インチのデバイスサイズをenumで定義します。

```
enum DeviceHeight: CGFloat {
    case iPhone3_5 = 480.0 // 3.5インチ
    case iPhone4_0 = 568.0 // 4.0インチ
    case iPhone4_7 = 667.0 // 4.7インチ
    case iPhone5_5 = 736.0 // 5.5インチ
}
```

次に、UIScreenクラスに5.5インチ端末かどうか調べる機能を追加します。

```
protocol DeviceType {
    static var is5_5: Bool { get }
}

extension DeviceType where Self: UIScreen {
    static var is5_5: Bool {
        switch UIScreen.mainScreen().bounds.size.height {
        case DeviceHeight.iPhone5_5.rawValue: return true
        default: return false
        }
    }
}

extension UIScreen: DeviceType {}
```

IBDesignableとIBInspectableで5.5インチ端末のフォントサイズをStoryboard上から変更できるようにします。

```
@IBDesignable
extension UILabel {
    
    @IBInspectable
    var fontSize5_5: CGFloat {
        get {
            if UIScreen.is5_5 {
                return font.pointSize
            } else {
                return 0
            }
        }
        set {
            if UIScreen.is5_5 {
                font = UIFont.systemFontOfSize(newValue)
            }
        }
    }
}
```

# 使い方
Storyboard上にUILabelを配置します。
![スクリーンショット 2016-07-24 21.42.20.png](https://qiita-image-store.s3.amazonaws.com/0/133918/d3ab3523-52b4-401d-ca16-5eb5c6309c62.png "スクリーンショット 2016-07-24 21.42.20.png")


__fontSize5_5__ の値を変更します。
![スクリーンショット 2016-07-24 21.34.42.png](https://qiita-image-store.s3.amazonaws.com/0/133918/61600f54-2078-7527-5e38-e52e6cfca092.png "スクリーンショット 2016-07-24 21.34.42.png")


# おわりに
他に良い方法があればご教授お願い致します！
LibreOfficeのピボットテーブルは文字列の大文字小文字を判別しない

### ハマリどころ
元データはこれ。

|ID|課金額|
|:-:|:---:|
|aaaa|100|
|aaaa|200|
|AAAA|100|
|bbbb|200|

このデータを元にピボットテーブル作った時、

|ID|課金額|
|:-:|:---:|
|aaaa|300|
|AAAA|100|
|bbbb|200|

を想定していたのですが、作られたのは

|ID|課金額|
|:-:|:---:|
|aaaa|400|
|bbbb|200|

というテーブル。
実際のデータは50万件とかで、目視で確認するのはもはや難しい…というところでふと天啓が降りてきて数日間の戦いに終止符を打ちました…。

確かExcelは重複排除を行うと大文字小文字判別を行わずに削除するのでこれもハマリどころ。
Docker for Windows で hello-world が pull できない問題の対処法

# 現象
Hyper-V を利用した Docker for Windowsをインストールしたものの、hello-world のイメージの取得に失敗しました。

```text
PS C:\Users\Owner> docker run hello-world
Unable to find image 'hello-world:latest' locally
Pulling repository docker.io/library/hello-world
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Network timed out while trying to connect to https://index.dock
er.io/v1/repositories/library/hello-world/images. You may want to check your internet connection or if you are behind a
proxy..
See 'C:\Program Files\Docker\Docker\Resources\bin\docker.exe run --help'.
```

# 環境
| | |
|:--|:--|
| OS | Windows 10 pro 64bit |
| Docker | 1.12.0-rc4 |
| CLI | Powershell 5.0.10586.494 |

# 対処法

こちらに記事がありました。
[Docker for Windows (Hyper-V) を試してみたよ#コンテナから外部ネットワークに接続](http://qiita.com/arenahito/items/83162f8ce73077cad3c4#%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%8B%E3%82%89%E5%A4%96%E9%83%A8%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AB%E6%8E%A5%E7%B6%9A)

こちらが画像付きでわかりやすいので詳しくは見ていただくとして、簡単に手順を書くと下記のとおりです。

1. Hyper-V マネージャで「外部ネットワーク」スイッチを追加し、
2. MobyLinuxVMの `[ハードウェアの追加] > [ネットワークアダプタ]` から作成したスイッチを追加
3. **Dockerを再起動**（タスクトレイのDockerアイコンから `[Settings...] > [Reset] > [Restart Docker...]`）

3.の再起動がないと反映されません。

※DockerNATの設定を「内部ネットワーク」から「外部ネットワーク」に変更すれば良いのではないか？と考えましたが、下記のエラーでうまくいきませんでした。

```text
PS C:\Users\Owner> docker run hello-world
Unable to find image 'hello-world:latest' locally
Pulling repository docker.io/library/hello-world
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error while pulling image: Get https://index.docker.io/v1/repos
itories/library/hello-world/images: dial tcp: lookup index.docker.io on 192.168.65.3:53: server misbehaving.
See 'C:\Program Files\Docker\Docker\Resources\bin\docker.exe run --help'.
```
TypescriptでReact.ComponentのデフォルトProps値を定義する

# はじめに
TypeScriptとReactJSを使ってReact.Componentを継承したクラスを定義する際、
Propsプロパティのデフォルト値を定義する必要が出てきたのですが、
React公式ページに掲載されいてる方法ではうまくかなったので、TypeScript用の定義方法をメモしておきます。

# 問題

Propsのデフォルト値をどのように指定するかを調べたところ、
[Component Specs and Lifecycle#getDefaultProps()](https://facebook.github.io/react/docs/component-specs.html#getdefaultprops)では以下のように書かれていました。
> Invoked once and cached when the class is created. Values in the mapping will be set on this.props if that prop is not specified by the parent component (i.e. using an in check).

> This method is invoked before any instances are created and thus cannot rely on this.props. In addition, be aware that any complex objects returned by getDefaultProps() will be shared across instances, not copied.

上記ページではメソッド`getDefaultProps`でデフォルト値を定義するようになっていたので、

```
import * as React from 'react';

interface SomeProps extends React.Props<{}> {
  prop1: string
}

class SomeComponent extends React.Component<SomeProps, {}> {
   ... 中略 ...
   
   getDefaultPros() {
      return {prop1: "default"};
   }
   
   ... 中略 ...
}
```
というように実装しましたが、実行時に

> warning.js:44Warning: getDefaultProps was defined on SomeComponent, a plain JavaScript class. This is only supported for classes created using React.createClass. Use a static property to define defaultProps instead.

というメッセージが表示されてしまいました。

# TypeScriptでの定義方法

上記のメッセージにも書かれていますが、TypeScriptでは以下のようにデフォルトProps値を定義します。

```
class SomeComponent extends React.Component<SomeProps, {}> {
    public static defaultProps: SomeProps = {prop1: "default"};
    ...
}
```


# 参考
[How to declare class properties defaultProps?](http://stackoverflow.com/questions/36378200/how-to-declare-class-properties-defaultprops)
mapViewに長押しでピンを追加する方法

mapViewに長押しでピンを追加する方法

storyboarｄにmapviewを追加するのは省略

```
func longPressed(sender: UILongPressGestureRecognizer) {
    //長押しした地図上の座標
    let tappedLocation = sender.locationInView(mapView)
    let tappedPoint = mapView.convertPoint(tappedLocation, toCoordinateFromView: mapView)
    //ピンの生成
    let pin = MKPointAnnotation()
    //ピンを置く場所を指定
    pin.coordinate = tappedPoint
    //ピンのタイトル
    pin.title = "タイトル"
    //ピンのサブタイトル
    pin.subtitle = "2016/7/1"
    //ピンをMapViewの上に追加
    self.mapView.addAnnotation(pin)
}
```
LinuxのKernel NET policyの概要

# はじめに

7月18日にLKML, net-dev MLで提案された(Kernel) NET policy [^netpolicy] について調べてみました。

[^netpolicy]: [\[RFC PATCH 00/30\] Kernel NET policy](http://thread.gmane.org/gmane.linux.kernel/2268423)


# NET policyとは？

Linuxの通信性能は初期設定でもそれなりに高いですが、より高い性能を出すためには様々な設定を最適化しなければいけません。NET policyは、指定したポリシ(スループット重視や遅延重視等)に従ってカーネルが設定の最適化を自動的に行なう機能です。

ポリシはソケット単位、タスク(プロセス)単位、デバイス単位で指定できます。(本稿では便宜的にターゲットと呼ぶ。)

NET policyはマルチキューNIC向けに設計されていて、現在の対応NICはIntelの40 GbE (i40e)のみですが、マルチキューNICであれば、他のNICにも実装可能のようです。

## API

- デバイス
    - /proc/net/netpolicy/$DEV/policy
- タスク
    - /proc/$PID/net_policy
    - prctl(PR_SET_NETPOLICY, POLICY_NAME, NULL, NULL, NULL)
- ソケット
    - setsockopt(sockfd,SOL_SOCKET,SO_NETPOLICY,&policy,sizeof(int))

## ポリシ

- BULKポリシ
    - 高スループット重視のポリシ
    - すべてのターゲットに適用できる
- CPUポリシ
    - 高スループット重視だが、CPU使用量がより低いポリシ
    - すべてのターゲットに適用できる
- LATENCYポリシ
    - 低遅延重視のポリシ
    - すべてのターゲットに適用できる
- MIXポリシ
    - スループットと遅延の両方が良くなるように調整するポリシ
    - デバイスターゲットのみ適用可能

## 性能向上

RFCメールには、初期設定と比べてどの程度性能が良くなるのかが示されていました。性能測定には`netperf`の`TCP_RR`テストを用いています。

- BULKポリシ
    - スループットが平均で1.26倍
- CPUポリシ
    - スループットが平均で1.20倍
    - CPU使用量がBULKポリシより平均で5%低い
- LATENCYポリシ
    - 遅延が平均で53.5%低い
- MIXポリシ
    - スループット重視のワークロードと遅延重視のワークロードを何種類かの割合で混ぜたテストを実施しているようです。詳しくはRFCメールを参照してください。

# おわりに

とりあえず概要だけまとめてみました。次回は個々の最適化について調べてみたいです。
Heroku を利用したPHPアプリケーションのセットアップ


## アプリケーションの作成

現在利用可能なアプリケーションの確認　

````
$ heroku apps
````

アプリケーションの作成

````
$ heroku create {hogehoge}
````

既存のアプリケーションと紐付けるにはgit:remote コマンドが便利

````
$ heroku git:remote -a {hogehoge}
````

## buildpack のセット

Buildpackをセットする。

````
$ heroku buildpacks:add heroku/php
````

nodejsも使いたい場合はコノように。

````
$ heroku buildpacks:add heroku/nodejs
$ heroku buildpacks:add heroku/php
````

## Procfile の作成

Heroku PHP 向けのProcfileを設定する。

````
web: vendor/bin/heroku-php-apache2 public/
````

上記はapacheを使用する例。その他のオプションは、https://devcenter.heroku.com/articles/custom-php-settings を参照
Pythonにおけるオブジェクトの同値判定

# 目的
pythonにおいてオブジェクトの同値判定の仕組みを知った上で自分で定義した同値判定を利用できるようにする
`obj1 == obj2` および `obj1!=obj2`での判定の仕組みについて

# 環境
python : 3.5.1, 2.7.10

# pythonの組み込み関数での同値判定

    class Foo(object):
        def __init__(self, name, age):
            self.name = name
            self.age = age

上記の通り、Fooクラスを定義した上で以下のようにfoo1とfoo2のインスタンスを作成して、
同値判定やリストの存在の有無の判定を行うと、同じインスタンスではTrueになるが、メンバ変数の値が同じでインスタンスが異なる場合はFalseになる。

      foo1 = Foo("foo", 24)
      foo2 = Foo("foo", 24)
      print(foo1 == foo1) # -> True
      print(foo1 == foo2) # -> False
      print(foo1 in [ foo1 ]) # -> True
      print(foo1 in [ foo2 ]) # -> False
      print(foo1 != foo1) # -> False
      print(foo1 != foo2) #-> True

# 自作する場合
pythonの`==`や`obj in objlist`で同値判定を行う際には、
`obj.__eq__`メソッドが呼び出される
一方、`!=`には、`obj.__ne__`が 呼び出される
ただし、`obj.__eq__`を定義すれば、3.5.1(3系全部？）では`obj.__ne__`はその逆を返してくれるので`obj.__eq__`のみをオーバライドすればよい
2.7.10では、`__ne__`も定義してあげないと、`obj.__ne__`の結果はオーバライドした`obj.__eq__`の逆の値を返してくれない
2系と3系で統一したい場合は、`__ne__`を定義しておくことをお勧めします。

ただし、`__eq__`のときはまず始めに比較対象が同じクラスかどうかの判定するメソッド`isinstance(obj, CLASSNAME)`を呼び出さないといけないことに注意
メンバ変数の`name`と`age`が同じであれば、同じとみなす場合、以下のように定義する

    class Bar(object):
        def __init__(self, name, age):
            self.name = name
            self.age = age
        def __eq__(self, obj):
            if isinstance(obj, Bar):
                return self.name == obj.name and self.age == obj.age
            else:
                return False

        # 2.7.10(おそらく2.7系全部)では以下も必要
        def __ne__(self, obj):
            return not self.__eq__(obj)

上記のようにBarクラスを定義し、bar1, bar2, bar3 のインスタンスを以下のように作成して同値判定等の結果を見ると次のようになる

    bar1 = Bar("bar", 24)
    bar2 = Bar("bar", 24)
    bar3 = Bar("foo", 24)

    print(bar1 == bar1) # -> True
    print(bar1 == bar2) # -> True
    print(bar1 == bar3) # -> False
    
    print(bar1 in [ bar1 ]) # -> True
    print(bar2 in [ bar1 ]) # -> True
    print(bar3 in [ bar1 ]) # -> False

    print(bar1 != bar1) # -> False
    print(bar1 != bar2) # -> False 2.7.10では__ne__を定義してないとTrueになる
    print(bar1 != bar3) # -> True
C#:最大公約数を求める （ユークリッドの互除法）



２つの整数の公約数のうち最大のもの（最大公約数）を求める方法として有名なのが「ユークリッドの互除法」です。このユークリッドの互除法を用い最大公約数を求めるメソッドをC#で書いてみました。

ユークリッドの互除法については、Wikipediaの[こちらのページ](https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%BC%E3%82%AF%E3%83%AA%E3%83%83%E3%83%89%E3%81%AE%E4%BA%92%E9%99%A4%E6%B3%95)を参照してください

## ループバージョン

```csharp:gcd.cs
 class Program {
     static void Main(string[] args) {
         Console.WriteLine(Gcd(0, 8));
         Console.WriteLine(Gcd(12, 8));
         Console.WriteLine(Gcd(3400, 6596));
         Console.WriteLine(Gcd(12707, 12319));
     }
     // ユークリッドの互除法 
     public static int Gcd(int a, int b) {
         if (a < b)
             // 引数を入替えて自分を呼び出す
             return Gcd(b, a);
         while (b != 0) {
             var remainder = a % b;
             a = b;
             b = remainder;
         }
         return a;
     }
 }
```

[GitHub](https://github.com/gushwell/CSharpAlgorithmCollection)でコードを公開しています。

## 再帰バージョン

a を bで割った時の余りを r とすると、

<pre>
  b = 0 の時　-> gcd(a,b) = a
  b > 0 の時　-> gcd(a,b) = gcd(b,r)
</pre>

と表せるので、再帰を使って書くことができます。

そのコードも載せておきます。

```csharp:gcdRecursive.cs
 public static int Gcd(int a, int b) {
     return a > b ? GcdRecursive(a, b) : GcdRecursive(b, a);
 }
 
 private static int GcdRecursive(int a, int b) {
     return b == 0 ? a : GcdRecursive(b, a % b);
 }
```

再帰処理書く時、いつも思うのですが、メドッドの中でメソッド定義が出来れば便利なのにと思いますね。C#7.0期待しています。

ところで、C#6.0でも、以下のようにラムダ式使って、ひとつのメソッドで済ますこともできます。

```csharp:gcdRecursive2.cs
public static int Gcd(int a, int b) {
    Func<int, int, int> gcd = null;
    gcd = (x, y) => y == 0 ? x : gcd(y, x % y);
    return a > b ? gcd(a, b) : gcd(b, a);
}
```

[GitHub](https://github.com/gushwell/CSharpAlgorithmCollection)でコードを公開しています。


ラムダ式と1文字変数と条件演算子が組み合わさって、呪文のようなコードになっちゃいましたが、短いメソッドなので許してください(笑)


-------------------
この記事は、Gushwell's C# Programming Pageで公開したものを加筆・修正したものです。
ターミナルだけを使ってRaspberryPi 3にシリアルUSB変換ケーブルで接続する(モニタ・キーボード不要)

#**概要**
RaspberryPi 3はWi-Fi内蔵で便利になりましたが、デフォルトではUSBシリアル変換ケーブルが使用できません。でも、ちょっと一手間を加えると従来通りUSBシリアル変換ケーブルが使用できるようになります。本手順実施にあたり、HDMI接続モニタやUSB接続キーボードは不要です。

#**必要なもの**
* RaspberryPi 3 + micro SDカード + 電源一式
* micro SDカードリーダー(PCにリーダーを内蔵している場合は不要)
* USBシリアル変換ケーブル
* PC
* ターミナルソフト

#**[1] OSのインストール**
* **[こちら](https://www.raspberrypi.org/downloads/raspbian/)**からRaspbianのイメージをダウンロードして解凍します。本手順は[2016-05-27]版で確認しています
* SDカードにイメージを書き込みます。[Win32 Disk Imager](https://osdn.jp/projects/sfnet_win32diskimager/)(Windows)や[ApplePi Baker](http://www.tweaking4all.com/hardware/raspberry-pi/macosx-apple-pi-baker/)(Mac)を使うと良いでしょう

#**[2] 設定を変更する**
* PCにmicro SDカードをマウント(読み込み)します
* **`config.txt`**をテキストエディタで開きます。不用意に他のファイルを開くとRaspberryPiが起動しなくなるおそれがあるので注意しましょう
![boot 2016-07-24 12-33-43.png](https://qiita-image-store.s3.amazonaws.com/0/80392/cbffbe74-2e93-0d19-fc58-3fe14fc86368.png)
* **`config.txt`**の最後尾に以下を追記して保存します

```
dtoverlay=pi3-miniuart-bt
```

![スクリーンショット 2016-07-24 17.21.33.png](https://qiita-image-store.s3.amazonaws.com/0/80392/d72ac975-0fc1-2d83-ad5f-b709303cd9de.png)

##SSHを有効化する
2016年11月頃以降のRaspbianイメージから、セキュリティを考慮してデフォルトではSSHが無効になっています。ボリュームの`/`直下に`ssh`という名前の空ファイルを作成すると起動時にSSHが有効になるようです。Macの場合は、SDカードをマウントして、ターミナルで下記コマンドを実行すればOKです。Windowsでは未検証です。

```bash
$ touch /Volumes/boot/ssh
```

#**[3] USBシリアル変換ケーブルで接続する**
あとはRaspberryPi 2などの時と同じようにUSBシリアル変換ケーブルで接続できます。接続方法は以下の記事などを参考にして下さい。
[Raspberry piをインストールして設定してみよう](http://qiita.com/lutecia16v/items/479b220509069b2c753c)
ChromebookでEmacs

もともとモバイルEmacs環境が欲しいと思っていました。
そこで、ChromebookでEmacsが使えるようにしてみました。

ASUS C100PAというマシンにインストールしたのですが、
このマシンへのインストール事例は少なそうだったので
ここに記録を残しておきます。

![emacs-on-chromebook.jpg](https://qiita-image-store.s3.amazonaws.com/0/91520/92af9d33-d617-fb53-3837-ee93eb8bab99.jpeg)

## なぜChromebookか?

ChromeOSはLinuxベースであり、[croton](https://github.com/dnschneid/crouton)により容易にchroot環境を構築できます。
ChromeOS(Linux)が動作しているということは、chrootしたLinuxでも
ハードが認識された状態であるということです。

一般に、ノートPCにLinuxをインストールした場合、

- Wifiが認識されない
- タッチパネルが認識されない
- ディスプレイの明るさを調節できない

というようなトラブルが起こりがちです。

Chromebookの場合、ChromeOSのほうがハードを認識しているため
このようなことは起こりませんでした。
例えばWifiの場合、ChromeOS側の設定がchroot側でも有効になっています。
タッチパネルも特に設定なしで使えています。

### Androidは？

AndroidもまたLinuxベースですが、スマートフォンやタブレットをメインターゲットに
しているため、比較的ガードが固いように思われます。
ChromeOSの場合、かなりあっさりと開発者モードに移行できます。
少しネットで下調べした際も、crotonの成功率は高いように見えました。

## 使用したマシン

ASUS C100PAを使用します。
コンパクトで軽いというメリットにひかれました（900gを切る軽量10インチ）。
３万円台中盤くらいから入手可能なようです。

## インストール作業

基本的に、ネットでてきとうにググったものを真似するのでうまくいきます。
Acer C720のインストール事例が多いようですが、十分参考になります。

- http://qiita.com/tags/crouton
- http://taiju.hatenablog.com/entry/20150103/1420269653

### secure shell/crosh window（オプション）

chrome上でターミナルを動作させると、bashキーバインドがchromeに取られてしまいます。
例えば、Ctrl-nで新しいウィンドウが開いたり、Ctrl-pで印刷が起動したりします。

croutonメインで使う場合は、

- secure shell
- crosh window

をインストールしておくとよいでしょう。

### crouton

https://github.com/dnschneid/crouton

chrootを使用してDebianやUbuntuをインストールできます。
内蔵ディスク容量が心もとないのであまり大容量のディストリは避けるようにします。

Ubuntu(Trusty) + xfceを使用しました。
この組み合わせが一番無難なようです。
軽さを追求するならLXDEが候補にあがりますが、
xfceのほうが環境設定は楽だと思います。

インストールについては、他のマシンのインストール例の通りで大丈夫でした。
物にもよりますが、インストールにはまあまあ時間（数十分から数時間？）がかかります。

インストールが終了後すぐに、xfceが使えるようになっています。


### 日本語

とりあえず日本語が入力できないのは辛いので、
日本語入力環境を構築します。

試行錯誤した結果、この組み合わせに落ち着きました。

- fcitx
- mozc


### Emacs
apt-getでもインストールできますが、
今回は自分でビルドして、 24.5.1をインストールしました。

### JDK

このマシンはARMアーキテクチャ(Rockchip RK3288C)なので、

`Linux ARM v6/v7 Hard Float ABI`

を選択しました。


Emacs+CIDERでclojureプログラミングをしていますが、
まあ実用に耐える速度だと思います。

あまりちゃんと動かしていないですが
IntelliJは少し重いように感じています。



## ASUS C100PAの注意点

ASUS C100PAの導入を検討する際、以下の点に留意ください。

### ARMプロセッサである(X86,X64でない)

このためX86用にビルドされたバイナリは使用できません。
例えば、DropboxのUbuntu用バイナリは使えませんでした（私のやり方が悪いだけかも）。
使いたいソフトウェアがmakeできるか事前に確認しましょう。

aptとJavaが使えるのでだいたいは大丈夫です。

### キー操作中に親指がトラックパッドに触れてマウスカーソルが飛ぶ

キーボードのすぐ下にトラックパッドがあります。
誤動作（親指が触れる）でカーソルがとんだり、ポップアップメニューが表示されたりします。
手元にあるMacbook Proをみると、トラックパッド部分が少し窪んでいました。
これによって誤動作が予防されているようです。

とりあえずキー入力中はトラックパッドを無効にする設定でしのいでいます(xfceの設定)。
が、まあまあ気になります。

どうしても気になるようなら、タップではなくパッドを押し込む設定にしようと思います。


### メモリ4GB、内蔵ディスクが16GBとやや心もとない

１ヶ月間ほど、必要なソフトをインストールしていきましたが、
ディスク使用率は40%程度です。
SDカードスロットの他にもUSBポート2つありますので、
そちらにcroutonをインストールしている人もいるようです。
その場合は、crotonの暗号化を有効にしておいたほうがいいと思います。


### キーボードのピッチが狭い

最初は違和感ありましたが、すぐになれました。
キータッチは固め深めでいい感じです。
個人差があるので、実物を確認することをおすすめします。