OmniAICreator/Qiita-1.07M huggingface dataset:
vim-cheat-sheet



これは[http://rtorruellas.com/vim-cheat-sheet/](http://rtorruellas.com/vim-cheat-sheet/)を和訳、一部加筆したものです。

##カーソル移動
**h** -左移動
**j** -下に移動
**k** -上に移動
**l** -右に移動
**w** -単語の先頭へジャンプ（区切り文字まで）
**W** -単語の先頭へジャンプ（区切り文字を含めない）
**e** -単語の最後にジャンプ（区切り文字まで）
**E** -単語の最後にジャンプ（区切り文字を含めない）
**b** -単語の先頭へ戻る（区切り文字まで）
**B** -単語の先頭へ戻る（区切り文字を含めない）
**0** -(ゼロ)先頭に移動
**^** -行の最初の文字へ移動
**$** -行の終わりへ移動
**G** -最終行へ移動（番号を付けるとその行へ移動- 5Gは 5行目へ）

>ヒント
これらのコマンドの前に番号を付けるとその回数分繰り返します。
例えば、 **4j**は 4行下に移動します。


##insertモード - テキストを追加/挿入
**i** -カーソル位置で挿入モードを開始
**I** -行の先頭で挿入モードを開始
**a** -カーソル位置の直後で挿入モードを開始
**A** -行の末尾で挿入モードを開始
**o** -現在の行の下に空白行を追加して挿入モードを開始
**O** -現在の行の上に空白行を追加して挿入モードを開始
**ea** -単語の末尾で挿入モードを開始
**ESC** -挿入モードを終了


##編集
**r** -単一の文字を置き換える（挿入モードを使用しません）
**J** -現在の行と次の行を統合する
**cc** -現在の行を削除して挿入モードを開始
**cw** -カーソル位置の単語を削除して挿入モードを開始
**c$** -カーソル位置から行末までを削除して挿入モードを開始
**s** -カーソル位置の文字を削除して挿入モードを開始
**S** - 現在の行を削除して挿入モードを開始（CCと同じ）
**xp** -カーソル位置と次の文字を入れ替える（技術的にはカットしてペースト）
**u** -元に戻す(アンドゥ)
**CTRL+r** -やり直し(リドゥ)
**.** - 最後に使ったコマンドを行う

##テキストの選択（ビジュアルモード）
**v** - ビジュアルモード開始。移動すると選択してその後にコマンドを実行できる（例えばY-ヤンク）
**V** -行単位のビジュアルモードを開始
**o** -選択範囲の反対側に移動する
**Ctrl+v** -ビジュアルブロックモード(矩形選択)を開始
**O** -ブロックの他のコーナーに移動する
**aw** -単語をマーク
**ab** -（）ブロックを選択(括弧ごと)
**aB** - {}ブロックを選択(括弧ごと)
**ib** -（）ブロックを選択(括弧を除く)
**iB** - {}ブロックを選択(括弧を除く)
**ESC** -ビジュアルモード終了

##ビジュアルモードでのコマンド
**>** - 選択範囲を右シフト
**<** - 選択範囲を左シフト
**y** - 選択範囲をヤンク（コピー）
**D** - 選択範囲を削除する
**~** - 大文字と小文字を入れ替える
>ヒント
ビジュアルブロックモード(矩形選択)で選択してシフトすると、選択位置からシフトできます。


##カット＆ペースト
**yy** - 現在の行をヤンク（コピー）
**2yy** - 2行をヤンク
**yw** - カーソル位置の単語をヤンク
**y$** - 現在行の行末までヤンク
**p** - カーソル位置の後にペースト
**P** - カーソル位置の前にペースト
**dd** - 現在の行をカット(コピーして削除)
**2dd** - 2行をカット
**dw** - カーソル位置の単語をカット
**D** - カーソル位置から行末までカット
**d$** - カーソル位置から行末までカット(Dと同じ)
**X** - 現在の文字をカットする

##終了
**:w** - 終了せずに保存
**:wq** - 保存して終了
**:x** - 保存して終了
**:q** - 保存せずに終了（変更点がある場合は終了できない）
**:q!** - 保存せずに終了(変更点がある場合は破棄される)

##検索/置換
**/文字列** - 文字列を検索
**?文字列** - 文字列を逆方向に検索
**n** -同じ方向に再検索
**N** -逆方向に再検索
**:％s/old/new/g** - ファイル全体でoldをnewに置き換える
**:％s/old/new/gc** - ファイル全体でoldをnewに置き換える(確認あり)

##複数のファイルでの作業
**:e** ファイル名 - 新しいバッファでファイルを編集
**:bname** または**:bn** - 次のバッファに移動
**:bprev** または**:bp** - 前のバッファへ移動
**:bd** -バッファを削除（ファイルを閉じる）
**:sp** ファイル名 - 新しいバッファおよび分割ウィンドウでファイルを編集
**:vsp** ファイル名 - 新しいバッファおよび垂直分割ウィンドウでファイルを開きます

**Ctrl+ws** - スプリットウィンドウ
**Ctrl+ww** - ウィンドウを切り替える
**Ctrl+wq** - ウィンドウを終了します
**Ctrl+wv** - 垂直分割ウィンドウ
>補足
当方環境ではCtrl+ws,Ctrl+wqが機能しませんでした。

##タブ

**:tabnew ファイル名** - 新しいタブで(ファイル名)を開く
**:tabn ファイル名**  - 同上

**Ctrl+wt** -独自のタブに現在の分割ウィンドウを移動

**gt** - 次のタブに移動する
**:tabnext** - 同上
**:tabn** - 同上

**gT** - 前のタブに移動する
**:tabprev** - 同上
**:tabp** - 同上

**(n)gt** - タブ番号(n)への移動

**:tabmove(n)** - 位置(n)番目に移動（左端が0）
**:tabclose** - 現在のタブを閉じる
**:tabc** - 同上

**:tabonly** - 現在の1を除く他のすべてのタブを閉じる
**:tabo** - 同上

>補足
当方環境ではCtrl+wtが機能しませんでした。
Mac の emacs で find-file のデフォルトディレクトリを "~/" にする。

init.el に以下を追加する。

 (setq default-directory "~/") 
 (setq command-line-default-directory "~/")

Marvericksでは、Dockアイコンから起動した際に ”-psn〜” オプションがつかなくなった。
このためemacsのバージョンによっては command-line-default-directory も設定する必要あり。


参考：
http://anago.2ch.net/test/read.cgi/mac/1328699139/64-86
sprayで静的ファイルを扱う

* 画像
* css
* js
* web Font

など（以下resources）をどうやって扱うかという話。

日本語の記述が全く見当たらなかったのでメモ代わりに。

# ディレクトリ構成
`src/main/resources`がresourcesを扱うためのルートディレクトリになる。

# メソッド
## getFromResource
[getFromResource](http://spray.io/documentation/1.2.0/spray-routing/file-and-resource-directives/getFromResource/)
パスとファイル名を直接指定する場合に用いる

`src/main/resources/hoge.txt`を表示したい場合

```scala
get {
  path("hoge") {
    getFromResource("hoge.txt")
  }
}
```

## getFromResourceDirectory
[getFromResourceDirectory](http://spray.io/documentation/1.2.0/spray-routing/file-and-resource-directives/getFromResourceDirectory/)
`pathPrefix`と組み合わせて用いる

`src/main/resources/css/*.css`の読み込み

```scala
get {
  pathPrefix("css") {
    getFromResourceDirectory("css")
  }
}
```

こうしておくと、html側で

```html
<link href="css/foo.css" rel="stylesheet">
<link href="css/bar.css" rel="stylesheet">
```
このように、hrefに指定するパスを`css`から始めれば読み込むことができる

# 要調査: 任意のディレクトリをresourcesのルートとして扱う方法
`build.sbt`に`unmanagedResourceDirectories`の指定を入れたら任意のディレクトリを指定できるっぽいけど上手く行かなかった

参考: [spray-twirl-bootstrap](https://bitbucket.org/diversit/spray-twirl-bootstrap)

```scala:build.sbt
unmanagedResourceDirectories in Compile <++= baseDirectory { base =>
    Seq( base / "src/main/webapp" )
}
```
配列処理をJavaで書くをちょっと補完してみる試み

[Pythonの配列処理をJavaで書く](http://qiita.com/mountcedar/items/40d82cc52d0db1c2c49b)を読んで、`System.arraycopy`があったが、マズいわけではないがローレベルコピーなので、もうちょっとなんとかできないか考えてみた。
とはいえ、コレクションの処理にいってるので、たぶん本来の意義からは逸脱してる気もする。

[StackOverflow](http://stackoverflow.com/questions/80476/how-to-concatenate-two-arrays-in-java)にも記事があり、こっちはApache Commonsの`ArrayUtils.addAll`を使ってる

```java
List<A> a = ArrayUtils.addAll(array1,array2);
a.toArray();
```

現在までの標準ライブラリでやるとするなら、こうなるかな?

```java
//List<A> a1 = Arrays.asList(array1);
//List<A> a2 = Arrays.asList(array2);
//でリストにして操作してもよいけど...
List<A> a = new ArrayList<A>(array1.length + array2.length);
Collections.addAll(a,array1);
Collections.addAll(a,array2);
a.toArray();
```

で、いける、かな?ちょっと試してないが大丈夫だと思う。
[自分用メモ]MYSQLが起動できなかったので試したこと。


久しぶりにMYSQLを立ち上げようとしたら、「Jobs failed to start」とか返ってきて上手く行かなかった。

```bash
ps aux | grep mysql 
```

と入力してもやはり動いていないことが確認できる。
で、とりあえず以下のような手順で入れなおしたらうまいこと動いた。

```bash
sudo apt-get purge mysql-common mysql-server-5.5
sudo apt-get install mysql-server
```
Gradle で複数種類の apk をビルドする

複数種類の apk（ステージング用、リリース用など）をビルドするスクリプト。
プロジェクトの`root`以下に、`conf`ディレクトリを掘って、その中に`keystore`ファイルを置くスタイル。debug 用のはリポジトリに入れておくと良さそう。release 用のは入れるとまずいので、そこだけ頑張らないといけない。

```groovy
android {
    // ...

    // デバッグ用 apk とリリース用 apk の署名の設定
    signingConfigs {
        debug {
            storeFile file("conf/debug.keystore")
            storePassword "android"
            keyAlias "androiddebugkey"
            keyPassword "android"
        }
        release {
            storeFile file("conf/release.keystore")
            storePassword "fugafugahogehoge"
            keyAlias "yokomark"
            keyPassword "foobarbaz"
        }
    }

    // ビルドの種類に応じて、ビルド時に実行するステップを設定
    buildTypes {
        release {
            debuggable false
            zipAlign true
            runProguard true
            proguardFile getDefaultProguardFile('proguard-android-optimize.txt')
            signingConfig signingConfigs.release
        }
        debug {
            debuggable true
            zipAlign true
            runProguard false
            signingConfig signingConfigs.debug
        }
    }

    productFlavors {
        staging {
            proguardFile 'proguard-rules.txt'
            packageName "jp.yokomark.foo.staging"
        }

        production {
            proguardFile 'proguard-rules.txt'
            packageName "jp.yokomark.foo.product"
        }
    }
}
```
jQuery用のスプリット・ペインのライブラリ比較検討メモ

左右や上下にペインを分割してドラッグでサイズを変えられるようなライブラリを探していて、いくつか見つけたので比較検討したメモです。

## [UI Layout Plug-in](http://layout.jquery-dev.net/)

[javascript - Best way to do a split pane in html - Stack Overflow](http://stackoverflow.com/questions/12194469/best-way-to-do-a-split-pane-in-html)で紹介されていました。高機能そうではありますが、[Downloads](http://layout.jquery-dev.net/downloads.cfm)を見るとスクリプトのサイズが81KBとか151KBと大きいのでパスすることにしました。

## [jQuery Splitter Plugin](http://methvin.com/splitter/)

[methvin.com/splitter/splitter.js](http://methvin.com/splitter/splitter.js)のファイルサイズは9KBと小さくて良いのですが、[jQuery Minimal Vertical splitter](http://methvin.com/splitter/vbasic.html)のサンプルをChromeで試してみると、ドラッグするときのカーソルが左右の矢印(col-resize)ではなく右矢印(e-resize)なのが、好みではない感じです。

[cursor－スタイルシートリファレンス](http://www.htmq.com/style/cursor.shtml)によるとcol-resizeはIE6以上の独自拡張とのことなので、それで使わないようにしているんでしょうかね。

MITとGPLのデュアルライセンスです。

タブ移動でスプリットバーにフォーカスを当ててカーソルキーで位置を調整できたり、クッキーで位置を記憶できたりと高機能ではあります。

ただ、このコードは古いようでjQuery 1.10.2には対応していませんでした。サンプルを見るとjQuery 1.3を使用していました。

[internet explorer 9 - Fix for jQuery splitter in IE9 - Stack Overflow](http://stackoverflow.com/questions/5321284/fix-for-jquery-splitter-in-ie9)を参考に、jQuery 1.10.2対応を試みたのですが、うまくいっていません。ペインのサイズがずれてしまっています。
https://github.com/hnakamur/jquery-splitter-methvin

ということで、このライブラリの使用は諦めました。

## [jQuery Splitter | jQuery Plugin Registry](http://plugins.jquery.com/splitter/)

[jQuery Plugin Registry](http://plugins.jquery.com/)でsplitterで検索して見つけました。

ソースはGitHubで公開されています。[jcubic/jquery.splitter](https://github.com/jcubic/jquery.splitter)

[jquery.splitter/js/jquery.splitter-0.12.0.js at master · jcubic/jquery.splitter](https://github.com/jcubic/jquery.splitter/blob/master/js/jquery.splitter-0.12.0.js)を見るとJSのファイルサイズは11KBと小さくて良さそうです。

ライセンスはLGPLのv3以上です。

個人的にはBSDやMITライセンスのライブラリを優先したいので、このライブラリの使用は見送りました。

## [shagstrom/split-pane](https://github.com/shagstrom/split-pane)

[Split Pane jQuery plugin | dreamchain](http://www.dreamchain.com/split-pane/)にデモがあります。

機能はシンプルです。
http://dreamchain.com/static/split-pane/fixed-left.html のサンプルを手元で変更してみたところ、jQuery 1.10.2でも動きました。

ライセンスはMITです。
spray+twirlを試してみた


#sprayとは
Scala/Akkaベースのwebフレームワーク

* 非フルスタック
* RESTful API設計に向く
* 高速・軽量なビルトインHTTP Server（spray-can）
* Servlet 3.0 互換

[spray | REST/HTTP for your Akka/Scala Actors](http://spray.io/)

# twirlとは
スタンドアロンなscala template
[spray/twirl](https://github.com/spray/twirl)

# このエントリのゴール
sprayのview層にtwirlを導入して簡単なwebアプリケーションを構築する

# 手順
[spray/spray-template](https://github.com/spray/spray-template)を雛形としてプロジェクトを作ります。

__1\. spray-templateをcloneする__
今回はHTTP Serverとして`spray-can`を使うので、cloneしたらそのままでよい。

```bash
$ git clone git://github.com/spray/spray-template.git my-project
$ cd my-project
```

__2\. sbtのバージョンを変更する__
2014/01現在、`sbt 0.13`ではtwirlの依存関係を解決できません。
よって`build.properties`を編集して、sbtのバージョンを`0.12.4`にしてやります。

```build.properties
sbt.version=0.12.4
# sbt.version=0.13.0
```

__3\. twirlを導入__
[spray/twirl](https://github.com/spray/twirl)を参考にしてtwirlを導入します。
`plugins.sbt`に以下の依存関係を追加。

```scala:plugins.sbt
addSbtPlugin("io.spray" % "sbt-twirl" % "0.6.1")
```

`build.sbt`に以下を追記。

```scala:build.sbt
import twirl.sbt.TwirlPlugin._

...

seq(Twirl.settings: _*)
```

これでOK

__4\. scala templateを追加__
twirlがscala templateを認識するパスは`src/main/twirl`以下です。
`src/main/twirl`ディレクトリを作成し、次のscala templateファイルを追加します。

```html:hello.scala.html
@(title: String, user: String)

<!DOCTYPE html>
<html>
<head>
  <title>@title</title>
</head>
<body>
  <p>Hello, @user</p>
</body>
</html>
```

__5\. scala templateのレンダリング__
`MyService`トレイトを次の通り書き換えます

```scala:Myservice.scala
trait MyService extends HttpService {

  val myRoute =
    get {
      path("") {
        respondWithMediaType(`text/html`) {
          complete(html.hello.render("Greeting", "twirl").body)
        }
      }
    }
}
```

scala templateのレンダリングは`render()`メソッドを用いて行います。
このレンダリング結果は`twirl.api.Html`クラスなので、`body`メンバ、もしくは`toString()`メソッドによって、レンダリング結果を`String`として取り出してやる必要があります。

__6\. 動作の確認__

```bash
$ sbt
> re-start
```

ブラウザで`localhost:8080`を開いて、`Hello, twirl`という文字列が表示されていれば成功です。
Fragment のテンプレート

自分の`Fragment`を作る時にテンプレとして書く必要のあるものを以下にまとめておく。

内容は`Fragment`初期化用の`static`メソッド。
`Fragment`はデフォルトコンストラクタ以外のコンストラクタを持っていると、フレームワークがライフサイクル管理しきれなくなる。その理由は、[Fragment | Android Developers](http://developer.android.com/reference/android/app/Fragment.html) にある通り。

```
All subclasses of Fragment must include a public empty constructor. The framework will often re-instantiate a fragment class when needed, in particular during state restore, and needs to be able to find this constructor to instantiate it. If the empty constructor is not available, a runtime exception will occur in some cases during state restore.
```

```java
package sample.fragment;

import android.support.v4.app.Fragment;

public class MyFragment extends Fragment {
    // メモリ不足による破棄後からの復帰時にフレームワークがリフレクションで呼びだすコンストラクタ
    public MyFragment() {}

    // 自分のコードから Fragment の初期化に使うメソッド
    public static MyFragment newInstance() {
        MyFragment fragment = new MyFragment();
        // 以下二行は、Fragment に初期化用の変数を渡したいときに使う
        // Bundle arguments = new Bundle();
        // fragment.setArguments(arguments);
        return fragment;
    }
}
```

IDE でテンプレを設定しておくと便利。

### AndroidStudio(IntelliJ) でのテンプレート

```
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end

import android.support.v4.app.Fragment;
import android.os.Bundle;

#parse("File Header.java")
public class ${NAME} extends Fragment {
    public static final String TAG = ${NAME}.class.getSimpleName();

    public static ${NAME} newInstance() {
        ${NAME} fragment = new ${NAME}();
        Bundle args = new Bundle();
        fragment.setArguments(args);
        return fragment;
    }
}
```
support-v7-appcompat を使うときの menu リソースの showAsAction

特に、ActionBar の ActionItem として使うときの`showAsAction`属性の指定の仕方にクセがあるので注意する。

通常では、`showAsAction`属性の名前空間は`android`なので、`android:showAsAction`と記述するが、support-v7-appcompat を使うときは、support-v7-appcompat 用の名前空間を使用しなければならない為、以下のようにする。

support-v7-appcompat を使いつつ`android:showAsAction`とした場合は、その属性は無視され OverFlow にまとめられてしまう。

```xml
<?xml version="1.0" encoding="utf-8"?>
<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:compat="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_ok"
        compat:showAsAction="always"
        android:title="@string/action_ok"/> 
    <item
        android:id="@+id/action_cancel"
        compat:showAsAction="always"
        android:title="@string/action_cancel"/>
</menu>
```
SlickGridのコンテキストメニューで行の追加と削除のサンプル

[SlickGridでマルチカラムソートを試す](http://qiita.com/items/0a40ce1b34d564bd0489)の続きです。

本家では[SlickGrid example 7: Events](http://mleibman.github.io/SlickGrid/examples/example7-events.html)にコンテキストメニューのサンプルがあります。

私が書いたサンプルは
https://github.com/hnakamur/slickgrid_example/tree/006c62a3decc109fa5789e44eb409883649953d8
にあります。

コンテキストメニューは以下のようにマークアップします。

```html:index.html
<ul id="contextMenu">
<li data="add">本を追加</li>
<li data="delete">本を削除</li>
</ul> 
```

コンテキストメニューのcssは以下のようにします。

```css:css/example.css
#contextMenu {
  position: absolute;
  display: none;

  background: #e1efc7;
  border: 1px solid gray;
  padding: 2px;
  min-width: 100px;
  -moz-box-shadow: 2px 2px 2px silver;
  -webkit-box-shadow: 2px 2px 2px silver;
  z-index: 99999;
}

#contextMenu li:hover {
  background-color: white;
}
```

```grid.onContextMenu```にコンテキストメニューを開くときの処理を記述し、 ```$("#contextMenu").click```にメニューが選択された時の処理を記述します。


```js:js/sample.js
  grid.onContextMenu.subscribe(function (e) {
    e.preventDefault();
    var cell = grid.getCellFromEvent(e);
    $("#contextMenu")
        .data("row", cell.row)
        .css("top", e.pageY)
        .css("left", e.pageX)
        .show();

    $("body").one("click", function () {
      $("#contextMenu").hide();
    });
  });

  $("#contextMenu").click(function (e) {
    if (!$(e.target).is("li")) {
      return;
    }
    if (!grid.getEditorLock().commitCurrentEdit()) {
      return;
    }
    var menu = $(e.target).attr("data");
    if (menu === "delete") {
      dataView.beginUpdate();
      var rows = grid.getSelectedRows();
      var cids = $.map(rows, function (row, i) {
        return data[row].cid;
      });
      $.each(cids, function (i, cid) {
        dataView.deleteItem(cid);
      });
      dataView.endUpdate();
      grid.setSelectedRows([]);
    } else if (menu === "add") {
      var count = grid.getSelectedRows().length;
      var row = $(this).data("row") + 1;
      for (var i = 0; i < count; i++) {
        dataView.insertItem(row + i, {cid: nextCid++});
      }
    }
  });
```

[grid.getSelectedRows()](https://github.com/mleibman/SlickGrid/wiki/Slick.Grid#wiki-getSelectedRows)で現在選択されている行インデクスの配列が返ります。昇順ではなく選択された順序になっているようです。

DataViewで行を削除するときは[Updating data](https://github.com/mleibman/SlickGrid/wiki/DataView#updating-data)に書かれているように```dataView.deleteItem()```を使います。

行を削除すると行インデクスがずれるので、選択されている行インデクスに対応するDataViewのデータIDをひと通り求めてから消すようにしています。

また、行を追加する処理では[GoogleDrive - Google Spreadsheetで一度に複数行を追加する - Qiita \[キータ\]](http://qiita.com/hnakamur/items/90862c8c682de9cdb5a9)を参考に、現在選択されている行数と同じ行数を追加するようにしてみました。一気にたくさんの行を追加したいときに便利です。
SlickGridでマルチカラムソートを試す

[SlickGridを使ってみる](http://qiita.com/items/12d096928e2103fa63b3)の続きです。

本家では[SlickGrid example: Multi Column Sort](http://mleibman.github.io/SlickGrid/examples/example-multi-column-sort.html)にマルチカラムソートの例があります。

私が書いたサンプルのコードは
https://github.com/hnakamur/slickgrid_example/tree/90eed7cda7a59f0b96dbb65ed9ff966f57068774
にあります。

マルチカラムソートを使う場合は、
[Grid Options · mleibman/SlickGrid Wiki](https://github.com/mleibman/SlickGrid/wiki/Grid-Options)のmultiColumnSortをtrueに指定します。

```js
  var options = {
    editable: true,
    multiColumnSort: true
  };

  var dataView = new Slick.Data.DataView();
  var grid = new Slick.Grid("#myGrid", dataView, columns, options);
  grid.init();
```

またgrid.onSortにソートする関数を設定します。

```js
  grid.onSort.subscribe(function (e, args) {
    var cols = args.sortCols;

    dataView.sort(function (dataRow1, dataRow2) {
      for (var i = 0, l = cols.length; i < l; i++) {
        var field = cols[i].sortCol.field;
        var sign = cols[i].sortAsc ? 1 : -1;
        var value1 = dataRow1[field], value2 = dataRow2[field];
        var result = (value1 == value2 ? 0 : (value1 > value2 ? 1 : -1)) * sign;
        if (result != 0) {
          return result;
        }
      }
      return 0;
    });
  });

  dataView.onRowCountChanged.subscribe(function (e, args) {
    grid.updateRowCount();
    grid.render();
  });

  dataView.onRowsChanged.subscribe(function (e, args) {
    grid.invalidateRows(args.rows);
    grid.render();
  });

  dataView.beginUpdate();
  dataView.setItems(data, "cid");
  dataView.endUpdate();
```

列ヘッダーをクリックし、2つ目以降はShift+左クリックすることで複数の列でソートできます。同じ列をShift+左クリックすれば、ソートの昇順、降順を切り替えられます。

また、ソートキーに追加済みの列ヘッダーをCtrl+左クリック（Macの場合はCommand+左クリック）するとソートキーから除外できます。

## DataViewについて

このサンプルでは[DataView · mleibman/SlickGrid Wiki](https://github.com/mleibman/SlickGrid/wiki/DataView)を使用しています。

基本的な使い方ではJavaScriptの行データの配列を直接グリッドに指定することも出来ますが、ページングなどを行う場合は行データの配列をDataViewにラッピングしてからグリッドに指定する必要があります。

いちいち使い分けるのも面倒なので、このサンプル以降は常にDataViewを使用します。

[DataView · mleibman/SlickGrid Wiki](https://github.com/mleibman/SlickGrid/wiki/DataView)に説明がありますが、

One important requirement that DataView imposes on the data it consumes is that every item has a unique identifier.
DataViewに渡す行データにはユニークなIDのフィールドを含める必要があります。デフォルトでは```id```になっていますが、DataViewの```setItems(data, [objectIdProperty])```メソッドで名前を指定すれば変更できます。

サーバサイドにRailsを使う場合を想定すると```id```はサーバサイドで使いたいので、Backbone.jsの流儀を参考にして、この例では```cid``` (client側のid)としました。
UITableViewでスクロールする時に、Cellを徐々に拡大して表示させる方法


実装方法は単純です。cellが表示される直前に以下のアニメーションを定義するだけです。

```objective-c
- (void)tableView:(UITableView *)tableView
   willDisplayCell:(UITableViewCell *)cell
 forRowAtIndexPath:(NSIndexPath *)indexPath
{
    cell.transform = CGAffineTransformMakeScale(0.8, 0.8);
    [UIView animateWithDuration:0.5 animations:^{
        cell.transform = CGAffineTransformIdentity;
    }];
}

```
PowerShellで2つのファイルを比較する

仕事で新しいCSVファイルと古いCSVファイルでどの部分が変わっているのかわからなかったので比較の方法を探してみました。PowerShellでもあるんですね。
この方法で比較することはできますが、出力する二つのファイルが大きく変わってしまっているとほとんどの部分が違うものとして出てくるので必ずしも有効なものとは限りません。

さて、PowerShellでは次のように入力します

```
PS> $A = Get-Content %新しいCSVファイル%
PS> $B = Get-Content %古いCSVファイル%
PS> Compare-Object $A $B
```

下記のような結果が返ってきました。適当に加工してあるものです。

```
InputObject                      SideIndicator
-----------                      -------------
6007,23                          =>
6008,23                          =>
6009,23                          =>
6011,23                          =>
6013,23                          =>
6049,21                          =>
6138,23                          =>
6160,21                          =>
6161,23                          =>
6162,23                          =>
6163,27                          =>
6164,24                          =>
2187,21                          =>
2198,21                          =>
2203,21                          =>
2206,21                          =>
2224,21                          =>
2045,30                          =>
8127,23                          <=
8128,23                          <=
8129,23                          <=
8131,23                          <=
8133,23                          <=
8414,21                          <=
8644,23                          <=
8646,21                          <=
8647,23                          <=
8648,23                          <=
8649,27                          <=
8650,24                          <=
3187,21                          <=
3198,21                          <=
3203,21                          <=
3206,21                          <=
3224,21                          <=
2045,24                          <=
```

古いファイルからなくなった行には「=>」、新しいファイルで追加された行には「<=」が表示されて、内容も出てきます。
これで新しいファイルで追加された内容がわかるので変更点を見落としにくくなります。
とはいえ画面に出ているだけではリストなども作れないので標準出力を適当なファイルにリダイレクトさせておくと良いかもしれません。

```
PS> Compare-Object $A $B > diff.txt
```


なんらかの事情で新旧で一致している行も表示したい場合には

```
PS> Compare-Object $A $B -IncludeEqual
```

とすると一致している行も表示され、SideIndicatorカラムには「==」が表示されるようになります。
プロファイルスクリプトを作成する

プロファイルスクリプトはPowerShellを起動する際に実行されるスクリプトです。
PowerShellを起動してから下記のコマンドを打つとプロファイルスクリプトのフルパスが取得できます。

```
PS>  $profile
```

「Microsoft.PowerShell_profile.ps1」のフルパスが表示されるはずです。
$profileにフルパスが格納されていますが、初期の状態ではファイルが存在していないので編集しようとしてもエラーになります。
そこで次のコマンドを打ってプロファイルスクリプトを作成します。

```psl
PS> new-item -path $profile -itemtype file -force
```

今回は単純に作成しただけなので、内容は何も書かれていません。
内容を編集するときには

```
PS> notepad $profile
```

とするとメモ帳でプロファイルスクリプトを編集することができます。
MicrosoftのPowerShellに関するドキュメントではプロファイルスクリプトをWindows PowerShell プロファイルと表現しているものが多いようです。
Unityで *** can only be called on an active agent that has been placed on a NavMesh.とか言われる時の対処法

ナビメッシュで経路探索するときに、
オブジェクトを消したり出したりしていると、
時々出てくるのが、

"hogehoge" can only be called on an active agent that has been placed on a NavMesh.

というエラー。
ナビメッシュ上にオブジェクトがないときとか、
準備が整う前？にResume とか SetDestination とかしようとすると発生する模様。

ナビメッシュ上にオブジェクトが存在し、経路探索可能な状態かどうか調べるには、

```csharp
if(navMeshAgent.pathStatus != NavMeshPathStatus.PathInvalid) {
//navMeshAgentの操作
}
```

とすると良いみたい。
PowerShellのセキュリティポリシーを変更してスクリプトファイルを実行できるようにする

Windows PowerShellはMicrosoft社が開発したコマンドラインインターフェイスとシェルスクリプト言語のことで、WindowsXP以降のOSで利用できます。
様々な機能があり、コマンドラインからOSの設定も変更可能です。
PowerShellでは標準でスクリプトファイルの実行は禁止されているので、いろいろスクリプトファイルを実行できるようにするためにはポリシーの変更をする必要があります。
この設定をしておかないとプロファイルを設定した場合も実行されないことがあるので注意。
ここではローカルスクリプトは全て実行可能にします。

```
PS> Set-ExecutionPolicy RemoteSigned
```

なお、スクリプトファイルのセキュリティポリシーは下記の4段階があります。

* Unrestricted：インターネットからダウンロードしたスクリプト以外はすべてのスクリプトが実行可能。ただしインターネットからダウンロードしたスクリプトは、実行するかどうかが確認される
* RemoteSigned：ローカルに保存されているスクリプトが実行可能。インターネットからダウンロードしたスクリプトも署名があれば実行可能
* AllSigned：署名されているスクリプトのみ実行が可能。署名がないスクリプトは実行できない
* Restricted：すべてのスクリプトの実行を禁止。デフォルトの状態

現在のポリシーを確認したい時には`Get-ExecutionPolicy`コマンドでポリシーを表示できます。
便利すぎるgit jump

特定の状況下で素早くエディタを立ち上げられるgit-jumpというツールを見つけたので紹介します。
 
https://github.com/git/git/tree/master/contrib/git-jump
 
git jumpには3つのモードがあります. git jumpの後ろにモードと必要な引数を渡すことで動作します。
1. diffモード
git diffで表示される最初のhunk(diffの塊)を編集します。
また、このdiffは通常のgit diffと同様のオプションなども使えます。
なのでgit jump diff --stagedやgit jump diff commit1 commit2なども使えます。
 
2. mergeモード
このモードはgit mergeしてコンフリクトを起こした際にのみ利用できます。
git jump mergeで最初のコンフリクトマーカーに飛びます。ただファイルを開くだけでなく、マーカに飛ぶので、すぐに編集できるところがこのツールの素晴らしい部分です。
コンフリクトを気合で解消する時もこれがあれば少しは楽になりますね！
 
3. grepモード
通常のgrepと同じように検索条件を指定すると最初に引っかかった部分をエディタで開いてくれます。
git jump grep -i Hogehoge
git jump grep -E "^h.*e"
が有効です。
 
* インストール方法
  1. 自分のdotfilesにsubmodulesを使ってhttps://github.com/git/gitを追加する
  2. .zshrc(.bashrc)にexport PATH=$PATH:path/to/git/contrib/git-jumpを追加する
MacOSXをキーボードなしで設定する。

-

Qiitaの内容としてはあまり適切ではないかもしれませんが、情報を共有したいと思い、友人から譲ってもらったMacMini Mid2010 を初期セットアップした時のことを記録に残します。

## マウスもキーボードもない
MacMiniを初期起動すると、マウスとキーボードを探しに行きます。本来なら、USBキーボードとマウスを用意してやるのが妥当だと思いますが、手元に２つともありませんでした。マウスはUSB接続のBAMBOOタブレットで代用しました。しかし、キーボードは代用になるものはないので、手元にあるMacBookProのキーボードが使えないかと、ネットの情報を探してみました。可能性を少し感じさせたのが、

**初期設定中もBluetoothのペアリングはできる。**

ことを発見した時でした。
しかし、初期設定の終わっていないMacMiniを普通では操作できません。

## 仮想キーボードソフトがあった

なかなか見つからず、明日USBキーボードを買うしかないかと諦めていた時に、こんな記事を見つけました。

MacをBluetoothキーボードに見立てる「1 Keyboard」を試してみたhttp://tnfront.net/?p=1159

アプリのAppStoreのページはこちらです。
https://itunes.apple.com/us/app/1keyboard/id766939888?ls=1&mt=12

このソフトはなんとMacを仮想キーボードに見立てて入力できるというものです。しかも１デバイスなら無料です。使い方は上のサイトの方に書いてありますので省略しますが、インストールして、Bluetoothで接続するだけでした。それでMacMiniはキーボードを検出したと思い込み、次のステップに進むことが出来ました。

どちらにしろ、USBキーボードとマウスは予備として持っている必要があることを痛感しましたが、ううむ、さすがMacと思った場面でした。

マウスがなくてタブレットがあったり、インストール対象以外のMacを所有していたりと環境は特殊ですが、例えばWirelessのキーボードが認識しないなどという場合もこれでイケルと思います。
Java スタック、キュー

### キュー
[Queue](http://docs.oracle.com/javase/jp/7/api/java/util/Queue.html)

機能 | メソッド名 | 備考
---- | ---------  | ----
追加 | add / offer | 容量制限がある場合は offer 推奨
取出し | remove / poll | 空のとき 例外を起こす / null を返す
参照 | element / peek | 空のとき 例外を起こす / null を返す

```java:SampleQueue.java
import java.util.Queue;
import java.util.ArrayDeque;

public class SampleQueue {
    public static void main(String[] args){
        Queue<Integer> queue = new ArrayDeque<Integer>();
        for (int i=0;i<100;i++) queue.add(i);
        while(true){
            Integer a = queue.poll();
            if (a == null) break;
            System.out.print(a + " ");
        }
        System.out.println("");
    }   
}
```

### スタック
[Deque](http://docs.oracle.com/javase/jp/7/api/java/util/Deque.html)

スタックは java.util.Stack よりも java.util.Deque インタフェースを使ったほうが良いらしい
キューの場合と比べて、追加メソッドが変わっただけで 取出し、参照は変わらない

機能 | メソッド名 | 備考
---- | ---------  | ----
追加 | push / offerFirst | 容量制限がある場合は offerFirst 推奨
取出し | remove / poll | 空のとき 例外を起こす / null を返す
参照 | element / peek | 空のとき 例外を起こす / null を返す

```java:SampleDeque.java
import java.util.Deque;
import java.util.ArrayDeque;

public class SampleDeque {
    public static void main(String[] args){
        Deque<Integer> stack = new ArrayDeque<Integer>();
        for (int i=0;i<100;i++) stack.push(i);
        while(true){
            Integer a = stack.poll();
            if (a == null) break;
            System.out.print(a + " ");
        }
        System.out.println("");
    }   
}
```
最速ではてなブログリーダー・アプリを作る！


この内容は始めたばかりの[個人ブログ](http://sakahara.hatenablog.jp/)に掲載したのですが、さすがにまだ何も反応がないのでQiitaにも掲載しておくことにしました。

## 概要
はてなブログには人気エントリーを返すRSSフィードがあるので人気エントリーを表示するアプリを勉強がてらに作ってみました。
Core Data に取得した人気エントリーを保存してるのでオフラインでもみれます。
(ただこのアプリ、表示できるのは人気エントリーの一覧だけです・・・)

http://blog.hatena.ne.jp/-/hotentry/rss

Xcode5から使いやすくなったAuto LayoutやXCTestなどあまりキャッチアップできていなかった部分の勉強や単体テストをちゃんと書くという目的があったのですが、作りっぱなしでは面白くないのでソースコードも公開しています。

https://github.com/asakahara/ASHatenaBlogReader

## スクリーンショット

 ・ブログ一覧画面(縦) 
![blogScreenshot1.png](https://qiita-image-store.s3.amazonaws.com/0/30826/25036f05-a57b-03e8-81d9-e161b483b97b.png "blogScreenshot1.png")

・ブログ詳細画面(縦)
![blogScreenshot2.png](https://qiita-image-store.s3.amazonaws.com/0/30826/2a60c9d0-a467-71e0-e4d2-798ab648eeef.png "blogScreenshot2.png")

・ブログ一覧画面(横)
![blogScreenshot3.png](https://qiita-image-store.s3.amazonaws.com/0/30826/25048398-1ede-5476-1e2f-e9b2f9c2d940.png "blogScreenshot3.png")

・ブログ詳細画面(横)
![blogScreenshot4.png](https://qiita-image-store.s3.amazonaws.com/0/30826/0aa92348-134f-f496-e265-38bfb82e6347.png "blogScreenshot4.png")

## 開発後の感想
Auto Layoutは正直かなりよかったです！
これまで`UILabel`の高さを可変にする表示は`NSString:sizeWithFont:constrainedToSize:lineBreakMode:`を使って毎回計算してました。
Auto Layoutの使う場合、制約の設定さえちゃんとしておけば`UILabel`の高さ調整は勝手にやってくれます。
(もっと早く知っておきたかった・・・)
勝手にやってくれるんで `sizeToFit`などのメソッドをプログラムから呼び出さないようにしましょう。
ただ一つ問題として横画面にも対応させたのですが、縦から横画面へした際にStoryBoardから設定した制約だけでは`UILabel`の横幅の制御がどうもうまくいきません。
仕方なくUILabel.preferredMaxLayoutWidthを横画面のサイズに併せて変更かけることで対応しています。

```objc
- (void)updateLabelPreferredMaxLayoutWidthToCurrentWidth:(UILabel *)label
{
    label.preferredMaxLayoutWidth = [label alignmentRectForFrame:label.frame].size.width;
}

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    
    // 横画面にした際にラベルの横幅が縦画面のサイズのままになってしまうため、
    // preferredMaxLayoutWidthを画面サイズに併せて調整する
    [self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.bodyLabel];
    [self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.titleLabel];
    [self.view layoutSubviews];
}
```

その他にもCore Data用に初めて使ったMagicalRecordは思った以上に便利でした。
特にマルチスレッドでCore Dataを扱う部分をかなり楽にしてくれます。
MagicalRecordのドキュメントにあったサンプルを見てもらえば納得してもらえると思います。

```objc
Person *person = ...;
[MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *localContext){

    Person *localPerson = [person MR_inContext:localContext];

    localPerson.firstName = @"John";
    localPerson.lastName = @"Appleseed";

} completion:^{

    self.everyoneInTheDepartment = [Person findAll];

}];
```

ブロック内に書いた処理を全て別スレッドで処理を行い、完了ブロックはメインスレッドで動作します。

あと単体テストはXCTestを使って最低限のモデルのテスト書いてます。
HTTP通信周りはOHHTTPStubs使ってやってます。

## まとめ
細かい説明を書く余裕がないので興味がある方はGitHubからソースを落として試してみてください。

https://github.com/asakahara/ASHatenaBlogReader

今回は[はてな教科書](https://github.com/hatena/Hatena-Textbook/blob/master/ios-app-development-with-web-api.md)を参考にしながら開発してみました。
とても充実した内容で初心者向けのようですが中級者以上の方でも参考になる部分はあると思います。

ご意見や改善点などありましたら是非お聞かせください！
RailsでURLの末尾のスラッシュ有無によって処理を分岐させる

ざっと調べた限り、 routes.rb だけではできなさそう。

```rb:routes.rb
get '*path' => 'application#routing'
```

みたいにしてサクッとControllerに処理を委譲してやる。ただ、 `request.path` や `request.uri` なども末尾のスラッシュを勝手に消してしまうので、 `request.env['REQUEST_PATH']` あたりで判断する。
最後に作った選択範囲を復活させる

カーソルがバッファ内のどこにいても、[C-c SPC]を押すと最後のリージョン位置に移動し選択範囲を復活させます。
最後のリージョンは[C-SPC]/[C-@]またはexpand-region.elを使って作られたものを対象にします。

```el
(global-set-key (kbd "C-c SPC") 'revive-last-region)

(defun revive-last-region ()
  (interactive)
  (if (and (boundp 'revive-last-region-beginning)
           (boundp 'revive-last-region--end))
      (let (($beg (max revive-last-region-beginning revive-last-region--end))
            ($end (min revive-last-region-beginning revive-last-region--end)))
        (push-mark $beg nil t)
        (goto-char $end))
    (message "Last region not found in this buffer.")))

(defun revive-last-region--beginning-set ($point)
  (if (boundp 'revive-last-region-beginning)
      (setq revive-last-region-beginning $point)
    (set (make-local-variable 'revive-last-region-beginning) $point)))

(defun revive-last-region--end-set ($point)
  (if (boundp 'revive-last-region--end)
      (setq revive-last-region--end $point)
    (set (make-local-variable 'revive-last-region--end) $point)))

(defun revive-last-region--end-save ()
  (if mark-active
      (revive-last-region--end-set (point))
    (remove-hook 'post-command-hook 'revive-last-region--end-save)))

(defun revive-last-region--beginning-save ()
  (revive-last-region--beginning-set (point))
  (add-hook 'post-command-hook 'revive-last-region--end-save))

(defadvice set-mark-command (after revive-last-region-ad activate)
  (revive-last-region--beginning-save))

(defadvice cua-set-mark (after revive-last-region-ad-for-cua activate)
  (revive-last-region--beginning-save))

(defadvice er/expand-region (after revive-last-region-ad-for-er activate)
  (revive-last-region--beginning-set (region-beginning))
  (revive-last-region--end-set (region-end)))
```
ViewController の ViewDidLoad で this が nil になった件


Xamarin Studio + Xcode で Storyboard でアプリを作っていた。複数ある画面の内、ある一つの画面に遷移すると落ちる現象に見舞われていろいろ調べていた。

Xamarin Studio で該当画面の ViewController の ViewDidLoad にブレークポイントを仕掛けて停止させ、ウォッチしてみたところ、なんと this が「nil」になっていた。

これのおかげで、ViewController に配置した UILabel などにもアクセスできない。

ViewController を作りなおしてみたり、呼び出し方法を変えてみたりいろいろやってみたけど解消せず。

30分ほど悪戦苦闘した後、実機にインストールされている該当アプリを一旦削除し、Xamarin Studio も終了させた後に再起動、ソリューションをクリーンして再ビルドして実行してみたところ、問題が解消した。

なにがしかのトラブルが起きた時は、まずは端末内のアプリを消してみると良いのかも知れない。（これまでの経験的に）
新しいマシンでherokuとcloneしたりpushしてイチャイチャする方法


##背景
自分のmacbook airが一回ぶっ壊れ、クリーンインストールしてました。
今までつくった herokuアプリと戯れたいなーと思って、
heroku git:clone -a [APP_NAME]か、ふんふん簡単！
と思ったら、10分ほどハマったのでメモ。

##対処法
```
'Permission denied (publickey). fatal: Could not read from remote repository.'
```

と出たら、まずは新しく鍵を追加してみる。

```terminal
$ssh-keygen -t rsa
```

そのときに、パスフレーズも設定しないといけないらしい。
~/.ssh/config の設定も忘れずに。

```~/.ssh/config
Host heroku
  HostName heroku.com
  IdentityFile ~/.ssh/[自分が鍵につけた名前]
  User git
  Port 22
  TCPKeepAlive yes
```

で、イケるかと思ったら！また再度 鍵が通らない。
どうやら、パスフレーズを覚えさせる ssh-add をやらなきゃいけなかったっぽい。

```terminal
$ssh-add ~/.ssh/[自分が鍵につけた名前]
$ssh-add -l #追加されてるか確かめる
```

私の場合はこれでOKでした！
Debian+VirtualBoxでNAT接続出来ないので状況メモ

よくわからんので現状を整理。なんでかなー。

## 概要

Windows 8にVirtualBoxをインストールし、Debian環境を準備した。VMにホストオンリーアダプターを追加、設定したところ、外部ネットワークに繋がらなくなった。

## 設定

### Windows 8.1

* 最近「Windowsのリフレッシュ」を行ったばかり

### VirtualBox

* v4.3.6
    * v4.0, 4.2も試したけど状況変わらず
* ホストオンリーネットワークを一つ作成済み
* IPv4 192.168.56.1,_ 255.255.255.0
* DHCP無効
    * 有効にしても変わらない

### VM

* アダプター1: （初期設定のまま）
    * NAT
    * ケーブル接続: ON
* アダプター2: （割り当て以外は初期設定のまま）
    * ホストオンリーアダプター
    * VirtualBox Host-Only Ethernet Adapter
    * プロミスキャスト: 拒否
    * ケーブル接続: ON

### Debian

* v7.3 (Wheezy)
* 最初にbasic system tools（だっけ？）のみ選択してインストール

#### `/etc/network/interfaces`の設定

末尾にホストオンリーアダプターの設定を追加したのみ。

```
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
iface eth0 inet dhcp

allow-hotplug eth1
iface eth1 inet static
  address 192.168.56.101
  netmask 255.255.255.0
  gateway 192.168.56.1
```

## 状況

* 外部ネットワークに接続出来ない
    * `ping example.com`でunknown host
    * eth1をdhcpにすると繋がる
    * eth1を設定しないと繋がる
* ホストオンリーは繋がる
    * SSHとか出来る
    * ホスト側のウェブブラウザーからApacheに繋がる
    * eth1をdhcpにするとIPv6は発行されるのにIPv4が発行されない（それはそれで謎）
* ちなみに起動時"Starting MTA"が遅い。ネットワークのタイムアウトを待ってる風。

### `ping`とか

```
ginpei@debian:~$ ping example.com
ping: unknown host example.com
```

```
ginpei@debian:~$ traceroute example.com
example.com: Name or service not known
Cannot handle "host" cmdline arg `example.com' on position 1 (argc 1)
```

### `ifconfig`の結果

```
root@debian:~# ifconfig
eth0      Link encap:Ethernet  HWaddr 08:00:27:7f:ce:63
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe7f:ce63/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1180 (1.1 KiB)  TX bytes:1152 (1.1 KiB)

eth1      Link encap:Ethernet  HWaddr 08:00:27:e3:04:28
          inet addr:192.168.56.101  Bcast:192.168.56.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fee3:428/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:199 errors:0 dropped:0 overruns:0 frame:0
          TX packets:164 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:18571 (18.1 KiB)  TX bytes:20350 (19.8 KiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
```
nginx+ghost+pm2で作るブログ環境(CentOS)


## 環境
- CentOS 6.5
- nginx v1.4.4
- node v0.10.24
- ghost v0.4.0
- pm2 v0.7.1


## nginxのインストール


/etc/yum.repos.d/nginx.repoを以下の内容で作成

``` /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1
````

これでyumでnginxをインストールできる。

```
sudo yum install -y nginx
```

nginx起動

```
sudo nginx
```


## nvmのダウンロード
node.jsの管理ツール、nvmをダウンロードします。

```
wget https://github.com/creationix/nvm/archive/master.zip
unzip master 
mv nvm-master/ .nvm
```

.bashrcとかに以下のコマンドを書いて、端末起動時にnvmを使えるようにします。

```.bashrc
source ~/.nvm/nvm.sh
```

## node.jsのインストール
nvmを使って、node.jsをインストールします。
ここでは、バージョンは0.10.24とします。
nvm起動時のデフォルトのバージョンも指定します。

```
nvm install v0.10.24
nvm alias default v0.10.24
```

## ghostのインストール
ghostのバージョンはv0.4.0にしています。

まずは、zipをダウンロードして解凍

```
wget --no-check-certificate https://ghost.org/zip/ghost-0.4.0.zip
unzip ghost-0.4.0.zip -d ghost
```

解凍したフォルダに移動して、インストール
設定ファイルもコピーします。

```
cd ghost
npm install --production
cp config.example.js config.js
```

## pm2のインストール
ghostをデーモン化するのにpm2を使います。
まずはインストール

```
npm install -g pm2	
```

ghostを起動

```
cd ghost # ghostのディレクトリに移動
NODE_ENV=production pm2 start index.js
```

ghost用にnginxの設定ファイルを作成します。

## 

``` /etc/nginx/conf.d/ghost.conf
server { 
    listen       80; 
    server_name  yourdomain.com; 
 
    location / { 
        proxy_pass http://localhost:2368; 
    }
}
```

nginxの設定を再読み込みします。

```
sudo nginx -s reload
```

ブラウザからyourdomain.comにアクセスすれば、ghostのトップページが表示されます。


![スクリーンショット 2014-01-18 16.04.21.png](https://qiita-image-store.s3.amazonaws.com/0/1332/cd5720e4-faca-5c48-0ea9-c1a262dc1278.png "スクリーンショット 2014-01-18 16.04.21.png")
Java ファイル 1 行ずつファイル読込

```java:Sample.java
import java.io.*;

public class Sample {
    public static void main(String[] args){
        String filename = "sample.txt";
        try (BufferedReader in = new BufferedReader(new FileReader(new File(filename)))){
            String line;
            while((line = in.readLine()) != null) System.out.println(line);
        } catch (FileNotFoundException e){ 
            e.printStackTrace();
            System.exit(-1); // 0 以外は異常終了
        } catch (IOException e){ 
            e.printStackTrace();
            System.exit(-1);
        }
    }   
}
```
Coderetreatの制限カタログ


## このドキュメントの目的

当ドキュメントは http://coderetreat.org/facilitating/activity-catalog の翻訳を基に、Coderetreatのファシリテーターになる方の助けとなるドキュメントをまとめたものです。


## 制限カタログ

Coderetreatがスタートしたら、Coderetreatの間、ファシリテーターは参加者に、やるべき活動や制約、課題を追加できます。しかし、もあしあなたがファシリテーターとしての経験が浅いのであれば、いつ、どんな活動を追加すべきかわからないでしょう。このページでは追加する制約や課題をカタログにまとめました。

ここにまとめられた制限の多くは、コードを書くことを異なったやり方で設計する手助けをします。どの制限も異なる学びを念頭においています。

Coderetreatでは下記のリストにまとめられた制限のみ追加できる、とは考えないでください。参加者と共にCoderetreatを進める上で、ベストな制限を見つけたのであれば、是非それを実施してください。むしろ、ここにあげられた制約を全く使わなくても良いのです。

### 新たも制限の提案するには

このリストに加えるべき制限があれば、ファシリテータグループフォーラムにある「セッションの間に参加者に課せられた制限がどんな練習になるの？(What are some exercises and constraints that people use during sessions?)」というトピックに投稿してください。
(注意：グループに投稿するには、予めグループに参加する必要があります。)

## 制限

### 基本

簡単な制限のため、経験の浅いグループによいでしょう。

- ピンポン(ぶつかり稽古) テストコード実装者とプロダクションコード実装者というように、セッション中に役割を決める。
- ペアプロのナビゲータとドライバを固定する。

### ツール制限

他のツールを使った時、より使いこなせるようになるために、開発者のツールを使わないようにする制限です。

- マウスを使わない
- テキストエディタを使わない
- 紙に実装する

### 言語機能制限

言語によくある機能を制限することで、より良い抽象化を学び、身に付けるための制限です。

- プリミティブを直接使わない
- 条件文を使わない
- ループを使わない

### 品質的に制限する

開発者としてより良いコードを書く練習をするための品質的な制限です。

- メソッドの実装行数を4行以下にする
- Immutableなクラスのみにする。

### 視点を転換する制限

Activities designed to stretch a group. Most of these activities tend to try to push developers into new ways of thinking about their code.

下記の一覧は視点を転換するための制限です。視点を転換することで、参加者がコードを書く時、新しい考え方で実装することを挑戦させます。

- クラス名に名詞を使わず動詞を使う
- セッション中、別のペアとコードを交換する
- ルールの抜け穴を小さくする
- あなたの考えるTDDを実践する
Visual Studio 2008でつくるOracle Pro*C サンプルプログラム

ブログに書いたよ。
<a href="http://d.hatena.ne.jp/replication/20140117/1389890134">Visual Studio 2008でつくるOracle Pro*C サンプルプログラム - 大人になったら肺呼吸</a> <a href="http://b.hatena.ne.jp/entry/d.hatena.ne.jp/replication/20140117/1389890134"><img src="http://b.hatena.ne.jp/entry/image/http://d.hatena.ne.jp/replication/20140117/1389890134" alt="はてなブックマーク - Visual Studio 2008でつくるOracle Pro*C サンプルプログラム - 大人になったら肺呼吸" border="0" /></a>
Windows7+Visual Studio 2005でOracle Pro*cファイルをビルドする

ブログに書いたよ。
<a href="http://d.hatena.ne.jp/replication/20140118/1390023422">Windows7+Visual Studio 2005でOracle Pro*cファイルをビルドする - 大人になったら肺呼吸</a> <a href="http://b.hatena.ne.jp/entry/d.hatena.ne.jp/replication/20140118/1390023422"><img src="http://b.hatena.ne.jp/entry/image/http://d.hatena.ne.jp/replication/20140118/1390023422" alt="はてなブックマーク - Windows7+Visual Studio 2005でOracle Pro*cファイルをビルドする - 大人になったら肺呼吸" border="0" /></a>
sudo gem install cocoapodsしてもpodコマンドが使えない


よくある通りgemを使ってcocoapodsをインストールしましたが、podコマンドが使えず。
コマンド自体はインストールされていることを確認できたのですがパスが通っていないようで...。

```Bash
$ sudo gem install cocoapods
$ pod
-bash: pod: command not found
```

１時間ぐらい調べましたがふとしたことから解決できました。

解決方法は簡単。
**ターミナルを再起動するだけです！**

みなさんお気をつけて。
Oracle/SqlServer構文対応表

最近またOracleとSqlServerの違いに苦しめられたので、前に作成した一覧を最新化。

いつかここにすべてのDBを乗せるのが夢だが、そもそも統一されているのが最大の夢だ。

[各種DB構文対応表](https://docs.google.com/spreadsheet/ccc?key=0AuJhzhTx2bOydEJJRHlDMzdsaFhGRGFKZWpOMjVpU3c&usp=sharing#gid=0)
enthumble キーカスタマイズ【基本編】

# <i class="fa fa-check-circle-o"></i> はじめに
## <i class="fa fa-check-square-o"></i> キーボード快適化ソフト | enthumble
[http://jp.enthumble.com/](http://jp.enthumble.com/  "enthumble")
使用頻度の高いキー操作を手もとで行えるようにする、簡単設定のカスタマイズソフト
Windows用フリーソフト | インストール不要 | 商用利用可 | 有料版はキーカスタマイズ可能

## <i class="fa fa-check-square-o"></i> キーカスタマイズ適用方法
<b>有料版のみ、キーカスタマイズが可能です</b>。有料版は、Keylist内の設定ファイル変更により、オリジナルのキーカスタマイズが可能です。

Keylist内のiniファイル編集後、enthumbleを再起動するかModeを切り替えてください。

一発設定リロードボタン(無変換 + appsKey)も活用してください。
*appsKeyとは右ctrlやaltの隣にあるキーです。

# <i class="fa fa-check-circle-o"></i> キーカスタマイズ解説
キー設定ファイル(./KeyList./****.ini)の中身を解説します。

## <i class="fa fa-check-square-o"></i> キー入力
```ini
Space={Enter}
```
イコール記号左側にキーボードのキー名を、イコール記号右側には代替入力したいキー名を記入します。この時、代替入力したいキー名を、<b>ブランケット"{}"</b>で挟んで記入します。上記設定では、無変換キー + Space で、Enterキーを入力します。enthumbleの文法は、[Autohotkey](https://sites.google.com/site/autohotkeyjp/reference/KeyList  "Autohotkey") と同じです。enthumble 自体、同ソフトで作成していますので。

## <i class="fa fa-check-square-o"></i> 直接入力
```ini
1=http://jp.enthumble.com/
m={+}hoge{#}
```
ブランケットなしで文字列を書くと、直接一度にタイプします。無変換 + 1 で、URLを入力しています。何度も入力するメールアドレス・URL・電話番号などを記憶させると便利です。特殊記号は、括弧で括れば入力できます。漢字等の入力には、本ページ下部のリンクからキーカスタマイズ応用編をご参照ください。

## <i class="fa fa-check-square-o"></i> 無入力
```ini
1={}
```
ブランケットのみでは、なにも入力しません。無変換 + 1 で、なにも入力しません。

## <i class="fa fa-check-square-o"></i> ctrl や shiftキーとの組み合わせ
```ini
b={shift down}{b}{shift up}
b=+{b}
c={ctrl down}{c}{ctrl up}
c=^{c}
```
Shiftキーと組み合わせたキー入力には、代替キーを{shift down}と{shift up}ではさみます。Ctrlキーを組み合わせをするには、{ctrl down}と{ctrl up}ではさみます。"+"や"^"でも同様に動作します。無変換 + b で、Shiftを押しながらbの動作、無変換 + c で、Ctrlを押しながらcを押す動作をします。

## <i class="fa fa-check-square-o"></i> マウスクリック
```ini
A={RButton} ;mouse right click
B={MButton} ;mouse middle click
C={LButton} ;mouse left click
D={WheelDown}
E=^{WheelUp};拡大 zoom up
F=^{WheelDown} ;縮小 zoom down
```
マウスクリックをキーボードで代替できます。Ctrlキーとの組み合わせもOKです。

# <i class="fa fa-check-circle-o"></i> リンク
こちらもご参照ください。

・[Readme 【説明書】](http://qiita.com/mhara/items/d2d072592a4db9243c99  "Readme 【説明書】") 
・[キーカスタマイズ【基本編】](http://qiita.com/enthumble/items/44064da2d77ddbd258b7  "キーカスタマイズ【基本編】")★現在のページ
・[キーカスタマイズ【応用編】](http://qiita.com/mhara/items/5ea8de992e8f99fce829  "キーカスタマイズ【応用編】")
・[キーカスタマイズ例 【開発者本人】](http://qiita.com/mhara/items/c666b487fbd06805527b  "キーカスタマイズ例 【開発者本人】")
・[キーカスタマイズ例 【ユーザー投稿】](http://qiita.com/tags/enthumble  "キーカスタマイズ例 【ユーザー投稿】")

以上
【俺にはできない】Google乗換案内に簡単アクセスできるブックマークレット【助けてくれっ・・・！】

【作りたいもの】
Google乗換案内に簡単アクセスできるブックマークレット

【仕様】
・Chromeで動作するブックマークレット
・押すとプロンプトが出てきて「行き先」を聞いてくる
・入力すると、新しいタブで「あらかじめハードコードしていた出発地点」から「行き先」のGoogle乗換案内の結果画面が出てくる
![WS000336.JPG](https://qiita-image-store.s3.amazonaws.com/0/1642/3c302c6e-7f6e-51ef-34a2-306d36627c2a.jpeg)


【わからんかったところ】
・新しいタブで開いたページの読み込みが完了してからコードを走らせる方法が分からん（onloadやreadyがきかねー）
・jQueryで書いていいのか分からん
・https://maps.google.co.jp/maps　を開いた状態なら作れたんだけどな

【遺書】
どうしてこんなことなったのか、私にはわかりません。

これをあなたが読んだなら、その時、私は死んでいるでしょう。
…死体があるか、ないかの違いはあるでしょうが。

これを読んだあなた。どうか真相を暴いてください。それだけが私の望みです。

レビ原圭一
Cactiのバージョンアップをしたメモ

cactiに必要なソフト
--------------

* [cacti](http://www.cacti.net/download_cacti.php)
* snmp
* rrdtool
* mysql (cactiの設定情報を保持。rrdtoolの結果は`rra`フォルダの`.rrd`ファイルに格納されています。)
* php
* apache

tar.gzを解凍してページにアクセスすると、バージョンアップウィザードが起動する。
旧rraフォルダの中身をコピーしておく。

設定ファイル修正
---------

* include/config.php
  * mysqlの接続情報
  * $url_path = "/cacti/"; //ページの相対パス


htmlのexportディレクトリ作成
-----------

* `html_export`なりディレクトリを作成しておき、cactiユーザー権限を付与。


ディレクトリの権限
-----------

* `rra`と`log`ディレクトリをcactiユーザー権限を付与。

cron登録
----------

```bash:cactiユーザーにて実行
*/5 * * * * /usr/bin/php /var/www/cacti/poller.php > /dev/null 2>&1
```

設定画面で便利なリンク
----------

* System Utilities -> Technical Support を開くと、設定でまずい箇所を赤文字表示してくれます。
* System Utilities -> View Cacti Log File を開いて赤色のエラーが出ていないことを確認。
　　` EXPORT FATAL ERROR: Export path '' does not exist! Export can not continue.`


設定後にディレクトリを変更したい場合
-----------
* mysqlのデータベース -> settingsテーブルのpath_webrootカラム値を修正。

plugin
----------

* [http://docs.cacti.net/templates](http://docs.cacti.net/templates)
Sinatra+kaminariでPaginationしたい


Sinatraでページネーションします。
こんかいはページネーションしたいデータがArrayだったので、Kaminariのpaginate_arrayを使う必要があります。



``` ruby:Gemfile
gem "sinatra"
gem "sinatra-contrib"
gem "hashie"
gem "tilt", github: "rtomayko/tilt", tag: "1.3.4"
gem "kaminari", :require => "kaminari/sinatra"
gem "padrino-helpers"
```

``` bash
bundle install --path .bundle
```


``` ruby:app.rb
require “sinatra”
require “padrino-helpers”
require “kaminari/sinatra”

helpers Kaminari::Helpers::SinatraHelpers

get "/" do 

  array = []
  data.each do |row|
    data = UserData.new
    data = row["userid"]
    data = row["count"]
    array << data
  end

  @userdata = Kaminari.paginate_array(array).page(params[:page]).per(18)

  erb :index
end

```

``` erb:view/index.erb
<%= paginate @userdata %>
```


``` bash
bundle exec ruby app.rb
```
コマンドラインから引数を取る

`-e` で、その後に渡すgnuplotファイルを実行する前に実行すべきコマンドを渡せる。
なのでそこで変数を定義すれば引数っぽく使える。

## 例
例えばこんな感じでシェルから `file` という変数としてデータファイルのパスを渡せば

```shell-session
gnuplot -e "file='some_dir/name_of_file'" test.gp
```

こうやって任意のデータファイルで図が書ける。

```gnuplot:test.gp
set datafile separator ','

# write to PDF
set terminal pdf
set output file.".pdf"

# plot
plot file.".csv" using 3:4 title "data"
```


## 例2
複数渡したいときは `;` で区切ろう。

```shell-session
gnuplot -e "file='some_dir/name_of_file'; legend='label of data'" test2.gp
```
スマホの画面サイズ取得

```js
// 画面幅
screen.width
// 画面高
screen.height
// 有効画面幅
screen.availWidth
// 有効画面高
screen.availHeight
// 表示領域幅
window.innerWidth
// 表示領域高
window.innerHeight
// ウィンドウ幅
window.outerWidth
// ウィンドウ高
window.outerHeight
// 表示領域幅
$(window).width()
// 表示領域高
$(window).height()
// 表示領域幅
document.documentElement.clientWidth
// 表示領域高
document.documentElement.clientHeight
// ドキュメント幅
$(document).width()
// ドキュメント高
$(document).height()
```
mysql.slow_logテーブルからmysqldumpslowする


### CSVに変換
```bash
$ mysql -hホスト -uユーザー -pパスワード --batch -e "SELECT *
FROM mysql.slow_log
ORDER BY start_time DESC
LIMIT 100000" | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > slow.csv
```

[参考](http://stackoverflow.com/questions/9536224/exporting-table-from-amazon-rds-into-a-csv-file)


### CSVをFILE形式に変換
```bash
$ wget https://gist.github.com/yoku0825/3910570/raw/e104fe5ccd9eda172b01ba4007665bfa633db2b4/csv2slowlog.pl
$ chmod +x csv2slowlog.pl
$ ./csv2slowlog.pl slow.csv > slow.log
```

### mysqldumpslow
```bash
$ mysqldumpslow -s t slow.log > dump.log
```

- query_timeなどは復元できないみたい
Sublime Text dired

#Sublime Text dired

[ __Sublime Text dired__ ](https://github.com/mkleehammer/dired)は、Emacsで使用できるディレクトリエディタdiredと同様な機能をSublime Textに実装したパッケージになります。たぶんSublime Text 3専用です。

##使い方
まずPackage Controlからdiredパッケージをインストールして下さい。`dired`ですぐ検索できると思います。
コマンドパレット（`Ctrl+Shift+p`）などで`dired`を選択すると、画面下のほうにテキストボックスが表示されます。
diredはこのテキストボックスに指定したパスの位置から開始されます。
デフォルトでは現在表示しているタブのカレントディレクトリが表示されますが、`tab`による補完も利くので任意のパスを指定してもいいです。
（もし`tab`による補完が利かない場合は下に記述してあるキーバインドが利かない場合を参考にしてみてください。）
![dired.PNG](https://qiita-image-store.s3.amazonaws.com/0/20878/c87704f2-4281-e024-d710-0b1b46f3a4a0.png)

diredが開始されると上の画像のような画面になり、キーバインドによるディレクトリ間の移動、ファイルの移動や名前の変更などをエディタ上で行うことができるようになります。
またdiredの途中でタブを切り替えてファイル編集などを行っても、再度diredのタブに切り替えれば操作を継続できます。
　

##キーバインド

キーバインドは以下のとおり。通常時とファイル名変更作業時ではキーバインドが変わります。
　

###通常時

|　キーバインド | 機能 |
|:----------:|:------------------|
| u          | 親ディレクトリへ移動  |
| n | カーソルを下に移動 |
| p | カーソルを上に移動 |
| c,d | 新規ディレクトリを作成 |
| c,f | 新規ファイルを作成 |
| D | ファイルを削除 |
| M | ファイル移動 |
| g | 任意のディレクトリに移動 |
| R | ファイル名変更 |
| r | 表示をリロード |
| m | マークをセットする |
| U | マークを削除 |
| t | すべてをマーク |
| *. | 任意の拡張子をマーク |
| Enter | ファイルを開く / ディレクトリに移動 |
| Ctrl/Alt/Cmd+Enter | 新規タブでファイルを開く / ディレクトリに移動 |
　

###ファイル名変更作業時

|　キーバインド | 機能 |
|:----------:|:-----------:|
| Ctrl+Enter | 新規タブでファイルを開く / ディレクトリに移動 |
| Ctrl+escape | 新規タブでファイルを開く / ディレクトリに移動 |
　

##各キーバインドが機能しない場合
キーバインドが機能しない場合は、diredディレクトリ内のDefault.sublime-keymapの記述をPreferences>Key Bindings – Userにコピーしてください。
もしSublime Text 3などでパッケージディレクトリ内にdiredディレクトリが無い場合は、その親ディレクトリにあるInstalled Packagesディレクトリ内に`dired.sublime-package`があるかと思いますので、その拡張子をzipに変えて解凍してください。

　
##（個人的な）目下の課題　→　mergeされました
以下の機能を追加したい。

+ ファジーなファイル検索と移動 → 適当な感じで実装した
+ パス取得 → 意外と難しい
+ 指定ディレクトリをサイドバーに追加 → 適当な感じで実装した
+ bookmark → 適当な感じで実装。プロジェクトのフォルダにも飛べるようにした。
+ ファイルの中身を画面分割でプレビュー → 適当な感じで実装した

上記のパス取得以外の機能を作者の方にpull requestした結果、mergeしていただきました。