OmniAICreator/Qiita-1.07M huggingface dataset:
Flask+websoket+Epochを使ってリアルタイムチャート

javascriptの勉強をかねて、webサーバから逐次データを流して、ブラウザ上でリアルタイムチャートを表示するアプリケーションをpythonの軽量WebフレームワークであるFlaskで作りました。為替とかをリアルタイムで描画するときに使えるかと思います。
サーバからのデータ送信はwebsocketを用いて行い、サーバ側でランダムに作成したデータを時刻と一緒にJSON形式で送っています。
クライアント側はjavascriptでwebsocketのデータを受けてグラフ描画を行います。

フォルダ構成

```
app.py
templates/index.html
static/js/d3.min.js
static/js/epoch.min.js
static/css/epoch.min.css
```

リアルタイムチャート作成には[d3.js](https://d3js.org/)をベースにしたリアルタイムチャートライブラリである[Epoch](http://epochjs.github.io/epoch/)を使いました。ちなみにd3のバージョンはv3です。
websocketを使うにあたっては[gevent-websocket](https://pypi.python.org/pypi/gevent-websocket/)を使っています。

```py:app.py
import os
import json
import datetime
import random
import time
from gevent import pywsgi
from geventwebsocket.handler import WebSocketHandler
from flask import Flask, request, render_template

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/publish')
def publish():
    if request.environ.get('wsgi.websocket'):
        ws = request.environ['wsgi.websocket']
        while True:
            t = int(time.mktime(datetime.datetime.now().timetuple()))
            ws.send(json.dumps([{"time": t, "y": random.random() * 1000},
                                {"time": t, "y": random.random() * 1000}]))
            time.sleep(1)
    return

if __name__ == '__main__':
    app.debug = True
    server = pywsgi.WSGIServer(('localhost', 8000), app, handler_class=WebSocketHandler)
    server.serve_forever()
```

```html:index.html
<html>
<head>
  <title>graph test</title>
</head>
<body>
  <h1>Real time chart</h1>
  <div id="graph" class="epoch" style="height: 200px;"></div>
  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
  <script type="text/javascript" src="{{ url_for('static', filename='js/d3.min.js') }}"></script>
  <script type="text/javascript" src="{{ url_for('static', filename='js/epoch.min.js') }}"></script>
  <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/epoch.min.css') }}">
  <script type="text/javascript">
  var ws = new WebSocket("ws://localhost:8000/publish");
  var data = [
      { label: "Series 1", values: [] },
      { label: "Series 2", values: [] },
    ];
  var lineChart = $('#graph').epoch({
    type: 'time.line',
    data: data,
    axes: ['left', 'right', 'bottom']
  });
  ws.onmessage = function(msg) {
    var current = JSON.parse(msg.data);
    lineChart.push(current);
  };
  </script>
</body>
</html>
```

以下を実行して`localhost:8000`にブラウザで接続してみてください。

```bash
python app.py
```

![out.gif](https://qiita-image-store.s3.amazonaws.com/0/14516/972dcc3e-e641-e7c1-ab4f-0d08c0543678.gif)
chkconfigでmysqlを自動起動設定にする

chkconfigは、サービス管理のコマンド。
chkconfig --list <名前> で起動設定を確認できる。


```
$ chkconfig --list mysqld

mysqld          0:off   1:off   2:off   3:off   4:off   5:off   6:off
```

mysqlの自動起動を有効にするには下記コマンド。

```
$ chkconfig mysqld on
```

再度確認すると設定が変更されているのがわかる。

```
$ chkconfig --list mysqld

mysqld          0:off   1:off   2:on    3:on    4:on    5:on    6:off
```
VHDLでのビット列反転


パラレルIFはBIG ENDIAN,シリアルIFではLSB FIRSTなどビット順をひっくり返したい時があります。

ビット幅ごとにハードコーディングしたモジュールを使うのも手ですが、generate文を使えば、ビット幅に柔軟性があり、記述量も少なくお勧め。

```VHDL:bit_reverse
    -- 宣言部
	signal X: std_logic_vector(NBITS-1 downto 0);
	signal Y: std_logic_vector(NBITS-1 downto 0);

	-- 実装部
	gen_rev: for i in Y'range generate
		Y(i) <= X(NBITS - i);
	end generate;
```
Windows 7 で chefdk を使う準備

Windows 7 64 bit で kitchen test を実行するまでのメモ。

* https://downloads.chef.io/chef-dk/windows/ からインストーラをダウンロード。
* インストーラを実行。 選択肢は全てデフォルト値。
* Chef Development Kit を実行。-> power shell でエラー。 スクリプトの実行ポリシーの制約を緩和する。

```ps1
Import-Module : スクリプトの実行がシステムで無効になっているため、ファイル C:\opscode\chefdk\modules\chef\chef.psm1 を読み込めません。詳細については、「get-help about_signing」と入力してヘルプを参照してください。
発生場所 行:1 文字:136
+ $env:PATH = 'C:\opscode\chefdk\bin;' + $env:PATH; $env:CHEFDK_ENV_FIX = 1; chef shell-init powershell | out-string | iex; Import-Module <<<<  chef -DisableNameChecking;echo 'PowerShell 2.0 (Microsoft Windows NT 6.1.7601 Service Pack 1)';write-host -foregroundcolor darkyellow 'Ohai, welcome to ChefDK!
    + CategoryInfo          : NotSpecified: (:) [Import-Module]、PSSecurityException
    + FullyQualifiedErrorId : RuntimeException,Microsoft.PowerShell.Commands.ImportModuleCommand

> get-executionpolicy
Restricted
> set-executionpolicy remotesigned
```

これで chef が使えるようになる。

ついでに，knife-zero をインストール。

```ps1
> gem install --no-document
```

パスが通っていないとの warning が出力されたため，対処する。永続的にパスを通すため，

```ps1
> $Profile
```

として表示されるファイルを作成し，そのファイルに以下を記載。

```ps1
$Env:Path = "path\to\local\chefdk\gem\ruby\2.1.0\bin;" + $Env:Path
```
(path\to\ の部分は，gem install 実行時の warning で出力されるパス)

以上。
HTML,CSS勉強メモ #3 〜clearfix〜

本日の勉強内容です。

##**勉強内容**##
###CSSレイアウト入門:###
05〜08

##**進度**##
05:アイキャッチ画像を配置してみよう
06:2カラムレイアウトを作ってみよう
07:`clearfix`を使ってみよう
08:カラムに余白をつけてみよう
まで終了。

##**メモ**##
###07`clearfix`を使ってみよう:###
ここの`CSS`で何が起こっているのか気になったので調べてみました。

➀`:after`擬似要素
必須の`content`プロパティによってボックス内の末尾に新たなインラインの要素が生成される。
(因みに値に''を指定するのは、「文字が入っていない為に要素が生成されない」という問題回避のためだそうです)
➁`display:block`
生成されたインライン要素をブロック要素にする。
➂`clear:both`
`float`解除
と言う流れでした。

`overflow:hidden`
因みにその後で紹介されているこちらは「はみ出た部分を非表示にする」ですが、これで何故float解除と同じになるのかまだ理解できてないです。
でも調べだすとまた先に進めなくなるので、この後寝ながらゆっくり考えてみようと思います。

こうやっていちいち立ち止まるから捗らないんだろうなって思います…

##**補足**##
###`overflow:hidden`の件###
解決しました。
`overflow`を使うと親要素が`float`のついた子要素の高さを認識するからとのこと。
何故認識するかと言うと、もし親要素がスクロールするとき、浮動化した子要素を認識していないと逆におかしな事になるからだそうです。
スッキリしました〜✨
ではお休みなさい。
Redis上でlua scriptを利用して結果を利用して、別の値を取得する方法


# 前提条件
* Redis 3.2-rc3
* Node.js 5.9.1
* npm
	* node_redis 2.6.0-0

# ソースコード
```lua:geo.lua
local keys = redis.call("GEORADIUS", KEYS[1], ARGV[1], ARGV[2], ARGV[3], ARGV[4])
local values = redis.call("MGET", unpack(keys))
local result = {}
for i, key in ipairs(keys) do
  table.insert(result, key)
  table.insert(result, values[i])
end
return result
```

```javascript:index.js
'use strict'

let redis = require("redis")
  , fs = require('fs')
  , client = redis.createClient()
  ;

client.set('Palermo', 'PalermoValue');

client.set('Catania', 'CataniaValue');

client.geoadd('Sicily', 13.361389, 38.115556, 'Palermo', 15.087269, 37.502669, 'Catania');

let script = fs.readFileSync('./geo.lua');
client.eval(script, 1, 'Sicily', 15, 37, 200, 'km', function (err, reply) {
    console.log(reply.toString());
    client.quit();
});
```

# 実行結果

```
Palermo,PalermoValue,Catania,CataniaValue
```

# 参考資料
* [RedisのLuaスクリプティング機能について](http://rest-term.com/archives/3038/)
* [第 2 回: Lua の便利なテープル型や文字列の操作について紹介する](http://www.ie.u-ryukyu.ac.jp/~e085739/lua.hajime.2.html)
* [Redisの大量レコードを（ほぼ）全てexportする](http://ceblog.mediba.jp/post/134946112586/redisの大量レコードをほぼ全てexportする)
* [Redisのeval/lua scriptをnode.jsで利用してみた](http://qiita.com/tomiyan/items/3044a6786fa0204f424a)
* [Redis3.2から追加予定のGeo hashing APIをnode.jsで利用してみた](http://qiita.com/tomiyan/items/bc2b0fd419feed4546fc)
nginxのソースからのインストール手順


- 前提ライブラリ導入
    - GCC
        - yum -y install gcc
    - PCRE(正規表現処理)
        - yum -y install pcre pcre-devel
    - zlib(gzip圧縮)
        - yum -y install zlib zlib-devel
    - OpenSSL(SSL/TLS通信)
        - yum -y install openssl openssl-devel
- nginxソースファイルの入手
    - 公式サイトのWebページからダウンロード  
http://nginx.org/en/download.html
      
- 以下サイトから対象のバージョンをダウンロード
    - http://nginx.org/en/download.html
    - mainline版(最新版)からstable(安定版)をお好みで選択する。
        - mainline版は新機能追加や、API互換に影響のある可能性のあるバグ修正も含めて最新のフィックスが適用される。
        - stable版はAPI互換性を重視して重大な脆弱性の修正のみを行う。
- ファイル解凍
    - tar xzvf nginx-xx.xx.xx.tar.gz
- インストール
    - cd nginx-xx.xx.xx
    - ./configure --prefix=/usr/local/nginx --sbin-path=/usr/sbin/nginx --add-module=/usr/local/src/nginxsrc/headers-more-nginx-module-0.25
    - 以下画面が表示されたら完了。nginx path prefix等はメモしておく。:

```shell-session
- Configuration summary
  + using system PCRE library
  + OpenSSL library is not used
  + md5: using system crypto library
  + sha1: using system crypto library
  + using system zlib library
  
  nginx path prefix: "/usr/local/nginx"
  nginx binary file: "/usr/sbin/nginx"
  nginx configuration prefix: "/usr/local/nginx/conf"
  nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
  nginx pid file: "/usr/local/nginx/logs/nginx.pid"
  nginx error log file: "/usr/local/nginx/logs/error.log"
  nginx http access log file: "/usr/local/nginx/logs/access.log"
  nginx http client request body temporary files: "client_body_temp"
  nginx http proxy temporary files: "proxy_temp"
  nginx http fastcgi temporary files: "fastcgi_temp"
  nginx http uwsgi temporary files: "uwsgi_temp"
  nginx http scgi temporary files: "scgi_temp"
```

 - インストール
     - make
     - sudo make install
 - 導入完了確認
     - nginx -V
        - 以下の様な情報が出たことを確認

```shell-session
nginx version: nginx/1.8.1
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC) 
configure arguments: --prefix=/usr/local/nginx --sbin-path=/usr/sbin/nginx
```

- 起動スクリプトを更新
    - vi /etc/init.d/nginx
    - 以下URLから対応する環境のスクリプトを参照  
https://www.nginx.com/resources/wiki/start/topics/examples/initscripts/#
    - nginxファイルやNGINX_CONF_FILEのパスは適宜変更
今日からはじめるSQL Serverの学習素材

- 新入社員
- SEだけど実際にはデータベースをほぼ触ってこなかった人

上記のような人にオススメな、SQL Serverの基礎の学習素材を見つけました。

ご存知の方や、すでにマスターしている人向けではありません。


Microsoftのページからダウンロードできる自習書です。
無料です。

実際に私が使ってみた感想とメリットを以下に書いておきます。

###メリット

- 無料であること
- 実例を用いて書いてあるのですぐ使えること
- 処理速度への影響も書いてあるので実践的っぽい

###学習時間
机上だと、下の３つで休日１日あれば余裕でしょう。
実際に試しながら進めた場合、どのくらいかかるかはその人次第です。

***
##SQL 基礎の基礎
http://download.microsoft.com/download/3/C/5/3C5DD4B2-809D-4F80-8E6B-6E9C87AD00BC/SQL11_SelfLearning02_SQLBASIC.pdf

SELECT、INSERT、UPDATEや、
INNER JOIN、SUM、AVG、COUNT等、
ベースとなる基本的なデータ操作の構文が
記載されていますので、まずはこれを見ましょう。

これから始める人ももちろん、
情報処理試験等で一応知ってはいたけど、実際にはあまりデータベースを
触ってこなかった人にも、復習になります。

***
##Transact-SQL
http://download.microsoft.com/download/5/A/2/5A29D047-2D83-4ACD-919F-4614847E8392/SQL11_SelfLearning05_TSQL.pdf

DECLARE変数の宣言、IF文やCASE文といった制御文、
charやintなどのデータ型、
CONVERTやISNULL等の関数についても記載されています。

SQL基礎の基礎にプラスして、ここを押さえておくとベースとして良いと思います。

***
##開発者のためのTransact-SQL応用
http://download.microsoft.com/download/5/A/2/5A29D047-2D83-4ACD-919F-4614847E8392/SQL11_SelfLearning06_TSQL2.pdf

これは少し応用編になりますが、ストアドプロシージャやトランザクション、
エラー処理など、実際に構築したりメンテナンスしたりする際に
考慮すべきことが記載されています。

ここまでの内容で、ある程度の知識は固められると思います。

***


上記で紹介したのは、あくまで個人的な感想ですが、
SQLの復習や、SQL Serverの基本的な使い方が、分かりやすく書かれていると思いました。

これから始められる方にはオススメです。

もしこれを見た経験豊富な方で、もっといいのあるよ、とかあれば教えていただければと思います。
Swift 2.2 の新機能: Swift の言語のバージョンのビルドコンフィギュレーション

[Swift 2.2 Released!](https://swift.org/blog/swift-2-2-released/) より [SE-0020: Swift の言語のバージョンのビルドコンフィギュレーション](https://github.com/apple/swift-evolution/blob/master/proposals/0020-if-swift-version.md) です。
原文に従ってこの訳は [Apache License 2.0](https://github.com/apple/swift-evolution/blob/master/LICENSE.txt) とします。
ツッコミお待ちしています。

# Swift の言語のバージョンのビルドコンフィギュレーション

* 提案: [SE-0020](https://github.com/apple/swift-evolution/blob/master/proposals/0020-if-swift-version.md)
* 著者: [David Farler](https://github.com/bitjammer)
* ステータス: Swift 2.2 で **実装された**
* レビューマネージャ: Doug Gregor

## はじめに

この提案は Swift 2.2 に `#if swift` という新しいビルドコンフィギュレーションのオプションを加えようとするものです

## 動機

時とともに Swift の文法は変化するかもしれません。しかし、ライブラリやパッケージの作者は自分たちのコードが言語の複数のバージョンで動くことを望むでしょう。これまで開発者が持つ唯一の頼みの綱は言語のバージョンごとに別個のリリースブランチを作って維持するという方法でした。このため開発者は複数のソースツリーを維持しなくても文法の変化に追従できる別のツールを使いました。

私たちはソースコードを配布しているパッケージの作者にとっても言語のリビジョン間の移行を容易なものとし、それらのユーザーが古い Swift でも新しい Swift でもビルドできるようにしたいと思います。

## 提案手法

この簡単な例で十分に例示できます:

```swift
#if swift(>=2.2)
  print("Active!")
#else
  this! code! will! not! parse! or! produce! diagnostics!
#endif
```

## 詳細設計

これは既にコンパイラの中に存在するバージョンに関する仕組みを使います。言語のバージョンはビルド時にコンパイラに埋め込まれているので、コードの中のどのブロックを有効にするべきかはわかります。言語のバージョンが少なくとも条件で指定されたものと同じなら、有効になる部分がパースしてコンパイルされ、コードに組み込まれます。

他のビルドコンフィギュレーションのと同じように `#if swift` は行ベースではありません。文や宣言全体を含みます。しかし、他とは異なり、`#if swift` で囲われた無効な部分はパースしません。もしくは診断メッセージを出力します。これにより他のバージョンの Swift 用の文法的に異なるコードをひとつのソースファイルに記述できます。

現在のところ、バージョンのコンポーネントは二つまでをだけを想定します。+0.0.1 のリビジョンの違いで文法的な変更は起きないだろうと思われるためです。

コンフィギュレーション関数の引数は単一項の前置式で、簡単のために想定する演算子は `>=` ひとつです。必要になった場合には、他の比較演算子を含むように拡張できます。

## 既存のコードに対する影響

この仕組みはオプトインなので、この変更は既存のコードに影響しないでしょう。

## 検討された代替案

バージョン引数について他に二つのフォーマットを検討しました:
- 文字列リテラル (`#if swift("2.2")`): 任意の数のバージョンのコンポーネントを埋め込むことができますが、マイクロリビジョンでの文法の変更は起きにくいと考えられます。もし別のバージョンのコンポーネントが必要になっても、パーサーの変更は大きなものではありません。
- ただの数値 (`#if swift(2.2)`): `>=` が妥当なデフォルトですが、どのような比較を行うのか明確ではありません。`==` である思われるかもしれません。
- 引数リスト (`#if swift(2, 2)`): 柔軟性の高い方法ですが、二つ目の `2` がバージョン全体を表すコンポーネントではなく、異なる意味を持つ引数かもしれないことを示唆してしまう可能性があります。
[普及版]ジェネラティブ・アートの図3.3をネタにSverchokする

　引き続き[[普及版]ジェネラティブ・アート―Processingによる実践ガイド](http://www.amazon.co.jp/%E6%99%AE%E5%8F%8A%E7%89%88-%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%A9%E3%83%86%E3%82%A3%E3%83%96%E3%83%BB%E3%82%A2%E3%83%BC%E3%83%88%E2%80%95Processing%E3%81%AB%E3%82%88%E3%82%8B%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E3%83%9E%E3%83%83%E3%83%88%E3%83%BB%E3%83%94%E3%82%A2%E3%82%BD%E3%83%B3/dp/4861009634)の例をネタに[Sverchok](https://github.com/nortikin/sverchok)の勉強です。

　図3.3はランダムな折れ線状の例になっていて、マネしてみた結果は次のようになりました。
<img width="485" alt="結果" src="https://qiita-image-store.s3.amazonaws.com/0/13938/99a78bf4-2538-5b23-68ea-9a4fd0a034da.png">

　そして最終的なノードは次のようになりました。基本の線のメッシュは Line ノードで生成して一旦、各成分毎に分解し、Y 値をランダム性を加味した値に入れ替えたところがポイントです。
<img width="742" alt="ノード" src="https://qiita-image-store.s3.amazonaws.com/0/13938/d939105a-9601-0b64-6a99-dde0fccdeeba.png">
vimのnormal modeでctrlキーを使うキーマップ一覧

## normal modeでctrlキーを使うキーマップ一覧

|キー|動作|
|:--|:--|
|CTRL-@|割り当てなし|
|CTRL-A|カーソルの下にある数字を1つインクリメント|
|CTRL-B|スクリーンの幅だけ上にスクロール|
|CTRL-C|今入力しているコマンドや検索をキャンセル|
|CTRL-D|スクリーンの半分の幅だけ下にスクロール|
|CTRL-E|画面を1行スクロール|
|CTRL-F|スクリーンの幅だけ下にスクロール|
|CTRL-G|今開いているファイル、行数、位置を表示|
|CTRL-H|1つ左に移動(hと同じ)|
|CTRL-I|\<Tab>と同じ|
|CTRL-J|1つ下に移動(jと同じ)|
|CTRL-K|割り当てなし|
|CTRL-L|スクリーンを再描画|
|CTRL-M|1つ下に移動(\<CR>と同じ)|
|CTRL-N|1つ下に移動(jと同じ)|
|CTRL-O|1つ前のジャンプリストに移動|
|CTRL-P|1つ上に移動(kと同じ)|
|CTRL-Q|割り当てなし|
|CTRL-R|undoした内容をundo(「u」を連打しても2つの状態を行き来するだけだが、CTRL-Rはさらに前に戻れる)|
|CTRL-S|割り当てなし|
|CTRL-T|1つ前のタグリストに移動|
|CTRL-U|スクリーンの半分の幅だけ上にスクロール|
|CTRL-V|矩形選択を開始|
|CTRL-W {char}|ウィンドウコマンド|
|CTRL-X|カーソルの下の数字を１つデクリメント|
|CTRL-Y|1行上にスクロール|
|CTRL-Z|vimを停止|
|CTRL-[|割り当てなし|
|CTRL-]|カーソルの下の単語を:taで検索|
|CTRL-^|N番目のファイルを編集(:e #Nと同じ)|
|CTRL-_|割り当てなし|

[vimのinsert modeの全てのキーマップ一覧](http://qiita.com/34ro/items/6163f595785ae99a632a)もまとめています
100円のフルカラーLED基板


Lチカするときに抵抗いちいち入れるのが面倒くさい。もっと雑にLチカしたい。そんなとき抵抗(もしくは定電流ダイオード)入りのLEDを使うと楽で1つ持ってるんだけど、aitendoでそんな用途に使いやすい100円のフルカラーLED基板が売ってたので買ってみた。リアル店舗にもあった。

- [極小フルカラーLEDモジュール IFB-RGB5050](http://www.aitendo.com/product/6291)
  - EW5050RGB の実装品らしい

実装されていた抵抗はRGBどれも470Ωだった。なおピンヘッダは同梱されておらずそれは自分で実装する。

![20160327-DSC04920.jpg](https://qiita-image-store.s3.amazonaws.com/0/5330/5d35cf8d-bb8c-13d5-fac2-e3289b52aa09.jpeg "20160327-DSC04920.jpg")


ちょっとハマったのがGNDに繋ぐカソードの位置が正面右から二番目でわかりにくいこと。KRGBやRGBKの順序なら解りやすいのに、BGKRという順序でわかりにくい…。なお逆電圧6Vなので、よくあるマイコン出力の5Vを間違ってカソードに繋いでしまったけど壊れなかった。
MacでWindowsの形式(\\〜)のパスを「親の階層に行ける状態」で楽にマウント

できるものをつくってみた。まずは動画をみていただければと思います。

![movie](https://raw.githubusercontent.com/greymd/osx-open-winfs/master/img/osx-open-winfs-movie.gif)

# 概要
* **Windows形式のファイルパスを開ける:** Windows形式のネットワーク上のファイルパス（スラッシュ`\\`で始まるもの）のテキストを選択して`Services`からAutomatorを呼び出すと、Finderでそのパスを開ける。
* **マウントポイント調整:** 内部的にマウントポイントを調整しているため、開いた後、そのまま**親ディレクトリにも行ける。**
* ファイルシステム上のファイルやディレクトリを選択したあと、Windows形式のパスをクリップボードにコピーできる。
* **認証機能:** ユーザ名やパスワードが必要な場合、入れられる。また、一部スクリプトを改変すれば、毎回入力しなくても、常に固定のユーザ名とパスワードを使うことも可能。（[Github](https://github.com/greymd/osx-open-winfs)のCustomizeを参照）。

## インストール方法

```bash:Terminal
$ git clone https://github.com/greymd/osx-open-winfs.git
$ cd osx-open-winfs
$ sudo make install
```
ソースは下記で公開してます。
Github: https://github.com/greymd/osx-open-winfs

## 環境
手元のMac OSX Yosemite 10.10.5の端末上で動作は確認。多分最近のなら動く気がします。

# その他、細かい話
## なぜ作ったか？
* 他のQiitaの記事でもありましたが、職場を始めとした共同環境で、Windows形式のファイルパスをSlack上などでやり取りをされると、Macユーザとしては割とストレスです。

* WindowsのパスをMacで扱う方法に関しては、幾つかソリューションが存在しましたが、いずれも欠点があったため、それを直したいと思いました。

## 既存手法との違い

## [PathCon](http://bootgraph.net/pathcon/)
「MacとWindowsのファイルパスを相互変換できるサイト」です。
すなわち、Windowsのパスを受け取ったら……

* ブラウザ開く→パスを変換→コピー→Finderを開く→サーバに接続

という手順を踏まなければいけません。これはさすがに面倒です。とはいえ、Webサービスなので、人様のMacを操作する時も気軽に使えるのは強いです。

## [MacのAutomatorを使ってWindowsのファイルパスを変換しつつFinderで開く方法](http://ameblo.jp/tsq/entry-11400112359.html)

あるブロガーさんが提案した方法。Automatorを使っています。テキストを選択してメニューを開いてクリックするのみ。気軽に開けます。ただ、個人的には、**一旦マウントしたら、それより上のディレクトリに行けない**のが辛いです。（これは、PathConを使って開いても同じです。）

例えば``\\ホスト名\share\mydirectory``というファイルパスを渡されて、それを開くと、ボリュームの最上位マウントポイントが最下位のディレクトリである`mydirectory`になります。
つまり、こんな感じにそれより上にはいけないです。

![winpath.png](https://qiita-image-store.s3.amazonaws.com/0/68963/6db5e087-3756-5ee8-17c1-f87d8e39671c.png)

もしWindowsユーザに`\\nas\共有\プロジェクト一覧\プロジェクトA`などというパスを渡され「**あ、ごめんパス間違えた、一旦親ディレクトリに戻って`プロジェクトB`に行って！**」などと言われたらかなりのストレスです。結局手作業で`プロジェクトA`という文字列を削除して、再度マウントして移動することになります。オマケに単一のマシンが異なるマウントポイントで同じネットワークボリュームをマウントするという大変気持ち悪い状況が完成します。私には耐えられませんでした。そこで、多少面倒でしたが、上で紹介したものを作りました。

## ソリューション
上で紹介した私のスクリプトは、Automator経由でシェルを叩き、そこから`mount_smbfs`コマンドを叩いてマウントしています。既存手法が採用している「`smb://...`の形式に変換→Finderの機能でマウント」というアプローチは取っていません。
Windowsで使われるSMBファイルシステムのパス形式は`\\ホスト名\ボリューム名\サブディレクトリ...`と続きます。そこで、一旦はボリューム名までをマウントポイントに指定してマウント、その後、全体のパスをFinderで開く、という操作をしています。内部的には`open`コマンドを使っているため、ファイル名を直接指定したばあいマウント→所定のアプリケーションでファイルを開く、という流れになります。

## 余談
自分の手元以外の環境で試してないので、なにかソースにおかしい点があれば、是非教えて下さい。。そもそも、AppleScriptを書くのも、自分で作ったworkflowを配布するのも、コレが初めてなので、配布方法が正攻法かどうかもよくわかってません。。

# 参考
* [シェルスクリプトのみでMacとWindowsのファイルパスを相互変換する方法(Macユーザ向け)](http://qiita.com/odacoh/items/14844b79f7fcf5bef97e)
* [MacのAutomatorを使ってWindowsのファイルパスを変換しつつFinderで開く方法](http://ameblo.jp/tsq/entry-11400112359.html)
* [PathCon](http://bootgraph.net/pathcon/)
どちらもhtaccessのリダイレクトを使っているWordPressとCakePHPの共存をする話


CakePHPはレンタルサーバでも使用可能なケースが多いので、使ってみたけど、`.htaccess`の設定を正確に使うと、柔軟な運用ができそう。

# 目的

CakePHPのルーティング機能を使って管理する部分と、そうでないところを明確に分ける話。

箇条書きや図を使った説明の方が捉えやすそう。
話の内容に関係ないところは省略しています。

## こんなURLで表示させたい
サイトの階層が /base から始まり、CakePHPのwebrootは　/base/ と定義した上で、以下のようなURLで表示させたい。

1. /base/items　　　　    商品一覧　
2. /base/items/:id　　    商品詳細（:id は商品の個別id）
3. /base/diary　　　　    日記一覧
4. /base/diary/wp/:post　日記詳細（:postは投稿IDなどのスラッグ）
5. /base/admin           商品などの管理画面

なお、１と２、５はCakePHPで動的に生成されるページ、３は生PHPで表示するページ、４はWordPressで表示させるページである。



## 実際には、こんな構造だ

```text:ディレクトリ構造
base---cakephp(CakePHPのappなどが存在する）
    |
    |--diary|--wordpress（diaryの日々データが存在する）
    |       |--index.php（diaryのトップページ）
    | 
    |--index.php（cakephpの制御に関わる操作を行う）
    |--.htaccess（今回の本題。リダイレクト処理設定などをしている）
```

ここで重要なのが、/base/ 直下からCakePHPを動かすための`.htaccess`や`index.php`が存在し、その配下にWordPressを動かすためのソースが存在することになる。

また、WordPressによるコンテンツ管理を行うのは、/base/diary/wp 以下のURLであるということ。

## だから・・・
`.htaccess`のmod_rewrite機能を使い、CakePHPによるルーティングなどをさせない設定が必要になった。

# 設定作業

## .htaccessの設定

下記ソースのように `RewriteCond $1 !^/base/diary/*` と追記。
これは、アドレスが`/base/diary/（何か）`となる場合、mod_rewriteの対象外とする

```.htaccess:.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine On
    #下記１行追加
    RewriteCond $1 !^/base/diary/*
  
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
```


# 備考：環境
直接は関係ないかもしれないけど、記載

- CentOS 6.7
- Apache 2.2.15
- PHP 5.3.3
- MySQL 5.6
- WordPress 4.4
- CakePHP 2.8.1
Shell STDERRのリダイレクト


リダイレクトは後ろから評価される。
以下の例は、STDOUTをNULに捨てた後、STDERRをSTDOUTにマージする。

```Shell:良い例
foo >2&1 >/dev/null |less
```
次の例は、STDERRをSTDOUTにマージした後で、捨てるので何も残らない。

```Shell:失敗例
foo >/dev/null >2&1 |less
```


||write to 'file'|pipe|
|:--|:--|:--|
|stdout| > file| \| pipe |
|stderr| 2> file| 2>&1 >/dev/null \| pipe
|stdout & stderr | 2>&1 > file| 2>&1 \| pipe
MySqlのソケットエラーを解決する

環境はcentos65


mysqlに接続しようとすると下記エラーが発生するときがある。socketファイルがないことが原因のようだ。

```
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
```

mysqlを再起動すると、/var/lib/mysql/mysql.sockが自動的に作成される。

```
$ sudo /etc/init.d/mysqld restart
```



自分は出会ったことがないが、手動でmysql.sockを作成する必要があるケースがあるらしい。作り方だけメモしておく

```
$ sudo touch /var/lib/mysql/mysql.sock
$ sudo chown mysql:mysql /var/lib/mysql/mysql.sock
```
Raspberry piでRFID（パソリ）を使用する際のハード選定について

#はじめに

Raspberry piでRFID（パソリ）を使用したい時に、どれを使うかで調べた結果を整理しておきます。

#パソリの種類

2016/3/27現在でAmazonで手に入るパソリは以下でした。
※S360は[楽天Edyリーダー](http://item.rakuten.co.jp/edyshop/reader/index.html#edyreader)として売られているようです。

|名称|新品|中古|
|---|---|---|
|[RC-S320](http://www.amazon.co.jp/gp/offer-listing/B0009YVAW4/ref=dp_olp_all_mbc?ie=UTF8&condition=all)|―|約1100円|
|[RC-S330](http://www.amazon.co.jp/gp/offer-listing/B001MVPD8U/ref=dp_olp_all_mbc?ie=UTF8&condition=all)|約8500円|約2500円|
|[RC-S360](http://www.amazon.co.jp/gp/offer-listing/B00728IVKO/ref=dp_olp_used_mbc?ie=UTF8&condition=all)|－|約1500円|
|[RC-S370](http://www.amazon.co.jp/gp/offer-listing/B0047AHHD2/ref=dp_olp_all_mbc?ie=UTF8&condition=all)|約6000円|約1900円|
|[RC-S380](http://www.amazon.co.jp/gp/offer-listing/B00948CGAG/ref=dp_olp_all_mbc?ie=UTF8&condition=all)|約2600円|約3200円|
|[RC-S390](http://www.amazon.co.jp/gp/offer-listing/B00IJ3ZG36/ref=dp_olp_all_mbc?ie=UTF8&condition=all)|約4400円|―|


これらの違いですが、S330・S380・S390の違いについては、以下で確認できます。

- [FeliCaポート／パソリ パソリシリーズの違い](http://www.sony.co.jp/Products/felica/consumer/products/list.html):個人向けサイト
- [PaSoRi（パソリ）製品比較表](http://www.sony.co.jp/Products/felica/business/products/comparison.html)：法人向けサイト

細かいことはよくわかりませんが、

- 現行は、S380とS390
- S330以降はe-Taxにつかえる
- S390はiOSに対応しBluetoothで通信
- S360はクリップタイプで業務用、楽天Edyリーダーとして売られているっぽい

ということでしょうか。

で、Raspberry piで使うとなると、便利なのはPythonのライブラリである[nfcpy](http://nfcpy.readthedocs.org/en/latest/)を使用する方法かと思います。
この場合、[サポート対象](http://nfcpy.readthedocs.org/en/latest/overview.html#supported-devices)なのは、S330,S360,S370,S380になります。

新品で買うならS380が良い感じです。
できるだけ安くというのであれば、楽天Edyリーダーを買うのがベストかもしれませんが、楽天EdyリーダーがS360とは明記されてないので自己責任でお試しください。

中古でもできるだけお安くとなるとRC-S320となります。この場合、[libpafe](http://homepage3.nifty.com/slokar/pasori/libpafe.html)を使う方法があるようです。

- [Raspberry Pi + libpafe + Python + ctypesで、FeliCaのIDmを読む](http://thinkami.hatenablog.com/entry/2015/06/16/212600)

以上
width,heighとpaddingの同時指定によるレイアウト崩れをbox-sizingdで防ぐ


htmlを書き始めのときに、widthとpaddingを同時に使うとレイアウトが思い道理にいかないことがよくあった。
CSS3でbox-sizingというプロパティがあることを知り、簡単な例を作ったのでメモ。

## box-sizingプロパティ
box-sizingはボックスサイズの算出法を指定する.
以下の値を取れる。
<dl>
<dt>content-box</dt>
<dd>パディングとボーダーの高さと幅を含めない(デフォルト値)</dd>
<dt>border-box</dt>
<dd>パディングとボーダーの高さと幅を含める</dd>
<dt>inherit</dt>
<dd>親要素を継承</dd>
</dl>

border-boxを指定することでレイアウト崩れを防ぐことができる。

## 例

[box-sizingの例](http://tetsuyanegishi.github.io/Warehouse/box_sizing_example/)
例では上から2つ目の緑色のブロックでborder-boxを指定した。
paddingとborderプロパティの値を指定しているが、オレンジのブロックを同じサイズでボックスサイズに影響を受けていない。
上から3,4つ目の青色のブロックにはcontent-boxを指定した。
paddingとborderの影響を受けてボックスサイズがずれてしまう。

```html:box-sizingの例 
<!DOCTYPE html>
<html>
    <head>
	<style type="text/css">
	 .rectangle {
	     width: 50%;
	     margin: 10px 0;
	 }

	 .box_sizing_border {
	     box-sizing: border-box;
	     padding: 0 30px;
	     border: solid 5px #5f9;
	 }

	 .box_sizing_content_padding {
	     box-sizing: content-box;
	     padding: 0 30px;
	 }

	 .box_sizing_content_border {
	     box-sizing: content-box;
	     border: solid 5px #559;
	 }
	</style>
    </head>
    <body>
	<div class="rectangle" style="background-color: #f90">
	    width: 50%;
	</div>
	<div class="box_sizing_border rectangle" style="background-color: #599">
	    width:50%;<br>
	    box-sizing: border-box;<br>
	    padding: 0 30px;<br>
	    border: solid 5px #5f9;
	</div>
	<div class="box_sizing_content_border rectangle" style="background-color: #55f">
	    width:50%;<br>
	    box-sizing: content-box;<br>
	    border: solid 5px #5f9;
	</div>
	<div class="box_sizing_content_padding rectangle" style="background-color: #55f">
	    width:50%;<br>
	    box-sizing: content-box;<br>
	    padding: 0 30px;<br>
	</div>
    </body>
</html>

```

## 参考資料
[HTMLクイックリファレンス](http://www.htmq.com/css3/box-sizing.shtml)
128bit型で注意すること

32bitの整数型だとオーバーフローしてしまう、そんな時は64bitの整数型を使います。
では64bitの整数型でもオーバーフローしてしまう、
そうしたら、128bit型の整数型を…となるのですが、ちょっと待って下さい。

結論から言うと、128bit型で収まらない可能性が高いです。

普通はいきなり128bitの数を入力することはありません。
ですので、ある関数を作り、f(1000)とした時の値が128bitのサイズが必要だった、という感じです。

そうなると、f(x)の式はどんな感じでしょうか？
f(x)=x^2でも、たかだか100万ですので、全然数が大きくありません。
f(x)=x^4となれば、32bitは超えますが、まだまだ64bitで収まります。

更に大きくなる関数だと、f(x)=2^x があります。
これなら、x=1000のとき1000bit必要になります。
128bitを軽く超えてますね。

フィボナッチ数列の1000個目を出力してくださいという問題がそんな例です。
f(n)=f(n-1)+f(n-2) ですが、f(n-1)とf(n-2)の値は大体一緒とみなして
f(n)≒f(n-1)+f(n-1) と考えれば、f(n)≒2 f(n-1) となります。
毎回2倍になるわけですから、一般項は f(n)≒2^n です。

このように、128bitで収まる程度の加速をする関数というのは少ないのです。
本当にその値を出力しないといけない場合(プログラムコンテストとか)は任意桁演算クラスを使うしかないわけです。
また、アルゴリズムにもよりますが、128bitが出てくるような事態になると、
メモリが足りないだの答えが出てこないぐらい時間がかかるだの、そういう計算量的な問題もあるでしょう。

強衝突耐性の確率が32bitだと困るので64bit欲しい、みたいな明確な理由があれば、128bitの出番とは言えます。
ただ、単純にオーバーフローするから、という問題では128bitは丁度使いにくい長さだと思います。
双対問題を調べる

# <i class='fa fa-home' /> はじめに
最適化では、元の問題(主問題)に対して、[双対問題](https://ja.wikipedia.org/wiki/%E5%8F%8C%E5%AF%BE%E5%95%8F%E9%A1%8C)というものを考えることができます。

双対問題は、以下のような重要な性質があります。

- どちらかが最適解を持つならば、両方とも最適解を持ち、その最適値は一致する。
- 双対問題の双対問題は主問題となる。
- 双対定理が成り立つ。(参考:[wikipedia](https://ja.wikipedia.org/wiki/%E5%8F%8C%E5%AF%BE%E5%95%8F%E9%A1%8C))

主問題と双対問題の例をあげます。


<table>
<tr><td>主問題</td><td></td><td>双対問題</td></tr>
<tr><td>$ \min{~ c^T x} $</td><td></td><td>$ \max{~ b^T y} $</td></tr>
<tr><td>$ A x \ge b $</td><td></td><td>$ A^T y \le c $</td></tr>
<tr><td>$ x \ge 0 $</td><td></td><td>$ y \ge 0 $</td></tr>
</table>

いろいろな主問題の双対問題が、すぐわかるPython3のパッケージ(dual)を作ったので、ご紹介します。

# <i class='fa fa-home' /> インストール

```bash:bash
pip install dual
```

# <i class='fa fa-home' /> 試してみる
例を見てみましょう。

```bash:bash
python -m dual << EOF
min c^T x
A x >= b
x >= 0
EOF
>>>
max b^T y
A^T y <= c
y >= 0
```

合っていますね。

双対問題を与えると、主問題になります。

```bash:bash
python -m dual << EOF
max b^T y
A^T y <= c
y >= 0
EOF
>>>
min c^T x
A x >= b
x >= 0
```

制約条件の不等号を等号に変えると、yが自由変数になります。

```bash:bash
python -m dual << EOF
min c^T x
A x = b
x >= 0
EOF
>>>
max b^T y
A^T y <= c
```

xを自由変数にすると、双対問題の制約条件が等号になります。

```bash:bash
python -m dual << EOF
min c^T x
A x >= b
EOF
>>>
max b^T y
A^T y = c
y >= 0
```

少し複雑にしてみましょう。

```bash:bash
python -m dual << EOF
min c^T x + d^T z
A x - P z >= b
Q z <= f
x >= 0
EOF
>>>
max b^T y - f^T w
A^T y <= c
- P^T y - Q^T w = d
y >= 0
w >= 0
```

同じように双対問題を与えると主問題に戻ります。

```bash:bash
python -m dual << EOF
max b^T y - f^T w
A^T y <= c
- P^T y - Q^T w = d
y >= 0
w >= 0
EOF
>>>
min c^T x + d^T z
-Q z >= -f
A x - P z >= b
x >= 0
```

# <i class='fa fa-home' /> Jupyterでお手軽に

Jupyterだとお手軽にできます[^1]。準備としてimport します。

```py3:jupyter_notebook
import dual
```

実行してみます。

```py3:jupyter_notebook
%%dual
min c^T x
A x >= b
x >= 0
>>>
max b^T y
A^T y <= c
y >= 0
```

以上

[^1]: [Jupyterの小技2](http://qiita.com/Tsutomu-KKE@github/items/708ae8fe0cf293f7f986)のテクニックを使っています。
DBの正規化されていない例

参考はWikipedia。
中央寄せ太字がキー。

# 第一正規形

スカラ値のみをもつ。

## 第一正規形ではない例

|ブログID|タイトル|内容|タグ|
|:----:|----|----|----|
|**1** |はじめまして|こんにちは|[一般] [生活]|

タグに複数のデータがあるので第一正規形ではない。



# 第二正規形

X → A のとき、次のどちらかを満たす

1. Xはキーの真部分集合ではない
2. Aがキーの構成要素

## 第二正規形ではない例

|商品番号|顧客番号|営業社員番号|販売価格|
|:----:|:----:|----|----|
|**A001** |**1001**|S0010|2,500|
|**A002** |**1001**|S0010|3,500|

顧客番号 が決まれば 営業社員番号 が決まるとき、第二正規形ではない。
1. 顧客番号はキーの真部分集合である
2. 営業社員番号はキーの構成要素ではない

つまり、キーの一部から（候補）キーではない項目に従属性があったらダメ。

A002 の行で営業社員番号だけ変更すると、顧客番号1001 => S0010 の関連が崩れる。


通常、第三正規形にするまでの中間形式として表れる。第二正規形にあまり意味はない。


# 第三正規形

X → A のとき、次のどちらかを満たす

1. Xはキー
2. Aがキーの構成要素

## 第三正規形ではない例

|顧客番号|届け先ラベル|郵便番号|都道府県|住所|
|:----:|:----:|----|----|----|
|**001** |**自宅**|107-0052|東京都 | 港区赤坂|


郵便番号 が決まれば 都道府県 が決まるとき、第三正規形ではない。
1. 郵便番号はキーではない
2. 都道府県がキーの構成要素ではない


ただし以下を満たすので第二正規形ではある。
1. 郵便番号はキーの真部分集合ではない

つまり、第二正規形ではキー以外の従属性は認められたが、第三正規形になるとキー以外でもダメ。
中途半端な関連がないのでデータ変更時に矛盾が起こらない。なのでデータベースの正規化は第三正規形までやれとなる。

第二正規形だと、例えば都道府県だけ変更すると関連に矛盾が起こる。



以降の正規形については http://qiita.com/nishimura/items/b0d722c021236d932d95 こちら。
リダイレクトのまとめ

# 1.リダイレクトの種類
リダイレクトには、2種類の書き込み方式と1種類の読み込み方式がある。

```lang:shell.sh
#!/bin/bash
#

# ファイルに上書き
コマンド > ファイル名

# ファイルに追記
コマンド >> ファイル名

# ファイルから入力
コマンド < ファイル名
```

# 2.出力と出力先の設定
　標準出力は以下の2種類あり、コマンドライン上では番号で指定する。また、出力先は通常画面であるが、ファイルを指定することもできる。

- 標準出力(1)
- 標準エラー出力(2)

```shell.sh
#!/bin/bash
#

# 標準出力、標準エラー出力を画面に出力
コマンド

# 標準出力をファイルに出力
コマンド 1> ファイル名

# 標準エラー出力をファイルに出力
コマンド 2> ファイル名

# 標準出力と標準エラー出力の両方をファイルに出力する
#   (1) 標準出力をファイルに設定(コマンド 1> ファイル名)し、
#   (2) 標準エラー出力の出力先を標準出力に合わせる(2>&1)
コマンド 1> ファイル名 2>&1
```

# 3.その他関連項目
## 3.1 teeコマンド
 teeとは、標準入力から読み込んだ内容を標準出力とファイルに書き込むためのコマンドである。

```lang:tee.sh
# 標準出力と標準エラー出力の両方をファイルに出力する
#   (1) 標準エラー出力の出力先を標準出力を合わせて(コマンド 2>&1)、
#   (2) ファイルに書き込む（tee log.txt）
コマンド 2>&1 | tee log.txt
```

# 参考サイト
[AdminWeb - 標準エラー出力をファイルへ出力](http://www.adminweb.jp/command/redirect/index3.html)
[Qiita - bash：標準出力も標準エラーもログに出力](http://qiita.com/okisanjp/items/4bdf009176ecae312f84)
[Qiita - シェルの入出力制御あれこれ](http://qiita.com/tag1216/items/7ce35b7c27d371165e56)
[UNIXの部屋 コマンド検索: リダイレクト](http://x68000.q-e-d.net/~68user/unix/pickup?%A5%EA%A5%C0%A5%A4%A5%EC%A5%AF%A5%C8)
かんたんMarkdownでスライドを作れるようにした

[完全に単一のHTMLファイルで動作するMarkdownエディタ作った - Qiita](http://qiita.com/tatesuke/items/225b51b270faf8b10923)

こちらの Markdown エディタを改造して、プレビューをスライドで表示できるようにしました。
[@tatesuke](https://twitter.com/tatesuke) さんにも快諾頂けたので、公開したいと思います。

[こちら](https://opengl-8080.github.io/KanTanMarkdownSlide/ktm-std.html) から利用できます。
（オートプレビューはデフォルトで OFF になっているので、 `F5` で更新させてください）

![kantan_remark.gif](https://qiita-image-store.s3.amazonaws.com/0/28302/ab064a48-97f4-19a0-5bf9-342f2b22c81f.gif)

基本的な機能は、本家のかんたんMarkdown と同じように使用できます。
ただし、今のところ以下のような違いがあります。

- オートプレビューはデフォルトで OFF
  - スライドを表示している `<iframe>` を毎回再作成しています。
  - このため、オートプレビューが ON だと動作が重くなるので、デフォルトでオートプレビューは OFF にしています。
  - プレビューを更新するには `F5` を入力してください。
- シーケンス図・フローチャート図が表示できない
  - 今のところ、これらの機能は正しく動作しません。
  - 単純に移植したところ、図の定義が記載されたページを表示した後でシーケンス図化などをしないとうまく表示できないようです。
- IE で表示が崩れる
  - Remark 単独で動かしても同じ現象が起こったので、たぶん Remark 側のバグっぽいです。
  - 可能なら、 Chrome を使ってください（速度的にも Chrome が推奨です）。
- Lite エディションはない。
  - Remark が HighlightJS を使ってるので、自然と Lite はありません。
  - 上のシーケンス図が動かない話と合わせると、必然的に Standard エディションのみが利用できるエディションになります。

スライドの表示には [Remark](https://github.com/gnab/remark) というライブラリを使用しています。
Remark の使い方については、[公式の Wiki](https://github.com/gnab/remark/wiki/Markdown) を参照するか [これとか](http://qiita.com/opengl-8080/items/d44aec7c6c643996916b) を参考にしてください。

ソースコードは GitHub に上げています。

https://github.com/opengl-8080/KanTanMarkdownSlide
gem-browse で Gem のホームページに簡単に飛べるようにする

Gem のページに行きたいときは、毎回わざわざ Google で検索していたんですが、[gem-browse](https://github.com/tpope/gem-browse) を使えばコマンド一発で飛べることが分かったので、入れました。

# 手順

インストールして、

```
gem install gem-browse
```

browse "調べたい gem" とするだけ。

```
gem browse sprockets
```

Chrome で開いた！

![image](https://qiita-image-store.s3.amazonaws.com/0/41416/b4b4119b-7136-69d4-bc14-60dfa94911a2.png)

ちょっとした事だけど、便利。
Git超初歩的な使い方。

## Gitの勉強会に参加してきた

本日個人的にGitの勉強会に出席してきました。
業務ではGitを使う機会はまだまだ少ないですが、自分の備忘も兼ねてメモを残したいと思います。

１．操作端末にGitがインストールされているかを確認。

```ruby:gitのバージョン確認
git --version
```
git version x.x.x等と表示されれば問題なし。


２．現在のGitのブランチ位置を確認。

```ruby:ブランチ確認
git branch
```

ブランチが一覧表示される。
初期状態であれば、masterしかないので、
「*master」と表示されるはず。

３．Githubリポジトリ情報の任意のクローン先に移動

```ruby:任意の作業ディレクトリに移動
cd ~/Desktop
```
ひとまずデスクトップを作業ディレクトリに選定。


４．Githubリポジトリ情報をローカルにクローン。

```ruby:ローカルにクローン
git clone https://github.com/xxxxxxxx/<git_name>
```

５．クローンしたローカルディレクトリに移動

```ruby:ローカルディレクトリに移動
cd ~/Desktop/<git_name>
```


６．ブランチを変更

```ruby:Masterブランチをチェックアウト
git checkout -b sample
```
Masterブランチでの変更作業をすることは好ましくないっぽい。
その変更専用のブランチを作成し、Masterからはチェックアウトする。


７．ローカルディレクトリにサンプルテキストファイルを作成。

```ruby:サンプルファイルの作成
echo test1.txt > aaaa
echo test2.txt > bbbb
echo test3.txt > cccc
```

８．変更した情報を変更ステージング領域に配置する。

```ruby:変更情報をステージング領域に移動
git add sample
```

９．変更情報をコミットする。

```ruby:ステージング領域の変更情報をコミットする。
git commit -am '<変更した内容>'
```


１０．コミット情報を確認する。

```ruby:コミット情報を確認する。
git log
```
コミットをした時点のハッシュ値が表示される。
＃変更した後にコミット情報をロールバックするには、
＃ここで表示されるハッシュ値を元に、以下のコマンドを実行する。
　git reset --hard  <ハッシュ値>

１１．変更情報をリモートサーバに反映する。

```ruby:リモートサーバに変更情報を反映する。
git push origin sample:sample
```

またまとめよう。
とりあえず、今日はここまで。
Rails4アプリケーションを IIJ Mogok にdeployする手順

残念ながら IIJ Mogok は2017年1月末日にサービス終了するそうです。
http://mogok.jp/

----
MogokへのdeployはRailsGirlsの記事がよくまとまっていて、付け加えることはほぼ無い。
http://railsgirls.jp/mogok

## よく使うコマンド

```bash
# mogokの場合、mogok buildで自動的にやってくれてるかもしれない ※未確認
$ rake assets:clean
$ rake assets:precompile

# assetsを一旦綺麗にするならこれ。その後、precompile。
$ rake assets:clobber
```

```bash
$ git push mogok master
$ mogok build
$ mogok rake db:migrate
$ mogok stop
$ mogok start
```

## MogokでSQL実行
http://qiita.com/nagahori/items/13655c4fe7e44b46795a
但し、selectはprotectedになっているらしく、select_allを使うと良い。
http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/DatabaseStatements.html#method-i-select_all

```rb:Rubyスクリプト実行
require "#{Rails.root}/app/models/battle"

@result = ActiveRecord::Base.connection.select_all("select * from battles")

p @result
```


また、モデルをrequireしているので、モデルに定義しているメソッドも呼び出せる。※cascadeでdeleteして欲しい場合などにはこちらの方が適切かと。

```rb:Rubyスクリプト実行
require "#{Rails.root}/app/models/battle"

@battle = Battle.find(7)
#p @battle

@battle.destroy
```

## Mogokハマり履歴

db:migrateでテーブルの作成順が悪くエラーが発生した。
FKの参照先となるテーブルを先に作っていなかった。（MySQL）

## 絵文字対応
Mogokの既存MySQLデータベースに絵文字を格納できるようにする。
Mogokではmy.cnfを編集できないので難しいかと思っていたが何とか出来た。

詳細については追々記述する。

参考： http://qiita.com/leon-joel/items/93eaab4860de2787db96
Wordの自動修正、ページ番号設定

##自動修正
###【自動罫線の削除】
「---」と入力すると自動的に作成される罫線を削除したい。
罫線を含む前後の文を選択して、メニューから「罫線」の「線種とページ網掛けの設定」を選ぶ。
「線種とページ網掛けの設定」ダイアログボックスが出てくる。
線種の「罫線なし」を選び、OKボタンを押す。
###【自動修正停止】余計な自動修正をやめさせたい
ツール
オートコレクト
## ページ番号
###【本文だけにページ番号を振りたい】表紙がある場合
[表紙] [1] [2] [3]...
(ページ設定;ヘッダとフッタ-先頭ページのみ別指定)
ページ番号を振りなおして挿入(挿入/ページ番号;書式;連続番号-開始番号を0)
###【本文だけにページ番号を振りたい】表紙と目次がある場合

[表紙][目次1][目次2]...[1][2][3]...
本文ページの前にセクション区切りを挿入（挿入/改ページ;[次のページから開始]をチェック[OK]）
本文ページだけにページ番号を振るようにする(表示/ヘッダとフッタ;本文ページのセクションを表示;[前のページと同じ]アイコンを解除)
ページ番号を振りなおして挿入(挿入/ページ番号;書式;連続番号-開始番号を１)

##入力
###【特殊文字を入力したい】英文でのダガー†、‡

”daga-", 漢字変換  or "2020", alt+x　or 
選択し、フォント切り替え
整数値をキーとしたstateパターンをtemplateで実現

StateやStrategyが何種類も出てきたらポインタのサイズが勿体ないので現在のStateをuint8_tで表現したかった。
そしてよく使う環境の都合上C++03縛り。

```cpp:main.cpp
#include <iostream>
#include <iomanip>
#include <cstdint>

using namespace std;

template <typename T>
class Singleton
{
protected:
	Singleton(){}
	Singleton(Singleton const&);
	~Singleton(){}

	Singleton& operator=(Singleton const&);

public:
	static T* getInstance()
	{
		static T i;
		return &i;
	}
};

class IState
{
public:
	IState(){}
	virtual ~IState(){}
	virtual void action() = 0;
	virtual uint8_t getNextState() = 0;
};

template<uint8_t N> class State;
template<>
class State<0> :public IState, public Singleton<State<0> >
{
public:
	void action(){ cout << "State0" << endl; }
	uint8_t getNextState()
	{
		return 1;
	}
};
template<>
class State<1> :public IState, public Singleton<State<1> >
{
public:
	void action(){ cout << "State1" << endl; }
	uint8_t getNextState()
	{
		return 0;
	}
};

template<uint8_t N>
static void initialize(IState* s[])
{
	s[N - 1] = State<N - 1>::getInstance();
	initialize<N-1>(s);
}
template<>
static void initialize<0>(IState* s[])
{
	s[0] = State<0>::getInstance();
}

class StateMachine
{
public:
	static const int N = 2;
	StateMachine():cur_()
	{
		initialize<N>(states_);
	}
	void transit()
	{
		states_[cur_]->action();
		cur_ = states_[cur_]->getNextState();
	}
private:
	IState* states_[N];
	uint8_t cur_;
};


int main(int argv, char* argc[])
{
	StateMachine state;
	state.transit();
	state.transit();
	state.transit();
	return 0;
}
```

Singletonクラスは以下のページを参考にさせていただきました。
http://d.hatena.ne.jp/setuna-kanata/20090225/1235570379

states_の初期化がもっと綺麗にならないものかなぁ。C++11使いたい。
AWS Redshift, AWS Kenesis 覚書

# AWS Kenesis

##基本機能
SQSのようにデータをためる。取得しても２４時間残る。
大量に連続して発生するストリーミングデータをAWS上に格納するための受け口となる、フルマネージドサービスです。 高い信頼性、耐久性と、コストパフォーマンスに優れたバッファとして利用する事ができます。

### Q: Amazon Kinesis と Amazon SQS の違いは何ですか?

Amazon Kinesis では、ストリーミングビッグデータをリアルタイムで処理できます。レコードを並べ替えることができ、複数の Amazon Kinesis アプリケーションに対して同じ順序でレコードを読み取ったり再生したりできます。Amazon Kinesis クライアントライブラリ（KCL）は特定のパーティションキーに対するすべてのレコードを同じレコードプロセッサに提供し、同じ Amazon Kinesis ストリームから読み取る複数のアプリケーションの構築を容易にします（たとえばカウント、集計、フィルタリングの実行など）。

Amazon Simple Queue Service（Amazon SQS）は、コンピューター間でやり取りされるメッセージを保存するための、信頼性のある、拡張性の高い、ホスティングされたキューを提供しています。Amazon SQS を使用すると、分散したアプリケーションコンポーネント間でデータを簡単に移動でき、自動化されたワークフローのようなメッセージレベルでの確認/失敗セマンティクスを備えたメッセージを独立して処理するアプリケーションを構築できます。

### Q: Amazon Kinesis および Amazon SQS はそれぞれどのような場合に使用する必要がありますか?

Amazon Kinesis は次のような要件のユースケースに推奨されます。

関連性のあるレコードを同じレコードプロセッサにルーティングする場合（MapReduce のストリーミングなど）。たとえば、特定のキーに対するすべてのレコードを同じレコードプロセッサにルーティングすると、カウントや集計が簡単になります。
レコードを並べ替える場合。例えば、ログステートメントの順序を維持しながら、アプリケーションホストから処理/アーカイブホストにログデータを転送できます。
複数のアプリケーションが同じストリームを同時に使用する機能。例えば、リアルタイムダッシュボードを更新するアプリケーションと、データを Amazon Redshift にアーカイブするアプリケーションがあるものとします。両方のアプリケーションで、同じストリームからのデータを同時に、独立して使用できます。
レコードを数時間後に同じ順序で使用する機能。例えば、請求アプリケーションと、請求アプリケーションから何時間か後に実行する監査アプリケーションがあるものとします。Amazon Kinesis はデータを最大で 24 時間保管するので、請求アプリケーションより最大 24 時間後に監査アプリケーションを実行できます。
Amazon SQS は次のような要件のユースケースに推奨されます。

メッセージングセマンティクス（メッセージレベルの確認/失敗など）および可視性タイムアウト。例えば、作業項目のキューがあり、各項目の正常な完了を個別に追跡するものとします。Amazon SQS は確認/失敗を追跡するので、アプリケーションでは永続的なチェックポイント/カーソルを保持する必要がありません。Amazon SQS は、確認されたメッセージを削除し、失敗したメッセージは設定されている可視性タイムアウトの後で再配信します。
個別メッセージの遅延。例えば、ジョブキューがあり、遅延のある個別のジョブをスケジュールする必要があるものとします。Amazon SQS では、個々のメッセージに最大で 15 分の遅延を設定できます。
読み取り時における同時性/スループットの動的な拡張。例えば、作業キューがあり、バックログが解消されるまでリーダーを追加する必要があるものとします。Amazon Kinesis では、十分な数のシャードに拡張できます（ただし、前もって十分なシャードを準備しておく必要があります）。
Amazon SQS の機能を利用した透過的な拡張。例えば、負荷の一時的な上昇や事業の自然な成長の結果として、バッファ要求や負荷が変化するような場合です。各バッファ要求は個別に処理できるので、ユーザーがプロビジョニングを指示しなくても、Amazon SQS は透過的に拡張して負荷を処理できます。


# AWS Redshift

##基本機能
クラウド上のDWH。
データウェアハウスとは、直訳すれば「データの倉庫」である。利用者により定義範囲は異なるが、一般に時系列に整理された大量の統合業務データ、もしくはその管理システムを指す。

Amazon Redshiftは、PostgreSQL8.0.2に準拠した環境・技術仕様となっています。ですので、PostgreSQLをこれまでに扱っていた場合であれば特に意識せず扱える事が出来ますし、そうでない場合でもPostgreSQLの情報を参考にRedshiftの学習や実践を行なう事が出来ます。

そのため、Amazon Redshiftで諸々の作業を行なう際には、CUIであればPostgreSQLのpsqlコマンドがそのまま活用出来ます。

## 特徴
MPP:Massive Parallel Processing
１つのタスクをリーダーノードがコンピュートノードに分散して処理する。

シェアードナッシング：ディスクをノードで共有しない。
ノード追加時はノードとディスクがセットで増えていく。シェアすると追加時の処理が大変になるため。

スライス：メモリとディスクを処理単位で分割した論理的な処理範囲

##まとめ
トランザクションがたくさん来るケースではなく、
データ格納として利用する。
vectorの初期化

#動機

OpenGLとかを使ってると大量の頂点情報をvectorに格納するとかをよくやらなきゃいけないんだけど。どうやったら美しく、高速にできるか考えてみた。


注）時間を計るために、

```
using namespace std::chrono;

class StopWatch{
public:
    void start(){timeStamp = system_clock::now();};
    double stop(){return (system_clock::now()-timeStamp).count();};
    
protected:
    time_point<std::chrono::system_clock>  timeStamp;
};
```

こんなクラスを作って使ってます。

また、vectorに格納するクラスは以下。

```
struct Vertex{
    Vertex(const float &x = 0.0, const float &y = 0.0, const float &z = 0.0):
    x(x),y(y),z(z){}
    float x,y,z;
};
```





### push_back

参考のためにpush_backで10万個の頂点を初期化。

```
sw.start();
std::vector<Vertex> vertices;
for(int i = 0; i < 100000; i++){
    vertices.push_back(Vertex(0,0,0));
}
std::cout << "push_back:" << sw.stop() << std::endl;
```

処理時間4475マイクロ秒。

### reserve + push_back
reserveで許容量を指定してからpush_backすれば、若干早くなるのではと思いやってみる。

```
sw.start();
std::vector<Vertex> vertices;
vertices.reserve(100000);
for(int i = 0; i < 100000; i++){
    vertices.push_back(Vertex(0,0,0));
}
std::cout << "push_back(reserve):" << sw.stop() << std::endl;
```

処理時間2422マイクロ秒。断然速い。reserveやらない手はないんだな。


### emplace_back
```
sw.start();
std::vector<Vertex> vertices;
for(int i = 0; i < 100000; i++){
    vertices.emplace_back(0,0,0);
}
std::cout << "emplace_back:" << sw.stop() << std::endl;
```
処理時間3304マイクロ秒。自分でインスタンスを作るよりも速い。

`vertices.push_back(Vertex(0,0,0));` を
`vertices.push_back(std::move(Vertex(0,0,0)));`
に置き換えると、大体同じくらいの速さで実行されるので、emplace_backは多分コピーしてないため速いのかな？

### emplace_back + reserve

```
sw.start();
std::vector<Vertex> vertices;
vertices.reserve(100000);
for(int i = 0; i < 100000; i++){
    vertices.emplace_back(0,0,0);
}
std::cout << "emplace_back(reserve):" << sw.stop() << std::end;
```

2619マイクロ秒。単純なpush_backに比べると二倍の速さ、emplace_backとreserveを組み合わせるのが多分一番高速。


## 全て同じ値で埋める場合

全て同じ値でvectorを埋める場合は、コンストラクタの機能を使え、さらなる高速化ができる。

### default_insert
デフォルト・インサートによる初期化。コンストラクタは全てデフォルト値が設定してあるので可能。

```
sw.start();
std::vector<Vertex> vertices(100000);
std::cout << "default insert:" << sw.stop() << std::endl;
sw.stop();
```

処理時間1639マイクロ秒。

###fill

fillによる初期化。

```
sw.start();
std::vector<Vertex> vertices(100000, Vertex(0,0,0));
std::cout << "fill:" << sw.stop() << std::end;
```
1303マイクロ秒。面白いことに、デフォルト値を使うより速い。

##考察

簡単にいうと、入れる値が全部同じなら、当たり前だがコンストラクタの（サイズ、値）を入れるのが一番速いようだ。この時にデフォルト値の使用は遅くなる。

要素数がわかっているなら、reserve + emplace_backのコンボが最強。


##
kaminari:views系のコマンドでSSLErrorが発生する（Windows）

### エラー内容

```
> rails g kaminari:views bootstrap3
Usage:
C:/RailsInstaller/Ruby2.2.0/lib/ruby/2.2.0/net/http.rb:923:in `connect': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::
SSL::SSLError)
        from C:/RailsInstaller/Ruby2.2.0/lib/ruby/2.2.0/net/http.rb:923:in `block in connect'
:
```

### 解決策
https://gist.github.com/fnichol/867550

1. 証明書ファイルをダウンロードし、適当な場所に置く
http://curl.haxx.se/ca/cacert.pem

2. システム環境変数に追加し、コマンドプロンプトなどを再起動
 SSL_CERT_FILE : C:\RailsInstaller\cacert.pem
 RubyMineの場合は、Settings → Server Certificates に上記ファイルを追加。

以上で rails g kaminari:views系コマンドが正常に動作するようになる。

### 環境
Windows7
RailsInstallerでインストール
 - Ruby2.2.4
 - Rails4.2.5
kaminari (0.16.3)
Laravel5.2 で常にログインしてるかチェックしたいとき

```lang:route.php

Route::get('/user/my', ['middleware' => 'auth', 'uses' => 'UserController@my']);

```

routing に middleware で auth を使うように指定。
そしたら app/Http/MiddleWare/Authenticate で

```lang:app/Http/Middleware/Authenticate.php

return redirect()->guest('user/login');

```
好きなところに送ってやればよい
consul [インストール〜設定〜クライアント（ジョイン）]

# [Consul](https://www.consul.io/)
* consulはサービス監視が可能なオーケストレーションツール
* 呼び方はカンサル（コンサルとも呼ばれる）
* serfでもクラスタリングできるが、serfはserfエージェントの活性のみ監視する。consulはサービス検出機能を持ち、それらが正常か異常かを確認できる為、任意のサービスを監視し、トリガー発動でコマンド実行するといったことができる。
* 1つのバイナリファイルで実行し、起動時にサーバかクライアントかを選択する、LinuxH/Aと比べて構成部品が少なく、構築コストが低い。
* サーバは主にクライアントの情報を蓄積し、要求があった場合に回答する。

イメージ
![cloudcraft - consul.png](https://qiita-image-store.s3.amazonaws.com/0/58788/8d0f6567-cbd1-1886-0476-997e5db2939b.png)
***

#設定
* パッケージで配布されていない為、バイナリファイルをダウンロード

```bash
$ wget -O consul_0.6.4_linux_amd64.zip https://releases.hashicorp.com/consul/0.6.4/consul_0.6.4_linux_amd64.zip
$ unzip consul_0.6.4_linux_amd64.zip
$ sudo cp consul /bin
$ sudo consul version
Consul v0.6.4
Consul Protocol: 3 (Understands back to: 1)
$ sudo rm consul_0.6.4_linux_amd64.zip
```
* Web-UIファイルも別途ダウンロード

```bash
$ sudo mkdir -p /var/www/consul-web-ui
$ cd /var/www/consul-web-ui
$ sudo wget -O consul_0.6.4_web_ui.zip https://releases.hashicorp.com/consul/0.6.4/consul_0.6.4_web_ui.zip
$ sudo unzip consul_0.6.4_web_ui.zip
$ sudo rm consul_0.6.4_web_ui.zip 
```
* サービス定義jsonを置くDir作成し、Web-UI用を作成

```bash
$ sudo mkdir /etc/consul.d && cd /etc/consul.d
$ sudo vim web_ui.json
{
	"ui_dir":"/var/www/consul-web-ui",
	"addresses":{"http":"0.0.0.0"}
}
```

# consul-server起動
```bash
$ consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node=consul-server -bind=10.0.1.155 -config-dir /etc/consul.d &
```

```text
consul agent -server:エージェントをサーバ状態にする
-bootstrap-expect=1：consulサーバを1台で構成することを明示的に記述
-data-dir：データ保管場所を記述
-bind：複数のNICがある場合にIP指定
-node:表示名
-data-dir:サービス定義json格納DIR
```

## 確認
```bash
$ sudo consul members
Node           Address          Status  Type    Build  Protocol  DC
consul-server  10.0.1.155:8301  alive   server  0.6.4  2         dc1
```

# consul-client起動
ファイルダウンロード〜はconsul-serverと同じ手順を踏む（Web-uiファイルは不要）
server~client間はtcp:8300,8301を明示的に許可

```bash
$ sudo consul agent -data-dir=/tmp/consul -node=consul-node1 -bind=10.0.0.90 -join=10.0.1.155 &
```

```text
-join:consulサーバのIP
```

## クラスタへジョインされたことを確認

```bash
$ sudo consul members
Node           Address          Status  Type    Build  Protocol  DC
consul-node1   10.0.0.90:8301   alive   client  0.6.4  2         dc1
consul-server  10.0.1.155:8301  alive   server  0.6.4  2         dc1
```

# web-ui
8500ポート指定して接続

```http
http://<server-hostname>:8500/ui
```
![Screenshot from 2016-09-10 21:39:09.png](https://qiita-image-store.s3.amazonaws.com/0/58788/b788b949-c042-66ee-dd09-e17f431e98fd.png)
Kotlinでごく簡単なAndroidアプリを作ってみる


最近KotlinでAndroidアプリを作るといい感じという話をちらほら聞くようになってきていましたが、先月Kotlinの1.0が出たということで試しに軽く触ってみました。せっかくなので手順をメモしておきます(Qiita投稿練習も兼ねて)。

[Kotlin 1.0 Released: Pragmatic Language for JVM and Android](http://blog.jetbrains.com/kotlin/2016/02/kotlin-1-0-released-pragmatic-language-for-jvm-and-android/)

# いるもの

基本的に、JDK, Android SDKそしてAndroid Studioと通常のAndroid開発で使用する環境があればKotlinをすぐ試せます。 既存の開発環境がそのままつかえるのはいいですね。今回はAndroid Studio 1.5.1で試しています。

# 開発環境準備

以下の順にすすめていけばとりあえずKotlinでAndroidアプリをビルドできるようになります。

1. Android StudioのKotlinプラグインインストール
2. 新規プロジェクトの作成(この時点ではJavaコードです)
3. JavaからKotlinへのコード変換
4. Kotlinビルドのための設定

上記のセットアップにつきましては、以下の投稿が非常に参考になりますので、こちらでは説明は割愛したいと思います。

[KotlinでAndroid](http://qiita.com/miyatay/items/be86dacde66716e8f24a)
[【Kotlin】AndroidでHello World](http://qiita.com/leegun/items/2d0b7366391518300905)

上記の手順を実施後に、Kotlin Android Extensionsをつかえるようにするためにbuild.gradleに以下のように`apply plugin: 'kotlin-android-extensions'`の一文を追加しておきます。(自分はこれで少しはまりました。もうKotlinビルド設定の時に合わせて自動で追加してくれてもいいのではないかと思いますが・・・)

[Using Kotlin Android Extensions](https://kotlinlang.org/docs/tutorials/android-plugin.html#using-kotlin-android-extensions)

```
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

(以下省略)

```

# サンプルアプリ実装（インストールアプリ一覧の表示）

試しに、端末にインストールされているアプリ名のリストを表示して、アプリ名をタップするとアプリ名をトースト表示するだけの簡単なアプリを作ってみました。

![appimage.png](https://qiita-image-store.s3.amazonaws.com/0/9566/621ec7bf-1ed8-d308-b739-b6663c59b905.png "appimage.png")


以下がコードになります。初期コードからほんの数行追加しただけでできてしまいました。まさかこれだけでできるとは思いませんでした・・・

```
package org.sheep.kotlinapplist

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        listView.adapter =
                ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,
                        packageManager.getInstalledApplications(0).map { it.loadLabel(packageManager).toString() })
        listView.onItemClickListener =
                AdapterView.OnItemClickListener { parent, view, pos, id ->
                    Toast.makeText(this, parent.getItemAtPosition(pos) as String, Toast.LENGTH_SHORT).show()
                }
    }
}
```

以下解説という程でもないですが、便利だと思われるところについて書いてみたいと思います。

* widgetはリソースIDを変数名としてそのまま呼び出せる

上記サンプルの`listView`のように、基本的にリソースIDを変数名としてそのまま呼び出せてしまいます。findViewById()どころか変数定義すら不要です。

* PackageManagerも簡単に呼び出せる

上記サンプルですと`packageManager`という変数名で呼び出すことができます。こちらもgetPackageManager()の呼び出しが不要です。

* Java8でないと使えないような機能がつかえる

これはやはりKotlinを使う一番のメリットではないでしょうか。上記のサンプルでもラムダ式を使っています。また、map()といったコレクションメソッドもありますので、それらを使うことで実装がさらにすっきりしています。

# 感想

当初は、便利とはいえまあそこそこコードは書かないといけないのでは無いかと思っていたのですが、実際に作ってみるとあまりのコード量の少なさに驚きました。今回は小さなアプリでしたのでまだKotlinの真の素晴らしさを体感するまでには至っていないかとは思いますが、今後もぜひ使っていきたいですね！
全ソースファイルに一括で変換入れた

# やりたい
## utf-8使用の明示的宣言
全ファイルをレガシーRuby対応のために
`# coding: utf-8`
を挿入する

## 利益
既存ソースのレガシーRubyでの稼働

## 懸念
知り合いのRubyコミッターにコロコロされる

# やりたくない
ひとつひとつファイルを開いて人手による温かみのある挿入作業

# やった
## 静的解析
自動で解析＆変換
静的解析により、ソースディレクトリを再帰的に探索し、１行目にutf-8を宣言していないファイルは挿入

## コード
```
require "pathname"
def dig_dirs(dirs)
  Dir.glob("./src/**/*.rb").each {|d|
    add_utf8_if(d)
  }
end

def add_utf8_if(d)
  utf_enc = "# coding: utf-8"
  edited_lines = utf_enc + "\n"
  File.open(d, 'r') do |file|
    file_text = file.read
    file_text.each_line do |line|
      line.include?(utf_enc)
      throw(:assert_break) if line.include?(utf_enc)

      edited_lines += line
    end
  end

  IO.write(d, string)
end
dig_dirs(dirs)

```