OmniAICreator/Qiita-1.07M huggingface dataset:
git-bash で $ git commit した際の挙動

# これは何？
git bashで`$ git commit -m "コミットメッセージ"`
の代わりというか`-m`オプションを引っこ抜いて`$ git commit`と打った場合の動作に関するメモ
Windows環境であることを前提に、お話します。

# まず結論
コミットメッセージを打ち込むためにgitさんは`vim`というプログラマー御用達のエディタを呼ぶ
もしもコミット操作が事故でコミットされたくなかったら、即座に`:q!`とでも入力して`vim`を終了させればコミットされない。
*コミットメッセージ無しの場合はキャンセル扱いになります。*

# おさらい

以前git bashでコミットする際に教えたのはこんなコマンドだった

```bash
$ git commit -m "コミットメッセージ"
```

これは、`-m`というオプションでその後ろに書いた文章をコミットログに残すメッセージとしてコミットを行うコマンド。
これは`-m`オプションをつけた場合の奴で、元のコマンドはこれ。

```bash
$ git commit
```

これ自体がコミットを行うというコマンド。

### -m を忘れるとどうなるの？

`-m`を忘れる……つまり、`$ git commit`とだけ打ち込んで実行をした場合、gitはコミットメッセージ編集用のエディタを呼ぶ。
エディタ自体は下記方法でも一応指定可能。

```bash
$ git config --global core.editor "使うエディタのパス"
```

なのだがこの設定はスペース含みに弱いし普通あまりやることはないと思うし、git-bashでやる場合はvimで十分だと思うので
指定をしていないのを前提として話をする。 

# 実際何を呼ぶ？ 
結論にも書いたように、とどのつまり`$ git commit`を実行すると、gitはvimをコミットメッセージ編集用エディタとして呼び出す。

### vimとは

コマンドライン上で実行される(いやGUI版もあるけれど)、プログラマー御用達のエディタ。
うちも仕事じゃよく使うし個人的なエディタとしてもWindows用ではgvim(GUI版のvim)を好んで使っていたぐらい。~~CLIのvim環境を用意するのWindowsだとめんどい~~
編集モードと入力モードを切り替えて使うというのが特徴的で、それによって手の位置をキーボードのホームポジションからほぼ全く動かさずに操作を完結できるというのがポイント。

つまりマウスどころか**十字キーにすら**に手をのばす必要がこのエディタでは全くなくなる操作感なのだ……。

# vimの基本操作
ここからはgit-bashで実際に`$ git commit`を叩いた時に起動するvimくんの基本的な操作方法についてのメモになる。
編集モードと入力モードの2つに分けて説明しよう。あくまで基本操作なので、他の操作方法については別途下記チートシートを見るように
http://vim.rtorr.com/lang/ja/

|編集モード| ※`:`や`Ctrl+`のついてないコマンドは入力モード切り替えを除いて数字を前に置くとその数字分処理する  |
|:--------|:--|
|`i`|入力モードに切り替え|
|`h j k l`|左から `← ↓ ↑ →` に対応。あ、ちゃんと十字キーでもカーソル動かせるから安心してください|
|`u`|アンドゥ。やらかした時はこれで戻せる。つまり他のエディタでいう`Ctrl+z`|
|`Ctrl+r`|リドゥ。つまりやり直し操作。他のエディタとかだと`Ctrl+y`とかに割り当てられてるアレ。|
|`x`|カーソル上、または選択範囲の文字の削除。実は内部的には切り取り処理だったりするので後述する貼付け操作で貼り付けられる。|
|`dd`|行の削除。`dj`とか`dk`とかやると一行下の行や一行上の行も巻き込む。削除とはいうが切り取り処理なので`p`で貼れる。|
|`v`|選択モードに変更。マウスドラッグのように選択範囲を選ぶモードになる。`Esc`キーで抜けられる|
|`V`|行選択モードに変更。こちらは選択範囲が行単位になる。|
|`Ctrl+v`|矩形選択モードに変更。選択範囲が矩形で取れる。地味に役に立つ。|
|`y`|選択した範囲のコピー。実は「ヤンク」と呼ぶらしい。が、コピーと覚えても問題無いだろう。|
|`p`|貼付け。コピーした内容を貼り付ける|
|`:w`|保存。オプション無しでは上書き保存の挙動。普通のエディタで言う`Ctrl+S`|
|`:q`|終了。保存してない時は怒られる。が、保存したくない場合は`:q!`で強制的にファイル編集を終了できる|
|`:wq`|保存して終了。やってることは`:w`と`:q`を順番にやっているだけ|

|入力モード||
|:--|:--|
|`Esc`または`Ctrl+[`|選択モードへ変更|

# あとがき

もともとこれは身内でエンジニア以外のメンバーも含めてSourceTreeを使用していた時に、なんととあるメンバーのSourceTreeが落ちるようになってしまい、その対策で
*git-bash、使おうぜ。(ﾆｯｺﾘ*
とやった時に、`git commit -m "コミットメッセージ"`という書き方で教えたのですが、
*git-bashとはいえWindows上で`-m`忘れた時の挙動ってどうなるんだっけ……*というのを実際にやって検証してみた結果、vimが立ち上がるということで、うっかりやらかして**「なんだこれ操作がわからん！しかも`Ctrl+C`でも閉じられない！」**という事態で大ハマリしないようにというメモ書きでした。(立ち上がっているエディタがvimであるというところから把握する必要もあるし)

# 追記
2020/06/15
気がつけばGit for WindowsさんがVSCodeでのコミットメッセージに対応してましたね。
在 main queue 執行 - Swift 3 調整記

## 引言

這在開發日常應該經常碰到：當 http request 返回時，必須要在 main queue 裡面更新 UI 

那這篇就是來講怎麼用 swift 讓程式碼的執行緒切換到 main queue 上。

## 原本的寫法

``` swift
dispatch_async(dispatch_get_main_queue()) {
    // 程式碼片段 ...
}
```

這個寫法有點像 C 的全域 function 的寫法，在執行 `dispatch_async` 這個 function 的同時，透過另外一個 function 取得 main queue ，於是再把要做的事情包成 closure 作為參數傳入這個 function 。

這大概是從 GCD 出廠以來，變更最少的寫法之一。

## Swift/iOS 10 之後的寫法

取用的方法直覺很囉，而且不囉唆很多：

``` swift
DispatchQueue.main.async {
    // 程式碼片段 ...
}
```

取用 main queue 的方式也從原本的 `dispatch_get_main_queue()` 很冗長的方式，改成取用 `DispatchQueue` 的 `main` 就可以在 main queue 上執行。

除了閱讀上可能會比較容易理解之外，撰寫時的自動完成速度等可能也會變得比較快。

## 心得和小結

從 Objective-C 轉換到 Swift 時， 寫 GCD 相關的程式碼，也是令我比較困擾的地方。

當 Xcode 6 剛出來的時候，到 Xcode 7 對於自動完成有稍微改善之前，

原始的 C 相關的 syntax 要自動完成變得不是很方便；再來也和 Swift 撰寫的風格不一樣。所以在寫這一類的程式碼時，寫 code 的速度就會被稍微降下來一點點：一來是他無法自動完成，二來就算是有備選，但是想要的總是不是在最前面， function 字數又非常長。

這個情形之下，又長、又複雜的呼叫方式就變得有點麻煩了。

不過自從新的 SDK 出來之後，他變得不像碎碎念的老頭：用了比較簡單的方式，讓我們可以比較快速的達到我們想要撰寫的內容。無論是自動完成或是手動完整打完 GCD 的程式碼都快了很多。

期待發現更多漂亮的寫法～ :laughing:
(Qiita要望) コメントによって記事が進化した際、コメント投稿者に報いる機能が欲しい


自分の投稿した記事にコメントが付くとうれしいですよね。間違いの指摘だったり、よりベターな方法の提案だったり、勉強になることも多いです。時には議論が発展して、たくさんのコメントが付くこともあります。自分の投稿だと以下のようなものです。

[ifで判断したい条件が多い場合はどうする？](http://qiita.com/EastResident/items/b9a5fcfc930be74ce482)

[その first は本当に必要なのか](http://qiita.com/EastResident/items/54701d1e58cabc8040f7)

自分の場合は、もらったコメントを基に記事をブラッシュアップさせ、コメントをできるだけ生かすようにしています。

問題は次のようなケースです。

## 自分の書いた記事の価値 << コメントの価値となる場合

自分の投稿した記事に対して、有識者の方が補足のコメントをくれることはよくあります。補足のコメントをもらえることは、非常にうれしいのですが、**補足が本格的すぎる**と逆に申し訳なく思ってしまうんです。以下のような記事です。

[Ruby 2.4.0の新機能 「String supports Unicode case mappings」 を試す](http://qiita.com/EastResident/items/d8ce7172b30e681dd6c5)

現状だと、コメントによってContributionが上昇する機能は存在しないと思います。

なので、**有意義なコメントを投稿してくれた人に報いるための、何らかの手段**が欲しいです(すでにあるのでしたら教えて下さい)。
あるいは、コメントによって価値が向上した記事を、再投稿扱いにして再びタイムラインに乗せる機能とか。

もしくは、こういった場合どう対応するのがベターなのでしょうか？
ソース内検索を少しだけ楽にするライフハック for PHP


地味に便利なものの見方。

ブラウザでgithubやQiitaを見た場合のページ内検索でも応用できます。
早速、"n hogehuga"や"s hogehuga"で検索してみましょう。

## 結論

対象となる文字列や行の"文字列としてのフォーマット"を意識して分解すると、簡単に絞り込み出来るようになる。

## 関数、メソッド定義を探す場合

頭に"n "を付けて探す。

```php
function hogehuga()
{
}

// 使用箇所にはマッチしない。
hogehuag();

// "n hogehuga"で検索すれば一発で定義箇所にマッチする。
```

## クラス定義を探す場合

頭に"s "を付けて探す。

```php
class Hogehuga
{
}

// 使用箇所にはマッチしない。
$hogehuga = new Hogehuga;

// "s Hogehuga"で検索すれば一発で定義箇所にマッチする。
```

## 余談

次のコーディングスタイルを取ると定義箇所と使用箇所の切り分けが簡単にできるようになる。
具体的にはgrepで使用箇所一覧を作る際に極めて強力な状況を作り出せる。
但し、現在はPSR-2が主流なためあまり使える機会は無いと考えられる。

### 関数、メソッドを探す場合

頭に"n "を付けて探す。

```php
// 定義では関数名とパーレンの間にスペースを入れる。
function hogehuga () {
}

// 使用時は関数名とパーレンの間にスペースを入れない
hogehuga();
```

このようにすると、"n hogehuga ("で検索すれば定義箇所が、"hogehuga("で検索すれば使用箇所を綺麗に特定できる。

### クラスを探す場合

```php
// 定義ではブレス前の改行を行わず、スペースを入れる
class Hogehuga {
}

// 使用時はクラス名の後にスペースを入れない
$hogehuga = new Hogehuga;
$hogehuga = new Hogehuga();
```

このようにすると、"s Hogehuga "で検索すれば定義箇所が、"w Hogehuga"で検索すれば使用箇所を綺麗に特定できる。
ブレスの前にスペースを入れる事により、以降にextendsやimplementsが続いても変わらずマッチするようになる。
Fabricでの処理中にサーバを再起動させる

[TensorFlowで株価予想シリーズ](http://qiita.com/akiraak/items/b27a5616a94cd64a8653) を実装してるのですが、コーディングは Mac で行い、コードを GPU（TITAN X） が搭載された PC に rsync で同期してから実行しています。しかし、GPU を使ったプログラムを200回ほど実行すると cuda(7.5) のライブラリがエラーを出してそれ以降は全て失敗するようになります。そこでエラーを出すようになったら手動でサーバを再起動してたのですが、Fabric を使って自動で再起動するようにしました。

まずは全体のコードはこちら。

```fabfile.py
import time
from fabric.api import run, cd, prefix, env
from fabric.tasks import execute


# -i を付けることでsshでログインした時に .bashrc に設定した cuda などのパス設定が有効になる
env.shell = '/bin/bash -l -i -c'
# サーバアドレス
env.hosts = ['10.0.1.17']
# ログインユーザー名（秘密鍵認証なのでパスワードはなし）
env.user = 'akiraak'


# ssh でアクセスしてコマンド実行
def run_jp():
    # プロジェクトのディレクトリに移動
    with cd('~/project/'):
        # virtualenv の設定を有効にする
        with prefix('. ~/tensorflow-env/bin/activate'):
            # コマンド実行
            run('time python run_jp.py', warn_only=True)
            # サーバ再起動（パスワード無しsudo設定を有効にしておくこと）
            run('sudo reboot')


if __name__ == "__main__":
    # サーバ上のコマンド実行と再起動を繰り返す
    while True:
        try:
            # ssh実行
            execute(run_jp)
        except Exception as e:
            print(e)
        # サーバが再起動するまでしばし待つ
        time.sleep(60)
```

Fabric はサーバに ssh でログインしてのコマンド実行を python のコードで記述できるものです。

Mac からこのコードを実行して、サーバを制御します。

`run_jp()` が ssh にアクセスした後にコマンドを実行する関数になります。通常だと以下のコマンドで処理を実行します。

```shell-session
$ fab run_jp
```

今回は「処理を実行」→「サーバ再起動」→「処理を実行」としたいので、fab コマンドは使わないで、普通に python コードを実行するかたちにします。

```shell-session
$ python fabfile.py
```

ここで `run_jp()` の実行と、再起後に60秒待つ処理を行います。

```
if __name__ == "__main__":
    # サーバ上のコマンド実行と再起動を繰り返す
    while True:
        try:
            # ssh実行
            execute(run_jp)
        except Exception as e:
            print(e)
        # サーバが再起動するまでしばし待つ
        time.sleep(60)
```

実際の処理を行う `run_jp()` では、コードがあるディレクトリに移動し(~/project/)、virtualenv の設定を有効(. ~/tensorflow-env/bin/activate)にしたのち、`python run_jp.py` を実行しています。

`python run_jp.py`の中では別プロセスで複数の処理を実行してるのですが、前述のとおり途中で cuda がエラーを出すので一部の処理は失敗した状態で終わります。そこで最後に `sudo reboot` を行います。その後は `if __name__ == "__main__":` に戻り、sleepで再起動を待った後に、また同じコマンドを実行します。

```
# ssh でアクセスしてコマンド実行
def run_jp():
    # プロジェクトのディレクトリに移動
    with cd('~/project/'):
        # virtualenv の設定を有効にする
        with prefix('. ~/tensorflow-env/bin/activate'):
            # コマンド実行
            run('time python run_jp.py', warn_only=True)
            # サーバ再起動（パスワード無しsudo設定を有効にしておくこと）
            run('sudo reboot')
```
vmware > 描画が遅い > 再起動で解消

```txt:動作環境
VMWare Workstation v12.0.0 on Windows 10
```

VMWare上でIDEなどを使っていると、オプション画面の表示などが遅い場合がある。
例として、15項目の表示画面にて、15項目が上から順番に3つずつ描画しているのが見える場合がある。

VMWareを再起動すると、描画は通常の速さ（瞬時)になることを確認した。

VMWare Fusionで起動したWindows 8.1にてマウスカーソルが消失する場合などもある。VMWareは最初の起動時になんらかの不具合がある場合が見られ、そういう症状が見られたらとりあえず再起動することで解消するかもしれない。
ローカルDBとVBAの連係




## Postgres
Windows 10 64bit Pro
EXCELバージョン:　MicrosoftOffice 356 (32bit)

### Windowsの設定 - postgresqlデータソースを追加する
ODBCのダウンロード

[psqlodbc_10_03_0000-x86](https://www.postgresql.org/ftp/odbc/versions/msi/)

ODBCデータソースアドミニストレータ32ビットで、データソースPostgreSQL Unicodeを追加する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/33237/59c60b36-cfc5-e368-e34b-077d1cac5662.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/33237/372fbeba-afac-6b15-8df6-e8222895a2b3.png)


Data Source: Excelから呼び出すときに使う
Description: 自由に記入
Database: 存在するDatabase名
SSL Mode: 自由に記入
Server: 通常のローカル環境ならlocalhost
Port: ポート (通常は 5432)
User Name: データベース接続ユーザ名
Password: パスワード

### Excelでの設定 - ADOを参照設定で設定する
開発 > Visual Basic > ツール > 参照設定
下記をチェック

Microsoft ActiveX Data Objects 2.8 Library 

DNSには先ほど設定したサーバー名を設定する

```
Sub TestConnection()
    Dim cn As ADODB.Connection
    Set cn = New ADODB.Connection
    cn.ConnectionString = "DSN=PostgreSQL-test_app;"
    cn.Open
    cn.Close
    Set cn = Nothing
End Sub

```

## MySQL

Windows 7 64bit Pro
EXCELバージョン:　MicrosoftOffice 356 (32bit)

ODBCドライバーを使って接続する

ODBCのダウンロード


[mysql-connector-odbc-5.3.6-winx64.msi](https://www.mysql.com/products/connector/)


ODBCの設定
MySQL5.6にODBCユーザを作成

```
C:\Program Files\MySQL\MySQL Server 5.6\bin>mysql -u root -p
Enter password: ********
# ポートの確認
show variables like 'port';
# ユーザODBCでlocalhostに接続できるように設定
CREATE USER 'ODBC'@'localhost' IDENTIFIED BY 'password';
grant all privileges on *.* to 'ODBC'@'localhost'  ;

```

C:\Windows\Syswow64\odbcad32.exe

![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/33237/9eff082a-5d4a-85ce-5638-92deb8ed9e74.png)

![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/33237/cf3cebe7-e6c4-3f7d-082c-ee77a76f5abe.png)

VBA

```js
'
'MySQLデータベースへの接続を確立
'
Sub MySQL接続()
    On Error GoTo errHandler
    Dim myCon As New ADODB.Connection   'Connectionオブジェクト
    
    '接続文字列を設定する
    myCon.ConnectionString = "Driver={MySQL ODBC 5.3 Driver};" _
        & "Server=localhost; Data Source= WindowsMySQL;Database=kokyaku_kanri; Uid=ODBC; Pwd=password"
    
    'データベースに接続する
    myCon.Open
    MsgBox "接続しました。"
    
    '接続を切断する
    myCon.Close
    MsgBox "切断しました。"
    
procContinue:
    Set myCon = Nothing
    Exit Sub

errHandler:
    'エラーが発生した場合にエラーメッセージを表示する
    MsgBox Err.Description
    Resume procContinue
End Sub
```
【Laravel】自作したパッケージの依存パッケージをcomposerがインストールしてくれない

## 【問題】依存パッケージをcomposerがインストールしてくれない
Laravelで自作パッケージを開発し、他アプリから使用できるかどうか確認をしている際に、自作パッケージの依存パッケージがインストールされない、という問題がありました。

作成したパッケージのcomposer.jsonには、以下のように記述しています。ここでは、作成したパッケージではFeedsパッケージが必要であるため、以下の様に記述しました。
`dev-master`というのは、masterブランチのパッケージを使用するという意味です。

```json:composer.json
    "require": {
        "willvincent/feeds": "dev-master"
    },
```

これで、作成したパッケージを使用する親アプリのルートディレクトリで`composer update`を実行すれば、作成したパッケージが追加されるときに、Feedsパッケージも追加されるようになるはずです。…なるはずなのですが、なぜか追加されません :innocent: 

### 【原因】Composerのスタビリティの設定

Composerにはパッケージを追加する際に、そのパッケージのスタビリティ（そのバージョンが開発版なのか安定版なのか）を判断してダウンロードする仕組みがあります。
例えば、`-dev`は開発中、`-rc`は公開前、`-stable`は安定版、というようなキーワードをブランチ名（タグ名）に付けることで、そのバージョンの状態を判断することができます。

```
※バージョンの例
3.0-dev
2.0-alpha
1.8
1.7
```

composer.jsonで追加するパッケージのバージョン指定に`@dev`などのスタビリティフラグを付けることで、例えば「安定版じゃないけど最新のβバージョンが欲しい」というようなときに対応することができます。

```json:composer.json
"require": {
    "vendor/foo": "1.0@beta"
}
```

そして今回の状況ですが、作成したパッケージであるルートパッケージが`dev-master`を要求していて、 それがさらに他のパッケージを要求していました。それぞれの関係を矢印で表すとこのような感じです。

`作成したパッケージ→Feedsパッケージ(dev-master)→SimplePieパッケージ`

dev-masterはmasterブランチを指定しており、`dev-master@dev`というスタビリティフラグを持っているのですが、今回作成したパッケージを追加しようとしている親アプリではスタビリティを`stable`に指定していました。つまり安定版のパッケージを追加するようになっていたのです。
そのため、`dev-master@stable`を参照しようとして見つからず、その結果追加されないという現象が起きていたようでした。

### 【解決】スタビリティフラグをホワイトリストとして使用する

親アプリのcomposer.jsonに以下のように記述します。

```json
    "require": {
        "allabout/fbn-citrus-core": "dev-r26790_create_rss_validator",
        "willvincent/feeds": "@dev",
```

ここではFeedsパッケージのバージョン指定はせずに、`@dev`のみとします。
作成したパッケージのcomposer.jsonは変わらずそのままパッケージのバージョン指定をするように記述します。

```json
    "require": {
        "willvincent/feeds": "dev-master"
    },
```

これにより、無事に作成したパッケージの依存パッケージもダウンロードされるようになりました！
Composerのスタビリティについて大変勉強になりました。


### 参考にした記事
Composerがパッケージのstabilityを解決するしくみ
http://kohkimakimoto.hatenablog.com/entry/2014/04/04/102125
django1.10が出ました

djangoの1.10が予定通りリリースされました。

djangoはLTSが1.8で、次のLTSがは1.11で、2017年４月のリリース予定。

主な変更点であがっているものは３つ。


- Full text search for PostgreSQL.
- New-style middleware to solve the lack of strict request/response layering of the old-style of middleware.
- Official support for Unicode usernames.

posgresqlで使っているので、full text searchは関心ある。
ミドルウェアの書き方が新しいのができたみたい。今も少し使っていらうけど特に問題は起きてないので、いいかな。
usernamesのunicode対応は地味に効果あるのかな。それより、usernameのlengthが長くなっているといいんだけど。
sudo のパスワードなしの設定メモ

OS:ubuntu14.04

visudoでパスワードなしに設定したものの、なぜかパスワードを聞かれてしまう。
でも、sudoは実行できる。

原因は、sudoersの中の書く位置でした。

こうあるので、rootの下に書いていたのですが、

```
# User privilege specification
root    ALL=(ALL:ALL) ALL
hoge    ALL=NOPASSWD: ALL
```


その下の方のこちらに書いてないとだめでした。
上で書いていても、%sudoの行が上書きしてしまうのかな。

```
# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
hoge    ALL=NOPASSWD: ALL
```

これで無事パスワードを聞かれなくなりました。
Chat UIで最新の投稿を追いかけ続ける

# 自己紹介

初めまして。HAL大阪の２回生で関西を中心にフロントエンドエンジニアとして活動しているじゅんじゅんです。

Twitterは [@konojunya](http://twitter.com/konojunya)

では早速。

# やりたい事

Webでサーバサイドを勉強した時ぐらいに掲示板とかをよく作ると思うんですが（完全な主観です）、そういう時に困るのが「下が最新なのか、上が最新なのか。」

TwitterやFacebookのようなサービスは最新が上にありますが、チャットや2chなどは最新が下だったりしますね。

メッセージ自体を配列に入れていく際に、pushで入れたりunshiftで追加したり投稿時間でオブジェクト配列をソートしたりやり方は様々ですが、下が最新のものは要素が追加されてもページは追いかけてくれません。

それを追いかけたい。

# 実装例

Facebookのflux-chatでも登場しているコードですが、今回は`_scrollToBottom関数`と名付けます。

Reactなどで書いている場合は、コンポーネントマウント時とアップデート時などに実行し、jQueryなどで書いている場合はテキスト投稿とそのページのonloadとかにこの関数を仕込んでおくといいと思います。

```html
<ul id="message-list">
  <li>テキスト</li>
  <li>テキスト</li>
  <li>テキスト</li>
  <li>テキスト</li>
</ul>
```

```js
var _scrollToBottom = () => {
  var ul = document.getElementById("message-list")
  ul.scrollTop = ul.scrollHeight
}
```


# あとがき

もしかしたら他の書き方もできるかもしれませんが、僕自身がいつもこう書くので今回は実装例として載せました。
ジェネリックプロトコル（Generic Protocol）入門 - associatedtype, typealias, Self - 

ジェネリックプロトコルについて、わかりやすさを意識して、まとめてみました。
`associatedtype`や`Self`ってなんか取っ付きにくいなーと感じている人向けです。

## What is Generic Protocol?
ジェネリックプロトコル（Generic Protocol）とは、ジェネリクスを使ったプロトコルです。[^1]
ClassやStructでは`<T>`などの型パラメーター（Type Parameter）を使う一方、Protocolでは`associatedtype`または`Self`を宣言します。
`associatedtype`や`Self`も型パラメーター同様、宣言された段階ではまだ抽象的な存在で、Protocolを採用するクラス宣言で初めて具体的な実装がなされます。[The Swift Programming Language](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Generics.html)では、型の__プレースホルダー__と表現されています。

## ジェネリックプロトコルの例
話をわかりやすくするために、Animal Protocolというジェネリックプロトコルを作ってみましょう。

```swift:Generic
protocol Animal {
    associatedtype FoodType // ※1
    func eat(food: FoodType) // ※2
    func makeFriend(friend: Self) // ※3
}
```

ここでAnimal Protocolが言っているのは、以下のとおりです。

* Animal Protocolを使いたければ、クラス宣言のときに、何かしらの型（Type）とFoodTypeを結びつけてね（※1）
* そうしたら、func eatのfoodは自動的にその型になるよ（※2）
* func makeFriendで友達になれるのは同じクラスだよ。またSwiftの言語仕様的にサブクラスもOKだよ（※3）

## 適合するクラスを実装

Animal Protocolに言われたとおり、Catクラスを実装してみます。[^2]

```swift
class Cat: Animal {
    typealias FoodType = Mouse
    func eat(food: FoodType) {
        print("yum")
    }
    
    func makeFriend(friend: Cat) {
        print("Got a new friend!")
    }
}
```
さて、`associatedtype`だった箇所に`typealias`が出てきましたね。`typealias`とは、その名の通り、__型の別名（エイリアス）__のことです。CatクラスではMouseを`FoodType`として別名指定しました。これでCatのFoodTypeといえばMouseとなり、ネコはfunc eatでネズミを食べられるようになりました:smiley_cat: 

## まとめ
* プロトコルをジェネリックに作るには`associatedtype`もしくは`Self`のどちらかを使う
* `associatedtype`で指定された抽象パラメーターを、クラス実装時に具体的な型で指定する。このとき、`typealias`を使う。別解↓のように`typealias`を使わない場合、抽象パラメーターがすでに割り当てられている箇所に具体的な型を入れる。
* `Self`には、適合するクラスあるいはサブクラスが自動的に割り当てられる。

### 別解
Animalプロトコルに適合したCatの例は以下でも可能です。

#### 1. FoodTypeプレースホルダーに具体的な型を指定する
```swift
class Cat: Animal {
    // 引数をMouseにする
    func eat(food: Mouse) {
        print("yum")
    }
    
    func makeFriend(friend: Cat) {
        print("Got a new friend!")
    }
}
```

#### 2. ジェネリクスの型パラメーターで型を指定する

```swift
// 型パラメーターで制約をつける
class AnyAnimal<FoodType> {
    func eat(food: FoodType) {
        print("yum")
    }

    func makeFriend(friend: AnyAnimal) {
        print("Got a new friend!")
    }
}

//...

let x = AnyAnimal<Mouse>()
```

---

[^1]: [The Swift Programming Language](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/index.html#//apple_ref/doc/uid/TP40014097-CH3-ID0)に、"Generic Protocol"という呼び名は出てきませんが、英語圏ではこの呼び名が一般的です。

[^2]: このときCatクラスはAnimal Protocolに__適合する__、__準拠する__と表現します。もしくはAnimal Protocolが__採用される__とも言います。前者は英語では"Cat Class conforms to Animal Protocol"、後者は"Animal Protocol is adpoted"です。
海外格安VPS「AlphaRacks」でのHandbrakeCLIのビルド(disable gtk x265)

```bash
sudo apt-get update
sudo apt-get -y install git subversion yasm build-essential autoconf libtool zlib1g-dev libbz2-dev libxml2-dev libogg-dev libtheora-dev libvorbis-dev libsamplerate-dev libfribidi-dev libfreetype6-dev libfontconfig1-dev libass-dev libjansson-dev libmp3lame-dev libx264-dev zip unzip tar gzip
cd /usr/src
sudo apt-get -y build-dep libx264-142
sudo apt-get -y source libx264-142
cd x264-0.142.2389+git956c8d8
sudo ./configure --enable-static --enable-shared --extra-cflags=-fno-aggressive-loop-optimizations
sudo make -j8
sudo cp libx264.so.142 /usr/lib/x86_64-linux-gnu/
git clone https://github.com/HandBrake/HandBrake.git hb
cd hb
./configure --disable-gtk --disable-x265
cd build
sudo make -j8
```
installerのパーティション分け

#多分ここが一番苦労している所
 * fedora もわかりづらい
 * openSUSE もわかりづらい
 * Debian もわかりづらい。。。
 * OSX/macOSのディスクユーティリティ、ひどくなった。。。

##パーティションフォーマットのところ

 * ext4だと「予約ブロック」で標準で5%の領域が奪われる。これは辛くない？今時rootだと使える領域があったほうがいいよ！というのは一体どんなシチュエーションなのか？　https://osdn.jp/magazine/03/10/14/0658216 
 * ext4でブロックサイズは一体幾つが良いのか
 * xfsだとbtrfsだと？
migrationファイルで利用できる主なメソッドまとめ

migration：名詞・移住
→Railsで、テーブルの作成・変更をするしくみ
migrationファイル（ex: 20160801xxxx_create_users.rb）ファイル先頭はタイムスタンプ値
→DBのスキーマ変更を記載

|メソッド|概要|
|:--|:--|
|create_table|テーブルの作成|
|change_table|テーブル定義の変更|
|add_column|新規カラムを追加|
|add_index|新規インデックスを追加|
|remove_column|既存のカラムを削除|
|remove_index|既存のインデックスを削除|
|rename_column(table_name,old,new)|既存のカラム名をoldからnewに変更|
|rename_index(table_name,old,new)|既存のインデックス名をoldからnewへ変更|
|rename_table(table_name,new)|既存のテーブル名をtable_nameからnewへ変更|
|execute(sql)|任意のSQL命令を実行|
クッキーとセッションの違い（PHP・Railsでの実装例含む）

#なぜクッキー・セッションが必要か
複数のウェブページの間で情報を維持するため。
HTTPはクライアントからの要求に対し、サーバーがレスポンスを返すのみ。
つまり、何度リクエストを送っても、サーバーは同一のクライアントから来たものだとは認識しない。
（これをステート（状態）レス（ない）という）
一方、ログイン機能を実装するためには、どのユーザーがログイン済みか、という情報（状態）をページを跨って持っている必要がある。
この状態をステートフルと言い、これを実現するために必要

#クッキー
クッキーとは、サーバー側がクライアント側に情報を記録する、簡易的なテキストファイルのこと

しくみ
![スクリーンショット 2016-08-08 2.32.58.png](https://qiita-image-store.s3.amazonaws.com/0/71417/58ad4f4d-63a9-4d12-bfde-db8e11bbdd8c.png)

#セッション
クッキーと同様にページ間で情報を維持する仕組み。
クライアントから送信されるセッションIDをキーに、アクセスしてきたユーザーを識別し、対応するセッション情報を取得する。

しくみ
先述のクッキーのしくみの④の後、サーバーにセッションIDをキーとして、セッション情報を保存する。
そして、そのセッション情報を元に、レスポンスを生成。
サーバーでセッションを管理する場合も、キー（セッションID）はクッキー経由でやり取りされる。

#PHPでのクッキー・セッション管理



#Railsでのクッキー・セッション管理



参考
[RubyonRailsアプリケーションプログラム](https://www.amazon.co.jp/Ruby-Rails-%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E5%B1%B1%E7%94%B0-%E7%A5%A5%E5%AF%9B/dp/4774164100)
azurewebsites.netにcookieがセットできない

# Public Suffix ListとAzure
## 今日の出来事
とあるweb appsがサブドメイン(abcdefg.example.com)、親Webサイトが主のドメイン(example.com)としたかった。
現状、本物のドメインは手元になかったので、hosts書き換えでとりあえず動かす。
web appsは本物のドメインを持っていないとドメイン名変更ができないので、親Webサイトのほうをhostsで設定。
web apps(abcdefg.azurewebsites.net)がサブドメインなら、親Webサイトのほうはazurewebsites.netとなるようにしたらよいなっと。
あれ、親WebサイトのCookieがうまくセットできないぞ。

## 問題
👆この設定では、親Webサイトに対するSet-Cookieで、"Domain=.azurewebsites.net"と書いてあると、cookieが設定が無視される。。

## 理由
Cookieも意外と難しいのねと思って、頑張ってプログラムとにらめっこしていても、分からず。
それなら、「azurewebsites.net cookie」でググったらstack overflowがヒットしました。

http://stackoverflow.com/questions/24310264/browser-ignores-cookie-if-domain-is-set
http://stackoverflow.com/questions/23024351/chrome34-ignores-cookies-with-domain-cloudapp-net/

public suffix listは知りませんでしたが、.jpとか.netとかにcookieセットできないことを、指し示すために一覧化しているようです。
https://publicsuffix.org/list/public_suffix_list.dat

cookieがセットできないもののうち、azureのドメイン名も含まれていました。
- azurewebsites.net
- cloudapp.net
- azure-mobile.net

なるほどね。。知らなかった。。

# 参考
## public suffix list
https://publicsuffix.org/
https://publicsuffix.org/list/ ← ExampleにCookie設定時の解説がある
Ubuntu 16.04.1 日本語入力有効化

Ubuntu 14.04 から Ubuntu 16.04.1 へアップグレードしたら日本語入力ができなくなって焦った。

#処方箋

1. 設定 > 言語サポート
2. 「言語サポートが完全にインストールされていません。インストールしますか?」と
プロンプトが出るので「インストール」を押す。
3. インストール完了後に再起動する。

あぁ......ビックリした......。
C# で Mixin もどき

以前 C# でゲームを作っていて、Mixin がないのは不便だなーと思っていたのですが、既存の構文でもそれっぽいことができたのでメモしておきます。

[こちらの記事](http://blog.studio-odyssey.net/2011/12/cmix-in.html)に載っているように、C# では拡張メソッドを使うことで、インターフェースに実装を持たせることが可能です。しかし、インターフェースはメンバー変数を持つことができないので、少し使い勝手が悪い感が残ります。

ところが、C# には**自動プロパティ**と呼ばれる機能があり、これを使えばインターフェースにメンバー変数（っぽいもの）を持たせることができるのです。

というわけで今回は、インターフェースに対して、拡張メソッドを使ってメソッドに実装を持たせ、自動プロパティを使ってメンバー変数もどきを持たせることで、Mixin っぽく使うやり方を書いていこうと思います。

---
### プロパティとフィールド

プロパティの自動生成について紹介するには、まず、C# においてプロパティと呼ばれるものが、具体的に何を指すのかを知る必要があります。

以下のコードを見てください。

```csharp
class Hoge
{
    private int _x;
    public int getX() {
        return _x;
    }
    public void setX(int value) {
        _x = value;
    }
}
```

これはアクセサと呼ばれるもので、フィールドの実装を隠蔽するのに用いられます。
C# では、アクセサは以下のように書くことができます。

```
class Hoge
{
    private int _x;
    public int X
    {
        get { return _x; }
        set { _x = value; }
    }
}
```

`_x` という変数に対して、大文字の `X` がアクセサの役割をしています。この記法を使えば、外部からアクセサの存在を意識せずに、`hoge.X = 100` のように書くことができます。

また、このときの `_x` を**フィールド**、大文字の `X` を**プロパティ**と呼び、区別します。


### 自動プロパティ

C# には「**自動プロパティ**」と呼ばれる機能があり、上のような単純なプロパティであれば、以下のように簡略化して書くことができます。

```
class Hoge
{
    public int X { get; set; }
}
```

こうすることで、内部的に先ほどの `_x` のような変数が定義され、使用されます。

今回はこの自動プロパティをつかって、アクセサであるプロパティ（関数）を定義したように見せかけて、フィールド（変数）を宣言してしまいます。

具体的なコードはこちら。

```csharp
public interface IDrawable
{
    float X { get; set; }
    float Y { get; set; }
    float W { get; set; }
    float H { get; set; }
    Image Image { get; set; }
}
```

これで一応、インターフェースにメンバー変数っぽいものを定義することができました。


### 拡張メソッド

次に、冒頭で紹介した記事に載っている拡張メソッドを使った方法で、`IDrawable` に `Draw()` というメソッドを追加します。

```csharp
public static class Extensions
{
    public static void Draw(this IDrawable self)
    {
        GraphicsContext.DrawImage(self.Image, self.X, self.Y, self.W, self.H);
    }
}
```

こうすることで、`IDrawable` なオブジェクトに対して `Draw()` というメソッドを定義することができます。（`GraphicsContext` は今回はグローバルに定義されていると考えてください。）

なお、拡張メソッドがやっているのは、単純に `IDrawable` なオブジェクトの参照を受け取ってプロパティにアクセスしているだけなので、`IDrawable` の実装は、後で出てくるコードのように public にする必要があります。


### 実際に使ってみる

これで Mixin もどきの実装はおわりです。
実際に使うときには、次のようにします。

```csharp
public class Enemy : IDrawable
{
    public float X { get; set; }
    public float Y { get; set; }
    public float W { get; set; }
    public float H { get; set; }
    public Image Image { get; set; }

    public Enemy()
    {
        this.Image = Image.FromFile(@"path\to\image");
    }
}
```

```csharp
class GameScene
{
    private List<IDrawable> _drawableObjects;

    public void Startup()
    {
        _drawableObjects = new List<IDrawable>();
        _drawableObjects.Add(new Enemy() { X = 100; Y = 100; W = 100; H = 100; });
    }

    public void Update()
    {
        foreach(var obj in _drawableObjects)
        {
            obj.Draw();
        }
    }
}
```

これだけだとあまりありがたみが湧きませんが、もう少し複雑な処理をするようになると、ちょっと便利な気がしてくるんじゃないでしょうか。

ただ、悲しいことに、メソッドのオーバーライドはできません。
トリックを使って mixin ぽくみせかけているだけで、実際はただの拡張メソッドなので仕方ないですね。

というわけで、C# で Mixin もどきでした。

おかしな点や補足などありましたら、ご指摘お待ちしております。
ルートキット検出ツール chkrootkit

# chkrootkit
http://www.chkrootkit.org/
Linux の著名なルートキット検出ツールで、同様のツールとして [Rootkit Hunter](http://qiita.com/bezeklik/items/bc7affef8afe7c63f2ce) がある。
最新版は 2016-10-30 リリースの **chkrootkit 0.51** になる。

# インストール
## パッケージ
### CentOS 7
```
yum install http://downloads.sourceforge.net/project/sys-integrity-mgmt-platform/yum/el/7/ext/x86_64/chkrootkit-0.50-4el7.x86_64.rpm
yum install net-tools
```
または

```
yum install http://pkgs.fedoraproject.org/repo/pkgs/chkrootkit/chkrootkit-0.50.tar.gz/9e67dd56f835264d43aeb04944610b03/chkrootkit-0.50.tar.gz
yum install net-tools
```
CentOS 7 の場合、デフォルトだと `netstat` コマンドがないため `chkrootkit: can't find 'netstat'.` と言われてしまうので、 `net-tools` パッケージをインストールする。

### CentOS 6
```
yum install epel-release
yum install chkrootkit
```
chkrootkit 0.49 がインストールされる。

# 実行
```
chkrootkit
```

# セキュリティ関連記事
* [PHPセキュリティ強化モジュール Suhosin](http://qiita.com/bezeklik/items/5e8b1f76465e39dc6cd0)
* [DoS攻撃/ブルートフォース攻撃対策アプリの近況](http://qiita.com/bezeklik/items/6d86a162e278f576e4ca)
* [Linuxアンチウイルスソフト ClamAV](http://qiita.com/bezeklik/items/4696e15c889ffff6bc41)
* [Linux Malware Detect](http://qiita.com/bezeklik/items/43a7d4fce6bc23fe84d3)
* [ルートキット検出ツール Rootkit Hunter (rkhunter)](http://qiita.com/bezeklik/items/bc7affef8afe7c63f2ce)
* [ルートキット検出ツール chkrootkit](http://qiita.com/bezeklik/items/7964ce67f1a1363b694e)
* [ファイル改ざん検知ツール AFICK](http://qiita.com/bezeklik/items/298dafd2aeb053b4ca88)
* [ファイル改ざん検知ツール AIDE](http://qiita.com/bezeklik/items/d144d77a3e54cd35c06b)
* [脆弱性スキャナー OpenVAS](http://qiita.com/bezeklik/items/a64cad37eb03a1db2de4)
* [Linuxセキュリティ監査ツール Lynis](http://qiita.com/bezeklik/items/cf9be2deb546c69123e7)
CoreAnimationとUIViewのアニメーションの違い


#UIViewアニメーション
UIView自体に内包された機能を使ってアニメーションを実装します。
UIViewをそのまま操作するのでCoreAnimationに比べ自由度は低いです。
CoreAnimationのプログラミングガイドでは従来型であるビューベースの描写という言葉で表現されています。


#CoreAnimation
ビューをビットマップ形式に変換し、ハードウェア側で処理することにより高速に描写することができます。
レイヤというものがビットマップの状態を管理します。

#レイヤとは
レイヤは、3次元空間内に置かれた2次元の面です。
ビューと同様に、ジオメトリ、コンテンツ、視覚属性などを管理しますが、独自の「外観」
を定義するものではありません。





#参考サイト
https://developer.apple.com/jp/documentation/CoreAnimation_guide.pdf
https://developer.apple.com/jp/documentation/ViewPG_iPhoneOS.pdf
EFIシステムパーティションという謎の領域を駆逐する


EFIシステムパーティションという領域はなぜかディスク管理ほげほげからじゃバリアが張られていて突破できない！！
なので人類はコマンドプロンプトを駆使し駆逐作戦を行うのであった。

何故か進撃の巨人の冒頭みたいなはじめ方をしてしまった。

## コマンドプロンプト起動

1. コマンドプロンプトを管理者権限で起動。
1. `diskpart` と入力する。
1. `list disk` と入力するとWindowsで認識されているディスクリストが表示される
1. `select disk ○` と入力する。○はディスク番号
1. `list partition` と入力されると選択したディスクのパーティションリストが表示される
1. `select partition ○` と入力する。○はパーティション番号
1. `delete partition override` と入力する。

以上、こんな感じで駆逐が完了します。
テキスト入力でUMLをライブプレビューしてくれるツール（plantuml-viewer:Atomプラグイン）

複雑なコードを解析するときなど、UMLが簡単に書けるツールがほしかったところ、良いツールがあったので導入してみました。
Mac OS X El Capitan‎に導入する場合にplantuml-viewerが表示されないなど、少しハマったのでメモを残します。

#ツール
Atom（テキストエディタ） + PlantUML（プラグイン）
※Macの場合、上記を利用するために「Java実行環境(JRE)」「Homebrew」「Graphviz」が必要

![PlantUML](https://i.github-camo.com/bb28497b36c99c618a38f3eb114420c699a87833/68747470733a2f2f646c2e64726f70626f7875736572636f6e74656e742e636f6d2f752f31303830393339302f706c616e74756d6c2d7669657765722e676966)

#導入経緯
 - ExcelでUMLを書くのが煩わしい
 - 本格的なツールを導入するほどでもない
 - テキストのメモを残す感覚で作成したい
 - SVNでバージョン管理したい

#手順
###Atomのインストール（テキストエディタ）
下記サイトよりインストール
https://atom.io/

###JREのインストール（Java実行環境）
下記サイトよりインストール
http://java.com/ja/

###Homebrewのインストール（Macのパッケージ管理ソフト）
####＜環境変数の設定＞
```
$ vi ~/.bash_profile
export PATH=/usr/local:$PATH

# 即時反映
$ source ~/.bash_profile
```

####＜インストール＞
```
#インストールコマンド
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

#確認
$ brew -v
Homebrew 0.9.9 (git revision b8ce; last commit 2016-08-06)
```


###Graphvizのインストール
Graphvizはdot言語で記述されたプレーンテキストを画像ファイルのフォーマットへ出力するツール

```
#インストールコマンド
$ brew install graphviz

#テスト
$ vi Sample.dot
graph g{
"地球" -- "海" -- "九十九里";
}

#pdfファイルへ出力
$ dot -T pdf Sample.dot -o Sample.out.pdf
```
Sample.out.pdfを開くと「地球」「海」「九十九里」と書かれた図が出力されているのが確認できます

###PlantUMLのインストール
メニューバー -> Package -> Settings View -> Install Packages/Themes
Search packages -> plantumlと入力

####＜パッケージのインストール＞
下記をインストール（2つ目は任意）

 - plantuml-viewer
 - language-plantuml

####＜plantuml-viewerの設定＞
メニューバー -> Package -> Settings View -> Manage Packages -> plantuml-viewer
Graphviz Dot Executableに下記実行ファイルのパスを指定
`/usr/local/Cellar/graphviz/2.38.0/bin/dot`

#実行
Package -> plantuml-viewer -> Toggle
選択後、左側のタブにテキストをを入力するとライブプレビューでUMLが描画されます
Androidの場合のサンプル

```sampleAcvity.pu
@startuml{plantuml_seq_sample.png}
title SampleActivityシーケンス図
hide footbox

actor ユーザー as user
participant SampleActivity as sampleActivity <<Contoroller>>
participant "<u>ApiRequest</u>" as model <<Model>>
participant DB as db <<Store>> #98AAAA
participant Sample.xml as xml <<View>> #98FB98

user -> sampleActivity : 表示
activate sampleActivity

'View初期化
sampleActivity -> xml : 初期化
activate xml

'APIリクエスト生成
create model
sampleActivity -> model : <<new>>
activate model

'APIリクエスト
sampleActivity -> model : データ取得
activate model
model ->> db : 非同期データ検索
|||
model <<- db : 非同期データ返却

'API結果返却
sampleActivity <-- model : 取得結果
note right : ヒットしたものをリストで返却
deactivate model
deactivate model
destroy model

'表示処理
sampleActivity -> xml : 表示(結果を設定)
deactivate sampleActivity

'データセット
loop 1, データ数
  xml -> xml : データセット
end
xml --> user
deactivate xml

@enduml
```


<img width="915" alt="スクリーンショット 2016-08-08 0.37.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/136142/df7e1ba4-dc8c-c263-be1b-37f1994bd4dc.png">

#参考サイト
＜環境変数の設定＞
http://qiita.com/soarflat/items/d5015bec37f8a8254380
＜Homebrewのインストール＞
http://qiita.com/is0me/items/475fdbc4d770534f9ef1
＜Graphvizのインストール＞
http://qiita.com/yasuto777/items/c1c4e583f393b27ebb7a
＜PlantUMLのインストール＞
http://pierre3.hatenablog.com/entry/2015/08/23/220217
＜PlantUML詳しい使い方＞
http://yohshiy.blog.fc2.com/blog-entry-153.html#seq_notes
"sudo: /etc/sudoers.d/00_wheel is mode 0644, should be 0440\r\n\r\nfujitora is not in the sudoers file."エラー

ansibleを実行したら

```
FAILED! => {"changed": false, "failed": true, "module_stderr": "", "module_stdout": "sudo: /etc/sudoers.d/00_wheel is mode 0644, should be 0440\r\n\r\nsampleuser is not in the sudoers file.  This incident will be reported.\r\n", "msg": "MODULE FAILURE", "parsed": false}
```

とエラーが出た。

sshでサーバーに入ってsudoコマンド実行しても

```
sudo: /etc/sudoers.d/00_wheel is mode 0644, should be 0440
```
とでた。

##解決方法

```
chmod 0440 /etc/sudoers.d/00_wheel
```

いままで出なかったのに急にでるようになったのはなぜなのか、、、

##参考サイト

- [How to repair “sudo: /etc/sudoers is mode 0640, should be 0440?”](http://askubuntu.com/questions/189818/how-to-repair-sudo-etc-sudoers-is-mode-0640-should-be-0440)
fileを使って画像を表示させる方法


```activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <WebView
        android:id="@+id/upperview"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>
    <WebView
        android:id="@+id/lowerview"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>
</LinearLayout>
```



```MainActivity.java
package com.example.urano_joji.test1;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        WebView upperView = (WebView)findViewById(R.id.upperview);
        upperView.loadUrl("file:///android_asset/android.jpg");
    }
}
```

これを追加

```build.gradle

android {
    sourceSets{
        main{
            assets.srcDirs = ['htmlSource']
        }
    }
}
```

appの下にhtmlSourceというディレクトリを追加

![スクリーンショット 2016-08-07 23.17.43.png](https://qiita-image-store.s3.amazonaws.com/0/39073/e685c8f8-e7ef-8a0f-6151-0aeb8b7068b7.png "スクリーンショット 2016-08-07 23.17.43.png")
iTerm2 がリガチャ（合字）に対応しました

まだ Nightly Build のみの対応ですけどね。スゴイですよこれは！ なんと言ったって、**Vim でもリガチャが使えるんです！！！**

まあ、今までも gvim では使えたんですけどね。しかし、`less` だろうが `cat` だろうが、全てのコンソールアプリでこれが有効になるのは嬉しいです。

何はともあれ、例を見てみましょう。以下のスクリーンショットはリガチャ界のデファクトスタンダード（？）[FiraCode][] を利用しています。

```
Fira Code
.= .- := =:=
=== !== == !=
<!-- --> <->
<== ==> <<= =>>
= << >>= <= >=
!! ?? && || []

```

これが、

<img width="312" alt="スクリーンショット 2016-08-06 15.29.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/8880/80e9f8a2-8fff-f386-c42b-c7bd74a815bd.png">

こうなります。

[FiraCode]: https://github.com/tonsky/FiraCode

ちょっとこれやり過ぎだなー、という向きには [Iosevka][] もオススメです。こちらは作者が中国人のようで、中国語・日本語対応版である [Inziu Iosevka][] という姉妹版も作っています。僕はこれ使ってます。

[Iosevka]: https://be5invis.github.io/Iosevka/
[Inziu Iosevka]: https://be5invis.github.io/Iosevka/inziu.html

<img width="338" alt="スクリーンショット 2016-08-06 15.28.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/8880/ee80b213-91f7-cf02-a292-e1f229c7af16.png">

まだまだ発展途上ですが、v3.1 に向けて鋭意開発中のようです。うまく表示されないフォントがあったら [bug tracker][] からどんどん報告しましょう！

[bug tracker]: https://iterm2.com/bugs/
BEMのmodifierのきれいな書き方

日本で一番Qiitaが好き！tattです。
日々、ワンチャン狙いながらホームページ手作りおじさんやってます！

さっそくですが、「BEMの一番きれいな書き方 -2016 summer-」、tatt開催しまーす！！！

# これまでのBEM
これまで最適解が出ず（ググり方が悪かった）、BEM用のmixinを作り、さらにplaceholder selectorを作って@extendさせてました。 
今思えば、正気の沙汰とは思えません。 
(ちなみにscssよりsass派、ElementごとにModifier作りたい派、トランクスよりボクサーパンツ派、茶髪より黒髪派です)


```_bem.sass
// Element用のミックスイン(__でつなぐ)
=e($name)
  @at-root #{&}__#{$name}
    @content

// Modifier用のミックスイン(--でつなぐ)
=m($name)
  @at-root #{&}--#{$name}
    @content
```
```sample.sass
@import "bem"

%sampleElement
  font-size: 10px
  line-height: 1
  color: black

.sample
  // .sampleブロックのスタイル

  +e(element)
    // .sample__elementのスタイル
    @extend %sampleElement

    +m(red)
      // .sample__element--redのスタイル
      @extend %sampleElement
      color: red
    +m(blue)
      // .sample__element--blueのスタイル
      @extend %sampleElement
      color: blue
```

コンパイル後、

```sample.css
.sample__element, .sample__element--red {
  font-size: 10px;
  line-height: 1;
  color: black;
}
.sample__element--red {
  color: red;
}
.sample__element--blue {
  color: blue;
}

```


一時期はこれで良しとしてました。 
一応、Elementのスタイルを一元管理できているので。
ただ、こんなコードを書いてたのではワンチャン狙うどころか、LINEの交換さえ危ういですね。
もしも、LINE交換できても`既読スルー→(5日後に)ごめん、寝てた`:cry:の流れです。

# これからのBEM

まずBEM用のmixinは必要ありません(※sass 3.3.0.rc.3以降) 
以前のver.でもありましたが、擬似クラス、擬似要素、セレクタの連結などに使用していた`&`を、親のクラス名を子のクラス名の一部にすることがインターポレーション(#{})なしで可能になっているのです。
これを用いてスマートなLINEの交換方ほ…　いえ、BEMを書くことができます。  

```sample.sass
.sample
  // .sampleブロックのスタイル

  &__element
    // &を変数に格納
    $this: &
    // .sample__elementのスタイル
    font-size: 10px
    line-height: 1
    color: black

    &--red
      // .sample__element--redのスタイル
      @extend #{$this}
      color: red
    &--blue
      // .sample__element--blueのスタイル
      @extend #{$this}
      color: blue

```
コンパイル後、

```sample.css
.sample2__element, .sample2__element--red {
  font-size: 10px;
  line-height: 1;
  color: black;
}
.sample2__element--red {
  color: red;
}
.sample2__element--blue {
  color: blue;
}
```
スマートすぎるー！たぎるー:joy:！！ 
`&`がブロックスコープなので各Elementで`$this: &`できます。

```sample.sass
.sample
  // .sampleブロックのスタイル

  &__element
    // &を変数に格納
    $this: &
    // .sample__elementのスタイル
    font-size: 10px
    line-height: 1
    color: black

    &--red
      // .sample__element--redのスタイル
      @extend #{$this}
      color: red

  &__element2
    // &を変数に格納
    $this: &
    // .sample__elementのスタイル
    font-size: 20px
    line-height: 1
    color: black

    &--red
      // .sample__element2--redのスタイル
      @extend #{$this}
      color: red


```
  

よかったら、「BEMの一番きれいな書き方 -2016 summer-」で皆様もワンチャン狙ってください！


# THANX & BIG UP‼︎‼︎

* [BEMでmodifierを作る時に便利な&の変数化パターン](http://qiita.com/y_hokkey/items/70eb2bc1394d74989359)  
* [sass 3.3.0.rc.3 から、インターポレーションなしで、「&」を含んだセレクタが作れる！！！！](https://torounit.com/blog/2014/02/15/1733/)
* [Sass 3.3で追加された「&」の新機能と@at-rootまとめ解説](https://html5experts.jp/kosei27/3297/)
ufwの基本操作


Ubuntuを触るようになったので自分ようにufwの備忘録を作りました。


個人で隔離された環境で好き放題お試しする分には
別に意識せずに systemctl disable ufw してしまって構わないませんが、
外向けに見せるものについてはきちんと設定しましょうということで設定します。


# 前提条件
毎回毎回 sudo, sudoいうのもアホらしいので、
rootで作業します。

```Bash:前提
sudo su -
```

# 初期状態の確認

```Bash:初期状態の確認
sudo su -
root@ubuntu-001:~# systemctl status ufw
● ufw.service - Uncomplicated firewall
   Loaded: loaded (/lib/systemd/system/ufw.service; enabled; vendor preset: enab
   Active: active (exited) since 日 2016-08-07 19:33:49 JST; 33min ago
  Process: 12007 ExecStart=/lib/ufw/ufw-init start quiet (code=exited, status=0/
 Main PID: 12007 (code=exited, status=0/SUCCESS)

 8月 07 19:33:49 ubuntu-001 systemd[1]: Starting Uncomplicated firewall...
 8月 07 19:33:49 ubuntu-001 systemd[1]: Started Uncomplicated firewall.
 8月 07 20:05:25 ubuntu-001 systemd[1]: Started Uncomplicated firewall.
```

起動はしています。

```Bash:ufwの状態確認
ufw status
状態: 非アクティブ
```

起動はしていますが特に通信の制御などは行っていない様子。
いきなり有効化するとsshの接続を切断されるので、
ひとまずはdry-runで有効化を試行してみます。

# ufwの有効化

```Bash:ufwの有効化
ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
ファイアウォールはアクティブかつシステムの起動時に有効化されます。
```

少なくとも私が試した範囲では有効化しても
すでに接続している通信が切断されるなどの影響は出ませんでした。

**ufwを有効化したりする前などから成立している通信は遮断しないように見えます。**

```Bash:ufw有効化後の初期状態
ufw status verbose
状態: アクティブ
ロギング: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
新しいプロファイル: skip
```

ufwを有効化した初期状態でsshの接続を切断すると再接続できなくなるので要注意。

```Bash:ufwの無効化
ufw disable
ファイアウォールを無効にし、システム起動時にも無効にします
```

# デフォルトのincomingポリシー

条件に合致しない通信を通過させるか、遮断するかのデフォルト設定を適用します。

**実はデフォルトでincomingポリシーはdenyなのでここは不要だったりします...**

```Bash:ufwのデフォルトポリシー設定
ufw default deny
デフォルトの incoming ポリシーは 'deny' に変更しました
(適用したい内容に基づいて必ずルールを更新してください)
```

ファイアウォールの設定を下記のいずれにするかで
denyかallowかが変わる(rejectもあるがここでは割愛)

|方式|内容|選択するポリシー|
|---|---|---|
|ホワイトリスト方式|特定の通信のみ受信を **許可** する|deny|
|ブラックリスト方式|特定の通信のみ受信を **遮断** する|allow|

通常は **ホワイトリスト方式** を選択します。
サーバ上で **動作しているサービスのポートのみを公開** するのが原則です。


## さらに条件詳細化

ここで疑問となるのが、**sshの通信はどこからでも受け付けるのか** ということ

![Kobito.iJ7WMw.png](https://qiita-image-store.s3.amazonaws.com/0/40692/2dd32df8-21d4-b778-381a-ff05cda921fe.png "Kobito.iJ7WMw.png")

ごくごく小規模のネットワークなので、今回は同一セグメント以外からの通信は許容したくはないので通信元を絞ります。
(どこの馬の骨とも知らないネットワークからsshされても嫌なので)

```Bash:既存のルールを削除する
ufw delete 1
削除:
 allow 22
操作を続けますか (y|n)? y
ルールを削除しました
```

```Bash:ステータスを確認
ufw status
状態: アクティブ
```

この時点でTCP 22番への新規接続ができなくなっている。
この状態でログアウトするとsshでの接続ができなくなるので要注意です。

```Bash:TCP22番の通信の通信元を制限する
ufw allow from 192.168.1.0/24 to any port 22
ルールを追加しました
```

同一ネットワーク内からのみの通信を許可しました。
で、念のためにufwを再読み込みさせます。

```Bash:ufw再読み込み
ufw reload
ファイアウォールを再読込しました
```

# まとめ

ufwの基本操作として以下の内容を整理しmashita.


|コマンド|意味|備考|
|---|---|---|
|ufw enable|ufwを有効化|ルールが設定されない限り新規接続ができなくなるので要注意|
|ufw disable|ufwを無効化||
|ufw status|ufwの状態とルールを表示||
|ufw status verbose|ufwの状態とルールを表示|各種デフォルトポリシーも表示される|
|ufw delete 番号|ルールを削除する|ルールの番号は ufw status numberedで確認できる|
|ufw allow from ネットワークアドレス to ホストアドレス(or any) port ポート番号 |fromで指定したアドレスからtoで指定したアドレスかつポートへの通信を受信する|ネットワークアドレスは192.168.1.0/24などの形で指定|
OpenStackでインスタンス起動にはまりまくった

はじめての投稿です。

openstackでやっとインスタンス起動までたどり着いたのではまった箇所の自分用メモ

#マシンスペック問題
家でホコリかぶってた<a link="http://kakaku.com/item/K0000081071/spec/">富士通PC</a>にopenstackインストールしようとしました。
スペックは
CPU:2コア,i3 
メモリ:4G

openstackの<a link="http://docs.openstack.org/liberty/ja/install-guide-rdo/environment.html">推奨スペック</a>(メモリ2G,CPU:1コア)は満たしているから
まぁ動くだろうと思ってました。

インストールすらできません。

<a link="https://github.com/ytooyama/packstack-howto/blob/master/Packstack2-QuickStart-installations.md">ここ</a>を参考に
openstack mitakaをpackstackでインストールしようとしましたが
インストール途中で止まります。
ググったらマシンスペックの問題らしい

mitakaでのインストールは諦めて,kiloのインストールをやってみました。
openstack kiloでanswerファイルいじって必要最小限の構成に変えたらやっとこさインストールできました。

**結局別PCへインストール**
horizonが重すぎて、まともに使えたものではなかったので
別PC(CPU:i5,メモリ8G)でmitakaをインストールしなおしました。
前述のインストール失敗はやはりマシンスペックの問題だったらしく
このPCだと問題なくインストールできました。


#httpdの問題
インストール完了し、horizonにアクセスできることを確認し
翌日再起動をかけるとアクセスできなくなってる

neutronとかのlogとかいろいろ見ました、問題はhttpdが落ちていたこと
```systemctl restart httpd```
してあげると動きました

#kvmの問題
一番はまったやつです
インストール完了し、イメージ作成や、オブジェクトストレージ等は使えるのにインスタンス起動だけできない
インスタンス生成するも
``` "No valid host was found. There are not enough hosts available."```
とかいうエラーが出て起動ができません

ググったらインスタンスに割り当てるフレーバー容量がでかすぎるとのこと
しかしイメージ:cirrosでフレーバー:m1.tinyでも起動ができない

さらにググるとこのような<a link="https://www.fir3net.com/Miscellaneous/Cloud/openstack-novalidhost-no-valid-host-was-found.html">ページ</a>が
仮想化の手法がkvmだから失敗している？
このページの通り 
```/etc/nova/nova.conf
virt_type=qemu
```
virt_typeをqemuに変更し
systemctl restart openstack-nova*でnovaサービス再起動かけると
インスタンス起動できるようになりました



#とりあえず
とりあえずインスタンスの起動ができるようになったのでまとめ的に
今はフローティングIPの割り当てがうまくいかないのでもう少しググってみる
openSUSEのインストーラー

#起動時に言語選択してないのに日本語表示が出てる？
![VirtualBox_openSUSE_07_08_2016_23_32_22.png](https://qiita-image-store.s3.amazonaws.com/0/33063/7c81c452-bb5c-4c85-784b-5c68771e2533.png)
ここでは特に言語選択をしては居ない。
![VirtualBox_openSUSE_07_08_2016_23_32_35.png](https://qiita-image-store.s3.amazonaws.com/0/33063/67d50f43-8eca-8a09-705c-ee82834193ef.png)
何故か日本語表示が出てる？
![VirtualBox_openSUSE_07_08_2016_23_32_41.png](https://qiita-image-store.s3.amazonaws.com/0/33063/6faccc9f-599d-267c-d7c5-20d4d06e5005.png)
ここもだ。

#パスワードの強弱チェックあり
PAMなのかな？これは良い。
![VirtualBox_openSUSE_07_08_2016_23_49_22.png](https://qiita-image-store.s3.amazonaws.com/0/33063/410b8916-c49e-ded3-2531-a5bdbe0d88ef.png)

#ディスクパーティションはわかりづらい
ディスク少ないのに/homeが分かれてるのはちょっとねぇ。Btrfsの場合の表示がBtrfs特有の表記なのかな？
anaconda-installerはgeoipを使う

#Fedoraのインストーラー、いいねー
Fedora24をインストールしなおして、やっぱりインストーラー起動時に日本語表示を自動選択してくれるのがありがたいなーと思った。確か昔にGeoIPを使っているというのを読んだ気がするので、適当に検索してsourceをとってくることに

```git clone https://github.com/rhinstaller/anaconda.git```

いやぁ、ほんといい時代だ。あとは grep geoip -r などとしたら./pyanaconda/geoloc.pyがそれらしい。

RHEL7のマニュアルにもブートオプションでの記述がある
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Installation_Guide/chap-anaconda-boot-options.html

##GeoIPサーバーは自前で運営しないと問題があるか
Fedoraは自前のサーバーを用意している。RHELもそのまんま使ってるけどいいのかな...

##GeoIPを使うことによるデメリットはなんだろう？
GeoIPが不正確なことで、初期表示が全く違う言語になってしまうことになるのかな。誰かと議論したのだけど、誰と話したのか、どんな問題があるのかを提示されたかを思い出せない...。
Jupyterのショートカットキー一覧を調べてみた

Jupyter歴３ヶ月になりますが、ショートカットキーを全く覚えていないので、作業がめちゃくちゃ遅いです。
これを解消するために、ショートカットキー覚えたい！

#「h」ボタンで一覧見る
コマンドモードで「h」を押すと、ショートカットキー一覧が出ます。
この一覧を一通り試してみる。
![ショートカットキー一覧](https://qiita-image-store.s3.amazonaws.com/0/128193/62b1d8c3-811c-3c4d-ab03-94b137206ff2.png)


##Macのコマンド
Mac のコマンドは下記のように省略して表します。

| 記号       | コマンド |
|:-----------------|-----------------|
|⌘  |  Command|
|⌃  |  Control|
|⌥  |  Option|
|⇧  |  Shift|
|↩  |  Return|
|␣  |  Space|
|⇥  |  Tab|

##コマンドモード一覧（Escボタン押したときのモード）

| コマンド       | 説明 |
|:-----------------|-----------------:|
|F  |  検索と置換|
|↩  |  編集モードに入る|
|⌘⇧P  |  コマンドパレットを開く|
|⇧↩  |  セル実行して、下のセルを選択|
|⌃↩  |  選択したセル実行|
|⌥↩  |  セル実行して、下に新規セル挿入|
|Y  |  コードモードに|
|M  |  マークダウンモードに|
|R  |  raw（テキスト）モードに|
|1  |  「見出し１（大見出し）」で書き出す|
|2  |  「見出し２（中見出し）」で書き出す|
|3  |  「見出し３」で書き出す|
|4  |  「見出し４」で書き出す|
|5  |  「見出し５」で書き出す|
|6  |  「見出し６」で書き出す|
|K  |  上のセルに移動|
|↑  |  上のセルに移動|
|↓  |  下のセルに移動|
|J  |  下のセルに移動|
|⇧K  |  上のセルを複数選択|
|⇧↑  |  上のセルを複数選択|
|⇧↓  |  下のセルを複数選択|
|⇧J  |  下のセルを複数選択|
|A  |  セルを上に挿入|
|B  |  セルを下に挿入|
|X  |  セルを切り取り|
|C  |  セルをコピー|
|⇧V  |  セルを上に挿入してペースト|
|V  |  セルを下に挿入してペースト|
|Z  |  削除したセルを戻す|
|D,D  |  選択したセルを削除|
|⇧M  |  セルを統合|
|⌘S  |  保存とチェックポイント|
|S  |  保存とチェックポイント|
|L  |  セルの中の行番号を表示|
|O  |  選択セルの実行結果を表示|
|⇧O  |  選択セルの実行結果をスクロール表示|
|H  |  ショートカットキーを表示|
|I,I  |  カーネルを中断|
|0,0  |  カーネルをリスタート|
|Esc（不明）  |  close the pager|
|Q （不明） |  close the pager|
|⇧␣  |  上にスクロール|
|␣  |  下にスクロール|
※試したけど、挙動がいまいちわからないものは、「不明」としています。


##編集モード一覧 (Enterを押したときのモード)

| 記号       | コマンド |
|:-----------------|-----------------:|
|⇥  |  コード自動補完、インデント|
|⇧⇥  |  ツールチップ（tooltip）|
|⌘]  |  インデント|
|⌘[  |  インデント消す（dedent）|
|⌘A  |  全選択|
|⌘Z  |  元に戻す（undo）|
|⌘⇧Z  |  やり直す（redo）|
|⌘Y  |  やり直す（redo）|
|⌘↑  |  セルの最初に移動|
|⌘↓  |  セルの最後に移動|
|⌥←  |  １単語左に移動|
|⌥→  |  １単語右に移動|
|⌥⌫  |  前の単語を消す|
|⌥⌦  |  後の単語を消す|
|⌃M  |  コマンドモード|
|Esc  |  コマンドモード|
|⌘⇧P  |  コマンドパレットを開く|
|⇧↩  |  セル実行して、下のセルを選択|
|⌃↩  |  選択したセルを実行|
|⌥↩  |  セル実行して、下にセルを挿入|
|⌃⇧-  |  セルを分割|
|⌃⇧Subtract（不明） |  セルを分割|
|⌘S  |  保存とチェックポイント|
|↓  |  カーソルを下に移動|
|↑  |  カーソルを上に移動|
※試したけど、挙動がいまいちわからないものは、「不明」としています。

#オススメ
自分的に使うもの。
##お勧めコマンドモード
| コマンド       | 説明 |　コメント|
|:-----------------:|:--------:|-----------:|
|⇧↩  |  セル実行して、下のセルを選択|　実行時に必要
|Y  |  コードモードに|　なぜYなんだろう覚えにくい
|M  |  マークダウンモードに|　マークダウンのM
|A  |  セルを上に挿入|　セル追加が簡単
|B  |  セルを下に挿入|　セル追加が簡単
|D,D  |  選択したセルを削除|　Dのみじゃダメなんですね
|0,0  |  カーネルをリスタート|　これは欲しかった！

##お勧め編集モード
| コマンド       | 説明 |　コメント|
|:-----------------:|:--------:|-----------:|
|⇥  |  コード自動補完、インデント|メソッド名調べることできる
|⇧⇥  |  ツールチップ（tooltip）|オブジェクトの詳細知ることができる
|⌘]  |  インデント|
|⌘[  |  インデント消す（dedent）|地味に便利。for文やめたいときとかインデント消す
|⌃M  |  コマンドモード|Escボタン遠いので、主にこちらを使っていく
|Esc  |  コマンドモード|
|⇧↩  |  セル実行して、下のセルを選択|
インフラ初心者に勧める「Amazon Web Services 基礎からのネットワーク&サーバー構築」

はじめに
------

最近、インフラを学ぼうと思いまして、弊社はAWSを使っている事もあり、まずは手始めに「Amazon Web Services 基礎からのネットワーク&サーバー構築」を読んでみました、とっかかりとしてすごい良かったので、感想を踏まえて紹介したいと思います。

![基礎からのネットワーク.jpg](https://qiita-image-store.s3.amazonaws.com/0/93763/c048ea93-8749-46e6-0cfa-20d527908c6e.jpeg)


INDEX
>CHAPTER 1 システム構築をインフラから始めるには
>CHAPTER 2 ネットワークを構築する
>CHAPTER 3 サーバーを構築する
>CHAPTER 4 Webサーバーソフトをインストールする
>CHAPTER 5 HTTPの動きを確認する
>CHAPTER 6 プライベートサブネットを構築する
>CHAPTER 7 NATサーバーを構築する
>CHAPTER 8 DBを用いたブログシステムの構築
>CHAPTER 9 TCP/IPによる通信の仕組みを理解する
>Appendix A パケットキャプチャで通信をのぞいてみる
>Appendix B ネットワークの管理・運用とトラブルシューティング
```

どんな人にオススメ?
-
* <b>AWSは知っていてAWSコンソールは見た事あるけど、実際にシステム構築をした事がないよって人にオススメ</b>
    * この本で実際にインスタンスを立てる事で、体感的にアーキテクチャの基礎を学ぶ事ができます。
今まで、インフラのアークテクチャ図を見た時にVPCやサブネットやCIDRやインターネットゲートウェイ、セキュリティグループなど、よくわかっていなかったのですが、この本で学ぶ事で基礎知識を得る事ができました。

    * この本はAWSコンソールの使い方をレクチャーしながら、基礎システムを構築する事ができるのですが、説明に出てくるコンソールが多少古かったりするので、先に[qwiklab](https://run.qwiklab.com/)で、インスタンスの構築の手順等を学んでおくと理解しやすいかと思います。
* <b>今更聞けないようなインフラ基礎知識を知りたい人にオススメ</b>
    * 上記でも上げましたが、下記のように基礎知識だけど普段はあまり意識する機会の無い様な部分を知るには良い本だと思います。
        * TCP/IP
        * HTTP
        * VPC
        * サブネット
        * セキュリティグループ
        * CIDR
        * DNS
* <b> WordPressでブログを公開したい人にオススメ</b>
    * この本は最終的にWordPressでブログが公開できるまでの環境を構築します。
    * ですので、WordPressを公開したいけど環境準備がよくわからないと言う人にもオススメです。


誤表記について
-
１年以上前の記事になりますが、[クラスメソッドさんの記事](http://dev.classmethod.jp/etc/aws-book-review-140829/)で誤表記についてまとめてくれていましたが、最新版の書籍ではちゃんと修正されていました。

内容量
-
普段読破する事がめったに無い自分でも2日くらいで読み終わりました。
本に慣れている人は1日程度で読める量だと思います。
内容は丁寧かつ要点を簡潔に解説されていて、スラスラ読める印象です。


総合的な感想
-
正直、期待以上の内容でした。
<b>ブログが動くまでの環境を構築する</b>までの手順の全てが含まれているので、自分がこれから何を作り、どの部分を作るのか等の全体像を意識しやすく、そのおかげで順序良く学べます。
また、TCP/IP等も要点が抑えられていて、基礎知識としてはすごく学びやすいと思います。
APEENDIXではパケットキャプチャをのぞいてみる事もできるので、よりいっそう分かりやすいかと思います。

やはり、これからAWSでインフラを学ぶ人にはかなりオススメです。
この本では色んな知識の最低限の知識を得られる(概要を学べる)本だと考えることにして、
ここで得たインフラ知識を元にして、より知識を深めていくような勉強をすると良いかと思います。

普段インフラを触らないアプリエンジニアもこの本だけでも抑えておくと良いかもしれません。
読破まで時間もかからないし、<b>AWSも無料枠で簡潔</b>する内容なので安心して学べます。
是非、一読してみてはいかがでしょうか。
在 iOS 初始化視窗 - Swift 3 調整記


## 引言

這週開始準備遷移到 Swift 3 的開發環境。週末就來嘗試一下「這些東西在 Swift 3 要怎麼寫」。

目前有發現比較大的差別是

- Foundation Framework 的 `NS` 基本上都被摘掉了
- GCD 的寫法有改變
- 許多原生 SDK 的 singleton 要透過方法才能取用，更新之後變成只需要用成員變數的方式取得即可。也就是後面不用再加上 `()` ，有的名稱也比較簡潔。

這篇則是要筆記，在 App Delegate 裡面要怎麼初始化自己的 UIWindow ，並初始化自己的 view controller 並顯示出來。

## 原本的寫法

首先， `MyViewController` 是一個繼承 `UIViewController` 的一個子類別，可以任意換成自己需要的初始畫面。

``` swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        
    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

    // 如果你的 view controller 是"不需要"透過 nib 來初始化，可以用這行
    // self.window?.rootViewController = MyViewController()

    // 如果你的 view controller 是要透過 nib 來初始化，就是這行
    self.window?.rootViewController = MyViewController(nibName: "MyViewController", bundle: nil)
        
    self.window?.makeKeyAndVisible()
        
    return true
}
```

## 在 iOS 10 SDK 之後的寫法

變化其實沒有很大，如下：

``` swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        
    self.window = UIWindow(frame: UIScreen.main.bounds)

    // 如果你的 view controller 是"不需要"透過 nib 來初始化，可以用這行
    // self.window?.rootViewController = MyViewController()

    // 如果你的 view controller 是要透過 nib 來初始化，就是這行
    self.window?.rootViewController = MyViewController(nibName: "MyViewController", bundle: nil)
        
    self.window?.makeKeyAndVisible()
        
    return true
}
```

在這幾行程式碼裡面，有變動的基本上就只有取用 "mainScreen()" 這段而已，從原本的：

``` swift
UIScreen.mainScreen()
```

換成這樣

``` swift
UIScreen.main
```

## 想法和小結

其實剛換到 Swift 開發的時候，一開始有在發牢騷：為什麼 singleton 的變數必須要用 method 去取用？

每一個 singleton 後面都要掛上 `()` 其實也覺得有點多餘，現在終於可以拿掉了！
而且在根據使用情境在更加簡化了變數命名，也少了一些重複的贅字，覺得這是個好的方向。

以上，繼續再來去看有被換掉什麼東西 :smile: