OmniAICreator/Qiita-1.07M huggingface dataset:
UI > 充電完了のLEDの説明 > 消灯 / LEDフル点灯(取説には明記なし) / コンセントに挿している間は見れないところに印刷

Raspberry Pi2やESP8266などで使うモバイルバッテリ。
あるいは単三、単四の充電池。
デジカメの専用充電池。

これらを充電する時にいつも分からなくなるのが「充電完了のLED」の説明。

- P社:
  - 消灯で完了
- A社:
  - LEDフル点灯
  - ただし、取説には明記はなく、他の人のブログなどで見つけた情報
  - 上記の表示と思っていたが、LEDが自動消灯する。やはり、よく分からない。
  - とあるブログには充電完了時にLEDが消灯、というような記載がある。
- P社:
  - LEDが緑色点灯で完了
  - その説明は、充電している間には見ることができない、充電器本体の背面に記載

自分はこれらのUIに対して以下の対応をしている。

- 充電完了のLED状態について記載したテプラを表面に貼る
   - 充電中に見ることができるように


一ユーザとして望むこと

- 必要とする時（充電中）に必要な情報がその場で見えるようにして欲しい

さらに望むこと

- 多くの会社でLEDの点灯状態を統一化して欲しい
  - 既存の製品との継続性を考えた場合難しい、ということも考えた上での希望

これらのUIについてはソフトウェア作成時にも検討した方がいいかもしれない。

- 独自インタフェースになっていないか
- 独自インタフェースにする理由はなにか
- 独自インタフェースの使い方がアクセスしやすいか

過去に多くのOfficeクローンが作成されたが、そのほとんどが消えた一つの理由として、「UIが独特であった」、という記載をどこかのブログで見たことがある。
CloudFormation + OpsWorks 利用時のダメなところ

#1. はじめに
* OpsWorks を含む AWSサービス構成を CloudFormation のテンプレートで作成していた時に直面したダメなところ

#2. CloudFormation から OpsWorks Instances にて作成した EC2 に対して、CloudWatch Alarm 設定や Route53 RecordSet 設定を行う時
* CloudFformation の AWS::OpsWorks::Instance の戻り値では作成した EC2 インスタンスの ID を取得することができないため、AWS::OpsWorks::Instance を定義した同じテンプレートファイル内でCloudWatch Alarm 設定や Route53 RecordSet 設定の定義を記載できない。
別テンプレートファイルで　CloudWatch Alarm/Route53 RecordSet を行いたい EC2 のインスタンスIDを指定してCloudWatch Alarm/Route53 RecordSet を作成するテンプレートファイルを作成するか、直接 CloudWatch Alarm/Route53 のコンパネ等で設定する必要がある。

　　※参考
　　[本家ドキュメント - AWS::OpsWorks::Instance](http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-instance.html#d0e85152)　
　　[本家ドキュメント - OpsWorks よくある質問]
(https://aws.amazon.com/jp/opsworks/faqs)

* CloudFormation から一気通貫で AWS::OpsWorks::Instance でEC2インスタンスを作成するケースは少ないにしても、そもそも CloudFormation を使わなくて直接 OpsWorks の Instances から起動した EC2 に対しても CloudWatch Alarm/Route53 の設定は直接コンパネ等で設定しないといけないのは、めんどい。

#3. OpsWorksで作成したEC2にタグを付ける場合も、EC2のコンパネから直接設定しないとならない
CloudFrontに独自ドメインでHTTPS通信するためのメモ


# 何がしたい
- S3に出力したオブジェクトをCF経由で独自ドメインアクセスしたい
- アクセスの際は独自証明書を用いてHTTPS通信を強制したい

# 前提
- 証明書をCF用にインストール済みであること
    - CF用はCLBとは異なりCLI経由でインストールする必要がある

# 手順
## [S3]:バケットの作成
- S3にバケットを作成し、静的ウェブサイトホスティングを有効化する
- この際、バケット名は使用するウェブサイトのURL名にする必要がある
- www.sample.net を使用する場合、バケット名も同様にする
- indexファイルを設定する

## [CF]:ディストリビューションの作成
- Webディストリビューションを作成する（未記載の部分はデフォルトポリシーを指定）
    - Origin Domain Name：使用するS3のバケットを指定
    - Origin Path：バケット内プレィックスを指定
    - Restrict Bucket Access：CFからのアクセスに制限するか否か（今回はYES）
    - Viewer Protocol Policy:  HTTPS Only(HTTPSを強制）
    - Alternate Domain Names(CNAMEs): アクセスする際のURL名を記載する
    - SSL Certificate: *.cloudfront.net 証明を使用するか、独自証明書を使用するか選ぶ（証明書はインストールされているものから選択）
    - Custom SSL Client Support: Only Clients that Support Server Name Indication (SNI)でよければ600ドルは不要 https://ja.wikipedia.org/wiki/Server_Name_Indication
 
## [Route53] CNAMEレコードの作成
- CNAMEレコードでValueにCFのエンドポイント(xxxxxxxxxx.cloudfront.net)となっている値を設定する

# 注意点
Route53は設定が適応されるまで毎回15分ほどかかる
Apache向けfail2banの簡易構築手順

Apacheのアクセスログに国外からの大量の403と404のリクエストエラーが出力されていたため、過剰なアクセスへの対策を施す事にしました。

以下は対策の元ネタにさせて頂いた記事
>EC2でnginxの過剰な404|403に対しfail2banをかける
>http://qiita.com/osamu1203/items/e7b1718caf4fa59dca4f

403と404を過剰に発生させているIPについては以下のルールを用いて一時的に受付けないようにします。

「30秒の間に10回403のリクエストエラーを発生させたら、1800秒BANする」
「30秒の間に10回404のリクエストエラーを発生させたら、1800秒BANする」

以下、fail2banの簡易構築手順です。

# 事前準備
```bash
[root@localhost ~]# cat /etc/sysconfig/iptables # iptablesの現在のコンフィグを確認
[root@localhost ~]# /etc/init.d/iptables status # iptablesの有効化を確認
[root@localhost ~]# iptables -L                 # iptablesの現在適用されているルールを確認
[root@localhost ~]# mkdir /var/log/fail2ban     # ログディレクトリを新規作成
```

# インストール
```bash
[root@localhost ~]# rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
[root@localhost ~]# yum install --enablerepo=epel fail2ban
```

# fail2ban.confの編集
```vim:/etc/fail2ban/fail2ban.conf
# logtarget = SYSLOG                       # コメントアウト
logtarget = /var/log/fail2ban/fail2ban.log # 追加
```

# jail.localの新規作成
```vim:/etc/fail2ban/jail.local
[apache-403]
enabled = true
filter = apache-403                  # フィルター名
logpath = /var/log/httpd/*access_log # ログファイルパス
action = iptables-multiport[name="403", port="http,https", protocol="tcp"]
maxretry = 10  # 最大リトライ値
findtime = 30  # 監視間隔（秒）
bantime = 1800 # アクセス禁止時間（秒）

[apache-404]
enabled = true
filter = apache-404                  # フィルター名
logpath = /var/log/httpd/*access_log # ログファイルパス
action = iptables-multiport[name="404", port="http,https", protocol="tcp"]
maxretry = 10  # 最大リトライ値
findtime = 30  # 監視間隔（秒）
bantime = 1800 # アクセス禁止時間（秒）
```

# 403フィルター新規作成
```vim:/etc/fail2ban/filter.d/apache-403.conf
[Definition]
failregex =  ^<HOST>.*"(GET|POST).*" 403 .*$                      # フィルター
ignoreregex = 127.0.0.0/8 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 # ホワイトリスト
```

# 404フィルター新規作成
```vim:/etc/fail2ban/filter.d/apache-404.conf
[Definition]
failregex =  ^<HOST>.*"(GET|POST).*" 404 .*$                      # フィルター
ignoreregex = 127.0.0.0/8 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 # ホワイトリスト
```

# logrotateの設定
```vim:/etc/logrotate.d/fail2ban
# /etc/logrotate.d/fail2ban
/var/log/fail2ban/fail2ban.log {
    missingok
    notifempty
    weekly
    rotate 5
    compress
    dateext
    create 0644 root root
    postrotate
        /usr/bin/fail2ban-client set logtarget /var/log/fail2ban/fail2ban.log 2> /dev/null || true
    endscript
}
```

# fail2banのサービス起動および自動起動設定
```bash
[root@localhost ~]# /etc/init.d/fail2ban start  # fail2banのサービス起動
[root@localhost ~]# /etc/init.d/fail2ban status # fail2banのサービス起動確認
[root@localhost ~]# chkconfig --add fail2ban    # fail2banのサービス自動起動追加
[root@localhost ~]# chkconfig fail2ban on       # fail2banのサービス自動起動設定
[root@localhost ~]# chkconfig --list fail2ban   # fail2banのサービス自動起動確認
```
Swift 3 世代の排他制御

前回こんな記事を書きました。

Swift 世代の排他制御
http://qiita.com/codelynx/items/0ecd28c8a7da0a0e42b5

この記事では、以下のような排他制御の書き方を紹介しました。`NSLock` を使えば、複数のスレッドからクリティカルなデータの同時更新を防げるという話でした。具体的には、`NSLock` を `lock()` してから `unlock()` するまでは、他のスレッドは待たされるので、atomicity が保証できるという話です。しかも、`defer` 文を使えば、スコープを抜けた時に、確実に実行されるので、途中でいくつもの `return` 文があるようなパターンでも、実行し忘れがなく、安全という事です。

```.swift
class MyObject {
	let lock = NSLock()
	
	func update1() {
		self.lock.lock()
		defer { self.lock.unlock() }

		// update some critical resources
	}

	func update2() {
		self.lock.lock()
		defer { self.lock.unlock() }

		// update some critical resources
	}
}
```

さて、先日、通信処理が終わるまではロックしたいという場合に遭遇しました。通信の response が帰ってきた所の closure に `unlock()` を入れると、`lock()` と `unlock()` は同じスレッドでやりなさいと怒られてしまいます。そこで、仕方がないので、GCD の Semaphore を使ってみる事にしました。Swift 2.x からかなり書き方は変わっています。今回の使い方の場合は、`DispatchSemaphore` の `value` を `1` にします。

```.swift
class MyObject {
	let semaphore = DispatchSemaphore(value: 1) // "1"

	func update1() {
		semaphore.wait()
		defer { semaphore.signal() }

		// update some resources
	}

	func update2() {
		semaphore.wait()
		defer { semaphore.signal() }

		// update some resources
	}
}
```

もし、通信の request から response までの間を排他制御したい場合には、これらのメソッドは決して main thread で呼び出してはいけません。なぜなら通信はミリ秒単位で完了する事を保証している訳ではないので、UI がブロックされてしまう可能性があるからです。よって、そんな場合には 以下のように `assert(!Thread.isMainThread)` の一文を挟んでもいいのかもしれません。

```.swift
class MyObject {
	let semaphore = DispatchSemaphore(value: 1)
	let session = URLSession(configuration: URLSessionConfiguration.default)

	func update1() {
		assert(!Thread.isMainThread)
		semaphore.wait()
		let url = URL(string: "https://...")!
		let task = self.session.dataTask(with: url) { data, response, error in
			defer { self.semaphore.signal() }

			// update some critical resources
		}
		task.resume()
	}

	func update2() {
		assert(!Thread.isMainThread)
		semaphore.wait()
		let url = URL(string: "https://...")!
		let task = self.session.dataTask(with: url) { data, response, error in
			defer { self.semaphore.signal() }

			// update some critical resources
		}
		task.resume()
	}
}
```

コードは gist からも入手できます。

• 通常版
https://gist.github.com/codelynx/dcff25a02bf0a744473914ce18fc86b7
• 通信版
https://gist.github.com/codelynx/f004e4046382c4751aa9f35fdf82376f


［環境に関する表記］

```.log
Xcode Version 8.1 (8B62)
Apple Swift version 3.0.1 (swiftlang-800.0.58.6 clang-800.0.42.1)
```
SquidでSSL intercept

設定ファイルの書き換え

```
#http_port 3128
http_port 3128  ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/usr/local/etc/squid/squidCA.pem
ssl_bump bump all
sslcrtd_program /usr/local/libexec/squid/ssl_crtd -s /var/db/ssl_db -M 4MB
```

証明書が保存されるディレクトリの作成

```
> sudo /usr/local/libexec/squid/ssl_crtd -c -s /var/db/ssl_db
> sudo chown -R /var/db/ssl_db
```

ルート証明書の作成

```
> sudo openssl req -new -newkey rsa:2048 -sha256 -days 3650 -nodes -x509 -keyout squidCA.pem -out squidCA.pem
> sudo openssl x509 -in squidCA.pem -outform DER -out squidCA.der
```

squidCA.derをクライアントにインポートする
CentOS7/RHEL7でむやみにSELinuxポリシー追加せずにnginx apacheをEnforcingのまま動かす

パーミッションは正しいのにページが表示されない。
`setenforce 0` で動いた。

どうする？

* SELinuxをPermissiveにしよう！
* `audit2allow`で弾かれたログからポリシー作って追加しよう！

というのを良く見かけるけど、セキュリティレベルを落としたり、むやみにポリシーが追加されるのも避けたい…

ってことで調べてみました。

[とりあえずやり方](http://qiita.com/egnr-in-6matroom/items/fcd7c69f07aea338a3be#%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E9%81%A9%E5%88%87%E3%81%AA%E3%82%BF%E3%83%BC%E3%82%B2%E3%83%83%E3%83%88%E3%82%92%E8%A8%AD%E5%AE%9A)

## デフォルトのままの状態

`sestatus`で確認してみます。

```
$ sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      28
```
インストールしたばかりの環境では`targeted`ポリシーが`enforcing`モードにっています。
なので、nginx/apacheのプロセスと、セキュリティラベルのターゲットが適切であればよさそうです。

[ここのへん](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Managing_Confined_Services/chap-Managing_Confined_Services-The_Apache_HTTP_Server.html)を参考に、コンテンツファイルのラベルを変更するのと、Booleanのon/offでなんとかなりそうです。



## プロセスのターゲットを確認する

`ps`コマンドに`-Z`オプションを追加して、セキュリティラベルを表示します。
nginxの場合

```
$ ps -eZ | grep nginx
system_u:system_r:httpd_t:s0     8461 ?        00:00:00 nginx
system_u:system_r:httpd_t:s0     8488 ?        00:00:06 nginx
system_u:system_r:httpd_t:s0     8489 ?        00:00:16 nginx
```

末尾に`_t`が付いている`httpd_t`がターゲットです。

## ファイルのセキュリティラベルを確認する

/usr 配下の場合

```
$ cd /usr/share/nginx
$ ll -Z
-rw-r--r--. root root system_u:object_r:usr_t:s0       404.html
-rw-r--r--. root root system_u:object_r:usr_t:s0       50x.html
-rw-r--r--. root root system_u:object_r:usr_t:s0       index.html
-rw-r--r--. root root system_u:object_r:usr_t:s0       nginx-logo.png
-rw-r--r--. root root system_u:object_r:usr_t:s0       poweredby.png
```

末尾に`_t`が付いている`usr_t`がターゲットです。

## コンテンツのファイルに適切なターゲットを設定

`httpd_t`がラベル付けされたプロセスに許可されているターゲットのラベルをファイルに付けてあげます。

読み取りは`httpd_sys_content_t`

読み書き（アップロードフォルダなど）は`httpd_sys_rw_content_t`
を設定します。

ターゲットを変更するには

```
$ sudo chcon -t httpd_sys_content_t　ファイル
```

## その他

ポートを80以外にしたいなど、デフォルト以外の設定を入れ込むたびにSELinuxに引っかかることがあります。

```
$ sudo tail /var/log/audit/audit.log | grep denied
```
などで拒否されたログを確認し、以下を参照しながら適切なラベル付けをしていってください。

**参考**

[RedHat: Apache HttpServer](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Managing_Confined_Services/chap-Managing_Confined_Services-The_Apache_HTTP_Server.html)
[RedHat: ターゲット　ポリシー](
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Security-Enhanced_Linux/chap-Security-Enhanced_Linux-Targeted_Policy.html)
XAMPP使ってローカルにWordPressをインストール。


やり方とかインストールの仕組みを何回も調べれば「あ～なるほど」くらいにはなるんだけど、それまでが長い。
インストール時にDBに繋げなかったりユーザー名かパスが違うと言われてすごい悩んだけど、冷静になったらただの確認不足でした。

#インストールしてみる

大まかな順序として、
1.xamppを起動して、ApacheとMySQLを立ち上げる。
phpMyAdminにアクセスして、データベースを作る。
[http://localhost/phpmyadmin/](http://localhost/phpmyadmin/)
照合順序ってとこは「utf8_general_ci」でいきます。
>[【MySQL】照合順序とは？](http://qiita.com/kazu56/items/6af85ffcf8d3954455ad)

テーブルとか何もしなくていいです！ほんとデータベース作るだけ。

2.WordPressにアクセスしてzipをDLする。
[https://ja.wordpress.org/](https://ja.wordpress.org/)
![wp-dl.jpg](https://qiita-image-store.s3.amazonaws.com/0/110274/e688e7dd-73e9-6665-fa58-46be5fc0ad05.jpeg)

3.DLしたzipを解凍してフォルダ名を変更。(1で作ったデータベースの名前が無難)
そのフォルダを xampp > htdocsの直下に入れる。

4.[http://localhost/フォルダ名/](http://localhost/フォルダ名/)にアクセスすると「始めましょう！」のボタンがあると思うのでクリック。
※この時点で繋がらない人は分かりません！wp-config.phpはまだいじりませんよ。

5.以下の画像の画面が出てきます。
データベース名は1で作った名前、ユーザー名は[phpMyAdmin](http://localhost/phpmyadmin/)のUser accountってタブを見て、操作権限のあるユーザー名を入れます。デフォだとrootではないかと。パスはこの手順だと入れなくても大丈夫、あとはそのままでいいです。

![wp-inst.png](https://qiita-image-store.s3.amazonaws.com/0/110274/feee019b-57b6-3a90-92f9-3b5f3028ce73.png)

送信後、管理画面に入る時に使うユーザー名やパスワードを設定します。
ちなみにメールアドレスのとこは「test@test.com」みたく適当でも大丈夫です。ローカルだし。
※送信してエラーが出た場合、データベース名のデータベースがなかったり、ユーザー名のユーザーがいなかったり権限がなかったりだと思います。

「WordPressをインストール」を押して何事もなくいけばログイン後にWordPressのダッシュボードが出ると思います。
ここでフォルダ名直下を見るとwp-config.phpが生成されてます。

[http://localhost/フォルダ名/wp-admin/](http://localhost/フォルダ名/wp-admin/)
フォルダ名の後に `wp-admin/` をつけると管理画面に入れます。

インストールできるまではhttpd-vhosts.confにlocalhost:8085/とか設定して色々やってたんですが、エラーでまくったので一から素直にやったら出来ました。
初心者には分かりずらい仕組みです。。。
#4 【攻略】RubyWarrior Level4

RubyWarrior Level4の攻略
参考サイト: http://tumiki.hatenablog.jp/entry/2015/06/23/010440
ちょっと難しかったので、参考サイトの解説を少し細かく解説します。

#概要
新しく弓矢兵が出てきたので、前回と同じように止まってwarrior.rest!すると遠距離攻撃されて負ける。

ゲーム案内文にある通り、@healthにターン毎に体力の数値を保存して、次ターンのwarrior.healthと比較することで進んで攻撃すべきか、休むかを判断できるロジックを組むといい。

#スクリプト
```
class Player
  def play_turn(warrior)
    if @health.nil?
      @health = 20 
    end
    
    if @health > warrior.health 
      if warrior.feel.empty?
        warrior.walk!
      else 
        warrior.attack!
      end
      
    else
      
      if warrior.health < 15
        warrior.rest!
      else
        if warrior.feel.empty?
          warrior.walk!
        else
          warrior.attack!
        end
      end
    end
    
    @health = warrior.health 
    
  end
end
```

#解説
まず、

```
if @health.nil?
  @health = 20
end
```
ここではプレイヤーの最初の体力を@healthに保存。このインスタンス変数をターン毎に更新しながら条件分岐を進んで行く。

次に

```
if @health > warrior.health       
  if warrior.feel.empty?
    warrior.walk!
  else 
    warrior.attack!
  end
      
else
・
・
・
end

@health = warrior.health
```
ここのスクリプトは弓矢兵に対応するためのもの。
これのおかげでwarriorがダメージを受けているか判断できて、「攻撃を受けていたらその場で回復せず、前進して攻撃しろ」という命令ができる。

warriorが自分の行動を終えたあと、ターンを終了する前に@health = warrior.healthでターン終了時の体力を保存する。

で、その後の敵のターンで弓矢兵から攻撃を受けると、次のターン開始時に@healthとwarrior.healthの値に差が出てくる。それを、

```
if @health > warrior.health
```
という条件に照らし合わせtrueなら前進して攻撃ができる、ということになる。
[Unity]エディタ上で関数を登録して呼ぶ．(エディタ拡張の短縮)


新しくカスタムエディターを作らなくても，publicで関数宣言すれば，それを登録してエディタ上で呼べる．

![スクリーンショット 2016-11-16 11.20.36.png](https://qiita-image-store.s3.amazonaws.com/0/113504/c8990dd5-b456-bb7c-1d57-5d436e7bb426.png "スクリーンショット 2016-11-16 11.20.36.png")

# 手順
1. EventInvokerとEventInvokerEditorをコピペ
2. Editorという名前のフォルダを作成し，そこにEventInvokerEditorを入れる．
3. 適当な空のオブジェクトにEventInvokerをアタッチ
4. EventInvokerのEventsをEditor and Runtimeに設定
5. プレハブ化してUnityPackageとしてエクスポート

```EventInvoker.cs
using UnityEngine;
using System.Collections;
using UnityEngine.Events;

/// <summary>
/// イベント登録，実行
/// </summary>
public class EventInvoker : MonoBehaviour {

	// イベント登録
	[SerializeField]
	private UnityEvent events = new UnityEvent ();

	// イベント実行
	public void InvokeEvent(){
		events.Invoke ();
	}
}
```



```EventInvokerEditor.cs
using UnityEngine;
using System.Collections;
using UnityEditor;

/// <summary>
/// イベントを実行するボタン作る
/// </summary>
[CustomEditor(typeof(EventInvoker))]
public class EventInvokerEditor :  Editor{

	public override void OnInspectorGUI(){
		DrawDefaultInspector ();
		EventInvoker eventInvoker = (EventInvoker)target;
		// ボタン作成
		if (GUILayout.Button ("InvokeEvent")) {
			eventInvoker.InvokeEvent ();
		}
	}
}

```
vscode-php-intellisense で 「Connection to server got closed. Server will not be restarted」

vscodeでPHPの開発を便利にするプラグインなのですが、node-moduleを含んだプロジェクトでプラグインが立ち上がらない場合の解決法メモ。


# 問題 / problem

- [vscode-php-intellisense](https://github.com/felixfbecker/vscode-php-intellisense)

php intellisense で 
「Connection to server got closed. Server will not be restarted」
となる問題。


## 原因

- npm が2系でロングパスの問題でエラーが起きるようです。


## 解決方法

ベースとなっている php-language-serverに解決方法が書いてあったのでメモ

[issue #51](https://github.com/felixfbecker/php-language-server/issues/51)

node 7系、npm 3系統で解決。
Hardware acceleration によって Canvas が動かない場合の対処法

AndroidのカスタムView内で使用していた`Canvas#clipPath()`で`UnsupportedOperationException`が発生したので調査していたところ、原因が「Hardware acceleration」という聞きなれない機能でした。
同じようにハマる人がいそうなので、「Hardware acceleration」の概要と制御の仕方をメモしておきます。
カスタムViewを作る人は知っておいたほうがいいです。

## 概要

ハードウェアアクセラレーションはViewの描画処理にGPUを使用することで効率化する機能です。

以下、注意点。

* Hardware acceleration は**APIレベル14以上でデフォルトON**
* 標準のViewとDrawableを使う分には常にONで影響なし
* 全ての描画処理をサポートしているわけではないので、ONになっていると**カスタムViewで問題がでる場合がある**
  * 意図しない描画になったり、最悪例外が発生してクラッシュします。今回は`Canvas#clipPath()`がAPIレベル18以上でないとサポートされていなかったので例外発生しました。
  * [各メソッドのサポート状況](https://developer.android.com/guide/topics/graphics/hardware-accel.html#unsupported)で自分が使っているメソッドをサポートしているAPIレベルを確認しておくことをオススメします

## 設定方法

以下のレベルでハードウェアアクセラレーションの制御が可能です。
（具体的な制御方法は最後の参考リンクの公式ドキュメントを参照してください）

* Application => AndroidManifest.xmlで設定
* Activity => AndroidManifest.xmlで設定
* Window　=> コードで設定
* View => コードで設定、ただし現在OFFにすることだけ可能

**使いたいメソッドをサポートしているAPIレベルを確認して、満たしていないときはOFFにする**、という対応が一番簡単だと思います。
今回は、以下のようにカスタムViewの例のように、サポートしていないAPIレベルの場合は、ビューレベルでOFFにすると意図した描画になりました。

```
    @Override
    protected void onDraw(Canvas canvas) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) {
            // Turn off hardware acceleration to use Canvas#clipPath()
            // See https://developer.android.com/guide/topics/graphics/hardware-accel.html#unsupported
            setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        }
        canvas.clipPath(mPath);
        super.onDraw(canvas);
    }
```


## 参考

* 公式ドキュメント
  - https://developer.android.com/guide/topics/graphics/hardware-accel.html
* 同じようにハマっている例
  - http://stackoverflow.com/questions/13248904/unsupportedoperationexception-on-clippath
KivyアプリケーションをGoole Play Storeで公開する為に #4 APKをリリース用にビルド、署名、公開

# 署名の為の鍵を準備

JDKに含まれているkeytoolを使うのですがLinuxには元々keytoolがあるようなので、whichコマンド等でJDKの物が有効になっているか確認したら、以下のコマンドを打ちます。

```
$ keytool -genkey -v -keystore <鍵の入れ物のファイル名> -alias <鍵の名前> -keyalg RSA -validity 10000
```

<鍵の入れ物のファイル名>と<鍵の名前>は自由に決めて下さい。実行してみると鍵(Key)と鍵の入れ物(KeyStore)の２つに対してPasswordを設定しろと言われます。なのでPasswordを決めて入力します。

# 環境変数を設定

上の手順で作ったKeyStoreやPasswordを環境変数に設定します。

```
export P4A_RELEASE_KEYSTORE=<KeyStoreへのPath>
export P4A_RELEASE_KEYSTORE_PASSWD=<KeyStoreのPassword>
export P4A_RELEASE_KEYALIAS=<Keyの名前>
export P4A_RELEASE_KEYALIAS_PASSWD=<KeyのPassword>
```

# Build

```
$ buildozer android release
```

Buildしたら実機で確認して終わりです。

# そして公開
後はGoogle Play Developer Consoleのページから指示に従っていくだけです。ここは特に問題が生じなかったので説明は省きます。

# 以前は必要だった作業

ここの手順は現在は自動でしてくれるので必要ないのですが、どこかで役に立つかもしれないのでメモしておきます。

#### 署名

```
jarsigner -verbose -tsa http://timestamp.digicert.com -digestalg SHA1 -sigalg MD5withRSA -keystore <鍵の入れ物のファイル名> <署名対象のAPKファイル名> <鍵の名前>
```

#### APKを最適化

```
zipalign -v 4 <最適化したいファイル> <最適化後のファイル名>
```


# 記事一覧

[#1 Kivy Launcherで動作確認](http://qiita.com/gotta_dive_into_python/items/5296ae8fef86751c238d)
[#2 APKを作成](http://qiita.com/gotta_dive_into_python/items/f3a6a2c83ed96366bc2f)
\#3は削除(GooglePlayの開発者登録をするだけの記事)
\#4 APKをリリース用にビルド、署名、公開
[#5 Python3でもAPKを作る(結果は失敗 -> その後成功)](http://qiita.com/gotta_dive_into_python/items/3f0d8db9373e7d96ef91)
Delphi/C++BuilderのPAServerがmacOS Sierraでは日本語メッセージが出ない場合の対処方法

[エンバカデロ・テクノロジーズ](http://www.embarcadero.com/jp/)の[RAD Studio](https://www.embarcadero.com/jp/products/rad-studio)/[Delphi](https://www.embarcadero.com/jp/products/delphi)/[C++Builder](https://www.embarcadero.com/jp/products/cbuilder)では、Windows上のIDEでMacOSやiOSデバイス向けのアプリケーションをビルドして実機デプロイするわけですが、この場合にはPAServerというブリッジサーバをMacOS上で動かす必要があります。

しかしmacOS SierraでPAServerを実行すると、本来は日本語で表示されるはずの各種メッセージが英語で表示される場合があります。

この対処方法をRAD Studio/Delphi/C++Builderのバージョン別に紹介します。

## 10.1 Berlin Update 2 を利用中の場合
このリリースに付属の PAserver 9.0.2.03 は日本語メッセージが正しく表示されますので対処不要です。

## 10.1 Berlin Update 1 を利用中の場合
このリリースに付属の PAserver 9.0.2.03 を macOS Sierra で実行すると、メッセージが英語になります。PAServer のバージョン番号が 10.1 Berlin Update 2 と同じなのは typo ではなく、本当にこのバージョン表記となっています。（むしろ、Update 2 に付属のPAServerのバージョン番号がアップデートされていないことのほうが問題かと）

さて、このバージョンの場合の対処は２つです。

### 10.1 Berlin Update 2 にアップデートする。
10.1 Berlin Update 2 にアップデート可能な方はアップデートしたほうがよいかと思います。

### PAServer の日本語リソースファイルのファイル名を書き換える。
10.1 Berlin Update 2 へのアップデートが直ちに行えず、かつメッセージを日本語で出したい場合は、/Application/PAServer-18.0.app/Contents/MacOS にある "paserver.ja" を "paserver.ja-jp" にリネームしてください。

この作業は、ターミナルを開いて以下のように実行します。

```sh
$ cd /Application/PAServer-18.0.app/Contents/MacOS 
$ sudo paserver.ja paserver.ja-jp
```

リネームできていたら、ファイル名はこんなふうになっているはずです。下から4つめのファイル名が他とは違うことが分かるでしょうか。

![スクリーンショット 2016-11-16 9.22.59.png](https://qiita-image-store.s3.amazonaws.com/0/149350/14eb4009-b65f-b5d1-bc24-a26ad5628789.png)


なお、この作業が必要な理由ですが、これはmacOS Sierraでロケール関連の実装が今までと変わっているためです。つまり、本件は実はPAServerだけの問題ではなく言語によってメッセージを切り替えるようなアプリはすべて影響を受ける可能性があります。本件事象に関連するAPIは以下のURLの通りです。

https://developer.apple.com/reference/corefoundation/1542887-cflocalecopypreferredlanguages?language=objc


## 10.1 Berlin Update 1 より前のバージョンを利用中の場合

10.1 Berlin Update 1 より前のバージョンを利用中の方も、Update 1 向けと同じ対応を行っていただければOKです。
iOS10以降をターゲットにした場合の動作環境まとめ


つまり、iOS9以下を切り捨てた時の、ハードと解像度のまとめです。

互換表示や拡大表示については省略。

## 情報を確認した環境

|環境	|情報			|
|-------|---------------|
|Date	|2016/11/16		|

## まとめ

|サイズ	|端末						|ポイント	|ピクセル	|
|-------|-------					|-------	|-------	|
|4		|iPhone 5/5s/5c/SE<br>iPod touch (第6世代)			|320x568	|640x1136	|
|4.7	|iPhone 6/6s/7				|375x667	|750x1334	|
|5.5	|iPhone 6+/6s+/7+			|414x736	|1242x2208 [註1]	|
|7.9	|iPad Mini 2/3/4			|768x1024	|1536x2048	|
|9.7	|iPad 4/Air/Air 2/Pro 9.7	|768x1024	|1536x2048	|
|12.9	|iPad Pro 12.9				|1024x1366	|2048x2732	|

註1: Retinaの倍率は3倍、デバイスの解像度は1080x1920

## 感想

3.5インチのiPhoneが切り捨てられて、縦方向の制限がちょっと楽になっただけ・・・　かな？　iPadでSplit Viewに対応することまで考えると、横方向の最小が320ptの時代は当分続きそう。

## 情報元

iOS 10 と互換性のあるデバイス - Apple サポート
https://support.apple.com/ja-jp/KM206870

iPod touch - 仕様 - Apple（日本）
http://www.apple.com/jp/ipod-touch/specs/

iPhone/iPad解像度(画面サイズ)早見表 - Qiita
http://qiita.com/tomohisaota/items/f8857d01f328e34fb551
[Elixir] Mixプロジェクトの動的読み込み

## モジュール動的読み込みの問題点

以前[モジュールの動的読み込み](http://qiita.com/maueki/items/f1a49c86cf39846df834)について書いたが、Mixプロジェクトに対して実行する場合は以下の欠点があった。

* `config/config.exs`を読まない
* `mix.exs`のdepsをロードしない

今回は上記2点の解消を目指した。

## コード概要

全体は以下にある

https://github.com/maueki/elixir_dynamic_load_module

parentとpluginの2つのmixプロジェクトがあり、parent側の`Parent.run()`を実行すると動的にpluginプロジェクトを読み込み`Plugin.decode()`を実行する


```ex:plugin/lib/plugin.ex
defmodule Plugin do
  def decode() do
    val = Application.get_env(:plugin, :config_value)
    Poison.decode!("{\"test\": \"#{val}\"}")
  end
end
```

以前の方法で`Plugin.decode`を実行すると`Plugin.Mixfile.deps`に`:poison`が定義されていても「`Poison`が定義されていない」と言われてしまう。

```ex:parent/lib/parent.ex
defmodule Parent do
  def run() do

    {compile_path, plugin_mod} = Mix.Project.in_project(:plugin, "../plugin", [], fn _ ->
      Mix.Tasks.Loadconfig.run([])
      Mix.Tasks.Deps.Loadpaths.run([])
      {Mix.Project.compile_path, Mix.Project.config[:plugin_mod]}
    end)

    Code.prepend_path(compile_path)
    Code.ensure_loaded(plugin_mod)

    apply(Plugin, :decode, [])
  end

end
```

`:plugin_mod`は今回私が`Plugin.Mixfile.project`に勝手に定義したもので`Plugin`モジュールを指している。

`Mix.Project`はグローバルに状態を持っていて、現在のプロジェクトを参照するが、`Mix.Project.in_project`を使うと一時的にプロジェクトを変更しそのプロジェクト上で引数に渡された関数を実行する。その関数内で`Mix.Tasks.Loadconfig.run`と`Mix.Tasks.Deps.Loadpaths`を実行することでconfigとdepsの読み込みを実現している。

懸念点としては`Mix.Project.in_project`は内部で`File.cd!`を呼んでいるため(ElixirではなくOSの)プロセスのカレントディレクトリが変更されてしまう。そのため、このコード自体やカレントディレクトリに依存するようなコードを複数同時に実行するのは非常にまずそうである。


## 最後に

とりあえず上記の方法でMixプロジェクトの動的読み込み風のことは実現できたが、かなり無理矢理感が漂う。
もっと良い方法があればぜひ教えていただきたいが、もしかするとElixirの作法的にはプラグイン的なものを実現する場合はプラグインアプリケーションを別途立ち上げてメッセージによる登録処理を行うのが正しくて、今回のように動的読み込みというのは想定外なのかもしれない。
Delphi / C++ Builder / RAD Studio 10.1 Berlin Update2 - Anniversary Edition

エンバカデロ は2016年11月15日、品質向上と新機能、機能強化を含む RAD Studio / Delphi / C++ Builder 10.1 Berlin の Update2 – Anniversary Edition をリリースしました。このアップデートは 10.1 Berlinに対して2回目のアップデートとなります。 この記事では10.1 Berlin Update2の内容をまとめておきます。

![Update2_banner.png](https://qiita-image-store.s3.amazonaws.com/0/145847/deeb4af8-019b-74f7-d599-7df84a962e0b.png)

## 10.1Berlin Update2 概略
今回のUpdate2で下記の新機能を提供しています。 

* **Windows 10 Anniversary Editionに対応、Windows10 ストアアプリの開発が可能に**
Desktop Bridgeテクノロジーにより既存のWindowsデスクトップアプリケーションをWindowsストアで公開可能

* **VCLに新しいCalendar UIコントロールを搭載**
下記２つののWindows 10ライクな新しいカレンダー機能をVCLに追加
    + TCalendarView
    + TCalendarPicker
 
* **iOS 10 および macOS Sierra サポートを強化**
Update 1からサポートプラットフォームに加わったiOS 10とmacOS Sierraの対応をさらに改善

* **Quick Editsにより開発生産性を向上**
使用頻度の高い機能、コンポーネントに右クリックでかんたんにアクセスできます。

* **新しいWindows 10スタイルを搭載**
VCL向け、FireMonkey向けそれぞれに新 Styleを追加

* **他**
C++言語の機能強化
GetItインストーラの改善
数多くのバグフィックス・機能改善
 

##修正リスト
報告された問題の修正リストのすべては こちらから参照できます。

* 英語版：http://edn.embarcadero.com/article/44726/
* 日本語版：http://edn.embarcadero.com/jp/article/44727/
 

##参考DocWiki
さらなる説明はこちらのDoc Wikiをご参照ください

* http://docwiki.embarcadero.com/RADStudio/Berlin/ja/Subscription_Update_2_-_Anniversary_Edition
 

##入手方法
Berlin 10.1 Update 2は、RAD Studio / Delphi / C++Builderの有効なアップデートサブスクリプションに加入している方なら、登録ユーザーページからダウンロードしてすぐに利用できます。

* GetItオンラインインストーラー: http://cc.embarcadero.com/item/30648 
* ISO形式セットアップインストーラー : http://cc.embarcadero.com/item/30652

または「My Registered User Downloads」をご参照ください。
http://cc.embarcadero.com/myreg

**ご注意**
Update2の提供形態はアップデートパッチではなく、フルインストーラー形式です。Update2インストール前に既存のバージョンのアンインストールが必要にになります。アンインストール前には念のため「移行ツール」で設定を保存しておくことをお勧めします。
※移行ツールの使用方法については、以前Update１リリースの際にブログで記載しました。Update2でも使い方は同じです。ご参考までにそのブログリンクを記載しておきます。 ： https://community.embarcadero.com/blogs?view=entry&id=8883
#3 【攻略】RubyWarrior Level3

RubyWarriorのLevel3の攻略
参考サイト: http://tumiki.hatenablog.jp/entry/2015/06/23/003951

#スクリプト
```
class Player
  def play_turn(warrior)
    if warrior.feel.empty?
      if warrior.health < 10 
        warrior.rest!
      else
        warrior.walk!
      end
    else
      warrior.attack!
    end
  end
end
```

#解説
warrior.healthでプレイヤーの体力の数値を確認できるので、これが10以下のときにwarrior.rest!してやる。

けど、敵がいるときにwarrior.rest!を実行すると回復が敵の攻撃に追いつかなくなるのでwarrior.feel.empty?がtrueを出したときのみwarrior.rest!させる。

warrior.feel.empty?がfalse(敵がいる)の場合はwarrior.attack!で攻撃を優先させる。
SlackAPIでオンラインのユーザーをランダムに２人レビュワーに選び、GitAPIでアサインするHubot

![Untitled.gif](https://qiita-image-store.s3.amazonaws.com/0/108235/2c308d7d-737c-83ff-4658-4af4b52b4b03.gif)

[Github Oden](https://github.com/s1160054/oden)
React.js製の静的サイトジェネレーターGatsbyに移行した

これまで WordPress を使って技術メモを書いていたのですが、静的サイトジェネレーターの記事を読んで試してみたいと思いました。
とりあえず有名どころの jekyll, Hugo, Hexo などを一通り使ってみたのですが、React.js 製の Gatsby が面白そうだなと思って WordPress から移行してみました。

> gatsby
> https://github.com/gatsbyjs/gatsby

ちなみに移行したサイトは[こちら](https://jaxx2104.info/)

![](http://i.imgur.com/AgbPBxU.png)

## Gatsbyの特徴
- React.js ならではのリロード無しでのページ遷移  
- サイト構築のためのコンポーネント・モデルが使える
- ライブで開発できる

## 導入方法
事前に　Node.js と npm をインストールしておく必要があります。

インストール

```
npm install -g gatsby
```

プロジェクト作成

```
gatsby new blog https://github.com/gatsbyjs/gatsby-starter-blog
```

開発サーバー開始

```
cd blog
gatsby develop
```
localhost:8000 にアクセスするとページ確認できると思います。ライブリロードが有効になっているのでリアルタイムで変更が反映されます。


## 各ディレクトリの役割
テーマなどによって微妙に違うかもしれませんが理解してる範囲で。

- `config.toml` 設定ファイル
- `/components` コンポーネントディレクトリ
    - `_template.js` テンプレートファイル
    - `index.js` インデックスファイル
- `/pages` データファイル（記事や固定ページ）
- `/wrappers` 記事や固定ページの wrapper?
- `/static` css や fonts

## WordPress から Gatsby に移行する
jekyll の移行ツールを使えば記事データをマークダウンにしてくれます。その後で以下の２点を一括編集して。`/pages`に移しました。

- permalink を path に置換
- 画像ファイルパスの書き換え

> jekyll-import
> http://import.jekyllrb.com/

## Github Pages に公開する
### Project Page の場合
パスを揃えるため config.toml の linkPrefix にプロジェクト名を入れ、Github にリモートレポジトリを設定し、

```
npm run deploy 
```

すると`package.json`の

```
gatsby build --prefix-links && gh-pages -d public
```
が実行されて、gh-pagesブランチでサイトが更新されます。


### Profile Page の場合
自分は Netlify を使いこの方法で公開しました。Netlify については以下の記事が詳しいです。

> 高機能ホスティングサービスNetlifyについて調べて使ってみた
> http://qiita.com/TakahiRoyte/items/b7c4d1581df1a17a93fb

使い方は Netlify にサインアップ後 GitHub とアカウント連携し今回のレポジトリを指定、以下の設定で保存します。

- Branch: master
- Build Cmd: gatsby build
- Public folder: public/

あとは管理画面上でカスタムドメインを設定しHTTPSを有効化したら完了。
master に push するとサイトが更新されます。

## 感想

機能的にはReact.js のコンポーネント設計によるテーマ作成のし易さと、生成されたページがリロード無しでの遷移出来るのがいいと思いました。`gatsby build` は少し時間がかかるかなという感じ。

費用的にはレンタルサーバー代の月1,500円分を節約出来ました。カスタムドメインも使わなければ0円で運用できるのでいいですね。

あと今回公式のテーマを参考にBootstrapを使ったテーマを作ってみました。
まだ技術的な情報が少ないので使う人が増えてくれるといいなと思います。

> jaxx2104/gatsby-starter-bootstrap
> https://github.com/jaxx2104/gatsby-starter-bootstrap
文字コードを再設計しようと考えて、試作をしている。

文字コードを再設計しようと考えて、試作をしている。
文字コードにはいろいろあるが、ぜんぜんだめだと思ったのは、基本的に漢字を音読みで分類している、ということだ。基本がだめだと感じた。それは一二三四五六七八九〇十百千壱弐参と上中下を文字コードで並べたときの並び順を見れば明らかだ。
漢字には、そうでなければ不自然な順番をもつものがあるのであり、その究極が漢数字だ。あるいは上中下だ。漢数字と上中下を文字コードで並べると、どうしようもない結果となってしまう。文字コードはぜんぜんだめだと感じた。
音読みが自然かというと、それに対しても不自然さを感じないわけにはいかないのだった。「牛」は「ぎゅう」、「犬」は「けん」と読んで分類する。これは日常的な感覚からすると、あまりにも不自然に感じるのである。しかもなぜか「猫」は「びょう」ではなく「ねこ」と読んでいる。なぜだ、このいいかげんな混乱は。恣意的といってもいい。
説明できないものは混乱であり、説明できても納得できないことだって山ほどある。ものの並びが思ったとおりでないということは、居心地が悪く、それを長いあいだ見ていると、慣れるよりは混乱して不満がたまってくる。不満のままでいることは不快なので、そのくらいならいっそ自分の満足いくように文字コードを再設計したほうがずっとマシ、ということになるわけだ。
とはいえもちろん、ものを並べることに価値判断はつきものだから、いちいち判断する必要があり、一筋縄ではいかない。
上中下はよいとして、それなら優劣はどうするのかとか、売買はどうするのかとか、月火水木金土日はどうするのかとか、日水金地月火木土天海ではないのかとか、冥はどうするとか、色は色相輪にしたがうのかとか考え始めるとなかなか切りがない。
月曜起こしなのか日曜起こしなのか。単純なルールのほうがよくはあるが、ルールにしたがわない事例のある単純なルールでは混乱の元だ。
意味だけを求めると図書館の十進分類のようになり、それなら五十音のほうが単純だということもある。切りがないということはおもしろいということでもある。試作がどのくらいかかるかはわからないが、楽しんでみよう。
X11におけるマウスカーソルの大きさの変更

`.Xresources` に以下を書く。

```
Xcursor*size:  48
```

が、複数サイズに対応してないテーマだと指定が効かないので、サイズ変更できそうなテーマを探す。NixOSを使ってるので、だいたい以下のような雰囲気にした。

```
$ nix-env -i vanilla-dmz
$ ln -s /nix/store/*-vanilla-dmz-0.4.4/share/icons/Vanilla-DMZ .icons/default
```

ただ、 `xterm` にはこれだと効かない。わからなかったので、　http://shallowsky.com/linux/x-cursor-themes.html の人と同じように目立つように色付けして諦めた。

```
XTerm*pointerColor: white
XTerm*pointerColorBackground: yellow
```
最新のTmuxを入れる方法

apt-getなどでは最新版が入らないことが多々ある。
パッケージをインストールする時、手動で設定する方法をメモ。

## 任意のバージョンのTmuxを入れる方法
対象はlinuxユーザ。

```
$ sudo apt-get update
$ sudo apt-get install -y libevent-dev libncurses-dev make
$ wget https://github.com/tmux/tmux/releases/download/2.x/tmux-2.x.tar.gz
$ tar xvzf tmux-2.x.tar.gz
$ cd tmux-2.x/
$ ./configure && make
$ sudo make install
```

## 追記
git cloneで最新のリポジトリから取得する時もある。
例えば、Tigの最新版を入れる方法を記載する。

```
$ git clone https://github.com/jonas/tig.git
$ cd tig
$ sh autogen.sh
$ ./configure --without-ncurses #日本語対応(必要なければ./configureだけでOK)
$ make
$ sudo make install
```
tmuxなら、こう。

```
$ git clone https://github.com/tmux/tmux.git
$ cd tmux
$ sudo apt-get install automake
$ sh autogen.sh
$ ./configure
$ make
$ sudo make install
```
新しく買ったMacに設定したもの

２０１０年から使っていたMacBook Proに引退してもらって、新しくMacBook(Retina, 12-inch, Early 2016)を購入しました。

新しいMacBook Proの発表があったこのタイミングであえてのMacBook。
あのファンクションキーを置き換えたタッチバーにはあまり魅力を感じなかったことと、13インチのファンクションキー付きのモデルと比較してみて自分の用途ならMacBookで十分でコストパフォーマンスもいいのではないかなと思った結果です。

まだとりあえず直近不自由がない程度になったかなというところで追記するかもしれません。

## 日本語入力
いつもMacの言語設定は英語にしています。
またキーボードはUSキーボードです。
かな英数切り替えボタンがないのでいくらか日本語入力周りの入力設定を最初にいじります。
Keybord -> shorcuts -> input sources -> Select next source in input menu に自分の好きなショートカットを設定


## タッチパッド
* Secondary click -> click or tap with two fingerにしてますがclick in bottom right cornerにするかも。
* Tap to click -> チェックOn


## Homebrew

```bash
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

http://brew.sh/index_ja.html

## Homebrew Cask
https://caskroom.github.io

```
brew tap caskroom/cask
```

インストールできるアプリはここからGUIで検索可能
https://caskroom.github.io/search

CLIでは以下のように検索できる。
Homebrewでインストールできるものはこれで入れるようにしてみる。

```
brew cask search chrome
```

## Chrome

```
brew cask install google-chrome
```

## iTerm2
Macではずっとこのターミナルを使ってます。
https://www.iterm2.com/downloads.html

```
brew cask install iterm2
```

## Visual Studio Code
PythonやNode.jsの開発環境として最近はこれを使っています。
MarkdownもKobitoのようにプレビューを確認しながら編集できるので気に入ってます。

```
brew cask install visual-studio-code
```

これとは別にpythonやNode.jsのインストールもしましたがそれはまた別の記事に。

## Atom
Atomも入れました。

```
brew cask install atom
```
他のMacとGist経由で設定の同期ができたりするのがいいなと。
http://qiita.com/T_M/items/0fb0804eb1fd256aac4e

## Docker for Mac
手元でDockerコンテナでテストしてAWS, GCPなどのコンテナサービス上に同様の環境を構築してデプロイしちゃう環境を。
https://www.docker.com/products/docker#/mac

## Spotify
作業用のBGMとして使ってます。
スタバやナイキがプレイリストを聴いたりとかしておしゃれな作業環境には欠かせません(笑)
<iframe src="https://embed.spotify.com/?uri=spotify%3Auser%3Astarbucks%3Aplaylist%3A3JUf7Sj7OPMHoQSWChbT1c" width="300" height="380" frameborder="0" allowtransparency="true"></iframe>

```
brew cask install spotify
```
Swiftで配列(Array)の差分を取得する

# Swiftで配列(Array)の差分(diff相当)を取得する
出典は[こちら](http://blog.sgr-ksmt.org/2016/04/13/array_diff_keep_ordering/)です。
Swiftのバージョンが低くそのまま使えなかったので、すこし手直しして共有しておきます。

```Swift
extension Array where Element: Hashable {
	typealias E = Element
	func diff(_ other: [E]) -> [E] {
		let all = self + other
		var counter: [E: Int] = [:]
		all.forEach { counter[$0] = (counter[$0] ?? 0) + 1 }
		return all.filter { (counter[$0] ?? 0) == 1 }
	}
}

let a = [1, 2, 3, 4]
let b = [8, 2, 3, 9]
let diff1 = a.diff(b) // => [1, 4, 8, 9]
let diff2 = b.diff(a) // => [8, 9, 1, 4]
```

# Swiftで配列(Array)の差分(引き算)をする
Setのsubtract/subtracting相当のメソッドです。
こちらは新しく作りました。
比較のため、利用する配列は`Equatable`に準拠している必要があります。

```Swift
extension Array where Element: Equatable {
	typealias E = Element

	func subtracting(_ other: [E]) -> [E] {
		return self.flatMap { element in
			if (other.filter { $0 == element }).count == 0 {
				return element
			} else {
				return nil
			}
		}
	}

	mutating func subtract(_ other: [E]) {
		self = subtracting(other)
	}
}

var a = [1, 2, 3, 4]
let b = [8, 2, 3, 9]

let sub1 = a.subtracting(b)
sub1 // => [1, 4]
a // => [1, 2, 3, 4]
a.subtract(b)
a // => [1, 4]
```
技術英語 > confessional debugging / Jeniffer [didn't say a word], and you solved your problem / food for thought

@ Code Complete (No. 17674 / 36077)

> Talk to someone else about the problem.

> confessional debugging

...

> Jeniffer <font color=red>didn't say a word</font>, and you solved your problem.

人に話すことで、話をした人の考えが整理されるということ。

話しかけられる人が時間的に余裕がある場合はいいが、そうでない場合は遠慮した方がいいと思う。背景を知らない人の場合、その背景の説明もしていたら、30分とかあっという間に時間がなくなる。
時間的に余裕のある二人で、後輩の教育目的であれば、話をしながら整理するのは有用ではある。

代わりの案として、ぬいぐるみに話しかける、という方法を提案している大学教授もいる。
Rubber duck debuggingという用語もあるようだ。
https://en.wikipedia.org/wiki/Rubber_duck_debugging

最近の僕の場合は、Qiitaの記事とすることで、考えの整理が進んでいるように思われる。
誰かの考えの糧(food for thought)になりそうなものは公開記事として、そうでない場合は限定記事にしたりする。
PycURLでログイン、レスポンスを受け取る

pythonのcURLライブラリ「PycURL」にて、
ログイン認証を経てHTMLなりjsonなりのレスポンスを受け取る方法。

要はどうやってcookieを保存して、cookieを添えたリクエストを送るのかと言うお話です。


#PycURLの基本
こちらが大変参考になります。
インストールから各種HTTPメソッドの送り方など。
お世話になりました。
[PycURLでHTTPリクエストあれこれ](http://qiita.com/TakesxiSximada/items/db015b8d030cefa578a1)


#ログイン(cooikeの保存)
ログインして、そのcookieを保存するには以下の様にして行います。
(簡略化のため、例外処理・UserAgent・タイムアウトなど一切無視します。)

```login.py
import pycurl
import io

curl = pycurl.Curl()
curl.setopt(pycurl.URL,'https://www.xxx.com/login.php' )
curl.setopt(pycurl.POST, 1)
curl.setopt(pycurl.HTTPPOST, [('email', 'qqq@ppp'), ('pass', 'qqqppp')])
curl.setopt(pycurl.COOKIEJAR,'cookie.txt')

#以下2行は、コマンドラインにレスポンスを表示させないための記述。本質ではない。
b = io.BytesIO()
curl.setopt(pycurl.WRITEFUNCTION, b.write)

curl.perform()
```

ここで大切なことは、
「ログインした時のcookieを'./cookie.txt'に保存して」
と言うオプションを加えるには、下記の様に記すということです。

```
curl.setopt(pycurl.COOKIEJAR,'cookie.txt')
```

後ほど、このcookieを添えて、ログイン認証が必要なページに対してリクエストを送ります。
<br>
リクエスト送信先、およびパラメータ名は、
ログインページのソースを参照するか、通信履歴(chromeの検証→Networkタブ)から調べると良いと思います。
また、ログインに必要なパラメータが増える場合、リストの要素をそのまま増やせば良いです。


```
curl.setopt(pycurl.URL,'https://www.xxx.com/login.php' )
curl.setopt(pycurl.POST, 1)
curl.setopt(pycurl.HTTPPOST, [('para1', 'aaa'), ('para2', 'bbb'), ('para3', 'ccc'), ...])
```

<br>

#ログイン認証が必要なページのレスポンスを受け取る
ログインが必要なxxx.comのmainページのHTMLを受け取る想定で記します。

```request_page.py
import pycurl
import io

curl = pycurl.Curl()
curl.setopt(pycurl.URL,'https://www.xxx.com/main' )
curl.setopt(pycurl.COOKIEFILE,'cookie.txt')
b = io.BytesIO()
curl.setopt(pycurl.WRITEFUNCTION, b.write)

try:
  curl.perform()
  ret = b.getvalue()
  http_code = curl.getinfo(pycurl.HTTP_CODE)

except Exception as e:
  ret = str(e)

```

ここで大切なことは、
ログインを経て生成されたcookie.txtを添えてリクエストを送るには、

```
curl.setopt(pycurl.COOKIEFILE,'cookie.txt')
```
と記述すると言うことです。

**cookieを保存するときは pycurl.COOKIEJAR**
**cookieを使用するときは pycurl.COOKIEFILE**


<br>
次に、レスポンスを受け取ります。

```
b = io.BytesIO()
curl.setopt(pycurl.WRITEFUNCTION, b.write)
ret = b.getvalue()
```

これでret内にはmainページのHTMLがstr型で格納されていて、他の変数同様加工が可能です。
当然jsonをリクエストすることも可能です。
その場合受け取るレスポンスはstr型のため、jsonモジュールなどでデコードします。
DD-WRT設定を公開します

はじめに
========================================

とても今更の話題ですが、設定を見直したので、
個人的なメモも兼ねてまとめておきます。

DD-WRT自体の導入方法は、Webにわかりやすい解説がゴロゴロ転がっているので、そちらを参照してください。

前提
========================================
- Hardware : Buffalo WZR-HP-AG300H
- Firmware : DD-WRT v24-sp2 (12/22/14) std

特記事項
========================================
- [SSH公開鍵登録](http://qiita.com/ryskiwt/items/9eaafe30a56e5ca0ecb5)
- [Connection Warning Notifier設定](http://qiita.com/ryskiwt/items/97f5436f4e3b908311cd)
- [DDNS設定 (ieServer.net)](http://qiita.com/ryskiwt/items/92e46a39142d90f63017)
- [DNS設定](http://qiita.com/ryskiwt/items/9eaafe30a56e5ca0ecb5)
- [OpenVPN設定](http://qiita.com/ryskiwt/items/9ec5ae8ce4509a47365f)

各種設定値
========================================
- [DD-WRT設定 基本タブ](http://qiita.com/ryskiwt/items/92e46a39142d90f63017)
- [DD-WRT設定 無線LANタブ](http://qiita.com/ryskiwt/items/06573ac175a53da3e348)
- [DD-WRT設定 ネットワークタブ](http://qiita.com/ryskiwt/items/9eaafe30a56e5ca0ecb5)
- [DD-WRT設定 セキュリティタブ](http://qiita.com/ryskiwt/items/97f5436f4e3b908311cd)
- [DD-WRT設定 管理タブ](http://qiita.com/ryskiwt/items/5f5e8b4056022df810d8)
dired-toggle.elを開きっぱなしにする

dired-toggle.elをVisual Studioのソリューションエクスプローラーのように使いたかったので、
ファイルを開いたあとにウィンドウが閉じないように設定した。

設定
==
dired-toggle.elのdired-toggle-action-find-fileを以下のように編集


```diff:dired-toggle.el
(defun dired-toggle-action-find-file ()
  "Custom item action under `dired-toggle-mode'."
  (interactive)
  (let* ((buffer (current-buffer))
         (file (dired-get-file-for-visit))
         (dir-p (file-directory-p file)))
    (if dir-p                           ;open a directory
        (dired-toggle-list-dir buffer (file-name-as-directory file))
      ;; open a file, and delete the referred window firstly
      (if (and (window-live-p dired-toggle-refwin)
               (not (window-minibuffer-p dired-toggle-refwin))
               ;; Some times `dired-toggle-refwin' maybe dired-toggle
               ;; window itself, so just ignore it.
               (not (equal (selected-window) dired-toggle-refwin)))
---		  (delete-window dired-toggle-refwin))
+++	      (select-window dired-toggle-refwin))
---	(dired-find-alternate-file)
+++	(find-file file)
    )))

```

余談
==
プラグインを直接書き換えるのはよろしくない感じがするが、
関数の振る舞い変更をinit.elに書き加えるやり方がいまいちわからんかったのでこうした。
うまいやり方あったら教えてください。
DD-WRT設定 無線LANタブ

はじめに
========================================

DD-WRTの設定をまとめています。連載です。

- [DD-WRT設定を公開します](http://qiita.com/ryskiwt/items/6cc329a15f10df53a961#_reference-aabc0af3c3726d9baec5)
- [DD-WRT設定 基本タブ](http://qiita.com/ryskiwt/items/92e46a39142d90f63017)
- **DD-WRT設定 無線LANタブ** <- いまココ
- [DD-WRT設定 ネットワークタブ](http://qiita.com/ryskiwt/items/9eaafe30a56e5ca0ecb5)
- [DD-WRT設定 セキュリティタブ](http://qiita.com/ryskiwt/items/97f5436f4e3b908311cd)
- [DD-WRT設定 管理タブ](http://qiita.com/ryskiwt/items/5f5e8b4056022df810d8)



1. 無線LAN > 基本
========================================

物理インターフェース ath0
----------------------------------------
### Wireless Physical Interface ath0 [2.4 GHz]
レガシー端末のための2.4GHz設定

| 項目 | 設定値 | 備考 |
|:-:|:-:|:-:|
| Wireless Mode | AP | アクセスポイントモード |
| Wireless Network Mode | Mixed | IEEE802.11 b/g/n |
| Channel Width | Full (20 MHz) | 標準20MHz |
| Wireless Channel | 9 - 2452 MHz | （任意） |
| Wireless Network (SSID) | ***** | SSID |
| Wireless SSID Broadcast | [ ] 有効 [x] 無効 | SSIDの配信有無 |
| Reguratory Domain | JAPAN |  |
| TX Power | 10 dBm | これを超えると法律違反 |
| Antenna Gain | 0 dBi |  |
| Protection Mode | None |  |
| RTS Threshold | [ ] 有効 [x] 無効 |  |
| Short Preamble | [ ] 有効 [x] 無効 | 短いプリアンブルの使用 |
| TX Antenna Chain | 1+2 | MIMOで使用するアンテナセット（デフォルト） |
| RX Antenna Chain | 1+2 | MIMOで使用するアンテナセット（デフォルト） |
| AP Isolation | [ ] 有効 [x] 無効 |  |
| ScanList | default |  |
| Sensitivity Range (ACK Timing) | 2000 |  |
| Max Associated Clients | 256 |  |
| MTik Compatibility | [ ] 有効 [x] 無効 |  |
| Network Configuration | [ ] Unbridged [x] Bridged |

Virtual Interface
----------------------------------------
### 仮想インターフェース ath0.1
| 項目 | 設定値 | 備考 |
|:-:|:-:|:-:|
| Wireless Mode | AP |  |
| Wireless Network (SSID) | guest | |
| Wireless SSID Broadcast | [ ] 有効 [x] 無効 | |
| Advanced Settings | - | ath0と同じ |

物理インターフェース ath1
----------------------------------------
### Wireless Physical Interface ath0 [2.4 GHz]
| 項目 | 設定値 | 備考 |
|:-:|:-:|:-:|
| Wireless Mode | AP |  |
| Wireless Network Mode | NA-Mixed | IEEE802.11 a/n |
| Channel Width | Wide HT40 (20+20 MHz) | 標準の2倍で固定 |
| Wireless Channel | 36 - 5180 MHz | （任意） |
| Extension Channel | Upper | 2倍にする際にどちら側に広げるか |
| Wireless Network (SSID) | ***** | |
| Wireless SSID Broadcast | [ ] 有効 [x] 無効 |  |
| Advanced Settings | - | ath0と同じ |

2. 無線LAN > 無線LANセキュリティー
========================================

Wireless Security ath0
----------------------------------------
### 物理インターフェース ath0
| 項目 | 設定値 | 備考 |
|:-:|:-:|:-:|
| Security Mode | WPA2 Personal |  |
| WPA Algorithm | AES |  |
| WPA Shared Key | ***** |  |
| Key Renewal Interval (in secconds) | 3600 | （デフォルト） |

### 仮想インターフェース ath0.1
物理インターフェース ath0と同じ

Wireless Security ath1
----------------------------------------
### 物理インターフェース ath1
物理インターフェース ath0と同じ
DD-WRT設定 セキュリティタブ

はじめに
========================================

DD-WRTの設定をまとめています。連載です。

- [DD-WRT設定を公開します](http://qiita.com/ryskiwt/items/6cc329a15f10df53a961#_reference-aabc0af3c3726d9baec5)
- [DD-WRT設定 基本タブ](http://qiita.com/ryskiwt/items/92e46a39142d90f63017)
- [DD-WRT設定 無線LANタブ](http://qiita.com/ryskiwt/items/06573ac175a53da3e348)
- [DD-WRT設定 ネットワークタブ](http://qiita.com/ryskiwt/items/9eaafe30a56e5ca0ecb5)
- **DD-WRT設定 セキュリティタブ** <- いまココ
- [DD-WRT設定 管理タブ](http://qiita.com/ryskiwt/items/5f5e8b4056022df810d8)



1. セキュリティ > サーバー/サービス
========================================

Firewall設定
----------------------------------------
### Firewall保護
[x] 有効 [ ] 無効

### 追加フィルター
- [x] プロキシをフィルターする
- [x] Cookieをフィルターする
- [x] Javaアプレットをフィルターする
- [x] ActiveXをフィルターする

### インターネット側からのパケット遮断
- [x] Pingに応答しない
- [x] マルチキャストをフィルターする
- [ ] NATリダイレクションをフィルターする　TODO:チェック入りに変更する
- [x] IDENT(port 113)をフィルターする
- [x] Block WAN access

### Impede WAN DoS/Bruteforce
- [ ] Limit SSH Access
- [x] Limit Telnet Access
- [x] Limit PPTP Server Access
- [ ] Limit FTP Server Access

Connection Warning Notifier
----------------------------------------
### Connection Warning Notifier
| 項目 | 設定値 | 備考 |
|:-:|:-:|:-:|
| Warning Notifier | [x] 有効 [ ] 無効 |  |
| Connection Limit | 500 |  |
| Email SMTP Server | aspmx.l.gmail.com | [google SMTP] |
| SMTP Auth Username | （空欄） |  |
| SMTP Auth Password | （空欄） |  |
| Senders Email Address | router@gmail.com | （任意） |
| Senders Full Name | WZR-HP-AG300H | （任意） |
| Recipient Domain Name | （空欄） |  |
| Recipient Email Address | example@gmail.com | Gmailアドレス |

[google SMTP]:https://support.google.com/a/answer/176600?hl=ja
DD-WRT設定 管理タブ

はじめに
========================================

DD-WRTの設定をまとめています。連載です。

- [DD-WRT設定を公開します](http://qiita.com/ryskiwt/items/6cc329a15f10df53a961#_reference-aabc0af3c3726d9baec5)
- [DD-WRT設定 基本タブ](http://qiita.com/ryskiwt/items/92e46a39142d90f63017)
- [DD-WRT設定 無線LANタブ](http://qiita.com/ryskiwt/items/06573ac175a53da3e348)
- [DD-WRT設定 ネットワークタブ](http://qiita.com/ryskiwt/items/9eaafe30a56e5ca0ecb5)
- [DD-WRT設定 セキュリティタブ](http://qiita.com/ryskiwt/items/97f5436f4e3b908311cd)
- **DD-WRT設定 管理タブ** <- いまココ



1. 管理 > 管理
========================================

Router Management
----------------------------------------
### Router Password
よしなに設定する

### Web Access
| 項目 | 設定値 | 備考 |
|:-:|:-:|:-:|
| プロトコル | [x] HTTP [x] HTTPS | TODO: HTTPSのみに変更する |
| Auto-Refresh (in seconds) | 3 |  |
| Reauthentication Limit (in seconds) | 300 |  |
| Enable Info Site | [x] 有効 [ ] 無効 | Info画面を有効にするか |
| Info Site Password Protection | [x] 有効 | Info画面にの表示にパスワードが必要か |
| Info Site MAC Masking | [x] 有効 [ ] 無効 | Info画面でMACアドレスをマスクするか |

### Remote Access
TODO: リモートアクセス無効に変更

| 項目 | 設定値 | 備考 |
|:-:|:-:|:-:|
| Web GUI Management | [x] 有効 [ ] 無効 |  |
| Use HTTPS | [x] |  |
| Web GUI Port | 8080 | （任意） |
| SSH Management | [x] 有効 [ ] 無効 |  |
| SSH Remote Port | 22 |  |
| Telnet Management | [ ] 有効 [x] 無効 |  |
| Allow Any Remote IP | [ ] 有効 [x] 無効 |  |

2. 管理 > キープアライブ
========================================

キープアライブ設定
----------------------------------------
定期的に再起動してリフレッシュする設定

### 定時再起動
| 項目 | 設定値 | 備考 |
|:-:|:-:|:-:|
| 定期的に再起動 | [x] 有効 [ ] 無効 |  |
| 間隔（秒） | [ ] |  |
| 指定時刻に再起動を行う | [x] 12:00 水曜 |  |


3. 管理 > コマンド実行
========================================
Firewallスクリプト
----------------------------------------
[DD-WRTにOpenVPNサーバーを立てる](http://qiita.com/ryskiwt/items/9ec5ae8ce4509a47365f)を参照。
DD-WRT設定 ネットワークタブ

はじめに
========================================

DD-WRTの設定をまとめています。連載です。

- [DD-WRT設定を公開します](http://qiita.com/ryskiwt/items/6cc329a15f10df53a961#_reference-aabc0af3c3726d9baec5)
- [DD-WRT設定 基本タブ](http://qiita.com/ryskiwt/items/92e46a39142d90f63017)
- [DD-WRT設定 無線LANタブ](http://qiita.com/ryskiwt/items/06573ac175a53da3e348)
- **DD-WRT設定 ネットワークタブ** <- いまココ
- [DD-WRT設定 セキュリティタブ](http://qiita.com/ryskiwt/items/97f5436f4e3b908311cd)
- [DD-WRT設定 管理タブ](http://qiita.com/ryskiwt/items/5f5e8b4056022df810d8)




1. ネットワーク > サーバー/サービス
========================================

Services Management
----------------------------------------
### DHCP Server
#### 静的割り当て
DHCPで固定アドレスを割り当てる場合は、MACアドレス、ホスト名、固定するIPアドレスを記載。
（基本的に端末側では固定しない方針とする）

| MACアドレス | ホスト名 | IPアドレス | Client Lease Time |
|:-:|:-:|:-:|:-:|
| XX:XX:XX:XX:XX:XX | hostname | 192.168.X.X | （空欄） |

### DNSMasq
簡易DNSサーバーの設定。LAN内での名前解決に使用する。

| 項目 | 設定値 | 備考 |
|:-:|:-:|:-:|
| DNSMasq | [x] 有効 [ ] 無効 |  |
| Local DNS | [x] 有効 [ ] 無効 |  |
| No DNS Rebind | [ ] 有効 [x] 無効 |  |
| Add Requester MAC to DNS Query | [ ] 有効 [x] 無効 |  |

#### Additional DNSMasq Options
下記のように解決するよう設定

- host1.domain.myhome.cx -> 192.168.X.X
- host2.domain.myhome.cx -> 192.168.Y.Y

```text
address=/host1.domain.myhome.cx/192.168.X.X
address=/host2.domain.myhome.cx/192.168.Y.Y
...
interface=tun0
no-dhcp-interface=tun0
```

最後2行については、[DD-WRTにOpenVPNサーバーを立てる](http://qiita.com/ryskiwt/items/9ec5ae8ce4509a47365f)を参照

### Secure Shell
| 項目 | 設定値 | 備考 |
|:-:|:-:|:-:|
| SSHd | [x] 有効 [ ] 無効 |  |
| SSH TCP Forwarding | [x] 有効 [ ] 無効 |  |
| ポート | 22 |  |

#### Authorized Keys
SSH公開鍵（~/.ssh/id_rsa.pubとか）を貼り付けておく。

```text
ssh-rsa XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX example@example.com
```

2. ネットワーク > PPTPサーバー/クライアント
========================================
OpenVPN Server/Client
----------------------------------------

[DD-WRTにOpenVPNサーバーを立てる](http://qiita.com/ryskiwt/items/9ec5ae8ce4509a47365f)を参照