OmniAICreator/Qiita-1.07M huggingface dataset:
同じファイルにサブシェルを介して読み書きした場合の動作

@bsdhack の[ファイルのオーバーライド](http://qiita.com/bsdhack/items/da0c85f86dd3a2d499e2)が元記事となります。

sort (1) の -o、sedやRuby/Perlの-i、つまり引数のファイルを処理した上で元のファイルと置き換えるような動作の場合の話です。以下の通りのコマンドです（コピペです）。

```bash
(rm ファイル; command > ファイル) < ファイル
```


疑問
====

@bsdhack の[ファイルのオーバーライド](http://qiita.com/bsdhack/items/da0c85f86dd3a2d499e2)を読んで、末尾の文が少し不思議だった。

> 対して rm (1) がある場合は外側のシェルが O_RDONLY で open (2) するファイルと内側のシェルが O_RDONLY|O_TRUNC で open (2) するファイルの inode が異なるので OS は別なファイルと見なすので O_TRUNC による truncate は影響を受けない。 

inodeが異なるのはいいけど、外側のinodeは削除したのに読み込み可能なのか。安全なのだろうか、というあたり。

答え
====

答えは[Wikipedia:inode](http://ja.wikipedia.org/wiki/Inode)に書いてある。つまり`ファイルがすべて閉じられるまでは実際に削除されない`のだそうだ。

フロー的には以下になると思う（想像です）

1. サブプロセスに対してファイルを入力リダイレクトするので（末尾、外側の`< ファイル`）とりあえずファイルを開く。
2. サブシェルを起動して、`rm ファイル`する。まだファイルが閉じられていない（サブプロセスが動作しており、サブプロセス内で明示的に閉じられていない。0<-とかしたら閉じる？）ので実際には削除されないというか、生存中のファイルハンドラからはとりあえず読める状態。
3. 内側の`command > ファイル`で新しいファイルを作成。ファイル名は同じだがinodeは異なるので問題ない。
4. 読み書きして処理終了（サブプロセス終了）すると、ファイルが閉じられて、外側のファイルは実際に削除される。

尚、この書き方の場合、サブプロセス内で処理中にエラーでコケたり、システムが終了したりすると、元ファイルが消えちゃうので、安全ではないらしい。バッチに書いたらアカン感じか。
とすると、sedとかRuby、Perlでも、恐らく同様に安全じゃないのだと思うけど、どうなんだろう。

例としては微妙だが、安全にベタにやるならこんな感じだろうか
一時ファイルの置き場所を$TMPじゃなくしてるけど、そのままでもたぶん問題無いと思う。普通は。
一時ファイルを残したくないならtrapで消すといいらしい（　@bsdhack   の[シェルスクリプトを書く時に気をつけている事など](http://qiita.com/bsdhack/items/47c9cbb5fd22fcc9597a)）

```bash
#tmpfile=$(mktemp)
tmpfile=$(mktemp -p /workdir)
if command ファイル > $tempfile; then
  mv -f $tempfile ファイル
fi

```

[Tsukubai](https://uec.usp-lab.com/JOURNAL/CGI/JOURNAL.CGI?POMPA=SAHOU_journal01)力が足らん気がする。
current_userからactive_decoratorで定義したメソッドを呼ぶ方法

※前の内容が色々と誤解を招きそうな感じだったので修正しました。

Viewで　current_user.name　などと書くことがあるかと思いますが、この書き方だとactive_decoratorで定義したメソッドを呼べません。何故かというとこれはactive_decoratorはrenderメソッドを呼んだタイミングでインスタンス変数にdecoratorで定義したメソッドを追加しているからで、直接Viewでcurrent_userを呼ぶとモデルのインスタンスをそのまま参照するだけになってしまい、当然decoratorで定義したメソッドはNoMethodErrorになってしまうからです。

対応としては主に以下の2パターンがあります。

### 1. 明示的にインスタンス変数に入れる

```rb:current_userとpundit_userを上書き
class HogeController < ApplicationController
  # インスタンス変数経由で参照する
  def show
    @user = current_user
  end
end
```
個人的にはこちらを推奨。これならrenderメソッドが呼ばれ、@userがdecorateされます。この書き方であればコントローラーを見ただけでログインユーザーのデータを参照しているアクションが一目瞭然というメリットもあります。

### 2. current_userをオーバーライドする

該当のメソッドをオーバーライドして直接decorateする方法。

```rb:current_userとpundit_userを上書き
class ApplicationController < ActionController::Base
  # devise の current_userを使うには
  def current_user
    ActiveDecorator::Decorator.instance.decorate(super) if super.present?
    super
  end
end
```

毎回明示的にインスタンス変数に入れるなんて面倒。そもそもログインが前提のサービスだし！って時はまあこっちでもいいと思います。
cocos2d-xの参照カウンタが、スレッドフリーでない疑惑

```Cpp:CCRef.cpp
void Ref::retain()
{
CCASSERT(_referenceCount > 0, "reference count should greater than 0");
++_referenceCount;
}
```

class Ref は、cocos2d-xのメモリ管理、retain、releaseをする基底クラスで
Node等 ほとんどのクラスは、ここから派生していますが
この参照カウンタでは、マルチスレッド環境にて不具合が発生するので
ミューテックス、あるいはロックフリーで、スレッドセーフにする必要があります

今回はパフォーマンス的に ロックフリーが妥当で、さほどパフォーマンスに影響でないと思いますので
下記のように アトミック操作を使い ロックフリーを実現したいと思います

```cpp:CCRef.cpp
++_referenceCount;
--_referenceCount;
を
__sync_add_and_fetch(&_referenceCount, 1);
__sync_add_and_fetch(&_referenceCount, -1);
```

こう変更すれば、だいたいスレッドフリーになるのではないでしょうか。

現在 PullRequest してますが　Jenkins設定がおかしくなってるのか
しばらくビルドが出来てないようで
PRトオレバイイナ・・・


ちなみに、上記 class Refは、Appleのcocosライブラリの模倣で
C++としては 許しがたいコード （標準のスマートポインタ shared_ptrあるのに使わない）
なので、はやくshared_ptr に修正して欲しいな・・・

もちろん shared_ptrは アトミック操作をし、スレッドフリーになってますし
release せずとも、スコープ外で自動的に参照カウンタをデクリメントするので
使い勝手も良いです

あと、Refだと STLコンテナに入れ辛いため（vector::remove 時に参照カウンタがデクリメントされず リークする）
cocos2d-xでは cocos2d::Vector を作って、pushBack、remove時に retain、release を呼んでますね・・・
全然標準じゃない！！

はやく cocoaライブラリ色を完全に除去し、C++として標準的なコードになってほしいですね。
JenkinsでXcodeビルドでCode Sign errorを解決したときの覚え書き

## 前置き

iOSアプリのビルドとAppStore審査向けバイナリ作成にJenkinsを使ってビルドしています。
前任者からの引き継ぎで、証明書ファイルの差し替えやら、provisionalファイルの差し替えなど
したときに、Code Sign errorのビルドエラーが連発してそれらを解消したときの覚え書き

### エラーその１

`[src] $ /usr/bin/security unlock-keychain -p ******** /Users/********/Library/Keychains/login.keychain
security: SecKeychainUnlock /Users/*********/Library/Keychains/login.keychain: The user name or passphrase you entered is not correct.
FATAL: Unable to unlock the keychain.`

macのログインパスワードを変更してらこのエラーがでていた。keychain Accessでlogin.chainを開くとエラーになっていたので、login.chainを工場出荷状態にもどして、もう一度ビルド用に証明書をインンストールすることで解決した。

工場出荷状態に戻すには
keychain access　-> preference -> generalタブ -> Reset My Default Keychain
でできる。現在のファイルは削除されずに、リネームされる

Jobの設定の「keychain password」も新しいパスワードに書き換えておく

### エラーその２

`Code Sign error: No matching codesigning identity found: No codesigning identities (i.e. certificate and private key pairs) matching “iPhone Distribution: ACCESS CO., LTD.” were found.
CodeSign error: code signing is required for product type 'Application' in SDK 'iOS 7.0'`

証明書の名前とCode Sign Identifierに設定した名前があってない場合におきるようだ。
Jobの設定の　Code Sign Identifierを編集して解決

### エラーその３

`/Users/Shared/Jenkins/Home/workspace/hoge/build/hoge.app: User interaction is not allowed.
Command /usr/bin/codesign failed with exit code 1`

コマンドラインからkeychain accessへアクセスすると、アクセス許可を求められて
許可がないので失敗、となっていたよう。

KeyChain accessを起動して、
コンソールから以下のようなコマンドでビルドすると、アクセスを許可するか
ポップアップでででるので、常に許可を選択して解決

`/usr/bin/xcodebuild -target XXXXX -sdk iphoneos -configuration Release clean build CONFIGURATION_BUILD_DIR=/Users/Shared/Jenkins/Home/workspace/job-name/build "CODE_SIGN_IDENTITY=Hogehoge"`
[Vagrant]２つのゲストOSを同時に立ち上げる（※別のVagrantfile）

# [Vagrant]２つのゲストOSを同時に立ち上げる（※別のVagrantfile）
別々のVagrantfileで管理しているゲストOSを同時に```vagrant up```しようとしたら、sshポート(hostにforwardする方)が重複して失敗した。
（デフォルトは```host: 2222```）

Vagrantはデフォルトだと、ホストの2222番にゲストの22番をフォワードするらしい。（1.4.3時点）
このホストのポート番号を2222番以外にする事で、２つのゲストOSを起動する事に成功した。

## 前提
* Mac
* Vagrant 1.4.3

## 現象
* フォルダ構成は以下。名前は気にしないでください。

```
/path/to/vagrant-elasticsearch
/path/to/vagrant-elasticsearch/Vagrantfile
/path/to/vagrant-fluent
/path/to/vagrant-fluent/Vagrantfile
```

* /path/to/vagrant-elasticsearchで```vagrant up```した状態で、/path/to/vagrant-fluentで```vagrant up```を実行した
* 以下のエラーが発生し、起動に失敗した。

```shell-session
Bringing machine 'default' up with 'virtualbox' provider...


Vagrant cannot forward the specified ports on this VM, since they
would collide with some other application that is already listening


on these ports. The forwarded port to 2222 is already in use
on the host machine.

To fix this, modify your current projects Vagrantfile to use another
port. Example, where '1234' would be replaced by a unique host port:

  config.vm.network :forwarded_port, guest: 22, host: 1234

Sometimes, Vagrant will attempt to auto-correct this for you. In this
case, Vagrant was unable to. This is usually because the guest machine
is in a state which doesn't allow modifying port forwarding.
```

* ポートの衝突を解消するために、一旦```vagrant halt```した後で、以下のように設定した。

```rb
...
config.vm.network :forwarded_port, guest: 22, host: 2223
...
```

* ```vagrant up```で以下の結果になった。

```shell-session
...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] -- 22 => 2223 (adapter 1)
[default] -- 8888 => 8888 (adapter 1)
...
```

* ちがう、そうじゃない。```[default] -- 22 => 2222 (adapter 1)```は要らない。

## 解決方法
Vagrantfileに以下のように設定する。
```id: "ssh"```を指定する事で、デフォルトの設定を上書きできるようです。
公式ドキュメントを見ても分かりませんでしたが。

* /path/to/vagrant-elasticsearch/Vagrantfile

```rb
...
config.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2223
...
```

* /path/to/vagrant-fluent/Vagrantfile

```rb
...
config.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2224
...
```

## 参考URL
* [mitchellh/vagrant](https://github.com/mitchellh/vagrant) => [give a chance to disable default ssh port forwarding #1922](https://github.com/mitchellh/vagrant/issues/1922)

以上
和田卓人さん講演

# はじめに
2014年4月24日、株式会社ACCESS幕張オフィスにて、和田卓人(t_wada)さんの講演をお聞きしました。
講演を聞いて自分が大事だと感じたこと・考えたこと、を自分なりの解釈でここに書きます。

# 学び続ける姿勢
プログラマにとって一番大事なことは、学び続ける姿勢、である。和田さんは、「プログラマが知るべき97のこと」から1つだけ取り上げ、このことに関連付ける形で講演を進めていきました。それほどに、学び続ける姿勢というものが大切なことだと感じました。
講演は、
>1. 読む
2. 書く
3. 話す
4. 渦を作る

の順に進み、それぞれについて、学び続ける姿勢に関連する事を多々学びました。
中でも自分が”これだ”と思った姿勢を2つ書きます。

### 1. 身の回りをプログラミング対象にする
好きこそ物の上手なれ。身の回りの、自分の興味のあることから始めることで自然に上達していき、容易に学び続けることができる、という考えです。これはまさに、今まで自分がやってきた事に近く、学び続けるにはとても大事な姿勢だと再確認しました。
また講演中に、手段を目的化しても良いと言葉が出て、学ぶ事自体を目的としても良いのではないかと思いました。

### 2. 毎年ひとつ新しく言語を学ぶ
この姿勢の意味は、新しい事に挑戦し、知識や技術を増やすこと、ですが、むしろ、
新しく言語を学び続けることで、常に最新の技術についていける、ということが重要だと思います。
千里の道も一歩から。まずは目の前の新たなことに挑戦していくことで、未来への道が開けるのではないかと思います。

# 黄金の回転
TDD(テスト駆動開発)についても学ぶことは大いにありました。中でも重要な考えがこの、黄金の回転、だと考えます。
黄金の回転は、
>1. 綺麗で動く
2. 汚くすぐには動かない
3. 汚いが動く
のサイクルで回り、まず綺麗であることが重要であり、TDDのなんたるかをあらわしていると思います。

# まとめ
今回の講演では、多くの学びがあり、また、多くのことを考えました。
今回の講演をただ聞いただけにせず、自分の糧にできるかは自分次第だと思います。
自分が感じた事、考えた事を大切にしてこの先生きのこっていきたいと思います。
16bit PC アーキテクチャ


はじめて読む8086 ノート

# 構成概要

論理構成としてはこんなかんじになる。

![16bit-bus.png](https://qiita-image-store.s3.amazonaws.com/0/14521/931ff145-5461-b5a6-0915-4e78b6b864e0.png "16bit-bus.png")


物理的にはアドレスバス・データバスは同一の信号線であり、非常に細かいインターバルで目的に応じた切り替えを行っている。

- アドレスバス
	- 2種類のアドレスデータが通るバス。
	- 1 MB のメモリ空間から任意の1バイトあるいは1ワードを選択するための20ビットアドレス
	- I/O ポートを選択するための16ビットアドレス（つまり最大 65536 ポート）
- データバス	
	- 2種類のデータを読み書きするためのバス。
	- メモリにリード or ライトするデータ
	- 入出力ポートにリード or ライトするデータ 


1アドレスが1バイトに対応する構成の場合は、利用可能なメモリが最大 1 MB（2^20 = 1,048,576 バイト）

# 負数の扱い

最上位ビットが立ってると負数ってやつ。

- バイト FF をインクリメントすると 01 00 でオーバフローするとみなせる
- オーバフローした箇所を無視すると FF をインクリメントした結果 00 になりましたと帰着
- FF は 00 より1小さい == 負数 -1 であると考えられる
- 同様に FE は -2, FD は -3 って考えていっても成り立つよね
- って逆算してったとき 00 〜 7F の 128 個と 80 〜 FF の128個にわけると都合が良い
- なぜなら後者は先頭ビット（MSB）が常にたってるから。
- じゃあ負数を取り扱うときはこの判断系で実装しましょう

# CPU の基本動作

ノイマン型であれば基本的な動作は3ステップで行われ、これがシーケンシャルに続く。

1. 命令の読み込み
	- アドレスバスにアドレス信号等を出力し、メモリに対してデータを出力するよう要求
	- メモリからバスにデータが出力されてくるので、データバスを通じて取り込み
2. 命令の解読
	- ビットのパターン（オペコード）に対して割り当てられている命令がある
		- 演算
		- 演算結果によるプログラム実行制御
		- 演算結果データの転送
		- 外部とのデータ入出力
		- その他
3. 命令の実行
	- アドレスバスにアドレス信号等を出力して準備するよう要求
	- メモリや I/O に信号出力（レジスタの内容）

解読や実行中にバスが空いていれば命令読み込みが実行される。
この実装をパイプラインと呼ぶ。
命令の実行にあたっては、クロックによって CPU とコンポーネント間で同期がとられる。
クロックは水晶発振器によって作り出される一定周期のパルスを指す。
仕組みは簡単で「電圧の高い状態」「電圧の低い状態」を交互に作り出している。

コンポーネントは「高い状態」の時に状態が変化して、「低い状態」の時に次の状態に移る準備をする。
8 MHz 動作の CPU であれば、この状態の変化（1サイクル）が 1/8,000,000 秒で回される。

命令によって必要なクロック数は違う。

# CPU とメモリ

16bit CPU ではアドレスバス 20 本に対してデータバス 16 本 が存在。
1つのアドレス指定で 16bit = 2byte をリード or ライトできる。
8bit だけのリード・ライトも可能。

この1つのアドレス指定でリードライトできる単位を「ワード」と定義する。
このため、CPU の種類によってワードは変化する。 

ちなみに 8bit CPU ではアドレスバスが8本しかないのでメモリ容量は最大 256 KB となる。
データバスも8本しかないので、単純に比較すれば 16bit は 8bit の2倍データをやりとり出来る分動作が高速。

# ROM と RAM

ROM も RAM も CPU から見ると同じアドレスバス・データバスでつながっているメモリでしかなく、プログラム実行上は区別がない。ただし ROM はライトが出来ない。
ちなみに ROM は Read Only Memory, RAM は Random Access Memory の略だが、ROM もランダムアクセス可能である（つまり慣習的に名前がこうなっている） 

実際の 8086 CPU を見ると、メモリ空間には ROM, RAM が混在している。 
一般的には ROM には BIOS が入っていて、処理系によっては BASIC インタープリタがはいっていたりする。

8086 CPU では電源 ON やリセット時に読まれ始めるメモリアドレスが FFFF0 以後なのでここに ROM を割り当てている。
また、割り込みベクタテーブルが 0 〜 3FF に割り当てられるが、これは読み書きできる RAM が割り当てられる。

一般的には高アドレス領域を ROM, 低い方を RAM とする処理系が多く、MS-DOS もこれを想定した作りになっている。

8086 のソフトウェアがリッチになってきてメモリが 1M という上限にひっかかるようになってくると、メモリバンク切り替えというテクニックが編み出された。
これは、ベクタテーブルと ROM 以外のアドレス空間をバンク空間と位置づけて、 プログラマブルなスイッチによってデータバスの接続先を切り替えるようにして限界をこえるというもの。
プログラマブルスイッチ用に、ノンバンク空間に少し領域をとっておく。

こうすることで論理的に扱える空間を増やすという工夫をしていた。CPU から見えていないバンクを「裏バンク」とか呼ぶこともあったらしい。 

# I/O

8086 では I/O アドレスバスは 16bit なので最大 65,536 ポートを利用できる。
利用するバスはアドレスバス20本のうち、下位16本。

メモリアドレスなのか I/O アドレスなのかを区別する信号がアドレスと共に出力されるので、それをもとにハードウェア的に信号の宛先をスイッチしている。
CPU によっては、このような方式では無く、あるアドレス範囲を I/O ポートに固定割り付けして区別している場合もある。68k 系列の場合はこの方法を採用している。
配列の宣言・確保・代入の方法４つ


・宣言と確保の部屋は統一する

・javaだとインデントは必ず0から始まる

        //宣言、確保、代入
        int[] ten; //宣言
        ten = new int[3]; //確保
        ten[0] = 65;
        ten[1] = 90;
        ten[2] = 75;
        //宣言と確保をして、代入
        int[] ten = new int[3];
        ten[0] = 63;
        ten[1] = 90;
        ten[2] = 75;
        //配列の初期化
        //java{}と宣言は同時にしないといけない
        int[] ten = {63, 90,75};
        //宣言をして、まとめて代入
        int[] ten;
        ten = new int[]{63,90,75};
Git submodule利用時、clone対象フォルダの設定を共有する

## 結論
sparse-checkoutの設定を外部ファイルに記載し、そこに記載した設定を`git sparse`というコマンド一発で適用できるようにしました。submoduleに対しても適用可能です。

0 インストール方法
[こちらのリポジトリ](https://github.com/icoxfog417/git-sparse)にある`git-sparse`を、下記フォルダに格納(gitのコマンド拡張を利用。詳細は[こちら](http://qiita.com/icoxfog417/items/1d3ccec32d32bdaadc92))。

* Linux/Mac `~/local/bin/`
* Windows `%UserProfile%\bin`

1 設定ファイル(.gitsparse)を準備

```.gitsparse
submoduleA:need/this/style.css
submoduleA:need/this/script.js
submoduleB:need/this/codes
```

サブモジュールと対象のパスは`:`区切りで指定する。

2 コマンド実行
`git sparse`

`.gitsparse`のファイルでclone対象フォルダが管理でき、その設定は`git-sparse`のコマンド一発で反映できる。

詳細は[こちらをご参照ください](https://github.com/icoxfog417/git-sparse)。

## 背景
Gitで外部のリポジトリを参照する際はsubmoduleを使用します(主に)。
ただ、通常リポジトリにはテストコードなどが含まれており、リポジトリ全体をまんま参照するのはちょっと、ということは往々にしてあります。

こうしたケースに対応するため、Gitでは`sparsecheckout`という機能を利用し対象フォルダを絞ることができます([詳細](http://qiita.com/icoxfog417/items/89e55947e9e8f2c16077))。
ただ、こいつはコマンドを打つのが結構めんどくさく、しかもその苦労は`.git`内の設定となるため共有することができません(git管理下にないため)。

対象フォルダの設定を共有しつつ、面倒なコマンドを一発でOKにする・・・そんな願いを実現するのが`git sparse`なのです。
MS-DOS 基本コマンド


はじめて読む8086 ノート

# 実行型ファイルをダンプする
## DUMP

MS-DOS では `TYPE` でファイル内容を表示できる（*nix の `cat` と同じ）
`TYPE` はインボックスコマンド

![dump.png](https://qiita-image-store.s3.amazonaws.com/0/14521/60e2a712-0b5c-84c1-fddf-a0d024959ce9.png "dump.png")


バイナリを表示するには `DUMP`（NEC のいわゆる PC98 系 DOS では標準添付らしい） 
`DUMP` で出力された内容を **ダンプリスト** と呼ぶ
 
ダンプリスト左端はアドレス（ファイル先頭からの位置）
ダンプリスト中央にある16進数（バイト）が列挙されてる部分がマシン語プログラム（バイトコード）を表している。

その実体は、「実行プログラム」と「プログラム内で用いるデータ」に分かれているが、ダンプリストですぐに見分けがつくわけではない。
ダンプリスト右端は、バイトコードをキャラクタコードで表現したときの内容。

ただしバイトで表現可能な数値はキャラクタコードの範疇を超えることがあるため、そのような場合はピリオドで表現される。 
また、キャラクタコードで 'P' という文字が引き当てられたとしても、それが「実行プログラムの一部」なのか「プログラム内で用いるデータの一部」なのかは場合による。

## CDUMP

`CDUMP` は `DUMP` のキャラクタコードのみバージョンで Shift-JIS も表示できる。
手元の環境ではマルチバイトが文字化けしてしまうのでいまいち確認できず。

# 実行型ファイルのメッセージを変更する

## DEBUG

`DUMP` のようなダンプリスト表示の他、マシン語プログラムを入力・変更・実行できる。
メモリの内容を操作するためのエディタ。
全ての外部コマンドはメモリ上に読み込まれてから実行される。 
起動方法は以下

```
> DEBUG [FILE_NAME]
```

`DEBUG` コマンドが起動すると専用のインタラクティブシェルに移る。
case sensitive ではない。


| コマンド | 機能 |
|---|---|
| D	| メモリの内容を表示する（ダンプ）|
| E	| メモリの内容を変更する |
| W	| メモリの内容をファイルに書き込む |
| Q	| 終了 |

###  D（ダンプ）

```
// XXXX アドレスから YYYY アドレスまでをダンプする
> D XXXX YYYY
 
// XXXX アドレスから 128 アドレス分ダンプする
> D XXXX          
 
// 最後に実行した D コマンドのアドレスから 128 アドレス分をダンプ（初回時は 0100 アドレスからスタート）
> D
```

![debug-dump.png](https://qiita-image-store.s3.amazonaws.com/0/14521/7c3d17f3-0c24-ec65-84e1-1c4d2e47b0de.png "debug-dump.png")


左端アドレス部の表示は「（セグメントアドレス）：（オフセットアドレス）」というフォーマットになっている。
オフセットアドレスは単に「アドレス」と呼ぶこともある。

### E（メモリ内容変更）

基本の使い方はコレ

```
> E XXXX
```

1. アドレス XXXX からメモリ内容を変更するモードに入る
2. XXXX のバイトコードが表示されるので変更内容を入力
3. 「スペース」を押すと次のアドレスが表示されるので同じく入力

... というカンジでえんえんと入力できる。
おわったらエンター
ただしバイトごとにいちいちインタラクティブにやる必要が無いならまとめていける

```
// アドレス XXXX からの内容を ** ... に変える
> E XXXX   **,**,**,** （エンター）
 
// アドレス XXXX からの内容をキャラクタコード aiueo に対応するバイトコードに変える
> E XXXX 'aiueo' （エンター）
```

### W（メモリ内容のファイル書き出し）

引数も無く、これだけで現在のメモリ内容が上書き保存される。結構あぶないなこれ。
MS-DOS 6.22 に DUMP コマンドを追加


MS-DOS は VMware fusion 上に構築

1. Windows を立ち上げて vmdk をマウント
2. [DUMP コマンド](http://www.vector.co.jp/soft/dos/util/se012414.html) をダウンロード
3. アーカイブ内の DUMP.CMD を vmdk 内にコピー
Git オリジナルのコマンドを作成する

`git mycommand`という感じでコマンドを作成したいな、というときの方法です。
[git flow](https://github.com/nvie/gitflow/wiki/Installation)などで使用されている方法なので、俺の便利コマンドを公開したいぜ、という方も是非ご参考ください。

基本としては、パスが通ったフォルダに`git-mycommand`というファイルを保存しておくと、下記のように使えるようになります。

保存するファイル

```shell:git-mycommand
#!/bin/sh
echo my command!
```

保存先

* Mac/Unixの方  
 `~/local/bin/`に保存し、`chmod +x` で実行権限を付与
* Windowsの方  
 `C:\Users\xxx\bin`というフォルダを作成し、その中に配置(xxxはログインユーザー名。`%UserProfile%/bin`ともいえる)。

git flowはGitのインストールディレクトリにまんま展開するが、User配下のbinでちゃんと読み込んでくれるので、この方がきちんと分けられてすっきりする。

git configの設定を外部ファイルから読み込むスクリプトなどは結構使い出があると思う(直下にconfigファイルがあれば.git内に移動するといった簡単なスクリプトで実現可能)。

＜参考＞

* [gitコマンドの拡張](http://d.hatena.ne.jp/hokaccha/20110808/1312780876)

* [Extend Git with Custom Commands](https://coderwall.com/p/bt93ia)
`git rebase -i HEAD~5` を `git squash 5`などと書けるようにしてくれるスクリプトのサンプル

* [msysGitへのクリーンなgit-flowインストール手順](http://takanosho.wordpress.com/2012/06/25/clean-install-git-flow-to-msysgit/)
MongoDBのPHPドライバのライブラリロードエラー

MongoDBにphpでつなごうとすると、以下のエラーが出ることがある

```
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/mongo.so' - /usr/lib64/php/modules/mongo.so: undefined symbol: php_json_encode in Unknown on line 0
PHP Fatal error:  Class 'MongoClient' not found in /root/test.php on line 4
```

これはMongoDBのPHPドライバ(mongo.so)が、jsonのPHPライブラリ(json.so)よりも先にロードされてしまう事が原因。

私の場合は、`/etc/php.ini`にてmongo.soをロードし、`/etc/php.d/json.ini`でjson.soをロードする設定であり、`/etc/php.ini`が`/etc/php.d/*`よりも先に読み込まれるため、このエラーが出ていた。

この場合は`/etc/php.ini`内でmongo.soをロードするのでは無く、`/etc/php.d/mongo.ini`などの`/etc/php.d/json.ini`よりも後に読まれる設定ファイルを作って、その中でmongo.soをロードしてあげればよい。


`/etc/php.d/mongo.ini`の設定例は以下の通り。

```
extension=/usr/lib64/php/modules/mongo.so
```
tagbodyの中のマクロが展開されてシンボルになっても、タグにはならない。


```cl
(macrolet ((my () :tag))
  (let ((x '(1 2 3)))
    (tagbody
       (my)
       (when x
         (print (pop x))
         (go :tag)))))
; --> 
; in: MACROLET ((MY NIL :TAG))
;     (GO :TAG)
; 
; caught ERROR:
;   attempt to GO to nonexistent tag: :TAG
; 
; compilation unit finished
;   caught 1 ERROR condition
```
HTMLによるAdobe AIR開発お試しメモ(Mac)


HTML+jQueryにてAirアプリ作成検証。


##1.準備するもの
```
AIR SDK ( http://www.adobe.com/devnet/air/air-sdk-download.html )
jQuery ( http://jquery.com/ )

cp  AIRSDK_Compiler.tbz2  /
cd /
tar zxfv AIRSDK_Compiler.tbz2
```

##2.環境構築
```1)作業フォルダ作成
mkdir /test-app
```

```2)ファイル作成
cd /test-app
touch Main.html
touch app.xml
touch load.html
```

```3)ファイルをコピー
cp /AIRSDK_Compiler/frameworks/libs/air/AIRAliases.js /test-app
cp /Users/y-fujisaki/Downloads/jquery-1.10.1.js 
```


##3.コード作成

```1.app.xmlへの記述
<application xmlns="http://ns.adobe.com/air/application/3.9"> 
 <id>air.jp.test.html.FullScreen</id>
 <versionNumber>1.0.0</versionNumber>
 <filename>FullScreenTest</filename>
 <initialWindow>
 <content>Main.html</content>
 <visible>true</visible>
<fullScreen>true</fullScreen> 
 </initialWindow>
</application>
```

```1'.app.xmlへの記述の説明
//このアプリに必要な AIR ランタイムのバージョンを指定
<application xmlns="http://ns.adobe.com/air/application/3.9">  

//アプリケーションを識別するためのアプリケーションID 一意の文字列にする <id>air.jp.test.html.FullScreen</id>

//アプリのバージョン。インストーラーからは意味は持たない
 <versionNumber>1.0.0</versionNumber>
//アプリケーションインストール後の名前
 <filename>FullScreenTest</filename>
//表示される最初のWindowsの設定
 <initialWindow>
//アプリケーションのメインコンテンツファイルの URL
 <content>Main.html</content>
//アプリケーションの初期ウィンドウの作成後すぐに表示可能にするかど
 <visible>true</visible>
//fullスクリーン
<fullScreen>true</fullScreen> 
//縦横幅指定
 <width>600</width>
 <height>600</height>
 </initialWindow>

</application>
```

```2.Main.htmlへの記述
ボタンを押すたびに外部ファイルを読み込む

<!DOCTYPE html>
<html> 
<head> 
<title>Fullscreen Mode</title> 
<script language="JavaScript" type="text/javascript"> 
function setDisplayState() { 
    window.nativeWindow.stage.displayState = 
        runtime.flash.display.StageDisplayState.FULL_SCREEN_INTERACTIVE; 
} 
</script> 
<script src="AIRAliases.js" />
<script src="jquery-1.10.1.js"></script>
<script type="text/javascript">
$(function() {
	$('#button01').click(function() {
		$.ajax({
			   type: 'GET',
			   url: 'load.html',
			   dataType: 'html',
			   success: function(data) {
				   $('#sample01').append(data);
			   },
			   error:function() {
				   alert('問題がありました。');
			   }
		});
	});
});
</script>
</head>
<body onload="setDisplayState();"> 
<h2>jQueryで別ページにある要素を読込</h2>
<ul id="sample01"></ul>
<p><a href="#" id="button01">ボタン</a></p>
</body>
</html>
```

```3.load.htmlへの記述
<li>読み込みテスト</li>
```

##4.デバッグ
```
/AIRSDK_Compiler/bin/adl /test-app/app.xml 

#アプリが起動する
```

##5.パッケージ化
```1.証明書作成
adt -certificate -cn SelfSign 1024-RSA /test-app/test.p12 password

#例の場合、パスワードは「password」のところ

```

```2.パッケージ化
cd /test-app
adt -package -storetype pkcs12 -keystore test.p12 FullScreen.air app.xml .

#フォルダ内にFullScreen.airが作成される
```


【参考】
http://melancholy.raindrop.jp/wordpress/?p=137
http://www.webopixel.net/javascript/308.html
http://melancholy.raindrop.jp/wordpress/?p=137
http://help.adobe.com/ja_JP/AIR/1.1/devappshtml/WS5b3ccc516d4fbf351e63e3d118666ade46-7e06.html
http://help.adobe.com/ja_JP/air/build/WSfffb011ac560372f2fea1812938a6e463-8000.html#WSfffb011ac560372f2fea1812938a6e463-7ff6
docker-pyを使ってみる

！バージョンによって挙動が全然違うので注意してください！

通常 docker は daemon として待ち受けていて、unix domain socket を listen している。実はこの socket に流れるプロトコルは REST/HTTP で、`-H` option で tcp に bind させることもできて、webサーバになる。仕様は ["Docker Remote API"] (http://docs.docker.io/reference/api/docker_remote_api/) に書いてある。そして各種 [language client](http://docs.docker.io/reference/api/remote_api_client_libraries/) も存在する。

そんな python client である [docker-py](https://github.com/dotcloud/docker-py) のお話。

まずは通常の使い方。

```python
import docker

dc = docker.Client()
# docker ps
dc.containers()
# docker images
dc.images()
# docker run -ti ubuntu bash
c = dc.create_container("ubuntu", stdin_open=True, tty=True)
dc.start(c["Id"])
print "docker attach %s" % c["Id"]
```

ところが。

「あ…ありのまま 今 起こった事を話すぜ」とばかりに、激しい落とし穴があったりするので注意。

`/container/create` の ExposedPorts の組立の部分。listなのかtupleなのか。listが正しいかと思いきや、tupleを要求されるところもある。しかも正しい組み合わせでなければ正しい値にならない。その上、普通に使ってるとエラーも出ないという罠。

```py
import traceback
import docker

dc = docker.Client()

tests = (
	[22,], # OK
	(22,), # NG
	["22/tcp",], # NG
	[(22, "tcp"),], # OK
	[[22, "tcp"],] # NG
	)

for ports in tests:
	c = dc.create_container("ubuntu", stdin_open=True, tty=True, command="bash", ports=ports)
	dc.start(c["Id"])
	info = dc.inspect_container(c["Id"])
	print ports, info["Config"]["ExposedPorts"]
	try:
		assert {'22/tcp': {}} == info["Config"]["ExposedPorts"]
	except:
		traceback.print_exc()
	finally:
		dc.stop(c["Id"])
```

次は `/containers/(id)/start` の PortBindings。うん…なんだろう。この一貫性の無さは。

```py
import traceback
import docker

dc = docker.Client()

tests = (
	# automatic allocation
	{22:None}, # OK
	{"22/tcp": None}, # OK
	# manual allocation
	{22:10080}, # OK
	{"22/tcp": 10080}, # OK
	{22: ":10080"}, # NG
	{22: dict(HostPort=10080, HostIp="0.0.0.0")}, # NG
	{22: ["0.0.0.0", 10080]}, # NG
	{22: ("0.0.0.0", 10080)} # OK
	)

for port_bindings in tests:
	c = dc.create_container("ubuntu", stdin_open=True, tty=True, command="bash", ports=[22,])
	dc.start(c["Id"], port_bindings=port_bindings)
	info = dc.inspect_container(c["Id"])
	print port_bindings, info["HostConfig"]["PortBindings"]
	try:
		assert '22/tcp' in info["HostConfig"]["PortBindings"]
	except:
		traceback.print_exc()
	finally:
		dc.stop(c["Id"])
```
書いてみた　ターミナルでツイッタを見る(php)

#ターミナルでツイッターのツイートを見るを書いてみた。

https://github.com/MasatoYoshioka/tw

```php

<?php

require __DIR__ . '/../vendor/autoload.php';
define('CONSUMER_KEY','your consumer_key');
define('CONSUMER_SECRET','your consumer_secret');
define('ACCESS_TOKEN','your access_token');
define('ACCESS_SECRET','your access_secret');

class Tw
{
	public function __construct($consumer_key, $consumer_secret, $access_token = NULL, $access_secret = NULL)
	{
		$this->tw_connection = new TwitterOAuth($consumer_key, $consumer_secret, $access_token, $access_secret);
	}
	public function check_err($tweets)
	{
		if(!isset($tweets->errors)) return $tweets;
		echo "Faild  " ;
		foreach($tweets->errors as $error) echo $error->message . " " . $error->code . "\n";
		//エラーが発生したら終了
		exit;
	}
	public function get($endpoint,$parameter = NULL)
	{
		return $this->check_err($this->tw_connection->get($endpoint,$parameter));
	}
	public function get_home_timeline()
	{
		$endpoint = 'statuses/home_timeline';
		return $this->get($endpoint);
	}
}
class Tw_Terminal
{
	public $tw;
	public $last_tweet_id;
	public function __construct(Tw $tw)
	{
		$this->tw = $tw;
	}
	public function get_home_timeline($reverse = true)
	{
		$tweets = $this->tw->get_home_timeline();
		if($reverse) sort($tweets);
		return $tweets;
	}
	public function home_timeline()
	{
		$tweets = $this->get_home_timeline();
		$this->display_tw($tweets);
	}
	/* tweet表示再起処理 */
	public function display_tw($tweet)
	{
		if(!is_object($tweet)){
			foreach($tweet as $one_tweet) $this->display_tw($one_tweet);
		}else{
			$this->print_tw($tweet);
		}
	}
	/* tweetの表示 フォーマットとかで出力制限できたらな.*/
	public function print_tw($tweet)
	{
		echo $tweet->user->name . "@" . $tweet->user->screen_name . "\n" . $tweet->text . "\n\n";
		$this->last_tweet_id = $tweet->id;
	}
	/* ループ */
	public function loop_home_timeline($time)
	{
		sleep($time);
		$tweets = $this->get_home_timeline();
		if($this->last_tweet_question($tweets)) $this->last_display_tweet_rm($tweets);
		$this->display_tw($tweets);
		//ループ処理
		$this->loop_home_timeline($time);
	}
	/*
	* 最後に表示したtweetまで削除
	* 参照渡し
	*/
	public function last_display_tweet_rm(&$tweets)
	{
		foreach($tweets as $key => $tweet){
			unset($tweets[$key]);
			if($tweet->id === $this->last_tweet_id) break;
		}
	}
	/* 取得したtweetsの中に最後に表示したtweetがあるか */
	public function last_tweet_question($tweets)
	{
		foreach($tweets as $tweet){
			if($tweet->id === $this->last_tweet_id) return true;
		}
		return false;
	}
}
$tw = new Tw(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_SECRET);
$terminal = new Tw_Terminal($tw);
$terminal->home_timeline();
$terminal->loop_home_timeline(60);

```

##2014/5/3 追加
・ソースファイル分割　bin/lib/config
・configファイルをyamlで設定

githubにて更新しました。
apache+passengerでproxyが使えない

gemsのhttpclientを利用しているrailsアプリで、起動するサーバーアプリを変更したら、railsアプリがproxyへリクエストしてくれなくてハマったのでメモ。

# 症状

* 前提
 * 環境変数のhttp_proxyに、リクエストを流したいproxyを設定しておく

* thinでrailsアプリを起動
 * その中でhttpclientを叩くとproxyへリクエストを流してくれる
* apache+passengerでrailsアプリを起動
 * その中でhttpclientを叩くとproxyへリクエストを流してくれない

下記のようなメッセージがログに残っている

```text
SocketError : getaddrinfo: No address associated with hostname
gems/httpclient-2.3.4.1/lib/httpclient/session.rb:803:in `initialize'
gems/httpclient-2.3.4.1/lib/httpclient/session.rb:803:in `new'
gems/httpclient-2.3.4.1/lib/httpclient/session.rb:803:in `create_socket'
gems/httpclient-2.3.4.1/lib/httpclient/session.rb:752:in `block in connect'
```

# proxyに流れなかった理由

* 該当コード付近
 * gems/httpclient-2.3.4.1/lib/httpclient/session.rb:856

```rb
    def create_socket(site)
      socket = nil
      begin
        @debug_dev << "! CONNECT TO #{site.host}:#{site.port}\n" if @debug_dev
        if str = @test_loopback_http_response.shift
          socket = LoopBackSocket.new(site.host, site.port, str)
        elsif @socket_local == Site::EMPTY
          socket = TCPSocket.new(site.host, site.port)
```
TCPSocket.newのところで、エラーが出ているようです。
もう少し遡ってみましょう

* gems/httpclient-2.3.4.1/lib/httpclient/session.rb:747

```rb
    # Connect to the server
    def connect
      site = @proxy || @dest
      retry_number = 0
      begin
        timeout(@connect_timeout, ConnectTimeoutError) do
          @socket = create_socket(site)
```
どうやらこの@proxyがnilになってしまっていて、意図通りになっていない様子
@proxyが設定されている場所を探してきます

* gems/httpclient-2.3.4.1/lib/httpclient.rb:1156

```rb
  def load_environment
    # http_proxy
    if getenv('REQUEST_METHOD')
      # HTTP_PROXY conflicts with the environment variable usage in CGI where
      # HTTP_* is used for HTTP header information.  Unlike open-uri, we
      # simply ignore http_proxy in CGI env and use cgi_http_proxy instead.
      self.proxy = getenv('cgi_http_proxy')
    else
      self.proxy = getenv('http_proxy')
    end
    # no_proxy
    self.no_proxy = getenv('no_proxy')
  end
```
ここで設定されるようですね。
今回の場合、以下になっていたようです。

* apache+passengerの場合
 * 今回はgetenv('REQUEST_METHOD')に'GET'が入る
 * cgi_http_proxyという環境変数は設定していないので、self.proxy = nilとなり、結果proxyには流れない
* thinの場合
 * getenv('REQUEST_METHOD')がnilなので、getenv('http_proy')が読まれる

コードのコメントによると、衝突回避のようですね。
というわけで、環境変数を設定します

* /etc/httpd/conf.d/myenv.conf

```apache
  SetEnv CGI_HTTP_PROXY http://proxy.example.com:8080
```

apacheを再起動して、意図通りに処理される事を確認しましたとさ

# まとめ

* railsからhttpclientをproxy経由で使いたい場合は、cgi_http_proxyを使いましょう。
* 使おうとしているライブラリはちゃんと読めって事ですね。

要らんとこでハマりましたね〜（＝ｗ＝；
ニッチすぎて自分以外が必要としないメモですね・・・ｗ
Macでプリントプリセットの初期値を変更する


## 1. プリセットを作る

プリント設定画面で所望の設定に変更し、`現在の設定をプリセットとして保存...`

![スクリーンショット 2014-05-02 16.01.59.png](https://qiita-image-store.s3.amazonaws.com/222/18569/63c3813c-586c-b898-92c0-ec41cdb8b325.png "スクリーンショット 2014-05-02 16.01.59.png")


ここではプリセット名として `B&W` とした。このプリセット名は後でつかいます。
![kobito.1399014239.233952.png](https://qiita-image-store.s3.amazonaws.com/222/18569/c2349d8b-ba32-124b-ba9d-e862ba622988.png "kobito.1399014239.233952.png")


## 2. プリセットをデフォルトに設定

### 2.1. プリンタの装置名を確認
`システム環境設定` > `プリンタとスキャナ` > `オプションとサプライ` で確認出来る。
ここでは `printer02_local`
![kobito.1399014639.369075.png](https://qiita-image-store.s3.amazonaws.com/222/18569/74b612a2-0276-fb6c-46f0-df31256bcbb4.png "kobito.1399014639.369075.png")


### 2.2 ターミナルでこんなコマンドを入力

ここで `printer02_local` と `B&W` は自分の環境に合わせて変更する。

```
> defaults write com.apple.print.custompresets.forprinter.printer02_local com.apple.print.lastPresetPref 'B&W'
> defaults write com.apple.print.custompresets.forprinter.printer02_local com.apple.print.lastPresetPrefType 3
```

![kobito.1399015055.745999.png](https://qiita-image-store.s3.amazonaws.com/222/18569/81a56a3e-dc73-e9c1-736b-ab698dc92365.png "kobito.1399015055.745999.png")
「うわ、rails g controllerでviewを生成しないオプション、ドキュメントに書いてないじゃん、Qiitaに書いとこ。」という話



### viewsフォルダの中身を `rm -rf` すればいいじゃん

と思っていた時期が僕にもありました

### `--skip-template-engine` があるんです

[ありがたいソース](http://stackoverflow.com/questions/18406370/dont-create-view-folder-on-rails-generate-controller)

[ドキュメント](http://railsdoc.com/rails#コントローラの生成(rails%20generate%20controller))には書かれていないので貴重な情報では

### 課題

- APIのためのルーティングは固まっているのでrails gのたびにrouteが生成されてウザいのをなんとかしたい

- rails4からconfig/application.rbにデフォルトでhelperやassetsを生成しないための設定が追加されたのかな疑惑を確かめたい
ノンプログラマーがMacでCompassを導入してみた

![compass.png](https://qiita-image-store.s3.amazonaws.com/0/3153/55b8fb1b-43f7-73ea-5fec-ad5276511b54.png)

# 経緯

Sassは以前から導入していたものの、Compassを使っておらず、Sassの恩恵をあまり受けていなかったことに気付き、早速Compassを導入することにしました。

# 環境

実際に導入した時の環境はこんな感じでした。

* Mac OS X 10.8.5
* ruby 1.8.7(2012-02-08 patchlevel 358)
* Sass 3.2.19
* Compass 0.12.6

# そのまえにCompassって？

SaasやCSSの機能を拡張するフレームワーク。
例えるなら、CSSがコア・ファイターで、Sassはガンダム。
Compassに至っては、マグネット・コーティング仕様のG-3ガンダムといった感じだと思っていただけると非常に分かりやすいかと思います。

# 何ができるの？

1. スプライト画像作成がすごく簡単！
2. 再利用可能なコードがぎっしりあるので、CSSよりもコードを書かなくて済む！
3. CSS3も簡単に記述できる！

# 早速Compassのインストール

※Sassは事前にインストールしておく
※sassのバージョンが古い場合があるから最新のものにしておく

参考）→ http://liginc.co.jp/designer/archives/11623#a6

1. ターミナル（くろいがめん）を起動

2. 次のコマンドを実行する
`sudo gem install compass`

3. パスワードを求められるので入力する

4. 少し待つと数行の文字が表示される

5. ちゃんとインストールされたか確認するために次のコードを入力する
`compass -v`

6. 次のような文字が表示されます。
`Compass 0.12.6 (Alnilam)
Copyright (c) 2008-2014 Chris Eppstein
Released under the MIT License.
Compass is charityware.
Please make a tax deductable donation for a worthy cause: http://umdf.org/compass`

# プロジェクトの作成

1. ターミナル（くろいがめん）を起動
2. プロジェクトを作りたいフォルダに移動（cdと打った後にフォルダをターミナルにドラッグでプロジェクトのパスを入力できます。）
`cd [プロジェクトのパス]`


3. 以下のコマンドを実行！
`compass create --sass-dir "scss" --css-dir "css" --javascripts-dir "js" --images-dir "img"`

※sassファイルはscssフォルダへ、CSSファイルはcssフォルダに作成されます。
※JavaScriptファイルはjsフォルダ、画像ファイルはimgフォルダを参照してくれるようになります。

#  config.rbの設定

先程作成されたプロジェクトの中にconfig.rbというrubyのファイルがあります。
ここにプロジェクトの設定が書かれているので、これを書き換えたりできます。
自分は以下のような感じになりました。

```rblang:config.rb
# Require any additional compass plugins here.
# Set this to the root of your project when deployed:
http_path = "/"
css_dir = "css"
sass_dir = "scss"
images_dir = "img"
javascripts_dir = "js"
# You can select your preferred output style here (can be overridden via the command line):
# output_style = :expanded or :nested or :compact or :compressed
# To enable relative paths to assets via compass helper functions. Uncomment:
# relative_assets = true
# To disable debugging comments that display the original location of your selectors. Uncomment:
line_comments = false
# If you prefer the indented syntax, you might want to regenerate this
# project again passing --syntax sass, or you can uncomment this:
# preferred_syntax = :sass
# and then run:
# sass-convert -R --from scss --to sass scss scss && rm -rf sass && mv scss sass
```

画像やjavascriptのパスを変える時はプロジェクトからの相対パスで指定します。

# Compassをコンパイル！

1. ターミナル（くろいがめん）を起動
2. 以下のコマンドを実行

`compass w`

これで、CSSフォルダにcssが書き出されました。

# GUIコンパイラを使う場合

Koalaの場合　（　ダウンロードはこちら　→　http://koala-app.com/　）

![koala.png](https://qiita-image-store.s3.amazonaws.com/0/3153/8e1674b3-0fcb-c344-9837-eae072c952ba.png)

Koalaでうまくコンパイルができない場合は、指定したフォルダーの階層を確認してみてください。
以下の階層のようにし、[プロジェクトフォルダ]を選択するとうまくコンパイルされるようになるかもしれませんよ。

[プロジェクトフォルダ]　←ここを選択してUPLOADする
┣config.rb
┣css
┃┣print.css
┃┣ie.css
┃┗screen.css
┗scss
　┣print.scss
　┣ie.scss
　┗screen.scss
エクスプローラの右クリックメニューをカスタマイズする

エクスプローラの右クリックメニューをカスタマイズするためのレジストリキーと.regファイルの例。

**注意** : .regファイルに日本語を含める時はUTF-16で保存すること。

####任意のファイルを右クリックした時のメニューを追加する

> HKEY_CLASSES_ROOT\\*\shell\《メニュー名》\command

**例**

```registry:open_editor.reg
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\open_editor]
@="ノートパッドで開く(&N)"

[HKEY_CLASSES_ROOT\*\shell\open_editor\command]
@="C:\\\\Windows\\\\System32\\\\notepad.exe \\"%1\\""
```

####任意のフォルダを右クリックした時のメニューを追加する

> HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\《メニュー名》\command

**例**

```registry:cmd_here.reg
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\cmd_here]
@="コマンドプロンプトで開く(&P)"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\cmd_here\command]
@="C:\\\\Windows\\\\System32\\\\cmd.exe /k pushd \\"%L\\""
```

####何もないところを右クリックした時のメニューを追加する

**例**

> HKEY_CLASSES_ROOT\Directory\background\shell\《メニュー名》\command

```registry:cmd_here-2.reg
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\Background\shell\cmd_here]
@="コマンドプロンプトを開く(&P)"

[HKEY_CLASSES_ROOT\Directory\Background\shell\cmd_here\command]
@="C:\\\\Windows\\\\System32\\\\cmd.exe /k pushd \\"%V\\""
```
MongoDBでデータをバックアップ/リストアする


Point-in-Timeパターン(一時的にmongodを停止する)でバックアップを取る方法。

あるサーバから別のサーバにMongoDBのデータを移動させるときに調べた。
MongoDB version: 2.4系


# mongodumpでバックアップする

`mongod.conf`のパスを調べる
--config か -f オプションで渡しているのがmongod.conf

CentOS 6.x

	$ ps aux | grep mongod
	... /usr/bin/mongod -f /etc/mongod.conf

Mac OS X

	$ ps aux | grep mongod
	... /usr/local/opt/mongodb/bin/mongod --config /usr/local/etc/mongod.conf


MongoDBの`dbpath`(データベースの実体が置いてあるパス)を調べる

CentOS 6.x

	$ grep dbpath [mongod.conf path]
	dbpath=/var/lib/mongo

Mac OS X

	$ grep dbpath [mongod.conf path]
	dbpath = /usr/local/var/mongodb

mongodを停止する

	$ mongo
	> use admin
	> db.shutdownServer()
	> quit()

バックアップしたデータの格納用に、空ディレクトリを作る

	$ mkdir ~/mongo_dump

データをバックアップする

	# mongodump -v --dbpath /var/lib/mongo --out ~/mongo_dump

`-v` verboseオプション
`--dbpath` mongod.confで調べたdbpathを指定
`--out` バックアップ先のディレクトリを指定

dbpathから読み出すので、root権限とか必要。


# mongorestoreでリストアする

先にmongodのサービス起動しておく

CentOS 6.x
	
	# service mongod start

Mac OS X

	# launchctl start homebrew.mxcl.mongodb 

データをリストアする

	# mongorestore -v --db [database_name] ~/mongo_dump/[database_name]

`-v` verboseオプション
`--db` リストア先のデータベースを指定
バックアップデータのディレクトリ/データベースを指定

dbpathに書き込むので、root権限とか必要。
リストア時にはindexの構築も行われるので、バックアップより時間がかかった。


# 参考にしたページ

http://docs.mongodb.org/manual/core/backups/
http://docs.mongodb.org/manual/reference/program/mongodump/
http://docs.mongodb.org/manual/reference/program/mongorestore/
[Immutable Infrastructure を目指す] AWS で実現するならこんなイメージ

# Immutable Infrastructure を目指す
* 最近、巷で(個人的にも) Immutable Infrastructure が流行っているので、AWS で実現するならこんな感じ？というイメージをまとめてみた

## そもそも Immutable Infrastructure とは
* "一度、インフラ環境を構築したサーバは、運用が開始したら設定を変更しない" という運用スタイル
* サーバに設定変更が必要になった場合は、別のマシンを用意し、設定が完了したらロードバランサーを切り替える
* AWS などのクラウドが普及し、仮想サーバによりマシンの用意が簡易になったことにより流行る

# AWS 上でおこなう Immutable Infrastructure

### 想定する環境
![00.png](https://qiita-image-store.s3.amazonaws.com/0/28573/dea62263-8526-da9c-e96b-d1f98488649d.png)

* 上図のように Elastic Load Balancing (ELB) 配下においた EC2 インスタンスで Rails アプリケーションを動作させていることを想定する
* Rails アプリケーションをデプロイする際に Immutable Infrastructure を適用する
* DB には RDS を使用し、今回は DB に変更が入らないものとする
    * DB に変更が入る場合の Immutable Infrastructure での運用は課題。。。

### EC2 インスタンスのベースとなる AMI を用意
![01.png](https://qiita-image-store.s3.amazonaws.com/0/28573/3f2d9d96-5449-0c2f-f948-4298cec989fd.png)

* あらかじめ必要なソフトウェア(Ruby, Rails etc.) をインストールした AMI を用意しておき、デプロイの際にはこの AMI をベースに EC2 インスタンスを立ち上げる
    * ここで使用する AMI を BaseAMI と呼ぶことにする
* BaseAMI は chef 等のプロビジョニングツールを使用する
* BaseAMI を変更したい場合は、chef コードの方を修正し、サーバ環境に直接手を加える事はしない

### EC2 インスタンスの作成・ソースコードの取得
![02.png](https://qiita-image-store.s3.amazonaws.com/0/28573/38bac469-7b2d-d893-211b-ae5a1cc99804.png)

* ここからデプロイをおこなう
    * デプロイには capistrano 等を使用(Ruby のスクリプトでも OK)
* BaseAMI から新規にインスタンス (New Instance) を作成する
* Git 等を使用し、 New Instance に Rails アプリケーションのソースコードを配置する

### Rails アプリケーションの起動
![03.png](https://qiita-image-store.s3.amazonaws.com/0/28573/2f2a6f96-7e2b-0e4d-a1ba-0cf7abc508e7.png)

* 取得したソースコード実行し、Rails アプリケーションを起動する
    * 今回の例は、DB に変更がない場合を想定しているので、RDS にそのまま接続するのみ
* ELB との接続もおこなう

### 古いインスタンスの停止・デプロイ完了
![04.png](https://qiita-image-store.s3.amazonaws.com/0/28573/e0c1473e-71a0-33fa-08b9-b8158ba07ef9.png)

* New Instance と ELB を接続し、Health Check が完了したら、Old Instance を ELB から切り離す
* Old Instance で動作している Rails アプリケーションを終了する
* Old Instance のログをよしなに保存し、インスタンスを停止する
    * これにより、ゼロダウンタイムリリースが可能になる
* New Instance の動作に不具合があった場合は、Old Instance を再起動し、Rails アプリケーションを動作させたのち、ELB を振り直せば、容易にロールバックも可能

### その他
![05.png](https://qiita-image-store.s3.amazonaws.com/0/28573/edbd007b-f02b-267f-c488-e9493e009d13.png)

* このままでは、デプロイを複数回繰り返していくうちに Old Instance が増えていくので、2 世代前は terminate するなどのルールを作ると、より Immutable Infrastructure っぽくなる

# まとめ
* 本来であれば、上の [EC2 インスタンスのベースとなる AMI を用意] に書いたような BaseAMI は用意せず、デプロイの都度プロビジョニングツール(chef 等)で環境を作りなおしたほうが、より Immutable Infrastructure に則っていると思われる
    * しかし、環境の構築に時間がかかる、かつ何度も変わるものでなければ AMI として用意しておいたほうが効率が良いと判断した結果、BaseAMI を使うことにした
RSS対応NICのキューをそれぞれCPUに割り当てる

 RSS対応NICなのに、複数コアに分散されないことがあって、調べると次の記事が出てきて、`irqbalance`いれよーってことになるけど、コメント欄で、別に入れなくても良いよ、ってかいてある。

- [RSS対応NICなのに割り込み処理が複数コアに分散しない…のはirqbalanceが動いてなかったから - 酒日記 はてな支店](http://d.hatena.ne.jp/sfujiwara/20121221/1356084456)

`irqbalance`昔調べたけど、挙動がよくわかんなくて、結局次のようなシェルスクリプトを書いた、ことを忘れてまた調べていたので、ここに書いておく。`irqbalance`はなんかのタイミングでコアの割り当てをぐるぐるまわしてくれるっぽいけど挙動がよくわからなかったので、誰か教えてくれるとうれしい。

```bash:set_irq_affinity.sh
#!/bin/bash
#
# = RSS対応NICの各キューをCPUコアに割り当てるスクリプト
#
# Author::  harukasan <harukasan@pixiv.com>
# License:: MIT
#
# == Ref
# http://d.hatena.ne.jp/sfujiwara/20121221/1356084456のコメント欄
#
# == NOTE
# irqbalaceを使うとよくわからないタイミングでコア割り当てを
# 変更されるので、起動しないようにしておく
#

# affinityを書き込む
# @param irq  integer IRQ番号
# @param mask integer ビットマスク
set_affinity()
{
    local irq=$1
    local mask=$2
    printf "set /proc/irq/%d/smp_affinity to '%X'\n" $irq $mask
    printf "%X" $mask > /proc/irq/$irq/smp_affinity
}

#
# MAIN
#
DEV="eth0" # SET NIC
NUM_CPU=`grep processor /proc/cpuinfo | wc -l`

I=0
for IRQ in `cat /proc/interrupts | egrep -i "$DEV.*-[0-9]$" | cut -d: -f1 | sed "s/ //g"`
do
    MASK=$((1<<$I%$NUM_CPU)) # MASK = 1 << I % NUM_CPU
    I=$((I+1))
    set_affinity $IRQ $MASK
done
```
乱数使って配列の要素を入れ替え

思い立って乱数を使って配列の入れ替えをしてみたー。
４回実行して結果が違うことも確認。
arc4randomじゃなくてrandでも同じような結果になるようですが…。


```objc:randam
- (void)viewDidLoad
{
    [self MultidimensionalArray];    //多次元配列
    [self MultidimensionalArrayRandom];    //多次元配列
    [self MultidimensionalArrayRandom];    //多次元配列
}

//配列にデータを入れる
-(void)MultidimensionalArray
{
    ar = [[NSMutableArray alloc] init];
    [ar addObject:@"aaa"];
    [ar addObject:@"bbb"];
    [ar addObject:@"ccc"];
    [ar addObject:@"ddd"];
    [ar addObject:@"eee"];
    NSLog(@"ar %@",ar);
}

//配列に入っているデータをランダムに入れ替える
-(void) MultidimensionalArrayRandom
{
    for (int i = (int)[ar count]-1; i>=0; i--) {
        int j = arc4random() % (i+1);
        [ar exchangeObjectAtIndex:i withObjectAtIndex:j];
    }
    NSLog(@"arRan %@",ar);
}

```

そして結果は以下の通り！

```objc:結果1
ar (
    aaa,
    bbb,
    ccc,
    ddd,
    eee
)
arRan (
    eee,
    ddd,
    ccc,
    aaa,
    bbb
)
arRan (
    eee,
    aaa,
    ccc,
    bbb,
    ddd
)
```

```objc:結果2
ar (
    aaa,
    bbb,
    ccc,
    ddd,
    eee
)
arRan (
    bbb,
    ccc,
    ddd,
    aaa,
    eee
)
arRan (
    bbb,
    ddd,
    aaa,
    eee,
    ccc
)
```

```objc:結果3
ar (
    aaa,
    bbb,
    ccc,
    ddd,
    eee
)
arRan (
    aaa,
    ddd,
    bbb,
    eee,
    ccc
)
arRan (
    aaa,
    ddd,
    eee,
    ccc,
    bbb
)
```

```objc:結果4
ar (
    aaa,
    bbb,
    ccc,
    ddd,
    eee
)
arRan (
    aaa,
    ccc,
    bbb,
    eee,
    ddd
)
arRan (
    ccc,
    ddd,
    bbb,
    aaa,
    eee
)
```

こういうランダムは要素が5つじゃ分かりづらかったですね。反省。
プロセスとスレッドについて


プロセスとは何か
➡　「インスタンス」として理解するのがいい
プログラムを実行するうえで、必要な情報とは何か。　
・どこまで処理が進んだのか、
・メモリのアドレス
・どんなファイルを開いているのか
…etc
これらを各プログラムごとにまとめたものがプロセス

一つのプログラムを実行すると、一つのプロセスが走る
psコマンドで確認できる

○大原則　１プロセッサには、同時に１プロセスしか走らない
but　psコマンドの結果は複数プロセスが同時に走っているように見える
理由
　あるプロセスがcpuにある程度実行した後、ほかのプロセスにcpuを譲っている
➡これが非常に短いクロック間隔で行われているので、あたかも複数プログラムが同時に走っているように見える

この、プロセスごとの優先度や、プロセス毎に時間を割り当てるのがスケジューラと呼ばれるもの

プロセスには、状態がある　
　実行可能状態など


スレッドとは何か
➡　プロセスを細かくした実行単位といえる

１プログラムの中で、１プロセスの中で並行処理を行いたい場合　スレッドを利用する
しかし、マルチスレッドで実行したとしても、結局１プロセスであるので、マルチコアであっても、１つのコアでしか実行されない？

マルチコアに対応するために
linux kernel ➡　「スレッド」を「ライトウェイト　プロセス」にして、隠すレッドをプロセスにしてしまう。
このライトウェイトプロセスを複数のコアで扱うことができ、並列処理ができる。


参考：　http://d.hatena.ne.jp/m-bird/20090604/1244165412
RubyのNet::SSHでknown_hostsを無視する

dockerのコンテナをserverspecを使ってNet::SSH経由のテストしたりすると ~/.ssh/known_hosts が肥大化したりverifyに失敗したりする。閉じた環境に限定されているので全体のknown_hostsを見なくてもいいだろうとNet::SSHのオプションに追加してみる。

```rb
# ...
options = {
  paranoid: false,
  user_known_hosts_file: '/dev/null',
}
Net::SSH.start(host, user, options)
```

- paranoid: false は `-o StrictHostKeyChecking=no`
- user_known_hosts_file: は `-o UserKnownHostsFile=/dev/null`

相当（のはず）。

参考:
- [net-ssh/net-ssh](https://github.com/net-ssh/net-ssh)
- [Net::SSH.start](http://net-ssh.github.io/ssh/v2/api/classes/Net/SSH.html#M000002)
Rails4 Deviseカスタマイズ：登録時に規約に同意を追加

1.
DBにカラムを追加する

```bash
$ rails g migration add_rule_confirmed_to_users rule_confirmed:boolean
$ bundle exec rake db:migrate
```
db/migrate/20130930182035_add_rule_confirmed_to_users.rb が生成されるので、マイグレート

2.
application_controller.rbに、以下を追加する

```rb:controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_filter :configure_permitted_parameters, if: :devise_controller?

  protected
    def configure_permitted_parameters
      devise_parameter_sanitizer.for(:sign_up) << :rule_confirmed
    end
end
```

3.
views/devise/registrations/new.html.erbに
以下を追加する
（simple_form,bootstrap使用）

```erb:views/devise/registrations/new.html.erb
  <%= f.input :rule_confirmed, :input_html => { :class => 'input-xlarge' } %>
```

4.
ja.ymlに以下を追加
（ロケールが日本語の場合）

```yaml:config/locales/ja.yml
ja:
  activerecord:
    attributes:
      user:
        rule_confirmed: "利用規約に同意"
```

5.
モデルのuser.rbに以下を追加

```rb:models/user.rb
  validate :rule_confirmed_valid?

private
  def rule_confirmed_valid?
    errors.add(:rule_confirmed, 'して頂かない場合は、登録できません。') unless rule_confirmed == true
  end
```
JavaScriptでの正規表現のハマりポイント


以前ハマったので、メモとして書いておきます。

## "." は改行文字にマッチしないし、マッチさせるすべがない（ES2018より以前）

（この JavaScript は ES2018 より以前を想定しています）

```js
var container = document.getElementById("container");
container.innerHTML = container.innerHTML.replace(/===ここから===.*?===ここまで===/, "");
```

これ、「===ここから===」と「===ここまで===」が一行に収まっていればマッチするのですが、複数行にまたがっている場合にはマッチしませんし、当然置換も行われません。 **ドットが改行文字にマッチしないから** です。

記事 [RegExp - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp) によると、修飾子(flag) には `g` `i` `m` `y` があるのですが、Perlでドットを改行文字にマッチさせる `s` 修飾子というものがないので、どうしようもありません（ES2018については後述）。

上述のページにも "." の説明がこう書かれています。

>  （この文字は小数点です） 改行文字（`\n`、`\r`、 `\u2028`、あるいは、`\u2029`）を除いたあらゆる 1 文字にマッチします（ `[\s\S]` という正規表現を使えば、改行文字を含めたあらゆる文字にマッチさせることができます）。

というわけで、上記のJavaScriptは以下のように書き換えることで、複数行マッチにも対応することができます。

```js
var container = document.getElementById("container");
container.innerHTML = container.innerHTML.replace(/===ここから===[\s\S]*?===ここまで===/, "");
```

なお、ES2018 では晴れて `s` 修飾子が追加されました。[RegExp - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp) の記事にも[2019年春に `s` への言及が追加されています](https://wiki.developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp$compare?to=1553268&from=1524624)。


## "^" はどんな場所でもメタ文字のように振る舞う

正規表現の `^` は

* 正規表現の冒頭にある場合には、冒頭から開始するという意味
* 文字クラス (`[` と `]` で囲われたもの) の先頭にあると、文字クラスの集合の補集合となる

という意味でメタ文字として使われますが、その他の場所ではそれを書いたとしても書いていないようにみなされてしまいます。

(※当初、PerlやPCREでは上記以外のような場所では `^` はその文字自身を表すと書きましたが、間違っていました)

```js
// Chrome デベロッパーコンソールで実験
> str1 = "abc^def"
"abc^def"
> str1.match(/c^d/)
null
```

この現象を回避して `^` をその文字自身としてマッチさせるには、`\` でエスケープをする必要があります。

```js
> str1.match(/c\^d/)
["c^d"]
> re = new RegExp("c\\\\^d") // バックスラッシュ２つ
/c\^d/
> str1.match(re)
["c^d"]
```

とはいえ、`^` を改行の直後にゼロ幅マッチさせるためには、`m` 修飾子を指定してやる必要があります。

```js
> str2 = "xyz\n123"
"xyz
123"
> str2.match(/^1/)
null
> str2.match(/^1/m)
["1"]
```
Clojureの無名関数で%-1は何を表すか？

Clojureの無名関数では、%, %n, %&の形式で引数にアクセスできますが、%1.0のような不正な形式だと以下のような例外が発生します。

`java.lang.IllegalStateException: Arg literal must be %, %& or %integer`

`%integer`ならいいのかってことで試したところ、`%-1`が使えました。

```anonymous.clj
(apply #(println %1 %-1 %2 %&) (range 10))
```

さて結果はこのとおり。

```
0 (2 3 4 5 6 7 8 9) 1 (2 3 4 5 6 7 8 9)
```

%&と同じですね。
正式な仕様ではないかもしれないので、%&を使ったほうがいいでしょう
ATLASのソースからのインストール


ATLAS (Automatically Tuned Linear Algebra Software) は，BLAS (Basic Linear Algebra Subprograms)の実装で，アーキテクチャに最適なコードにしてくれているものらしい．
時には普通のBLASの数十倍も速くなるとか．．．


## コンパイル

INSTALL.txtに書いてあるように，

```bash
$ mkdir my-build
$ cd my-build
$ ../configure
$ make
```

とすればコンパイルされるが，後々，共有ライブラリ（???.soみたいな名前のもの）を作りたいと思ったときに，これではダメだと言われる．
コンパイルの際に `-fPIC` を付けないといけないらしい．

```bash
$ ../configure --shared --prefix=/usr/local
```

みたいに，`--shared`を付けると共有ライブラリも作成されるらしい．

`make`の途中で，

```bash
./xmasrch -p s -o res/sMULADD
```

のような箇所で全く進まない場合（これはコンパイラのバグらしい），Make.incファイル内を下記のように変更すればコンパイルが通るようになる．

```Makefile
SMAFLAGS = -O0
DMAFLAGS = -O0
```

それによってライブラリの速度がどう変わるかとかは知らない．しかし，コンパイルはできるようになる．

参考：
http://sourceforge.net/p/math-atlas/support-requests/856/
DEBIAN_FRONTEND=noninteractive ってなんだ

Dockerfileとかによく

```
ENV DEBIAN_FRONTEND noninteractive
```

と書いてある。この環境変数 `DEBIAN_FRONTEND` って何だろう？

これは、インストーラで使うユーザインタフェースを制御するものらしい。

`DEBIAN_FRONTEND=noninteractive` のときは、インタラクティブな設定をしなくなる（＝入力待ちでブロックしなくなる）ので、自動インストールの際には便利だとか。

* http://www.debian.org/releases/sarge/s390/ch05s02.html.ja

この辺とかに載っていた。他にも、textとかgtkとかncursesがある。よく見かけるいきなりババッとターミナルでncursesが立ち上がるやつの設定は `DEBIAN_FRONTEND=ncurses` なんだろう（その辺の詳しいところを説明しているページを見つけられなかった...）。
Markdown な Bitbucket Wiki に TOC を追加する方法


# 前置き

最近は Bitbucket さんとキャッキャウフフする日々。

んで、Wiki も使って見ようかな？とか思った。

が、TOC (Table of Contents) の表示の仕方が分からなかった。

いや、正確に言うと、「Creole での書き方は分かるが Markdown での書き方が分からない」状態だった。

# 結論

```
[TOC]
```

以上。

# 言い訳

日本語ドキュメントには Creole 記法しか書いてなくて、英語ドキュメント (本家) 探したら余裕で見付かったですよ。ええ。
EC2にAlminumを入れる。

ALMiniumで超簡単ってきいてたけどめんどくさかったのでメモ

# 構築手順
## 初期設定
* ec2でインスタンス作るところは端折る。  
「Amazon Linux AMI」で作成しています。  
インスタンスタイプとかストレージはお好きに。
* ec2-userでログインしてrootに
<pre>
# sudo su -
</pre>
* yumを最新に
<pre>
# yum update -y
# yum upgrade -y
</pre>
1. 時刻設定
LANGを"ja_JP.UTF-8に変更
<pre>
# cp /usr/share/zoneinfo/Japan /etc/localtime
# vi /etc/sysconfig/i18n
</pre>
2. sshdの設定修正
「PermitRootLogin no」 に編集してreload。
<pre>
# vi /etc/ssh/sshd_config
# /etc/init.d/sshd reload
</pre>
* git/redisのインストール
<pre>
# yum install -y git
# yum install -y \ gcc-c++ \ git-core \ libffi-devel \ libicu-devel \ libxml2-devel \ libxslt-devel libyaml-devel \ make \ mysql \ mysql-devel \ patch \ perl-Time-HiRes \ postfix \ readlineevel \ zlib-devel 
# yum install -y libxml2 libxml2-devel libxslt libxslt-devel libicu libicu-devel
# yum install -y redis --enablerepo=epel
</pre>
* ruby2.0をインストール（2でないと失敗する）
<pre>
# yum remove -y ruby
# bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)
# rvm install ruby 2.0.0
</pre>
* これでruby-2.0.0-p247がインストールされた。
# 一応下記も入れておく。
<pre>
# gem install bundler --no-ri --no-rdoc
# gem install charlock_holmes --version '0.6.9.4'
</pre>

## ALMiniumのインストール
* ダウンロード
<pre>
# cd /usr/local/src
# git clone https://github.com/alminium/alminium.git
</pre>
* インストール実行
<pre>
# cd alminium
# source ./smelt
</pre>
いろいろ聞かれるけどお好みで。  
HostName入れるところはGIPをとりあえず入れとく事を推奨。
Jenkinsは別で立てた方が良いし、あとでモメるぽいのでスルー推奨。
* サーバーリブート
<pre>
# reboot
</pre>

## Redmine設定
* 設定を編集(上3行のみ)
<pre>
# vi /etc/httpd/conf.d/redmine.conf
【細かいversionとか変わる可能性大】
LoadModule passenger_module /usr/local/rvm/gems/ruby-2.0.0-p451/gems/passenger-4.0.40/buildout/apache2/mod_passenger.so
PassengerRoot /usr/local/rvm/gems/ruby-2.0.0-p451/gems/passenger-4.0.40
PassengerRuby /usr/bin/ruby
</pre>
* Ruby設定  
/usr/bin/ruby がいないので
<pre>
# ln -s  /usr/local/rvm/rubies/ruby-2.0.0-p451/bin/ruby /usr/bin/ruby
</pre>
* httpd再起動
<pre>
# service httpd restart
</pre>
* リブート時の自動起動
<pre>
# chkconfig httpd on
</pre>

## MySQL設定
* /etc/my.cnf の[mysqld]に以下をついか
<pre>
max_allowed_packet=10M
</pre>
* MySQL再起動
<pre>
# service mysqld restart
</pre>

## 確認
* urlにアクセス
<pre>
http://[IPADDRESS]/
</pre>

おわり

※ 参考： http://www.dosancole.com/environment/2013/10/27/alminium-ec2/