OmniAICreator/Qiita-1.07M huggingface dataset:
ノートPCの画面をTVに表示する方法

自分のリマインドのための投稿です。
我が家でNote PCの画面をTVに表示するための方法を記載します。

まず、うちのネットワークは以下の図の構成になっています。
![Network Diagram.png](https://qiita-image-store.s3.amazonaws.com/0/47942/cf9f5bbd-614d-b87a-720a-f077bdf33767.png)

普段、TVはHDMIケーブルでDesktop PCに接続されていて、Desktop PCの画面が表示されるようになってます。
こんな我が家で、TVにNote PCの画面を表示する場合、2つの方法があります（本当はもっとあるかも）。
  1.Desktop PCで、Note PCにリモート接続する
  2.TVのHDMIケーブルをTVにつなぎ直す

以下、2つの方法について説明します。

---
#1.「Desktop PCで、Note PCにリモート接続する」について
1の方法は少し複雑ですが、図にすると、以下のような方法（手順）になります。
![Network Diagram (3).png](https://qiita-image-store.s3.amazonaws.com/0/47942/a1fe4c2f-adc6-3824-c6ef-31c8d6d20e41.png)

以下、詳細な手順です。
1. Desktop PCとNote PCの電源を入れる
2. Note PCのIPアドレスを調べる
  2.1. 「コマンドプロンプト」を起動（アプリから「コマンドプロンプトを選択」）
  2.2. コマンドプロンプトで”ipconfig”と入力して、Note PCのIPアドレスを表示する
  2.3. "IPv4 アドレス"と書かれているものがNote PCのIPアドレスで、形式は、例えば"192.168.1.1"のように、コンマで区切られた4つの数字の組み合わです。
3.Desktop PCで「Remote Desktop Connection」を起動
  3.1. 右下のWindowsボタンをクリックし、"Search the web and Windows"と書かれたテキストボックスに”Remote Desktop Connection”と入力する
  3.2. Best matchに表示されている「Remote Desktop Connection」を選択
4. リモートデスクトップの"Computer:"に、Note PCのIPアドレスを入力（手順2で調べた）
5. Desktop PCがNote PCにリモート接続されて、TVにNote PCの画面が表示される

---
#2.「TVのHDMIケーブルをTVにつなぎ直す」について
図にすると、以下のような方法になります。こちらは、図を見れば分かると思うので、説明はしません。
![Network Diagram (2).png](https://qiita-image-store.s3.amazonaws.com/0/47942/5a126371-1f5b-30c8-1757-656166319f9f.png)
※Desktop PCのHDMIケーブルは短いので、PS3かWiiUで使ってるHDMIケーブルを使う方がいい
UI Sketch vol.4 参加レポート

# 勉強会ページURL

http://mtl.connpass.com/event/20244/

# 日時

2015/09/27(日) 18:00 〜 22:30

# 参加者数

約100人

# タイムスケジュール

18:00- 開場
18:30-19:00 鈴木健一（STANDARD inc. - Founder / UI Designer）
19:00-19:30 内山賢一（株式会社リクルートライフスタイル – UXディレクター）
19:30-19:40 休憩
19:40-20:10 有馬トモユキ（日本デザインセンター - チーフデザイナー）
20:10-20:20 アンケート記入・お知らせ
20:20-22:20 交流会

# 今回のテーマ

「機能するデザイン」を考えるために、必要なこと

# 発表内容

## 鈴木健一さん

Q1. 機能するデザインとは何か
機能するデザイン＝事業に対して役割を果たすデザイン
事業の目的(営利事業の場合)＝事業活動を通じて利益を生み出し、企業を存続させること
事業活動を存続させるためには、顧客に「これ良さそう」という価値を提供する必要がある。
ある問題に対する解決策を正しくアプローチし、ユーザがその価値を感じている状態を作り出す。
∴A1. 誰のどんな問題をどのように解決するかを設計して事業存続につなげる


Q2. 機能するデザインをつくるために必要な事とは何か
機能するデザインをどのように設計するかを考える必要がある。

まず思い浮かぶのはペルソナ、CJMなど
しかし、その設計通りにいくもの？設計通り使ってくれる？
→設計するのはあくまで理想の体験。
問題が実在するか、実在しない問題を解決するサービスを作ってしまっていないか、
解決策は効果があるのか、を事前に検証する必要がある。
↓
Javelin Board
顧客とその顧客が抱えているだろう問題は実在するのかを検証。
例）調整さん日程調整に時間がかかると思っている。
1日以上かかる(日程調整に時間がかかる)と思う人が6割以上いたら実際に問題が実在していると思っていい。

∴A2. 顧客と問題が実在しているかを把握することが必要。
誰のどんな問題をどのように解決するのかの理想を描く。
そして描いた仮説が実在するのか、事前に検証できないかを検討する。

## 内山賢一さん

Q1.「機能する」とは？
A1.わかりやすい。初めて使う人でもOK。
逆に機能しない＝わかりにくいということ。

Q2.機能するデザインに必要なこととは？
その多くはデザイン作業以外のところに隠れている。
例）コーヒーを飲みたいと思ってから実際にコンビニでコーヒーを購入するところまで
状況が変わると機能するデザインが変わる。
　例）佐藤可士和さんがデザインしたコンビニのコーヒーメーカー
　↓画像はこちら等を参照。
　http://matome.naver.jp/odai/2140964743560723801
　元々のデザインはお客さんにとってわかりにくいものだった。
　・Regular, Largeという表記に慣れていない
　・ホットとアイスの違いがいまいちわかりにくい
　各お店が独自にポップを使ってわかりやすいよう改良した
　・カタカナで「ホット」「アイス」と書く
　・「温」「冷」と書く
　・カップの画像を貼る(ホットとアイスではカップのデザインが異なるため)
　・「小」「大」と書く
　・値段まで書いちゃう
　お客さんにとっては元々のデザインよりポップ付きのデザインの方が機能するデザインになっている。
　しかし、もしもこのコーヒーメーカーがレジカウンター内(店員が操作する側)にあったら。
　おそらく、ポップがない元々のデザインの方が余計なものがなくて機能するデザインになる。

ここで、コーヒー購入までの一連の流れを見つめ直してみる
googleで「コンビニ　コーヒー」的な用語で検索すると「買い方」という語がサジェスト検索に上がっていた。
つまり、コーヒーの入れ方云々の前にコーヒーの購入方法がわからない人が多く存在している。
ここから言えることは、見えている問題(UI)は勉強すれば結構解決できている。
UIの問題だけでなく、「○○がしたい」という欲求が生まれてからそれを満たすまでに存在している問題(UX)に
目を向けて考える必要がある。

A2.本当にそのデザインを改善する必要があるのかを見極めること。

## 有馬トモユキさん

Q.機能するデザイン
A.形にしたメッセージが可搬性を伴うこと
「可搬性」＝ポータビリティとは、「移動しやすさ」という意味の英単語で、ハードウェアの分野では「機器の持ち運びのし易さ」を、ソフトウェアの分野では「異なる環境への移植のし易さ」を意味する。
by e-words

人はある国に住むのではない。ある国語に住むのだ。祖国とは国語だ。
きっとみんな日本語を取り上げられると基盤が揺らぐ。
デザインは言語である。
例）絵文字
解像度の高い言語。いろんなテーマを内包することが可能。

※jargon＝専門語，職業語，通語，隠語
隠語、言語には解像度が存在する。一言で通じる言葉＝解像度が高い。

呼び名をつくって印象を与え、解像度の高い言語をつくる
言語は可搬可能　いろんなメディアに対応することができる。
共通言語をつくることができれば新しいグループ(クラスタ)をつくることができる。

今のデザインに必要なもの＝スケーラビリティ
文字を8pt→32Pに変化させた時、全くもって同じ形の拡大に変化させるのではなく、
あくまでも「同じ印象」になるようにしていた。
A’ができたり。互換可能だったり。
複雑性を保持したまま、解像度を高める。
要約ではない。可逆圧縮が理想。

同意できる言語をつくる、
喋りたくなる(使いたくなる)ものにすることが大事
Windows Server 2012 R2でNginxをサービス化する

## Nginxインストール
* [Nginxのダウンロードページ](http://nginx.org/en/download.html) から、Stableの最新版（2015/11時点で1.8.0）のWindows用をダウンロード
* Cドライブ直下に、ダウンロードしたzipファイルを **nginx** として解凍

## Nginx設定
### NginxのWindowsサービス化
* [winswのダウンロードページ](http://repo.jenkins-ci.org/releases/com/sun/winsw/winsw/) から、winswの最新版（2015/11時点で1.18）をダウンロード
* **C:\nginx** に **winsw-1.18-bin.exe** を **nginxservice.exe** にリネームして配置
* 以下の内容で **nginxservice.exe.config** を作成
	* これを追加しない場合は、.NET Framework 3.5をインストールすればOK
	* これを追加すれば、.NET Framework 3.5をインストールしなくても動作する

```xml
<configuration>
  <startup>
    <supportedRuntime version="v2.0.50727" />
    <supportedRuntime version="v4.0" />
  </startup>
</configuration>
```

* 以下の内容で **nginxservice.xml** を作成
	* ポイントは、stopargumentを2つに分けること

```xml
<service>
  <id>nginx</id>
  <name>nginx</name>
  <description>nginx</description>
  <logpath>c:\nginx\logs</logpath>
  <logmode>roll</logmode>
  <depend></depend>
  <executable>c:\nginx\nginx.exe</executable>
  <startargument></startargument>
  <stopexecutable>c:\nginx\nginx.exe</stopexecutable>
  <stopargument>-s</stopargument>
  <stopargument>stop</stopargument>
</service>
```

* PowerShellかコマンドプロンプトで以下を発行
  * ちなみに、アンインストールする場合は、下記の ``install`` を ``uninstall`` にする

```bat
> cd c:\nginx
> .\nginxservice.exe install
```

#### 参考
* [How to add nginx.exe as Windows system service (like Apache)? - Stack Overflow](http://stackoverflow.com/questions/10061191/how-to-add-nginx-exe-as-windows-system-service-like-apache)
	* このままだとうまくいかない
* [Strange failure with spaces in startargument · Issue #24 · kohsuke/winsw · GitHub](https://github.com/kohsuke/winsw/issues/24)
GoでJsonファイルを読み込んで構造体として扱う。

### Json

```json:sample.json
{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {
        "pref": "富山県",
        "city1": "下新川郡",
        "city2": "朝日町"
      },
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [
              136.111111,
              36.111111
            ],
            [
              136.222222,
              36.222222
            ]
          ]
        ]
      }
    },
    {
      "type": "Feature",
      "properties": {
        "pref": "富山県",
        "city1": "氷見市",
        "city2": ""
      },
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [
              136.333333,
              36.333333
            ],
            [
              136.444444,
              36.444444
            ]
          ]
        ]
      }
    },
    {
      "type": "Feature",
      "properties": {
        "pref": "富山県",
        "city1": "高岡市",
        "city2": ""
      },
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [
              136.555555,
              36.555555
            ],
            [
              138.666666,
              36.666666
            ]
          ]
        ]
      }
    }
  ]
}

```

### Jsonと対になる構造体を用意したGo

```go:main.go
package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"os"
)

type FeatureCollection struct {
	Type     string    `json:"type"`
	Features []Feature `json:"features"`
}

type Feature struct {
	Type       string     `json:"type"`
	Properties Properties `json:"properties"`
	Geometory  Geometry   `json:"geometry"`
}

type Properties struct {
	Pref  string `json:"pref"`
	City1 string `json:"city1"`
	City2 string `json:"city2"`
}

type Geometry struct {
	Type        string     `json:"type"`
	Coordinates [][]LatLng `json:"coordinates"`
}

type LatLng [2]float64

func main() {

	raw, err := ioutil.ReadFile("./sample.json")
	if err != nil {
		fmt.Println(err.Error())
		os.Exit(1)
	}

	var fc FeatureCollection

	json.Unmarshal(raw, &fc)

	for _, ft := range fc.Features {
		fmt.Println(ft.Type)
		fmt.Println(ft.Properties.Pref, ft.Properties.City1, ft.Properties.City2)
		fmt.Println(ft.Geometory.Type)
		fmt.Println(ft.Geometory.Coordinates[0][0][0], ft.Geometory.Coordinates[0][0][1])
	}
}
```

### 実行結果

```bash
go run main.go
Feature
富山県 下新川郡 朝日町
Polygon
136.111111 36.111111
Feature
富山県 氷見市 
Polygon
136.333333 36.333333
Feature
富山県 高岡市 
Polygon
136.555555 36.555555
```
GistのコードをQiitaの記事に貼り付けたいけどやり方わからない。


### <i class="fa fa-repeat fa-2x"></i> 試行錯誤なう

Gistを始めて触ってみた。
あと、FontAwesomeを初めて使ってみた。。


http://fortawesome.github.io/Font-Awesome/icons/

ここから好きなアイコンを選んでそこに書かれている使い方を参照する。

```html
<i class="fa fa-repeat fa-2x"></i> 試行錯誤なう
```

などと書くと使える。

ただし、　qiitaにアイコンが表示されないものもあった。

### <i class="fa fa-cloud-download fa-2x"></i> Gistの`embedURL`をコピペして貼り付けてみる。

```html
<script src="https://gist.github.com/username/hogehogehoge.js"></script>
```
このようなURLがコピペできたので、qiitaの記事に貼り付けてみたけど、コードを見ることはできなかった。。。。

<script src="https://gist.github.com/YvkqDqIAnd0/98693ca862ef096fa28c.js"></script>
TDD / testing > 考察 > 既存のクラスにエラー出力機能を追加する

クラスの動作確認のため、後からエラー(ログ)出力機能を追加したい

方法案

1. 関数の引数にString &errを追加し参照渡しする
  - 欠点 : 関数のシグネチャが変わってしまうため、関数呼び出し部分すべてに変更が必要
  - 欠点 : 受取ったerrを別途出力する機能が必要
  - 強引にするとしたら、String &err引数を追加したラッパー関数を用意して、テストしたい部分だけその関数をコールする
2. クラス内部にてログ機能を動作させる
  - private変数 : TErrorLogger *m_errLog; (TErrorLoggerは自作クラス)
  - 使用例 : m_errLog->Add(TErrorLogger::Debug,   L"xxx", detail, L"xxx_main:730");
  - 使用例 : m_errLog->Save(); を実行した時にファイル保存
  - 利点 : 関数のシグネチャに変更がない
  - 利点 : 不要になった時に取り除きやすい
  - 欠点 : 別クラス(TErrorLogger)への依存が追加される
  - 備考 : static関数に対してはコンストラクタ時の初期化がスキップされるので、別途初期化処理（と終了処理）が必要
3. GetLastError()相当の機能を用意する
  - 利点 : 関数のシグネチャに変更がない
  - 使用例 : 補足したいエラー発生場所にてSetLastError(String)を呼び出す
  - 欠点 : 2つのSetLastError()を実行する間にGetLastError()を実行して、それを出力しておかないと取りこぼしが生じる
【導入】データベース（MariaDB） - CentOS 7

### インストール

パッケージをインストールする。

```sh
$ sudo yum -y install mariadb-server mariadb-devel
```


### セットアップ

サーバのパラメータを変更する。

```sh
$ sudo vi /etc/mysql/server.cnf
```
```diff
--- server.cnf.org      2015-08-23 02:08:25.576869647 +0900
+++ server.cnf  2015-08-23 02:06:47.233860950 +0900
@@ -11,6 +11,29 @@
 # this is only for the mysqld standalone daemon
 [mysqld]

+#
+# Tuning
+#
+max_allowed_packet     = 32MB
+
+#
+# InnoDB
+#
+innodb_file_format     = Barracuda
+innodb_file_per_table  = 1
+innodb_additional_mem_pool_size        = 20MB
+innodb_buffer_pool_size        = 512MB
+innodb_log_buffer_size = 64MB
+innodb_log_file_size   = 10MB
+
+#
+# * UTF 8 Settings
+#
+init-connect           = SET NAMES utf8
+character_set_server   = utf8
+collation_server       = utf8_general_ci
+skip-character-set-client-handshake
+
 # this is only for embedded server
 [embedded]

```

コマンドラインツールのパラメータを変更する。

```sh
$ vi /etc/mysql/mysql-clients.cnf
```
```diff
--- mysql-clients.cnf.org       2014-12-19 19:57:31.000000000 +0900
+++ mysql-clients.cnf   2015-08-23 01:52:30.219840564 +0900
@@ -4,6 +4,7 @@
 #

 [mysql]
+default_character_set  = utf8

 [mysql_upgrade]

@@ -14,6 +15,7 @@
 [mysqlcheck]

 [mysqldump]
+default_character_set  = utf8

 [mysqlimport]

```

サービスを有効にする。

```sh
$ sudo systemctl enable mariadb.service
```

サービスを起動する。

```sh
$ sudo systemctl start mariadb.service
```

サービスの起動状態を確認する。

```sh
$ systemctl status mariadb.service
```
【導入】データベース（MySQL） - Ubuntu 14.04 LTS

### インストール

mysqlパッケージをインストールする。

```sh
$ sudo aptitude install -y mysql-server-5.6
```

※上記パッケージインストール途中でMySQLのパスワード設定を要求されます。スクリプトで処理したい場合は、以下のコマンドを使用することでパッケージャにパスワードを引き渡すことができます。

```sh
$ PASSWD='{パスワード}'
$ echo "mysql-server-5.6 mysql-server/root_password password $PASSWD" | sudo debconf-set-selections
$ echo "mysql-server-5.6 mysql-server/root_password_again password $PASSWD" | sudo debconf-set-selections
```


### セットアップ

mysqlサービスを停止する。

```sh
$ sudo service mysql stop
```

MySQLのパラメータを変更する。

```sh
$ sudo vi /etc/mysql/my.cnf
```
```diff
--- a/mysql/my.cnf
+++ b/mysql/my.cnf
@@ -49,7 +49,7 @@ bind-address          = 127.0.0.1
 # * Fine Tuning
 #
 key_buffer             = 16M
-max_allowed_packet     = 16M
+max_allowed_packet     = 32M
 thread_stack           = 192K
 thread_cache_size       = 8
 # This replaces the startup script and checks MyISAM tables if needed
@@ -95,6 +95,13 @@ max_binlog_size         = 100M
 #
 # InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
 # Read the manual for more InnoDB related options. There are many!
+innodb_file_format     = Barracuda
+innodb_file_per_table  = 1
+innodb_additional_mem_pool_size        = 20MB
+innodb_buffer_pool_size        = 512MB
+innodb_log_buffer_size = 64MB
+innodb_log_file_size   = 10MB
+
#
# * Security Features
#
@@ -107,15 +114,23 @@ max_binlog_size         = 100M
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem

-
+#
+# * UTF 8 Settings
+#
+init-connect           = SET NAMES utf8
+character_set_server   = utf8
+collation_server       = utf8_general_ci
+skip-character-set-client-handshake

[mysqldump]
quick
quote-names
max_allowed_packet     = 16M
+default_character_set  = utf8

[mysql]
#no-auto-rehash        # faster start of mysql but no tab completition
+default_character_set  = utf8

[isamchk]
key_buffer             = 16M
```

ログファイルを削除する。
※innodb_log_file_size を変更した場合、設定変更前のファイルを削除しないとサービス起動失敗します。

```sh
$ sudo rm /var/lib/mysql/ib_logfile0
$ sudo rm /var/lib/mysql/ib_logfile1
```

MySQLサービスを起動する。

```sh
$ sudo service mysql start
```
技術英語 > You'll [hear from] me when I [get] the com system [back on line]. > I haven't heard from him yet. / then it [goes back to the normal mode].

@ Star Trek Voyager > PROJECTIONS

これからの行動についてトレスからドクターへ

> You'll <font color=red>hear from</font> me when I <font color=blue>get</font> the com system <font color=blue>back on line</font>.

<hr>
関連して思い出したのは、どこかの本で「彼からの連絡はまだない」というのを以下のようにしていた。

> I haven't heard from him yet.

<hr>
関連して思い出したのは back to the normal xxxという言い回し。

https://github.com/search?utf8=%E2%9C%93&q=%22back+to+the+normal%22
> then it <font color=red>goes back to the normal mode</font>.
fastlane入門 snapshot編

# fastlaneについて
公式 https://github.com/fastlane/fastlane 
解説 http://qiita.com/gin0606/items/162d756dfda7b84e97d4

itunes connectに記載する文言やスクリーンショットのアップロードなどを自動で行える素晴らしいツールです (　・◡・)導入してみて結構詰まったのでsnapshotのところを説明したいと思います。

## fastlaneをインストール
sudo gem install fastlane --verbose

## 最新のXcode command line toolsをインストール
xcode-select --install

## cd [your_project_folder] && fastlane init
こんな感じで色々聞かれるのでsnapshotだけをしたい場合は、App Identifier, Your Apple IDのところはenterを押して、deliverのところをnにして、snapshotのところだけyにしましょう (　・◡・)

![スクリーンショット 2015-11-23 1.35.26.png](https://qiita-image-store.s3.amazonaws.com/0/61091/d0dd762f-3af5-860b-00c5-7d17e85a98e3.png "スクリーンショット 2015-11-23 1.35.26.png")
## SnapshotHelper.swiftをプロジェクトに入れる
fastlaneディレクトリが作成されているので、こんな感じでプロジェクトに入れましょう (　・◡・)

![スクリーンショット 2015-11-23 1.49.54.png](https://qiita-image-store.s3.amazonaws.com/0/61091/36e8d74b-8b60-dacd-b5a7-725aaf0ee14b.png "スクリーンショット 2015-11-23 1.49.54.png")

## snapshotを取る処理をFastlaneSnapshotUITestsに追加
    import XCTest

    class FastlaneSnapshotUITests: XCTestCase {
        
    	override func setUp() {
      	   super.setUp()
     	   let app = XCUIApplication()
    	   setLanguage(app)
     	   app.launch()
        }
    
    	override func tearDown() {
       		super.tearDown()
    	}
    
        func testExample() {
        	snapshot("0Launch")
    	}
    }
snapshot()の引数はファイル名です。

## Snapfileの編集
fastlane配下のSnapfileの編集をします。devices()でsnapshotを取る端末の指定をします。languagesは言語の選択です。詳しいことはドキュメントを見たらわかると思います (　・◡・)

![スクリーンショット 2015-11-23 2.08.10.png](https://qiita-image-store.s3.amazonaws.com/0/61091/12bb7c24-0375-09eb-7324-628ad05a4bb2.png "スクリーンショット 2015-11-23 2.08.10.png")

## snapshot コマンドを実行
コマンドラインで snapshotと入力すると実行されます。
すると、UITestが走るのでsnapshotが取れて、

![スクリーンショット 2015-11-23 2.16.42.png](https://qiita-image-store.s3.amazonaws.com/0/61091/5617c884-cc27-1788-f9d7-8715c8a1df0d.png "スクリーンショット 2015-11-23 2.16.42.png")

という形でscreenshots配下にsnapshotが取得できているのが分かるかと思います。de-DEなどはデフォルトのlanguagesの設定であったので取ってしまい、あとでja-Jaだけにしました (　・◡・)

以上でsnapshotの説明は終わりです。deliverと組み合わせるとitunes connectにsnapshotをアップすることも可能です。

github https://github.com/nakazy/Snapshot
Swift2.0でカラーコードからUIColorに変換

## Swift2.0でカラーコードからUIColorに変換

swiftでもObjective-Cでも、色指定をしたい場合
UIColorを使うのですがRGBで数値を設定しなきゃいけないのが非常に面倒臭い。

```swift
let color:UIColor = UIColor(red:0.0,green:0.5,blue:1.0,alpha:1.0)
```

UIColorの定義済みの色は
blackColor()
redColor()
greenColor()
...
等まあまあありますが限られているので、
HTML,CSSのように楽にカラーコードを指定しまくって好みの見栄えに！が
なかなか叶えられん訳です。
なのでカラーコードを設定したらUIColorに変換してくれるメソッドを用意してみる。
他でも紹介されていますが2.0対応で自分用に書いたもの↓

```swift
static func colorWithHexString (hex:String) -> UIColor {
        
        let cString:String = hex.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()).uppercaseString
        
        if ((cString as String).characters.count != 6) {
            return UIColor.grayColor()
        }
        
        let rString = (cString as NSString).substringWithRange(NSRange(location: 0, length: 2))
        let gString = (cString as NSString).substringWithRange(NSRange(location: 2, length: 2))
        let bString = (cString as NSString).substringWithRange(NSRange(location: 4, length: 2))
        
        var r:CUnsignedInt = 0, g:CUnsignedInt = 0, b:CUnsignedInt = 0;
        NSScanner(string: rString).scanHexInt(&r)
        NSScanner(string: gString).scanHexInt(&g)
        NSScanner(string: bString).scanHexInt(&b)
        
        return UIColor(
            red: CGFloat(Float(r) / 255.0),
            green: CGFloat(Float(g) / 255.0),
            blue: CGFloat(Float(b) / 255.0),
            alpha: CGFloat(Float(1.0))
        )
    }

```

呼ぶ際にはこれでOK。

```swift
colorWithHexString("FF1493")  //カラーコードを設定
colorWithHexString("000000")
```

### 20161120 追記

swift 3.0対応版。 
`stringByTrimmingCharactersInSet` が `trimmingCharacters` に変更になっています。

```swift
static func colorWithHexString (_ hex:String) -> UIColor {
        
        let cString = hex.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).uppercased()
        
        if ((cString as String).characters.count != 6) {
            return UIColor.gray
        }
        
        let rString = (cString as NSString).substring(with: NSRange(location: 0, length: 2))
        let gString = (cString as NSString).substring(with: NSRange(location: 2, length: 2))
        let bString = (cString as NSString).substring(with: NSRange(location: 4, length: 2))
        
        var r:CUnsignedInt = 0, g:CUnsignedInt = 0, b:CUnsignedInt = 0;
        Scanner(string: rString).scanHexInt32(&r)
        Scanner(string: gString).scanHexInt32(&g)
        Scanner(string: bString).scanHexInt32(&b)
        
        return UIColor(
            red: CGFloat(Float(r) / 255.0),
            green: CGFloat(Float(g) / 255.0),
            blue: CGFloat(Float(b) / 255.0),
            alpha: CGFloat(Float(1.0))
        )
    }

```
【mySQLでデータ分析】Sequel Proでデータベースを作ってみる。

TwitterのAnalyticsとかfacebookのインサイトからデータをエクスポートしてきて、分析しようとしている。「10年戦えるデータ分析入門」という本に影響されて、やってみることに。まずは、mySQLをローカルで動かしてためしてみることにしました。

## 入れたもの
* mySQL（homebrew経由で）
* Sequel Pro（http://www.sequelpro.com/）
* Cot Editor（https://itunes.apple.com/jp/app/coteditor/id1024640650）

## mySQLサーバを起動する
ターミナルで
`mysql.server start`

## mySQLサーバを停止する
`mysql.server stop`

## twitterのデータをインポートする
まずはSequel Proでテーブルを作る。この時、エンコーディングと、テーブル照合順序とテーブル型を聞かれる。テーブル照合順序がよくわからなかったので、ここでは参考URLをみてutf8_binを選択。
![twitter_sequelreo_table.png](https://qiita-image-store.s3.amazonaws.com/0/55954/347913ed-6072-eded-248d-b6f1fad42ab5.png)

Twitter Analyticsからエクスポートしてきたcsvファイルを見ながらポチポチ手で作成。型とか長さとかそれっぽく適当に。
![twitter_sequelpro.png](https://qiita-image-store.s3.amazonaws.com/0/55954/e5638a24-085d-d5b6-c48f-86060503a360.png)

次にcsvファイルをSequel Proにインポートする。インポートは「ファイル」からできる。ここで問題発生。csvファイルのなかの「時間」の項目が曲者。中身が「2015-09-29 08:00 +0000」みたいになっていて、DATATIME型ではエラーが出る。
![twitter_sequelpro_error.png](https://qiita-image-store.s3.amazonaws.com/0/55954/efe8992d-32a0-a3c1-909d-1c8a4c521907.png)

データを直す。Cod Editorでcsvファイルを開いて「検索」から「 +0000」を「」に置換する。
![twitter_codeditor.png](https://qiita-image-store.s3.amazonaws.com/0/55954/0811e0de-2ca1-0716-feaf-0a60e20e20d0.png)

もう一度csvファイルをインポートする。このとき、オプションでIGNOREをチェックしておく。このcsvファイルにはいろんな項目が用意されている。本来はint型のデータが入るべき項目に「-」とか入ってる場合がある。例えば、Twitterのプロモーション機能を使っている場合には「プロモーションのインプレッション」という項目には数字が入るが、その機能を使ってなければ「-」となっている。こういうのは今は気にしなくていいので、無視。
![twitter_sequelreo_ignore.png](https://qiita-image-store.s3.amazonaws.com/0/55954/463a317c-5835-bd76-01c6-9b863c6f2e51.png)

「内容」をクリックしてみると、ちゃんとインポートできていることが分かる。
![twitter_sequelreo_imported.png](https://qiita-image-store.s3.amazonaws.com/0/55954/46a4a324-03bb-bc61-9551-3824602c24b5.png)

文字化けして見えるところもあるけれど、これはSequel Proの不具合のようで、データは正しく入っている。ちなみに、IGNOREをチェックしてインポートすると、「−」のところには「0」が入っている。
### 参考にしたもの
* mySQLのデータ型：https://dev.mysql.com/doc/refman/5.6/ja/data-types.html
* MySQLの照合順序：http://qiita.com/nautilus/items/159c27d7d62c78ee9ce7
* 10年戦えるデータ分析入門：http://www.amazon.co.jp/dp/B010CQD4Y0
[Java] インターフェースをnewする違和感が解決した

いまさらですが、すっきりしたので。

Androidのプログラムを書いていて、以下のコードに疑問をもっていた。

```java
button.setOnClickListener(new View.OnClickListener() {...});
```

ん...？インターフェースをnewするの？
と思って、ずっとモヤモヤしてたけど、ちょっと調べたら解決した。

例えば、Javaの入門書などで「インターフェースはインスタンス化できない」ふむふむ...なるほど...。と素直に勉強した人にとっては、以下のようなコードに戸惑うでしょう。

```java

public class Person {
	  public static void main( String args[] ) {
		  Greet greet = new Greet() {
			  public void sayHello(){
				  System.out.println("こんにちわ！");
			  }
		  };
		  greet.sayHello();
	  }
}

interface Greet {		
	public void sayHello();
}

```

あれ...？インターフェースをnewしてるじゃん！...と。

本来はこう書きますよね↓

```java

public class Person {
	  public static void main( String args[] ) {
		  Encount greet = new Greet();
		  greet.sayHello();
	  }
}

class Greet implements Encount {
	@Override public void sayHello(){
		System.out.println("こんにちわ！");
	}
}

interface Encount {		
	public void sayHello();
}

```

実は、最初の不思議なコードは**匿名クラスをnewしている**んです。

匿名クラスとは、名前を持たないクラス。その場限りで、宣言と同時にオブジェクトの生成を行う。

>[匿名クラス[無名クラス]とは](http://sjc-p.obx21.com/word/jt/anonymousclass.html)

なので、見た目的にインターフェースをnewしているように見えて、
実は、**インターフェースを継承した名前の無いクラスをnewしていただけ。**だったのです。

種明かしをされるとなんてことは無いんですが、僕みたいにJavaほとんどやらずにいきなりAndroidの開発を始めた者は、Javaの文法でたまに悩まされます。年末年始にでもちゃんとJava勉強しないとなぁ...。

おわり。
Python開発環境構築

# Python開発環境構築

本ページの新しい情報を以下のページに記載しました。
 [anyenvによるPython環境構築](https://qiita.com/kazuya-s@github/items/8cb41a02175e629350ba) (2017/10/21)

## 目的
Mac上以下の条件を満たす、Python環境を構築する

* 複数バージョンのPythonを切り替えられること
* プロジェクトごとにパッケージを分離できること

## 環境
* OSX El Capitan(10.11.1)
* zsh
* Homebrew(0.9.5) インストール済み

## ツール説明
* [pyenv](https://github.com/yyuu/pyenv)
複数バージョンのPythonを簡単に切り替えられるようにするツール。rbenvとruby-buildからフォークしてPython用に変更された。
  
* [virtualenv](https://virtualenv.readthedocs.org/)
分離されたPython環境を作成るためのツール。環境ごとに違うパッケージを入れることができる。

* [pyenv-virtualenv](https://github.com/pyenv/pyenv-virtualenv)
pyenv のプラグイン。インストールすると `pyenv virtualenv` コマンドが使えるようになる。
内部的には virtualenv を呼び出している模様。

## インストール
+ pyenv と pyenv-virtualenv のインストール

```sh
$ brew install pyenv-virtualenv
```  
  
+ シェルの設定ファイルに設定追加

```zsh:~/.zshrc
# pyenv
if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi
export PYENV_ROOT=/usr/local/var/pyenv
# pyenv-virtualenv
if which pyenv-virtualenv-init > /dev/null; then eval "$(pyenv virtualenv-init -)"; fi
```

+ 設定ファイル再読み込み

```sh
$ source ~/.zshrc
```

## 使い方
### Python

#### インストール
Python 3.4.3をインストールする場合以下を実行。

```sh
$ pyenv install 3.4.3
```

私の環境だと、3.4.3 のインストールで  

```sh
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?
```

というエラーが出たので、[こちら](https://github.com/yyuu/pyenv/wiki/Common-build-problems)に従い

```sh
CFLAGS="-I$(brew --prefix openssl)/include" \
LDFLAGS="-L$(brew --prefix openssl)/lib" \
pyenv install -v 3.4.3
```
を実行し、インストールした。

#### インストール可能なバージョン一覧

```sh
$ pyenv install -l
```

#### インストール済みのバージョン一覧

```sh
$ pyenv versions
```

### 仮想環境
### 仮想環境の作成
Python 3.4.3 の仮想環境を作成する場合

```sh
$ pyenv virtualenv 3.4.3 myenv343
```

pyenvのversionに登録されることが確認できる

```sh
$ pyenv versions
* system (set by /usr/local/var/pyenv/version)
  3.4.3
  myenv343
```

### フォルダに環境をセットする

projecjt-aフォルダを作成し、myenv343環境をセットする場合

```sh
$ mkdir project-a
$ cd project-a
$ pyenv local myenv343
```
これでproject-aフォルダに移動すると、自動的にmyenv3.4.3の環境となる。

```sh
$ cd project-a
(myenv343)$ python --version
Python 3.4.3
(myenv343)$ exit
$ cd ~
$ python --version
Python 2.7.10
```

### 仮想環境の削除
```sh
$ pyenv uninstall myenv343
```
ロング・レンジ攻撃(Long-Range Attack)問題とは何か?

以下に移行しました<br><a href="http://block-chain.jp/tech/long-range-attack/" title="ロング・レンジ攻撃(Long-Range Attack)問題とは何か?">ロング・レンジ攻撃(Long-Range Attack)問題とは何か?</a>
npmでエラーでたと焦ったらHDDが抜けてて既に存在しないパスにいただけだった。

タイトル通り。
npmのバージョン変更やら色々作業してる最中だったので何悪さしたかな？と相当焦った。npmコマンド叩くだけのシンプルなのでも出た。
エラー文章ちゃんと読めばすぐわかる。

```
node.js:810
    var cwd = process.cwd();
                      ^
Error: ENOENT, no such file or directory
    at Function.startup.resolveArgv0 (node.js:810:23)
    at startup (node.js:58:13)
    at node.js:901:3
```
10分でclamAVをAWS Amazon Linuxで実行



clamAVは、言わずとしれたアンチウィルスアプリになります。
プラットフォームは限りなく多くのプラットフォームで動きますが、AWS Linuxでもさくっと稼働します。


こんなことをし始めたのは、私が開発に携わったサーバじゃないのですが、最近動きがおかしいとのことで、ちょいちょいファイルが書き換えられるという現象があり、何じゃこりゃって思っていたら、トロイの木馬がありました、、、（泣）

そのときに調べた方法を掲載しておきます。

##install


yumでさくっとInstall


```
yum -y install clamav clamav-update
```


そして、以下のファイルを編集
exampleとなっている行をコメントアウト

```
#vim /etc/freshclam.conf

これで、ウィルス定義ファイルをUPDATEする
#freshclam
```



テストできるディレクトに移動
ダミーのウィルスが含まれたファイルをDLしてみる

```
$wget http://www.eicar.org/download/eicar.com
```

##実行！！
```
#clamscan -r 
```

-rは、配下のディレクトリーを検索してくれます。

少なくとも、先ほどのダミーのファイルはFOUNDって表示されればOKです。
UserAgentから携帯電話の機種名を抽出

UserAgentから携帯のモデル名 (機種名) を抽出するPythonモジュール kpy が2014冬-2015冬モデルの携帯に対応しました。

このモジュールは全く宣伝しないでリリースしちゃったやつなので知らない人しかいないと思うのでこの機会に紹介しようかなと思います。

## どういうときに使う？

- アクセスログから統計を取りたいとき
 - アクセスが多い端末を検証機として購入したり
- Webとかアプリでバグが起きる環境を特定/再現したいとき
- browser fingerprint情報の一つとして使う

などなど...

## Install
```
$ pip install kpy
```
で入れられます。
## 使い方
```py

>>> import kpy
>>> ua = 'Mozilla/5.0 (Linux; U; Android 4.1.1; ja-jp; HTL21 Build/JRO03C AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30'
>>> kpy.extract(ua)
'HTL21'
```

`import kpy` して、`kpy.extract()` にUAを食わせるだけ！

## 対応してるモデル

- docomo
 - iモード端末もAndroidもほとんどカバー
- au
 - ガラケーは全く対応してない
 - Androidモデルはだいたいカバー
- SoftBank
 - Vodafone時代からだいたいカバー
 - Disney mobile, emobile, willcom, Y!mobileも対応

って感じでガラケー、スマホ、タブレット、PHSに対応してます。
特にdocomoには自信があって、1999年発売のF501iからつい先日の2015年11月20日発売のXperia Z5 Premium SO-03Hまでカバーしてます。

Apple製品は対応する予定ないので、気になる場合は [woothee-python](https://github.com/woothee/woothee-python) と組み合わせて使ってください。

### auのガラケーに対応してない理由
モデル名とUA内の表記が一致してないので変換テーブルを作る必要があるため。

たとえば、A5404SというモデルのUAは、`KDDI-SN25 UP.Browser/6.2.0.5 (GUI) MMP/2.0` ってなっててどこにもA5404Sなんて文字が出てこないのです。

(よっぽど元気がないと多分対応しなそう。。。)

## どんな仕組み？
正規表現を複数回してモデル名っぽい部分をマッチさせてるだけのお手軽仕様。

ソースは↓で見れます。
https://github.com/ikegami-yukino/kpy

テスト用UAデータは以下から取得しています。

- http://spec.nttdocomo.co.jp/spmss/
- http://www.au.kddi.com/developer/android/kishu/ua/
- https://www.support.softbankmobile.co.jp/partner/smp_info/smp_info_search_t.cfm
"右辺値がnilでなければ左辺値に代入する"演算子を定義する

Swiftで、"右辺値が`nil`でなければ左辺値に代入したい"ということがありました。
これを素直に書くと以下のようなコードになると思います。

```swift
if let value = value {
    self.value = value
}
```

うーん、なんだかイケてない感じがします。
数が多くなってくると結構面倒ですし、読みにくくもなってしまいます。
そこで、"右辺値が`nil`でなければ左辺値に代入する"演算子`?=`を定義してみます。

```swift
infix operator ?= {}

func ?= <T> (inout lhs: T, rhs: T?) -> Void {
    if let rhs = rhs {
        lhs = rhs
    }
}
```

これで最初のコードは以下のように簡潔に書けます。

```swift
self.value ?= value
```

敢えて名前をつけると`Optional Assignment Operator`といったところでしょうか。

Swiftでは自由度の高い演算子定義や後置クロージャのおかげで、マクロなどを使うことなく安全かつ柔軟に記法を拡張して、イカした感じの記述ができるので良いですね。
無論乱用すると良くないかも知れませんが、適切に使えば利得は大きいのではないかと思います。

それでは、皆さんも用法用量を守って演算子を定義し、快適なSwiftライフを!
Rubyで小数点桁数指定

Rubyで少数以下の桁数を指定して表示したかったのでメモ

- sprintf(or format)を使う場合(文字列を返す)

```
test = 1.2345
puts sprintf("%.2f", test) # format("%.2f", test)も同様
```

- round関数を使う場合  
この場合数値(Integer or Float)を返すので注意してください  
また、四捨五入してしまうので注意！

```
1.2345.round    #=> 1
1.2345.round(2) #=> 1.23
1.2345.round(3) #=> 1.235 (四捨五入)
puts 1.2345.round(3) #=> 1.235
```
[JavaScript] Hoisting（巻き上げ）演習

# Hoisting（巻き上げ）演習

コードの実行結果がどうなるのかを考える。

## :green_book: 問題

### [1]

```js
var a = b = 1;

function outer() {

    console.log(a, b);

    var a = 2;

    console.log(a, b);

    function inner() {

        console.log(a, b);

        var a = 3;

        console.log(a, b);

        var b = 2;

        console.log(a, b);
    }

    inner();

    console.log(a, b);
}

console.log(a, b);

outer();
```

### [2-1]

```
(function(){
    foo();

    var foo = function bar() {
        console.log(foo.name);
    };
}());
```


### [2-2]

```
(function(){
    bar();

    var foo = function bar() {
        console.log(foo.name);
    };
}());
```

### [3-1]

```js
(function(){
    foo();

    var foo;

    foo();

    function foo() {
        console.log( 1 );
    }

    foo();

    foo = function() {
        console.log( 2 );
    };

    foo();
}());
```

### [3-2]

```
(function(){
    foo();

    function foo() {
        console.log(1);
    }

    var foo = function() {
        console.log(2);
    };

    function foo() {
        console.log(3);
    }
}());
```

* * *

## :blue_book: 答え


### [1]

```
1 1
undefined 1
2 1
undefined undefined
3 undefined
3 2
2 1
```

### [2-1]

```
Uncaught TypeError: foo is not a function(…)
```

### [2-2]

```
Uncaught ReferenceError: bar is not defined(…)
```

### [3-1]

```
1
1
1
2
```

### [3-2]

```
3
```
iOS - ナビバー、ツールバーに背景画像を設定する

# 完成図
![スクリーンショット 2015-11-22 23.24.28.png](https://qiita-image-store.s3.amazonaws.com/0/100736/498d52da-97eb-ed61-abd8-50d573150d4d.png)

# コード

```swift
override func viewDidLoad() {
    super.viewDidLoad()
    self.view.backgroundColor = UIColor.grayColor()
    self.navigationController?.toolbarHidden = false
    self.navigationController?.navigationBar.setBackgroundImage(UIImage(named: "navibarImage"), forBarPosition: .TopAttached, barMetrics: .Default)
    self.navigationController?.toolbar.setBackgroundImage(UIImage(named: "toolbarImage"), forToolbarPosition: .Bottom, barMetrics: .Default)
}
```

ちなみにnavibarImageの高さは64にしています。

# 参考記事
http://blog.ch3cooh.jp/entry/20120611/1339395627
画面からデータフローを定義できるプロダクトってどんなのがあるの？

ここ何回かNiFiについて書いていますが、調べてみるとNiFiに似た画面からデータフローを定義するプロダクトが複数あったため、一度まとめてみようと思いたち、まとめてみました。
尚、はじめに書いた時点で情報を網羅できるわけではないため、もし何か新しい情報がわかったり、新しいプロダクトが見つかったらその都度追記していきます。

## プロダクト一覧
今回確認対象とするプロダクトは下記です。

- Apache NiFi(https://nifi.apache.org/)
- Apache Apex(https://www.datatorrent.com/project-apex/)
- Cask Hydrator(http://cask.co/product/)
- Node-RED(http://nodered.org/)

## 比較表
とりあえず概要を表にしてみると下記のような感じになります。

|項目|Apache NiFi|Apache Apex|Cask Hydrator|Node-RED|
|-----------|-----------|------------|------------|------------|
|関連企業|Hortonworks|DataTorrent|Cask Data|IBM|
|実装言語/実行環境|Java|Java|Java + Node.js|Node.js|
|ライセンス|Apache 2.0|Apache 2.0|Apache 2.0|Apache 2.0|
|モジュール追加拡張|可能|可能|可能|可能<br>（リポジトリもある）|
|分散スケールアウト|可能|可能|可能|－|
|分散時クラスタ管理|独自クラスタ|YARN|YARN|－|

## 各プロダクト詳細
### Apache NiFi
概要は下記のページ参照。
[データフローオーケストレーションツールApache NiFiとは？](http://qiita.com/kimutansk/items/a083fc963fbe31068cf8)
[Apache NiFiのそもそものコンセプトは？](http://qiita.com/kimutansk/items/59c9dacf01bd342295c3)
### Apache Apex
DataTorrent社が開発しているプロダクトで、下記のような画面からリアルタイムの分散ストリーム処理やバッチ処理が構築可能。
![image23.png](https://qiita-image-store.s3.amazonaws.com/0/9616/da4e583b-36fd-7ef0-6dad-df887d0d786b.png)

かつ、[プロジェクトのトップページ](https://www.datatorrent.com/project-apex/)を見るとStormやSparkと比べてこれだけ優れている、という項目が列挙されたページになっています。
ただ、Community Edition、Standard Edition、Enterprise Editionと複数Editionが存在しており、サポートを提供するのではなく、明示的にCommunity Editionは機能が少ない模様。
有償モジュールを提供しているようなノリのようです。

### Cask Hydrator
Cask Data社が開発しているプロダクトで、The Cask Data Application Platform (CDAP)という基盤のUI部分を担当するプロダクト。
下記のような画面でデータフローが定義可能になっています。
![cdap-5.png](https://qiita-image-store.s3.amazonaws.com/0/9616/c32db1c3-2fb9-c813-173c-9a8861c374d7.png)
ムービーを見てみるに、データスキーマが非常に定義しやすい作りになっています。
Apache Apexと同様にEditionの違いはありますが、Cask Hydrator側は主にサポートによる差分になるようです。

### Node-RED
実はこの手のツールで一番有名になると思います。
IBMがOSSとして公開したデータフロー定義ツールで、IoTアプリケーションを簡単に作れる、がフレーズになっています。
下記のような画面でデータフローが定義可能です。
![687474703a2f2f6e6f64657265642e6f72672f696d616765732f6e6f64652d7265642d73637265656e73686f742e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/9616/b6d4e5b6-6c78-8022-5adb-0ba44217badd.png)

ユーザが作成したコンポーネントのリポジトリも存在しており、多くのコンポーネントがあがっています。
ただ、残念ながら分散スケールアウトの仕組みは備えておらず、スケーラビリティに不安があります。
とはいえ、これらの中で一番簡単に使えるのも確かであるため、小規模なものであれば一番早く構築できると思います。
（私が資料などから読み取れていないからかも知れませんが・・）

## どれを使うべきなの？
ざっと見た限り、Apache NiFi、Apache Apex、Cask Hydratorは保持している機能もレベルも似通っており、正直甲乙つけがたい状況です。
ただ、如何せんApache Apex、Cask Hydratorは情報がページから読み取りにくい構成になっており、色々見落としている可能性も多々あります。

また、ページを見た個人的な印象からすると、Apache ApexやCask Hydratorはページがその企業のページと一体化しており、かつエディションの違いによって今後の発展がいまいち見えにくかったりするというのはあります。
Node-REDはそういう印象は受けないのですが、分散デプロイによるスケールアウトが出来ないのが勿体ない所ですね。

というわけで、私としてはしばらくはApache NiFiをメインで見て行こうかなという結論です。
一つのプロダクトをそれなりに深く見て行かないと、評価軸というのも見えませんし。

ですので、寄り道はしましたが次回こそNiFiですかね。
Sphinxのsourceを make latexpdfja でPDF化するための必要なこと

概要
====

タイトルの通りです

Ubuntu 15.10 で確認(Ubuntu 15.04, 14.04でも同じだと思います)

```
$ sudo apt-get install texlive texlive-lang-japanese texlive-latex-extra
```

以上です。あとは

```
$ make latexpdfja
```

とすれば `build/latex/HOGE.pdf` が生成されます

あとがき
-------

Sphinx、マジ便利

SphinxはreStructuredTextというフォーマットで再学習が必要なんですけど、Pandocを使えば Markdown => reStructuredText 変換ができるそうなので、あまり困らないかもです

http://www.slideshare.net/iktakahiro/sphinxmarkdown
PSRがいくつあるのか確かめた件

今日闇PHP行ってきました
エクステンションのコードとかは流石にきついですが、PHP7のASTの解説はとてもわかり易かったように思えます
引数や返り値のタイプヒンティングがなんで急にやり始めたのかとかも、ようやくわかりました

まあ、闇の話は後でスライドが上がるんじゃないかと思うのでこの辺で

で、その闇PHPの中で、「PSR-7」というフレーズが出てきたのですよ
7て...私が知ってるのはPSR-4までなんですが、そんなにあるのか？と思ったので、ちょいと確かめてやろうと思った次第です

# 意外と多かった！

確かめるって言ったって、公式見に行くだけなんですがね！
https://github.com/php-fig/fig-standards/blob/master/index.md
http://www.php-fig.org/psr/

でこれを一覧にすると、以下の様な感じになるんですよ

|番号|概要|状態|
|---|----|---|
|0|オートロードの標準記法(現在は非推奨)|非推奨|
|1|基本的な記述法(クラスやメソッドの命名規則など)|採択|
|2|1を前提とした具体的なコードの書き方|採択|
|3|ログのルール(インターフェース付き)|採択|
|4|オートロードの標準記法(PSR-0の上位互換)|採択|
|5|PHPDoc(ドキュメンター用のコメントの書き方|草稿|
|6|キャッシュの持ち方|採択|
|7|HTTP通信のインターフェース|採択|
|8|こんなコードは抱きしめたい！(なにそれ。。。)|草稿|
|9|セキュリティの情報公開のフォーマット|草稿|
|10|セキュリティ情報への提言集|議論中|
|11|DIコンテナの標準化|草稿|
|12|PSR-1,2を拡張して新しいコーディングスタイルを！|草稿|
|13|リンクの定義|草稿|
|14|イベントマネージャの定義|草稿|

多くね！？

ま、まあ、PSRは、PHP Standard Recommendation、つまり、提案とか推奨なので、コーディングスタイルに関わらずいろいろ出てくるんだろうが。。。
PSR-9はPSR-10のフォーマットだし、PSR-10なんて、ドキュメントじゃなくてGithub issue だしで、いろいろ自由すぎる

# ピックアップ

## PSR-8 抱きしめたいインターフェース

妙なインターフェースとともに提案された「抱きしめられる」インターフェース
めっちゃ深読みすると、プロジェクト横断的に採用されるインターフェースとは、という意図を持ちたかったのかもと思ったけど。。。

コミット日が 2014/4/1 つまり、エイプリルフール。。。
ジョークで8番潰したんか。。。

## PSR-12 新コーディングスタイル

PSR-2 が古いってので、スタイルを更新しようってやつだけど、
PSR-2 を更新するんじゃなくて、新しい番号をふるのね
PSR-0に対するPSR-4みたいな感じか

# まとめ

というわけで、PSRは結構いっぱいあったっていう話でした

# 参考

[PHP-FIG](http://www.php-fig.org/)

※PSR-7を間違って草稿と書いていたので、修正しました
mecab をcentosにyumでインストール

#mecabをyumでインストールする

##デフォルトではyum経由でインストール出来ないので、 groonga のレポジトリを登録してからyumでmecabをインストール

```
sudo rpm -ivh http://packages.groonga.org/centos/groonga-release-1.1.0-1.noarch.rpm

sudo yum install mecab mecab-ipadic -y

mecab --version
```

以上
Ruby on Rails チュートリアル 第2章 - 演習＆答え

#演習

1. リスト2.18のコードにはマイクロポストの存在確認用のバリデーションの追加方法が示されています。これは、マイクロポストが空欄にならないようにするためのものです。図2.19と同じ表示になることを確認してください。

2. リスト2.19を次のように更新してください: FILL_INの部分を適切なコードに置き換え、Userモデルの名前属性とメール属性が存在するかどうかのバリデーションを行えるようにします (図2.20)。
 
出所）[Ruby on Rails チュートリアル 第2章](http://railstutorial.jp/chapters/toy_app?version=4.2#sec-toy_app_exercises)

#答え
1.
app/models/micropost.rb　に追加

```lang:micropost.rb
presence: true
```
![2-1.png](https://qiita-image-store.s3.amazonaws.com/0/77287/9e0fc7cb-af8b-f723-67bd-bd5b0e76cb38.png)

2.
app/models/user.rb　に追加

```lang:user.rb
validates :name, presence: true
validates :email, presence: true
```
![2-2.png](https://qiita-image-store.s3.amazonaws.com/0/77287/16acaf0a-edc4-5edb-178c-6c043748c13b.png)

終わり
IMAPで新着記事取得(Ruby)

これまでは主にGmailを使っていたので、RSSで受けとって新着通知用のアプリで流してたんだけど、訳あって別のメールサーバになったのでそれができなくなった。
Zapierなら同じことが出来ることも確認したんだけど、メールアカウントを外部サービスに預けるのはちょっと抵抗がある。でも常時メーラーを起動しておくのも嫌だ。
ということで、通知用のアプリをIMAP対応にして今まで通りの通知が行われるようにした。

ただし、これまでのRSS受信部分をIMAPにも対応するだけなのでPUSH通知には対応していない。


## 実装
ほとんどは参考記事からのコピペ。
新着通知したいだけなので既読にする処理は排除。
取得するのは昨日からの未読メールのみ。
既に取得済みのメールは詳細を取得しない。

```Ruby
require 'net/imap'
require 'kconv'

# imapのsslを有効にする
imap_usessl = true

imap_host = "imap.gmail.com"

# ssl有効なら993、そうでなければ143
imap_port = 993

# imapのユーザ名とパスワード
imap_user ="user"
imap_passwd = "password"

# 未読(UNSEEN)のみ取得する
search_criterias = [
  'UNSEEN',
  'SINCE', (Date.today - 1).strftime("%d-%b-%Y")
]

# メールヘッダの件名(Subject)
subject_attr_name = 'BODY[HEADER.FIELDS (SUBJECT)]'

# 接続
imap = Net::IMAP.new(imap_host, imap_port, imap_usessl)

# ログイン
imap.login(imap_user, imap_passwd)

# 対象のメールボックスを選択
imap.examine('INBOX')

# 未読メールを検索
imap.search(search_criterias).each do |msg_id|

  # 取得済みの場合はfetchしない
  next if msg_exist?(msg_id)

  # 未読メールの件名を取得
  msg = imap.fetch(msg_id, [subject_attr_name]).first

  subject = msg.attr[subject_attr_name].toutf8.strip

  # 新着メールの処理
  p subject

end

imap.logout
```


## 参考
[rubyを使った未読メール取得のサンプル(IMAP) · GitHub](https://gist.github.com/te2u/5506821)
Go で正しい型の戻り値かどうかをテストする

めっちゃ小ネタだけど一応。

Go は静的型付き言語なので関数やメソッドの宣言で基本的に戻りの型は制限されるし、動的検査であるユニットテスト等を書くことは基本的にないはずなんだけど、TDD のプロセスの中で最低限の実装をしようと思うと「（とりあえず）意図した型（多くの場合構造体）の戻り値であるかどうか」をチェックをしたいことがある。

どうすればいいかというと `reflect.TypeOf` の結果を普通に文字列に変換してテストする。`reflect.TypeOf` の戻り値である `reflect.Type` は[インターフェース型](https://golang.org/pkg/reflect/#Type)なんだけど `func String() string` というメソッドを持ってる。

```go
func TestFoo(t *testing.T) {
    foo := pkg_name.Foo{}

    expected := "pkg_name.Foo"
    actual := reflect.TypeOf(foo).String()
    if expected != actual {
        t.Errorf("Expected: %v, Actual: %v", expected, actual)
    }
}
```

仮実装 / 三角測量のプロセスの中でやることが多いのでほとんどの場合リファクタリングによって消えるテストケースではあるんだけど、覚えておくとわりと便利。

ちなみに `Name()` メソッドを使ってもいいんだけどパッケージ名が情報として欠落するのと Named Type じゃない場合には使えない。
Raspberry Pi 2のArch　Linuxで無線LANが繋がるまで

## あいも変わらず不便
インストール後キーマップとか諸々で不都合があるんで[ビギナーズガイド](https://wiki.archlinuxjp.org/index.php/%E3%83%93%E3%82%AE%E3%83%8A%E3%83%BC%E3%82%BA%E3%82%AC%E3%82%A4%E3%83%89)のインストール後のロケールからタイムゾーンまでをちょいちょいする。

###ロケールファイルの設定と反映。

```/etc/locale.gen

#en_SG ISO-8859-1
en_US.UTF-8 UTF-8
#en_US ISO-8859-1
..
#ja_JP.EUC-JP EUC-JP
ja_JP.UTF-8 UTF-8
#ka_GE.UTF-8 UTF-8
..
```

```
locale-gen
echo LANG=ja_JP.UTF-8 > /etc/locale.conf
export LANG=ja_JP.UTF-8
```
###キーマップとフォントの設定
``` /etc/vconsole.conf
KEYMAP=jp106
FONT=lat9w-16
```
### タイムゾーン
```
ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

##無線LANの設定
[Archのwiki](https://wiki.archlinuxjp.org/index.php/%E3%83%93%E3%82%AE%E3%83%8A%E3%83%BC%E3%82%BA%E3%82%AC%E3%82%A4%E3%83%89)を参考にしながら、無線LANを設定しようとしたらいきなり蹴躓いたのでお叱りに沿って諸々入れる。

```
pacman -S dialog wpa_supplicant
```

必要なパッケージが導入できたら、以下を実施する。
1.インターフェースの確認
ipコマンドでインターフェース名を確認する。何事もなければwlan0で表示されているはず。

```
ip addr
```
2.無線LANの設定
無線LANのプロファイルを設定する。とりあえずdhcpでもつなげるようにする。

```
wifi-menu wlan0
```
プロファイルが/etc/netctl直下にwlan*-SSID名で保存されるからstatic IPにする場合
/etc/netctl/examples/wireless-wpa-staticから以下の行をコピーして編集する。
その際には忘れずに元からあった「IP=dhcp」をコメントアウトする。

```lang:/etc/netctl/wlan*-SSID名
 # IP=dhcp  コメントアウト
IP=static
Address='192.168.XXX.XXX/24'
Gateway='192.168.XXX.XXX'
DNS=('XXX.XXX.XXX.XXX')
```

3.インターフェースの有効化
再起動時にも繋がるようにインターフェースの有効化をする。

```
netctl enable プロファイル名 
```

最後にリブートして再起動後に無線LANが上がっていることを確認して終了。
TablePress importのテーブル選択フォームの並び順変更


変更箇所をメモ

## 変更箇所

```php:view-import.php
	<tr id="row-import-existing-table" class="bottom-border">
		<th class="column-1" scope="row"><label for="tables-import-existing-table"><?php _e( 'Table to replace or append to', 'tablepress' ); ?>:</label></th>
		<td class="column-2">
			<select id="tables-import-existing-table" name="import[existing_table]"<?php disabled( $data['tables_count'] > 0, false, true ); ?>>
				<option value=""><?php _e( '&mdash; Select &mdash;', 'tablepress' ); ?></option>
			<?php
				$sorted_table_array = array(); // *** add this line ***
				foreach ( $data['table_ids'] as $table_id ) {
					$table = TablePress::$model_table->load( $table_id, false, false ); // Load table, without table data, options, and visibility settings
					if ( ! current_user_can( 'tablepress_edit_table', $table['id'] ) ) {
						continue;
					}
					if ( '' === trim( $table['name'] ) ) {
						$table['name'] = __( '(no name)', 'tablepress' );
					}
					// *** change lines ***
					// $text = esc_html( sprintf( __( 'ID %1$s: %2$s', 'tablepress' ), $table['id'], $table['name'] ) );
					// $selected = selected( $table['id'], $data['import_existing_table'], false );
					// echo "<option{$selected} value=\"{$table['id']}\">{$text}</option>";
					// copy to sorted_table
					$sorted_table_array[$table['id']] = $table['name'];
				}
				// *** add lines　***
				// sort by name
				asort($sorted_table_array, SORT_STRING);
				foreach( $sorted_table_array as $id => $name) {
					$text = esc_html( sprintf( __( 'ID %1$s: %2$s', 'tablepress' ), $id, $name ) );
					$selected = selected( $id, $data['import_existing_table'], false );
					echo "<option{$selected} value=\"{$id}\">{$text}</option>";
				}
			?>
			</select>
		</td>
	</tr>
```
[OS X] El Capitanでcocoapodsインストールが出来ない


El Capitanでcocoapodsをインストールしようとすると以下のようなエラーが出た

>ERROR:  While executing gem ... (Errno::EPERM)
>Operation not permitted - /usr/bin/xcodeproj

原因はEl Capitanからrootlessというのが追加されたという
例えば、root権限を持つユーザーでも
/usr、/sbin、/System　など一部アクセス制限が掛かるらしい

以下解決方法

以下のようにrootlessを無理やり解除する方法があるが、セキュリティ上非推奨

>sudo nvram boot-args=“rootless=0”

ということでインストールフォルダを変更する方法のほうがオススメ

>sudo gem install -n /usr/local/bin cocoapods

これで試したみたらできた
ngrokを使って開発中のサービスをインターネットに公開する


[ngrok](https://ngrok.com/)を使うとNATやfirewallの中のローカルマシンで動いているサービスをインターネットに公開できるようなので試してみました。
ここではVagrantで作ったVMにWordpressをインストールして、ngrokを使ってインターネットに公開します。

## 環境

* Vagrant 1.7.4
* CentOS release 6.7 (Final)

CentOSは下記のVagrantfileを使って作りました。

```ruby:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

box = "bento/centos-6.7"

Vagrant.configure(2) do |config|
  config.vm.box = box
  config.vm.hostname = "centos"
  config.vm.network "private_network", ip: "192.168.10.10"
end
```

## Wordpressのインストール

VagrantfileからVMを作成して、Wordpressをインストールしていきます。

```
$ vagrant up && vagrant ssh
[vagrant@centos ~]$ sudo yum install -y mysql-server httpd php php-mysql unzip
[vagrant@centos ~]$ wget https://wordpress.org/latest.zip
[vagrant@centos ~]$ unzip latest.zip
[vagrant@centos ~]$ sudo mv wordpress/ /var/www/html/
[vagrant@centos ~]$ sudo chown -R apache:apache /var/www/html/wordpress
[vagrant@centos ~]$ sudo service mysqld start
[vagrant@centos ~]$ sudo /usr/bin/mysqladmin -u root password root # 管理者パスワード設定
[vagrant@centos ~]$ mysql -uroot -proot -e 'create database wp' # Wordpress用DB作成
[vagrant@centos ~]$ sudo service httpd start
```

ここまできたらブラウザで [http://192.168.10.10/wordpress](http://192.168.10.10/wordpress) にアクセスして下記のような設定画面が表示されることを確認します。

![Screen Shot 2015-11-22 at 21.11.48.png](https://qiita-image-store.s3.amazonaws.com/0/27509/1a6c4315-c3bf-c3ff-589a-b4f0c5d6da6d.png "Screen Shot 2015-11-22 at 21.11.48.png")

## ngrokのインストールと実行

ngrokのインストールは[ダウンロード](https://ngrok.com/)して、解凍するだけです。

```
[vagrant@centos ~]$ wget https://dl.ngrok.com/ngrok_2.0.19_linux_amd64.zip
[vagrant@centos ~]$ unzip ngrok_2.0.19_linux_amd64.zip
```


ngrokを実行してWordpressをインターネットからアクセスできるようにします。

```
[vagrant@centos ~]$ ./ngrok http 80
```
connectingから下記のようにonlineになればインターネットからアクセス可能になります。

![Screen_Shot_2015-11-22_at_21.16.45.png](https://qiita-image-store.s3.amazonaws.com/0/27509/4534e5f2-22bf-6b6c-808d-21ee01a666bb.png "Screen_Shot_2015-11-22_at_21.16.45.png")

Fowardingの欄にかかれているアドレス http://*****.ngrok.io/wordpress にブラウザからアクセスします。
再度設定画面がでるのでWordpressの設定を行って使えるようにします。

![Screen Shot 2015-11-22 at 21.11.48.png](https://qiita-image-store.s3.amazonaws.com/0/27509/1a6c4315-c3bf-c3ff-589a-b4f0c5d6da6d.png "Screen Shot 2015-11-22 at 21.11.48.png")

データベース情報は下記のようになっています。

|設定項目         | 設定値     |
|----------------|-----------|
| Database Name  | wp        |
| User Name      | root      |
| Password       | root      |
| Database Host  | localhost |

正しく設定できれば、下記のように投稿した記事が見れると思います。

![Screen Shot 2015-11-22 at 21.26.56.png](https://qiita-image-store.s3.amazonaws.com/0/27509/1da3b768-7d5d-6a3b-c7db-a8f27dd6c9d2.png "Screen Shot 2015-11-22 at 21.26.56.png")


## より詳しい使い方

公式マニュアル[https://ngrok.com/docs](https://ngrok.com/docs)をご参照ください。
RxSwiftでネットワークエラーを判定する方法

RxSwiftを使っていて、ネットワークエラーをどうやって捕まえればいいのかに少し迷ったのでメモ。

こんなかんじのコードを書いていたとします。

```swift
…略…
.subscribe { (event: Event<JSON>) -> Void in
  switch event {
  case .Next(let element):
    print(".Next")
  case .Completed:
    print(".Completed")
  case .Error(let error):
    print(".Error")
  }
}
…略…
```

この時ネットワークに繋がらない状態だった場合、当然.Errorのところに入ってきます。

しかし、このままではサーバから返された404, 500などのエラーなのか、ネットワークエラーなのかを判別することはできません。
ネットワークエラーであることを判別したい場合はcase .Errorの中で下記if文を書けばOKです。

```swift
if let error = event.error {
  if (error._domain == NSURLErrorDomain) {
    print("NetWorkError!")
  }
}
```
Xmingからgnome-terminalを起動する

xtermの入っていない環境でgnome-terminalにXmingで接続しようとしても
エラーが表示されて接続できない。
ぐぐったら[Xmingからgnome-terminalが起動できないときは。](http://d.hatena.ne.jp/gp98/20091021/1256109844)という記事を
見つけることが出来たけど肝心な所がリンク切れになっていたってことで
忘れないように記載。

``` lang:.bashrc
if  test "$SSH_CONNECTION" != ""  ; then
   eval `dbus-launch --sh-syntax`
   gconftool-2 --spawn
fi
```
一応Cent7で動作を確認しました。
[Unity]ネットワークを通してメッセージをやり取りする簡単なサンプル

サーバとクライアント間でメッセージを送受信する簡単なサンプル.
最小構成では`NetworkManager`などを使わなくてもネットワークを通したメッセージのやり取りができます.

* `RegisterHandler`に渡す`MsgType`を独自定義するときは`MsgType.Highest`より大きい値にする.
* `MessageBase`を継承したクラスのメンバをプロパティにしない

上記2点に注意しましょう.

下記のサンプルを適当なゲームオブジェクトにアタッチして実行するとコンソールに

```
Hello!
Hello! from server
```

と表示されます.

```csharp:sample.cs
using UnityEngine;
using UnityEngine.Networking;

public class Sample : MonoBehaviour
{
    class Msg
    {
        public const short Text = MsgType.Highest + 1;
    }

    class Message : MessageBase
    {
        public string Text;
        // public string Text { get; set; } にするとうまく動かない
    }

    void Start()
    {
        // サーバがMsg.Textを受信したときに行う関数を登録する
        NetworkServer.RegisterHandler(Msg.Text, networkMessage =>
        {
            var mes = networkMessage.ReadMessage<Message>();
            Debug.Log(mes.Text);

            // Msg.Textを送ってきたクライアントに返信する
            networkMessage.conn.Send(Msg.Text, new Message() { Text = "Hello! from server" });
        });

        // サーバ開始
        // 他のコンピュータから接続したい場合は"0.0.0.0"などのIPを使用する
        NetworkServer.Listen("127.0.0.1", 7000);

        var client = new NetworkClient();

        // クライアントがMsg.Textを受信したときに行う関数を登録する
        client.RegisterHandler(Msg.Text, networkMessage =>
        {
            Debug.Log(networkMessage.ReadMessage<Message>().Text);
        });

        // クライアントがサーバに接続完了したときに行う関数を登録する
        client.RegisterHandler(MsgType.Connect, _ =>
        {
            // サーバにMsg.Textを送る
            client.Send(Msg.Text, new Message() { Text = "Hello!" });
        });

        // サーバに接続
        client.Connect("127.0.0.1", 7000);
    }
}

```
konashi.js向けのコードをChromeで実行

# * 注意 *
本家のほうで[Web Bluetooth向けのSDK](https://github.com/YUKAI/konashi-web-bluetooth)が開発されているようです。よって現在では、この記事に書かれているようなhackなしで普通にKonashiをお楽しみいただけます。素晴らしい！（追記：2016年10月8日）

# この記事について
iOS上からJavaScriptで制御できるホビー向けBLEデバイスkonashiと、そのJavaScript開発環境のkonashi.jsが面白い。せっかくなのでAndroidでも遊んでみましょう、という趣旨の記事です。

[前回の記事](http://qiita.com/toyoshim/items/74ae7551dc2c9ab9cbf6)でkonashiやWeb Bluetoothについて少しだけ解説しています。Web Bluetoothを使ってLEDを点滅させる例を紹介しましたが、今回はkonashi.js向けのコードを（なるべく）そのまま持ってきてOpen Web上で事項する事を目標としてみました。

# 仕組み
konashi.jsを使った開発では、konashi-bridge.jsによって提供されるAPIを使ってBLEデバイスの制御を行います。このkonashi-bridge.jsの中にあるk.triggerToNative()を上書きし、Web Bluetooth APIを用いたコードに置き換えることで簡単なサンプルコードをChrome上で実行してみました。

利用者から見た場合konashi-bridge.jsに続けてkonashi-bridge-webapi.jsを読み込むだけで既存のコードが利用できる事を目標としています。

# konashi-bridge-webapi.js
GitHubでオリジナルのSDKをforkして、konashi-bridge-webapi.jsを追加した[branchを公開](https://github.com/toyoshim/konashi-js-sdk/tree/web_bluetooth)しています。とりあえずLチカサンプルを動かすところまでを考えて

- ```find```
- ```pinMode```
- ```digitalWrite```

のみを実装しました。後は遊んでいて必要になったら付け足す感じで。pull requestも歓迎です。というか、ある程度まとまった段階でupstreamにmergeしたいところです。

今のところjs/konashi-bridge-webapi.jsを追加しただけなので別段forkする必要はなかったのですが、想定しているkonashi-bridge.jsのバージョンとの対応がとれた方がわかりやすいかな、と。その点、同じrepository/branch上でcommitしてあれば安心なので、あまり深く考えずにforkしました。まぁ、将来pull requestできれば良いね、くらいのつもりで。

# サンプル
monakazさんがjdso.itで公開している[Lチカのサンプル](http://jsdo.it/monakaz/nOMl)を動かしてみました。例によってWeb Bluetoothがsecure origin必須なため、jsdo.it上ではforkできず、[JSFiddle上でfork](https://jsfiddle.net/toyoshim/3rd7n70f/)?しています。Android Chrome Dev 48（要chrome://flags#enable-web-bluetooth）で動作確認しました。

# 追記
## 2015/11/22 22:05
同じくmonakazさんの[ナイトライダー](http://jsdo.it/monakaz/883n)も動かしてみたくて```digitalWriteAll```の実装を追加しました。やはり[JSFiddle](https://jsfiddle.net/toyoshim/ymsfn0xt/)で公開してあります。