OmniAICreator/Qiita-1.07M huggingface dataset:
Amazon Linux上のJenkinsでrbenv + Bundler + Rspecを動かす


## 環境
* Jenkins構築済み
* Jenkinsのジョブ自体は作成済み
* jenkinsユーザがJenkinsを動かしている
* jenkinsユーザのホームディレクトリ `/var/lib/jenkins`
* jenkinsユーザのログインシェルは `/sbin/nologin` でログイン不可

## rbenvでRubyをインストール

### rubyグループに所属するユーザ（とroot）がrbenvを使えるようにする
```shell
# groupadd ruby
# gpasswd -a jenkins ruby
```

### rbenvをインストール
```shell-session
# cd /usr/local
# git clone git://github.com/sstephenson/rbenv.git rbenv
```

### rubyグループ向けに権限設定
```shell# chgrp -R ruby rbenv# chmod -R g+rwxXs rbenv
```

### ruby-buildをインストール
```shell-session
# mkdir /usr/local/rbenv/plugins
# cd /usr/local/rbenv/plugins
# git clone git://github.com/sstephenson/ruby-build.git
# chgrp -R ruby ruby-build
# chmod -R g+rwxs ruby-build
```

### 環境変数設定

rbenvコマンドを利用可能にするため、ユーザごとに環境変数設定が必要。
ただしjenkinsユーザはログイン不可のため、別の方法を使う（後述）。
ここではrootユーザにのみ設定を追加

`~/.bash_profile`に以下の行を追加

```bash
export RBENV_ROOT=/usr/local/rbenvexport 
PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"```

### rbenvを使ってrubyをインストール

記述時点でのRuby1.9系と2.0系の最新バージョンをインストールし、1.9系をデフォルトで使用することにする。

```shell-session
# rbenv install 1.9.3-p429
# rbenv install 2.0.0-p195
# rbenv rehash
# rbenv global 1.9.3-p429
```

## Jenkinsの設定

### プラグインの追加

Jenkins管理画面を開き、
Jenkinsの管理 > プラグインの管理 > 利用可能 から以下をインストール

* ruby plugin
* rake plugin
* rbenv plugin

### ジョブの設定

ジョブの設定画面で、

* ビルド環境 > rbenv build wrapper をチェック
	* The Ruby version に `1.9.3-p429` を指定
	* Preinstall gem listに `bundler,rake` を指定
* ビルド手順の追加 > シェルの実行 を選び、以下の行を追加

```shell-session
export PATH="/var/lib/jenkins/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
rbenv exec bundle install --path vendor/bundle
bundle exec rspec
```

*ビルドを実行して成功すればOK！*

## Rspecでカバレッジを出したい場合

### Gemを追加

プロジェクトのGemfileに以下のgemを追加し、`bundle install`

```rb
group :test do
  gem 'simplecov'
  gem 'simplecov-rcov'
end
```

### カバレッジファイルを出力させる

`spec_helper.rb` 等の、テストの冒頭に必ず呼ばれるファイルに以下を追加。
`vendor/`以下のgemに付属するテストのカバレッジは出さないように除外。

```ruby
require 'simplecov'
require 'simplecov-rcov'
SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter
SimpleCov.start do
  add_filter '/vendor/'
end
```

これで `bundle exec rspec` すると `coverage/` 以下にカバレッジファイルが作成される。
`coverage/rcov/index.html` をブラウザで開けばカバレッジの状況をブラウザから確認できる。

### Jenkins側の設定

Jenkinsの管理 > プラグインの管理 > 利用可能 から以下をインストール

* ruby metrics plugin

ジョブの設定 > ビルド後の処理 > Publish Rcov report を選び、

* Rcov report directory に `coverage/rcov` を指定
* Coverage metric targets で天気マークが出る条件を指定(お好みでどうぞ)


*ビルドを実行し、ジョブのメニューから Rcov report が見れるようになっていればOK！*
Vagrant の仮想マシンに CentOS6 入れて jenkins 導入


vagrant の CentOS6 環境にJenkinsを入れた記録

# インストール

jenkins の前に javaが必要なのでインストール

```
$ sudo yum install java-1.7.0-openjdk.x86_64

# インストールの確認
$ java -version
java version "1.7.0_19"
OpenJDK Runtime Environment (rhel-2.3.9.1.el6_4-x86_64)
OpenJDK 64-Bit Server VM (build 23.7-b01, mixed mode)
```

[jenkins公式ページ]([https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+on+RedHat+distributions)にあるインストール方法に従ってインストール

```
$ sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
$ sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
$ sudo yum install jenkins
```

/etc/init.d/jenkins  にデーモンとして起動するスクリプトが
/usr/lib/jenkins/jenkins.war にjenkinsの本体がインストールされている


# 起動してみる

以下のコマンドで起動

```
$ java -jar /usr/lib/jenkins/jenkins.war
```

8080ポートで Jenkins が起動する。
まだ port fowarding の設定してないので、ゲストOSのコンソールでcurl で確認

```
 $ curl http://localhost:8080/
 ```

ゲストOSのポートフォワーディングの設定

Vagrantfile を開いて以下のように記述

```
config.vm.network :forwarded_port, guest: 8080, host: 18080
```

ゲストOS再起動

```
vagrant reload
```

ブラウザで localhost:18080 にアクセスして jenkins の画面が表示されることを確認。

# rubyプロジェクトのビルド設定

## RVM インストール

```
$ \curl -L https://get.rvm.io | bash
```

## jenkins ダウングレード

現時点の最新 jenkins-1.518-1.1 で RVM プラグイン入れると以下のようなエラー吐いていたので jenkins をダウングレードする

```
java.lang.IncompatibleClassChangeError: Found class com.kenai.jffi.InvocationBuffer, but interface was expected
```

```
$ yum downgrade jenkins
```

これで jenkins-1.517-1.1 になった


## Jenkins に RVMプラグイン導入

Jenkinsの管理画面から RVM plugin をインストール


# サンプルRubyプロジェクトで動作を確認

サンプル的な ruby のプロジェクトを使ってビルドしてみる。

## 新規ジョブ作成

フリースタイル・プロジェクトのビルド を選択

ソースコード管理で Subversion を選択し、リポジトリのURL に https://svn.jenkins-ci.org/trunk/jenkins/test-projects/model-ruby-project  を入力。

ビルドトリガーで、SCMをポーリング　を選択して、

スケジュールに

```
*/10 * * * *
```

と入力

ビルド環境では Run the build in a RVM-managed environment  を選択して、 	Implementation に以下のように入力

```
1.9.3
```

これで RVM 使って 1.9.3 環境でのテストが実行されるようになる。

実際のビルド方法（テスト実行方法）は、ビルドのシェルの実行に以下のように入力

```
which bundle || gem install bundler
bundle install
bundle exec rake
```

ビルド後の処理に、JUnit テスト結果の通知を追加、テスト結果XML には以下のように入力

```
reports/**/*.xml
```

# トラブルシュート

## ビルドの中の bundle install で以下のようなエラー

```
エラー: /home/vagrant/.rvm/archives/RPM-GPG-KEY-EPEL-6: インポート読み込みに失敗しました(2)。
エラー: /home/vagrant/.rvm/archives/epel-release-6-8.noarch.rpm のオープンに失敗: そのようなファイルやディレクトリはありません
Error installing EPEL, it is required for libyaml-devel,
either there was an error installing EPEL package,
or there was problem checking if libyaml-devel is available / installed.
Using /home/vagrant/.rvm/gems/ruby-1.9.3-p429
```

CentOS において Ruby 1.9.3 をインストール際に発生する問題っぽい。（http://d.hatena.ne.jp/koziy/20111104/1320370451）

EPEL を利用して、 yaml-devel をインストールすれば良いらしい。

### EPEL 導入

参考: http://www.tooyama.org/yum-addrepo-epel.html

```
$ sudo wget http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo rpm -ivh epel-release-6-8.noarch.rpm
```

### yaml-devel インストール

```
$ sudo yum install libyaml-devel.x86_64
```

これで、 rvm install 1.9.3 してみて正常であればOK
gitバージョンアップで -bash: __git_ps1: コマンドが見つかりません と言われたとき

# gitバージョンアップで -bash: __git_ps1: コマンドが見つかりません と言われたとき
## git-prompt.sh を持ってきて
$ mkdir -p ~/local/etc/bash_completion.d/
$ cd ~/local/etc/bash_completion.d/
$ wget https://raw.github.com/git/git/master/contrib/completion/git-prompt.sh

## 読み込む
### .bashrc に以下を追加
```.bashrc
if [ -f $HOME/local/etc/bash_completion.d/git-prompt.sh ]; then
    source $HOME/local/etc/bash_completion.d/git-prompt.sh
fi
```
WordPress でポスト本文に記述された最初の画像URLを取得


## 手順.1

適用するテーマの functions.php に関数を追加

	function view_first_image_src() {
		global $post, $posts;
		$_first_img_src = '';

		ob_start();
		ob_end_clean();

		$_output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $_matches);

		$_first_img_src = $_matches[1][0];

		if(empty($_first_img_src)){
			// 画像を含まない場合のカバー
			$_first_img_src = "/img/common/no-img.png";
		} else {
			// マルチサイト向けにWP インストールディレクトリへURLを書き換え
			$_img_src_arr = explode('/wp-content/', $_first_img_src);
			$_first_img_src = '/hoge/wp-content/' . $_img_src_arr[1];
		}

		return $_first_img_src;
	}

if(empty($_first_img_src)) の else 文は、お好みで。

## 手順.2

表示先のループ内で、関数を実行

	<img src="<?php echo view_first_image_src(); ?>" />
WordPress の管理画面でカスタムJSの読込


## 手順.1

任意のテーマの functions.php に、アクションを追加

	function _register_custom_js( ) {
		$_current_theme_dir = get_template_directory_uri();
		$_custom_js = '<script type="text/javascript" src="{$_current_theme_dir}/wp-admin/custom.fnc.js"></script>';
		echo $_custom_js . "\n";
	}

	add_action('admin_head', '_register_custom_js');

## 手順.2

テーマディレクトリの下層に /wp-admin/custom.fnc.js を作成してFTPアップロード

## 手順.3

前述の custom.fnc.js をカスタマイズ
syntax_fixでRubyの古いHash記法を1.9スタイルに一括置換する


##問題
実行環境はRuby 1.9(または2.0)なのに、コード上では新旧のHash記法が混在して美しくない。

````ruby
# 古い記法
:key => 'value'
# 新しい記法(Ruby 1.9以降)
key: 'value'
````

##解決策
[syntax_fix](https://github.com/HeeL/syntax_fix)というGemを使うと簡単に一括置換できます。

対象となる拡張子は 'rb', 'erb', 'rake', 'haml' です。

````
$ gem install syntax_fix
$ rbenv rehash # rbenvを使っている場合
$ cd your-app-dir
$ syntax_fix -v # -vオプションで進行状況が表示される
Reading files...
/your-app-dir/config/application.rb [CHANGED]
/your-app-dir/config/routes.rb [CHANGED]
/your-app-dir/db/schema.rb [CHANGED]
.
.
.
Done!
$ git diff # 念のため変更内容を確認
````

##注意
変換後のテスト実行もお忘れなく！！
Excelブックの比較をする

# xdocdiffとWinMerge
技術者だとExcelブックを取り扱うことも多いと思います。大量のExcelブックを取り扱っていると、似たExcelブック同士を比較したいということも状況も多々発生すると思います。そういう時、WinMergeとxdocdiffプラグインを組み合わせて使えばExcelブックの比較ができます。

xdocdiffプラグインでExcelブックをテキストの形式に変換し、その変換されたテキストをWinMergeで比較するという流れです。グラフィカルに美しく比較をするというわけには残念ながら行きませんが、よく似たExcelブックの相違点をサッと確認したいという時に活躍すると思います。

# リンク
[WinMerge](http://winmerge.org)
[xdocdiff](http://freemind.s57.xrea.com/xdocdiffPlugin/)
コード説明で頻出する英語（動詞）

|英語|意味|
|:-----------|:------------|
| pass|引き渡す|
|return|返す|
|declare|宣言する|
|initialize|初期化する|
|call|呼び出す|
|iterate|繰り返す|
|enumerate|列挙する|
|define|定義する|
|refer to|参照する|
|set|設定する|
|assign|代入する|
|leave|出てくる|
|enter|入る|
|convert|変換する|
|evaluate|値を求める|
|run|実行する|
|fix|修正する|
|break|止める、壊す|
コーディングで使われる記号の英語名

|記号|英語名|
|:-----------:|:------------|
| ()|Parentheses, Round brackets|
|[]|Square brackets|
|<>|Angle brackets|
|{}|Curly brackets, Curly braces|
|-|Dash|
|~|Tilde, Swung dash|
|/|Slash, Forward slash|
|!|Exclamation mark, Bang|
|@|At|
|#|Pound sign, Hash|
|^|Caret, hat|
|%|Percent sign|
|*|Asterisk, Splat|
|\|Back slash, Whack|
Windowsのcmd.exeのcdついて少しまとめておく

Windowsのcmd.exe(コマンドプロンプト)にも、もちろん`cd`(Change Directory)コマンドがある。
<del>そもそもWindowsはディレクトリじゃなくてフォルダだろ、とかそういう話はさておき。</del>←Windowsのディレクトリはディスク上の物理的な保存場所の区切りのことです。

で、この`cd`にはいくつか、Linuxなどのbash、zshとの相違点がある。

一つ目は、`cd`と引数を何も与えず実行した場合だ。bashなどだと、環境変数HOMEで指定されたディレクトリへ瞬時に移動できて結構便利なのだが、マイクロなんたらがそんな機能を実装しているわけがない。
こんな結果になる。

<pre>
C:\Users\alucky0707>cd
<strong><em>C:\Users\alucky0707</em></strong>
</pre>

Qiitaがハイライトに対応していないせいでわかりづらくなっているが、一行目がプロンプト、二行目がその結果だ。
この場合、`C:\Users\alucky0707`というディレクトリで`cd`を実行した結果、`C:\Users\alucky0707`という文字列が返ってきている。
――つまり、無引数の`cd`は現在いるディレクトリを返す、ということだ。

cmd.exeを使っていてホームディレクトリ（ユーザーフォルダ）に戻りたくなるシチュエーションがあまり思いつかないが、bashみたいな挙動を期待すると涙をのむことになるので注意。

他には、ドライブ間を移動したいときに、Windowsにはデバイスファイルなんてないので、

<pre>
C:\Users\alucky0707>cd /d D:

D:\>
</pre>

のように`/d`オプション（奇妙に見えるかもしれないが、cmd.exeやWindowsのコマンド全般のオプションは`/`から始まる値として与える）を付けてドライブ名から絶対パスを入力する必要がある。

ちなみに、`/d`は`/D`でもよくて、さらに`/D`のあとに空白が無くても正しく動くので、

<pre>
C:\Users\alucky0707>cd /DD:
</pre>

などと打っても期待した動作になる。

あと、これは有名な話だが、Windowsのcmd.exe、というかファイルシステムはアクセス時に大文字小文字を区別しない。これは多分DOS時代の名残なんだろうが、あまりいい仕様ではないと思う。
こればっかりはどうしようもないが。
Symfony2 を composer でアップデート

6月11日に Symfony 2.3.1 がリリースされたので、早速アップデートしてみました。

まずは現在のバージョンを確認
※/home/foo/public_html 配下に Symfony2 がインストールされている想定です。

```shell-session:
[foo@bar ~]$ cd public_html    # ドキュメントルートへ移動
[foo@bar public_html]$ php app/console --version
Symfony version 2.3.0 - app/dev/debug
```

Symfony2 をインストールした時に使った composer.phar でアップデート

```shell-session:
[foo@bar public_html]$ php ../composer.phar update
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Removing symfony/symfony (v2.3.0)
  - Installing symfony/symfony (v2.3.1)
    Loading from cache

  - Removing symfony/icu (v1.0.0)
  - Installing symfony/icu (v1.2.0)
    Loading from cache

  - Removing symfony/swiftmailer-bundle (v2.3.0)
  - Installing symfony/swiftmailer-bundle (v2.3.1)
    Loading from cache

  - Removing sensio/distribution-bundle (v2.3.0)
  - Installing sensio/distribution-bundle (v2.3.1)
    Loading from cache

  - Removing sensio/framework-extra-bundle (v2.3.0)
  - Installing sensio/framework-extra-bundle (v2.3.1)
    Loading from cache

  - Removing sensio/generator-bundle (v2.3.0)
  - Installing sensio/generator-bundle (v2.3.1)
    Loading from cache

Writing lock file
Generating autoload files
Updating the "app/config/parameters.yml" file.
Clearing the cache for the dev environment with debug true
Installing assets using the hard copy option
Installing assets for Symfony\Bundle\FrameworkBundle into web/bundles/framework
Installing assets for Acme\DemoBundle into web/bundles/acmedemo
Installing assets for Sensio\Bundle\DistributionBundle into web/bundles/sensiodistribution
```

再度バージョンを確認

```shell-session:
[foo@bar public_html]$ php app/console --version
Symfony version 2.3.1 - app/dev/debug
```

ぱぱっと更新出来ました！
インターネットから隔離された状況でCPANモジュールを使う

別にCPANのモジュールに限った話ではないけど、
世の中にはインターネットから隔離された世界が存在しており、
そういった環境ではcpanコマンドでホイホイモジュールを入れられない。

という訳でそんなときにローカルで.pmファイル読み込むときのメモ

以下、Test::Simpleモジュールを入れるときの手順

##### CPAN本家からモジュールを入手し、何とか配置する

```shell-session:
# ls /usr/local/lib/perl
Test
# ls Test
Builder  Builder.pm  Harness.pm  More.pm  Simple.pm  Tutorial.pod
```

##### useで参照するライブラリのパスを追加
```pl:
use lib '/usr/local/lib/perl';
use Test::Simple tests => 1;

ok( $foo eq $bar, 'foo is bar' );
```


モジュールの意存関係が発生したときは自分で解決しないといけないので面倒だけど。。
each_with_index の index 値を 0 以外から開始させたい

each_with_index で index の値を利用する時、
たとえば 0 ではなく 1 から使いたい場合…

```rb:
%w(杏子 さやか マミ).each_with_index {|magica, i| puts "#{i + 1} #{magica}" }

# 1 杏子
# 2 さやか
# 3 マミ
```

とわざわざ +1 を書いたりするのはなんか面倒だ (´・ω・｀)

そんなときは `Enumerator#with_index(offset = 0)` の出番！
見ての通り、offset 値に任意の数値を指定できるのだ！

`Array#each` をブロックなしで呼ぶと、Enumerator 型のオブジェクトが返ってくるので、
そいつに `with_index` を呼んでやる。
パッと見、each_with_index に見間違えそうなくらい、そっくりに書けるのが (個人的には) COOL♪

```rb:
%w(杏子 さやか マミ).each.with_index(1) {|magica, i| puts "#{i} #{magica}" }

# 1 杏子
# 2 さやか
# 3 マミ
```

ちなみに Ruby 1.8.7 では with_index メソッドの引数で offset を指定することができないため、
この手法は使えません。
a-blog cms用テーマ「logical_jp」のヘッダロゴのカスタマイズ

logical_jpテーマで、ヘッダのロゴを画像のみとしたい場合の対応
https://github.com/webbingstudio/cms-theme-logical_jp

### 1. テンプレートの修正

/include/header/header_title.htmlを以下のように修正

- altにブログ名が入るようにする
- ロゴ部分をh1要素に変更する

```html:logical_jp_acms_header_title.html
<div id="headerTitle">
<!-- BEGIN_MODULE Blog_Field -->
<!-- BEGIN blogHeaderLogo@path:veil -->
  <h1 class="headerLogo"><img src="%{ARCHIVES_DIR}{blogHeaderLogo@path}" width="{blogHeaderLogo@x}" height="{blogHeaderLogo@y}" alt="%{BLOG_NAME}"></h1>
<!-- END blogHeaderLogo@path:veil -->
<!-- END_MODULE Blog_Field -->
<!-- /#headerTitle --></div>
```

### 2. ブログカスタムフィールドの修正

/admin/blog/field.htmlの145行目周辺に画像の高さ制限が指定（64px）されているので
ロゴ画像の高さに合わせて値を大きくする

```html:logical_jp_acms_field.html
・・・
      <input type="hidden" name="field[]" value="blogHeaderLogo" />
      <input type="hidden" name="blogHeaderLogo:extension" value="image" />
      <input type="hidden" name="blogHeaderLogo@height" value="64" />
      <p style="margin: 1em 0 0; padding: .5em; background: #FFF; border: 1px solid #D66;">高さ64ピクセル以上の、正方形に近い画像を用意してください。</p>
    </td>
・・・
```

### 3. CSSの調整

/resources/css/base.css のロゴ部分のスタイルを任意調整する
ファイル末尾のスマホ用も忘れずに
bash で直前の履歴を有効活用したい

#### 直前のコマンドの引数をそのまま使う

コマンドで長いパスを打って、また次の別コマンドで同じパスを打つのって面倒ですよね。
↑キーを押してカーソルを動かして、コマンドの部分だけ書き換えるなんて、あたしって、ほんとバカ…

そんなときは `!$` を使いましょう！
直前のコマンドの引数をそのまま参照してくれます♪

```
$ cat ~/madoka/magica/mami.txt
tiro finale!

$ rm !$
rm ~/madoka/magica/mami.txt
```

#### 直前のコマンド全体をそのまま使う

sudo を忘れてコマンド打っちゃうなんて、あたしって、ほんとバカ…

そんなときは `!!` を使いましょう！
直前のコマンドを、(オプションや引数も含めて) まるごと参照してくれます♪

```
$ rm -f /etc/madoka/magica/walpurgisnacht.txt
 rm: cannot remove `/etc/madoka/magica/walpurgisnacht.txt': 許可がありません

$ sudo !!
sudo rm -f /etc/madoka/magica/walpurgisnacht.txt
```

ちなみに `history` コマンドを打つと、コマンド履歴に連番が振られたリストが表示されますが、
その履歴の番号を利用して、例えば `!123` と打つと、その番号に紐付いたコマンドが実行されます。
もっと過去の履歴を活用したいときは、こちらの方法で。

```
$ history
    1  cd ~/madoka/magica/
    2  ls
    3  cat kyoko.txt
    4  history

$ !3
cat kyoko.txt
rosso phantasma!
```
String#underscoreとかString#camelcaseとか

```
# in rails console

"RubyOnRails".underscore  #=> "ruby_on_rails"
"RUBYOnRails".underscore #=> "ruby_on_rails"

"ruby_on_rails".camelcase   #=> "RubyOnRails"
"ruby_on_______rails".camelcase #=> "RubyOnRails"
```
R.javaが自動生成されない

久しぶりに、eclipse + Android SDKでAndroid向けアプリを作ろうとしたら、
「R.java」が自動生成されないせいで、エラーがでてコンパイル出来ない。

しょうがないので、いろいろググった結果、Android SDK Managerで
最新版になるまで更新する必要があるようだ。

参考：
[http://slumbers99.blogspot.jp/2013/05/eclipse-adt-22-android-sdk-manager-2.html](http://slumbers99.blogspot.jp/2013/05/eclipse-adt-22-android-sdk-manager-2.html)

参考サイトでは、更新は２回だけだが、これは環境によるようだ。
ともかく、最新になるまで更新する（すべての項目が"Installed"になればいい）。
少なくとも、”Android SDK Build-tools”がインストールされるまでは必要と思われる。


あと、[Android SDK Managerの起動](http://techfun.cc/android/mac-android-sdk-install.html)だが、macの場合、
（ADTをインストールしたディレクトリ）/sdk/tools/フォルダにある
その名も、androidというファイルがそれ。

![スクリーンショット 0025-06-12 19.58.39.png](https://qiita-image-store.s3.amazonaws.com/0/20722/0977fb9e-a342-b7e8-5c9e-777454774d6d.png)

Android SDK Manager本体も更新されたりするので、何度も起動しなおす必要がある。
Python で簡易 SMTP サーバを立てる


いつも忘れてググってるのでメモ。

```python
>>> import asyncore, smtpd
>>> smtpd.DebuggingServer(('localhost', 1025), None)
<smtpd.DebuggingServer listening localhost:1025 at 0x107a55d40>
>>> asyncore.loop()
```

インタラクティブシェル立ちあげて、上記のように書くだけ。
あとはメッセージが来ればその場に出力される。
sublime text で githubのMarkdown記法を使う

Sublime Textで、Markdown書こうと思って調べてみると、
[Markdown Preview](https://github.com/revolunet/sublimetext-markdown-preview)プラグインというのがよく引っかかります。
これを入れればとりあえず、Markdownを書いてブラウザでプレビューすることができるようになります。

ですが、Markdown標準だとちょっと使いづらいです。
コードブロックの表示にシンタックスハイライトがないからです。

例えば、[GitHub Flavored Markdown](https://help.github.com/articles/github-flavored-markdown)とかが使えると嬉しいです。
で、もう少し調べてみるとMarkdown Previewプラグインで"GitHub Flavored Markdown"が使えるらしい & 実際使えたのでメモしておきます。

https://github.com/revolunet/sublimetext-markdown-previewを見てみると

>NOTE: If you choose the GitHub API for conversion (set parser: github in your settings), your code will be sent through https to github for live conversion. You'll have Github flavored markdown, syntax highlighting and EMOJI support for free . If you make more than 60 calls a day, be sure to set your GitHub API key in the settings :)

と書いてあります。

どっかで設定できるのかなーと探してみると

```
Preferences -> Package Settings -> Markdown Preview -> Settings - Default
```

にそれっぽい設定項目があります。

13行目付近

```js

    /*
        Sets the default parser for converting markdown to html.
        Warning for github API : if you have a ST2 linux build, Python is not built with SSL o it may not work

        default - Use the builtin python-markdown2 parser
        github - User github API to convert markdown, so you can use GitHub flavored Markdown, see http://github.github.com/github-flavored-markdown/
    */
    "parser": "default",

```

38行目付近

```js

    /*
        Uses an OAuth token to when parsing markdown with GitHub API. To create one for Markdown Preview, see https://help.github.com/articles/creating-an-oauth-token-for-command-line-use.
    */
    // "github_oauth_token": "secret"
```

この辺りを変更すれば良いようです。
github_oauth_tokenは、https://help.github.com/articles/creating-an-oauth-token-for-command-line-use に詳細が載っています。

以下のように設定することで無事にgithub形式のMarkdownがSublime Textでプレビューできるようになりました。

```js:
"parser": "github",
"github_oauth_token": "取得してきたキー",
```

以上です。
coffee-scriptをよりrubyらしく書く方法

こんなコードがあったとします。

```coffeescript
onload = ->
  if 1 isnt 2
    setTimeout (-> console.log "hello"), 100
onload()
```

ナンセンスな無意味なコードです。
Ruby的な考えからするとなにかが足りない。そう、end ですね！

## coffeescriptでend を書く方法！

そうだendを定義すればいいんだ！

````coffeescript
end = null

onload = ->
  if 1 isnt 2
    setTimeout (-> console.log "hello"), 100; end
  end
end
onload()
```


うおーカッケー(棒)
FlexUnit メモ



FlexUnit
[FlexUnit](http://flexunit.org/)

リポジトリ
https://github.com/flexunit/flexunit
https://github.com/apache/flex-flexunit

FlexUnit4 のプロジェクトを作成する手順
[Setting up a FlexUnit 4 Project - FlexUnit4 Project Documentation](http://docs.flexunit.org/index.php?title=Setting_up_a_FlexUnit_4_Project)

テストの書き方いろいろ
[FlexUnit 4 in 360 seconds | Digital Primates](http://www.digitalprimates.net/author/codeslinger/2009/05/03/flexunit-4-in-360-seconds/)

簡単な日本語チュートリアル
[Flex 4 マスターシリーズ #11 FlexUnit 4 | デベロッパーセンター](http://www.adobe.com/jp/devnet/flex/articles/flex4_tutorials_no11.html)

上記よりさらに詳しいチュートリアル（英語）
[FlexUnit tutorial index](http://tutorials.digitalprimates.net/flexunit.html)

Hamcrest マッチャ関係
[drewbourne/hamcrest-as3 · GitHub](https://github.com/drewbourne/hamcrest-as3)

*  [Home · drewbourne/hamcrest-as3 Wiki](https://github.com/drewbourne/hamcrest-as3/wiki)

[hamcrest - Hamcrest - library of matchers for building test expressions - Google Project Hosting](http://code.google.com/p/hamcrest/)
[Tutorial - hamcrest - Hamcrest - library of matchers for building test expressions - Google Project Hosting](http://code.google.com/p/hamcrest/wiki/Tutorial)

Mockingフレームワーク
[mockolate * Mockolate?](http://mockolate.org/)

* [Dispatching Events with Mockolate Mocks](https://gist.github.com/drewbourne/1133025) Mockolate で生成された mock オブジェクトでイベントディスパッチする例

FlexUnit を CIサーバのタスクとして組み込む
[Continuous Integratation testing FlexUnit on CentOS](http://blogs.adobe.com/jgarnett/2011/03/13/continuous-integratation-testing-flexunit-on-centos/)
MySQLの特別なデータベース

app_で始まるDBに対して権限を付与したいときってちらほらあると思うのですが、どうやって実現すればいいか分からない。
それを調べてる中で、今日初めて知ったこともあったので、一緒にメモ。
\# phpmyadminで再現できるんだから出来るはずだよなー、と思いつつ調べるの面倒で調べてなかっただけです。

# test_で始まるDBは誰でも何でもできる
調べてくうちに、どうも[test], [test_%]なDBに対しては誰でも何でも出来ることが判明。
ググったらかなり情報出てきたんである種の前提知識っぽいんですけど、恥を忍んでメモ。絶対忘れるし。

# もともとの目的
で、まあこっちはかなり単純な話で。

```mysql:
grant all privileges on `app_%`.* to user@localhost identified by 'password';
```

考えてみればこれでいいんですよね。

130614追記
上のSQLだと、`app_test`のほかに`appa`とかにもマッチングしちゃうことに気付きました。

```mysql:
grant all privileges on `app\_%`.* to user@localhost identified by 'password';
```
RailsでMySQL VIEWを使うには?

MySQL上でVIEWを生成し、RailsからはModelとして認識させて振る舞いたい等のケースを想定しています。

PostgreSQL等では [rails_sql_views](http://activewarehouse.rubyforge.org/rails_sql_views/) という必殺gemがあるので大丈夫なんですが、
MySQLでは残念ながらそういうのが無いのです。


## migration時にSQLを実行してVIEWを作る
migrationでSQLを直接吐いてVIEWを作成します。
基本的にはこれだけで大丈夫です。

```ruby
class CreateMyView < ActiveRecord::Migration
  def self.up
    execute <<-SQL
      CREATE VIEW my_view AS SELECT ...
    SQL
  end
  def self.down
    execute <<-SQL
      DROP VIEW my_view
    SQL
  end
end
```

* [Rails 3.2.6 & database views creation through migrations](http://stackoverflow.com/questions/11666736/rails-3-2-6-database-views-creation-through-migrations)


## テストDB/CI対策
通常通りmigrationが進めば問題ないのですが、`rake test/spec` 等で利用するテスト用のDBに対しては、
通常 `rake db:test:prepare` によってDBスキーマが準備されます。

[A Guide to Testing Rails Applications](http://guides.rubyonrails.org/testing.html)によると

```
rake db:test:prepare
Check for pending migrations and load the test schema
```

となっています。どういうことかというと、

```
The rake db:migrate above runs any pending migrations on the development environment and updates db/schema.rb.
The rake db:test:load recreates the test database from the current db/schema.rb.
```

* 開発環境のmigrationによって db/schema.rb が生成される
* テストデータの準備などにはmigrationを行わず、db/schema.rbを参考にして一気にテーブル構造を準備する

といった動作がなされるということです。通常のケースであれば問題ないのですが、
今回のようなSQLを直接流しているような migration が含まれていた場合、
db/schema.rb からは正常にテーブルを再現できないケースがあります。
例えば、今回のケースだと `my_view` は物理テーブルとして作成されてしまう等です。
Travis等でテストをしている場合も同じ問題にあたると思います。

丁度、同じ問題にあたっている方がいらっしゃったので引用。

* [rake specでmigrationファイルからDBを生成したいとき](http://dfcblog.net/2013/03/rake-spec%E3%81%A7migration%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8B%E3%82%89db%E3%82%92%E7%94%9F%E6%88%90%E3%81%97%E3%81%9F%E3%81%84%E3%81%A8%E3%81%8D.html)

というわけでこの場合は、rake db:test:prepare を改造します。

```ruby
# Rakefile
Rake::TaskManager.class_eval do
  def remove_task(task_name)
    @tasks.delete(task_name.to_s)
  end
end

# lib/tasks/db/test.rake
Rake.application.remove_task "db:test:prepare"

namespace :db do
  namespace :test do
    task :prepare do
      system("rake db:drop RAILS_ENV=test")
      system("rake db:create RAILS_ENV=test")
      system("rake db:migrate RAILS_ENV=test")
    end
  end
end
```

これでテスト用DBもmigrationで作成するようになるので、ひとまず動作できるはず。
Travis CIを利用している場合は上記対策をしておけばこれだけで問題ないです。

```
# .travis.yml
script: "bundle exec rake test/spec"
```

`rake test/spec` でテストが走る前に改造された `db:test:prepare` がタスクとして動作するってことですね。
Partialクラスのファイルを元クラスの子として表示

#問題
Visual Studio 2010 (C#) にて。
クラスを分割定義するために partial クラスを複数ファイルに設置したりしますが
ソリューションエクスプローラ上で ～.Designer.cs ファイルは元クラスの子として表示されるのに、
自前で追加した cs ファイルは元クラスの子としては表示されず、フォルダ内に並列に表示される。
これはイケてない。

下の例で言えば、Form1.Hoge.cs は Form1.cs の子要素として表示したい。
![vs01.png](https://qiita-image-store.s3.amazonaws.com/0/25555/427c4f75-69eb-a152-188b-2c4aeeed3bdb.png)

#まず思いつく方法
直感的にドラッグ＆ドロップ・・・は効かないのです。

#csprojをいじります
目的のファイルが記述されている行を探し、

```sample.csproj&nbsp;(before)
    …
    <Compile Include="Forms\Form1.Hoge.cs" />
    …
```

こんな感じに書き替えます。

```sample.csproj&nbsp;(after)
    …
    <Compile Include="Forms\Form1.Hoge.cs">
      <DependentUpon>Form1.cs</DependentUpon>
      <SubType>Code</SubType>
    </Compile>
    …
```

DependentUpon で項目の親を指定し、
SubType で項目の種別を指定するわけです。

SubType を指定しないと、純粋なコードファイルであるにも関わらず、Visual Studio はこれをユーザコントロールとして認識してしまうので注意しましょう。（項目をダブルクリック一発でコードが開けない状態になる）

#結果
めでたく子扱いになりました。
![vs02.png](https://qiita-image-store.s3.amazonaws.com/0/25555/c05c9905-7df0-29b6-0c7c-067dd7ba7699.png)
RailsアプリでSSL+www付きに自動的にリダイレクトする設定


Rails3でsslに自動的にリダイレクトするのは、 `config/enviroments/production.rb` に

````ruby
config.force_ssl = true
````

の設定を入れればOKです。

ネイキッドドメインにアクセスが来た場合に自動的にリダイレクトするには `rack-canonical-host` のgemを利用します。

Gemfile

````ruby
gem 'rack-canonical-host'
````

config/initializers/canonical_host.rb

````ruby
require "rack/ssl"

unless Rails.env.development?
  Rails.application.config.middleware.insert_before Rack::SSL, Rack::CanonicalHost, ENV["APP_HOST_NAME"]
end
````

のように設定を入れておきます。
wwwつきのURLを環境変数 `ENV[APP_HOST_NAME]`に入れている場合のサンプルです。

ここでのポイントは、 insert_before で SSL のmiddleware の前に入れていることです。そうすることで、

http://example.com にアクセスが有った場合に

http://www.example.com にリダイレクト

https://www.example.com にリダイレクト

となります。もしSSLへのリダイレクトが先に来ると、 https://example.com にアクセスすることになりSSLエラーが出る可能性があります。
gaで任意のURLへのアクセスを記録


google analytics慣れてないからこまる。

公式を読むのがやっぱり大事。

- [Page Tracking - Web Tracking (analytics.js) - Google Analytics — Google Developers](https://developers.google.com/analytics/devguides/collection/analyticsjs/pages)

```
// ga登録
ga('create', 'UA-XXXX-Y');

// 現在のページへのアクセスを記録
ga('send', 'pageview');

// ページのURLをカスタムしてアクセスを記録
ga('send', 'pageview', '/toppage');

// clickがあったときにアクセスを記録
$button.on('click', function () {
  ga('send', 'pageview', '/toppage/clickbutton');
});
```

gaでアクセスするやつと_gaqでアクセスするやつって何が違うんだっけ。
Puppetのfileでディレクトリを再帰的に作る方法

以下、Boxen の個人マニフェストから抜粋。

```ruby
  package {
    ...(略)...
    'rbenv-bundler':
      require => File["${homebrew::config::installdir}/var/lib/rbenv/plugins/"]
      ;
    ...(略)...
  }

  file { [
          "${homebrew::config::installdir}/var/",
          "${homebrew::config::installdir}/var/lib/",
          "${homebrew::config::installdir}/var/lib/rbenv/",
          "${homebrew::config::installdir}/var/lib/rbenv/plugins/",
          ]:
    ensure  => directory,
  }
```

よく分からないまま、配列指定したら連鎖してくれた。
tmuxのインストールと設定

tmuxのインストールと設定手順

### rpmforgeレポジトリを追加

```
wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
rpm -ivh rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
vim /etc/yum.repos.d/rpmforge.repo
# enabled=0にする
```

### tmuxのインストール
```
yum install --enablerepo=rpmforge tmux
```

### 設定ファイル作成

```
cat > ~/.tmux.conf <<EOS
# utf-8環境
setw -g utf8 on
set -g status-utf8 on

#全てのベルを無視
set-option -g bell-action none
# ウィンドウ番号基準値
set-option -g base-index 1
# ウィンドウの自動リネームoff
set-window-option -g automatic-rename off
#ウィンドウで動作があるとステータスラインでハイライト
set-window-option -g monitor-activity on

# コピー、選択モードのキーバインドvi
set -g mode-keys vi

# プレフィックスキー C-t
unbind C-b
set-option -g prefix C-t

# 設定ファイル再読み込み r
bind r source-file ~/.tmux.conf

# 直前のウィンドウ t
bind C-t last-window

# デタッチ d
bind d detach

# タイトル変更 A
bind A command-prompt "rename-window %%"

# ウィンドウ選択画面
bind Space choose-window

# 新ウィンドウ作成
bind c new-window

# 分割していたペインそれぞれをWindowに
bind b break-pane

# ペイン終了
bind k kill-pane
# ウィンドウ終了
bind K kill-window

# ペイン番号表示
bind i display-panes

# ペインの縦分割
bind H split-window -v
# ペインの横分割
bind v split-window -h

# ペインの移動
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

# 文字色と背景色
set -g status-fg black
set -g status-bg white

# 現在のウィンドウの色
set-window-option -g window-status-current-fg   white
set-window-option -g window-status-current-bg   blue

# rbenv localを使えるようにする
set-environment -gu RBENV_VERSION

EOS
```

### よく使うコマンド

```
# セッション作成
tmux new -s {session-name}
# アタッチ
tmux a(attach)
# デタッチ
tmux detach -s {target-session}
# セッション一覧
tmux ls(list-session)
# クライアント一覧
tmux lsc(list-client)
# キーバインド一覧 
tmux list-keys

# コピーモード
コピーモード開始 C-t [
コピー始点選択 Space
コピー終点選択 Enter
貼り付け C-t ]
```
OMakeで「OCaml.om: line 563,」と言われたときの対処法

```text:
File /usr/lib/omake/build/OCaml.om: line 563,
failed on target: hoge.cmi
```
これは hoge.mli に問題があって、cmiファイルを作れないよーということ。
hoge.mliを書き換えて問題のある箇所を特定しよう。

例えば自分は次のようなタイプミスをしてこのエラーが出た。

```ocaml:hoge.mli
type t
val create : int -> Hoge.t
```
Hogeモジュールのインターフェイスを定義してる中で、Hogeを参照してしまっているのが問題。正しくはこうでした。

```ocaml:hoge.mli
type t
val create : int -> t
```
herokuでデプロイ時に処理を実行する

デプロイ時に何か処理をしたいって時がありますよね。
私の場合、memcached に記録されているキャッシュの削除を行いたいと思い、方法を探しました。
[deploy hooks](https://devcenter.heroku.com/articles/deploy-hooks) というアドオンもあるのですが、やりたいのはコマンド実行なのでちょっと目的に沿わず。
いろいろと調べて、heroku の deploy 時に必ず実行される、`rake assets:precompile` の処理に居候する方法を見つけました。

方法は簡単。
./lib/tasks/clear_cache.rake というファイルを作ってこんなコードを書けば良いです。

```rb:./lib/tasks/clear_cache.rake
# clear cache when application deployed.

if Rake::Task.task_defined?("assets:precompile:nondigest")
  Rake::Task["assets:precompile:nondigest"].enhance do
    Rails.cache.clear
    pp 'Cleared Rails cache.'
  end
else
  Rake::Task["assets:precompile"].enhance do
    # rails 3.1.1 will clear out Rails.application.config if the env vars
    # RAILS_GROUP and RAILS_ENV are not defined. We need to reload the
    # assets environment in this case.
    # Rake::Task["assets:environment"].invoke if Rake::Task.task_defined?("assets:environment")
    Rails.cache.clear
    pp 'Cleared Rails cache.'
  end
end
```

この手法のネタ元はこちら。
[Clear Memcached on Heroku Deploy](http://stackoverflow.com/a/14524721)

ちなみに、試して実際にうまく言ったものの、この手法は採用しませんでした。
有効期限なしのアクションキャッシュやフラグメントキャッシュを適用している view を修正した時に、キャッシュの消し忘れを防ぐためにこの方法を探し当てたんですけどね。
やってみると分かりますが、キャッシュの削除から デプロイとローンチ（WebDyno の再起動）まで結構な間があるんですよ。
せっかく削除しても WebDyno が再起動に入る前に対象の view へのリクエストがあると、古い view のキャッシュが生成されてしまうので、やっぱりデプロイ作業が完全に終わった後に消さないとだめっぽいなあ、という結論になりました。
[MemCachier](https://devcenter.heroku.com/articles/memcachier) を使うのでGUI操作でもキャッシュの削除ができるのはいいんですが、何かいい方法ないかなあ。。。

####参考までに
---------------------------------------

同様の手法は asset pipeline 依存Gemである [asset_sync](https://github.com/rumblelabs/asset_sync) でも取られています。
このGemは assets 配下の静的ファイル群を AWS S3 などにコピーすることでサイトのパフォーマンスアップを図ることができるというもの。
依存の都合上 `bundle exec rake assets:precompile`  の実行後に動く必要があるんですね。
ソースを確認すると分かりますが、こんなコードが置いてあります。

```rb:lib/tasks/asset_sync.rake
if Rake::Task.task_defined?("assets:precompile:nondigest")
  Rake::Task["assets:precompile:nondigest"].enhance do
    AssetSync.sync
  end
else
  Rake::Task["assets:precompile"].enhance do
    # rails 3.1.1 will clear out Rails.application.config if the env vars
    # RAILS_GROUP and RAILS_ENV are not defined. We need to reload the
    # assets environment in this case.
    # Rake::Task["assets:environment"].invoke if Rake::Task.task_defined?("assets:environment")
    AssetSync.sync
  end
end
iOS 電卓のように数字を3ケタずつカンマで区切ったNSStringを作る

![スクリーンショット 2013-06-12 14.52.24.png](https://qiita-image-store.s3.amazonaws.com/0/21397/60ffd0f2-8456-6388-1d1e-d907d3ae7f5f.png)

電卓アプリとか、数字を入力したり、金額を入力したりする場合は、例えば「1,280」のように三桁ずづカンマで区切ったNSStringを生成して、UILabel等に表示したい場合があります。

```objc:
- (NSString *)createStringAddedCommaFromInt:(NSInteger)number
{
    NSNumberFormatter *format = [[NSNumberFormatter alloc] init];
    [format setNumberStyle:NSNumberFormatterDecimalStyle];
    [format setGroupingSeparator:@","];
    [format setGroupingSize:3];
     
    return [format stringForObjectValue:[NSNumber numberWithInt:number]];
}
```
このメソッドにint型の数字を送ると3桁ずつカンマで区切ったNSStringを生成してくれます。

NSNumberFormatterで3桁ずつカンマでグルーピングするように設定しています。
tinyint なカラムを migration スクリプトで使用する



```
      t.tinyint  :age
```

のようにセクシー(?)に書くことはできない。
以下のようなオールドスタイルで書くことができる。

```
      t.column  :age, :tinyint
```

## 参考

http://guides.rubyonrails.org/migrations.html#supported-types
XtreemFSをLinux上に導入する方法

分散ファイルシステムはHDFSとかGlusterFSとかGfarm2とかある中でXtreemFSが日本では全くといっていいほど取り上げられていないので簡単に設定する手順をメモすることにした。

## 1.希望のOSのStable Packagesを選んで説明通りインストールする
###備考
`/etc/xos/xtreemfs/`
ディレクトリにコンフィグファイルがあるのでファイルの保存場所やネットワークのポートなどの設定を編集する。

## 2.dir mrc osdとデーモンがあるのでそれら３つを起動する
- dir : ディレクトリサービス
- mrc : メタデータ　レプリカ　カタログ
- osd : オブジェクト　ストレージ　デバイス

dirとmrcは極力フォールトトレラントなハードウェア上で実行しよう。

###備考
osdはxtreemfsが1.5にバージョンアップしてから１OSの中で複数起動できるスクリプトが付属されるようになった。
`xtreemfs-osd-farm`
がそれである

###注意
- init.dのスクリプトのrunlevelはLinuxのディストリビューション毎に微妙に違ったりするので各自編集するように
- 使用するコンフィグファイルやファイル保存先のディレクトリをしっかりchmod chownを確認しよう。デフォルトならばxtreemfs:xtreemfsである。

## 3.

## 4.運用で使用するコマンドとか

- /xtreemfs　：マウントポイント

###256KBブロックで４つのレプリカ
`xtfsutil --set-dsp -p RAID0 -w 4 -s 256 /xtreemfs`

###書き込み読み込みは大半に適応したら成功　３つのレプリカ　
`xtfsutil --set-drp --replication-policy WqRq  --replication-factor 3 /xtreemfs`

###/xtreemfs内のファイルにxtfsutilを適用させるコマンド

`find /xtreemfs -name "*" -exec xtfsutil オプション {} \;`



##etc...
[XtreemFS HD1 benchmark2.png](https://qiita-image-store.s3.amazonaws.com/0/25682/6c5f39f0-3640-89d0-5128-8c401e88ed7e.png)


自ブログ上での簡易メモ
http://d.hatena.ne.jp/studiokingyo/20130611
mb_convert_encodingのautoが危険な理由

**mb_convert_encoding** ( string *$str* , string *$to_encoding* [, mixed *$from_encoding* ] ) は文字エンコーディングを変換する関数です。

## mb_convert_encodingに潜む問題
第3引数の *$from_encoding* には変換前の文字エンコーディング名を指定しますが、ここを"**auto**"と指定しておくと、環境によっては

*Warning: mb_convert_encoding(): Unable to detect character encoding*

のようなエラーが発生し、文字エンコーディングの変換が失敗する場合があります。

ですので、"**auto**" は極力使わず、文字エンコーディングを指定することをおすすめします。

## autoとphp.iniの依存関係
なぜこのようなエラーが発生するかというと、autoはphp.iniの言語設定によって挙動が変わってしまうからです。

> "auto" が指定された場合、この文字列は 言語設定 (NLS) ごとに定義されたエンコーディングのリストに変換されます。たとえば、言語設定が Japanese の場合は "ASCII,JIS,UTF-8,EUC-JP,SJIS" です。
http://www.php.net/manual/ja/mbstring.supported-encodings.php

ちなみに言語設定はphp.iniのmbstring.languageに設定してあり、デフォルトは"neutral"が設定してあります。

## mb_convert_encodingとうまく付き合うには
### autoは使わない
autoは指定せずに適切なエンコーディングを指定しましょう。
autoを指定したい場合は代わりに、"ASCII,JIS,UTF-8,EUC-JP,SJIS"と設定しましょう。

### php.iniを変更する
もしくは、php.iniに **mbstring.language = Japanese** を指定しておけばautoと指定した場合は"ASCII,JIS,UTF-8,EUC-JP,SJIS"として認識されます。
しかし、この方法はphp.iniとの依存関係が強くなるためあまりおすすめできません。

### mb_language関数を使用する
php.iniを変更するのが難しい場合は、mb_convert_encodingの前に **mb_language("Japanese");** と指定する方法もあります。
The Twitter REST API v1 is no longer active. Please migrate to API v1.1. https://dev.twitter.com/docs/api/1.1/overview



ログイン用と登録用でＡＰＩ対応に抜けがあったために遅れて発現したエラーでした。

opauthを利用していたのですが、ストラテジーファイルとか、設定ファイルの

'verify_credentials_json_url' => 'https://api.twitter.com/1/account/verify_credentials.json',

を

'verify_credentials_json_url' => 'https://api.twitter.com/1.1/account/verify_credentials.json',

に変更して対応。

'oauth_version'					=> '1.0',
を間違って
'oauth_version'					=> '1.1',

にしちゃったりもしたけど、こっちは関係ないので現状維持で。
SpringのFlashAttributeはRedirectViewしか返せない

    @RequestMapping(value="addcustomer", method=RequestMethod.POST)
    public String addCustomer(@ModelAttribute("customer") Customer customer,
            final RedirectAttributes redirectAttributes) {
 
        redirectAttributes.addFlashAttribute("customer", customer);
        redirectAttributes.addFlashAttribute("message","Added successfully.");
 
        return "redirect:showcustomer.html";    
    }

"redirect:"からはじまるStringはRedirectViewに変換されるのでFlashAttributeが使える
たとえば返り値が@ResponseBodyだとFlashAttributeは使えない。

org.springframework.web.servlet.mvc.support.RedirectAttributes to specify the exact set of attributes to use in case of a redirect and also to add flash attributes (attributes stored temporarily on the server-side to make them available to the request after the redirect). RedirectAttributes is used instead of the implicit model if the method returns a "redirect:" prefixed view name or RedirectView.
スレッドのメイン関数をクラスのメンバ関数として定義する@C++

# スレッドのメイン関数をメンバ関数にしたい！

たまに使って、そのたびに忘れてしまうのでメモです。

スレッドのメイン関数をクラスのメンバ関数として定義したい場合があります。
ですが、一般にスレッドのエントリ関数はstaticな関数を要求されます。

そこで、

- staticな関数を用意し、そこにインスタンスを渡してから実行する(A)
- bindなのでメンバ関数をstaticとして扱えるようにする(B)

この2種類の方法を考えました。
(もっと良い方法があれば教えて下さい)

試したスレッドライブラリは

- boost::thread
- pthread

です。

c++11のスレッドは試していません。がboost::threadと同じようになってくれることを期待したいです。

# 結果

ざっくり表にまとめると以下のような感じです。

boost::threadはA,Bどちらも上手くいきました。
pthreadは少し面倒でどうしても関数ポインタを引数に求めるので、上手くbindとかで渡せませんでした。

|スレッドライブラリ|A|B|
|------|--------|----|
| pthread |OK|NG|
|boost::thread|OK|OK|
OK:メンバ関数をスレッドのメインとしてから呼び出せた
NG:できなかった


# 書いたコード

## pthreadでA方式

LaunchMemberFunctionというstaticな関数を定義して
reinterpret_castでインスタンスからメンバ関数呼び出しを行なって
実現しています。

```cpp:pthread.cpp

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <iostream>
#include <sys/types.h>

#include <functional> 
using namespace std;

class MyClass {
  public:
    void function() { 
        std::cout << "Hello,World" << std::endl;
        return;
    };
};

void* LaunchMemberFunction(void *obj)
{
    MyClass *myClass = reinterpret_cast<MyClass *>(obj);
    myClass->function();
    return NULL;
}
 
int main() {
    MyClass myObj;
    pthread_t thr;
    pthread_create(&thr, NULL, LaunchMemberFunction, &myObj);
    pthread_join(thr,NULL);
}

```

## boostでB方式

boost::bindなどを駆使してメンバ関数をスレッドに渡してあげると
動作しました。

```cpp:boost.cpp
// boost-thread.cpp

// boost::threadを使う場合
#include <iostream>
#include <boost/thread.hpp>
#include <boost/bind.hpp>
using namespace std;
using namespace boost;
 
// メンバ関数をマルチスレッドで実行
 
class MyClass {
 public:
  void run() { 
    cout << "hello,world" << endl;
  }
};
 
 
int main() {
  MyClass myClass;
 
  thread thr_main(bind(&MyClass::run, &myClass));
 
  thr_main.join();
  return 0;
}

```
ReactiveCocoaに出てくる用語の整理

StreamとかSignalなどの用語の意味は[ReactiveCocoa/Documentation/FrameworkOverview.md at master · ReactiveCocoa/ReactiveCocoa · GitHub](https://github.com/ReactiveCocoa/ReactiveCocoa/blob/master/Documentation/FrameworkOverview.md)に書いてある．
以下それらの用語まとめ

## Stream (RACStream)
変化する一連の値(オブジェクト)を表す．値が変化する順番にしか取れない．
HaskellのモノイドとかMonadZipのような型クラスと同等のものを実装している．
Stream自体を直接使うことは少なく(RACStreamは抽象クラス)，signalsやsequencesとして使うことが多い．

## Signal (RACSignal)
push-drivenなstream．
処理が実行されたりデータを受け取ると，シグナルにより値が送られる(? 原文: "values are _sent_ on the signal")．値にアクセスするにはsignalをsubscribeする必要がある．
シグナルが送るイベントには以下の3種類がある

- **next**: ストリームから来た新しい値．値がnilになることもある
- **error**: シグナルが完了する前にエラーが起きたことを示す．イベントはNSErrorを含むかもしれない
- **completed**: シグナルが完了し，もう新しい値はstreamに追加されないことを表す．

シグナルは**next**がn回後**error**か**completed**が一度起きて終わる．(n=0~)

### シグナル購読
**購読者**はシグナルからのイベントを待つ(待てる)何か．RACでは購読者はRACSubscriberプロトコルに準拠したオブジェクトなら良い．

**購読**は[-subscribeNext:error:completed:](https://github.com/ReactiveCocoa/ReactiveCocoa/blob/master/ReactiveCocoaFramework/ReactiveCocoa/RACSignal.h)などのメソッドで作成される．

シグナルが完了/エラー時に購読は破棄されるが，手動で止めることもできる(RACDisposable)

### Subjects (RACSubject)
subjectは手で制御できるシグナル(mutableなシグナル)．**nextやcompleted, errorなどのイベントを自由に送れる．**
RACでないコードとシグナルを利用したコードを繋ぐのに便利．例えばブロックの複数コールバック内でアプリケーションロジックを制御するかわりに，共有されたsubjectにブロック内からイベントを送るなど．

### Commands (RACCommand)
何かのアクションへの反応としてトリガーされるシグナル．主にUI-drivenな操作で使う．例えばボタンがクリックされたときにsignalにより自動でdisableにする，など．
RACはNSButtonに`rac_command`プロパティを付けてくれる

### Connections (RACMulticastConnection)
connectionは任意の数の購読者と共有される購読(subscription)
シグナルはデフォルトでは購読されるたびに処理が走り，新しい値を取得するが，これは処理の種類によっては問題になる(例えばネットワークアクセスなどの重い処理)．
(RACSignalの`-publish`や`-multicast:`メソッドで作られる)connectionは何度購読されても購読は1つだけ作成する．
そして一度接続されると(connectionのシグナルがhotになるという)全てのsubscriptionが捨てられるまではその唯一のsubscriptionを保持している(=新規にsubscriptionを作成することはしない)

## Sequences (RACSequence)
pull-drivenなstream．Sequenceが持つ値は遅延評価され，またnilを含むことはできない．(NSArrayなどと同じ)
RACは`-rac_sequence`メソッドをCocoaの各コレクションに追加してくれる．

### Disposable (RACDisposable)
RACDisposableはキャンセルやリソースのcleanupのためのクラスだが，シグナルの購読解除に最もよく使われる．
subscriptionがdisposeされると，購読者は以降イベントを取得しない．またsubscriptionに関連する処理(ネットワークリクエストやバックグラウンド処理など)は全てキャンセルされる．

## Schedulers (RACScheduler)
シグナルの連続した実行キュー

## Value types
### RACTuple
定数サイズのコレクション，nilを含むことができる
### RACUnit
シングルトンな空value．steram内で使われる
### RACEvent
任意のシグナルイベントを表す．

## Foundation Support
Foundation classes向けのRAC-basedブリッジはフレームワークには入ってないので，使いたければ`RACExtensions`を使ってね
SorceryのTwitter API1.1対応

NoamB / sorcery でTwitter API1.1での認証に対応
エンドポイントを変えてやれば良いので`/config/initializers/sorcery.rb`の一番上などに

```ruby
Sorcery::Controller::Submodules::External::Providers::Twitter::TwitterClient.class_eval do
  @user_info_path = "/1.1/account/verify_credentials.json
end
```

とかでOK
githubのPull Requestをレビューするときによく使うコマンド

`git show-branch --merge-base`を使い，以下を実行すると"masterから分岐させた時点からHEADまでの最新コミット一覧"を取れる．

```sh
$ git co some-branch-to-review
$ tig --reverse master...HEAD
```

## 参考
[git-show-branch(1): branches/their commits - Linux man page](http://linux.die.net/man/1/git-show-branch)
[現在のブランチで加えた変更を見る #git - Qiita](http://qiita.com/items/ab52a7e834422a6f9662)
jQueryプラグインChosenの使い方

ブログに書いたよ。
<a href="http://d.hatena.ne.jp/replication/20130612/1370997189">jQueryプラグインChosenの使い方 - 大人になったら肺呼吸</a> <a href="http://b.hatena.ne.jp/entry/d.hatena.ne.jp/replication/20130612/1370997189"><img src="http://b.hatena.ne.jp/entry/image/http://d.hatena.ne.jp/replication/20130612/1370997189" alt="はてなブックマーク - jQueryプラグインChosenの使い方 - 大人になったら肺呼吸" border="0" /></a>
homebrewでのopensslインストールではまった

 * rvmでjrubyインストールしようと思ったらopensslが入らなくてはまった
 * 解決できたので手順をメモしておく

## 発生した現象

 * opensllインストール時にmake testでエラーになる
 
```bash:
$ brew install openssl
...
==> make test
140735260213724:error:25070067:DSO support routines:DSO_load:could not load the shared library:dso_lib.c:244:
140735260213724:error:29064065:lib(41):BIO_ZLIB_NEW:zlib not supported:c_zlib.c:478:
cmp: EOF on ./p.zlib.clear
make[1]: *** [test_enc] Error 1
make: *** [tests] Error 2
...
```

## 対策

 * [brew install openssl (1.0.1e) fails with dso_lib.c and c_zlib.c](https://github.com/mxcl/homebrew/issues/20397)を参考にしてbrew doctorで出てくる内容を対策したら解決した

 * brew doctorで出ていたのは以下の内容

```bash:
$ brew doctor
Warning: Setting DYLD_* vars can break dynamic linking.
Set variables:
    DYLD_FALLBACK_LIBRARY_PATH

Warning: Some installed formula are missing dependencies.
You should `brew install` the missing dependencies:

    brew install cloog isl

Run `brew missing` for more details.

Warning: /usr/bin occurs before /usr/local/bin
This means that system-provided programs will be used instead of those
provided by Homebrew. The following tools exist at both paths:

    git
    git-cvsserver
    git-receive-pack
    git-shell
    git-upload-archive
    git-upload-pack
    gitk

Consider amending your PATH so that /usr/local/bin
occurs before /usr/bin in your PATH.

Warning: Your Homebrew is outdated.
You haven't updated for at least 24 hours, this is a long time in brewland!
To update Homebrew, run `brew update`.
```

### DYLD_FALLBACK_LIBRARY_PATHに対する対応
 * DYLD_FALLBACK_LIBRARY_PATHを~/.bashrcで設定していたがunsetする

### cloog islのインストール対応
 * islをhttpサイトからダウンロード => 503 => ftpサーバーからダウンロード => エラーになっていた
 * http_proxyは設定していたがftp_proxyを設定していなかったため設定したらインストールOK

### pathの対応
 * 暫定対応としては以下のようにした

```bash:
$ export PATH=/usr/local/bin:$PATH
```

 * 恒久対応としては/etc/pathsで/usr/local/binを一番上にすれば良いかな？
  * [path_helper - ikeasの日記](http://d.hatena.ne.jp/ikeas/20090925/1253899650)参照

### homebrew updateの対応

```bash:
$ brew update
```
CentOS 6.2 でcpan install が失敗したときの対応

Cent OS 6.2 でCPANを使ってモジュールをインストールしようとしたら、上手くいかなかったのでその対応メモ

#####バージョン確認
```
# cat /etc/issue
CentOS release 6.2 (Final)

#perl -v
This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi
```

##### CPANでモジュールインストール
```
cpan[1]> install Test::Simple
・・・
Can't locate Test/Harness.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/share/perl5/ExtUtils/Command/MM.pm line 50.
```

perlのバージョンが古いのかモジュールが壊れているのかわからないが、
perlのバージョンをあげてみることにする。

##### perlのソース(5.18)を入手
```
# wget http://www.cpan.org/src/5.0/perl-5.18.0.tar.gz
# tar zxvf perl-5.18.0.tar.gz
```

##### インストール
既存のperlとかぶると面倒なので、/usr/local/以下にインストールする

```
# cd perl-5.18.0
# ./configure.gnu –prefix=/usr/local/perl
# make
# make test
# make install
・・・
# ls /usr/local/perl
// perlがインストールされていることを確認
```

##### PATHの設定
```
# cd ~
# vi .bashrc
 //以下を追記
export PATH=/usr/local/perl/bin:$PATH
# . .bashrc
# perl -v
This is perl 5, version 18, subversion 0 (v5.18.0) built for x86_64-linux
```

perlを5.18上げてからcpan installすると、うまく動いた。
chef実行時 WARN: Cloning resource attributes ... が出る場合

chef実行時 WARN: Cloning resource attributes ... が出る場合

http://tickets.opscode.com/browse/CHEF-3694

```rb:
%W{ ruby ruby1.8 ruby1.8-dbg ruby1.8-dev libruby libruby1.8 }.each do |package|
  package "ruby dep" do
    name pack
    action :install
  end
end
```

のように、名前を固定にしたまま、複数のリソースが実行される場合に警告が出る。
この場合名前が毎回変わるようにすれば、警告は出なくなる。
git svnからgitへ移行する時のコマンドの違いについてまとめる


軽くまとめてみた。なるべく事故が起こらないような気持ちを込めて。

####事前準備
- 公開鍵の設定（ちょっと趣旨と外れるけど）
 - Account settings→SSH Keys→Add SSH keyで、タイトルを適当につけて、ローカルのid_rsa.pubの中身をコピペ（この辺は以下のサイトにのってた）  
http://blog.glasses-factory.net/2011/08/16/github  
 - 自分のブログでも軽く触れてます。  
http://mapyo.hatenablog.com/entry/20120219/1329674034
- リモートリポジトリの追加
 - `git remote add リモートリポジトリの名前 URL`
 - とりあえずリモートリポジトリの名前って書いたけど、自分で好きに付けていい。
- ちゃんと追加出来てるかの確認
 - `git remote -v`
 - それっぽいものが出てたら大丈夫（笑）

####今まで使ってたコマンドの違い
基本的に`git svn`として使ってたもの全てが変わると思ってよいはず。

- `git svn fetch`
 - `git fetch`
 - そんなに使う機会はないのかなぁ。という印象
- `git svn rebase`
 - `git pull リモートリポジトリの名前 リモートリポジトリのブランチ名`
- `git svn dcommit`
 - `git push リモートリポジトリの名前 リモートリポジトリのブランチ名`
- `git svn branch ほげほげ`して、ローカルにとってくるくだり。
 - 使わない。リモートブランチを作りたい場合は、以下。ローカルブランチ作って、リモートリポジトリに上げるイメージ。  
`git checkout master`→master以外のローカルブランチでもいいよ  
`git pull リモートリポジトリの名前 master`→ローカルブランチのmasterの内容を最新にする。  
`git checkout -b ほげほげ`  
`git push リモートリポジトリの名前　ほげほげ`→これでリモートリポジトリに、ほげほげという名前のリモートブランチが出来る。

####補足
- `git pull`でコンフリクトが起きた時に元に戻す  
→`git reset --merge`
- `git fetch`と、`git pull`の違いについてはこちら  
http://qiita.com/items/e082d64f3f8b424e9b7d
  - fetchはリモートから情報をとってくるだけ。pullは情報を取ってきて、マージしてくれるイメージ
- 今までgit svnで使ってたフォルダ上で特に意識せずに使える。でも、git pushした後に、git svn dcommitとかしちゃうと、事故が起こりそうな予感がしてならない。気のせいかもしれないけど。
- zsh使ってたら補完が出来るので楽になるよ  
[zshでgitのコマンドやブランチ名を補完できるようにする](http://mapyo.hatenablog.com/entry/2013/05/26/zsh%E3%81%A7git%E3%81%AE%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%84%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E5%90%8D%E3%82%92%E8%A3%9C%E5%AE%8C%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99)
- 自分で適当に一通り作業してみるのが一番いいよ。バージョン管理してるから、少々の事が起きても戻せるはず！たぶん。
- まだ未熟者なので間違ってたら誰か補足お願いしますー

####参考元
http://transitive.info/article/git/command/pull/
Websocket環境構築まとめ


現時点におけるwebsocketというかpush通信に関するメモ。
次の4条件を満たす環境があったら教えてください。
実装が簡単で、CORSでごちゃごちゃ言われず、scale outが容易で、安価。

##結論
いまだ最強のwebsocket環境は決まっていない。
用途によってかわりすぎる。

##GAE
Channel apiでpush通信を実現できる。実装がとても簡単な上にスケーラブル。しかし、デフォでCORS対応をしていない。いろいろなところでCORS対応してるとかしてないとか書いてあるが、筆者はできなかった(実装方法を知ってる方は[こちら](https://groups.google.com/forum/?hl=ja&fromgroups#!topic/google-app-engine-japan/wVwfUUhD4jc)にご返答ください)。
松尾さんがAdvocateする役割でなくなってしまったため(?)、サポートのパワーダウンの感が否めない。

##AWS
色々な方法でwebsocket自体は実現できるし、CORSの問題もないが(そもそもwebsocketはsame origin policyの制限がない)、scale outが難しい。サーバを複数台立ち上げている場合、サーバAとコネクションを張っているときにユーザがサーバBに対してリクエストしても、サーバAからプッシュしなければ通信できないので、そこをうまいことやらなければならない。
pub/subモデルというものでこの課題は解決できる(らしい)が、自前でつくるのはしんどそう。

##Pusher
実装が簡単っぽい上にスケーラブルでCORSも問題ない。1年くらい前に友人が使っていたときは個別のユーザーにpushできなかったがそれもできるようになったっぽい。ただ、値段がけっこうするので、awsで自前で環境作ってscale upで対応した方が安いし簡単なのでは…？とちらりと思ったが実際のところはよくわからない。
##Heroku
websocketに対応してない。負荷分散を考える場合、AWSの問題と同様、単純にアプリサーバをスケールアウトすればいいってもんじゃないので、対応はけっこう難しいのではないかと思ったりしないでもないが、よくわからない。pusherっぽい感じでプラグインとかででるのかな。
写経していて思うこと

初投稿です

テキストを買う際は出来るだけ発行日が最近の物を選んでいるんですが、Sampleコードどおり写経してもXcodeが怒っている時があります。

その代表格というか、多く見られるのが

##ViewController.h
@property (weak, nonatomic) IBOutlet UIImageView *imageView;

##ViewController.m
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];

**imageView.image** = image;

---

上記の場合、imageView.image は、self.imageView.imageなのではないでしょうか？
テキストを２冊購入して、そのどちらもこの書き方だったんで、Xcodeが激おこぷんぷん丸でした。