OmniAICreator/Qiita-1.07M huggingface dataset:
[C]qsort()を使う

APIを覚える練習．
空白の要素も入った配列を昇順にソートすると，
空白が先頭に来てしまう．

空白を比較対象に入たくない場合は，
配列の長さを指定してソートする．

`qsort(table, 4, sizeof(table[0]), compare_char);`
の4の部分が該当する．

```c:qsort.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int compare_char(const void* left, const void* right) {
	char *left_char = (char *)left;
	char *right_char = (char *)right;

	return strcmp( left_char, right_char );
}

int main() {

	int i=0;
	char table[10][20] = { 
		"123",
		"A0",
		"Z0",
		"9w3"
	};

	for(i=0; i<10; i++) {
		printf("%d %s\n", i, table[i]);
	}

	printf(" --- sort\n");
	
	qsort(table, 4, sizeof(table[0]), compare_char);
	
	for(i=0; i<10; i++) {
		printf("%d %s\n", i, table[i]);
	}
}
```

#ポインタの配列に対応したqsort() 2014-03-09追記
コメントのご指摘を受けて，呼び出し先の比較関数でオブジェクトの型情報を正確に受け取る様に修正しました．追加で，配列の終端を`NULL`で定義して文字配列の終端を検知できるようにコードを修正しました．

```c:qsort-withPointer.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int compare_char(const void* left, const void* right) {

    const char *left_char = *(const char **)left;
    const char *right_char = *(const char **)right;

    return strcmp( left_char, right_char );
}

int main() {

    int i=0;
    // 配列中に文字列リテラルを配置するのと等価
    const char* s0 = "123";
    const char* s1 = "A0";
    const char* s2 = "Z0";
    const char* s3 = "9w3";

    // 配列の終端に番兵(NULL)を配置
    const char* table[] = {s0, s1, s2, s3, NULL};

    printf(" --- original\n");

    // table[]の要素を数える
    // 配列の終端を表すNULLを検出するまでカウンタをインクリメントする
    i=0;
    while(table[i]) {
        printf("%d %s\n", i, table[i]);
        i++;
    }

    printf(" --- sort\n");

    qsort(table, i, sizeof(*table), compare_char);

    i=0;
    while(table[i]) {
        printf("%d %s\n", i, table[i]);
        i++;
    }
}
```
Eclipseダークテーマ！

Eclipseにダークテーマを設定する方法について私のブログにまとめてみました↓
http://infotech776.blog.fc2.com/blog-entry-41.html

![eclipseMoonRise.png](https://qiita-image-store.s3.amazonaws.com/0/33458/ebe82cdb-f943-739f-9e13-e9cbdd65363a.png)

設定が終わると上の画像のような画面になります。
設定自体は大体10分ぐらいで終わるので、良かったら試してみてください！
地味に使えるニコ動プレイヤーの操作キー1.0

##地味に使えるニコ動プレイヤーの操作キー 1.0

Space 動画の再生・停止
C コメント入力
F フルスクリーン
ESC フルスクリーン解除
↑or↓ 音量調整
coroutine(コルーチン)を使ってお手軽なState Machine(ステートマシン)を作ってみた

コルーチンを使って、お手軽なステートマシンを作ってみました。

ステートマシンというと、Boost.MSMをはじめ色々ライブラリーがあり、いまさらな感じなのですが、

* 重かったり（ビルド時間が）

* 面倒くさかったり（コードジェネレーターを使うのが）

するので、そんな大げさなことをしたくないとき用です。

```cpp
#include <iostream>

#include <boost/assert.hpp>
#include <boost/asio/coroutine.hpp>

constexpr int ANY_EVENT = ~0,
              EVENT1 = 1 << 1,
              EVENT2 = 1 << 2,
              EVENT3 = 1 << 3;

enum state_t {
    STATE1 = 1,
    STATE2,
};

#include <boost/asio/yield.hpp>
template <typename Action>
class state_machine
{
public:
    state_machine()
    :   ctx_(), state_(), mask_(ANY_EVENT), action_()
    {
        do_process_event(0);
    }

    void process_event(int event)
    {
        if (event & mask_)
            do_process_event(event);
        else
            action_.on_error(state_, event);
    }

    bool is_complete() const
    {
        return ctx_.is_complete();
    }

private:
    void do_process_event(int event)
    {
        reenter(ctx_) {
            while (1) {
                yield accept_event(STATE1, EVENT1 | EVENT2);
                if (event == EVENT2) {
                    action_.do_action2();
                    break;
                }
                else {
                    action_.do_action1();
                }
            }

            yield accept_event(STATE2, EVENT3);
            action_.do_action3();
        }
    }

    void accept_event(state_t state, int mask) {
        if (state != state_) {
            state_t tmp = state_;
            state_ = state;
            action_.on_state_changed(tmp, state);
        }
        mask_ = mask;
    }

    boost::asio::coroutine ctx_;
    state_t state_;
    int mask_;
    Action action_;
};
#include <boost/asio/unyield.hpp>

//-------------------------------------------------------------------
// BEGIN TEST CODE

using namespace std;

int check = 0;
struct dummy_action {
    void on_state_changed(state_t before, state_t after) { cout << "State changed: " << before << " -> " << after << endl; }
    void do_action1() { check = 1; cout << "Action 1 is called" << endl; }
    void do_action2() { check = 2; cout << "Action 2 is called" << endl; }
    void do_action3() { check = 3; cout << "Action 3 is called" << endl; }
    void on_error(state_t state, int event) { cout << state << ": Event " << event << " is ignored." << endl; }
};

int main() {
    state_machine<dummy_action> sm;

    check = 0;
    sm.process_event(EVENT1);
    BOOST_ASSERT(check == 1);

    check = 0;
    sm.process_event(EVENT3);
    BOOST_ASSERT(check == 0);

    check = 0;
    sm.process_event(EVENT1);
    BOOST_ASSERT(check == 1);

    check = 0;
    sm.process_event(EVENT2);
    BOOST_ASSERT(check == 2);

    check = 0;
    sm.process_event(EVENT3);
    BOOST_ASSERT(check == 3);

    BOOST_ASSERT(sm.is_complete() == true);

    return 0;
}
```

ビルド方法
--------

```bash
g++ -std=c++11 -I$BOOST_ROOT state_machine_demo.cpp
```

実行結果
---------

```
State changed: 0 -> 1
Action 1 is called
1: Event 8 is ignored.
Action 1 is called
Action 2 is called
State changed: 1 -> 2
Action 3 is called
```
Marvericksにしたら、さくらVPSのVNCコンソールが動かなくなった


どうやら、Java絡みっぽい。

# Java for OS X 2013-005をインストール

http://support.apple.com/kb/DL1572?viewlocale=ja_JP

# ターミナルでごにょごにょ

http://support.apple.com/kb/HT5559?viewlocale=ja_JP

の通りにごにょごにょ。

```console
$ sudo mkdir -p /Library/Internet\ Plug-Ins/disabled
$ sudo mv /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin /Library/Internet\ Plug-Ins/disabled
$ sudo ln -sf /System/Library/Java/Support/Deploy.bundle/Contents/Resources/JavaPlugin2_NPAPI.plugin /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin 
$ sudo ln -sf /System/Library/Frameworks/JavaVM.framework/Commands/javaws /usr/bin/javaws
```
sublime text3でeclipseのF3のような関数ジャンプキーバインドを設定する

sublime text3でPHPの開発をしているのですが、
eclipseやnet beansにあったF3やctrl+左クリックで関数の宣言元にジャンプできる機能がないかなと思って
色々と探してみたらできたのでメモしておきます。

sublime text3からの新機能である`goto_definition`というコマンドを設定すればよい模様。
デフォルトではF12に設定されていて、プロジェクト内検索しか対応していないようですが、使えそうです。

メニューの `Preferences > KeyBindings User` を開いて以下を追記。

    // F3で関数の宣言元にジャンプ
    { "keys": ["f3"], "command": "goto_definition" },
    // alt+左で戻る
    { "keys": ["alt+left"], "command": "jump_back" },
    // alt+右で戻ったのをまた進める
    { "keys": ["alt+right"], "command": "jump_forward" },

再起動せずに即時反映されます。

##ctrlを押しながら関数名をマウスクリックする時もF3と同じ動きをさせたい

マウスのキーバインドはメニューから設定ファイルを開くようになっていないっぽいので悩んだのですが
偉大なるstackoverflowに同じような投稿があったので参考にしました。

> 参考
> [Sublime 3 - Set Key map for function Goto Definition](http://stackoverflow.com/questions/16235706/sublime-3-set-key-map-for-function-goto-definition)

`Preferences > Browse Packages`で設定ファイルが入っているディレクトリを開いて
更にUserディレクトリの中に`Default (Windows).sublime-mousemap`というファイルを作成し、
中に以下の設定を書くと反映されました。

    [
        {
            "button": "button1", 
            "count": 1, 
            "modifiers": ["ctrl"],
            "press_command": "drag_select",
            "command": "goto_definition"
        },
    ]

macだと`Default (OSX).sublime-mousemap`
linuxだと`Default (Linux).sublime-mousemap`というファイル名になるようです(未確認)

また、ctrl+clickにすると、sublime textの魅力の一つであるカーソルを複数置く機能とかぶってしまうので
自分は`"modifiers": ["ctrl"],`の部分を`"modifiers": ["ctrl", "shift"],`として
ctrl+shift+clickでジャンプするように設定しました。


##ついでに

他に設定しているeclipse風ショートカットは以下
`Preferences > KeyBindings User`に追記

    // 上の行と入れ替える
    { "keys": ["alt+up"], "command": "swap_line_up" },
    // 下の行と入れ替える
    { "keys": ["alt+down"], "command": "swap_line_down" },
    // 行複製 (windowsだとwindows側のグラフィックオプションのホットキーを無効にしないと画面が回転します)
    { "keys": ["ctrl+alt+down"], "command": "duplicate_line" },
    // ファイル検索＆置換
    { "keys": ["ctrl+h"], "command": "show_panel", "args": {"panel": "find_in_files"} },
    // 行削除
    { "keys": ["ctrl+d"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete Line.sublime-macro"} },
    
    // ctrl+dを行削除に設定したので、デフォルトにあった文字列選択はctrl+shift+dに設定
    { "keys": ["ctrl+shift+d"], "command": "find_under_expand" },

ctrl+マウススクロールでフォントサイズが変更されるのが面倒だったのでその機能を切る
`Default (Windows).sublime-mousemap`内に追記

    { "button": "scroll_down", "modifiers": ["ctrl"], "command": "null" },
    { "button": "scroll_up", "modifiers": ["ctrl"], "command": "null" },

> 参考
> [SublimeText2でマウスでの動作の設定を変更する](http://qiita.com/Fuhduki/items/9a245448996e0dae5876)
tar コマンド


`アーカイブ` ディレクトリや複数のファイルを1つのファイルにまとめること。

`-z` オプションを付けると、アーカイブ作成する際、自動的に`gzip`コマンドを呼び出し、`tar`コマンドで作り出されるものを自動的に圧縮してくれる。

```Bash
$ du -s Masters\ Thesis/
6424 Masters Thesis/
# アーカイブ作成
$ tar -czvf masters.thesis.tgz Masters\ Thesis/
...
$ ls -ls masters.thesis.tgz

# 戻す
$tar -xvf masters.thesis.tgz

```

## `tar -c`
アーカイブを作成
## `tar -t`
アーカイブ中に含まれているものを調べる
## `tar -x`
アーカイブからファイルやディレクトリを取り出す

## その他
`-f` オプション  

```Bash
tar -f ファイル名
```

対象にするアーカイブ名を指定する

`-v` オプション
処理過程を出力させる

## tips
複数のファイル名を別々に`tar`コマンドに指定するのではなく、ディレクトリ名を１つだけ指定する。  
復数のファイルを別々に指定する方式だと、アーカイブを元に戻した際、展開先になったディレクトリ内に、取り出されたファイルがばらまかれてしまう。  
しかし、ディレクトリを1つ指定する方式だと、元に戻した際、ディレクトリが１つ新しく作成され、その中に全ファイルが展開されるようになる。

## 参考
[入門 Unix for OS X](http://www.oreilly.co.jp/books/9784873116440/) 4.5.6.2
Parallella で aobench


漢なら Parallella で最初に動かすコードは aobench ですね!

http://www.youtube.com/watch?v=_t4p4Is0Z3E

Parallella で aobench を動かすまでの記録です.

## ソースコード

github に上げてあります.

https://github.com/syoyo/aobench-parallella

## 詳細

あとで書く
文字列中に存在する必要のない空白を削除する方法

　文字列の中に存在する空白がいらないので削除したいときがあると思います。
　ただ文字列中の空白を全て削除したい、左側のみ削除したい、右側のみ・・・など色々なケースが存在すると思います。
　このとき使えるメソッドをまとめてみました。
　下にコードを記述します。

```rb:string.rb
str = "   Hello World.    "

# とにかく全部の空白がいらない場合
str.gsub(" ", "")               # => "HelloWorld."

# 単語の間にある空白は削除したくない場合
str.strip                       # => "Hello World."

# 左側にある空白のみ削除したい場合
str.lstrip                      # => "Hello World.    "

# 右側にある空白のみ削除したい場合
str.rstrip                      # => "   Hello World."

# 破壊的メソッド
str.strip!
str                             # => "Hello World."
```

　gsubは第1引数で指定したものを第2引数で全て置き換えます。
　またstrip、rstrip、lstripを使用する場合、改行やタブなども削除するみたいなので注意が必要です。
　最後にそれぞれ破壊的メソッドも用意されていますので、メソッド名に!(エクスクラメーション・マーク)を付け足すことで、レシーバを変更することができます。
【Xcode】【iOS】ライブラリ導入時のApple Mach-O Linker Error. library not found for -lcurl【謎のエラー？】

# Build Failed
開発業務を行っていると各種ライブラリを使用したりすることがあると思います。
その時にビルドエラーが起きる事があります。
もちろん原因はいくつも考えられます。
・必要なフレームワークが足りない？
・ビルドセッティングがおかしい？
などなど。
こういったものは公式サイトのドキュメントをしっかりと読んだり、
セッティングなどを見なおしたり、またウェブ検索を駆使し。
先人の知恵をお借りしたりすれば大抵解決出来る事でしょう。

しかし、
・必要なフレームワークはちゃんと入れてる
・ビルドセッティングもおかしくは無い…はず
だけどビルドエラー…。

なんてこともあります。
その時の解決策は状況によってまちまちですが、
その一つだけ再現例を交えて紹介します。

今回のサンプルで使用したのは[Flurry](http://www.flurry.com/)。

# サンプルプロジェクト作成
テキトーにxcode開いて、テキトーにサンプルプロジェクトを作りました。

![スクリーンショット 2014-02-23 15.56.07.png](https://qiita-image-store.s3.amazonaws.com/0/26453/ac2df9ca-819d-2b78-f5a5-ac2356e85912.png)

# 何にも考えずにライブラリを入れてビルドしてみる

そのサンプルプロジェクトにFlurryのライブラリを入れて、ビルド。

![スクリーンショット 2014-02-23 15.58.06.png](https://qiita-image-store.s3.amazonaws.com/0/26453/324c5e18-8d8e-e535-bbc8-831663cea3f6.png)

はい、もちろんエラー出ました。
必要なFrameworkが無いからです。

![スクリーンショット 2014-02-23 16.00.05.png](https://qiita-image-store.s3.amazonaws.com/0/26453/5a9b2efe-5750-2220-009e-00aae2f9135a.png)

公式でもウェブ検索でも、この２つのframeworkが必要ですよーという情報が溢れています。
この２つのFrameworkを入れてビルドすれば、OKです。

# え…まだビルドエラー…だと…？

こっからが本題です。
必要なフレームワーク入れたのにビルドエラー！

※わざと引き起こしています。基本的には発生しません。
![スクリーンショット 2014-02-23 16.02.22.png](https://qiita-image-store.s3.amazonaws.com/0/26453/ddf210c3-a2ca-af37-3e95-aa3a0bf24883.png)

あまり見たくない画面ですね。

ですが、正直これは分かりやすい部類です。
他のライブラリ入れて無いんで、library not found for -lFlurry_4.3.2
とかちゃんと言ってます。

しかし、他のライブラリも入っていると

ld: library not found for -lluasocket
clang: error: linker command failed with exit code 1 (use -v to see invocation)

ld: library not found for -lcurl
clang: error: linker command failed with exit code 1 (use -v to see invocation)

などなど
全然関係はずのライブラリが無い！といった謎のエラーになることがあります。

# 調査状況例

その場合多くの方が
・必要なフレームワークが入ってないんじゃないか？
・ビルドセッティングがおかしいのか？
・必要ないライブラリファイルまで入れちゃった？
・いやいや、本当にそのライブラリが無いんじゃないの？
などと考えを巡らしながら、解決策を図るはずです。

で、調査していくとこんな状況になったり。
1) Flurryを入れる直前のxcodeprojをビルド => Success
2) Security.frameworkだけ入れてビルド => Success
3) SystemConfiguration.frameworkも入れてビルド => Success
4) Flurryフォルダを入れてビルド => FAIL

# 解決

この一連のビルドエラーの原因はズバリこれです。

![スクリーンショット 2014-02-23 16.03.01.png](https://qiita-image-store.s3.amazonaws.com/0/26453/3799c893-a6bb-aaba-ae51-ea6ac461ad68.png)

一見、パス合ってますんで、そこまでおかしくない気がします。
が、この\"が曲者です。それを除去したら無事にビルドが通るようになります。

実プロジェクトっぽくしますと、
$(inherited) 
\"$(SRCROOT)/libraryA/Plugins\" 
\"$(SRCROOT)/libraryB\" 
/Users/aaaa/Documents/libraryC

から

$(inherited) 
$(SRCROOT)/libraryA/Plugins
$(SRCROOT)/libraryB 
/Users/aaaa/Documents/libraryC

このようにすると無事にビルドエラーが解消されます。
逆に

$(inherited) 
\"$(SRCROOT)/libraryA/Plugins\" 
\"$(SRCROOT)/libraryB\" 
\"/Users/aaaa/Documents/libraryC\"

これではビルドエラーは解消されません。

# その他

フタを開けてみればなんてことはない事でさらにTIPSレベルで恐縮です。
そして例外なので、そうそう直面することが無いエラーです。

ソースコードの記述ミスレベルならともかく
リンカエラー系なんて誰も見たくないで、直面しなければしない方がいいです。

・Xcode4以前から開発が続いているプロジェクトでなおかつ各種ライブラリを使用している
（相対パスでしっかりと指定していて、多人数開発にも対応させている）

プロジェクトでは発生する可能性があります。

過去にあった事を思い出しながらこの記事を書いたので、
少し状況が曖昧ですが、解決策は間違いありません。

もし、誰かがそのような状況に置かれた時にこのTIPSが役に立つ事を祈っています。
Macでhubotを試す最速手順 [deprecated]

## Deprecated

この記事は古い記事です。 また気が向いたら更新します。

hubotで反応を返してくれるping pongコマンドを試すまでの、最速手順。

### 前提
Mac OSX 10.9 && Homebrew

---

### hubot起動まで

```bash
  $ brew install node redis # node.jsと redisをインストール
  $ redis-server & # redisを起動しておく。続きは他のタブやウィンドウで実行すること。
  $ npm install -g hubot coffee-script # hubotをインストール
  $ hubot --create YOUR_BOT_NAME # hubotを作成。YOUR_BOT_NAMEは任意の名前(ディレクトリが出来る)
  $ cd YOUR_BOT_NAME; bin/hubot # 作成したディレクトリに移動後、botを起動
```

### コマンド実行

```bash
  # 以下のようなメッセージが出てきたらReturnするとHubotのプロンプトが表示される
  [Sun Feb 23 2014 16:23:51 GMT+0900 (JST)] INFO Initializing new data for brain
  Hubot>
  Hubot> hubot ping # hubotに対してpingコマンドを実行すると...
  Hubot> PONG # ピンポンしてくれる
  Hubot> hubot help # ヘルプ。実行できるコマンド一覧など。
```

---

### 以下はオマケ

自分でhubotのコマンド(script)を作る。今回作るのは名前を引数にして、hello worldを返すだけのコマンド。

```bash
  $ cd /PATH/TO/YOUR/HUBOT/scripts # 作成したhubotのディレクトリ内のscriptsディレクトリに移動
  $ vim hello.coffee # 下記のhello.coffeeを作成
  $ bin/hubot #作成後、hubotを起動
  Hubot> hubot I am akira
  Hubot> Hello, world! akira
```

```coffeescript:hello.coffee
  module.exports = (robot) ->
    robot.respond /I am (.*)/i, (msg) -> # 正規表現で名前を取得
      msg.send "Hello, world! #{msg.match[1]}"  # match[1]に取得した値
```

以上。

[コマンド作成の参考](http://blog.fumiz.me/2012/08/05/hubot-irc-bot-script/)
[hubotスクリプト一覧](https://github.com/github/hubot-scripts/tree/master/src/scripts)
[スクリプト一覧その2](http://hubot-script-catalog.herokuapp.com/)
完全自分用C#メモ

C#のメモ
調べたものをメモする。

***
カレントディレクトリの取得

```c#
using System.IO;
```

した後、

```c#
string cd = Directory.GetCurrentDirectory();
```

で得られる。
***
配列（の例）

整数の配列

```c#
int[] x = {1,2,3,4,5,6,7,8};
```

***
数の変換

```c#
//文字列への変換
int num = 10;
string st = num.ToSring();
string st2 = Math.PI.ToSring();

//文字列からの変換
int num2 = int.Parse(st);

//int以外の型の数からintへの変換
int num2 = (int)Math.PI;

```

***

画像の扱い
画像はProperiesのリソースに登録

```c#
pictureBox1.Image = Properties.Resources.image_name;
// で取得
Color c = Properties.Resources.image_name.GetPixel(0,0);
// で色取得
```

***
go でmapや配列等を pretty print (var_dumpみたいな何か)と yaml の読み込み


yamlは、https://godoc.org/launchpad.net/goyaml を、
pretty printは http://godoc.org/github.com/kr/pretty を使えばいい感じです。

```yaml:config
mail_from: masahide.y@gmail.com
to: [masahide.y@gmail.com]
var:
  c: 2
  d: [3, 4]
```

```go:example.go
    m := make(map[interface{}]interface{})
    err = goyaml.Unmarshal([]byte(config), &m)
    if err != nil {
        panic(err)
    }
    //fmt.Printf("--- m:\n%# v\n\n", m)
    pretty.Printf("--- m:\n%# v\n\n", m)
```

```Bash:
$ go run main.go
--- m:
map[interface {}]interface {}{
    "mail_from": "masahide.y@gmail.com",
    "to":        []interface {}{
        "masahide.y@gmail.com",
    },
    "var": map[interface {}]interface {}{
        "c": int(2),
        "d": []interface {}{
            int(3),
            int(4),
        },
    },
}
```
npm で bower をインストールする時に bower のパッケージも自動でインストールする

Rails アプリの開発に bower を使用していますが、npm で bower をインストールするのと同時に、bower によりインストールされるパッケージも一緒にインストールするようにすることが可能です。

それは bower をインストールするときに使用する package.json を使用します。package.json には ```scripts``` という項目が用意されていて、この項目の中を設定することで、インストール後などのフックを掛けることができます。

フックについては以下のリンクを参考にしてください。

[npm-scripts](https://www.npmjs.org/doc/misc/npm-scripts.html)

試しに、```npm install``` 後を及び ```npm update``` 後に ```bower install``` を実行するようにしてみましょう。

```json:package.json
{
  "name": "",
  "version": "0.0.1",
  "dependencies": {
    "bower": "1.2.8"
  },
  "scripts": {
    "postinstall": "bower install",
    "postupdate": "bower install"
  }
}
```

このとき、npm が bower のパスを適切に設定してくれるようなので、bower をシステムではなくローカルにインストールした場合でも適切に動きました。
Perlで標準入力の行頭に時間を付与するワンライナー


後々の煩悶時間節約のためのメモです。

```perl
perl -M'POSIX' -nle 's/\s+$//; print strftime("%Y/%m/%d %H:%M:%S ", localtime()) . $_'
```


TOPをログして解析したい場合。


```perl
top -n 1 -b | perl -M'POSIX' -nle 's/\s+$//; print strftime("%Y/%m/%d %H:%M:%S ", localtime()) . $_'
```
フィールドの追加、削除を行うマイグレーションファイル作成時

以下の命名規則に従うことにより、具体的なコードを自動生成する

```
# フィールドの追加
Add<Field>To<Table>

#フィールドの削除
Remove<Field>From<Table>
```

```
# 例
rails generate migration AddNameToUsers name:string
```
pdfDocumentクラスを使ったページ拡大について

windows8.1から標準で搭載された「pdfDocumet」クラスを使ってて、はまったのでメモ。

pdfPage（1ページ分のデータ格納）を拡大する場合、
PdfPageRenderOptions.SourceRectに拡大箇所（矩形）を指定すれば可能と判明。
※単純にPdfPageRenderOptions.DestinationHeightを変えただけだと、
　画像の解像度が変わった感じで拡大にはなりませんでした。。

※ちなみに「pdfDocument」クラスはwindows8.0では使えません。
CoreDataを使ってデータを処理しようとしたときのメモ

ある記録をRDB的に保管し、後に参照や集計をしたい。objective-cでそれを実現するために、CoreDataを使って実装している。  
ここでは、CoreDataの概念を自分なりにまとめた結果と、次回似たような作業する際につかう覚書を残しておく。


## CoreDataの主要な仲間たちを整理する
数名の関係者が協力しあって、アプリとデータストアとの相互作用を実現している。
(仲間たち、っていうのは僕の語彙不足による悲しい表現方法ですが、もっとちゃんとした名称って日本語でどう言えばいいのだろうか。ちなみに参考にした[英語サイト](http://www.appcoda.com/introduction-to-core-data/)では、Core Data Stackと表現している)


|CoreData|役割・概念|
|-----|-----|
|Managed Object Model|アプリで利用するスキーマ（DBスキーマみたいな)|
|Persistant Store Coordinator|永続化ストア(デフォルトはSQLite)との調整役|
|Managed Object Context|アプリがデータと相互作用するために利用するスクラッチパッド|

CoreDataに関する関係性の理解には、下記がわかりやすい。
![About the Core Data Stack](http://www.appcoda.com/wp-content/uploads/2012/12/Core-Data-Stack.jpg)

以下、自分がわかるような言葉でまとめる。

* Managed Object Modelはxcdatamodeldにて視覚的に定義
* Managed Object Contextを介して、情報を操作することが基本原則
* Persistant Store Coordinator以降の低層のことは、AppDelegateがある程度面倒みてくれるので今は気にしない
* manage Object Context はスクラッチパッド(情報の一時保管領域)なので、明示的な更新や保存が必要

## 実装中に気づいたことや時間がかかったこと

### CoreDataのモデルオブジェクトを`alloc`してもエラーになる
当初、アプリのモデルオブジェクトは便宜的にNSMutableArrayで実現していたため、初期化は`[[NSMutableArray alloc] init]`で行っていた。
その後、このモデルオブジェクトをCoreData用にカスタマイズしていく過程で、エラーが発生した。
`http://stackoverflow.com/questions/14671478/coredata-error-failed-to-call-designated-initializer-on-nsmanagedobject-class 'Entitiy'`

[これ](http://stackoverflow.com/questions/14671478/coredata-error-failed-to-call-designated-initializer-on-nsmanagedobject-class)によると、

NSObjectの初期化はalloc/initでもちろんOKだが、NSManagedObjectを初期化するには `initWithEntity:insertIntoManagedObjectContext`でないとダメ。

今回のような過程では、プロパティ、インスタンス変数、ローカル変数の全てでちゃんと手直ししないといけない。ちなみにコンパイルは通る。

### 永続化ストアコーディネイタを作成できない  
原因は、xcdatamodeldの名前をAppDelegate.mに記載していないからだった。記載していたのは、モデルクラスの名前だったのでこれが問題。
[ここ](http://stackoverflow.com/questions/7361187/cannot-create-an-nspersistentstorecoordinator-with-a-nil-model)を読んで解決した。

### 途中でモデルの内容を変更すると動かなくなる
エディタを使って気軽に手軽にカラム追加、型変更できると思っていたら違った。
一定の手続きが必要であり、それは[ここ](http://sessan.hatenablog.com/entry/2012/12/11/112513)を参考にさせていただいた。

アプリリリースとかする前なら、もっとお手軽に修正する策はあるはず！と密かに思っているが、今の時点では調査できていない。

### CoreDateで`group by`する時の基本方針
選択列、集計キーや計算方法を定義して、NSFetchRequestObjectのプロパティとして設定する。SQLと比べるとはるかに多いコード量(と思うのは僕だけ？)


下記はとても参考になったサイト
http://mattconnolly.wordpress.com/2012/06/21/ios-core-data-group-by-and-count-results/

### label.textに数値を入れるときには、`NSNumber stringValue`を使う
これは見出しの通りで、そうしないとエラーになる。
VimでいつでもMakeしたい

[Vim Advent Calendar 2013](http://atnd.org/events/45072) の 85 日目の記事になります。
84 日目は @cocopon さんによる、「[vimrc読書会で読まれてきました！細マッチョなvimrcへの道](http://cocopon.me/blog/?p=4719)」でした。

#VimでいつでもMakeしたい

##基本的なmake
Vimで`:make`すると、quickfix が使えてとても便利ですよね。

```vim:vimで使えるmake
:make
:make -j8
:make clean
:make all
:make install
```

基本的にmakeでできることはそのままできるように思えます。
root 権限の必要な`make install`は

```vim:root権限でinstall
:! sudo make install
```

上記のようにすればよいと思います( `:! hoge` でshell上で実行)。

あとはカレントディレクトリにmakefileがない場合ですが
実はvim上で `:cd` `:pwd` なども使えますので

```vim:makefileのある場所まで移動してmake
:cd /home/user/MIKEFILE_DIR
:make
```
上記のように`:cd`でvim内でのカレントディレクトリを移動するか、
もしくは

```vim:makeの-Cオプションを使用する
:make -C /home/user/MIKEFILE_DIR
```
makeの-Cオプションでmakefileがある場所を指定すれば良いです

##いちいちvimを立ち上げて、:makeするのめんどくさい

まだvimを立ち上げていない状態で、makeを行いたい場合ですが
shell上で`vim`を起動して、`:make`と打つのはなんとなく冗長な気がします。

vimは起動時の`-c`オプションで、起動してすぐに実行するコマンドを指定することができます。
ですので、今回のケースだと以下のようになりますね。

```bash:/bin/sh
vim -c :make
```

毎回打つのもまた面倒ですので、`.bashrc` などに

```bash:.bashrc
alias vmake="vim -c :make"
```

などと alias を登録しておくのもありなんじゃないかなと思います。

##まとめ

vimshell を使うともっと便利にmakeできるのでしょうか？
なにかよい方法があればご教授願えるとありがたいです。
mozcの設定ダイアログを表示する方法

# 背景

IBusの設定ダイアログ上のmozcの設定ボタンが押せなかったので、ちょっと調べてみた。

動作確認した環境情報

```
$ uname -a
Linux crunchbang 3.2.0-4-686-pae #1 SMP Debian 3.2.41-2 i686 GNU/Linux
$ apt-cache show ibus-mozc
Package: ibus-mozc
Source: mozc
Version: 1.5.1090.102-4+deb7u1
(...snip...)
```

# 問題

mozcの設定ボタンが無効になっていて、設定ダイアログを表示できない。

![範囲を選択_001.png](https://qiita-image-store.s3.amazonaws.com/0/30246/03dbf8c5-a109-a9a1-b777-84d54bce4e0c.png)

# 解法

設定ファイルに１行追加してibus(あってるかな？)を再起動する。

```/usr/share/ibus/component/mozc.xml
    <layout>jp</layout>
    <name>mozc-jp</name>
    <longname>Mozc</longname>
+   <setup>/usr/lib/mozc/mozc_tool --mode=config_dialog</setup>
  </engine>
  </engines>
  </component>
```

# 詳細
参照先リンクを読むにバグらしい。自分の使っているバージョン的には修正されていてもよさそうだけど、なぜかまだ残っている。

次のコマンドをターミナルから直接実行しても表示できるが、そういう使われかたは意図していないみたい。

```
$ /usr/lib/mozc/mozc_tool --mode=config_dialog
```

# 参考リンク

http://code.google.com/p/mozc/issues/detail?id=169
mecabと文字コード

mecabと文字コードについてのメモ。

## 辞書
辞書はconfigureするときに文字コードをどうするか決める。これで辞書の文字コードが決まる。

## mecab本体
mecab本体にもconfig-charsetがあるけど外部からmecabを利用したりするときに影響が大きいのは辞書の文字コード。僕はあんまり問題にならなかった。

### どの辞書を読み込むか
辞書の指定は```-d```オプションを使ってできる。一方、インストールしたディレクトリの```etc```ディレクトリに```mecabrc```というファイルがある。ここにはmecabの設定が書かれている。

homeディレクトリ以下にもmecabをビルドしてしまったりしている場合は、どっちのmecabを使っているのかはっきりすることが重要。
デバッグコンソールからgdbやllvmのコマンドを実行してみる

Xcodeはデバッグコンソールから、gdbやllvmのコマンドを実行することができます。

## 試しにViewの階層を追ってみる
ViewクラスのrecursiveDescriptionを使えば、Viewの階層がデバッグコンソールに出力されます。

↓のようなコードでブレークポイントをNSLog()の行に置いてみます。

```SampleViewController.m
- (void)viewDidLoad
{
    [super viewDidLoad];
    UIView* mainView = self.view;
    UIView* v = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 50, 50)];
    v.backgroundColor = [UIColor redColor];
    [mainView addSubview:v];
    // 下の行にブレークポイントを置く
    NSLog(@"Sample String");
}
```

ブレークしてから po [viewのオブジェクト名 recursiveDescription]を実行すると、
↓のように階層関係が出力されます。

```

2014-02-23 13:49:45.518 ExperimentingWithViews[39353:70b] Sample String
(lldb) po [mainView recursiveDescription]
<UIView: 0x8b37900; frame = (0 0; 320 568); autoresize = RM+BM; layer = <CALayer: 0x8b37150>>
   | <_UILayoutGuide: 0x8b37ae0; frame = (0 0; 0 0); hidden = YES; layer = <CALayer: 0x8b37b50>>
   | <_UILayoutGuide: 0x8b37e30; frame = (0 0; 0 0); hidden = YES; layer = <CALayer: 0x8b37ea0>>
   | <UIView: 0xc0255b0; frame = (100 100; 50 50); layer = <CALayer: 0xc025530>>
(lldb) po [v recursiveDescription]
<UIView: 0xc0255b0; frame = (100 100; 50 50); layer = <CALayer: 0xc025530>>
```

## 参考URL
[Programming iOS 7, 4th Edition](http://shop.oreilly.com/product/0636920031017.do)
[The iOS 5 Developer's Cookbook: Building Your First Project](http://www.informit.com/articles/article.aspx?p=1829415&seqNum=6)
[GDB TO LLDB COMMAND MAP](http://lldb.llvm.org/lldb-gdb.html)
iOS7.0でUITextViewのカーソルがキーボードの下に隠れる問題を解決する方法

iOS7.0ではXcode5でビルドするとUITextViewのカーソルがキーボードの下に隠れる場合があります。
この問題を解決する方法を発見しました。タイミング依存なのがなんですが、UITextViewのサブクラスを作る必要がないのが良いところです。
iOS7.1で何もしなくても解決されることを望みます。

```objc:ObjectiveC
@interface ViewController : UIViewController <UITextViewDelegate>
@end

@implementation ViewController
-(void) scrollToVisible:(UITextView *)textView
{
    if ([textView isFirstResponder] && textView.selectedTextRange.end) {
        CGRect caretRect = [textView caretRectForPosition:textView.selectedTextRange.end];
        [textView scrollRectToVisible:caretRect animated:YES];
    }
}

-(void) textViewDidBeginEditing:(UITextView *)textView
{
    [self performSelector:@selector(scrollToVisible:) withObject:textView afterDelay:0.3];
}

- (void) textViewDidChangeSelection:(UITextView *)textView
{
    [self performSelector:@selector(scrollToVisible:) withObject:textView afterDelay:0.1];
}

-(void) textViewDidChange:(UITextView *)textView
{
    [self performSelector:@selector(scrollToVisible:) withObject:textView afterDelay:0.2];
}
@end
```
vcshを使ってdotfilesを＄HOMEに置いたままgit管理する

# 概要

[vcsh](https://github.com/RichiH/vcsh "vcsh")を使ってdotfilesをgitで管理します。
.vim関連ファイル(NeoBundle利用)と.bash関連ファイルを管理する例を示します。
vcshを使う利点としては以下のようなものがあります。

- dotfiles用のディレクトリを作らずに$HOMEに置いたままdotfilesを管理できる
- $HOMEに置いたまま、複数のレポジトリを管理できる
 - 例えば、.vim用のレポジトリ、.screen系のレポジトリ、tmux用のレポジトリ、、、といった分け方をすることができるため、あるマシンではvimとscreenのdotfilesのみ使う、別のマシンではvimとtmuxのdotfilesのみ使うといったことが可能になります。

# 使い方
## インストール

```bash:vcshのインストール
git clone git://github.com/RichiH/vcsh.git
cd vcsh
sudo ln -s /path/to/clone_dir/vcsh /usr/local/bin/vcsh
```

## .vim用のレポジトリを作成

```bash:.vim用レポジトリを作成
# vcshのレポジトリ初期化
vcsh init vim

# vimのレポジトリに入る。
# これ以降のgitcommandはvimレポジトリに対して行われる。
vcsh enter vim

# リモートレポジトリ(github上で事前に作成する)を設定する
git remote add origin https://hogehoge@github.com/hogehoge/vim.git

# gitコマンドでファイルをadd、commit、pushする
git add .vimrc
git commit -m 'Initial Commit for vim settings'
git push -u origin master
```

.vimrcだけならここまででOKです。
今回はNeoBundleで管理しているプラグインもgitで管理するため、neobundleのレポジトリをsubtree addします。
subtreeコマンドは古いgitでは使えないのでご注意下さい。

```bash:neobundleをsubtreeaddする
git subtree add -P .vim/bundle/neobundle.vim --squash https://github.com/Shougo/neobundle.vim master
# 自分の場合、手動プラグインやプラグイン用の個別ファイル(snipetファイル等)を
# manualディレクトリに入れているため、それらもgit管理します
git add .vim/bundle/manual
git commit -m 'add neobundle and manual bundle'
git push -u origin master
```

こうすることで、不必要なプラグインファイルをgitレポジトリに上げなくて済みます。
別のマシンでこのvimのレポジトリを持ってきた場合、NeoBundleInstallで.vimrcに書かれた全てのプラグインがインストールできます。


## 別のマシンでpullする

git管理したファイル群を別のマシンで使う場合、以下のようにします。

```bash:別のマシンでpullする
vcsh init vim
vcsh enter vim
git remote add origin https://hogehoge@github.com/hogehoge/vim.git
git pull -u origin master
```

## .bash関連用レポジトリを作成

最初のマシンに戻って別のレポジトリを作ってみます。
とりあえず.bash関連のファイルを管理してみます。

```bash:.bash関連用レポジトリの作成
vcsh init bash
vcsh enter bash
git remote add origin https://hogehoge@github.com/hogehoge/bash.vim
git add .bash_profile .bashrc .bash_logout
git commit -m 'initial commit for bash envs'
git push -u origin master
```

pullするときも同様のため省略します。

## vcshサブコマンドでgitコマンドを実行する

`vcsh enter <レポジトリ名>`を使わずに`vcsh <レポジトリ名> サブコマンド`のようにvcshのサブコマンドでgitコマンドを実行することも可能です。

```bash:vcshサブコマンドの例
vcsh vim add .vimrc
vcsh vim commit -m "commit hogehoge"
vcsh vim push -u origin master
```

## 全レポジトリpush/pull

レポジトリは1つずつpush/pullする必要はなく、全レポジトリまとめてpush/pullできます。

```bash:全レポジトリのpush/pull
# push
vcsh push

# pull
vcsh pull
```

[vcshのページ](https://github.com/RichiH/vcsh "vcsh")にはmrと連携してvcsh管理以外のgit管理レポジトリもまとめてpush/pullする方法が書かれています。

# 追記(2014/10/16)

結局vcshは使わずdotfilesディレクトリ切って管理することにしましたｗ
1箇所で管理できた方が良いなぁって言うのとdotfilesの管理のための一個ツール入れるのが見合ってないかなぁと。。。
ごめんなさいｗ
文字列からあ行など取得する


##仕様
- 英語は全角でも半角でも半角に
- カタカナもひらがなに
- 記号などはブランク

##ソース

``` objectivec:objective-c
- (NSString *)getJapaneseLine:(NSString *)aString
{
    if (aString.length == 0) {
        return @"";
    }

    NSString *uppercaseString = [aString uppercaseString];
    NSMutableString *halfString = [uppercaseString mutableCopy];
    CFStringTransform((CFMutableStringRef)halfString, NULL, kCFStringTransformFullwidthHalfwidth, FALSE);
    NSMutableString *kanaString = [halfString mutableCopy];
    CFStringTransform((CFMutableStringRef)kanaString, NULL, kCFStringTransformHiraganaKatakana, TRUE);
    unichar uc = [kanaString characterAtIndex:0];
    
    if (uc >= 0x3041 && uc <= 0x304A) {
        return @"あ";
    } else if (uc >= 0x304B && uc <= 0x3054) {
        return @"か";
    } else if (uc >= 0x3055 && uc <= 0x305E) {
        return @"さ";
    } else if (uc >= 0x305F && uc <= 0x3069) {
        return @"た";
    } else if (uc >= 0x306A && uc <= 0x306E) {
        return @"な";
    } else if (uc >= 0x306F && uc <= 0x307D) {
        return @"は";
    } else if (uc >= 0x307E && uc <= 0x3082) {
        return @"ま";
    } else if (uc >= 0x3083 && uc <= 0x3088) {
        return @"や";
    } else if (uc >= 0x3089 && uc <= 0x308D) {
        return @"ら";
    } else if (uc >= 0x308F && uc <= 0x3093) {
        return @"わ";
    } else if (uc >= 0x0041 && uc <= 0x005A) {
        // A-Z
        return [NSString stringWithFormat:@"%C", uc];
    } else {
        // その他
        return @"";
    }
}
```

``` swift:swift
func getJapaneseLine(aString: String) -> String {
	if line.isEmpty {
		return "";
	}
	
	var keyString = String(aString[aString.startIndex]).uppercaseString
	var halfString = NSMutableString(string: keyString) as CFMutableString
	CFStringTransform(halfString, nil, kCFStringTransformFullwidthHalfwidth, false)
	var kanaString = NSMutableString(string: halfString) as CFMutableString
	CFStringTransform(kanaString, nil, kCFStringTransformHiraganaKatakana, true)
	keyString = kanaString as String
	let c = first(keyString.unicodeScalars)!.value

	if c >= 0x3041 && c <= 0x304A {
		return "あ"
	} else if c >= 0x304B && c <= 0x3054 {
		return "か"
	} else if c >= 0x3055 && c <= 0x305E {
		return "さ"
	} else if c >= 0x305F && c <= 0x3069 {
		return "た"
	} else if c >= 0x306A && c <= 0x306E {
		return "な"
	} else if c >= 0x306F && c <= 0x307D {
		return "は"
	} else if c >= 0x307E && c <= 0x3082 {
		return "ま"
	} else if c >= 0x3083 && c <= 0x3088 {
		return "や"
	} else if c >= 0x3089 && c <= 0x308D {
		return "ら"
	} else if c >= 0x308F && c <= 0x3093 {
		return "わ"
	} else if c >= 0x0041 && c <= 0x005A {
		// A-Z
		return String(format: "%C", c)
	} else {
		// その他
		return "";
	}
}
```
WWWサーバごとのルーティングスクリプトまとめ＠PhalconPHP編

#この投稿は？
Phalcon PHPの開発環境を整える際のルーティングスクリプトまとめです。
よくあるMVCフレームワークならほぼそのまま流用できるんじゃないかな。

今はApache, PHP Built-in webserver, IISのみ。
追記していくかもしれないし、しないかもしれません。


#wwwサーバごとのルーティングスクリプト一覧
|| Apache | PHP Built-in webserver | IIS |
|:-----------|:----------:|:-----------:|:------------:|
|routing| .htaccess | .router.php | web.config |
|project直下|○|○|○|
|public直下|○|-|○|

#Apache
## 構成
```ini
[projectディレクトリ]
public/.htaccess : (1)
.htaccess : (2)
```

## 中身
(1)

```apache
AddDefaultCharset UTF-8

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L]
</IfModule>
```

(2)

```apache
<IfModule mod_rewrite.c>
	RewriteEngine on
	RewriteRule  ^$ public/    [L]
	RewriteRule  (.*) public/$1 [L]
</IfModule>
```

## 適用方法
mod_rewriteが有効だったら何もしなくてOK

#PHP Built-in webserver
## 構成
```ini
[projectディレクトリ]
.router.php : (1)
```

## 中身
(1)

```php
<?php
if (!file_exists(__DIR__ . '/' . $_SERVER['REQUEST_URI'])) {
    $_GET['_url'] = $_SERVER['REQUEST_URI'];
}
return false;
```
参考：http://docs.phalconphp.com/en/latest/reference/built-in.html

## 適用方法

[projectディレクトリ]で

```
php -S localhost:80 -t public .router.php
```

としてbuilt-inサーバを起動
http://localhost/

にアクセスしてやればOK。

#IIS
## 構成
```ini
[projectディレクトリ]
public/web.config : (1)
web.config : (2)
```

## 中身
(1)

```xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Imported Rule 1" stopProcessing="true">
                    <match url="^(.*)$" ignoreCase="false" />
                    <conditions>
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="index.php?_url=/{R:1}" appendQueryString="true" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

```

(2)

```xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
  <rules>
    <rule name="Public Rule 1" stopProcessing="true">
      <match url="^$" ignoreCase="false" />
      <action type="Rewrite" url="public/" />
    </rule>
    <rule name="Public Rule 2" stopProcessing="true">
      <match url="(.*)" ignoreCase="false" />
      <action type="Rewrite" url="public/{R:1}" />
    </rule>
  </rules>
</rewrite>
    </system.webServer>
</configuration>

```

## 適用方法
IISマネージャーで物理パス(=DocumentRoot)として [projectディレクトリ]/public が設定されていれば、
特に何もしなくていいはず。＃間違っていたらごめんなさい
MeCabで文字コードの違う辞書を使う

MeCabで文字コードの違う辞書を使いたいときは辞書を再構築しなくてはいけない。rootがなかったりするサーバでは（でもMeCabは入ってる、みたいなとき）、自分で辞書を再構築して、それを使いたいという状況も出てくる。

そこで、自分で辞書を再構築し、その辞書を用いるという方法を紹介してみる。今回はutf8の辞書をつくる。

## その前に、文字コードの確認方法
```bash
$ mecab -P | grep config-charset
config-charset: EUC-JP
....
```

指定しないとEUC-JPらしい。

## 辞書を落として解凍する
```bash
$ wget https://mecab.googlecode.com/files/mecab-ipadic-2.7.0-20070801.tar.gz
$ tar zxvf mecab-ipadic-2.7.0-20070801.tar.gz
```

## 辞書の構築
ホームディレクトリ以下のlocalに置いてみます。

```bash
$ ./configure --prefix=$HOME/local --with-charset=utf8
$ make
$ make install
...

done!
echo To enable dictionary, rewrite /home/kenta.hara/local/etc/mecabrc as \"dicrc = HOME/local/lib/mecab/dic/ipadic\"
To enable dictionary, rewrite /home/kenta.hara/local/etc/mecabrc as "dicrc = HOME/local/lib/mecab/dic/ipadic"
```

最後にどこへインストールしたかが出るので参考にしたい人は覚えておくといい

## 使い方/辞書の指定方法
-dオプションで辞書のディレクトリを指定する。

```bash
$ echo "いい天気ですね" | mecab
いい   	̾��,����,*,*,*,*,*
天気   	̾��,����,*,*,*,*,*
ですね 	̾��,����,*,*,*,*,*
EOS

$ echo "いい天気ですね" | mecab -d $HOME/local/lib/mecab/dic/ipadic
いい	形容詞,自立,*,*,形容詞・イイ,基本形,いい,イイ,イイ
天気	名詞,一般,*,*,*,*,天気,テンキ,テンキ
です	助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
ね	助詞,終助詞,*,*,*,*,ね,ネ,ネ
EOS
```

文字化けしなくなった。
機械技術者及び非コンピュータ技術者のデータ処理手法（導入編1）

このページは大学生・もしくは新卒機械技術者を対象としています。

研究開発活動に従事している大学院生・機械技術者には初学的なので読む必要はありません。

さて、研究開発において実験データを取っていると非常に膨大な量（数万～数十万）程度の時系列データが
とれるかと思います。
この場合CSV・TSVなどのテキストファイルに残す形でのデータ処理はソフト側のメモリの問題が起こります。
この問題に対してバイナリファイル形式でシーケンシャルに読み出すことによってテクニカルに回避する方法も
ありますが、DB技術を用いてデータ処理を行おうというのがこの文書の目標です。

前提条件OS:Windows7 32bit or 64bit

まず、Pythonというスクリプト言語をインストールします。このページの読者はPythonは初心者だと思われます。
しかし、ながらC・Fortranといったコンパイラ言語より遥かに短く、簡潔に書けるスクリプト言語は結果的に学習コストや開発コストを低減します。
ではPythonのHPを下記に示します。

http://www.python.org/

現在の最新バージョンはPython２．７６です、ダウンロードページは下記です。
http://www.python.org/download/releases/2.7.6/

これのインストールパッケージをダウンロードしてインストールします。
お疲れ様です。導入編はここで終了です。
オレオレyumリファレンス（目的別）

{toc}

# インストール編

## パッケージを検索する

インストール可能なパッケージを探し出せるが、詳細な情報はわからないので、
`yum info {package_name}`と合わせ技で使うことが多い。

```
yum search {keywords}
```

## 指定したパッケージの詳細情報を確認する

パッケージ名は`yum search {keywords}`などで調べるとよい。

```
yum info {package_name}
```

## インストール済みパッケージのパッケージ名を調べる

インストール済みなのはわかっているけど、正確なパッケージ名を忘れたときによく使う。
どのリポジトリからインストールしたかわからなくなったときにも使える。

```
yum list installed | grep {keywords}
```

`{keywords}` にはパッケージ名と思しきキーワードを入れてる。

## 利用可能なリポジトリ一覧を取得する

/etc/yum.repos.d/***.repo 内に定義されているリポジトリを一覧表示する。
 
```
yum repolist all
```

## 指定したリポジトリからパッケージをインストールする

```
yum --enablerepo={repo_id} install {package_name}
```

## パッケージを直接ダウンロードしてインストールする


例: karnel-develを直接ダウンロードしてインストールする

```
yum install http://vault.centos.org/6.4/os/x86_64/Packages/kernel-devel-2.6.32-358.el6.x86_64.rpm
```


# 削除編

## パッケージの削除をテストする（dry run的な）

`--nodeps`とか`--noscripts`オプションを使って削除するときは事前に試しておくとよい。
また`-vv`オプション(verboseオプション)をつけると削除時のrpmコマンドの挙動が細かく追えるのでオススメ。

```
rpm -evv --test {package_name}
```

## 依存性を確認せずにパッケージを削除する

`yum remove`は削除時にそのパッケージが依存している他のパッケージも一緒に削除してくれるけど、
削除される依存パッケージが、全く別のパッケージからも依存されてるから消したくない！って時に使う。

ex) mysqlは削除したいけど、mysql-develは他からも依存されてるから一緒に消したくない

```
rpm -e --nodeps {package_name} 
```



## 指定したパッケージをとにかく削除する

アンインストール時の前後に実行するスクリプトを実行せずにパッケージを削除する。

`yum remove {package_name}`や`rpm -e {package_name}`が失敗するときに検討してみる。
あまり安全な方法ではないので、事前に`--test`などで安全性を検証した上で実行すべき。

```
rpm -evv --noscripts {package_name}
```

# 参考文献

* http://www.rpm.org/max-rpm/ch-rpm-erase.html
* http://www.rpm.org/max-rpm/s1-rpm-erase-additional-options.html
スコープを理解する


> スコープ継承は単純で、あなたはそれが起きていることを知る必要さえない。子スコープの内部から、親スコープで定義されたプリミティブな値の 2wayデータバインディングを試すまでは。
https://github.com/angular/angular.js/wiki/Understanding-Scopes


## プリミティブな値をng-modelにすると期待する動作しない場合がある

http://jsfiddle.net/akkunchoi/p46L9/


## プリミティブ値だけじゃなく、親に未定義の値は親に反映されない

http://jsfiddle.net/akkunchoi/8McfP/

## つまりスコープ継承はJavaScriptのプロトタイプ継承と同じ

子スコープに値がなければ親スコープを参照する。
プリミティブな値を保存すると子スコープに保存される。すると、親スコープの同名プロパティにはアクセスできなくなる。なぜなら子スコープにあるから。

子スコープでオブジェクトのプロパティだけを変更するなら、子スコープにはオブジェクトが未定義なので、強制的に親スコープを参照することができる。

この時注意しなければならないのは、子スコープに直接オブジェクトを代入してしまうこと。例えばこんな風に`$scope.obj = {}` 。子スコープで定義してしまうと、`$scope.obj`で取得できるのは子の方。親で定義したプロパティは取得できなくなる。ちなみに子の方で`delete`すれば消せるそうです。

## 解決策

- ng-modelには常に “.” を使用する。`ng-model=“user.name”`
- 関数でやりとりする


## 参考

- https://github.com/angular/angular.js/wiki/Understanding-Scopes
- http://plnkr.co/edit/zZfUQN?p=preview
PDO mySQL Driver Install

# Goal

```
* PHPを再インストールせずに、PDOのmySQLドライバを組み込む
* 拡張モジュールをソースからインストールする
```

# Preparation

```shell-session
##
## 実行環境情報
##

$> uname -a
Linux *** 2.6.32-431.5.1.el6.x86_64 #1 SMP Wed Feb 12 00:41:43 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$> cat /etc/issue
CentOS release 6.5 (Final)
Kernel \r on an \m
$> whoami
root

## mySQL installディレクトリ(64bit targz install)
$> ls /usr/local/mysql
## PHP installディレクトリ(source install)
$> ls /usr/local/php
## php.ini (/usr/local/php/bin/php -i | grep php.iniで確認可)
$> ls /usr/local/php/lib/php.ini

## 
## PHP version
## 
$> /usr/local/php/bin/php -v
  # PHP 5.3.28 (cli) (built: Feb 22 2014 20:40:54)
  # Copyright (c) 1997-2013 The PHP Group
  # Zend Engine v2.3.0, Copyright (c) 1998-2013 Zend Technologies

```

# Manual

```
Milestone
* pecl downloadコマンドでダウンロード
* mySQLをtarballからインストール、phpをソースからインストールしているので、そのパスを指定してビルドする
* php.iniにpdo_mysql.soを指定してapacheを再起動
* libmysqlclient.so.XXが見つからないエラーが出た場合は、共有ライブラリパスを登録して再実行
```

## Download

```shell-session
cd /usr/local/src
  # /usr/local/src以下で作業する

/usr/local/php/bin/pecl download pdo_mysql
tar zxvf PDO_MYSQL-1.0.2.tgz
cd PDO_MYSQL-1.0.2
```

## Build / Install

```shell-session
/usr/local/php/bin/phpize
./configure --with-pdo-mysql=/usr/local/mysql --with-php-config=/usr/local/php/bin/php-config
  # たぶんphpのパスが通ってないからか、php-configの場所を指定するよう警告が出るので、--with-php-configオプションをつける

make
make test
make install
  # Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/
```

## Include
```shell-session

vi /usr/local/php/lib/php.ini
  # Dynamic Extensionsブロックに以下のようにインストールしたpdo_mysql.soを追加
  # soのpathは、php -i | grep extension_dirを確認すると、
  # /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626以下を見てくれることを確認できる
  # 別のパスを指定したい場合はextension=のうしろをフルパスで指定することもできるっぽい

;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
extension=pdo_mysql.so

```

## Reload

```shell-session
## 
## gracefulで反映(gracefulでも反映された)
## 
/usr/local/apache/bin/apachectrl graceful

## 
## 反映を確認
## 
/usr/local/php/bin/php -i | grep pdo_mysql

```

## ldconfig (以下のようなエラーでpdo_mysql読み込みが失敗する場合のみ実施)

```
エラー
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/pdo_mysql.so' - libmysqlclient.so.18: cannot open shared object file: No such file or directory in Unknown on line 0
```

```shell-session
ldconfig -p | grep mysql
  # libmysqlclient.so.18のパスが通ってないことを確認
  #	libmysqlclient_r.so.16 (libc6,x86-64) => /usr/lib64/mysql/libmysqlclient_r.so.16
  #	libmysqlclient.so.16 (libc6,x86-64) => /usr/lib64/mysql/libmysqlclient.so.16

ls /etc/ld.so.conf.d/mysql-x86_64.conf
vi /etc/ld.so.conf.d/mysql-x86_64.conf
  # /usr/local/mysql/lib

ldconfig
  # キャッシュをクリアして更新

ldconfig -p | grep mysql
  # libmysqlclient.so.18のパスが通ったことを確認
  #	libtcmalloc_minimal.so.0 (libc6,x86-64) => /usr/local/mysql/lib/libtcmalloc_minimal.so.0
  #	libmysqlclient.so.18 (libc6,x86-64) => /usr/local/mysql/lib/libmysqlclient.so.18
  #	libmysqlclient.so (libc6,x86-64) => /usr/local/mysql/lib/libmysqlclient.so

```
DualShock4 PC接続時のボタン割り当て

> 本記事の内容を[はてなブログ](https://nanmo.hateblo.jp/entry/2014/02/23/000000)に転記しました。
> すぐにQiitaの記事を削除する予定はありませんが、どちらか一方だけ残すとなったらはてなブログの方を残すと思います。
> ご承知おき下さい。

DualShock4 Windows PC接続時のボタン割り当て
====================================================

> PCボタン名:DS4のボタン名
> PCボタン名はWindows7のコントロールパネル->デバイスとプリンター->ゲームコントローラの設定->プロパティでの表示名

X軸:左スティック左右
Y軸:左スティック上下
Z軸:右スティック左右
X回転:L2(アナログ)
Y回転:R2(アナログ)
Z回転:右スティック上下
ボタン1:Square
ボタン2:Cross
ボタン3:Circle
ボタン4:Triangle
ボタン5:L1
ボタン6:R1
ボタン7:L2(デジタル)
ボタン8:R2(デジタル)
ボタン9:Share
ボタン10:Option
ボタン11:左スティック押し込み(L3)
ボタン12:右スティック押し込み(R3)
ボタン13:PSボタン
ボタン14:トラックパッドのクリック
ハットスイッチ(POV):十字キー


Unity(Windows上)での割り当て
====================================================
X axis:左スティック左右 (中心:0,左:マイナス1,右:プラス1)
Y axis:左スティック上下 (中心:0,上:マイナス1,下:プラス1)
3rd axis:右スティック左右 (中心:0,左:マイナス1,右:プラス1)
4th axis:L2(アナログ) (初期値:マイナス1,押し切るとプラス1)
5th axis:R2(アナログ) (初期値:マイナス1,押し切るとプラス1)
6th axis:右スティック上下 (中心:0,上:マイナス1,下:プラス1)
7th axis:十字キー左右 (中心:0,左:マイナス1,右:プラス1)
8th axis:十字キー上下 (中心:0,下:マイナス1,上:プラス1)
joystick button 0:Square
joystick button 1:Cross
joystick button 2:Circle
joystick button 3:Triangle
joystick button 4:L1
joystick button 5:R1
joystick button 6:L2(デジタル)
joystick button 7:R2(デジタル)
joystick button 8:Share
joystick button 9:Option
joystick button 10:左スティック押し込み(L3)
joystick button 11:右スティック押し込み(R3)
joystick button 12:PSボタン
joystick button 13:トラックパッドのクリック


Unity(Mac上)での割り当て
====================================================
X axis:左スティック左右 (中心:0,左:マイナス1,右:プラス1)
Y axis:左スティック上下 (中心:0,上:マイナス1,下:プラス1)
3rd axis:右スティック左右 (中心:0,左:マイナス1,右:プラス1)
4th axis:右スティック上下 (中心:0,上:マイナス1,下:プラス1)
5th axis:L2(アナログ) (初期値:マイナス1,押し切るとプラス1)※起動直後0の時がある
6th axis:R2(アナログ) (初期値:マイナス1,押し切るとプラス1)※起動直後0の時がある
7th axis:十字キー左右 (中心:0,左:マイナス1,右:プラス1)
8th axis:十字キー上下 (中心:0,上:マイナス1,下:プラス1)
joystick button 0:Square
joystick button 1:Cross
joystick button 2:Circle
joystick button 3:Triangle
joystick button 4:L1
joystick button 5:R1
joystick button 6:L2(デジタル)
joystick button 7:R2(デジタル)
joystick button 8:Share
joystick button 9:Option
joystick button 10:左スティック押し込み(L3)
joystick button 11:右スティック押し込み(R3)
joystick button 12:PSボタン
joystick button 13:トラックパッドのクリック


Unity(Linux上)での割り当て
====================================================
X axis:左スティック左右 (中心:0,左:マイナス1,右:プラス1)
Y axis:左スティック上下 (中心:0,上:マイナス1,下:プラス1)
3rd axis:右スティック左右 (中心:0,左:マイナス1,右:プラス1)
4th axis:L2(アナログ) (初期値:0,押し切るとプラス1)
5th axis:R2(アナログ) (初期値:0,押し切るとプラス1)
6th axis:右スティック上下 (中心:0,上:マイナス1,下:プラス1)
7th axis:十字キー左右 (中心:0,左:マイナス1,右:プラス1)
8th axis:十字キー上下 (中心:0,上:マイナス1,下:プラス1)
joystick button 0:Square
joystick button 1:Cross
joystick button 2:Circle
joystick button 3:Triangle
joystick button 4:L1
joystick button 5:R1
joystick button 6:L2(デジタル)
joystick button 7:R2(デジタル)
joystick button 8:Share
joystick button 9:Option
joystick button 10:左スティック押し込み(L3)
joystick button 11:右スティック押し込み(R3)
joystick button 12:PSボタン
joystick button 13:トラックパッドのクリック

Unityでの検証に使ったコードは https://bitbucket.org/nanmo/unity_gamepad_tester/
Bootstrap3のcssをless駆動でがしがしカスタムする、というお話

###目標
Bootstrap3(http://getbootstrap.com/) の自前カスタム環境をローカルに作る。作業の効率化のために自動でless->cssリビルド、すぐにプレビューしながらやりたい。

###前提
- Mac OSX Mavericks & Chrome
- Twitter Bootstrap v3.1.1
- ruby, python, node, git, jekyll 等(他にも？)はインストール済み(brew, anyenvが便利だよ！)


###手順
####1. Bootstrap をダウンロード
適当にディレクトリを作ってそこにgit cloneする。

```shell
$ mkdir twbs3
$ cd twbs3
$ git clone https://github.com/twbs/bootstrap.git
```

####2. JSライブラリのセットアップ
package.jsonから必要なライブラリをインストールする。

```shell
$ cd bootstrap
$ npm install
```

####3. gruntタスクの追加と変更
Gruntfile.jsを編集する。【慎重にね】
更新差分は以下。

```shell
$ diff -bu Gruntfile.org.js Gruntfile.js

--- Gruntfile.org.js	2014-02-23 00:31:01.000000000 +0900
+++ Gruntfile.js	2014-02-23 00:57:20.000000000 +0900
@@ -323,8 +323,12 @@
       },
       less: {
         files: 'less/*.less',
-        tasks: 'less'
-      }
+        // tasks: 'less' //removed
+        tasks: ['dist-css', 'dist-docs', 'exec:jekyllRebuild'] //added
+      },
+      options: { //added
+        livereload: true,
+      },
     },
 
     sed: {
@@ -355,6 +359,9 @@
       },
       npmShrinkWrap: {
         command: 'npm shrinkwrap --dev'
+      },
+      jekyllRebuild: { //added
+        command: 'jekyll build'
       }
     }
   });

```

####4. LiveReloadプラグインのインストール
ChromeにLiveReloadプラグインを入れる。
https://chrome.google.com/webstore/detail/livereload/jnihajbhpnppcggbcgedagnkighmdlei

***
*↓ 以下はカスタム作業をする時に行う*
####5. 作業環境を走らせる
grunt でwatchタスクを走らせ、

```shell
$ grunt watch
```

さらにターミナルで新タブ作って、
jekyllで http://0.0.0.0:9001/ にWEBサーバを立ち上げる。

```shell
$ jekyll serve
```

####6. Happy LESSing
あとは
http://0.0.0.0:9001/ を表示しながら
がしがしless/*.lessをいじりましょう。
lessが更新されると自動で http://0.0.0.0:9001/ 以下に反映され、さらにChromeのタブがリロードされます。あ、LiveReloadプラグインをonにしとくのを忘れずに。

![bodyの背景色をyellowにしたの図](https://qiita-image-store.s3.amazonaws.com/0/4335/02627b63-c95b-34f5-bff5-80030fb9c21a.png)


Thanks：
Bootstrap 3 RC1をGruntで効率的にカスタマイズ
http://qiita.com/suzukima/items/bde0a2686e5b2eb4cd1a
各ブラウザ用LiveReloadプラグイン
http://feedback.livereload.com/knowledgebase/articles/86242-how-do-i-install-and-use-the-browser-extensions-

大ざっぱに以上です。


####後日談
使ってみると色々とストレスフルなやり方なので、
*Bootswatch本家の開発環境をカスタムしてless駆動で効率的にBootstrapをカスタムする、というお話* 
http://qiita.com/smaeda/items/992a3ebbed47718131b1
に改良版の投稿をしました。そちらがお勧めです。


* * *
#告知
というか宣伝ですが、
###2chまとめ巡査長β
http://j.inthemaking.net/
というのを作ってみました。PCでも見れますがスマホ用です。
よろしければ暇つぶしに使って感想いただければ嬉しいです。
select/keventのパフォーマンスを比較してみた

FreeBSD系にはselectに代わるI/O多重化の手段としてkeventも用意されている。keventの方がselectよりパフォーマンスが良いという噂を耳にしたので、計測してみた。

![image(1).png](https://qiita-image-store.s3.amazonaws.com/0/37714/089ee7ab-fdee-112d-17b0-ead9d05012ee.png)

正直ここまで違うとは思ってなかった。監視対象のfdの数が高々10個の場合でも約２倍の性能差が出ている。
しかもてっきりfdの数に対して線形で時間が増えると予想していたが、selectの方はそれ以上のペースで時間がかかるようになっている。
selectにはウォッチできる数の制限もあるみたいだし、規模が大きくなるとポータビリティを犠牲にしてでもkeventに置き換えないといけないケースもありそうだ。

なお、計測はFreeBSDマシンが手元になかったので以下の環境で行っている。
OS: Mac OS X(10.7.5)
CPU: 2.7 GHz Intel Core i7
Memory: 4GB 1333 MHz DDR3

念のため計測時のコードもさらしておく。

```c
#include <stdio.h>
#include <unistd.h>
#include <sys/select.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <sys/event.h>
#include <sys/time.h>

#define COUNT 10000
#define PIPE_NUM 100

//#define USE_SELECT

static quad_t
gettimeofday_msec (void)
{
  struct timeval tv;
  gettimeofday (&tv, NULL);
  return tv.tv_sec * 1000 + tv.tv_usec / 1000;
}

int
main (void)
{
  int fildes[PIPE_NUM][2];
  int i,j;
  int dummy = 1234;
  quad_t t1,t2;
  fd_set deffds;
  int max_fd = 0;
  struct kevent kev;
  int kq;

#if defined(USE_SELECT)
  FD_ZERO (&deffds);
#else
  kq = kqueue ();
#endif

  for (i = 0; i < PIPE_NUM; i++)
    {
      pipe(fildes[i]);
#if defined(USE_SELECT)
      FD_SET (fildes[i][0], &deffds);
      max_fd = max_fd < fildes[i][0] ? fildes[i][0] : max_fd;
#else
      EV_SET (&kev, fildes[i][0], EVFILT_READ, EV_ADD, 0, 0, NULL);
      kevent (kq, &kev, 1, NULL, 0, NULL);
#endif
    }

  t1 = gettimeofday_msec ();

  for (i = 0; i < COUNT; i++)
    {
      for (j = 0; j < PIPE_NUM; j++)
	{
	  write (fildes[j][1], &dummy, sizeof(dummy));

#if defined(USE_SELECT)
	  fd_set fdset = deffds;
	  select (max_fd+1, &fdset, NULL, NULL, NULL);
#else
	  kevent(kq, NULL, 0, &kev, 1, NULL);
#endif

	  read (fildes[j][0], &dummy, sizeof(dummy));
	}
    }

  t2 = gettimeofday_msec ();

#if defined(USE_SELECT)
  printf ("Result(select): ");
#else
  printf ("Result(kevent): ");
#endif
  printf ("PIPE_NUM = %d, COUNT = %d -> %lld msec\n", PIPE_NUM, COUNT, t2 - t1);
  return 0;
}
```