OmniAICreator/Qiita-1.07M huggingface dataset:
MacBookのF1キーをfnキーに置き換えて快適生活


# はじめに
英語キー配列のMacbookを使用していていつも残念なのが、左下隅のfnキーの異様な押しづらさ。自分の場合、矢印キーの使用を避けるためにfn + HJKL で vim的に上下左右に移動できるよう [Karabinar](https://pqrs.org/osx/karabiner/index.html.ja) を設定していて頻繁に使用するのでなおさら。

そこでいろいろ試した末、同じKarabinarを使用して、F1キーをつぶしてfnキーに置き換えてみた。Karabinarの設定で`Misc & Uninstall` タブにある `Open private.xml` でこのxmlファイルを開き、以下のように記入する。

```
<?xml version="1.0"?>
<root>
  <item>
    <name>F1 to fn</name>
    <identifier>f1_to_fn</identifier>
    <autogen>
      __KeyToKey__
      KeyCode::F1,
      KeyCode::FN
    </autogen>
  </item>
</root>

```

`Change Key`タブで`Reload xml`を押して上が読み込まれたら、`F1 to fn`チェックボックスをオンにする。F1キーがfnになったことでfnキー操作が一気にやりやすくなった。万歳。ファンクションキーはカタカナ変換のF7ぐらいにしか使ってないので何の支障もない。

なお、MacBookの画面の明るさ操作がF1とF2に割り当てられているけど、この動作には何の変化もないので、従来通り元の`fn+F1`で画面を暗くできる。ありがたいことです。
ClojureでJubatusその３（Regression：回帰）

ClojureからJubatusのRegression（回帰）を使ってみるサンプルです。
公式サイトの http://jubat.us/ja/tutorial/regression.html のClojure版です。
賃貸情報から回帰モデルを作成して、家賃を推定するプログラムになっています。
回帰とは$y = a_0 + a_1 x_1 + a_2 x_2 + ... $などの式で、実際の値とその式（近似式）が漸近するような係数$a_0 , a_1 , a_2...$を求めるものです。

動作に必要なrent.jsonとrent-data.csvは上記リンク先からどうぞ。

`jubaregression -f rent.json`でJubatusサーバを起動しておけば以下のサンプルを実行できます。
myhome.ednファイルは推定したい賃貸情報です。

```clj:myhome.edn
;
; distance : 駅からの徒歩時間 (分)
; space    : 専有面積 (m*m)
; age      : 築年数 (年)
; stair    : 階数
; aspect   : 向き [ N / NE / E / SE / S / SW / W / NW ]
;
{"distance" 8
 "space"    32.00
 "age"      15
 "stair"    5
 "aspect"   "S"}
```

```regression.clj
(ns jubatus-sample.regression
  (:require [clojure.java.io :as io]
            [clojure.string :as s]
            [clojure.edn :as e])
  (:import [us.jubat.regression RegressionClient ScoredDatum]
           [us.jubat.common Datum]))

(defn read-csv [file]
  (with-open [r (io/reader file)]
    (let [f #(when-not (.startsWith % "#")
               (s/split % #","))]
      (doall (keep f (line-seq r))))))

(defn map->datum [hmap]
  (let [d (Datum.)]
    (doseq [[k v] hmap]
      (condp instance? v
        String (.addString d k v)
        Number (.addNumber d k v)
        (.addBinary d k v)))
    d))

(defn ->double [v] (Double/parseDouble v))

(defn train [client csvfile]
  (let [csvs (read-csv csvfile)]
    (doseq [csv csvs]
      (let [ks ["aspect" "distance" "space" "age" "stair"]
            vs (cons (last csv) (map #(->double (s/trim %)) (rest (butlast csv))))
            datum (map->datum (zipmap ks vs))]
        (.train client [(ScoredDatum. (->double (first csv)) datum)])))
    (println "train ..." (count csvs))))

(defn estimate [client ednfile]
  (let [datum (map->datum (e/read-string (slurp ednfile)))
        result (.estimate client [datum])]
    (println "rent ...." (format "%.1f" (first result)))))

(def client (RegressionClient. "127.0.0.1" 9199 "reg" 1))
(train client "rent-data.csv")
(estimate client "myhome.edn")
```

ClassifierやRecommenderのときと流れはほとんど同じですね。
ScoredDatum[float, Datum]を複数入力して学習(train)して、Datumを入力して推定(estimate)しています。
モバイルのスクロールバーの幅を拡大するCSS

webkit系のブラウザで、::-webkit-scrollbarのwidthとheightを指定するとスクロールバーの幅を変更することができます。

```css:
::-webkit-scrollbar {
  width: 20px;
  height: 20px;
}
```
iPhoneのSafariなどで確認するとスクロールバーの幅が変更されているのがわかります。

参考：https://www.webkit.org/blog/363/styling-scrollbars/
KiwiをCocoaPodsからインストールしようとしたら、ハマった

既存のプロジェクトにKiwiを導入したくて、
CocoaPodsにKiwiをインストールさせるために以下を書いた。

```vim
platform :ios

target "App_Kiwi", :exclusive => true do #テスト用プロジェクト
    pod 'Kiwi'
end
```

そんで、プロジェクトのルートディレクトリで下記を実行。

```bash
$ pod install
Analyzing dependencies
[!] The platform of the target `App_Kiwi` (iOS 4.3) is not compatible with `Kiwi (2.2.4)` which has a minimum requirement of iOS 5.0 - OS X 10.7.
```

色々調べた結果、platformでバージョンを指定していないのが、ダメっぽい。

```vim
platform :ios, '7.1' #ここで使用しているバージョンを書く。

target "App_Kiwi", :exclusive => true do
    pod 'Kiwi'
end
```

もう一回チャレンジ！

```bash
$ pod install
Analyzing dependencies
Downloading dependencies
Installing Kiwi (2.2.4)
Generating Pods project
Integrating client project

[!] From now on use `App.xcworkspace`.
```

うまくいった！

参考URL  
http://stackoverflow.com/questions/18797180/platform-of-the-target-fubartests-ios-4-3-is-not-compatible-with-kiwi-2-2
Raspberry Pi B+にOpenCV-Python環境を構築する


## OpenCVインストール

- RasPiにOpenCV-pythonをインストール

```shell-session:RaspberryPi
$ sudo apt-get install libopencv-dev
$ sudo apt-get install python-opencv
```

- apt-getでインストールすると、現時点（2014/8/16）で2.3.1と古いversionになります。
- 最新版を入れたい方は[この辺](http://electroidea.blogspot.jp/2013/03/raspiOpencvInst.html)を参考にビルドして下さい

## 動作確認

- RasPi上で動作確認用のpythonスクリプトを作成（グレースケール変換）
- lenaはWEBから落としてきました

```python:cvTest.py
import cv2

img = cv2.imread('lena.jpg')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imwrite('lena_gray.jpg', img_gray)
```

- 実行

```shell-session:RaspberryPi
$ python cvTest.py
```

- 左が元画像、右が変換後の画像です

![RasPi_OpenCV_Python_Test.jpg](https://qiita-image-store.s3.amazonaws.com/0/16986/a772d535-435c-e1d0-cca9-ee21fad2ca39.jpeg "RasPi_OpenCV_Python_Test.jpg")


# 参考にしたサイト
- [Raspberry Pi にOpenCV をインストール](http://electroidea.blogspot.jp/2013/03/raspiOpencvInst.html)

- [DERiVE:【シリーズ】「pythonとOpenCVを用いたCVプログラミング」 第7回：OpenCVのpythonインターフェースの概要](http://derivecv.tumblr.com/post/63641006698)
SNSボタン設置

## Facebook
https://developers.facebook.com/docs/plugins/like-button

* data-layout
  * standard/box_count/button_count/button

## Twitter
https://about.twitter.com/resources/buttons#tweet

* data-count
  * なし/none

## Google+
https://developers.google.com/+/web/+1button/?hl=ja

* data-size
  * small/medium/standard/tall
*  data-annotation
  * なし/none/inline
  
## はてブ
http://b.hatena.ne.jp/guide/bbutton

* data-hatena-bookmark-layout
  * standard/standard-balloon/simple/simple-balloon/vertical
[初心者向け]Web開発時知っておくと便利な小ネタ


## Chromeで複数のセッションを使う

Chromeのシークレットウインドウ機能を使うと一つのセッション以外に別のセッションを用意できます。ただシークレットウインドウを使うだけだとメインとサブの2アカウントまでしか使えませんが、Chromeには複数のセッションを同時に使う方法も用意されているので[こちら](https://support.google.com/chrome/answer/2364824?hl=ja)を参考に設定しておくと良いと思います。下記のように任意のユーザを作成可能です。

![スクリーンショット 2014-08-16 3.32.44.png](https://qiita-image-store.s3.amazonaws.com/0/8463/3c762532-57be-d64b-7287-2d0f232344fa.png "スクリーンショット 2014-08-16 3.32.44.png")


## 1つのgmailアカウントで複数のメールを使う

複数のアカウントが必要なとき複数のメールアドレスを用意するのは面倒ですが、gmailでは```sample@gmail.com```と```sample+user1@gmail.com```は一緒です（@マークの前に+xxxxと任意の文字を書けます）。両方のメールがちゃんと```sample@gmail.com```のメールボックスに届くので複数アカウントとして使えます。
また、google appsを使っている場合（google appsのドメインが```example.com```だとします）、```sample@example.com```と```sample+user1@example.com```も同じメールボックスに届きます。

## DropboxでHTMLを公開する

DropboxにはPublicというフォルダがありますが、そこにhtmlファイルを置くとWeb上からアクセスする事が可能になります。簡単なHTML等でWeb上で公開したい時に便利ですね。

参考：https://www.dropbox.com/ja/help/16

## MacでIEテスト

macで開発していてもちゃんとIEでテストしましょう。
[VirtualBox](https://www.virtualbox.org/)と[modern.IE](https://www.modern.ie/en-us/virtualization-tools#downloads)を使えばいろんなバージョンのIEでテストできます。

## ChromeのDeveloperToolでモバイル環境をEmulate

モバイルのテストをするのに毎回モバイルで確認するのは面倒です。Chromeのモバイルemulatorを使いましょう。

![スクリーンショット_2014-08-16_3_47_01.png](https://qiita-image-store.s3.amazonaws.com/0/8463/42d6f2b1-4b9a-9178-fbdb-1ac3ee586718.png "スクリーンショット_2014-08-16_3_47_01.png")


## Androidの仮想端末を使う

Androidの開発をしているとAndroid端末が欲しくなってきますが、仮想環境で高速に動作チェックをしてみましょう。[Genymotion](iPhonehttp://www.genymotion.com/)が便利です。

<br>

その他気づいた事があればまた追記していきます。
また、他にもこんな事便利だよーとかあればコメントもらえると嬉しいです。
FGD2GeoJSON 構想

#コンセプト
基盤地図情報をウェブネイティブに変換する処理を、なるべく軽量・簡潔に行えるようにする。そのために次のような性質を備える。

##変換はストリーム処理で実施される。
- ファイル名を見ることはない。地物種類はもっぱらXMLのタグによる。このことにより、XMLファイルの一括変換や、パイプを用いての圧縮ファイルからの直接変換が実現される。
- XMLからの変換処理もストリーム処理で考える。既存の資産を活かすとすれば、SAX を使うことになるだろう。

##実装は短くコンパクトにする。
- Ruby で書く。
- 使用するライブラリは最小限に留める。Windows でも動くライブラリを使うことを心がける。
- require 'json'
- require 'nokogiri'
- ocra がまだ生きていれば ocra を使って exe 変換を試み、Windows ネイティブですら動作するようにする。
- コマンド名は fgd2geojson。大文字は使わない。
- できれば heroku でも動くようにして、さっくりとしたウェブ API にもする。
- heroku に置いたウェブ API は、File API 経由で HTML アプリケーションにしてもよい。

##違うアプローチ（Plan B）
- File API を最初に考えたとするならば、別にサーバ側 API にしなくても、全部ブラウザ内部で実施できないか。
- つまり、ドロップされたファイルを読んでDOMを展開し、GeoJSONに変換する。最後は data スキームなり使って自分自身を GeoJSON データに書き換える。
- ストリーム処理ではなくなってしまうこと、JavaScript で XML DOM を扱うことに慣れておらず、また、ブラウザでの XML DOM の処理は廃れてしまったのではないかと予想する。
- なので、この Plan B は取らず、ストリーム処理を中心とする当初案（Plan A）で検討を進める。

##後日談
この構想は、2014年の10月にひと通り実装が済んでいる。
https://github.com/handygeospatial/fgdconvert
enumをDictionaryのkeyに指定する

enumはデフォルトでHashable,Equalableが実装されているっぽいので、辞書のキーに指定できる

```swift
enum Lang {
    case Java, ObjC, Swift
}
let d = [Lang.Java: "java"]
println(d[Lang.Java]!)//=> java
```

しかし、値を持たせるとHashableに準拠していないとエラーになる。
どうやらこの場合、Hashable（とEqualableも）自分で実装しないといけないみたい。

```swift
enum Lang {
    case Java(Int), ObjC, Swift
}
let d = [Lang.Java: "java"]//Error: Type '(Int) -> Lang' does not conform to protocol 'Hashable'
```

```swift
enum Lang: Hashable {
    case Java(Int), ObjC, Swift
    
    func toInt() -> Int {
        switch self {
        case .Java(let i):
            return 0
        case .ObjC:
            return 1
        case .Swift:
            return 2
        }
    }
    
    var hashValue: Int {
        get { return toInt() }
    }
    
}

func ==(lhs: Lang, rhs: Lang) -> Bool {
    return lhs.toInt() == rhs.toInt()
}

let lang = Lang.Java(0)
let d = [lang: "java"]
println(d[lang]!)//=> java
```

値持たせる場合は素直にあきらめた方がいいかな..
CentOS7にAnsibleを入れる


CentOS7のminimal環境にインストールしたメモ。

# 関連するパッケージのインストール

とりあえずpython-develとgccがあれば大丈夫っぽい。

```bash
$ sudo yum install gcc python-devel
```

# setuptoolsとpipのインストール

pypa.ioって「ぱいぱいお」って読んじゃったんですけど、これやっぱおっぱい意識してるんですかね。

```bash
$ curl https://bootstrap.pypa.io/ez_setup.py -o - | sudo python
$ curl https://bootstrap.pypa.io/get-pip.py -o - | sudo python
```

# ansibleのインストール

sudoつけないと怒られた。

```bash
$ sudo pip install ansible
```
ListFragment で setEmptyView を使う

ListFragment を継承した Fragment を作ったとき、 ListView に要素が無い場合の EmptyView を設定したかったのですが、素直に View を作って `getListView().setEmptyView()` するだけではダメだったので備忘録として書きます。

## ともあれ結論

ListFragment の `onStart` または `onActivityCreated` で、 EmptyView として表示したい View を `((ViewGroup) getListView().getParent()).addView()` で追加しておく。

```java
@Override
public void onStart() {
    super.onStart();
    
    // View を作って
    TextView textView = new TextView(mActivity);
    textView.setText("empty");
    
    // 子ビューとして追加しておいて
    ((ViewGroup) getListView().getParent()).addView(textView);

    // EmptyView に登録する
    getListView().setEmptyView(textView);
}
```

※ ListFragment は Support Library v4 のものです。また、この ListFragment は `ActionBar.NAVIGATION_MODE_TABS` に設定した Activity で、 ViewPager の上で使っています。
Ruby | Gviz gem で graphviz を Ruby の DSL で操作し、グラフを描画する

# Ruby | Gviz gem で graphviz を Ruby の DSL で操作し、グラフを描画する

## 概要
Gviz gem で graphviz を Ruby の DSL で操作し、グラフを描画します。

導入目的は、システム開発に関わる設計資料などの図が必要な際に、
図の作成・保守をプレーンテキストで管理することです。
手動での図の作成、保守は非常に手がかかります。
プレーンテキストで管理することで、手間がかからず自動化も容易になり、
履歴管理も容易になります。

※私の職場では日常業務で、手動できっちり調整しなければならないほど見栄えが求められる機会が少ない
どちらかというと、開発者内の情報共有のため開発者が見てわかればよい。

## 手順
### graphvizのインストール
Windows7 環境にインストールします。

* 安定版の msi インストーラーを利用します。
http://www.graphviz.org/pub/graphviz/stable/windows/graphviz-2.38.msi

* インストーラーに沿ってインストール

* パスを通しておく。例えば Windows7環境にウィザードに沿っていインストールした場合は、
`C:\Program Files (x86)\Graphviz 2.38\bin` にパスを通す。

### gviz gem のインストール

~~~bash
gem i gviz --no-ri --no-doc
~~~

または bundle install

## 試行
### 仕様
OSS で構成された開発チームで利用する環境の構成図を作ってみます。
自分が環境構築を行った結果をチームメンバーと共有したり、
新たなメンバーが増えた際に説明するために利用する、と想定します。

<構成要素>

* リポジトリブラウザ => GitLab
* チャットツール => Kandan
* CIツール => GitLab CI
* CI実行 => GitLab CI
* ユーザー => User

<依存関係>

* ユーザー
    * GitLabへの push, issue の作成などを行います
    * Kandanでコミュニケーションのためのチャットをしたり、Hubotへの指示を出すためのコマンドをチャットします
    * レアケースだがCIを手動で実行する

* GitLab
    * push をトリガーとして GitLab CI へ実行を要求する
    * push/issue/merge request をトリガーとして、 Web Hook に登録してある Hubot の Webサーバーに送る

* GitLab CI
    * GitLab CI Runner へ CI の実行を要求する
    * CIの実行結果をWeb Hook に登録してある Hubot の Webサーバーに送る

* GitLab CI Runner
    * CI の実行をし、結果を GitLab CI に送る

* Hubot
    * Hubot Webサーバーから受け取ったデータをもとに Kandan にチャットメッセージを送る
    * Kandan のチャットメッセージをもとにサーバー内で任意の処理を実行したり、チャットメッセージを返却する

* Kandan
    * Hubot へScriptの実行を促すコマンドを送る

### Gviz DSL

このファイルを ruby で実行すると、
oss_agile_dev_env.dot, oss_agile_dev_env.png が生成されます。

~~~ruby
require "gviz"

Graph do
  route :Hubot => [:Kandan]
  route :Kandan => [:Hubot]
  route :GitLab => [:Hubot, :GitLabCI]
  route :GitLabCI => [:Hubot, :GitLabCiRunner, :Hubot]
  route :GitLabCiRunner => [:GitLabCI]
  route :User => [:Kandan, :GitLab, :GitLabCI]

  save(:oss_agile_dev_env, :png)
end
~~~

## 出力ファイル(dot)

~~~
digraph G {
  Hubot;
  Kandan;
  GitLab;
  GitLabCI;
  GitLabCiRunner;
  User;
  Hubot -> Kandan;
  Kandan -> Hubot;
  GitLab -> Hubot;
  GitLab -> GitLabCI;
  GitLabCI -> Hubot;
  GitLabCI -> GitLabCiRunner;
  GitLabCiRunner -> GitLabCI;
  User -> Kandan;
  User -> GitLab;
  User -> GitLabCI;
}
~~~

## 出力ファイル(png)

![oss_agile_dev_env.png](https://qiita-image-store.s3.amazonaws.com/0/43480/2294d665-2079-0477-88e8-87a79adafafe.png)
APIドキュメントを生成するためのMarkdown拡張API BluePrintとその周辺のライブラリ

[API Blueprint](
http://apiblueprint.org/)(以下Blueprint) は
MarkdownファイルからAPIドキュメントやサンプルデータになる
JSONを生成する仕様。

一旦決められたフォーマットのJSONに吐き出すので、
それを中心に入出力のライブラリが色々あったりする。

# Blueprintのパーサー

MarkdownからJSONを出力するために
[Snow Crash](https://github.com/apiaryio/snowcrash)というライブラリを利用する。

後に書くものは大体このSow Crashを利用するので詳細は省略。

# BlueprintからAPIドキュメントHTMLを生成する

Blueprintを上手く扱うために、
色々なライブラリが用意されている。

[aglio](https://github.com/danielgtaylor/aglio)はBlueprintから表示用htmlを用意してくれるライブラリ。

```bash
$ npm install -g aglio
```

```bash
# output.htmlにファイル出力
$ aglio -i input.md -o output.html

# デフォルトの http://localhost:3000 でアクセスできるAPIドキュメントサーバー起動
$ aglio -i input.md —server
```

## gulp-aglio

gulpのタスクで取り扱いたいときは [gulp-aglio](https://github.com/nnnnathann/gulp-aglio)を使う。

```js:gulpfile.js
var aglio = require('gulp-aglio');
gulp.task('docs', function() {
  gulp.src("./docs/*.md")
    .pipe(aglio({template: 'default'}))
    .pipe(gulp.dest("public")); });

```

`gulp docs`で`docs/`以下にあるマークダウンを変換して
`public/`以下に置くことが出来る。

# API Blueprintからモックサーバを立てる

https://github.com/localmed/api-mock を使うとBlueprintを元に
APIのモックサーバーを生成してくれます。

```bash
$ npm install -g api-mock
```

```bash
$ api-mock input.md
info:    Enabled Cross-Origin-Resource-Sharing (CORS)
info:         Allow-Origin: *
info:         Allow-Methods: GET, PUT, POST, PATCH, DELETE, TRACE, OPTIONS
info:         Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization, Referer, Prefer
info:    Listening on port 3000
```

他にも色々あったりするけれど、ここらへんを知っていれば
色々とカスタマイズできそうです。
quantized-mesh-1.0 terrain format の研究

三次元地理空間情報がウェブに乗らなければならない、とは言っても、三次元地理空間情報には、ざっと挙げても、次のようなさまざまな種類がある。

- DEM data
- CAD data
- point cloud
- triangle mesh (polygon mesh, with or without texture) 


ここは分割統治法を適用するべきである。また、ウェブ上に実装がある技術のみをまずは狙うべきである。

このエントリでは、三角形メッシュデータ triangular mesh data のウェブ用フォーマットとして、下記 URL で紹介されている quantized-mesh-1.0 terrain format について研究する。

## 原典
http://cesiumjs.org/data-and-assets/terrain/formats/quantized-mesh-1.0.html

## 座標系及びタイル分割方法
OSGeo TMS の global-geodetic 方式で四分木分割する。地球儀を相手にしなければならない一方、いずれにせよ座標変換をしなければならないので、そのままレンダリングできるウェブメルカトルではなく、極までカバーする global-geodetic 座標系を採用したことは合理的であろう。

## タイル命名方法
OSGeo TMS に準拠しているので、TMS 方式の命名方法に従う。すなわち、y軸は南から北に上がるタイプであり、XYZ とは逆になる。いずれにせよ、そもそも座標系が global-geodetic であることから、XYZ と混ぜて使っても混乱は少ないと思う。

## タイルコンテンツの形式
little endian のバイナリデータが gzip 圧縮されたものであるという。メッシュデータを格納するための座標の表現には、データ量を少なくするためにジグザグエンコーディングが使われているという。
ジグザグエンコーディングは、TopoJSON や MVT (mapbox/mapnik vector tile) でも使われていたと思う。
座標値は0〜32767に正規化されている（unsigned short）。これも MVT などで散見される手法である。絶対座標ではなくて、タイル内座標を使う。タイル名側にジオリファレンス情報が入っているので、絶対座標を使うことは非効率であるだけでなく、直交性を損なう。なので、タイル内座標を使うのは非常に合理的であると思う。
Content-Type としては application/vnd.quantized-mesh,application/octet-stream という。

## 関係するフォーマット
heightmap-1.0 というフォーマットもある。こちらはメッシュではなくてラスタ的なフォーマットであるように見える。
https://cesiumjs.org/data-and-assets/terrain/formats/heightmap-1.0.html
L.GeoJson.WithStyle

properties に L.GeoJson http://leafletjs.com/reference.html#geojson の path options http://leafletjs.com/reference.html#path-options が入っている GeoJSON について、当該 options を効かせた形で読み込み Leaflet 拡張（140816メモ開始）。

## Motto
GeoJSON with Style would be KML for the Web, while plain GeoJSON would be Shapefile for the Web.

## データフォーマットに関する検討
- GeoJSON の feature 一つ一つにスタイル属性を入れる手法（KMLに類似）と、ルールベースでStyleを付与していく手法が考えられるが、L.GeoJSON.WithStyle は前者のみに集中する。
- GeoJSON の properties に、即値的な path options だけではなく JavaScript function も認めること、例えば L.GeoJSON にいう style プロパティを認めること、も考えられるが、JSON の範疇を超えてしまうので、当面は考えない。

## GeoJSON.WithStyle サンプルデータ
```json
{
  "type": "Feature",
  "geometry": {
    "type": "Point",
    "coordinates": [125.6, 10.1]
  },
  "properties": {
    "name": "Dinagat Islands",
    "color": "#f00"
  }
}
```
サンプルの材料は、http://geojson.org から頂いた。

## TODO
- Qiitaでアイディアを早期共有しておくことの是非の考察
- Qiitaでアイディアを共有するパターンの検討
- Leafletでクラスを継承する方法の確認
- サンプルサイトの作成
- ブログエントリとして公開
- L.TileLayer.GeoJSON.WithStyle への展開
borderの幅を変えた時に全体幅ごと変わってしまう問題


input要素などに対してフォーカス時にborderの幅を変えたいとき、
通常だとborderの幅は全体の幅に含まれないため、borderの幅が増えた分、
要素自体の幅も大きくなってガタガタしてしまう。

これを解決するプロパティとして、

```
 box-sizing
```

というものがある。

```
 box-sizing: border-box;
```

というプロパティを追加することで、borderの幅も全体の幅に含めて考慮してくれるので、
上記の問題は解消される。
【Android】ActionBarを手軽にcustomizeする方法


アプリのメインカラーに合わせてActionBarをカスタマイズするのに便利なサイトを調べてみました。

## Color Wizard
Applicationのメインカラーに対して、合う色を教えてくれるサイト。

提案される組み合わせは一つだけではなく、色んなタイプの組み合わせを提案してくれるので、
アプリのイメージ	にあった組み合わせを選べます。

![kobito.1408112602.526456.png](https://qiita-image-store.s3.amazonaws.com/0/48787/44a80280-56b1-37cc-4b9f-a4a2f9a20b99.png "kobito.1408112602.526456.png")

http://www.colorsontheweb.com/colorwizard.asp

## Android Action Bar Style Generator

ActionBarの色をGUIで選べばresファイル以下にそのままコピー出来る形で吐き出してくれるサイト。

![kobito.1408112818.639755.png](https://qiita-image-store.s3.amazonaws.com/0/48787/555fe261-7457-8b91-1807-e19fcd82a036.png "kobito.1408112818.639755.png")


http://jgilfelt.github.io/android-actionbarstylegenerator/

## Navigation drawer indicator

Navigation DrawerのIndicatorを好きな色で生成してくれるサイト。
![navigation_drawer_indicator_generator.png](https://qiita-image-store.s3.amazonaws.com/0/48787/c2f46dd5-6020-149f-5b53-bd89828db23b.png "navigation_drawer_indicator_generator.png")

http://romannurik.github.io/AndroidAssetStudio/icons-nav-drawer-indicator.html


## おまけ
AndroidのParts Generatorは下記にまとめて紹介されています。
http://romannurik.github.io/AndroidAssetStudio/


『Android Action Bar Style Generator』と『Navigation drawer indicator』もここで紹介されていました。
もっとより良いChef-SoloのHello World

# 問題提起：chef-soloのHello Worldは手順が多すぎる

「入門Chef-Solo」に書いてあるHello Worldを馬鹿正直に実行しようとすると下記のような作業をしなければなりません。

```shell-session
$ curl -L http://www.opscode.com/chef/install.sh | sudo bash
$ git clone git://github.com/opscode/chef-repo.git
$ cd chef-repo
$ knife configure
# 質問聞かれたらエンターキーを押下
$ knife cookbook create hello -o cookbooks
```

`cookbooks/hello/recipes/default.rb` を編集

```rb:default.rb
log "Hello World"
```

`localhost.json` を作成

```json:localhost.json
{
  "run_list": [
    "recipe[hello]"
  ]
}
```

`solo.rb` を作成

```rb:solo.rb
file_cache_path "/tmp/chef-solo"
cookbook_path ["/home/ec2-user/chef-repo/cookbooks"]
```

ここまで来てやっとhello worldが実行できます。

```shell-session
$ sudo chef-solo -c solo.rb -j ./localhost.json
```

しかしこの手順、覚えられるでしょうか？
私は覚えられません。
Hello Worldの手順が、暗記できないほど多いというのは、Chefの初学者にとって非常に大きな障壁であると思います。
それぞれのコマンドが裏側で何をやっているのか、作成するファイルが何のためにあるのかが初心者にはわからないので、いわゆる「おまじない」だらけに見えます。

**もっと簡単にならんのか。**

そこで考えてみました。

# よりよいchef-soloのHello World

(まだ模索中なので随時更新します)

```shell-session
$ curl -L http://www.opscode.com/chef/install.sh | sudo bash
$ mkdir chef-repo
$ cd chef-repo
```

`solo.rb` を作成

```rb:solo.rb
file_cache_path "/tmp/chef-solo"

base = File.expand_path('..', __FILE__);
cookbook_path [ base + '/cookbooks', base + '/site-cookbooks']
```

```
$ mkdir -p cookbooks/hello/recipes
$ echo "log 'Hello World'" > cookbooks/hello/recipes/default.rb
$ sudo chef-solo -c solo.rb -o hello
```

### 改善のポイント

* "recipe[hello]" は "hello"と書ける
* localhost.jsonは不要。`-j ./localhost.json`の代わりに`-o hello`で十分
* solo.rbの`cookbook_path`に絶対パスをベタ書きしない。
* `git clone git://github.com/opscode/chef-repo.git`はいらない。`mkdir`で十分。
* `knife cookbook create hello -o cookbooks`が覚えられない。`mkdir`で十分で。
* `knife configure`はいるのか？
GoogleAnalyticsでボットやスパイダーからのアクセスを排除


アナリティクス設定からボットやスパイダーからのアクセスを排除できるようになりました。

![Google_Analytics_1.png](https://qiita-image-store.s3.amazonaws.com/0/8463/5e63661f-8dd6-226f-e4f0-bdc8cbd3a0c2.png "Google_Analytics_1.png")

とはいえ既存のボットやスパイダーからのアクセスしか排除しないのでちゃんとアクセス監視して不正なアクセスがあったら排除したいですね。
ginでginをライブリロードする


martiniの40倍速いと謳っている[gin](https://github.com/gin-gonic/gin)というGoのWAFがあります。
ライブリロード機能は内包していないため、開発中go runし直すのが面倒なので、martini作者の作った[gin](https://github.com/codegangsta/gin)というツールを使ってginをライブリロードします。

## ginのインストール
```
$ go get github.com/gin-gonic/gin
$ go get github.com/codegangsta/gin
```

## ginの仕様
ginを叩いたディレクトリにあるgoのコードが変更されると自動でリビルドし、そこにプロキシしてくれます。
ライブリロード対象は環境変数PORTでポートを指定できなければいけません。

## ginアプリを書く
```go:app.go
package main

import (
	"os"
	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()
	r.GET("/", func(c *gin.Context) {
		c.String(200, "hello")
	})

	port := os.Getenv("PORT")
	if len(port) == 0 {
		port = "3000"
	}
	r.Run(":" + port)
}
```

## ginでginアプリを動かす
```
$ go run app.go
[GIN] 2014/08/15 - 22:45:34 | 200 |     12.349us | [::1]:58191  GET /
[GIN] 2014/08/15 - 22:45:35 | 200 |      8.864us | [::1]:58191  GET /
[GIN] 2014/08/15 - 22:45:35 | 200 |      9.756us | [::1]:58191  GET /
[GIN] 2014/08/15 - 22:45:36 | 200 |      8.889us | [::1]:58191  GET /
^Cexit status 2
$ gin
[gin] listening on port 3000
[GIN] 2014/08/15 - 22:45:50 | 200 |     11.558us | ::1  GET /
[GIN] 2014/08/15 - 22:45:51 | 200 |      9.044us | ::1  GET /
[GIN] 2014/08/15 - 22:45:51 | 200 |      8.729us | ::1  GET /
[GIN] 2014/08/15 - 22:45:52 | 200 |      8.671us | ::1  GET /
```

ほぼ本来の出力で開発でき、リビルドが走っても出力が汚れません。
これで、ginによってginアプリをライブリロードしつつ開発することができます。

## まとめ
ginとgin名前がかぶっていて紛らわしいですね
Apache Sqoopを使ってみる その2

[前回のApache Sqoopを使ってみる](http://qiita.com/moris/items/d058c26c5eb6c54ebc0b)に引き続きSqoopネタです。

前回は、インポート（MySQL -> HDFS ）を試しましたが、今回は、MySQLから直接Hiveテーブルに転送します。

とは言うものの、Hiveへの転送は、--hive-importオプションをつけるだで、Hiveテーブルの作成からINSERTまで行ってくれます。

```shell-session
[root@sandbox ~]# sqoop import --connect jdbc:mysql://localhost/sqoopsample --table employees -m 1 --hive-import 

...
...

Time taken: 3.121 seconds
Loading data to table default.employees
Table default.employees stats: [numFiles=2, numRows=0, totalSize=103, rawDataSize=0]
OK
Time taken: 0.969 seconds
```

Hiveのスキーマは、データソースのテーブルのスキーマから自動決定されるようです。

```shell-session
[root@sandbox ~]# hive
Logging initialized using configuration in file:/etc/hive/conf.dist/hive-log4j.properties
hive> select * from employees;
select * from employees;
OK
1       TANAKA Ichiro   30      1984-10-10      hoge
2       TANAKA Jiro     29      1985-12-22      fuge
3       TANAKA Saburo   28      1986-08-01      null
Time taken: 2.247 seconds, Fetched: 3 row(s)
```

というわけで以上。
Pythonでリストの最後(一番後ろ)の値を取得する方法

可変でいくつまでリストの中身が存在しているのかが、叩いてみるまでわからない時に使います。

####リストの作成

`````
list = ["a", "b", "c", "d", "e"]

print list
['a', 'b', 'c', 'd', 'e']
`````

####特定のデータを取り出す

`````
print list[0]
a

print list[2]
c
`````

####データが存在しない場合

`````
print list[5]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range
`````

####一番後ろを指定する

`````
print list[-1]
e
`````

####後ろから二番目を指定する

`````
print list[-2]
d
`````

知っていればなんてことはないですが、知らないと力技になっちゃいますね・・。
Chef-SoloとVagrantfileでパスの設定方法が微妙に違うので注意しましょう

pathの設定方法が、chef-soloとVagratfileで微妙に異なります。
これを知らずにうっかりコピペしてハマることがあるので、気をつけましょう。

# chef-soloのsolo.rbで設定する場合
```rb:solo.rb
cookbook_path ["/path/to/cookbooks"]
role_path     "/path/to/roles"
data_bag_path "/path/to/data_bags"
```

* "role"のように単数形。
* シンタックスはメソッド呼び出し。

# Vagrantfileで設定する場合
```rb:Vagrantfile
chef.cookbooks_path = [ "./cookbooks", "./site-cookbooks" ]
chef.data_bags_path = './data_bags'
chef.roles_path = "./roles"
```

* "roles"のように複数形。
* シンタックスは変数への代入

という感じで、微妙に違います。
これを混同して書いてしまうとエラーになるので気をつけましょう。


(Vagrant側がsolo.rbと同じにしてくれればよかったのに・・何か深淵な理由でもあるのでしょうか)
ruby-gmailでsubjectによる絞り込みができない

ruby-gmailで絞り込みができない。。。
日付等は絞り込める。
なぜだろう？？

さいわい、オープンソースなので、コードを追ってみる。

コード上には対応が入ってる。
![ruby-gmail_mailbox_rb_at_master_·_dcparker_ruby-gmail.png](https://qiita-image-store.s3.amazonaws.com/0/51320/7849f3e8-2f69-d924-9514-c2845eeeaf6a.png)


バグか？？
Githubからコードを落として、デバッグしてみる。

絞り込めた (°Д°；

履歴を追う。
つい最近だ！！
![Merge_pull_request__65_from_jamster_master_·_5d8f5b5_·_dcparker_ruby-gmail.png](https://qiita-image-store.s3.amazonaws.com/0/51320/b8db4e87-83e7-b9ac-3ddb-d47b0832fbec.png)


yumでインストールしたものは、ここの対応が入っていなかった。（2014/08/15現在）
手動アップデートで解決★
ClojureでJubatusその２（Recommender：推薦）

ClojureからJubatusのRecommender（推薦）を使ってみるサンプルです。
公式サイトの http://jubat.us/ja/tutorial/recommender.html のClojure版です。
プロ野球の野手成績を学習し、似た成績の野手を3人推薦するプログラムになっています。
動作に必要なnpb_similar_player.jsonとbaseball.csvは上記リンク先からどうぞ。

`jubarecommender -f npb_similar_player.json `でJubatusサーバを起動しておけば以下のサンプルを実行できます。

```recommender.clj
(ns jubatus-sample.recommender
  (:require [clojure.java.io :as io]
            [clojure.string :as s])
  (:import [us.jubat.recommender RecommenderClient]
           [us.jubat.common Datum]))

(defn map->datum [hmap]
  (let [d (Datum.)]
    (doseq [[k v] hmap]
      (condp instance? v 
        String (.addString d k v)
        Number (.addNumber d k v)
        (.addBinary d k v)))
    d))

(defn- datum [values]
  (let [ks ["チーム" "打率" "試合数" "打席" "打数" "安打" "本塁打" "打点" "盗塁" "四球"
            "死球" "三振" "犠打" "併殺打" "長打率" "出塁率" "OPS" "RC27" "XR27"]
        vs (cons (first values) (map #(Double/parseDouble %) (rest values)))]
    (map->datum (zipmap ks vs))))

(def ids (atom []))

(defn update [client]
  (reset! ids [])
  (with-open [r (io/reader "baseball.csv")]
    (doseq [line (line-seq r)]
      (let [values (s/split line #",")
            id (first values)]
        (swap! ids conj id)
        (.updateRow client id (datum (rest values)))))))

(defn analyze [client]
  (doseq [id @ids]
    (let [result (rest (.similarRowFromId client id 4))]
      (println "player" id "is similar to :" (s/join "," (map #(.-id %) result))))))

(def client (RecommenderClient. "127.0.0.1" 9199 "recommender_baseball" 1))
(update client)
(analyze client)
```

`map->datum`は引数のMapのvalueの型を見て適切にDatumオブジェクトを構築する関数です。
`datum`はCSVファイルの2カラム目以降のデータをもらってそれをDatumに変換しています。
`update`はCSVファイルを読み込んで1行ずつ学習を行っています。後で使うために`id`も保存しています。
`analyze`はそれぞれの`id`ごとに（野手ごとに）似た野手を取得してプリントしています。
久々にxpへcolinuxをインストールした

vaio type pのxpにインストールした

# 準備

[sourceforge - colinux](http://sourceforge.net/projects/colinux/)

C:\Program Files\coLinux\debian\ に以下ファイル用意

* debian.bat
* debian.conf
* rootfs_2gb.img ([debian
  6.0](http://sourceforge.net/projects/colinux/files/Images%202.6.x%20Debian/Debian%206.0%20Squeeze/))

# 設定

```text:debian.conf
kernel=..\vmlinux
cobd0=rootfs_2gb.img
root=/dev/cobd0
ro
initrd=..\initrd.gz
mem=386
eth0=slirp,,tcp:22:22/tcp:80:80
```

参考: [ネットワーク - CoLinux](http://ja.colinux.wikia.com/wiki/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF)

```text:debian.bat
..\colinux-daemon.exe @debian.conf
```

# 起動

rootでログイン。パスワードは無い。
debian.batを実行。

```diff:/etc/apt/sources.list
- deb http://ftp.debian.org/debian squeeze main
+ deb http://ftp.jp.debian.org/debian/ wheezy main contrib non-free
```

```bash:
apt-get update
apt-get dist-upgrade
apt-key adv --keyserver keyring.debian.org --recv 891D7E07
apt-get update
```

```bash:
apt-get install -y openssh-server telnet sudo task-japanese vim locales w3m ack-grep curl mosh
vi /etc/locale.gen
locale-gen ja_JP.UTF-8
useradd -m owner
```

```bash:
unlink /etc/localtime
ln -s /usr/share/zoneinfo/Japan /etc/localtime
locale-gen ja_JP.UTF-8
```

```bash:一般ユーザでログイン
echo "LANG=ja_JP.UTF-8" >> .bashrc
sudo apt-get install -y postfix apache2 php5 golang ruby mysql-server mutt
```

参考: 
[coLinuxのメモ - coLinuxのインストール(0.7.x) [その8]](http://scratchpad.fc2web.com/colinux/install-0.7/install-8.html)
コマンドラインからcurlで取得するjsonを見やすく表示する

#jsonを取得と表示
コマンドラインからjsonの中味を確認する方法です。整形されて表示されるので見やすくなります。

```bash:curlからjsonを取得
curl https://example.com/hoge.json -X GET -d "token=hogehugapiyo" | python -mjson.tool
```

curlでtokenパラメータのついたjsonのAPIを叩いています。

パラメータを2つつけた場合です。

```
curl https://example.com/hoge.json -X GET -d "token=hogehugapiyo" -d "email=hoge@example.com" | python -mjson.tool
```


#参考
http://qiita.com/icb54615/items/f1fa82e7deaed5d44fbb
背景色にもとづいて前景色を選ぶ実装

もしくは逆の前景色から背景色を選択するでも良いんだけれど、掲題を例にする。

* 背景色が動的
* 明るい前景色と暗い前景色の2色を予め指定

という状態で、文字が読みやすい前景色はどちらか判断する処理について書く。

やりかた
=====

調べると色々あるみたいだけれど、今回は W3C が言及している2つの指標のうち、明度を用いたもので選んでみる。

* [Techniques For Accessibility Evaluation And Repair Tools](http://www.w3.org/TR/AERT#color-contrast)

```js
var LIGHTER_COLOR = 'white'; // 明るい前景色
var DARKER_COLOR  = 'black'; // 暗い前景色

// それぞれの明度
var LIGHTER_COLOR_BRIGHTNESS = getBrightness(LIGHTER_COLOR);
var DARKER_COLOR_BRIGHTNESS  = getBrightness(DARKER_COLOR);

// 与えられた背景色から適切な前景色を選ぶ
function getFgColor(bgColor) {    
    var b = getBrightness(bgColor);
    var deltaL = Math.abs(b - LIGHTER_COLOR_BRIGHTNESS);
    var deltaD = Math.abs(b - DARKER_COLOR_BRIGHTNESS);
    return (deltaL > deltaD) ? LIGHTER_COLOR : DARKER_COLOR;
}

// 明度を返す(min:0, max:255)
function getBrightness(colorString) {
    var o = getRgba(colorString);
    return ((o.red * 299) + (o.green * 587) + (o.blue * 114)) / 1000;
}

// これみて: http://qiita.com/k_ui/items/e6c1661158bd584a4209
function getRgba(colorString) {
    var canvas = document.createElement('canvas');
    canvas.width = 1; canvas.height = 1;
    
    var c = canvas.getContext('2d');
    c.fillStyle = colorString;
    c.fillRect(0, 0, 1, 1);

    var d = c.getImageData(0, 0, 1, 1).data;
    return {
        red: d[0],
        green: d[1],
        blue: d[2],
        alpha: d[3]
    };
}
```

* デモ: http://jsfiddle.net/g0rqz5rq/3/

背景色をいじっても、文字が見づらくなることがまず無いことが分かる。（時々怪しいのがあるけど。）

予め選んでおく前景色2色は、どの背景色から見てもどちらか一方の明度差が 125 以上になるように2色を選ぶと良いらしい。しかしソレ満たす2色って、ほぼ black / white じゃないの・・・

参考
===

* [Calculating the Perceived Brightness of a Color](http://www.nbdtech.com/Blog/archive/2008/04/27/Calculating-the-Perceived-Brightness-of-a-Color.aspx)
* [JavaScript - #rrggbb やカラーキーワード("red", "navy")など様々な色指定からRGBを導出する - Qiita]( http://qiita.com/k_ui/items/e6c1661158bd584a4209)
C言語の「配列」の仕組みを解き明かす！【初心者向け】

<img src="http://cdn-ak.f.st-hatena.com/images/fotolife/a/alex23drum/20140815/20140815184113.jpg" alt="picture">

今回はC言語における「配列」の仕組みについて説明したいと思います！

## 配列とは

みなさんご存知だと思いますが一応。
配列とは __同じ型のデータを複数並べたもの__ です。
(C言語以外の配列は違う型も同じ配列に含めることができますが...)

例えば、`int a[10]` と宣言された配列はint型の要素を10個持った配列となり、
i番目の要素には `a[i-1]` でアクセスすることができます。(0番目から始まることに注意!)

## 配列の正体

では、この配列の正体はなんなのでしょうか？
なぜ `a[i]` と書けばaのi番目の要素を取り出すことができるのでしょうか？

C言語において、配列は __連続するメモリ領域に要素を並べたもの__ として定義され、配列の要素へのアクセスは __配列の先頭要素のメモリアドレスに要素のインデックスをオフセットとして加えたアドレス__ の値を参照することで行われます。くわしく見ていきましょう。

例えば、

```c

int a[10];
for (int i = 0; i < 10; i++) {
  a[i] = i;
}
```

このように0 ~ 9の数字が格納された配列aがあったとします。
このとき、 __a__ とは、 __配列 a の先頭要素のアドレス__ を示します。

ここで、C言語では `*a` は __ポインタaの指すアドレスの中身__ を表すため、
__a[0]__ すなわち配列の最初の要素は __*a__ とも書けます。
では、a[1]は何を指しているのでしょうか？？
さきほど配列は連続するメモリ領域に要素を並べたものと述べました。
すなわち、 __配列aの要素a[1]が格納されているアドレスは、要素a[0]の次のアドレス__ となっています。
例えば、a[0]のアドレスが1000だったとすると、a[1]は1001、a[2]は1002、、というように連続しています。

ここまで分かれば、配列のほとんどが分かったようなものです。
__a[1]は何を指しているのでしょうか？？__ という答えは、__*(a + 1)__ を指しているというのが正解です。
a[2]なら `*(a + 2)` 、a[3]なら `*(a + 3)` ... という具合に、a[i]は __*(a + i)__ を示しています。

このように、C言語では、本来ならば __*(a + i)__ と書くべきところを、
メモリアドレスを指定するポインタを直接操作することは誤りの原因となることが多いという理由から、
a[i]と書けるようになっています。
すなわち、
` a[i] = *(a + i)` なので、`i[a]`と書いても同じ結果が得られます。
(もちろん誤解を生む書き方なのでやめたほうがいいですが^^;)

ちなみに、このようにプログラムの意味としては同じものを、よりわかりやすい構文で書けるものを __糖衣構文__ と言います。

以上です。お疲れ様でした！！

## ブログやってます！

[その時凡人が動いた](http://alex23drum.hatenablog.com)
TouchSlopを取得する

slopは直訳すると「こぼれ水」とか「ぬかるみ」。

```
int slop = ViewConfigration.get(this).getScaledTouchSlop();
```

タッチで差分があったときに、slop以上の場合はイベント発火するで！みたいな使い方をします。(16dpとか固定値でもいいと思いますが。)

具体的な例としてはViewPagerで横スライドするときの判定で使われてます。
http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.1_r1/android/support/v4/view/ViewPager.java

ちなみにViewConfigrationにはオーバースクロールやダブルタップのSlop取得とか色々ある。端末毎の差異は困るときが訪れたら調べる。
http://developer.android.com/reference/android/view/ViewConfiguration.html
Rasberry Pi B+始めました

#概要
連休なので、気になっていたRasberyy Pi B+を手に入れました！
予定ではこのRasberruy Piを使って、家にあるメインサーバの起動とやラジオのエアチェック（主にWake On Lan）を行いたいと考えています。
その他はUSBカメラを使って監視してみたり、リモコンツールを使ってエアコンの電源を自動投入などを考えています。

#購入と組み立て
特に組み立てというものはないのです、microUSB type b（スマホ充電に使う最近の小さく薄いUSB）をつなげば電源が入りますし、HDMIをつなげれば映ります。
大したことは無いですがソコソコ熱を持つみたいで、室温３０度にベタ置きで放置してると５０度まで上がっていました。
そこで１００均のブックエンドとねじ類（総額８００円）でこんなの作りました！

##成果物
![WIN_20140815_174841.JPG](https://qiita-image-store.s3.amazonaws.com/0/32577/5bd4defd-32a7-96bf-31e9-96f55fffcda3.jpeg)![WIN_20140815_174854.JPG](https://qiita-image-store.s3.amazonaws.com/0/32577/c01dcfa6-d64f-f1fc-9e95-70bd559a9b46.jpeg)![WIN_20140815_174908.JPG](https://qiita-image-store.s3.amazonaws.com/0/32577/20e63afa-27eb-7e7d-ff94-9093ce3b50e0.jpeg)

##部品と費用
![WIN_20140815_180429.JPG](https://qiita-image-store.s3.amazonaws.com/0/32577/ec47460a-9631-bb3c-1165-b546a31e4d4a.jpeg)

|部品名|値段（税込み）|
|:--|:--|
|ブックエンド|１０８￥|
|ステンなべ小ねじ　M3x35|１５９￥|
|真中高ナット　M3x10|１５９￥|
|プラスチックなべ小ねじ　M3x10|１５９￥|
|（ダイヤモンドヤスリ）|３２１￥|

Rasberry Piのネジ穴は経２ミリのため、M3のネジは入りません、、、でもホームセンターは大抵M2のネジはほとんど扱っていないので、Rasberry Piのネジ穴を拡張する方を考えたほうがコストが抑えられます。
なので、ダイヤモンドヤスリというえんぴつ型のヤスリを買いました。

#OS

##OSの種類
RASPBIAN・PIDORA・OPENELEC、、、いろいろありますが、ミテクレが結構整っていて、yumが使えるFedora系の**PIDORA**がお勧めです。
（安定重視ではDebianがおすすめという記事をよく見ますが、これまでFedoraで落ちたことはありません）
あと、Rasberry PiのオフィシャルサイトからOSを落とすと何故かzipが壊れてたりハッシュが違ったりと気持ち悪いので、More info +リンクの配布先から落としたほうが健康的です。

##OSのインストール
オフィシャルサイトの通りzipを解凍して出てくるimgファイルを、[Win32DiskImager](http://sourceforge.jp/projects/sfnet_win32diskimager/)を使ってmicroSDに書き込みます。
ちなみに使っているmicroSDは[ranscend microSDHCカード 32GB Class10 UHS-I対応 (無期限保証) TS32GUSDU1E (FFP)](http://www.amazon.co.jp/gp/product/B00CES44EO/ref=as_li_tf_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B00CES44EO&linkCode=as2&tag=wakisuke-22)です。
[Wiki](http://elinux.org/RPi_SD_cards)にはRasberry Piに使えるSDの報告一覧もありますので、そちらを参考にされたほうがいいかもしれません。
（３２Gのを買いましたが、今ですら４Gしか使っていませんｗ）

##インストール・設定

###エディタ

デフォルトエディタがnanoのようで、visudoをした場合viなのにnanoということになってます・・・。
なのでさくっとviを入れてデフォルトエディタを変更します。

```bash
apt-get update
apt-get install -y vim
```

```bash
update-alternatives --config editor
```
fio-statusログ(ioDrive2)

# fio-status -a 実行結果ログ

Found 1 ioMemory device in this system
Fusion-io driver version: 3.1.5 build 126

Adapter: Single Controller Adapter
        Fusion-io ioDrive2 785GB, Product Number:FXXXXXXXXXXXXXXXXXXXXX, SN:XXXXXXXXX, FIO SN:XXXXXXXXX
        ioDrive2 Adapter Controller, PN:XXXXXXXXXXX
        External Power: NOT connected
        PCIe Bus voltage: avg 12.05V
        PCIe Bus current: avg 0.75A
        PCIe Bus power: avg 9.03W
        PCIe slot available power: 75.00W
        PCIe negotiated link: 4 lanes at 5.0 Gt/sec each, 2000.00 MBytes/sec total
        Connected ioMemory modules:
          fct0: Product Number:FXXXXXXXXXXXXXXXXXXXXX, SN:XXXXXXXXX

fct0    Attached as 'fioa' (block device)
        ioDrive2 Adapter Controller, Product Number:FXXXXXXXXXXXXXXXXXXXXX, SN:XXXXXXXXX
        ioDrive2 Adapter Controller, PN:XXXXXXXXXXX
        SMP(AVR) Versions: App Version: 1.0.15.0, Boot Version: 0.0.3.1
        Located in slot 0 Center of ioDrive2 Adapter Controller SN:XXXXXXXXX
        Powerloss protection: protected
        PCI:25:00.0, Slot Number:27
        Vendor:1aed, Device:2001, Sub vendor:1aed, Sub device:2001
        Firmware v7.0.0, rev 107322 Public
        785.00 GBytes block device size
        Format: v500, 1533203125 sectors of 512 bytes
        PCIe slot available power: 75.00W
        PCIe negotiated link: 4 lanes at 5.0 Gt/sec each, 2000.00 MBytes/sec total
        Internal temperature: 49.22 degC, max 60.54 degC
        Internal voltage: avg 1.01V, max 1.02V
        Aux voltage: avg 2.50V, max 2.51V
        Reserve space status: Healthy; Reserves: 100.00%, warn at 10.00%
        Rated PBW: 11.00 PB, 98.65% remaining
        Lifetime data volumes:
           Physical bytes written: 148,696,661,802,960
           Physical bytes read   : 324,584,623,465,336
        RAM usage:
           Current: 683,971,072 bytes
           Peak   : 693,322,752 bytes
LPC1114でPWMする

2014/08/16追記
mbedライブラリの最新版で解決されています。
ライブラリのRev86以降（mbed-srcではRev285以降）を使えば下記の問題は発生しません。Toyowataさんより情報を頂きました。
https://github.com/mbedmicro/mbed/pull/371



1114でPWMしてみました。
ちょい不満有り。
LPC1768のmbedでは問題無いんだけど1114では細かいパルスが出る。
write(0.0)とした後に少しコードを追加して解決。

http://nora66.com/mbed/cpuman.html#2014/08/04

mbedのAPIって、CPUが変わると同じ動作をしないことがあるんすね。
結局はCPUのユーザーズマニュアルを読むハメになってしまう･･･うう
#rrggbb やカラーキーワード("red", "navy")など様々な色指定からRGBを導出する

CSS の色指定はいろんな方法ができていて、そこからRGBを求めるのには一筋縄では行かない感じがあるので、それを何とかする方法。

これができると、こういうことができるので別で書いた。

* [JavaScript - 背景色にもとづいて前景色を選ぶ処理 - Qiita]( http://qiita.com/k_ui/items/f8c4077dafa1a41626c6)

問題
====

`#rrggbb` や `rgba(...)` だけならパースすれば良さそうだけれど、`black`, `red` など [カラーキーワードによる指定はたくさん種類がある](http://www.w3.org/TR/css3-color/#svg-color) ので入力が面倒。

解決方法
=======

なので一度、不可視な `canvas` に対象の色を置いてしまってRGBをとる:

```js
// 与えられた色指定文字列から、RGB（ついでにアルファ）を返す
function getRgbaFromString(colorString) {
    var canvas = document.createElement('canvas');
    canvas.width = 1; canvas.height = 1;
    
    var c = canvas.getContext('2d');
    c.fillStyle = colorString;
    c.fillRect(0, 0, 1, 1);

    var d = c.getImageData(0, 0, 1, 1).data;
    return {
        red: d[0],
        green: d[1],
        blue: d[2],
        alpha: d[3]
    };
}
```

使ってみる:

```js
['black', 'cyan', 'rgb(123, 23, 0)',
 '#3399ff', 'rgba(255, 255, 255, 0.6)'
].forEach(function(e) {
    var o = getRgbaFromString(e);
    var a = [o.red, o.green, o.blue, o.alpha]
    console.log('%s:\t%s', e, a.join(', '));
})
```

```
black:	0, 0, 0, 255
burlywood:	222, 184, 135, 255
rgb(123, 23, 0):	123, 23, 0, 255
#3399ff:	51, 153, 255, 255
rgba(255, 255, 255, 0.6):	255, 255, 255, 153 
```

できてるっぽい。

* デモ: http://jsfiddle.net/8b6081hm/3/

呼び出し頻度が多いなら、毎回 canvas 要素を作るのはやめた方が良さそう。

注意
====

ただこのやり方は:

* canvas が解釈するカラーキーワード
* HTML/CSS が解釈するキーワード

の2つが同じものであるという仮定に基づいているので、2つにズレがあると思ったとおりに動かない。
Dockerを使ってビルドをする。そしてJenkinsへ・・・

仮想化技術Dockerの登場でお手軽に仮想マシンを作成、配布できるようになりました。Circle CIとかもDockerに対応したわけだし、積極的にJenkinsでもDockerを利用してビルドやテストを行った方が良いのではないかなというお話。

## なぜDockerを利用するのか

### 環境を汚さないですむ

場合にもよりますが、Jenkinsが実行しビルドをする環境は結構汚れます。同じ言語やフレームワークでも様々なバージョンがインストールされていたりで管理が難しくなります。その結果、意図しない変更によってビルドやテストに失敗し、原因特定に時間がかかったりするとなんかもう無駄です。Dockerを利用して作成した仮想マシンの中にビルドのためのコンパイラやフレームワークをインストールしておけば環境が汚れることはありません。

### 開発環境と同じ環境でビルドやテストができる

自分のマシンではテストが通ったのに、Jenkinsでは落ちた。みたいなことが減ります。Jenkinsの場合、ビルドに失敗するとコードに問題があるのか設定に問題があるのかはたまたJenkinsが動いているマシンに問題があるのか、たまにハマります。そういうのがなくなります。
また、Windows,MacあるいはLinuxがバラバラの環境でもみんなで同じDockerfileを利用することで、これまたみんなで同じ環境が利用できます。

## という訳でやってみた

今回はSphinxでドキュメントを作る環境を整えます。「テストがー」とか言っておきながら、いきなりテスト関係ないっていうね。

開発するマシンにインストールするのは

 - Docker あるいは boot2docker
 - Make
 - Sphinx

ただしSphinxが必要になるのは最初のSphinxプロジェクトを作る場合のみで、プロジェクトの作成を行わない環境ではインストールは不要です。


とりあえず、Sphinxでプロジェクトを作ります。


	$sphinx-quickstart

プロジェクトができたら、プロジェクトのルートディレクトリにDockerfileを作ります。

```
FROM ubuntu

RUN sudo apt-get -y update && \
    sudo apt-get -y upgrade && \
    sudo apt-get -y install python-sphinx make
   
ADD . /usr/local/etc/doc
WORKDIR /usr/local/etc/doc
CMD make html
```

UbuntuにSphinxのインスールを行いました。さて次にDockerMakefileを用意します。


```makefile
date=$(shell date +%s)
doc:
	docker build -t doc .
	docker run --name="doc$(date)" doc
	docker cp doc$(date):/usr/local/etc/doc/build/html .
```


ここまでで準備は終わりです。あとはドキュメントを編集して

	make -f DockerMakefile doc

とすれば`./html`に成果物としてファイルが出来上がります。

### そしてJenkinsへ

Jenkinsがビルドを行うホストにDockerをインストールし、JenkinsユーザーからDokcerが利用できる状態にしておきます。その後、SCMの設定とかをやってビルドタスクの「シェルの実行」で

	make -f DockerMakefile doc 

を指定するだけです。Jenkinsの設定も楽になりました。

## 課題

さて、今回作ったMakefileではビルドの度にImageの作成とContainerの作成を行っています。適当なタイミングで利用し終わったImageやContainerを削除した方がいいかもしれません。

## まとめ

Docker便利
MYSQLで歯抜けな連番(シーケンス)を見つける

#歯抜けな連番を見つける

pgsqlには連番を生成するgenerate_seriesがあるので生成された連番と歯抜けな表を結合することで容易に歯抜けな連番を探ることができる。
しかしMYSQLには無いのでその代替方をメモ

##実装

```mysql:member
CREATE TABLE IF NOT EXISTS `mem` (
  `id` int(11) NOT NULL,
  `name` varchar(50) DEFAULT NULL,
  KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `mem` (`id`, `name`) VALUES
	(1, 'taro'),
	(2, 'jiro'),
	(3, 'saburo'),
	(5, 'takuro');
```

| no | name |
|:---:|:----|
| 1 | taro |
| 2 | jiro |
| 3 | saburo |
| 5 | takuro |

こんな表があるとする

```mysql
select * from 
(
SELECT 0 sqe FROM DUAL WHERE (@num:=0 )*0
UNION ALL 
SELECT @num:=@num+1 FROM mem a join mem b on a.id <> b.id limit 5
) st left join mem mt
on st.sqe = mt.id
```

そこにこんなクエリを発行すると

| sqe | no | name |
| --:|:---:|:----|
| 1 | 1 | taro |
| 2 | 2 | jiro |
| 3 | 3 | saburo |
| 4 | null | null |
| 5 | 5 | takuro |

sqeと結合しなかったNullな行が歯抜けとして見て分かる

##途中から採番したい

```mysql

SELECT 0 sqe FROM DUAL WHERE (@num:=0 )*0

```

上記の
@num:=0で初期値を与えているので
@num:=2や
@num:=10000など
初期値を設定することで途中から採番できる

###たくさん採番したいんだが

```mysql

SELECT @num:=@num+1 FROM mem a join mem b on a.id <> b.id limit 5

```

上記のlimit 5で指定している数を増やすと良い
ただ生成に使用している"mem"表は4行程度なので(n^2)-nで12までしかシーケンスを生成出来ない。
これは小さい表ほど生成できるシーケンスが少なくなる。

その場合十分に大きな表があるなら"mem"表のかわりに指定すると良い。
大きな表がない場合は


```mysql

SELECT @num:=@num+1 FROM mem a join mem b on a.id <> b.id join mem c on b.id <> c.id

```

のように結合する表を増やせばシーケンスも増える
ちなみにここで指定してる"mem"表はシーケンスを発番するためにしか使用していないめ
中身は問わないため何の表でも構わない。


##原理

連番を作るDUAL表と歯抜けを見つけたい表とをLeft joinして歯抜けを見つけている

###連番を持つDUAL表作る

連番を持つカラムを持つDUAL表を作るクエリになるが
DUAL表は十分に大きな（発行したい連番の最大数より大きな）表と結合する必要がある。


```mysql

SELECT 0 sqe FROM DUAL WHERE (@num:=0 )*0
UNION ALL 
SELECT @num:=@num+1 FROM mem a join mem b on a.id <> b.id limit 5

```

上記では探したい表同士をNOTで結合しLimitで最大数を調整している。
表によっては巨大な作業用表が作られメモリを食いつぶしそうだが
実表から実カラムの取得や複雑な演算をしていないので、思いの外リソースは食わない。
（本番環境でやるかどうかは別だが）

###歯抜けを見つける

連番を振った表と歯抜けを見つけたい表を外部結合することで求めることができる。
実際は1000万行を超える表などで一気にやると大変なことになるので最初から1万行など指定してやってみると良い。

#etc

FROMにサブクエリがあるのでViweを設定出来ないのが残念
Xcodeで画面をタッチするとキーボードを引っ込めるように1行で実装する

 
##はじめに  
個人的にObjective-Cを勉強していて覚えておきたいのでメモとして残す。  

##環境  
Xcode5.1.1 (2014/8/15現在)  

##やり方

1.ユーティリティーエリアのObject libraryから`Tap Gesture Recognizer`をViewにドロップ。
![スクリーンショット 2014-08-15 17.15.55.png](https://qiita-image-store.s3.amazonaws.com/0/48676/707d2de6-73df-3c19-a24d-00c7f62e6494.png "スクリーンショット 2014-08-15 17.15.55.png")

2.Main.StoryboardのDockにTap Gesture Recognizerが表示される。
![スクリーンショット 2014-08-15 17.14.58.png](https://qiita-image-store.s3.amazonaws.com/0/48676/15b0ee97-edfa-cf34-4d23-cf808377a523.png "スクリーンショット 2014-08-15 17.14.58.png")

3.実装ファイル(~~~.m)に接続。  
4.`Connection:Action、Name:任意`を設定したらConnect。("任意"は適当にわかり易い名前でOK!)
![スクリーンショット 2014-08-15 17.18.33.png](https://qiita-image-store.s3.amazonaws.com/0/48676/a8ef2d4e-d9bd-4205-c431-d6a11c98e244.png "スクリーンショット 2014-08-15 17.18.33.png")

5.上でつけた名前のメソッドに以下を書く。

```ViewController.m
-(IBAction)任意:(id)sender {
	[self.view endEding:Yes];
}
```

6.完成。
mongo 2.6.4 install on Ubuntu 14.04

http://tecadmin.net/install-mongodb-on-ubuntu/

<pre>
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
$ echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list
$ sudo apt-get update
$ sudo apt-get install mongodb-org-server=2.6.4 mongodb-org-shell=2.6.4 mongodb-org-mongos=2.6.4 mongodb-org-tools=2.6.4
$ mongo --version
MongoDB shell version: 2.6.4
</pre>

versionホールド(たぶん)

<pre>
% echo "mongodb-org-server hold" | sudo dpkg --set-selections
% echo "mongodb-org-shell hold" | sudo dpkg --set-selections
% echo "mongodb-org-mongos hold" | sudo dpkg --set-selections
% echo "mongodb-org-tools hold" | sudo dpkg --set-selections
</pre>
border-collapseのIE8バグ

# border-collapseとは、
tableの隣接する境界線を結合して表示させる（初期値）か、分離して表示させるか指定することのできるプロパティ。

border-collapse:collapse; 結合
border-collapse:separate; 分離

## バグ
・IE８で特定の条件下でtableタグのレンダリングに問題が発生する。

　①表の外枠の上罫線が欠ける
　②表の外枠の左罫線が欠ける

### 特定の条件
・ブラウザ: IE8
・モード: 標準モード
・tableの親divで"overflow: visible"以外を指定
・border: collapse
・空のtheadタグがある
 →空のtheadタグを無くすと罫線が表示される。
IE6, 7, 8対策

# それぞれのブラウザで使えないcss

## IE6
・チャイルドセレクタ使えない
・属性セレクタ
・隣接セレクタ
・間接セレクタ
・疑似クラス
・チェインクラス
・display:table-cell

## IE7
・親と子の間にHTMLコメントがある場合、チャイルドセレクタは機能しない
・display:table-cell


## IE8
・角丸のborder-radiusが使えない
・色と不透明度を同時に指定できるrgbaが使えない
・影をつけるbox-shadowとtext-shadowが使えない
・media max-width min-width が使えない
・:last-child が使えない
・:nth-child() が使えない
・擬似要素を::after(または::before)の書式で書けない
・擬似要素にz-indexがきかない
・擬似要素にfilterがきかない




# 有名なIE6,7のCSSのバグ

## doctype宣言(IE6)
・doctype宣言の前に１バイトでも文字があるとCSSの解釈をバージョン６未満のIEに合わせるモード（後述：後方互換モード）に切り替わってしまう。（box-sizingプロパティをIEがサポートしたのはIE8からだから使用できなくなる。）

　・テキストエディタによっては文書の先頭にByte order markと呼ばれる３バイトの情報を付加することがあり、これも後方互換モードの引き金になってしまう。
　・html5の場合、標準的なdoctype宣言を書けば、IEは、CSSの解釈をW3Cが定めた仕様にあわせるモード、標準準拠モードで動作する。

## hasLayout（IE6,7）
他の特定のプロパティを指定することで、間接的にオンの状態にすれば、だいたい直る。

```
*zoom:1;
```

## floatとダブルマージン(IE6)
floatで指定したのと同じ方向にmarginを指定すると、
marginが指定した数値の倍の値になってしまうことをダブルマージンという。
display:inlineを追加するとこのバクを回避できる。

## clearfix(IE6)
最後にfloatを解除してあげないと、親要素の高さが０になってしまう。ので、clearfixで解除するのだが、
before after疑似要素をサポートしているのはIE8からのため、IE7以前にもフロートを解除させるため、hasLayoutをオンにする必要がある。
要素に

```
*zoom:1;
```

## パーセント指定することによるズレ(IE6,7)
widthやmarginの値を割合（パーセント）で指定する場合、IE6,7は、
％　→　ピクセルに変換　→　小数点以下四捨五入
と計算するので、場合によっては親要素の幅より合計が大きくなる。

回避するために、
①％による指定をやめるか、
②IE6,7だけ少なめの数値を指定するか

①の計算
正確な割合を算出するためには、
以下の公式によって計算する必要ある。

```
答　= width - ( 0.5 / container * 100 );
```

→%表記ではなく、そのpx表記の答えを書く


# ハックの方法

## シンプルハック
*アスタリスクをプロパティ前に付けるとIE7以下のIEだけが適用される。
_アンダースコアをプロパティ前に付けるとIE6以下のIEだけが適用される。

ただ、CSSバリデーターにはひっかかるから、覚えておくこと。

## 条件付きコメント利用ハック

```
<!--[if lt IE 7]>
<html class="ie ie6 lt-ie9 lt-ie8 lt-ie7">
<![endif]-->
<!--[if IE 7]>
<html class="ie ie7 lt-ie9 lt-ie8">
<![endif]-->
<!--[if IE 8]>
<html class="ie ie8 lt-ie9">
<![endif]-->
<!--[if IE 9]>
<html class="ie ie9 gte-ie9">
<![endif]-->
<!--[if !IE]><!-->
<html class="no-ie">
<!--<![endif]-->
```

↑IEの各バージョンとIE以外のブラウザに別々のクラスを指定します。
これを利用し、

```
.selector {
    color: green;
   *color: pink; /* IE7以下 */
   _color: navy; /* IE6以下 */
}
html.ie8 .selector {
    color: blue; /* IE8 */
}
```

IE7にはピンク、IE6以下にはネイビー、IE8には、青色にできる。

#### 例①：警告にも

```
<!--[if IE 8]>
<p class="warning">お使いのブラウザは古すぎです！新しいのを使いましょう。</p>
<![endif]-->
```


#### 例②：スタイルシートを分ける

```
<!--[if lt IE 7]>
<link href="ie6.css" rel="stylesheet" type="text/css">
<![endif]-->
<!--[if IE 7]>
<link href="ie7.css" rel="stylesheet" type="text/css">
<![endif]-->
<!--[if IE 8]>
<link href="ie8.css" rel="stylesheet" type="text/css">
<![endif]-->
```

#### 例③：jsで

```
var isIE6 = $('<div>')
                .html('<!--[if IE 6]><i></i><![endif]-->')
                .length;
```


IE10から条件付きコメントは基本的にサポートされなくなりました。
もうバグはない！ということでしょうかー。
vagrantのboxフォルダ変更手順メモ 

#はじめに
vagrantのboxの配置先フォルダに指定していたドライブ容量が逼迫してきたため、box配置先フォルダ(というよりvagrantのホームディレクトリ)を他のドライブに移動した。そのときの手順メモ。

#試した環境
- Windows 7 64bit
- vagrant version 1.2.2

#vagrantのホームディレクトリ
デフォルトでは、下記のフォルダがVagrantのホームディレクトリとなっている。

`(ユーザフォルダ)/.vagrant.d`

このホームディレクトリ以下に/boxesがあり、その下に各Boxのファイルが配置される。

#vagrantのホームディレクトリの変更
vagrantのホームディレクトリは、以下を環境変数に指定することで変更可能。

`VAGRANT_HOME`

#vagrantのホームディレクトリの変更手順
- 1. VAGRANT_HOMEに新しい配置先ディレクトリを指定。
- 2. 新しい配置先ディレクトリ以下に(ユーザフォルダ)/.vagrant.d をコピー。

これで今まで利用していたvagrantのboxを継続して使うことができた。
capistrano3 sshの設定で躓く.

sshへの無知が招いた結果

# 前提

CentOS6.5

# 躓いた事

capistrano3をrails環境にインストールして、試しにdeploy/staging.rbにサーバー情報を設定して接続を試みたら

```bash
SSHKit::Runner::ExecuteError: Exception while executing on host

Net::SSH::AuthenticationFailed: Authentication failed for user
```

で認証できない。

# staging.rbの内容

```rb

role :app, %w {remoteuser@192.168.xxx.xxx}
role :web, %w {remoteuser@192.168.xxx.xxx}
role :db, %w {remoteuser@192.168.xxx.xxx}

set :ssh_options, {
  keys: %w(/home/localuser/.ssh/id_rsa) # ローカル環境の秘密鍵のパス
}
```

# 対処

1 ローカル(デプロイ元）環境のssh鍵を生成する

```bash
ssh-keygen
```

~/.ssh/id_rsa(秘密鍵) id_rsa.pub(公開鍵)が生成される。

2 生成したid_rsa.pubをリモート(デプロイ先)環境へ登録する

1で生成したid_rsa.pubをリモート環境へコピーしておく(ここではlocal_id_rsa.pubというファイル名と仮定)

```bash

# 以下はリモート上での作業
cd ~/.ssh
touch authornized_key
cat local_id_rsa.pub >> authorized_key
chmod 600 authorized_key
```

# 参考

[SSH で公開鍵認証による接続の設定、Mac で ssh-keygen し公開鍵をサーバーに保存 〜 CentOS6](http://easyramble.com/public-key-authorization-over-ssh.html)