OmniAICreator/Qiita-1.07M huggingface dataset:
Keyboard Remap

==============

USキーボード(英語)がよさそうだけど、JISキーボード(日本語)と両方に
慣れるのも能率がよくないのでJISキーボードをリマップして便利にしています。

# Keyboard

見比べるとUSキーボードがスッキリしていますね。 (これはMacのキーボードです。)

## USキーボード

* ショートカットはUSキーボードの合理的な配列をベースに作られることが多いです。
* **106/109**キーボードでおなじみの`半角/全角`が **`** (グレイヴ・アクセント)です。

![keyboard_us](https://dl.dropboxusercontent.com/u/14690051/images/notes/os/osx/keyboard_us.jpg)

## JISキーボード

* 日本語の入力をサポートするので特有のキーがあり記号の配列が分散しています。
* Macでは **101/104**キーボードの`Caps Lock`が`Control`です。

![keyboard_jis](https://dl.dropboxusercontent.com/u/14690051/images/notes/os/osx/keyboard_jis.jpg)


# Change

アプリケーションの切替のリマップを紹介します。

## Modifier Key

まず`システム環境設定`の`キーボード`で **修飾キー** を変更します。
`Caps Lock`を`Control`に変更して **101**キーボードに合わせます。
(`Caps Lock`が活躍する機会はほとんどありません。)

![change_modifier_key](https://dl.dropboxusercontent.com/u/14690051/images/notes/os/osx/change_modifier_key.png)


## Application Shortcut

次に`システム環境設定`の`キーボード`で **ショートカット** を変更します。
ターミナルの'次のタブを選択'をSafari(`⌃ + ⇥`)に合わせます。 
(ターミナルの標準は`⌘ + }`や`⌘ + {`なので右手で対応が必要です。)

![terminal_switch_tab_Keyboard](https://dl.dropboxusercontent.com/u/14690051/images/notes/os/osx/terminal_switch_tab_Keyboard.png)


## Application Window Shortcut

アクティブのアプリケーションを切替えるショートカットは`command + tab`なので
アプリケーションのウインドウの切替えにUSキーボードは`command + アクセント`です。
(タブキーの上段の **`**(グレイヴ・アクセント)を利用するのは合理的ですね。)

![keyboard_shortcuts_default](https://dl.dropboxusercontent.com/u/14690051/images/notes/os/osx/keyboard_shortcuts_default.png)

JISキーボードでは`command + F1`に設定されています。(`fn`が必要な場合もあります。)
`次のウインドウを操作対象にする`をWindowsでおなじみの`alt + tab`(`⌥ + ⇥`)に変更します。

![keyboard_shortcuts_switch_window](https://dl.dropboxusercontent.com/u/14690051/images/notes/os/osx/keyboard_shortcuts_switch_window.png)


## Both sides of the space key

JISキーボードのスペースキーの両サイドにはUSキーボードにない2つのキーがあります。
(Macなら **英数** と **かな** 、Windowsなら **無変換** と **変換** です。)

この2つのキーを有効に利用することでJISキーボードの夢がひろがります。(ｷﾘｯ
左のキーにはよく使う`tab`に変更します。右のキーは`かな`と`英数`の切替に変更します。

### Remapping

Macは[KeyRemap4MacBook](http://pqrs.org/macosx/keyremap4macbook/index.html.ja)を利用して変更します。

```remapping
For Japanese
  Change EISUU Key 
    EISUU to Tab
  Change KANA Key 
    Use KANA as KANA/EISUU(toggle)
```

(Windowsでは`無変換`キーを`tab`に変更して、`変換`キーを`半角全角`に変更します。)


### Position

これまでの変更で切替の操作を左手に集中させました。

`tab`に変更した`英数`キーは左手の **人差し指** を使います。
(これは右手でトラックパットを操作する時に便利です。)

| Keys | 内容 | 指(左手) |
|:-----|:-----|:---------|
| ⌘ + ⇥ | アプリケーションを選択 | 中指 + 人差し指 |
| ⌥ + ⇥ | ウインドウを選択 | 薬指 + 人差し指 |
| ⌃ + ⇥ | タブを選択 | 小指 + 人差し指 |

`tab`キーが2カ所にあるとポジションで使い分けができます。


# Tips

見た目はキーボードカバーで少しスッキリします。

![keyboard_cover](https://dl.dropboxusercontent.com/u/14690051/images/notes/os/osx/keyboard_cover.jpg)

(キーの押し心地はカバーをすることで変わりますよ。)
FizzBuzzのためのコマンド作った

# PyFizzBuzz

FizzBuzzという名前が埋まっていたので、PyFizzBuzzという名前にした。

[PyPI Information](https://pypi.python.org/pypi/PyFizzBuzz)
[github repository](https://github.com/futoase/fizzbuzz)

# 作った理由

転職で```FizzBuzz```書いてくださいみたいな難関な試験を課せられた時に
```easy_install PyFizzBuzz``` で済めばいいよなぁと思ったので書きました。

...というのは冗談で、
いまどきのPython packageを構築するときに
```setup.py``` やライブラリ本体をどう置くべきか、というのを
確認したかった & リリースしてみたかったというのが主な理由です。

パッケージ化するときのファイル・ディレクトリ構成は
これでいいだろという形にしてみました。

# インストール

```easy_install PyFizzBuzz``` で終わり

# 使い方

```
> fizzbuzz 15
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
```

# 注意点

[setuptools](https://pypi.python.org/pypi/setuptools/1.1.5)、インストールしておいてください。

# 余談

[konira](https://github.com/alfredodeza/konira)というBDDライクにかけるテストライブラリを使っているのですが、
```subject``` や ```context``` が欲しい...(contextはdescribeのエイリアスでいいし) ```expect``` も...
なんか良いBDDテスティングフレームワークは無いものか...
Objective-C でマウスカーソルの位置を猛烈にクリックするサンプル

```objc:CookieClicker.m

@interface CookieClicker
@property (nonatomic) NSTimer *timer; // 一定間隔でクリックイベントを発行するタイマー
@property (nonatomic) id eventMonitor; // Esc キー押下イベントを監視するモニター
@end

@implementation CookieClicker

// マウスカーソルの位置を1秒間に50クリックする
- (IBAction)bakeMoreCookies:(id)sender
{
  // タイマーが稼働中なら何もしない
  if (self.timer) return;

  // Esc キーの監視を開始する：押されたらタイマーを止める
  self.eventMonitor = [NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyDownMask handler:^(NSEvent *event) {
    if (event.keyCode == 53 /* Esc */) {
      [self ceaseFire];
    }
  }];

  // 0.02秒ごとに tick: メソッドを呼ぶタイマーを稼動させる
  self.timer = [NSTimer scheduledTimerWithTimeInterval:0.02 target:self selector:@selector(tick:) userInfo:nil repeats:YES];
}

// カーソルの位置をクリックする
- (void)tick:(NSTimer *)timer
{
  // 空のイベントオブジェクトを作って現在のマウスカーソルの位置を取得する
  CGEventRef event = CGEventCreate(NULL);
  CGPoint location = CGEventGetLocation(event);
  CFRelease(event);

  // マウス左ボタンのダウンイベントとアップイベントを発行する
  CGEventRef mouseDown = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseDown, location, 0);
  CGEventRef mouseUp = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseUp, location, 0);
  CGEventPost(kCGHIDEventTap, mouseDown);
  CGEventPost(kCGHIDEventTap, mouseUp);
  CFRelease(mouseDown);
  CFRelease(mouseUp);
}

// クリックを中止する
- (void)ceaseFire
{
  // タイマーを止める
  [self.timer invalidate];
  self.timer = nil;

  // Esc キーの監視を止める
  [NSEvent removeMonitor:self.eventMonitor];
  self.eventMonitor = nil;
}

@end
```
第13回オフラインリアルタイムどう書くの参考問題をFregeで解く

[第13回 オフラインリアルタイムどう書く](http://atnd.org/events/41603)の参考問題「[増やす減らす二倍する](http://nabetani.sakura.ne.jp/hena/ord13updowndouble/)」を、JVM上で動作するHaskellライクな言語[Frege](https://github.com/Frege/frege/wiki/_pages)(フレーゲ)で解きました。

```frege:shortest.fr
shortestPath' :: Int -> Int -> Int
shortestPath' n maxn
  | n==0 = 0
  | n==1 = 1
  | n > maxn = maxBound::Int
  | even(n) = (shortestPath' (n `div` 2) (maxn-2)) + 1
  | otherwise = minimum [(shortestPath' (n-1) (maxn-2)) + 1, (shortestPath' (n+1) (maxn-2)) + 1]

shortestPath :: Int -> Int  
shortestPath n = shortestPath' n (n*2)
  

main args = do
  println (shortestPath 59 ==  9)
  println (shortestPath 10 ==  5)
  println (shortestPath 11 ==  6)
  println (shortestPath 12 ==  5)
  println (shortestPath 13 ==  6)
  println (shortestPath 14 ==  6)
  println (shortestPath 15 ==  6)
  println (shortestPath 16 ==  5)
  println (shortestPath 17 ==  6)
  println (shortestPath 18 ==  6)
  println (shortestPath 27 ==  8)
  println (shortestPath 28 ==  7)
  println (shortestPath 29 ==  8)
  println (shortestPath 30 ==  7)
  println (shortestPath 31 ==  7)
  println (shortestPath 32 ==  6)
  println (shortestPath 33 ==  7)
  println (shortestPath 34 ==  7)
  println (shortestPath 35 ==  8)
  println (shortestPath 41 ==  8)
  println (shortestPath 71 ==  9)
  println (shortestPath 1023 ==  12)
  println (shortestPath 1024 ==  11)
  println (shortestPath 1025 ==  12)
  println (shortestPath 1707 ==  17)
  println (shortestPath 683 ==  15)
  println (shortestPath 123 ==  10)
  println (shortestPath 187 ==  11)
  println (shortestPath 237 ==  12)
  println (shortestPath 5267 ==  18)
  println (shortestPath 6737 ==  18)
  println (shortestPath 14796 ==  20)
  println (shortestPath 18998 ==  20)
  println (shortestPath 23820 ==  20)
  println (shortestPath 30380 ==  21)
  println (shortestPath 31119 ==  21)
  println (shortestPath 33301 ==  20)
  println (shortestPath 33967 ==  21)
  println (shortestPath 35443 ==  22)
  println (shortestPath 35641 ==  22)
  println (shortestPath 43695 ==  23)
  println (shortestPath 44395 ==  23)
  println (shortestPath 44666 ==  22)
  println (shortestPath 987 ==  14)
  println (shortestPath 1021 ==  13)
  println (shortestPath 1019 ==  13)
  println (shortestPath 1015 ==  13)
  println (shortestPath 1007 ==  13)
  println (shortestPath 1011 ==  14)
  println (shortestPath 1003 ==  14)
  println (shortestPath 983 ==  14)
  println (shortestPath 999 ==  14)
  println (shortestPath 2731 ==  18)
  println (shortestPath 6827 ==  20)
  println (shortestPath 10923 ==  21)
  println (shortestPath 27307 ==  23)
  println (shortestPath 43691 ==  24)
  println (shortestPath 109227 ==  26)
  println (shortestPath 174763 ==  27)
  
```
jsonを取得、表示するアプリケーション　その４

GET、POSTの両方でリクエストパラメータを指定できるように対応。
タブペインでパラメータとレスポンスを切り替えて表示。送信ボタンを押下してレスポンスが返ってきたらレスポンスタブを表示する。

```groovy:json_client.groovy
import groovy.swing.SwingBuilder
import javax.swing.*
import java.awt.*

def cbMethod
def txtUrl
def txtParam
def txtJson

def tabPane

def sendRequest = {
	def url = txtUrl.text
	if (cbMethod.selectedItem == 'GET') {
		url = "${url}?${txtParam.text}"
	}
	
	def conn = url.toURL().openConnection()
	conn.requestMethod = cbMethod.selectedItem
	if (cbMethod.selectedItem == 'POST') {
		conn.doOutput = true
		conn.outputStream << txtParam.text
	}
	
	txtJson.text = conn.inputStream.text
	tabPane.selectedIndex = 1
}

new SwingBuilder().frame(title:'jsonを取得、表示するアプリケーション', defaultCloseOperation:JFrame.EXIT_ON_CLOSE,
						size: [800, 600], show:true) {
	lookAndFeel('nimbus')
	borderLayout()
	hbox(constraints: BorderLayout.NORTH) {
		cbMethod = comboBox(items:['GET', 'POST'])
		txtUrl = textField()
		button(text:'送信', actionPerformed:sendRequest)
	}
	tabPane = tabbedPane(constraints: BorderLayout.CENTER) {
		scrollPane(name:'パラメータ') {
			txtParam = textArea()
		}
		scrollPane(name:'レスポンス') {
			txtJson = textArea(editable:false)
		}
	}
}
```

![qiita-004a.png](https://qiita-image-store.s3.amazonaws.com/0/17179/eb3fa1f0-fd9f-6ced-1c36-82c82fd60793.png)
![qiita-004b.png](https://qiita-image-store.s3.amazonaws.com/0/17179/e9a7c498-628a-1141-811b-a05f633506e9.png)
[ReVIEW Tips] 節や小節の番号を出さないようにする

標準のReVIEWでは、章見出しや節見出し、小節見出し（第3レベル見出し）まで見出しに番号を振ります。

![見出しサンプル](https://qiita-image-store.s3.amazonaws.com/0/4293/6b92c26d-5712-e051-ce8a-39d3fccbe111.png)

これを変更するには、設定用YAMLファイルのsecnolevelプロパティを使います。

例えば、以下のようにすると、章見出しのみに番号が振られ、節見出しには番号が振られなくなります。

```yaml
secnolevel: 1
```

章見出しと節見出しまで番号を振って、小節見出しには番号が振られなくなるようにするには、以下のように指定します。

```yaml
secnolevel: 2
```

secnolevelを2にした場合の結果は以下のようになります。

![見出しサンプルその2](https://qiita-image-store.s3.amazonaws.com/0/4293/fcabbac2-8749-167f-69fe-ae4fc3cff146.png)

小節見出しに番号が振られなくなっています。
[ReVIEW Tips] ざっくりした文書のボリュームを調べる

ReVIEWには``review-vol``というコマンドがあります。これを使うと、ReVIEWで文書を作った場合の大まかな目安が分かります。

使い方は簡単というか簡単すぎるくらいで、ReVIEWの文書用ディレクトリに移動して、コマンドを実行するだけです。引数も何もありません。

結果は以下のようになります。

```shell-session
$ review-vol 
      6KB   2003C    37L   6P introduction ............ はじめに
      1KB    221C     7L   1P notice .................. 
 1.  14KB   5948C   181L  14P eval .................... プログラムと評価
 2.  17KB   7736C   309L  17P function ................ 関数適用の評価
 3.  12KB   5721C   214L  12P recursion ............... 再帰
 4.  12KB   6617C   369L  12P extend_language ......... 少し言語を拡張して
 5.   6KB   2557C    85L   6P next_step ............... 次のステップ
 1.   1KB     59C     6L   1P bib ..................... 参考文献
=============================
     64KB  30862C  1208L  64P
```

左から順に、ファイルサイズ、文字数、行数、ページ数、ファイル名、章タイトルになります。

もっとも、行数やページ数は概算値で、実際にこうなるかどうかはあまり関係ありません（本文の行数やフォントサイズ等の指定はまったく考慮していません）。あくまで目安として考えて下さい。
[ReVIEW Tips] EPUBのCSSを指定する

ReVIEWでEPUBを出力するには``review-epubmaker``コマンドを使います。

```shell-session
$ review-epubmaker 【設定用YAMLファイル】
```

EPUBを作る際に使用するCSSファイルですが、現状は歴史的経緯によるのか、ReVIEWの文書用ディレクトリの直下に置いておくことになっています。

CSSのファイル名は、設定用YAMLファイルの``stylesheet``プロパティで指定します。

```yaml
stylesheet: style.css
```

さらに、設定用YAMLファイルの``params``プロパティでも、コンバータに渡す用の指定を追加します。

```yaml
params: --stylesheet=style.css
```

これで、style.cssがEPUBの中の各HTMLで読み込まれるようになります。

(なんか重複してて美しくないですね……。ちょっと仕様を検討します。)
[ReVIEW Tips] EPUB3で出力する

``review-epubmaker``はversion 1.1から実験的にEPUB3をサポートしてみました。

``review-epubmaker``でEPUB3を出力するには、引数に指定する設定用YAMLファイルの``epubversion``プロパティと``htmlversion``プロパティを指定します。

```yaml
epubversion: 3
htmlversion: 5
```

本当はepubversionを3にするとhtmlversionは（今のところ）自動的に5になるのですが、念のため両方指定しておくのがおすすめです。

なお、言うまでもなくCSSはEPUB3的に正しくなるように適切な内容を記述して下さい。それっぽいスタイルを自動的に指定してくれるわけではありません。

もっとも、EPUB3版はまだあまり試していないので、変わった記法を使うと変なことが起こるかもしれません。epubcheckでエラーになったり、何かおかしいタグが吐かれる、といった場合には http://github.com/kmuto/review までご報告下さい。よろしくお願いします。
[ReVIEW Tips] 文中で一部の単語の書体を変えたり色を変えたりする

ReVIEWでは今のところ書体や色そのものを指定する記法はありません。フォントいじりとかして遊ぶのには、残念ながらReVIEWは向いていません。何か別のシステムを使った方がよいでしょう。

一般的な書体を変えるケースとしては、本文が明朝体で、強調の部分だけゴシック体にするとか、色を変えるとかでしょうか。そのような場合、ReVIEWでは、例えば``@<strong>{...}``で指定された部分がそうなるようにする、といったことができます。

## HTML(EPUB)の場合
review-epubmakerというかHTMLの場合、当然のようにCSSで指定します。``@<strong>``はHTMLではもちろん``<strong>``要素になるので、strongに対する指定を書きます。

```css
strong {
  font-color: red;
  font-family: sans-serif;
}
```

## LaTeX(PDF)の場合

review-pdfmakerというかLaTeXの場合、``@<strong>``は``\reviewstrong``マクロになっているので、これを再定義します。

```tex
\renewcommand{\reviewstrong}[1]{%
  \textcolor{red}{\textsf{#1}}}
```
[ReVIEW Tips] 本文フォントの大きさを変えたい

本文フォントの大きさを全体的に変更するのは、EPUBであればCSSで、LaTeXであればドキュメントクラスの指定で変更します。

CSSの設定方法は普通です。EPUBの場合、一般的には絶対サイズで指定してしまうと、リーダでの指定がうまく効かないことがあるので、emや%などの相対サイズで指定します。

```css
body {
  font-size: 150%; 
}
```

LaTeXの場合、ドキュメントクラスの指定のところのポイント数を指定します。ドキュメントクラスは``review-pdfmaker``の引数になる設定用YAMLファイルのtexdocumentclassプロパティで指定します。下記は14ptにする場合の指定です。

```yaml
texdocumentclass: ["jsbook", "14pt"]
```
自分が投稿したものだけ管理画面で表示する

管理者以外のユーザにいろいろ投稿させるサイトを作るときにきっとやりたくなるので、ちょっと調べてみた。

権限でedit_other_XXXをつけなければ、自分が作ったもの以外は編集できないのだけど、リスト上ではほかのユーザの投稿が見れるし、リスト上部の「すべて」とかの横に表示される投稿件数も自分以外の投稿を含めた結果になってしまう。これは、wordpressの事情を知らない普通のユーザからすれば違和感のある画面である。

以下の二つのfilterとactionでそれを回避できる。

まずは、投稿リストの「すべて」とかのリンクを出さないようにする。

管理画面のリスト上部のリンクは、

```php
$views = apply_filters( 'views_' . $this->screen->id, $views );
```
された結果が表示される。この$viewsには、"mine"や"all"といったリスト表示内容を表すキーに対して、一覧へのリンク文字列が格納されている。

なので、viewsから"mine"以外のリンクを取り除いた配列を返すフィルターを設定する。こうすると、"所有"というリンクしか表示されなくなる。

既に自分が投稿しているものがあるときは、これだけで投稿リスト上には自分の投稿しか出なくなる（つまり所有リンクがクリックされた状態になっている。

しかし、自分の投稿が一件もないときは、他人の投稿のリストが表示されてしまうので、まだ目的は達成できていない。

そこで、実際に自分の投稿のみに限定するために、'pre_get_posts"アクションに以下のアクションを設定する。

```php
function filter_other_post( $wp_query ) {
    global $pagenow, $current_user;

    if($pagenow != 'admin-ajax.php' && $pagenow != "edit.php" ) {
        return;
    }

    if($current_user->roles[0] == "administrator") {
        //管理者はすべて閲覧可能
        return;
    }

    $wp_query->query_vars['author'] = $current_user->ID;
}
```

管理画面からのajaxでの取得（写真を記事に挿入するときの画像一覧とか）と、投稿画面の時のみフィルターするようにしている。そうしないと、トップページやアーカイブページでもフィルターが効いてしまい、投稿がない状態として処理されてしまう。

これで、とりあえず管理画面を普通に触っている分には、他人の投稿は存在しないかのような画面を見せることができる。
[ReVIEW Tips] URLをリンクにする

ReVIEWでは、URLをそのまま書いただけではリンクになりません。変に気を利かせて思わぬところがリンクになってびっくり、ということは起きない安心設計になっています。

リンクにするには、``@<href>``記法を使います。以下の様な感じです。

```review
 * Qiita (@<href>{http://qiita.com/})
```

こうすると、HTMLでは以下のようになります。

>  * Qiita (http://qiita.com/)

アンカーを別の文字列にするには、以下のように書きます。

```review
 * @<href>{http://qiita.com/,Qiita}
```

こうすると、以下のようになります。

> * [Qiita](http://qiita.com)
matplotlibでグラフを動的に生成して、reporlabでPDFに埋め込む

PIL.ImageFileIOを経由するといけるっぽい。

webで動的にPDF作成して返すときに使えます。

```py
from StringIO import StringIO
from PIL import ImageFileIO
import matplotlib.pyplot as plt
from reportlab.platypus import Image
 
buf = StringIO()
 
#plot your graphs
 
plt.save_figure(buf, format="png")
buf.seek(0)
im = ImageFileIO.ImageFileIO(buf)
 
flowable_image = Image(im) 
```
https://gist.github.com/kokardy/5967661
Android のコーディングガイドラインを俺訳

本格的に自分用。「訳」と書くのは釣り気味。

http://source.android.com/source/code-style.html

* 例外
  * 例外は無視するな。というか無視したくなるようなら設計が間違ってる。
  * Exception でなんでもかんでもまとめてキャッチするな。
* Finalizer 使うな。
* 完全修飾で `import` しろ。パッケージまとめてするな。
* スタンダードな Javadoc 書こう。
  * つまらないメソッドには書かなくていい。アクセッサとかいらない。
* メソッドは短く書け。
* フィールドの定義は、使う場所のすぐ上か、ファイルの先頭のどちらかでやれ。
* スコープはできるだけ限定するんだ。
* `import` 文の順序は「android」「サードパーティライブラリ」「java/javax」がいい。
* インデントにはスペースを使う。1インデントは4スペース。行の折り返しは8スペース。
* フィールド名は以下のルールでやる。
  * 非パブリックなインスタンスフィールドは頭文字を `m` とする。
  * スタティックフィールドは頭文字を `s` とする。
  * その他のフィールドは小文字ではじめる。
  * `public static final` なフィールドは全部大文字、`_` 区切りで。
* 始まりの中括弧は同一行に書く。終わりの中括弧は独立行とする。
  * `if` 文の本体が1行しかない場合、まとめて書いてもいい。`if(true) hogehoge();`
* 一行はだいたい100文字くらいでお願いします。
* 普通の Java アノテーション使おう。Deprecated、Override、SuppressWarnings。
* 頭文字で構成された単語は、普通の単語として変数名ルールに従う。
* `TODO:` コメントはよいプラクティスなので使うべき。だけど完璧ではない。
  * もし、「将来あれこれする」式のコメントを書くときは、明確な日付かイベント名を書き加えるといい。
* ログはパフォーマンスに多大な影響を与える。気をつけろ。
* 肝心なのは一貫性。グローバルスタイルは大事だけど、ローカルスタイルはもっと大事。統一感がないコードは読む人をびっくりさせちゃうぜ。
* テストメソッド名は、`_` で区切ってもいいよ。

インスタンスフィールドの接頭文字 `m` ってなんだろう。=> member variable っぽい。

調べたら、詳細な訳もあった。 http://www.textdrop.net/android/code-style-ja.html
PHPでアルゴリズム「マージソート」(完成)

何年かごしに

```php:MergeSort.php
<?php
namespace Algo\Sort;

class MergeSort
{
    public function run($n, &$data, $offset)
    {
        if ($n <= 1) {
            return;
        }
        $m = (int) ($n / 2);

        self::run($m, $data, $offset);
        self::run($n - $m, $data, $offset + $m);

        $buffer = [];
        for ($i = 0;  $i < $m; $i++) {
            $buffer[$i] = $data[$offset + $i];
        }

        $j = $m;
        $i = $k = 0;

        while ($i < $m && $j < $n) {
            if ($buffer[$i] <= $data[$offset + $j]) {
                $data[$offset + $k++] = $buffer[$i++];
            } else {
                $data[$offset + $k++] = $data[$offset + $j++];
            }
        }

        while ($i < $m) {
            $data[$offset + $k++] = $buffer[$i++];
        }
    }
}
```

```php:MergeSortTest.php
<?php

class MergeSortTest extends PHPUnit_Framework_TestCase
{
    public function test_mergeSort()
    {
        $n = 10;
        $data = [];
        for ($i = 0; $i < $n; $i++) {
            $data[] = rand();
        }
        $expected = $data;
        sort($expected);

        $t = new \Algo\Sort\MergeSort();
        $t->run($n, $data, 0);

        $this->assertEquals($expected, $data);
    }
}
```
[ReVIEW Tips] LATEXBuilderでバックスラッシュを円記号にする

バックスラッシュ文字（Unicodeで言うところのU+005C）を円記号で出力したいことがあります。そのため、LATEXBuilderではバックスラッシュ文字がマクロ``\reviewbackslash``に置き換えられるようになっています。

``\reviewbackslash``は、標準では``\textbackslash{}``になっています。そこで、これを再定義して円記号に置き換えることで、バックスラッシュ文字が円記号になります。

LaTeXで円記号を出力する方法はいろいろありますが、ReVIEWは標準でascmacを読み込むことになっているので、``\yen``が使えます。以下の様な指定をスタイルファイルに追加して下さい。

```tex
\renewcommand{\reviewbackslash}[0]{\yen}
```

これでバックスラッシュ文字が円記号になります。

もっとも、これはグローバルな設定で、一文書内でバックスラッシュと円記号を両方出せる、というものではありません。文書内でどちらを使うかを決めてからお使いください。
phpでアルゴリズム「クイックソート」

引き続きクイックソート

```php:QuickSort.php
<?php
function QuickSort($bottom=0,$top,&$data){
    if($bottom >= $top){
        return;
    }
    //先頭の値を「適当な値」とする
    $div = $data[$bottom];

    //$data[$bottom]番目より大きい値を後ろに持っていく
    for($lower = $bottom, $upper = $top; $lower < $upper;){
        //$lower番目の値が適当に選択した値以下の限り
        while($lower <= $upper && $data[$lower] <= $div){
            $lower++; //最終的な$lowerの値は$divよりも大きい値の配列番号になる
        }
        //$upper番目の値が適当に選択した値より大きい限り
        while($lower <= $upper && $data[$upper] > $div){
            $upper--;//最終的な$lowerの値は$divよりも小さい値の配列番号になる
        }
        //もし$divより大きな値が、$divより小さい値よりも前に有った場合、順番を入れ替える
        if($lower < $upper){
            $temp = $data[$lower];
            $data[$lower] = $data[$upper];
            $data[$upper] = $temp;

        }

    }
    //最初に選択した値を中央に移動
    $temp = $data[$bottom];
    $data[$bottom] = $data[$upper];
    $data[$upper] = $temp;
    QuickSort($bottom, $upper -1, $data);
    QuickSort($upper + 1, $top, $data);
}

$sort = array();
$N = 10000;
//ソート準備
for($i = 0; $i < $N; $i++){
    $sort[$i] = rand();
}

QuickSort(0, $N-1, $sort);

var_dump($sort);
```
phpでアルゴリズム「バブルソート」

プログラミングの宝箱 アルゴリズムとデータ構造 (C magazine) 
に出てくるアルゴリズムをphpで書いてみる
バブルソート

```php:BubbleSort.php
<?php
//バブルソート関数
function bubble_sort($sort,$N){
    $k = 0;
   do{
        $flag = 0;
        for($i = 0; $i < $N-1-$k; $i++){
            //先頭から順に見ていく
            if($sort[$i] > $sort[$i+1]){
                //i+1がiよりも大きければ入れ替える
                $flag = 1;
                $j = $sort[$i];
                $sort[$i] = $sort[$i+1];
                $sort[$i+1] = $j;
            }
        }
       $k++;
       //一度も入れ替えることなく見終わったら終了
    }while($flag == 1);
    return $sort;
}
$sort = array();
$N = 10000;
//ソート準備
for($i = 0; $i < $N; $i++){
    $sort[$i] = rand();
}
$result = bubble_sort($sort,$N);
var_dump($result);
exit;
```

以上！
新・三大JavaScriptフレームワークの実践(Backbone.js Knockout.js Angular.js)

JavaScriptフレームワークは[数多い](http://codebrief.com/2012/01/the-top-10-javascript-mvc-frameworks-reviewed/)が、結局どれを選んだらよいのかよくわからん、ということはよくある。

今回は、メジャーどころの三大フレームワークを使ってまったく同じ機能のTodoアプリを作成してみました。
そのソースコードは、下記の通りjsFiddleで参照＆稼働させてみることができます。これで（きれいごとではない）クセやコード量などを感じてみてもらえればよいと思います。

| FW | jsFiddle | 所感 |
|:-----------|:------------|:------------|
| Backbone.js  | [Todo①](http://jsfiddle.net/icoxfog417/pfxP5/) |大規模開発向きか。簡単なアプリなら割に合わない|
| Knockout.js   | [Todo②](http://jsfiddle.net/icoxfog417/sujqa/) | わかりやすい。面倒な面はあるが、不可解でドツボにはまることがあまりない |
| Angular.js      | [Todo③](http://jsfiddle.net/icoxfog417/nLC3g/) | 便利。ただ、自由度が高すぎて統制をかけたい場合は向かないかも|

**Todoリストの機能**
1.テキストボックスから、Enterで追加できる
2.登録したTodoはダブルクリックで編集可能になり、Enterで編集確定できる
3.登録されているTodoの総件数がフッターに表示される
4.完了したTodoがある場合、それらをリストから消すボタンが表示される
5.全選択/解除を行うチェックボックスがある

## 個人的な結論
趣味開発で使うならAngular.js・仕事で使うならKnockout.jsをお勧めしたい。

まず、フレームワークを選択する際は、以下3つの選択基準を持つとよいと思う。

**1.開発の規模**
大規模ならBackbone.jsはお勧めできる。
書き方が決まっていて、チュートリアルに目を通せば(面倒なのは置いておいて)何を作らなければならないかは簡単に理解できる。そこそこの人数で長い時間の開発を行うなら、UIチームはアプリケーションとView、サーバーサイドはModelとCollection、という感じで分業もしやすいと思う。UIバインディング型のフレームワークは性質上画面DOMありきなので、バインディング部分のモジュール化は結構頭を使う必要があると思う。

**2.フレームワークに求めるもの**
コードを構造化したいのか、生産性を上げたいのか、両方の場合どちらの優先度が高いのかを考えるとよいと思う。
生産性の向上ならUIバインディング型のKnockout.jsやAngular.jsがお勧めだ。
これらは、普通に使ってて便利！と思える瞬間が多い。個人で開発する場合構造化に迫られる人はあんまりいないと思うので、そういう場合にも良い。

**3.趣味**
使い始めるとその後拘束されることになるので、なんだかんだ言って第一印象は重要だ。今回は実際に書いたコードを掲載しているので、参考になれば。

以下は、所感の詳細。

## Backbone.js 
確かにこれを使えばJavaScriptはきれいに書ける気がする。が、手間はかなりかかる。
今回Todoリストを表示するのに、まずTodoのModel、これを表示するためのView、リスト表示するためのCollection、そして最後にアプリケーション、と4つもオブジェクトを作る必要がある。
将来的な使いまわしを考えるならこれが活きてくるのかもしれないが、そうするとそこそこ大規模でないと割に合わないと思う。あと「軽い」とよく言われるがその分他ライブラリ(jQuery/Underscore.js etc)に依存しているので、そこは要注意(特にjQueryはすでにプロジェクトで使っているバージョンがあったりするので)。

## Knockout.js 
わかりやすい、というのが第一印象。DOMとJavaScript側ViewModelの対応関係は見通しがよく、理解しやすい。
イベント/テンプレートバインディングなど効果の実感できる機能がすぐに使え、JavaScriptフレームワークを初めて使う、またチームで展開してみたい、という時にお勧めできる。
独自タグがないのでHTMLはHTMLとして完成されるのもポイントが高い(他のフレームワークは、そんな属性ない警告や不明タグ警告がそこそこ出る)・・・が、その分煩雑な記述が要求されることも多い(特にIF文)のは注意。

## Angular.js 
形としてはKnockout.jsに近いが、より簡単にかける。
具体的に簡単な点としては、Knockout.jsだと単純に値を書きたい場合でも```<span data-bind="text:hoge"></span>```みたいな形でDOMを経由しないといけないが、Angular.jsでは```{{hoge}}```と一発でかける(ただ、逆にng-click="function(){xxx}"みたいにはかけないので、一長一短?)。
今回のTodoアプリでは、選択しているのが1つなら"item"、複数なら"items"にするというようなしちめんどくさい機能があるのだが、こういう細かい実装があるときこの差が結構出てくる。

ただ、自由に書ける反面統制がききにくそうで、そこは注意が必要と感じた。チームで使うなら、Model定義とtemplateについては要ルール整備と思う→カオスにならないためということで、[まとめました](http://qiita.com/icoxfog417/items/2ac773c33a8b34288551)。
また、Backbone.jsにおけるUnderscore.js、Knockoutにおけるko.utilsみたいなサポートライブラリがないので、「配列から画面で選択された要素を削除する」みたいな簡単な処理でも書くのが面倒なことがある(今回のTodoリストでも・・・)。
enumとintの比較を(intとの互換性を保ったまま)防ぐ

enumを数値と比較して間違うことがよくまれにあります。

```cpp:
enum Food {
    FOOD_CURRY,
};

void test() {
    if (FOOD_CURRY == 100) { // コンパイルは通る
        puts("drink");
    }
}
```

enumとintの間でコンパイルエラーになるよう比較演算子を定義すると、intの自動変換によるミスが防げるので、安全装置として使えます。

```cpp:
void operator==(Food, int);
void operator!=(Food, int);
void operator==(int, Food);
void operator!=(int, Food);

void test() {
    if (FOOD_CURRY == 100) { // 通らない
        puts("ok");
    }
}
```

C++11の場合、以下のようにすると定義がないという心残りが少し減ります。(scoped enumが使えればそのほうがよいのですが、こちらはenumを定義しているヘッダがいじれない場合でも勝手に手元でやれるというのが強みです)

```cpp:
void operator==(Food, int) = delete;
void operator!=(Food, int) = delete;
void operator==(int, Food) = delete;
void operator!=(int, Food) = delete;

void test() {
    if (FOOD_CURRY == 100) { // 通らない
        puts("ok");
    }
}
```

enumも結局はintなので、この小細工で他enumとの比較もついでに防げます。

```cpp:
enum Beverage {
    BEVERAGE_CURRY,
};

void test() {
    if (FOOD_CURRY == BEVERAGE_CURRY) { // compile error!
        puts("drink");
    }
}
```

デメリットやもっと上手な（行数の少ない）方法などあれば教えてください。
任意の個数のコールバックつき関数を順番に呼び出す

下記のようなコールバックを取る関数を順次呼び出したいとします。

```coffeescript
a = (cb) -> setTimeout (-> console.log "a" ; do cb), 300
b = (cb) -> setTimeout (-> console.log "b" ; do cb), 200
c = (cb) -> setTimeout (-> console.log "c" ; do cb), 100 
```

こういう結果が欲しい。

```
$ seq. a.coffee
a
b
c
```

素直なやり方はこう。

```coffeescript
a ->
  b ->
    c ->
```

これだと、個数が固定になっちゃいます。なんとか任意の個数実行できるようにしたい。

そこで、賢いやり方。

```coffeescript
_ = require 'underscore'
 
do _.reduceRight [a, b, c], ((acc, f) -> -> f acc), _.identity
```

結果はどちらもこうなります。

https://gist.github.com/fujimura/6569342
Vagrant上のマシンにprivate_networkで定義したIPで接続できない

2回くらいハマったので自分用メモ

## 問題

ホストマシンからVagrantで立ち上げたUbuntuに, private_networkで指定したアドレスでアクセス出来ない. sshは繋げる.

```bash
$ vagrant up

Configuring and enabling network interfaces...
/Applications/Vagrant/embedded/gems/gems/net-scp-1.1.2/lib/net/scp.rb:392:in `await_response_state': Using /home/vagrant/.rvm/gems/ruby-2.0.0-p247 (RuntimeError)
...
```

`Configuring and enabling network interfaces...`のあとスタックトレースが出るが, VM自体は立ち上がっている状態.


```bash
host $ ping 192.168.33.18
PING 192.168.33.18 (192.168.33.18): 56 data bytes
Request timeout for icmp_seq 0
```

## 解決

VirtualBoxでの設定が必要な気もするがとりあえずUbuntu上だけで解決するための手順をメモ.

まず, `ifconfig`で確認するとeth0とloしかない. ここにeth1を追加したい.

```bash
host $ cat Vagrantfile
```

```ruby
  config.vm.box = "ubuntu"
  config.vm.network :private_network, ip: "192.168.33.18"
  ...
```

```bash
vm $ sudo vim /etc/network/interfaces
```

```diff
# 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
auto eth0
iface eth0 inet dhcp

+ auto eth1
+ iface eth1 inet static
+   address 192.168.33.18 # <== Vagrantfileに書いたIPと合わせる
+   netmask 255.255.255.0
```

```bash
vm $ sudo /etc/init.d/networking restart
```

これでprivate_networkが意図通り動くようになった.

```bash
host $ ping 192.168.33.18
PING 192.168.33.18 (192.168.33.18): 56 data bytes
64 bytes from 192.168.33.18: icmp_seq=0 ttl=64 time=0.321 ms
```
[ReVIEW Tips] LATEXBuilderでHelveticaを使う

ほとんどReVIEWじゃなくてLaTeXの話ですが気にしないことにします。

LaTeXの標準のサンセリフ書体はComputer Modern SansSerifが使われます。これをHelveticaにする場合には、以下の様な指定をスタイルファイルに追加します。

```tex
\renewcommand{\sfdefault}{phv}
```
[ReVIEW Tips] LaTeXで表紙ページでのページ番号エラーを抑制する

reivew-pdfmakerで素朴にビルドすると、ページ生成時に、

```shell-session
** WARNING ** Object @page.1 already defined.
```

といったエラーが出ることがあります。このうち、PDFで同じページ番号のページができてしまうために発生することがあります。これは、表紙と中表紙が1ページ・2ページとなった上で、本文の最初も1ページになってしまうことがあるようです。

これを防ぐためには、スタイルファイルの指定に以下のような記述を追加します。

```tex
\pagenumbering{Roman}
```

こうすると、表紙ページはローマ数字の「I」ページ、中表紙ページは「II」ページになるので、重複が回避できます。
[ReVIEW Tips] ReVIEWで気をつけた方が良いこと

ReVIEWを使っていて比較的問題になりやすい注意点について紹介しておきます．

## Unicodeの扱い

とりわけreview-pdfmaker(LATEXBuilder)を使う場合、本文などでUnicodeしかない文字を使うとエラーになることがあります。これはpLaTeXが基本的にJIS X 0208文字に対応しているためです。

このような場合に、``@<uchar>``を使ってUnicode文字をコードポイントを指定して利用できる場合があります。``@<uchar>{XXXX}``とすると、Unicodeのコードポイント（16進数）で指定した文字になります。

もっとも、LATEXBuilderにしろHTMLBuilderにしろ、そもそもフォントにその文字が存在しなければ表示できません。PDF等でフォントを埋め込みにしている場合にはビルド時に、EPUB等でフォントを埋め込んでいない場合は閲覧時に問題が生じることになります。ご注意ください。

## 1ファイル1章・ファイルは章見出しで始める

基本的には1ファイルが1章に該当します。ファイルの冒頭には章見出し（第1レベル見出し）をつけておくのが無難です。つまり、章を分割したくない場合はファイルも分割しない方が良いです。

細かい挙動について説明しておくと、LATEXBuilderの場合には*.reをそれぞれ*.texに変換して、それを【書籍名】.texからinputで読み込むことになります。
またHTMLBuilderの場合には、*.reのファイルがそのまま*.htmlのファイルに対応する形になります。review-epubmakerを使ってEPUBを作ると、EPUBは章がファイルに対応する場合が多いので、そのまま*.reが章の単位になります。

この辺りは挙動を分かった上で回避する方法はなくもないわけですが、そもそも回避しようと頑張るよりは素直に制約に従っておいた方がムダな苦労をしなくて済むような気がします。ご留意下さい。
[ReVIEW Tips] ReVIEW用のファイル一式を作る

ReVIEWは単なる1ページのHTMLを生成するたぐいの文書フォーマットコンバータではなく、書籍のようなまとまったデータを生成するシステムです。そのせいもあって、必要となるファイル群がいろいろとあり、ちょっと始めてみたいという時に取っ付きづらいところがあるのも否めません。

そのため、とっかかりのファイル群を簡単に生成できるためのコマンドが作られました。それが``review-init``コマンドです。

## review-init コマンドを使う

review-initコマンドは以下のように実行します。

```shell-session
$ review-init 【ディレクトリ名】
```

例えばsample1というディレクトリ名でReVIEWのファイル群を作るには以下のようにします。

```shell-session
$ review-init sample1
```

【ディレクトリ名】で指定したディレクトリが作られ、中にファイルがいくつか作られます。

```shell-session
$ ls sample1
CHAPS		PREDEF		config.yml	layouts		sty
POSTDEF		Rakefile	images		sample1.re
```

## 既存のReVIEW用フォルダを流用する

それとは別に、すでにできている雛形から作る方法もあります。サンプルの書籍ファイルは以下のサイトなどにあります。

- https://github.com/takahashim/review-sample-book

ここから必要なファイルを取得します。gitはちょっと…という方は、右下の方にある「Download Zip」というボタンを押すと、zipで固められたファイルがダウンロードされるので、zipファイルを展開してください。

あとは、中に入っているファイルを適当に書き換えるなり、追加するなりしてお使いください。
ターミナルからgithubのリポジトリにアクセスする設定(sshの設定)


GitHub Helpページを参考にしてます。
https://help.github.com/articles/generating-ssh-keys

まず、鍵を作成。鍵のファイル名はgithub_id_rsaにしています。

```
$ cd ~/.ssh/
$ ssh-keygen -t rsa -C "メールアドレス"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/ユーザー名/.ssh/id_rsa): github_id_rsa
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in github_id_rsa.
Your public key has been saved in github_id_rsa.pub.
(省略)
```

クリップボードに公開鍵をコピー。pbcopyコマンドでコピーします。

```
$ pbcopy < github_id_rsa.pub
```

GitHub Webページの「User settings」「SSH Key」へ。
「Add SSH key」に進んでクリップボートにコピーした公開鍵を貼り付けます。

これで設定完了です。
ターミナルのsshコマンドで接続確認を行います。

```
$ ssh -l git -i ~/.ssh/github_id_rsa github.com                                                       
PTY allocation request failed on channel 0
Hi pakiln! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.
```

接続できました。

次はおまけです。sshコマンドのオプションを省略する設定です。

```
$ vi ~/.ssh/config
Host github.com
 HostName      github.com
 IdentityFile  ~/.ssh/github_id_rsa
 User          git
```

この設定をしておくと、

```
$ ssh github.com
```

で

```
$ ssh -l git -i ~/.ssh/github_id_rsa github.com                                                       
```

を実行したことになります。
MacでChef環境を整える


chefとknife soloが使用できる環境を整えます。

chefのインストール方法は公式のドキュメントに従っています。
http://www.getchef.com/chef/install/


次のコマンドでchefをインストールできます。

```
$ curl -L https://www.opscode.com/chef/install.sh | sudo bash
```

次に、knifeコマンドの初期設定を行います。

```
$ knife configure
```

色々と質問されますが全てデフォルトのままで済ませます。

続けてknife-soloのインストールです。
chefのバージョン11から、chefにrubyも含まれているのでそのgemを使用します。

```
$ sudo /opt/chef/embedded/bin/gem install knife-solo
```

では、knife-soloでレポジトリ（キッチン）を作成してみます。

```
$ knife solo init chef-repo
Creating kitchen...
Creating knife.rb in kitchen...
Creating cupboards...
Setting up Librarian...
```

chef-repoディレクトリのできあがり。

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

料理の準備ができました。
bundle installでZenTestがインストール出来ない


## 結論

rubygemsのバージョンが新しすぎてインストール出来ない時があり、バージョンを下げて解決する


## 失敗例

rubygemsのversionが1.8以上じゃないとダメだね、といわれる
※ エラーメッセージはrubygemsのバージョンが古い旨のメッセージが出るが、アップグレードしてもダメな場合がある

```
[takaidohigasi@takaido01 ]$ bundle install
Updating git@github.com:tamac-io/rdb-common.git
Fetching gem metadata from http://rubygems.org/........
Fetching gem metadata from http://rubygems.org/..
Resolving dependencies...

Installing ZenTest (4.8.3) 
Gem::InstallError: ZenTest requires RubyGems version ~> 1.8. Try 'gem update --system' to update RubyGems itself.
An error occurred while installing ZenTest (4.8.3), and Bundler cannot continue.
Make sure that `gem install ZenTest -v '4.8.3'` succeeds before bundling.
```

## 確認のポイント

### rubygemsのバージョン確認

現在のrubygemsのバージョンは、gem envにて確認する。下記の場合は2.0.7

```
[11:17:05 takaidohigasi@takaido01 ]$ gem env
RubyGems Environment:
  - RUBYGEMS VERSION: 2.0.7
```

## 対処法 (rubygemsバージョンアップ & ダウン)

http://blog.ruedap.com/2011/02/21/ruby-gem-update-version-down

ダメだったバージョン
- 2.0.7
- 2.0.3

OKだったバージョン
- 1.8.25

どのバージョンでOKだったかの情報お待ちしております
CentOSにNodeJS+nginxの環境を構築する


CentOS6.3にnode+nginxの環境を用意しようと思ったのでその見聞録です。


1. まずはnodeのインストール

```
$ sudo yum install nodejs
```
これだけでおkです。
　
2. 次にnpmのインストール

```
$ sudo curl https://npmjs.org/install.sh | sh
```
　
3. ここでちゃんとインストールされているか確認する

```
$ type node
node is /usr/bin/node

$ type npm
npm is /usr/bin/npm
```
これでちゃんと入っている事が確認できますね。
　
4. nginxのインストールためのリポジトリの準備

````
$ sudo /etc/yum.repos.d/nginx.conf

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1
```
　
5. インストール

```
$ sudo yum install nginx
```	
　
6. nginxのconfigファイルのへの変更

```
$ sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/hoge.polidog.jp.conf
$ sudo vim /etc/nginx/conf.d/hoge.polidog.jp.conf

upstream backend_node {
    ip_hash;
    server 127.0.0.1:3000;
}

server {
    listen       80;
    server_name  hoge.polidog.jp;
    root /path/to/hoge	

    #charset koi8-r;
    charset utf-8;
    access_log /var/log/nginx/access_hoge.poidog.jp.log main;
    error_log /var/log/nginx/errror_hoge.polidog.jp.log;

    location / {
        if (-f $request_filename) {
            break;
        }


        if ( !-f $request_filename ) {
            proxy_pass http://backend_node;
            break;
        }
    }

}
```
これでやっとnginxの設定ができました。
　
7. nginx再起動

```
$ sudo /etc/init.d/nginx restart
```
ただこれだと問題がありまして。。。リダイレクトがうまく行かないと。。。
proxy_set_headerとかproxy_redirectをoffにすれば解決するので、ということで、以下のようにnginxの設定を書き換えます。

```
$ sudo vim /etc/nginx/nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  /var/log/nginx/access.log  main;

    sendfile        on;

    keepalive_timeout  65;

    gzip    on;

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;
    proxy_redirect off;

    include /etc/nginx/conf.d/*.conf;


}
```
これでリダイレクト自体も問題ないかと思います。
さてさて、次はいよいよ、nodejsのデーモン化していこうと思います。
　
8. nodejsのデーモン化
nodejsのデーモン化するツールですが、node-demonとかforeverとかあるいっぽいのでとりあえずforeverを入れましょう

```
$ sudo npm install -g forever
$ cd /path/to/hoge
$ sudo forever start app.js
```
　
9. nodeが無事起動出来たらnginxを再起動

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

これで無事nginx経由でnodejsが実行できますよー
[ReVIEW Tips] 最新版（開発版）をインストールする

ReVIEWはgem(RubyGems)パッケージとしても配布されているので、gemコマンドを使って簡単にインストールすることができます。

```shell-session
$ gem install review
```

※管理者権限がないとインストールできない環境の場合、``sudo``を前につけてください。

```shell-session
$ sudo gem install review
```

ところが、良くも悪くもReVIEWは現在も鋭意開発中のため、最新版じゃないと使えない機能や、gem版でインストールすると微妙な動きをすることがあります。そのような場合、MLやgithub issuesに報告して欲しいわけですが、そうすると「それはgithubの最新版では修正されています」という答えが返ってくることもあります。これを使うには、最新版をインストールして使うことになります。

## 開発版インストール（ふつうのやり方編）

githubの最新版は、いわゆる「開発版」というやつで、ちょっとインストールが面倒になっています。

まず、インストールするにはgitを導入するのがおすすめです。gitコマンドのインストール方法は各プラットフォームによって異なるので省略します。なお、WindowsやMac OS Xの場合、gitコマンドではなくgithubアプリを導入することでインストールすることもできるはずです。

まず、gitコマンドでgithubから最新版のソースコードを取得します。

```shell-session
$ git clone https://github.com/kmuto/review.git
$ cd review
```

``review``ディレクトリに移動してから、rakeコマンドを使ってインストールします。こちらも必要であれば``sudo``を追加してください。

```shell-session
$ rake install
```

これで開発版のReVIEWが使えるようになります。

## 開発版インストール（ショートカット編）

gitコマンドがインストールされている前提で、gemコマンドだけでインストールする方法があります。
specific_install gemを使う方法です。

cf. http://qiita.com/yuku_t/items/5ab4fbe404b718999a35

specific_install gemをインストールしてから、githubのレポジトリを指定してインストールします。

```shell-session
$ gem install specific_install
$ gem specific_install -l 'git://github.com/kmuto/review'
```

こうすることでも開発版のReVIEWがインストールできます。

なお、開発版は開発版なので、gem版よりも不安定な場合もあります。あしからず。
某チューブの日本語が文字化けする


nokogiriを使って取得した某チューブのhtmlの日本語が URI.unescape しても化けて困った。

下記のようにして URI.unescape したらいけた

```ruby
…

require "kconv"

…

doc = Nokogiri::HTML(open(url), nil, "utf-8")
```

あとは普通にしたい処理をするだけ。
Railsでのモジュールのオートロード

Railsでのモジュールの使い方のメモです。
Railsプロジェクト内の/config/application.rbファイル内にモジュール設置パス以下のファイルを自動でロードする指定をし、クラス内で "include モジュール名" と指定することで該当モジュールを読み込めるようになります。
モジュールはRailsプロジェクト内の/lib以下に設置します。
コントローラ、ヘルパー、モデルで共通で使われる機能はモジュールにまとめて必要に応じて呼び出します。

## 動作確認環境
- Rails (Ver 4.0.0)
 - [Rails 4.0: Final version released!](http://weblog.rubyonrails.org/2013/6/25/Rails-4-0-final/)
- Rails (Ver 3.2.13) 

##### ※2013/9/15 追記
コメント欄で御指摘いただきました。
Rails 4.0.0でもこのやり方で動きましたが、Rails4からapp/controllers/concerns, app/model/concernsというディレクトリが追加され、これらのディレクトリにモジュールを設置する形になったようです。
- [ActiveSupport::Concern](http://api.rubyonrails.org/classes/ActiveSupport/Concern.html)
Rails3までは以下のやり方で設定することになると思います。Rails 3.2.13では動作確認できました。

## サンプルコード
##### 自動ロード対象となるパスの指定(Rails3からautoload_pathsの設定はデフォルトでは無効)
```/config/application.rb
…
module TestApp
  class Application < Rails::Application
  …
    ### モジュール自動ロードPathの指定を追記
    config.autoload_paths += %W(#{config.root}/lib)
  …
  end
end
```

##### モジュール定義
```/lib/testmodule.rb
module Hoge
  def test_module_method
    処理内容
  end
end
```

##### モジュールの読み込み(以下はコントローラクラスの例)
```/app/controllers/test_controller.rb
class TestController < ApplicationController
  ### モジュールの読み込み(インクルード)
  include Hoge
  …
  def index
  …
    ### indexメソッド内でHogeモジュールの「test_module_method」メソッドを実行
    test_module_method
  …
  end
  …
end
```

## 参考

- [オートロード対象となるパスの追加(config.autoload_paths) | 設定ファイル(config) - Railsドキュメント](http://railsdoc.com/config#%E3%82%AA%E3%83%BC%E3%83%88%E3%83%AD%E3%83%BC%E3%83%89%E5%AF%BE%E8%B1%A1%E3%81%A8%E3%81%AA%E3%82%8B%E3%83%91%E3%82%B9%E3%81%AE%E8%BF%BD%E5%8A%A0(config.autoload_paths))
[ReVIEW Tips] まえがきや付録等、前付・後付を追加する

ReVIEWは原稿が書かれている*.reファイルをCHAPSファイルに記述します。例えばch01.re〜ch05.reという5つの章に分かれた原稿の場合、CHAPSファイルは以下のようになります。

```
ch01.re
ch02.re
ch03.re
ch04.re
ch05.re
```

ところで、このようにCHAPSファイルに書くのは、いわゆる本文にあたる部分を想定しています。第1レベル見出しをつけると、それは「第XX章」のように書かれます。

一般的な書籍には、本文とは別に、まえがきや付録、あとがきなど、本文の前後に文章が追加されます。本文より前にくる序文やまえがきを「前付」、本文よりあとに来る付録やあとがきなどを「後付」と言います。これらを記述用にはCHAPS以外のファイルを使います。

前付用のファイルはPREDEFファイルです。例えば「はじめに」というまえがきをpreface.reに書いたとします。

```review
= はじめに

みなさんこんにちは。
（以下略）
```

この場合、PREDEFファイルは以下のようになります。

```
preface.re
```

同様に、後付用のファイルはPOSTDEFファイルです。例えば「ひみつのつかいかた」という付録をappendix1.reに書いたとします。

```review
= ひみつのつかいかた

ここまで読んだ方のために、ひみつのつかいかたを紹介します。
（以下略）
```

この場合、POSTDEFファイルは以下のようになります。

```
appendix1.re
```

というわけで、文書全体の並びとしては、

- PREDEFに書かれたファイル
- CHAPSに書かれたファイル
- POSTDEFに書かれたファイル

という順番になります。
Git で特定のコミットからブランチを切りたい（作成したい）

あるブランチにコミットしていって、「あ、やっぱりこのコミットハッシュの時点のソースをいじくりたいなあ」と思うときがあると思います。
そのままチェックアウトすると無名ブランチに迷い込んでしまうのでブランチ名を指定してチェックアウトします。
コミットハッシュの一部を指定して `feature/some-function` というブランチを作成する例です。

### 特定のコミットをチェックアウト

```bash
$ git checkout 7aba6ab4b94bc5 -b feature/some-function
```

### リモートブランチをチェックアウト

リモートを指定しなくてもうまい具合にトラックするようにしてくれるときがあるけど、こっちのほうが確実。

```bash
$ git checkout -b feature/some-function origin/feature/some-function
Branch feature/some-function set up to track remote branch feature/some-function from origin.
Switched to a new branch 'feature/some-function'
```
sed でファイルから特定の文字列を含む行のみを抽出する

以下は `partman` という文字列を含む行のみを抽出してそのファイルを **上書き** する例です。
問答無用で上書きされるので注意してください。

`-i` は Replace In-Place をの略である。入力ファイルを直接その場で書き換えることを意味する。

## Linuxの場合

sedの `p` コマンドを使ったらできるようです。
この場合、 `-n` オプションも付けないといけないっぽいです。

```bash
sed -i -ne '/partman/p' sample.txt
```

## Macの場合

`-i` には引数つけないといけないっぽいです。
[【Mac】sedコマンドで上書き保存](http://blog.shonanshachu.com/2013/02/macsed.html)

```bash
sed -i '' -ne '/partman/p' sample.txt
```

## 遺稿

自作したワンライナー。
mktemp というコマンドが必要です。

```bash
TMPF=`mktemp` && FILE=sample.txt && grep "partman" $FILE >$TMPF && mv $TMPF $FILE
```
[ReVIEW Tips] LATEXBuilderで付録の数字を1,2,3...とする

ReVIEWでは通常POSTDEFに記述したファイルが付録として扱われますが、付録のナンバリングが問題となります。

review-epubmakerを使ってEPUBを作ると、付録は「付録1」などとアラビア数字が使われますが、LaTeXの標準では「付録A」などとアルファベットが使われます。

これを変更して、EPUB同様に「付録1」などとするには、スタイルファイルに以下のような記述を追加します。

```tex
\renewcommand{\reviewappendix}{%
  \appendix
  \renewcommand{\thechapter}{\arabic{chapter}}
  \setcounter{secnumdepth}{0}
}
```

``\reviewappendix``はReVIEW用のマクロで、通常はただの``\appendix``です。これを書き換えることによって、独自の設定ができるわけです。上の例では、``\thechapter``を再定義することによって、数字の表記を変更しています。

さらに、``\setcounter{secnumdepth}{0}``を追加しています。これは、section(節)以下の見出しに番号をつけなくするための指定です。EPUBに合わせるのに加えて、そもそも付録2の第1節に「2-1」とかついても第2章第1節と区別がつかなくてうれしくないため、これを追加しています。
coffee コマンドで監視する時に少し色をつける

コマンドラインに色がほしい。

そういう時に便利なのがgrcですが、yum や apt-get それに homebrew でインストール出来ないどころかgithubにさえ置いてありません。何でなんでしょう便利なのに。

既に grc がインストール済みであることが前提です。入れてない人はこのアカウントの過去の投稿の何処かにあるので探してください。

まず coffee script 用の色の設定を作ります。
```/usr/share/grc/conf.coffee
# compiled
regexp=compiled
colours=green
=======
# CAPS LINE
regexp=Parse error
colours=red
```
compiled を緑に、Parse error を赤にするだけの設定です。

次にcoffeeコマンドに対するフックを書きます。
```/etc/grc.conf
# coffee command
(^|[/\w\.]+/)coffee\s?
conf.coffee
```

そして `alias coffee='grc coffee`` と .bashrc にでも書いておけば色つきcoffee コマンドが使えます。
VMware image convert to VirtualBox image

=====================================

VMware のイメージを VirtualBox のイメージにする
オプションの引数を変えれば、逆もできるし、RAW や、VHD 形式にも対応している

前提条件
-----------------------
1. VirtualBox がインストールされていること

実施した環境
-----------------------
Mac

方法
-----------------------
$ VBoxManage clonehd --format VDI input.vmdk output.vdi


その他
--------------------
昔は QEMU の util 使ってたっぽい
Emacsで #f95327 などの文字列に色を付けておく

css を書いてると #f92732 とか出てくるけど、どんな色なのかパッとわからないと不便だと思ったのでEmacsで色を付けてみた。

コメント欄で yasuyk@github さんが教えてくれた rainbow-mode の方が便利そうなので書き変え。

`M-x package-install` で rainbow-mode をインストールして

```el:~/.emacs.d/inits/30-rainbow.el
(require 'rainbow-mode)
(add-hook 'css-mode-hook 'rainbow-mode)
(add-hook 'scss-mode-hook 'rainbow-mode)
(add-hook 'php-mode-hook 'rainbow-mode)
(add-hook 'html-mode-hook 'rainbow-mode)
```
でhookを書けておけばOK。ちなみにこの書き方は24からなので23より下のバージョンを使ってる人は「参考」を見て書いてください。

--こっから下は古いの。

```el:~/.emacs.d/inits/40-hex-color.el
(defvar hexcolour-keywords
  '(("#[abcdef[:digit:]]\\{6\\}"
     (0 (put-text-property
         (match-beginning 0)
         (match-end 0)
         'face (list :background
                     (match-string-no-properties 0)))))))
(defun hexcolour-add-to-font-lock ()
  (font-lock-add-keywords nil hexcolour-keywords))

(add-hook 'css-mode-hook 'hexcolour-add-to-font-lock)
(add-hook 'scss-mode-hook 'hexcolour-add-to-font-lock)
(add-hook 'php-mode-hook 'hexcolour-add-to-font-lock)
(add-hook 'html-mode-hook 'hexcolour-add-to-font-lock)
```

でOK。

## 参考

Popup color from color string like `#f2d3aa` with Emacs - Stack Overflow
http://stackoverflow.com/questions/18806523/popup-color-from-color-string-like-f2d3aa-with-emacs

How to enable a package/mode on emacs startup? - Stack Overflow
http://stackoverflow.com/questions/16048231/how-to-enable-a-package-mode-on-emacs-startup
Emacs で適当にキーを押してたらテキストが消えてUndoもできない助けて！！ …という時の対処法

今回はナローイングの機能をぼんやりと覚えていたのでそれほど混乱せずにすみましたが、突然ナローイングが起きると何も知らない人にはテキストが突然消えて、しかもUndoしようとすると

> Changes to be undone are outside visible portion of buffer

とか言われてUndoもできなく泣きたくなることがあります。

最近のEmacsでは初心者が間違って打って泣かないように `narrow-to-*` のコマンドを打っても初回は確認画面が出てくるなっているようなのですが、何をどう打ったのか自分の場合はナローイングしちゃってました。不思議。

## 説明
ナローイングとはテキストの一部分だけを表示して、他の部分を一切見えなくする方法です。編集も全くできなくなるので「バッファ全体の文字列を置換」系統の処理をしても変更されません。

## 対策

詳しい説明は他の場所にいくらでも載ってるので、そうなった時の対処法について

`M-x: widen`

してください。以上です。
【Mac限定】定期的にローカル環境のRailsログファイルを削除する方法

## Railsのログが肥大化する問題
Railsの開発をしていると、`development.log`や`test.log`がどんどん肥大化していきます。

ローカル環境のログであれば、数日前のログが見たいと思うことは滅多にないはずです。
肥大化したログファイルは単なる無駄ですので、定期的にログファイルを消してあげましょう。

## 定期的にログファイルを削除する方法
注) 以下の方法はMac限定です。

### 1. plistファイルを作成する
`~/Library/LaunchAgents/me.rails.clean-log-files.plist`というファイルを以下のように作成します。

````xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>me.rails.clean-log-files</string>
  <key>Program</key>
  <string>/bin/bash</string>
  <key>ProgramArguments</key>
  <array>
    <string>-l</string>
    <string>-c</string>
    <!-- TODO Replace ~/projects with path to your projects directory -->
    <string>find ~/projects -wholename '*/log/*.log' -print0 | xargs -0 rm</string>
  </array>
  <!-- Cleans development log files every day at 5 AM -->
  <key>StartCalendarInterval</key>
  <dict>
    <key>Minute</key>
    <integer>0</integer>
    <key>Hour</key>
    <integer>5</integer>
  </dict>
</dict>
</plist>
````

ファイル名やLabelは好きな名前を付けて下さい。

````xml
  <!-- ~/Library/LaunchAgents/me.rails.clean-log-files.plist -->
  <key>Label</key>
  <string>me.rails.clean-log-files</string>
````

対象の親ディレクトリは自分の開発環境に合わせて変更して下さい。

````xml
    <!-- TODO Replace ~/projects with path to your projects directory -->
    <string>find ~/projects -wholename '*/log/*.log' -print0 | xargs -0 rm</string>
````

ジョブを起動する時刻もお好みで変更して下さい。

````xml
  <!-- Cleans development log files every day at 5 AM -->
  <key>StartCalendarInterval</key>
  <dict>
    <key>Minute</key>
    <integer>0</integer>
    <key>Hour</key>
    <integer>5</integer>
  </dict>
````

### 2. ジョブをMacに登録する
以下のコマンドを実行してジョブを登録します。

````bash
$ launchctl load ~/Library/LaunchAgents/me.rails.clean-log-files.plist
````

念のため、ジョブが正常に登録されていることを確認します。

````bash
$ launchctl list | grep me.rails.clean-log-files
-	0	me.rails.clean-log-files
````

ジョブを停止する場合は`unload`します。

````bash
$ launchctl unload ~/Library/LaunchAgents/me.rails.clean-log-files.plist
````

## ジョブの起動時刻にMacを起動していなくてもOK！

cronとは異なり、ジョブの起動時刻にMacを起動していなくても大丈夫です。
起動時刻を過ぎていても、Macを立ち上げたタイミングでジョブが起動します。

これで毎日ローカル開発環境のログファイルが削除されます！

### 参考
この投稿は以下のブログ記事を参考にしています。

- [Clean your development log files every day](http://leonid.shevtsov.me/en/clean-your-development-log-files-every-day)
C++でもeach_with_indexがしたい

ので作ってみた。車輪の再発明万歳。

```cpp:enumerate.hpp
template<typename T1>
class enumerate : public std::unary_function<T1, void>{
	typedef unsigned long ul;
public:
	enumerate(std::function<void(T1, ul)> f) : index(0), func(f) {};
	enumerate(ul i, std::function<void(T1, ul)> f) : index(i), func(f) {};
	void operator()(T1 t1){
		func(t1, index);
		++index;
	}
private:
	ul index;
	std::function<void(T1,  ul)> func;
};
```

使い方は以下の様に

```cpp:sample.cpp
std::for_each(container.begin(), container.end(), enumerate<int>([&](int x, int i){
	// ...
}));
```
もっと色々したい場合はboost使う。
flycheck で popup-tip する

flycheck で popup-tip するのが検索しても見つからなかったので書いてみた。
まだ、メッセージが一行の場合しか試していない。

あと、色を変えたりしたかったけど、やってない。

```el
(setq flycheck-display-errors-function
      '(lambda (errors)
         (-when-let (messages (-keep #'flycheck-error-message errors))
           (popup-tip (s-join "\n\n" messages)))))
```
[ReVIEW Tips] LATEXBuilderでスタイルを指定する

ReVIEWをインストールすると、``review-pdfmaker``というコマンドが標準でインストールされます。``review-epubmaker``コマンドがEPUBファイルを作るのと同様、このコマンドはPDFファイルを直接作ってくれます。このコマンドでは、ビルダーとしてはLATEXBuilderというLaTeX用のビルダーが使われます。

使い方は以下の通りです。

```bash
$ review-pdfmaker 【設定用YAMLファイル】
```

ReVIEWでPDFを作成するには、このコマンドを使うか、またはInDesignで頑張ることになりますが、とりあえずここでは後者は置いておいて前者の話にします（HTMLBuilderでHTMLなりEPUBなりを生成してからPDFに変換するという技もありそうですが、詳しく知らないのでなかったことにします）。

## スタイルファイルを使って指定する

さて``review-pdfmaker``で生成されるPDFの見た目をいろいろ変えたいとなると、LaTeXのスタイルを指定する必要があります。これには設定用YAMLファイルに指定をします。

```yaml
texstyle: mymacro
```

こうすると、``review-pdfmaker``を実行したディレクトリから見て、``sty/mymacro.sty``というパスのスタイルファイルが読み込まれるようになります（LaTeX的には、標準で使われるデフォルトのパッケージ指定やその他の設定に加えて、``\usepackage{mymacro}``で読み込まれることになります）。具体的な*.styの書き方はLaTeXを勉強してください（私もそれほどよく分かっていないので日々苦労しています）。

## ドキュメントクラスを指定する

なお、上記のスタイルファイルの指定では``\documentclass``の設定を変えることはできません。``\documentclass``を指定するには、設定用YAMLファイルに以下のように記述します。

```yaml
texdocumentclass: ["jsbook", "oneside,14pt"]
```

こうすると、生成されるLaTeXのドキュメントクラス指定は以下のようになります。

```tex
\documentclass[oneside,14pt]{jsbook}
```
特定の値を読み込むまでのConduit

次のテキストファイルをENDが来る手前まで読み込みたい。

```hogehoge.txt
waiwai
weiwei
yahoo
END
hoge
hoge
```

Conduitを`takeWhile :: (a -> Bool) -> [a] -> [a]`みたいにして作りたい！

```hs:conduit_sample.hs
{-# LANGUAGE OverloadedStrings #-}
import Data.Conduit
import qualified Data.Conduit.Binary as CB
import qualified Data.Conduit.List as CL

takeWhile' :: Monad m => (a -> Bool) -> Conduit a m a
takeWhile' f = do
  mx <- await
  case mx of
    Nothing -> return ()
    Just x
      | f x -> yield x >> takeWhile' f
      | otherwise -> return ()

main = do
  ss <-
    runResourceT $
    CB.sourceFile "hogehoge"
    $= CB.lines
    $= takeWhile' (/= "END")
    $$ CL.consume
  print ss
```

これでいい気がする。すごくMonadを普通に書くだけだった。

## 参考文献 ##
http://tanakh.jp/posts/2012-07-01-conduit-0.5.html