OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScriptのGridライブラリ決定版 - SlickGrid

JavaScriptでグリッド表示を行ってくれるライブラリは色々あるが、その中でも一番しっくりきたSlickGridをご紹介。

※2016/3現在、SlickGridは更新が停止しています(2014/3/5より)。その代り、6pacという方が主要なバグフィックス(パッチ)を取り込んだ[alternative master](https://github.com/6pac/SlickGrid/wiki)を運用してくれているので、こちらの方を使うとよいです([オフィシャルからの公認](https://github.com/mleibman/SlickGrid/commit/bf4705a96c40fea088216034def4d0256a335e65)も出ています)。

JavaScriptのグリッド系ライブラリは下表のようにいろいろある。

| ライブラリ名 | 概要 | 
|:-----------|:------------|:
| [SlickGrid](https://github.com/mleibman/SlickGrid/wiki/Examples) | 今回お勧め。表示速度・編集機能に優れる |
| [DataTable](https://datatables.net/examples/) |初回の表示速度が若干遅いが、一旦表示したら早い|
| [jqGrid](http://trirand.com/blog/jqgrid/jqgrid.html) | 使ったことがないが、Exampleが豊富。ただ、オプションが書きにくい印象|
| [dhtmlGrid](http://dhtmlx.com/docs/products/dhtmlxGrid/) | 多機能でExampleも豊富。Excelにインポートできるのは圧巻。ただ、商用だと有料|
| [FlexGrid](http://flexigrid.info/) | 使ったことなし。あんまり更新されてないような・・・|

正直、表示だけするならどれも高機能で大差ないと思う。
ただ、多くのグリッド系ライブラリは、高機能な代わりに遅い＆書きにくかったり、編集機能はあるものの表示→編集モードへの切り替えがもっさりしていたり保存機能が書きにくかったりする。

その中で高速な表示、Excelかのような編集機能を備えているのがSlickGridだ。
「Excelみたいにできないの？」とはよく言われることでその言葉にそんな簡単じゃねーんだよ、とイラッとしたことがある人も多いかと思うが、SlickGridを使うことでお互いストレスフリーな関係を築けるだろう。

では、SlickGridのパワーが実感できる例を紹介したい。

## 1.パフォーマンス
このExampleで表示しているデータは、なんど500,000件である。他のグリッドが数万件表示可能！と言っているそばで、ケタが違う。何せExcel(2003)の限界行より多いんだからビックリだ。
http://mleibman.github.io/SlickGrid/examples/example-optimizing-dataview.html

## 2.編集機能
セル内編集が本当にスムーズである。下記のExampleで、Auto-edit ON のボタンを押してもらえればそのスムーズさを体感してもらえると思う。
http://mleibman.github.io/SlickGrid/examples/example3-editing.html
私は編集可能なグリッドライブラリを無償・有料関係なく探し回ったが、これほどスムーズなのは他になかった。しかも、Editorは自分で簡単に拡張可能だ。

## 3.値表示の自由度
例えば10を10%としてメーターで表示したり、0/1の数字をチェックマークで表示したりと、各列に応じて値をどう表示するかを自由にカスタマイズできる。多くのGridが行の色ぐらいしかいじれない中で、セル内の値をDOMレベルで編集できる機能は表現力の面で非常に大きい。
http://mleibman.github.io/SlickGrid/examples/example2-formatters.html

## その他の機能
他に独特なのは、以下のExampleだ。
・非同期の描画処理。表示が重たい処理(行内グラフなど)などは、非同期で処理できる。
http://mleibman.github.io/SlickGrid/examples/example10-async-post-render.html

・Undo機能まで実装可能。
http://mleibman.github.io/SlickGrid/examples/example3b-editing-with-undo.html


もちろん、セル/行のイベントハンドリングやソート機能など、普通のグリッドライブラリにあるようなものはきちんとそろっている。
ぜひ使ってみていただきたい一品である(なお前提ライブラリとしてjQuery/jQuery.event.dragが必要。jQuery UIはcssがいるがjsは読み込まなくても動かせる)。
![slickgrid.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/4e5e967c-fb0a-0333-13ce-8543f39ace0d.png)
不要なユーザを強制ログアウトさせる


bashでリモート環境へのセッションが残ってしまったなどの不要なユーザを強制的にログアウトさせるコマンドのメモ。


## wコマンドでユーザを調べる

wコマンドでログアウトさせたいユーザを探す

```
$ w
 20:16:19 up 1 day,  5:45,  2 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
imajo    pts/0    6.41.102.121.dy. 20:09    6:47   0.00s  0.00s -bash
imajo    pts/1    6.41.102.121.dy. 20:10    0.00s  0.01s  0.00s w
```

pts/0をログアウトさせたい（pts/1のyimajoはwコマンドを使っている自分自身）。

## sshdを使っているプロセスを表示

psコマンドからsshdを使ってるプロセスを表示

```
$ ps ax | grep sshd
```

出力は次のようになる

```
$ ps ax | grep sshd
26519 ?        Ss     0:00 /usr/sbin/sshd
27126 ?        Ss     0:00 sshd: yimajo [priv]
27128 ?        S      0:00 sshd: yimajo@pts/0
27148 ?        Ss     0:00 sshd: yimajo [priv]
27150 ?        S      0:00 sshd: yimajo@pts/1
27172 pts/1    S+     0:00 grep sshd
```

27128が終了させたいプロセス番号ですよと。

## killでプロセスを終了させる

killコマンドで9(SIGKILL)を送信してプロセスを終了させる。
kill -9 <プロセスID>で指定するだけ


```
kill -9 27128
```

最後にもう一度wコマンドを打ってkillできたかを確認しておわり
Google AnalyticsにNavigation Timing APIの値を送信する方法

1年ほど前に自分が書いた記事

http://qiita.com/1987yama3/items/3d9b63bc1abb622bb8c1

の **Navigation Timing API** を, Google Analyticsのデータとして送信して, Google Analyticsで閲覧者のNavigation Timing APIのデータを見れるようにしようと思い立って, コードを書いてみました.

基本は下記のJavaScriptの関数をコピペして自サイトのGoogle Analyticsが動いているページに埋め込んだあと,  **gaPerformance** 関数を適切なタイミングで実行すればできると思います.

ただ, 適切なタイミングが難しく, onLoadイベント内で行うと, **window.performance.timing.loadEventEnd**の値が入らないためトラッキングできなくなると思うので注意が必要です.

自分の場合は,

```js
$(function () {setTimeout(gaPerformance, 3000);});
```
などとして, onLoadイベント内で3秒後に **gaPerformance** を起動する, とかやってますが, 他にいい方法があれば是非教えてください.


なお, コードはGithubにもあげてみました
https://github.com/1987yama3/ga-navigation-timing

```ga-navigation-timing.js
function gaPerformance () {
   var sendEvent = function (category, action, label, value, opt_noninteraction) {
      category = category || 'Performance';
      if (typeof value !== 'undefined' && value < 0) {
         return;
      }
      if (typeof _gaq !== 'undefined' && typeof _gaq.push === 'function') {
         _gaq.push(['_trackEvent', category, action, label, value, opt_noninteraction]);
      }
   };
   if (typeof window.performance !== 'undefined') {
      var navigation = window.performance.navigation;
      var timing = window.performance.timing;

      sendEvent(undefined, 'Navigation', 'RedirectCount', navigation.redirectCount, true);
      sendEvent(undefined, 'Timing', 'Redirect', (timing.redirectEnd - timing.redirectStart), true);
      sendEvent(undefined, 'Timing', 'Application Cache', (timing.domainLookupStart - timing.fetchStart), true);
      sendEvent(undefined, 'Timing', 'DNS Lookup', (timing.domainLookupEnd - timing.domainLookupStart), true);
      sendEvent(undefined, 'Timing', 'TCP Connection', (timing.connectEnd - timing.connectStart), true);
      sendEvent(undefined, 'Timing', 'Request Time', (timing.responseStart - timing.requestStart), true);
      sendEvent(undefined, 'Timing', 'Response Time', (timing.responseEnd - timing.responseStart), true);
      sendEvent(undefined, 'Timing', 'DOM Interactive Time', (timing.domInteractive - timing.domLoading), true);
      sendEvent(undefined, 'Timing', 'DOM Complete', (timing.domComplete - timing.domLoading), true);
      sendEvent(undefined, 'Timing', 'onLoad Event', (timing.loadEventEnd - timing.loadEventStart), true);
      sendEvent(undefined, 'Timing', 'Total Time', (timing.loadEventEnd - timeing.navigationStart), true);
   }
}
```
AndroidアプリがInstall Referrerを受け取るまでの時間について調べてみた

Google PlayからインストールしたアプリにはInstall Referrerというのを持たせて、
どこからアプリをインストールしたかをわかるようにする機能がある。
しかし、ダウンロードしてきたアプリに予め設定されているのではなく、
アプリインストール後にリファラーを受信するという順番のようです。

インストールからリファラー受信までのタイムラグが気になったので、
調べるだけのアプリを作ってみました。

## アプリ
[Install Referrer Tester -GooglePlay](https://play.google.com/store/apps/details?id=jp.kaidempa.installreferrertest)
（上記のリンクにはリファラーついてないです。）

リファラー付きのリンクはこちら↓
![82fe174e1fedfbe2fadda7d8eab77f20.gif](https://qiita-image-store.s3.amazonaws.com/0/29854/365ba59d-2b26-1c64-2996-3c14451341a6.gif)

# 結果
早速ですが結果がこちら。（ちょっとバグったままなのでミリ秒がでてないっす。）
![Screenshot_2013-09-23-18-24-47.png](https://qiita-image-store.s3.amazonaws.com/0/29854/343ec970-3fcb-5689-8f6a-0a5f5d9e74ff.png)
上の結果だと、0秒で受信していることがわかります。
何回か試した結果、5秒とか6秒の時もありました。
もっと試行回数を増やして、収束させたいです。

## アプリの説明
Activity一つの簡単なアプリです。
自動で画面がリフレッシュしないので、表示された情報を更新するためには、
一旦アプリを終了して、もう一度起動してください^^;

| 項目 | 説明 |
|:-----------|------------:|
| Install App Datetime |  Installとありますが、初回起動時の時間です。 |
| Referrer Recieve Datetime | リファラーを受信した時間です。 |
| Time Lag | 上2つの差分です。 |
| Install Referrer Value | リファラーの値です。 |

# まとめ
自分で調べていてなかなか具体的な受信までの時間が調べられなかったので、ばーっとつくってばーっと書きました。
なのでいろいろあらが目立ちますねｗ
もしインストールリファラーを受け取るまでの時間が気になった人は、1回試してみていただけたらと思います。

## この記事は、以下の記事を参考にしました。
[Androidアプリがどこからインストールされたかを取得する方法](http://www.abe3.net/2013/05/google-play-referrer/)
[Androidでインストール時のリファラ情報を取得する](http://dev.classmethod.jp/smartphone/android-referrer/)

### あとでやること

* AndroidのOSにより、リファラーを受け取るタイミングが違うようです。
簡単にまとめて追記します
[Android MarketのINSTALL_REFERRERが送出されていない？](https://groups.google.com/forum/#!searchin/android-group-japan/INSTALL_REFERRER%7Csort:relevance/android-group-japan/Ys-4XOCgwdA/tBLAEPFcK9EJ)

* 文言なおす
* Githubにコード上げて突っ込んでもらう
* アプリもうちょっと良くする。
再帰的に探索

前回の続き
[Ruby - select + mapを1つのメソッドで - Qiita [キータ]](http://qiita.com/crispy/items/de72b1619a24683eb96f)


いわゆる探索のコーディングスタイルについて。
ワイルドカードの使い方を良く知らない人が、指定ディレクトの中から条件に沿うファイル(ファイル名の最後が数値で終わる)を探して配列で返す関数を作りたいとする。


今まではこう書いていた。


```rb
def obtain_file_list(path=".", acc=[])
  Dir::glob("#{path}/*").each do |child_node|
    if FileTest.directory?(child_node)
      obtain_file_list(child_node, acc)
    else
      if child_node =~ /\d$/
        acc << child_node
      else
        acc
      end
    end
  end

  acc
end

p obtain_file_list("/usr/local/Cellar")
```


ただ、eachを使って変数の中身を変更するのがキモい。という価値感が出てきたので、
最近はflat_mapを使用した書き方をするようになってきた。


```rb
def obtain_file_list(path=".")
  Dir::glob("#{path}/*").flat_map do |child_node|
    if FileTest.directory?(child_node)
      obtain_file_list(child_node)
    else
      if child_node =~ /\d$/
        child_node
      else
        []
      end
    end
  end
end

p obtain_file_list("/usr/local/Cellar")
```


これだと、変数を一切破壊せずに実行できてキモい。


<ins>追記</ins>
>slimymars がコメント 2日前
>外のを壊したくないならEnumerable#injectとか。


なるほど。これはこれで、まだ言語化しにくい違和感が。


```rb
def obtain_file_list(path=".")
  Dir::glob("#{path}/*").inject([]) do |acc, child_node|
    if FileTest.directory?(child_node)
      acc + obtain_file_list(child_node)
    else
      if child_node =~ /\d$/
        acc << child_node
      else
        acc
      end
    end
  end
end

p obtain_file_list("/usr/local/Cellar")
```
任意の文字列に色を付ける hi-lock-mode

# 目的

何かのソースコードを読んでいて、例えばある変数が、ソースの中でどのように使われているかを知りたい場合、その変数名に色を付けて、ソースの中で目立つようにしておくことができます。

# 方法

`M-s h r` を入力すると、ミニバッファで `Regexp to highlight (default XXX):` という感じで入力待ちになるので、ここに色を付けたい変数名を入力して Enter を入力する。

続いてミニバッファに `Highlight using face: hi-yellow` と表示されるので、とりあえずそのまま Enter を入力。  

すると入力した変数名の部分に hi-yellow で色が付く。

# 応用

付加した色を削除したい場合は、 `M-s h u` で変数名を入力(選択) して Enter を入力する。

付ける色を変更したい場合は、 `Highlight using face: hi-yellow` と表示されている時に、 `yellow` の部分を削除して Tab を入力すれば、色名の候補が表示されるので、好きな名前を選択する。

例えば 'sock' に色付けしたいが、 'socket' は色付けしたくない場合は、 `Regexp to highlight (default XXX):` が表示されている時に、 `\Wsock\W` と入力する(注：前後の記号にも色が付く)。つまり正規表現も使用できる。

# さらに

`C-s` や `C-r` でインクリメンタルサーチを実行中に、 `M-s h r` を入力すると、その検索中の文字列に対して、色を付けることができる。

# 参考

[Hi Lock](http://www.emacswiki.org/emacs/HiLock)
interface型でない変数の型アサーション

型アサーション

```go
t, ok := x.(T)
```

のxはinterface型でないといけないので
interface型でない変数に対してメソッドを実装してるかどうか確認するには
一度interface型にキャストしないといけないらしい。

```go
type Tester interface {
	Test()
}

type A struct{}

func (a A) Test() {
	fmt.Println("called A.Test()")
}

func main() {
	a := new(A)
	tester, ok := interface{}(a).(Tester)
	//tester, ok := a.(Tester) //ERROR!
	fmt.Println("a is a Tester:", ok)
	tester.Test()
}
```

http://play.golang.org/p/ls7nOtceXA
Fedora 19 で PostgreSQL サーバ起動しようとしたらコケた

```bash
sudo yum install postgresql-server
```

した後に PostgreSQL サーバを起動しようと

```bash
sudo systemctl start postgresql.service
```

と実行するも

```text
Job for postgresql.service failed. See 'systemctl status postgresql.service' and 'journalctl -xn' f
or details.
```

とエラーが出て困った．エラーメッセージの指示通り `journalctl -xn` で詳細を見ると，

```bash
sudo postgresql-setup initdb
```

しろとある．こんなこと今までやる必要あったっけ…？Ubuntu Server ではこんなことやった記憶が無い…

まぁいいやととりあえずやってみたら初期化出来たらしく，エラーが出ること無く無事 PostgreSQL サーバ起動成功．
osxでwine使ってwindowsのソフトをDockから使う

まずwineが入っててコマンドラインから立ち上げられる前提です。

自分はID ManegerをMacで使いたいので `~/wine/idm/IDM.exe` に実行ファイルが置かれています。
あとwine本体は `/usr/local/bin/wine` にインストールされてます。確かbrew使って入れました。

## 設定方法

まず Spotlight で ”ActionScriopt エディター”を立ち上げて
```
do shell script "/usr/local/bin/wine /Users/ironsand/wine/idm/IDM.exe
```
と貼り付ける。

メニューの[ファイル]->[保存]から適当な名前をつけてフォーマットを アプリケーション で保存する。

## アイコンを変える

保存したアプリを右クリックして「情報を見る」でプロパティ画面を開く。
あとアイコンにしたい画像も開く。
プレビュー画面で画像を全部選択して Command+Cでコピー
プロパティ画面の左上のアイコンを選択した状態で Command+V で貼付けして変更。

(何でこんな意味不明の手順踏まないとダメなの…。)

あとはDockに入れれば終了！

## 参考

Executable script in OS X for standalone windows software - Persistent Inappeasable Mind
http://pim.famnit.upr.si/blog/index.php?/archives/15-Executable-script-in-OS-X-for-standalone-windows-software.html

osx - How can I change an application icon in Mac OS X? - Super User
http://superuser.com/questions/37811/how-can-i-change-an-application-icon-in-mac-os-x
sipsで画像リサイズ

```bash:
$ sips  -Z 1280 *.jpg
```

* -Z ・・・ 縦横比維持
* 1280 ・・・ 解像度
* *.jpg ・・・ 拡張子 .jpg を対象

元画像がそのまま変更されるので、実行前にバックアップとっておくとよい
AWS EC2にredisをインストールする

## Amazon Linux

Amazon Linux AMIならgccとかインストールしなくても次のコマンドでインストールが終わる．

```
$ sudo yum --enablerepo=epel install redis
```

epelだとバージョンが古いので，remiを使うとよい．

```
$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
$ sudo yum --enablerepo=remi install redis
```

remiリポジトリは4.0系に更新されている．(2017年8月)
<http://rpms.famillecollet.com/enterprise/6/remi/x86_64/repoview/redis.html>
  
## Amazon Linux 2

Amazon Linux 2は`amazon-linux-extras`コマンドでインストールできる．

```
$ sudo amazon-linux-extras install redis4.0
```
JavaScriptにもflatMapを！

[この記事](http://qiita.com/crispy/items/de72b1619a24683eb96f)を読んでJavaScriptにも`flatMap`が欲しくなったので作ってみた。

まずは普通の関数

```js:func_flatMap.js
function flatMap(xs, f) {
  return xs.reduce(function (ys, x) {
    return ys.concat(f(x));
  }, []);
}

//=> [4, 12, 20, 28, 36]
console.log(flatMap([1,2,3,4,5,6,7,8,9,10], function (x) {
  return x % 2 === 1 ? [x << 2] : [];
}));
```

ネストがアレです。

次は`Array.prototype`の拡張

```js:prototype_flatMap.js
Object.defineProperty(Array.prototype, 'flatMap', {
  value: function (f, self) {
    self = self || this;
    return this.reduce(function (ys, x) {
      return ys.concat(f.call(self, x));
    }, []);
  },
  enumerable: false,
});

//=> [4, 12, 20, 28, 36]
console.log([1,2,3,4,5,6,7,8,9,10].flatMap(function (x) {
  return x % 2 === 1 ? [x << 2] : [];
}));
```

列挙しないようにしてますけど、他のライブラリと競合すう可能性ありそうだな……。

最後に、[underscore.js]でやってみました。

```js;underscore_flatMap.js

var
_ = require('underscore');

var
flatMap = _.flatMap = _.concatMap = function (xs, f, self) {;
  return _.reduce(xs, function (ys, x) {
    return ys.concat(f.call(self, x));
  }, []);
};

_.each(['flatMap', 'concatMap'], function (name) {
  _.prototype[name] = function (f, self) {
    return _(flatMap(this.value(), f, self));
  };
});

//さっきよりシンプルになったように見えるのは_.rangeのおかげ？
console.log(_.flatMap(_.range(1, 11), function (x) {
  return x % 2 === 1 ? [x << 2] : [];
}));

//こういう風にも書ける
console.log(_(_.range(1, 11)).flatMap(function (x) {
  return x % 2 === 1 ? [x << 2] : [];
}).value());
```

というか何で[underscore.js]には`flatMap`が無いのでしょう？　解せません。

あと、ここに載せたコードは煮るなり焼くなり好きにしてやって下さい。

[underscore.js]: http://underscorejs.org/
Linuxサーバの機種,シリアル番号,メモリ枚数など取得方法

```bash:CentOS5以降
$ sudo /usr/sbin/dmidecode --string="system-product-name"
ProLiant DL360 G4
$ sudo /usr/sbin/dmidecode --string="system-serial-number"
JPT725A811      
```

```bash:CentOS4まで
$ sudo /usr/sbin/dmidecode
```
LoadLibraryに失敗

職場で起こったことです。
私たちはVisual Studio 2005を使ってExcelのアドインを開発しています。
今回の作業は32bitプロセスで動いているアドインを64bitプロセスに移植する作業でした。

このアドインは他社が作成したDLLをロードしていることが分かっていましたので、その会社に64bitプロセス用のDLLを作成したいただくように依頼しました。これは64bitプロセスから32bitプロセス用のDLLはロードできないと知ったからです。（kernel32.dllはロードできるみたいですが、なぜなんでしょうか？本当はロードできていない？）

しばらくして、64bitプロセス用のDLLが届き、LoadLibrary関数でこのDLLをロードしてみると戻り値が0となり、DLLのロードに失敗してしまいました。下記では、このロード対象DLLをHoo.dllとします。

Visual Studio 2005の出力をみると、ExcelのアドインからHoo.dllをロードしているのですが、すぐにアンロードするのです。そして、LoadLibrary関数の戻り値は0です。

このDLLだけをロードするプロジェクトを作成してみて、ようやく原因がわかりました。mfc110.dllが見つからないという旨のエラーメッセージが表示されたからです。

こいつを調べると、Visual Studio 2012のDLLらしいのです。つまり、Hoo.dllの開発環境にあったDLLが実行環境になかったため、ロードに失敗していたのです。

[Visual Studio 2012 更新プログラム 3 の Visual C++ 再頒布可能パッケージ](http://www.microsoft.com/ja-jp/download/details.aspx?id=30679)をダウンロードして、インストールするとロードに成功しました。

以上です。
Plistの書き換え

PlistはほぼXMLのような構造なので、最初はPythonで適当にスクリプト書いたが、書き換え後に初めの2行がうまく出力されなかったり、色々と脆そうな感じだった。

初めはPlistのことがよく分かっていなかったので、上記の方法を取ったが、結局Objective-Cのオブジェクトをシリアライズしたものだと分かった。もちろんシリアライズ・デシリアライズはObjective-Cで簡単に書けるので、そちらの形式で改めて書いてみたら、やはりこちらの方がずっと簡単で堅牢な感じになった。

```objc
// 引数として与えられる想定
NSString *filePath = [NSString stringWithUTF8String:argv[1]];
NSString* key = [NSString stringWithUTF8String:argv[2]];
NSString* value = [NSString stringWithUTF8String:argv[3]];
// plistファイルをデシリアライズしてさらに変更可能なDictionaryに
NSMutableDictionary* plistDict = [[NSDictionary alloc] initWithContentsOfFile:filePath].mutableCopy;
NSString* originalValue = plistDict[key];
NSLog(@"filePath: %@. key: %@ ( %@ + %@ )", filePath, key, originalValue, value);
// Suffixを付与
plistDict[key] = [originalValue stringByAppendingString:value];
// 元のファイル名で上書き
[plistDict writeToFile:filePath atomically:YES];
```

コマンドラインプロジェクトとして作成した、一式はこちら。
[PlistLib](https://github.com/mono0926/PlistLib)
~Libというわりにすごくスペシフィックな感じだけど、他に用途増えたらもう少し拡充させていくかも。
RSpecの出力をカスタマイズする方法

RSpecの出力をカスタマイズする方法。
例えばテスト中に計測した統計情報とか、そういうものを出力内容に含めたい時に便利。

結論から言うと、自分でFormatterやPrinterを作って、RSpecにこれを使え、って指定すれば良い。

```txt
# コマンド例
rspec -r my_html_formatter.rb -r my_html_printer.rb --format MyHtmlFormatter myapp_spec.rb
```

「-r」は外部のソースファイルを読み込ませるオプション。
そのファイルに書かれてるクラスや関数などが、specファイルの中で使用可能になる。

「--format」はFormatterの指定 (クラス名を書く、ファイル名じゃないよ！)。
Formatterは当然別ファイルに書かなきゃいけないので、別途「-r」で読み込んでおく。

Printerは実際に出力するHtmlソースなどを記述する。

***

オレオレFormatterの書き方だけど、RSpec内のデフォルトのFormatterクラスを継承して、
好きなように書き換えれば良い。こんな感じ。

```ruby
require 'rspec/core/formatters/html_formatter'
require 'my_printer'

class MyHtmlFormatter < RSpec::Core::Formatters::HtmlFormatter

  # 例えばテスト成功時、通常出力の後に、オレオレ出力を出したいとする
  def example_passed(example)
      super
      @printer.print_my_result
  end
end
```

詳しくはRSpecのソースコードを[参照](https://github.com/rspec/rspec-core/blob/master/lib/rspec/core/formatters/html_formatter.rb)！

***

RSpecではFormatterは「あれを出力して、次にこれを、最後にそれを出力」みたいな
ことを書いてるに過ぎなくて、実際のHTMLソースはPrinterが持っている。

これもコードを[見てみよう](https://github.com/rspec/rspec-core/blob/master/lib/rspec/core/formatters/html_printer.rb)。

これも継承して、オレオレ出力用のメソッドを追加しておこう。

```ruby
require 'rspec/core/formatters/html_printer'

class MyHtmlPrinter < RSpec::Core::Formatters::HtmlPrinter

  def print_my_result
    @output.puts "<div>"
    @output.puts "なんか役に立つ結果！"
    @output.puts "</div>"
  end

end
```

既存の表記やデザインが気に食わないなら、
print_example_passed とか print_example_failed などをいじってみよう。

実際には、あれもこれもとカジュアルに追加できるようなHtml構造にはなっていなくて、
適当にブロックを追加してみたらデザインが崩れた…、なんてこともあるので、
割と細かい調整が必要になってしまうかもしれない。

***

なお、テスト中に色々なデータを集めたりするには、
before, after, each を上手に活用してみよう。
ウェブページをキャッシュで保存してオフライン閲覧するためのシンプルな実装


　UIWebViewで読み込んだウェブページをキャッシュ（Cache）で保存して、オフラインで閲覧するための実装です。
　今回は、あとで読む機能を搭載する「Pocket」などのアプリように、テキストデータのみを抽出して保存するのではなく、テキスト・画像・サイドバーなどのすべてのページの状態を記録する手法をとります。つまり、見たページをそのまんま保存するということです。

　こちらが[サンプルコード](https://github.com/EntreGulss/CachedWebpage)です。

　ページキャッシュの実装方法は基本的に、こちらの記事「[Drop-in offline caching for UIWebView (and NSURLProtocol)](http://robnapier.net/blog/offline-uiwebview-nsurlprotocol-588)」を参考にしています。
　ちなみに、プログレスバーの実装はこちらの記事「[UIWebViewにプログレスバーを出すためのモジュールを作りました](http://ninjinkun.hatenablog.com/entry/2013/04/22/130200)」を参考にしました。

## (1) 必要なファイル・プレームワーク

* Reachability.h
* Reachability.m
* RNCachingURLProtocol.h
* RNCachingURLProtocol.m
* SystemConfiguration.framework（フレームワーク）

## (2) 実装
　「RNCachingURLProtocol」は、ネットワークのプロトコルをカスタムしています。「AppDelegate.m」でこのプロトコルを以下のように設定してしまいます。すると、どこでNSURLConnectionを使っても、このプロトコルに従って動くようになります。
　少し工夫するとプロトコルを、通常と「RNCachingURLProtocol」のモードを切り替えるように実装することもできると思います。

```AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // プロトコルの設定
    [NSURLProtocol registerClass:[RNCachingURLProtocol class]];

	.
	.
	.
}
```

　このプロトコルの挙動は、

* **初めての読み込みのときは普通にロードする。**
* **一度読み込みが完了した場合、それをキャッシュディレクトリに保存する。**
* **次読み込んだときに、すでにキャッシュが保存されていればそれをUIWebViewに表示する。**

となっています。

　あとは、通常と同じようにUIWebViewでページを読み込めばこのプロトコルに従って読み込みが開始されます。

```WebViewController.m
- (void)reloadWebView 
{
    [self.webView loadRequest:[[NSURLRequest alloc] initWithURL:[NSURL URLWithString:_urlString]]];
}
```

## (3) もっとできそうなこと

* 記事全体を保存するのではなく、テキストだけを抽出する機能
* ページに含まれる画像だけを抽出して保存する機能
* 保存した記事の情報をユーザーが管理する機能（delegateメソッドなどの実装？）
* 読み込んだページだけでなく、それに含まれるリンク階層の部分も含めて保存する機能


※ 参考記事：
[ネットワーク接続が3GかWifiか圏外かを調べる簡単な方法 - YoheiM .NET](http://www.yoheim.net/blog.php?q=20120625)
ByteBufferでbyte[]をdouble[]に変換する

ざっくり書くとこんなかんじ。

```java
// バッファサイズは使いながら増やせないので、最初に必要なだけ確保する。
// バイトオーダのデフォルトはビッグエンディアン
ByteBuffer byteBuf = ByteBuffer.allocate((int)fileDiscriptor.getLength())
                               .order(ByteOrder.LITTLE_ENDIAN);

// ファイルチャネルから直接読む
FileChannel channel = fileDiscriptor.createInputStream().getChannel();
channel.read(byteBuf);

// バッファ書き込みから読み出しモードに切り替える
byteBuf.flip();

// バッファの中身をdoubleの値として書き出す
double[] res = new double[byteBuf.capacity() / (Double.SIZE / 8)];
for (int i = 0; i < res.length; i++) {
   res[i] = byteBuf.getDouble();
}
```

最初は`res = byteBuf.asDoubleBuffer().array()`としていたが、これだとUnexpectedOperationみたいな例外が飛んできて怒られた。`ByteBuffer#asDoubleBuffer()`は`double[]`をallocateしないということなのだろうか。いろいろ悩んだ結果最後の`for`文のようにした。

ところで、[件のメソッドのテストコード](http://tools.oesf.biz/android-4.3.0_r3.1/xref/external/apache-harmony/nio/src/test/java/common/org/apache/harmony/nio/tests/java/nio/ByteBufferTest.java#825)を読んでいて気になった。`doubleBuffer.remaining()`が0のとき、アサーションを全く通らずにテストが成功してしまう。私の上のコードでは`byteBuf.asDoubleBuffer().remaining()`が0になるんだよなー…
Corona: タッチ位置に矩形を表示する


```lua:
-- タッチ位置に矩形を配置するサンプル

function onTouch(event)
    if event.phase == "ended" then
        local size = 30
        local left = event.x - size / 2
        local top  = event.y - size / 2
        display.newRect(left, top, size, size)
    end
end

Runtime:addEventListener("touch", onTouch)
```

タッチイベントが発生したときのコールバック関数として onTouch 関数を登録します。

onTouch 関数に渡される event の中身をログ出力してみると以下のようになっています。

```
 ---
 y	376
 x	151
 time	5617.801
 id	userdata: 0x1000e650
 phase	began
 yStart	376
 xStart	151
 name	touch
 ---
 y	377
 x	154
 time	6198.404
 id	userdata: 0x1000e650
 phase	moved
 yStart	376
 xStart	151
 name	touch
 ---
 y	377
 x	154
 time	6788.04
 id	userdata: 0x1000e650
 phase	ended
 yStart	376
 xStart	151
 name	touch
```
CSSセレクタの優先順位の計算方法

### はじめに
* セレクタには優先順位があり、点数計算して高得点のものが適用される
* 点数計算のやり方を以下に記述する

### 計算式
* 以下の点数を加算していく

| 指定方法           | 例                         | 点数     |
|:---------------------|:-----------------------|----------:|
| タグのstyle属性 | style="color: red;"                | 1000点 |
| ID                       | #hoge                  | 100点   |
| クラス                 | .hoge                   | 10点     |
| 属性セレクタ         |  a[href*="google"]  | 10点     |
| 要素名               |  ul                          | 1点       |
| 擬似要素           | :first-child             | 1点       |
| ユニバーサルセレクタ      | *                           | 0点       |

### 計算例

| 例                         | 計算                 | 合計点 |
|:-----------------------|:--------------------|----------:|
| style=""                | 1000(style属性) | 1000点 |
| #hoge                  | 100(ID属性) | 100点 |
| li.color.label         | 1(要素名) + 10(クラス属性) + 10(クラス属性) | 21点 |
| table tr td.color    | 1(要素名) + 1(要素名) + 1(要素名)  + 10(クラス属性) | 13点 |
| div + *[href$="com"] | 1(要素名) + 0(ユニバーサルセレクタ) + 10(属性セレクタ) | 11点 |
| h1 div + span   | 1(要素名) + 1(要素名) + 1(要素名)| 3点 |
| li:last-child | 1(要素名) + 1(擬似要素) | 2点 |

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
Xquartz.appを起動したときにxtermが自動起動されるのをやめたい

インストールしたてのXquartz.appを起動するとxtermが起動しますが、正直…OS X付属のTerminalで満足しているので、起動する必然性はあまりありません。

では、xtermを起動しないようにするにはどうしたらいいのでしょうか。

- 『[X11 の起動時に自動実行されるアプリケーションを変更するには](http://osx.miko.org/index.php/Beginning_OS_X_Lion/%E9%81%8B%E7%94%A8%E7%B7%A8#X11_.E3.81.AE.E8.B5.B7.E5.8B.95.E6.99.82.E3.81.AB.E8.87.AA.E5.8B.95.E5.AE.9F.E8.A1.8C.E3.81.95.E3.82.8C.E3.82.8B.E3.82.A2.E3.83.97.E3.83.AA.E3.82.B1.E3.83.BC.E3.82.B7.E3.83.A7.E3.83.B3.E3.82.92.E5.A4.89.E6.9B.B4.E3.81.99.E3.82.8B.E3.81.AB.E3.81.AF)』

このページをもとに試してみました。

まずはXquartz.app起動時に自動実行されるアプリケーションのデフォルトを調べます。

    h12o@exegesis:~$ defaults read org.macosforge.xquartz.X11
    {
        SULastCheckTime = "2013-09-19 07:38:42 +0000";
        "app_to_run" = "/opt/X11/bin/xterm";
        "apps_menu" =     (
                    (
                Wireshark,
                "/usr/local/bin/wireshark",
                w
            )
        );
        "cache_fonts" = 1;
        "done_xinit_check" = 1;
        "login_shell" = "/bin/sh";
        "no_auth" = 0;
        "nolisten_tcp" = 1;
        "startx_script" = "/opt/X11/bin/startx -- /opt/X11/bin/Xquartz";
    }
    h12o@exegesis:~$ 

「"app_to_run" = "/opt/X11/bin/xterm";」がそれです。

そこで以下を実行します。

    h12o@exegesis:~$ defaults write org.macosforge.xquartz.X11 app_to_run ""

ついでにログインシェルもOS Xのデフォルトにそろえておきます。

    h12o@exegesis:~$ defaults write org.macosforge.xquartz.X11 login_shell "/bin/bash"

すると以下の通りとなります。

    h12o@exegesis:~$ defaults read org.macosforge.xquartz.X11
    {
        SULastCheckTime = "2013-09-19 07:38:42 +0000";
        "app_to_run" = "";
        "apps_menu" =     (
                    (
                Wireshark,
                "/usr/local/bin/wireshark",
                w
            )
        );
        "cache_fonts" = 1;
        "done_xinit_check" = 1;
        "login_shell" = "/bin/bash";
        "no_auth" = 0;
        "nolisten_tcp" = 1;
        "startx_script" = "/opt/X11/bin/startx -- /opt/X11/bin/Xquartz";
    }
    h12o@exegesis:~$ 
    
これでXquartz.appを起動しても、Xベースのアプリケーションは起動しなくなりました。
プロセスを調べるpsgrepってスクリプト書いた

# 概要
よくプロセス調べる時`ps aux | grep hoge`とかするじゃないですか。これ入力するのめんどくさいんですよね。alias貼ればいいっちゃいいんですけど、せっかくなので？aliasはるより良い感じになるスクリプトを書きました。

# コード

```zsh
psgrep () {
    local PSRESULT="`ps aux`"
    echo $PSRESULT | head -1
    echo $PSRESULT | tail -n +2 | grep $*
}
```

# 使い方
↑を.zshrcに書いて再読み込みすればこんな感じに使えます。（bash等の他のシェルで動作は確認してないです）

```
$ psgrep emacs
USER             PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
takc923          913   0.0  0.9  2471540  38988   ??  Ss   Wed02AM   2:48.94 emacs --daemon
takc923          911   0.0  0.0  2432772     40 s002  S+   Wed02AM   0:00.01 emacsclient -t -a
takc923        24155   0.0  0.0  2432768    508 s003  S+    8:18PM   0:00.00 emacsclient -t -a  .zshrc
```

grepのオプションがそのまま使えます。

```
$ psgrep -e emacs -e iTunes
USER             PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
takc923        14564   0.0  0.0  2487280   1424   ??  S    Fri11PM   0:01.27 /Applications/iTunes.app/Contents/MacOS/iTunesHelper.app/Contents/MacOS/iTunesHelper -psn_0_5793158
takc923        14559   0.0  0.8  2723300  33500   ??  S    Fri11PM   3:39.05 /Applications/iTunes.app/Contents/MacOS/iTunes -psn_0_5789061
takc923          913   0.0  0.9  2471540  39096   ??  Ss   Wed02AM   2:49.01 emacs --daemon
takc923          911   0.0  0.0  2432772     40 s002  S+   Wed02AM   0:00.01 emacsclient -t -a
takc923        24155   0.0  0.0  2432768    508 s003  S+    8:18PM   0:00.00 emacsclient -t -a  .zshrc
```

# 補足的な何か
## aliasとの違い
単純に

```zsh
alias psgrep='ps aux | grep'
```

とaliasはる場合との違いは

* grep自体のプロセスが表示されない
* カラム名(USERとかPIDとか)が表示される

という感じ。

## pgrep
最近知ったんですけど`pgrep`っていうコマンドあるんですね。

```
$ pgrep emacs
24155
913
911
```

これだとプロセスIDしか分かりません。が、オプションつけるともうちょっとリッチになります。

```
$ pgrep -lf emacs
24155 emacsclient -t -a .zshrc Apple_PubSub_Socket_Render=/tmp/launch-s8UOVX/Render
913 emacs --daemon
911 emacsclient -t -a Apple_PubSub_Socket_Render=/tmp/launch-s8UOVX/Render
```

ただ、やっぱりユーザや実行時間等は分かりません。

## 同じことを考える人はいる
[psgrepでぐぐると同じことを考える人がいっぱい出てきます](https://www.google.co.jp/search?q=psgrep)。もっとリッチなものがほしい人は見てみるといいかもしれないです。

## これ書いて個人的に勉強になったこととか

```zsh
PSRESULT="`ps aux`"
```

ここ、バッククォートでコマンドをくくるとインライン展開されるのは知ってたんですけど、これをダブルクォートでくくると改行がそのまま扱えることをこれ書く時初めて知りました（バッククォートでかこまないと1lineに実行結果が全部入る）

```zsh
tail -n +2
```

-nの引数に+数字すると、その数字行以降を出力、という意味になるんですね。これも初めて知りました。
OSX + Sublime Text + sublemacsproで日本語変換モード中のctrl+h（一文字削除）の挙動が変

例えば、

「きょうだい」と入れて「兄弟」としたいときに、  間違って
「きょうだお」と入れてしまった場合、  
エンターを押す前にdeleteで一文字削除して「い」を入れなおせばOKですよね。

ところが、Sublime Text + sublemacspro　という組み合わせで同じことをctrl+h（sublemacsproによって設定された一文字削除）でやろうとするとうまくいきません。
変換モード中にctrl+hで文字を削除すると一見消えたように見えますが、controlを離したり、別のキーを押すと「きょうだお」が復活してしまいます。

想像を絶するストレスです。

仕方がないのでKeyRemap4MacBookを使います：  
![KeyRemap4MacBook.jpg](https://qiita-image-store.s3.amazonaws.com/0/17793/a2837432-e74e-e307-095d-d0cee6a4a610.jpeg)

Emacs Mode > Control + H to Delete　にチェックを入れて完了です。
これでCtrol + Hでも変換モード中に文字を削除できるようになります。
CSVをPlistに変換する


NSArray・NSDictionaryの **writeToFile**メソッドを使うだけでPListに出力できます。

つまり手順としては
1. CSVファイルを読み込み、配列に格納する。
2. 配列をそのまま **writeToFile**する。
以上です。


```objectivec
//STEP 1
// CSVファイルを読み込む
NSString *filePath = @"/Users/hoge/hoge.csv";
NSString *text = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
NSMutableArray *marr = [NSMutableArray array];
// 改行文字で区切って配列に格納する
NSArray *lines = [text componentsSeparatedByString:@"\n"];

for (NSString *row in lines) {
    // コンマで区切って配列に格納する
    NSArray *items = [row componentsSeparatedByString:@","];
    if (items.count > 1) {
        NSDictionary *item = [[NSDictionary alloc]
                              initWithObjects:@[items[0],items[1]]
                              forKeys:@[@"name",@"class"]];
        [marr addObject:item];
    }
}

//STEP 2
// ホームディレクトリを取得
NSString *homeDir = NSHomeDirectory();
NSString *fileName = @"hoge.plist";
// 書き込み
BOOL result = [marr writeToFile:[homeDir stringByAppendingPathComponent:fileName]
                     atomically:YES];
if (!result) {
    NSLog(@"ファイルの書き込みエラー");
}else{
    NSLog(@"ファイルの書き込み成功");
}

```
ZF2 で ZFTool を使う

ZF1 にはプロジェクトのひな形を作ったり、モジュールやコントローラーを作成するための zf コマンドがありましたが、ZF2 にも同じようなものがあります。

ただし ZF2 本体には付いてこないので、別途インストールが必要です。

## phar 単独で使用する

phar があるので、それをダウンロードすれば簡単に使用できます。

```console
$ curl https://packages.zendframework.com/zftool.phar > zftool.phar
```

プロジェクトのひな形を作成したり、

```console
$ php zftool.phar create project someproject
ZF2 skeleton application installed in someproject.
In order to execute the skeleton application you need to install the ZF2 library.
Execute: "composer.phar install" in someproject
For more info in someproject/README.md
```

ZF2 そのものをインストールしたりできます。

```console
$ zftool.phar install zf somedirectory
The ZF library 2.2.4 has been installed in somedirectory.
```

# プロジェクト内で使用する

プロジェクト内で使用する場合は zftool.phar よりも composer でプロジェクト自体に含めたほうが良いでしょう（というかプロジェクト内で zftool.phar を使う方法がわかりませんでした）。

```console
$ composer require zendframework/zftool:dev-master
```

application.config.php で ZFTool モジュールを追加します。

```php:application.config.php
<?php
return array(

    'modules' => array(
        'Application',
        'Album',
        'ZendDeveloperTools',
        'ZFTool', // ← これ！
    ),
    
    :
```

これで ZFTool が使用可能になりました。コンソールで次のように打つと Usage が表示されます。

```console
$ php public/index.php
```

試しに ZFTool でモジュールの一覧を表示してみます。

```console
$ php public/index.php modules
Modules installed:
Application
Album
ZendDeveloperTools
```

なお、application.config.php に ZFTool を追加しなくても composer によって生成される zf.php で実行することもできます。

```console
$ vendor/bin/zf.php modules
Modules installed:
Application
Album
ZendDeveloperTools
```
select + mapを1つのメソッドで

こんなのを


```rb
p (1 .. 10).select { |x|
	x.odd?
}.map { |x|
	1 << x
}
```


flat_mapで置き換えるとお洒落。


```rb
p (1 .. 10).flat_map { |x|
	x.odd? ? [1 << x] : []
}
```
初心者用PHP学習用環境構築手順_Win7（Xammp）

この記事では
プログラム経験のない人でも、
PHPプログラミングを動作する環境を構築することを目的としています。
環境はXammpを用いて構築します。

以下のURLに移動します。
http://www.apachefriends.org/jp/xampp-windows.html

<br>
Windows用のXammpのインストーラを取得しに行きます。
画面の下に移動して、以下のリンクをクリック。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/27781/ca6d9818-94af-0b34-afd0-37e41f753618.png)

<br>
移動した先にあるxamppのインストーラをクリック(なるべく簡単な方法を選択していきます）。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/27781/fb6e11c8-201a-7db2-833f-fa48759bd7b9.png)

<br>
取得したインストーラをダブルクリックして、起動させる。
以下のダイアログが出るので「Yes」「OK」を押す。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/27781/13b64e31-dec4-0807-142e-176728c95fb2.png)

<br>
そのまま「Next」
![4.png](https://qiita-image-store.s3.amazonaws.com/0/27781/451368ee-7806-0042-dfa8-f02f3becdbcb.png)

<br>
「Next」
![5.png](https://qiita-image-store.s3.amazonaws.com/0/27781/0b877c04-e170-5fc0-b72b-c828ac50c66a.png)

<br>
「Next」
![6.png](https://qiita-image-store.s3.amazonaws.com/0/27781/1dba313c-0f0e-4043-8cc4-dde2f97a8312.png)

<br>
「Next」
![7.png](https://qiita-image-store.s3.amazonaws.com/0/27781/7b1b0fd8-9f7b-7842-ad37-3ee0f16a502f.png)

<br>
「Next」
![8.png](https://qiita-image-store.s3.amazonaws.com/0/27781/4069cd75-41df-1306-35db-6e84882c19be.png)

<br>
インストールが始まります。終わるまで待機。
>*補足
>インストール中、「セキュリティの重要な警告」のダイアログが出る場合が有りますが、
>「アクセスを許可する」ボタンを押してください。

![9.png](https://qiita-image-store.s3.amazonaws.com/0/27781/9f3b1b04-661c-a16f-64ce-b2e2d8a47bc1.png)

<br>
<em>チェックを入れて</em>、「Finish」
![10.png](https://qiita-image-store.s3.amazonaws.com/0/27781/9be70a00-2511-b1b0-4ec4-929d6803afaf.png)

>備考
>（チェックを入れ忘れたり、次からの起動する際は右下にあるアイコンをダブルクリックして起動させます）
>![てｍｐ.png](https://qiita-image-store.s3.amazonaws.com/0/27781/acc48572-0572-87a1-c1a5-a3be4cc043b8.png)

<br>
コントロールパネルが起動するのでApachの「Start」ボタンを押します
（*Skypeなどが立ち上がっていると、ポート番号が競合して、立ち上がらない可能性があります。
その際は、Skypeを終了してから、再度「Start」ボタンを押してください。）
![11.png](https://qiita-image-store.s3.amazonaws.com/0/27781/d03ea42e-3a2e-f2aa-2f3e-6b43bd0ea86e.png)

<br>
Apachが起動すると、「Admin」ボタンが押せるようなるので、クリック
![12.png](https://qiita-image-store.s3.amazonaws.com/0/27781/cc02bfc4-610a-5d9d-0d83-ba4fde38eb29.png)

環境は「日本語」に設定
![13.png](https://qiita-image-store.s3.amazonaws.com/0/27781/40639664-70a1-ef6d-2052-1ccc31cce131.png)

おめでとうございます。
xammpが導入されました。
![14.png](https://qiita-image-store.s3.amazonaws.com/0/27781/a96dad83-3f09-e40e-53c2-7abed8454be0.png)

<br>
---
### PHPの動作確認

作成したxammpフォルダの「<em>htdocsフォルダ</em>」の下に、「test.php」というファイルを作ります。
>*補足(xammpフォルダの場所）
>Win7で手順通りにインストールした場合、スタートボタン→コンピュータ→「Windows7_OS」→「xammp」フォルダが置かれています。

<br>
以下のコードを貼り付けて、文字コードUTF-8で保存します。
>*補足
>文字コードは保存する際に指定できます。

```test.php

<html>
  <head>
    <title>テストページ</title>
  </head>
  <body>

    <?php
      echo date('Y年m月d日');
   ?>

  </body>
</html>
```

<br>
ブラウザを立ち上げて、以下のURLに移動します。
http://localhost/test.php
今日の日付が表示されたら、動作確認終了です。
![16.png](https://qiita-image-store.s3.amazonaws.com/0/27781/553c7bf5-e9c5-4b7f-6d44-45e5d3c027c0.png)
MacにVagrant、Cent OS、apacheをインストール(Chefでインストール編)


chefを使ってapacheをインストールします。

## chefクックブックについて

[MacにVagrant、Cent OS、apacheをインストール(Chefクックブック作成編)](http://qiita.com/pakiln/items/19ee80a0f1c4abb3c394)のクックブックを使います。
上記クックブックはgithubに公開しています。
https://github.com/pakiln/chef-repo

## VagrantとCentOS

本投稿は[MacにVagrant、Cent OS、apacheをインストール](http://qiita.com/pakiln/items/0f3e3ca4dc67495c8218)の`vagrant up`を実行できた状態からの手順です。
CentOSのipアドレスは192.168.33.10としています。

## chef(knife)の実行

Macのターミナルから`knife solo prepare`を実行します。
これはCentOSのchef環境を整えてくれる便利なコマンドです。
一度だけ実行してください。
なお、実行時のディレクトリはクックブックのディレクトリです。

```
$ ls
Cheffile  Cheffile.lock  cookbooks/  data_bags/  nodes/  roles/  site-cookbooks/

$ knife solo prepare 192.168.33.10 --ssh-user vagrant --identity-file ~/.vagrant.d/insecure_private_key
Bootstrapping Chef...
Enter the password for vagrant@192.168.33.10: 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
101  6790  101  6790    0     0    992      0  0:00:06  0:00:06 --:--:-- 11040
Downloading Chef 11.6.0 for el...
Installing Chef 11.6.0
warning: /tmp/tmp.aSjAYKHN/chef-11.6.0.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID 83ef826a: NOKEY
Preparing...                ########################################### [100%]
   1:chef                   ########################################### [100%]
Thank you for installing Chef!
```

続けてMacのターミナルから`knife solo cook`を実行します。
192.168.33.10のCentOSに対して、nodes/192.168.33.10.jsonに従いchefを実行させます。
「nodes/192.168.33.10.json」の部分を省略することも可能です。

```
$ knife solo cook 192.168.33.10 nodes/192.168.33.10.json --ssh-user vagrant --identity-file ~/.vagrant.d/insecure_private_key
Running Chef on 192.168.33.10...
Checking Chef version...
Installing Librarian cookbooks...
Uploading the kitchen...
Generating solo config...
Running Chef...
Starting Chef Client, version 11.6.0
Compiling Cookbooks...
[2013-09-22T03:49:31+00:00] FATAL: No cookbook found in ["/home/vagrant/chef-solo/cookbooks-1", "/home/vagrant/chef-solo/cookbooks-2", "/home/vagrant/chef-solo/cookbooks-3"], make sure cookbook_path is set correctly.
Converging 3 resources
Recipe: iptables_stop::default
  * service[iptables] action disable
    - disable service service[iptables]

  * service[iptables] action stop
    - stop service service[iptables]

Recipe: httpd::default
  * package[httpd] action install
    - install version 2.2.15-29.el6.centos of package httpd

  * service[httpd] action enable
    - enable service service[httpd]

  * service[httpd] action start
    - start service service[httpd]

Chef Client finished, 5 resources updated
```

Macのブラウザから192.168.33.10にアクセスすると、Apacheのテストページが表示されます。
MacにVagrant、Cent OS、apacheをインストール(Chefクックブック作成編)


CentOSにapacheインストールとiptables停止をchefで行います。
そのためのchefクックブックを作成する手順です。

## chefクックブック(レポジトリ)作成
knife solo initでひな形となるディレクトリとファイルが生成できます。
今回はchef-repoというクックブック名で作成します。

```
knife solo init chef-repo
```

chef-repoディレクトリの中身。

```
$ cd chef-repo
$ ls
Cheffile
data_bags
roles
cookbooks
nodes
site-cookbooks
```

クックブックをgitで管理します。

```
$ git init
$ git add .
$ git commit -m "first commit"
```

## apacheのレシピ作成

httpdパッケージをyumでインストールするレシピを作成します。

```
$ knife cookbook create httpd -o site-cookbooks
$ vi site-cookbooks/httpd/recipes/default.rb
```



```site-cookbooks/httpd/recipes/default.rb
package "httpd" do
  action :install
end
service "httpd" do
  supports :status => true, :restart => true, :reload => true
  action [ :enable , :start ]
end
```

## iptablesのレシピ作成

iptablesはhttpの80ポートを開放すればいいのですが、iptablesの設定を変更するのが面倒なのでiptables自体を停止させます。
本番環境で推奨できる方法ではありません。

```
$ knife cookbook create iptables_stop -o site-cookbooks
$ vi site-cookbooks/iptables_stop/recipes/default.rb
```

```site-cookbooks/iptables_stop/recipes/default.rb
service "iptables" do
  supports :status => true, :restart => true, :reload => true, :stop => true
  action [ :disable , :stop ]
end
```

nodesディレクトリに192.168.33.10.jsonファイルを作成します。
VagrantのCentOSのIPアドレスは「192.168.33.10」に設定している場合です。

```nodes/192.168.33.10.json
{
        "run_list":[
                "iptables_stop",
                "httpd"
        ]
}
```

クックブックができあがりました。

本クックブックはgithubに公開しています。
https://github.com/pakiln/chef-repo
travis ciでherokuにデプロイ

`.travis.yml`に以下を追加するだけ

```.travis.yml
deploy:
  provider: heroku
  app: your-app-name # optional if it's the same as your repo name
  api_key: "YOUR API TOKEN"
```

だけども`api_key`を直書きしちゃうとだれでもデプロイできるようになってしまうのでheroku側にあらかじめ設定しておいてsecureのkey指定しておく必要がある。面倒くさい。

なんかいい感じでやってくれるのある

    travis setup heroku

レポジトリはこれか、とかこのappにデプロイでいいか、とか聞いてくるので設定すると`.travis.yml`に記述が追加される。てればオッケー。だいたい空エンターでいい感じにしてくれるので楽。

参考
[The Travis CI Blog: Introducing Continuous Deployment to Heroku] (http://about.travis-ci.org/blog/2013-07-09-introducing-continuous-deployment-to-heroku/)

他にもブランチ指定でデプロイとかできるのいいっすね。stagingとかもできる。
Vim で alt-gtags.vim を使って GNU GLOBAL (gtags) を利用する


GNU GLOBAL  とは
===========================
GNU GLOBAL はとても優れたソースコードタギングシステムです。
http://www.gnu.org/software/global/
http://www.tamacom.com/global-j.html

この、とても優れたソースコードタギングシステムを、とても優れたエディタであるところの Vim で快適に利用する、というお話。

GNU GLOBAL  のインストール
===========================

まずは、GNU GLOBAL をインストールします。

基本はソースコードからのコンパイルですが、パッケージ管理からインストールすることもできます。
Windows の場合は、公式サイトからバイナリを配布しているとこへのリンクがあるので、そこからダウンロードするのが楽でしょう。

私は Mac なので Homebrew から入れました。

```
brew install global
```

詳しく書いてくれているサイトがあるので、参照させてもらうのが一番です。

http://www.machu.jp/diary/20090307.html
http://uguisu.skr.jp/Windows/gtags.html

など。

これより、

* GNU GLOBAL をインストール済みで、
* gtags, global のコマンドの場所にパスが通っていて、
* タグファイルが生成されている。

という状態を前提として進めます。

alt-gtags.vim のインストール
============================

はじめに
--------

 GNU GLOBAL は、エディタで使うことを想定し、Vim 上での利用を可能にする gtags.vim というインターフェースのプラグインを提供してくれています。

が、私の環境ではそのプラグインがうまく動かず、ちょこちょこ修正していましたが難しくてよくわからなくなってきたので、alt-gtags.vim というのを用意しました。[PR]

if_pyth
-------------

alt-gtags.vim は Python インターフェースが必須なので、--enable-pythoninterp でビルドされている必要があります。
http://vim-users.jp/2010/03/hack132/

インストール
------------------

alt-gtags.vim プラグインは github で配布されているので、NeoBundle を使っている場合は、.vimrc に以下を書けば一発です。

```.vimrc
NeoBundle '5t111111/alt-gtags.vim'
```

もしくは、普通にダウンロードして展開してプラグインのパスが通っているところに置けばOKです。
https://github.com/5t111111/alt-gtags.vim

alt-gtags.vim の利用
============================

コマンド
----------------

alt-gtags.vim をインストールすると、以下のコマンドが実行可能になります。

* `AltGtags -f`  
  カレントバッファの関数のリストを QuickFix ウィンドウに表示する
* `AltGtags`  
  カーソル位置の関数の定義位置を QuickFix ウィンドウに表示する
* `AltGtags -r`  
  カーソル位置の関数の参照位置を QuickFix ウィンドウに表示する
* `AltGtags -s`  
  カーソル位置のシンボルの参照位置を QuickFix ウィンドウに表示する

実行例
------------

以下が、例として `AltGtags -f` を実行した時の画面です。

![alt-gtags.vim-1.png](https://qiita-image-store.s3.amazonaws.com/0/29846/d2b5f206-d667-412a-19de-ac5a6c06c9bd.png "alt-gtags.vim-1.png")

もちろん、QuickFix ウィンドウから該当の場所にジャンプすることができます。

キーバインドの設定
===========================

好きなキーにバインドすればよいと思いますが、私の設定は以下です。

```.vimrc
" QuickFix
map <C-n> :cn<CR>
map <C-p> :cp<CR>
" alt-gtags.vim
nnoremap <C-j> :AltGtags<CR>
nnoremap <C-k> :AltGtags -r<CR>
nnoremap <C-l> :AltGtags -s<CR>
```

_[追記] \<C-i\>を潰すのはさすがにどうかと思ったので修正_

追記
===

zsh と MacVim 環境でエラーが出るときの対処 
------------------------------------

### 2012-12-22 追記

AltGtags コマンドの実行時、global および gtags コマンドが見つからずエラーになることがあります。

これは、MacVim (現在 7.4 で確認) と zsh を使っている環境の場合、MacVim 側が正しく PATH を認識できない不具合によるもののようです。
GLOBAL を Homebrew からインストールしていた場合、`/usr/local/bin` にコマンドがインストールされているため、コマンドが見つかりません。

回避策として、`~/.zprofile` 内で PATH を設定してあげるとうまくいきます。

```
$ cat ~/.zshrc | grep "export PATH" >> ~/.zprofile
```
Ubuntu13.04にVirtualBox+Vagrantをインストールする

ホストOSがUbuntu 13.04 (amd64)の場合にVagrant環境をインストールしたときの記録です。

## VirtualBox

```/etc/apt/sources.list
# 最後に追加
deb http://download.virtualbox.org/virtualbox/debian raring contrib
```

```bash:
wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- | sudo apt-key add -
sudo apt-get -y update
sudo apt-get -y install virtualbox
```

## Vagrant

```
wget http://files.vagrantup.com/packages/db8e7a9c79b23264da129f55cf8569167fc22415/vagrant_1.3.3_x86_64.deb
sudo dpkg --install vagrant_1.3.3_x86_64.deb
```

## 動かしてみる

```
vagrant box add base http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130731.box
mkdir vagrant-example
cd vagrant-example/
vagrant init
```

- `Vagrantfile` のネットワークまわりをいじる。

```ruby:Vagrantfile
# Vagrantfile
Vagrant::Config.run do |config|
  config.vm.box = "base"
#(snip)
network :private_network, ip: "192.168.10.10"
#(snip)
```

- 起動。

```
vagrant up
ping 192.168.10.10
vagrant ssh
```

## 参考サイト

- [Linux_Downloads – Oracle VM VirtualBox](https://www.virtualbox.org/wiki/Linux_Downloads)
- [Vagrant - Downloads](http://downloads.vagrantup.com/tags/v1.3.3)
- [Vagrant](http://www.vagrantup.com/)
【bash設定】実行したコマンド成否によってプロンプトの色を出し分ける

# 概要
コマンドの実行に成功したら青色プロンプト、
エラーステータスが返ってきたら赤色プロンプトになるように設定します。

![rtakasuke_—_terminal_—_bash_—_ttys000_—_53×8.png](https://qiita-image-store.s3.amazonaws.com/0/18646/c9e6d422-b8ed-5bc0-817b-52c2d87d81bc.png)


# 環境
**OS**
MacOS X 10.8.5


# 設定
~/.bashrc を編集しましょう
以下を追記します。

```~/.bashrc
## prompt
PS1="\`
if [ \$? = 0 ]; then 
    echo \[\e[36m\]; 
else 
    echo \[\e[31m\]; 
fi
\`[\u@\H \w]\[\e[0m\]\n$"
```

.bashrc を編集したら、設定を反映させます。
    ```$ source ~/.bashrc```
Raspberry piにarkOSをインストールし、ArchLinuxとして使うまで

arkOSをインストール
============

https://arkos.io/

arkOSをインストールするのが楽です。
IPアドレスはDHCPリースリストを見るなどして発見する。

発見したら Genesisの画面 http://<IPアドレス>:3000/ に接続。

admin / adminでログイン

ArchLinuxとして動かす
============

Genesis -> Terminal に接続し、rootアカウントとしてログイン。

```bash:
# groupadd sudo
# useradd -m -g sudo myaccount
# passwd myaccount
```

myaccount で ssh接続

$ sudo vi /etc/pacman.d/mirror

```bash:先頭に記入
Server = http://tw.mirror.archlinuxarm.org/armv6h/$repo/
```

yaourtをインストール
-----------------

```bash:
$ pacman -Sy yajl
$ pacman -Sy screen
$ curl -O https://aur.archlinux.org/packages/pa/package-query/package-query.tar.gz
$ tar xzf package-query.tar.gz
$ makepkg
$ sudo pacman -U package-query-1.2-2-armv6h.pkg.tar.xz
$ pacman -Sy yaourt
```

yaourtでインストールする時、時間がかかる処理が多いのでscreen起動しておく。

```bash:インストール例
$ yaourt nagios
```

PKGBUILDをEDITORでarchにarmv6hを追加

```diff:
- arch=('i686' 'x86_64')
+ arch=('i686' 'x86_64' 'armv6h')
```

後は続行でインストール完了します。
matplotlibやpylabで論文向きの白黒のグラフをプロットする

学会は白黒でも読みやすい論文を要求します。
matplotlibやpylabは便利なのですがデフォルトで色鮮やかなグラフを出してくれるのでそのまま白黒印刷すると読みにくいです。
なのでプロット時にちょっと頑張る必要があります。

まず線のフォーマットを作成するジェネレータを作ります。

```py
def monochrome_style_generator():
    linestyle = ['-', '--', '-.', ':']
    markerstyle = ['h' ,'2', 'v', '^', 's', '<', '>', '1', '3', '4', '8', 'p', '*', 'H', '+', ',', '.', 'x', 'o', 'D', 'd', '|', '_']
    line_idx = 0
    marker_idx = 0
    while True:
        yield 'k' + linestyle[line_idx] + markerstyle[marker_idx]
        line_idx = (line_idx + 1) % len(linestyle)
        marker_idx = (marker_idx + 1) % len(markerstyle)
```

こんな感じで定義したものを

```py:plot.py
import pylab

# ジェネレータ作成
gen = monochrome_style_generator()

xval = pylab.arange(100)*.01
for x in range(6):
  # gen.next() で線のフォーマットを生成
  pylab.plot(xval, pylab.cos(x*pylab.pi*xval), gen.next())

pylab.savefig("result.png", format = 'png')
```

こんな感じで使ってやる事で

![result.png](https://qiita-image-store.s3.amazonaws.com/0/1716/b59426d9-fa3c-a1b1-8b93-f987d3b97c26.png)

こんなグラフを出力できます。
PHPでマルチスレッド

PHPは最近の他の言語とは違ってシングルスレッドなので、一回のリクエストで複数の処理を同時に実行したりといったことは通常はできません。
非同期処理はできず、常に上から順に処理を進めていきます。
どうしてもやりたいなら`` `php hoge.php &` ``などと別プロセスで動かすといった手段しかありませんでした。
http://d.hatena.ne.jp/milktea_cg7/20130529/1369821459

ところでなにやらpthreadsとかいうモジュールを見つけたので使ってみます。
http://www.php.net/manual/ja/book.pthreads.php

LinuxであればPECLからインストールしましょう。
Windowsではバイナリが落ちてたので拾ってきます。
http://pecl.php.net/package/pthreads
https://github.com/krakjoe/pthreads
php_pthreads.dllをエクステンションのディレクトリに、pthreadVC2.dllは環境変数Pathが通っているところに置きます。
そしてphp.iniに以下を記述して再起動。
`extension=php_pthreads.dll`
これでpthreadsが使用可能になります。
phpinfo()にpthreadsという項目が追加されるのを確認しましょう。

それではさっそく実行。

```php
<?php
	class TestThread extends Thread{
		/**
		* @Overide
		* startしたときに呼ばれる
		*/
		public function run(){
			// 時間のかかる処理
			sleep(10);
			
			// このスレッドのIDを確認
			print($this->getThreadId());
			// これを呼び出したスレッドのIDを確認
			print($this->getCreatorId());
		}
	}
	
	// TestThreadを別スレッドで起動
		$testThread1 = new TestThread();
		$testThread1->start();
		$testThread2 = new TestThread();
		$testThread2->start();
		$testThread3 = new TestThread();
		$testThread3->start();
		$testThread4 = new TestThread();
		$testThread4->start();
		$testThread5 = new TestThread();
		$testThread5->start();
```

10秒かかる処理が5個あるということで一見50秒かかりそうですが、実際は10秒で処理が完了します。
TestThread::start()は、TestThread::run()を呼び出しますが、その処理の終了を待たずにすぐに次に進みます。
これでスレッド処理が簡単に行えます。

```php
<?php
	class TestThread extends Thread{
		public function run(){
			sleep(10);
		}
	}
	
	// TestThreadを起動
		$testThread = new TestThread();
		$testThread->start();
	
	// Thread::run()がまだ走っているか → true
		var_dump($testThread->isRunning());
	
	// Thread::run()が終了するまで待機
		$testThread->join();
	
	// Thread::run()がまだ走っているか → false
		var_dump($testThread->isRunning());
```

join()はスレッドが終了するまで待機してくれます。
これで並列処理なんかも簡単に書けるようになりましたね。

まあスレッドが必要になるような処理をPHPで書くなよという話ではありますが。