OmniAICreator/Qiita-1.07M huggingface dataset:
第9回オフラインリアルタイムどう書く参考問題をC++で解く

```cpp
#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <algorithm>

namespace
{
std::vector<std::string> filter(const std::vector<std::string> & v)
{
    std::vector<std::string> ret;
    for (auto s : v)
    {
        if (s.length() != 4)
        {
            continue;
        }
        std::vector<std::string> tmp = {
            s.substr(0, 1), s.substr(1, 1), s.substr(2, 1), s.substr(3, 1)
        };
        std::sort(tmp.begin(), tmp.end());
        do
        {
            if (tmp[0] == "0")
            {
                continue;
            }
            ret.push_back(tmp[0] + tmp[1] + tmp[2] + tmp[3]);
        }
        while (std::next_permutation(tmp.begin(), tmp.end()));
    }
    std::set<std::string> s(ret.begin(), ret.end());
    return std::vector<std::string>(s.begin(), s.end());
}

std::vector<std::string> subsequences(const std::vector<std::string> & v)
{
    std::vector<std::string> ret = {""};
    for (auto s1 : v)
    {
        std::vector<std::string> tmp(ret.begin(), ret.end());
        for (auto s2 : tmp)
        {
            if (s1 == "6")
            {
                ret.push_back(s2 + "9");
            }
            ret.push_back(s1 + s2);
        }
    }
    return filter(ret);
}

std::string solve(const std::string & input)
{
    size_t index = atoi(input.substr(0, input.find(':')).c_str());
    std::string n = input.substr(input.find(':') + 1, input.length());
    std::vector<std::string> v;
    for (size_t i = 0; i < n.length(); ++i)
    {
        v.push_back(n.substr(i, 1));
    }
    std::vector<std::string> ss = subsequences(v);
    return ss.size() < index ? "-" : ss[index - 1];
}

void test(const std::string & s1, const std::string & s2)
{
    static int i = 0;
    std::cout << i++ << " : " << (solve(s1) == s2 ? "ok" : "ng") << std::endl;
}
}

int main()
{
    /*0*/ test( "13:01167", "1109" );
    /*1*/ test( "1:1234", "1234" );
    /*2*/ test( "2:1234", "1243" );
    //以下略
    return 0;
}
```
アプリケーションごとにGemを管理


bundle installを実行すると、通常はシステムやrvmやrbenvで指定された標準の位置にインストールされる。

アプリゲーションごとにgemを管理したければ、こんな風にすればok。

```
$ bundle install --path vendor/bundle/
```

bundle execを毎回打つのがめんどくさいので、.bashrcに

```.bashrc
alias be='bundle exec'
```

ついでに、.bash_profileで.bashrcを読み込む

```.bash_profile
source .bashrc
```

##参照
・[Bundler再履修: bundle execって何？ gemはどこに入るの？](http://memo.yomukaku.net/entries/IpCSQmo "Bundler再履修: bundle execって何？ gemはどこに入るの？")
・[bundle installするときはpathを指定しよう](http://firn.jp/2010/11/09/bundle-install "bundle installするときはpathを指定しよう")
・[めんどくさい bundle exec を省略する方法](http://www.techscore.com/blog/2012/10/22/%E3%82%81%E3%82%93%E3%81%A9%E3%81%8F%E3%81%95%E3%81%84-bundle-exec-%E3%82%92%E7%9C%81%E7%95%A5%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/ "めんどくさい bundle exec を省略する方法")
・[.bashrc が反映されない件](http://d.hatena.ne.jp/jimbeam0203/20090809/1249823882 ".bashrc が反映されない件")
cpan, cpanmのproxy設定方法

#cpanの場合
~/.cpan/CPAN/MyConfig.pmのhttp_proxyに値を設定する。

```perl:設定例
'http_proxy' => q[http://http.proxy.jp:8080/],
```

cpanの対話モードでも設定可能

```shell:cpan起動後の設定例
[cpan] > o conf http_proxy       # 現在の設定表示
[cpan] > o conf htt_proxy unshift "http://http.proxy.jp:8080"
[cpan] > o conf commit           # 設定をファイルに書き込み
```


#cpanmの場合
環境変数http_proxyに設定

```shell:設定例
$ export http_proxy="http://http.proxy.jp:8080/"
```

あとは、通常通りcpanmを使用する。
UINavigationBarに影(Dropshadow)をつける方法


## 開発環境
XCode : 4.6.1
iPhone : 6.1 Simulator

## すること
* UINavigationBarでカテゴリーファイル(*.m, *.h)を作る
* UIWindowのDelegateメソッドに影(Dropshadow)を実装

## 詳細
#### UINavigationBarでカテゴリーファイル(*.m, *.h)を作る
* なんのことはなくて単にカテゴリーファイルを新規作成
UINavigationBar+dropShadow.h
UINavigationBar+dropShadow.m

* 必要な↓のインクルードファイルを記述

```objectivec
#import <QuartzCore/QuartzCore.h>
```

#### UIWindowのDelegateメソッドに影(Dropshadow)を実装
* UIWindowのwillMoveToSuperViewを追加

``` objectivec
-(void)willMoveToSuperview:(UIView *)newSuperview {
    [super willMoveToSuperview:newSuperview];
    [self addDropShadow];
}
```

* 影を描画するためのメソッドを追加

``` objectivec
-(void)addDropShadow {
    
    [self.layer setShadowColor:[[UIColor blackColor] CGColor]];
    [self.layer setShadowOffset:CGSizeMake(0, 3.0f)];
    [self.layer setShadowOpacity:0.5];
    [self.layer setMasksToBounds:NO];
    CGRect shadowPath = CGRectMake(self.layer.bounds.origin.x - 10, self.layer.bounds.size.height - 6, self.layer.bounds.size.width + 20, 5);
    [self.layer setShadowPath:[UIBezierPath bezierPathWithRect:shadowPath].CGPath];
    [self.layer setShouldRasterize:YES];
}
```

## 参考情報
* [How to create UINavigationBar drop shadow](http://stackoverflow.com/questions/5940076/how-to-create-uinavigationbar-drop-shadow "How to create UINavigationBar drop shadow")

* [[UIView willMoveToSuperview:] が便利です ]([UIView willMoveToSuperview:] が便利です "http://akisute.com/2011/08/uiview-willmovetosuperview.html")
コマンド一発で透過 png を綺麗に非透過 png にする

# スタンダードな方法

```bash
convert HOGE.PNG -background white -alpha deactivate -flatten PIYO.PNG
```

これだと，ギザギザになって汚い．半透明が無視されるからである．

# 綺麗な方法

```bash
convert HOGE.PNG  \( +clone -alpha opaque -fill white -colorize 100% \) +swap -geometry +0+0 -compose Over -composite -alpha off PIYO.png
```

これで，綺麗になる．
Mac でグループを追加する

```
### グループの一覧
dscl . ls /Groups

### 作成
sudo dscl . create /Groups/members name members
sudo dscl . create /Groups/members passwd "*"
sudo dscl . create /Groups/members realname Members
dscl . read /Groups/members

### グループにユーザーを追加
sudo dscl . append /Groups/members GroupMembership zakkied
id zakkied
```
ストアドで引数が指定されたら絞込み、NULL なら無視

たとえば 「@HogeId が指定されたら 1 件だけ処理、@HogeId が NULL の場合は絞り込まずに全件処理」 みたいなことがしたかったのだけど、

````sql
IF @HogeId IS NULL
BEGIN
  SELECT * FROM Hoge
END
ELSE
BEGIN
  SELECT * FROM Hoge WHERE HogeId = @HogeId
END
````

みたいなのしか思いつかなくてちょっと悩んだ。
（できれば条件がちょっと違うだけの SQL を何度も書きたくなかった）
ぐぐったら良さそうな方法を見かけたのでメモ。

ISNULL をかましてあげると良いらしい。

````sql
WHERE HogeId = ISNULL(@HogeId, HogeId)
````

CASE 文とか使う例もあったけど、これが一番見やすかった。
tokyocabinetを動かす

tokyocabinetを使ってみたのでその手順のメモ

yumで必要なパッケージをインストール。

```bash:
yum -y install bzip2-devel zlib-devel
```

次にtokyocabinetをwgetで拾ってきてinstall
見たときの最新のバージョンが1.4.45だった。

[tokyocabinet](http://fallabs.com/tokyocabinet/ "tokyocabinet")

```bash:
wget http://fallabs.com/tokyocabinet/tokyocabinet-1.4.45.tar.gz

tar xzvf tokyocabinet-1.4.45.tar.gz

cd tokyocabinet-1.4.45

./configure

make

make check

make install
```

インストールが完了

tokyocabinetの起動、動いてるっぽい。

```bash:
tctmgr version

Tokyo Cabinet version 1.4.45 (908:1.0) for Linux
Copyright (C) 2006-2010 Mikio Hirabayashi
```

indexの作成をする

```bash:
$ ruby wgettsv -allow 'http://d\.hatena\.ne\.jp/yutadayo' \
  -max 10000 'http://d.hatena.ne.jp/yutadayo/' > intra.tsv
```

10分くらいでクロールが完了。

コマンドを打ってインデックスの作成を試みる。

```bash:
$ tctmgr importtsv tctsearch.tct intra.tsv
$ tctmgr setindex -it qgram tctsearch.tct title
$ tctmgr setindex -it qgram tctsearch.tct body
```
数秒で完了。

検索UIもtokyocabinetに入っていたやつを使わせてもらった。
exampleディレクトリからコピーしてcgiが動くディレクトリに持ってくる。
exampleディレクトリでmakeしてできるtctsearch.cgi と tctsearch.tmplというファイルね。
先ほど作ったインデックスファイル(tctsearch.tct)も同じディレクトリに移動させておく。

```bash:
$ cd tokyocabinet-1.4.45/example
$ make
$ cp tctsearch.cgi tctsearch.tmpl ~yutadayo/work/tokyocabinet
$ mv ~yutadayo/tokyocabinet/tctsearch.tct ~yutadayo/work/tokyocabinet
```

ブラウザでtctsearch.cgiにアクセスし

```bash:
.cgi You don't have permission to access /
```

cgiの許可をしてないと怒られる。

http.confに下記を追加してapacheを再起動

```apache:
    ScriptAlias    /cgi-bin/ /home/yutadayo/work/tokyocabinet
   <Directory /home/yutadayo/work/tokyocabinet>
    AllowOverride None
    Options ExecCGI
    Order allow,deny
    Allow from all
   </Directory>
```

アクセスするとちゃんと動いた。
導入までは結構簡単でした。

![tokyocabinet](http://cdn-ak.f.st-hatena.com/images/fotolife/y/yutadayo/20100714/20100714121003.png "tokyocabinet")
PHPで文字列をリバースする


```php:reverse.php
function reverse1($str1) {
    $count = strlen($str1);
    for ($i = $count - 1; $i >= 0; $i--) {
        echo $str1[$i];
    }
}

$str1 = "abcdef";
reverse1($str1);
```

```php:reverse2.php
function reverse2($str2) {
    $count = strlen($str2);
    $num   = $count - 1;
    for ($i = 0; $i < $count / 2; $i++) {
        $last = $str2[$i];
        $str2[$i] = $str2[$num];
        $str2[$num] = $last;
        $num--;
    }
    echo $str2;
}

$str2 = "abcdef";
reverse2($str2);
```

```php:reverse3.php
function reverse3($str3) {
    $count = strlen($str3);
    for($i = 0; $i < --$count; $i++) {
        $last = $str3[$i];
        $str3[$i] = $str3[$count];
        $str3[$count] = $last;
    }
    echo $str3;
}

$str3 = "abcdef";
reverse3($str3);
```
よく使うツール・コマンドまとめ


徐々にまとめていきます。

## QuickLook系
* [Mac OS X: Quick Look with Syntax Highlighting](https://halfthetruth.de/2011/09/28/mac-os-x-quicklook-with-syntax/)

* [Images dimensions in QuickLook](http://www.cocoaintheshell.com/2012/02/quicklook-images-dimensions/)

* [qlmarkdown](https://github.com/toland/qlmarkdown/)

* [Use OSX Finder Quicklook to preview all plain text files](https://coderwall.com/p/dlithw)

### コマンド

* QuickLook中のテキストをコピペできるようにする

```shell
$ defaults write com.apple.finder QLEnableTextSelection -bool TRUE
```

## 効率化系ツール

* [QuickSilver](http://qsapp.com/)
* [ClipMenu](http://www.clipmenu.com/ja/)


## 最適化系ツール

* [ImageAlpha](http://pngmini.com/)
* [ImageOptim](http://imageoptim.com/)
bundlerでrails 4.0.0.beta1を使い始める

Ruby環境にはbundlerが入った状態で：

* git init
* bundle init
* vim Gemfile

```Gemfile
    source 'https://rubygems.org'
    gem 'rails', '4.0.0.beta1'
```

* bundle install --path vendor/bundle
* bundle exec rails new . -T 
 * -Tはrspecつかうため
 * APP_PATHに . を指定すると、今居るディレクトリの名前がアプリケーションのクラス名に使われるので注意
   * 例: rails4 => Rails4::Application
 * Gemfileの上書きを聞かれるのでy
* .gitignoreにvendor/bundleを追加

```.gitignore
    /.bundle
    /vendor/bundle
    
    /db/*.sqlite3
    /db/*.sqlite3-journal
    
    /log/*.log
    /tmp
```

* git add .
* git commit -m 'new project'
ユニバーサルバイナリ on OSX64bit を 32bit で実行する方法

64bit の OSX を使ってるがあるときコマンドラインからユニバーサルバイナリを 32bit モードで実行する必要が出てきた。そんな時どうすればいいか？

答えは実行するバイナリの前に **arch -i386** を入れるだけである。

```bash
arch -i386 [executable]
```

実際に 32bit モードで動いているかどうかを確認するには QuickLook を管理する役割を果たす qlmanage を使うのが確実である。引数を -p ではなく -t にしてもよい。その場合はプレビュー画面ではなくサムネイル画面が表示される。

```bash
arch -i386 qlmanage -p [file_to_preview]
```

上記を実行すると最初に 32bit モードで動いていることを示す警告が出て 32bit で動いていることが確認出来る。

```
[WARNING] Running in 32bit mode
```

参考: http://web.archiveorange.com/archive/v/PspEo3HJTTlqgWbDDsLv
github の pull-req の参照をローカルに持つ

いつも忘れるのでメモ。

```shell-session
git config --add remote.origin.fetch '+refs/pull/*/head:refs/remotes/origin/pr/*'
```

以下は失敗の記録。globalに設定すると `git remote add origin ...` が動かなくなるのでうまく行きませんでした。

```shell-session
# ダメな例
git config --global --add remote.origin.fetch '+refs/pull/*/head:refs/remotes/origin/pr/*'
```
HerokuでApplicationErrorが発生したときの対処法

##注意（2021年6月追記）
__この記事は99%の人には何の参考にもなりません。__
経験上はアプリケーションに特に問題がないのに Appilication Error が発生し、再起動で解決するということは稀に起こります。
少なくともここ数年は私の環境では起きていませんが、執筆時点（2013年3月）の heroku では稀に発生していました。
ずっと安定稼働していて特に思い当たる原因がない場合の対処法であって、Application Error が起きた時にいつでも通用する対処法ではありません。
このエラーが発生している場合は9割9分アプリケーションに問題があるので、きちんとエラーログを見て原因を特定してください。

<hr>

heroku で運用を行っていると、原因不明の ApplicationError が発生することがあります。
30秒ルール以外で発生する場合、経験上はエラーコード H10 が発生していることが多いです。

[Heroku Error Codes | H10 - App crashed](https://devcenter.heroku.com/articles/error-codes#h10-app-crashed)

この例の通り deploy 時に多く発生するのですが、原因が Gem や設定ファイルの不備に起因することはあるものの、deploy 内容に問題がないこともあります。

こういうときは再起動だ！って訳で以下のコマンドを実行するわけです。

```
heroku restart --app application_name
```

でもこれやっても全く解消しないことも結構多いのです。
さて困った・・・。

こんなときは、以下のコマンドで再起動を実行しましょう。

```
heroku restart web.1 --app application_name
```

これは WebDyno を個別に再起動するコマンド。例えば WebDyno を3つ使っていたら、下記コマンドを全部実行する必要があります。

```
heroku restart web.1 --app application_name
heroku restart web.2 --app application_name
heroku restart web.3 --app application_name
```

` heroku restart` では解消しなかったら ApplicationError もあらびっくり。
ログに "App crashed" ってずっと書きこまれていたのがすぅっと消えるのはちょっとした快感です。
起きないのがもちろん一番なわけですが。

このコマンドの説明、公式に載っていたはずだけどどこだったかな。。。

この WebDyno 個別再起動ではなく再 deploy で直ったこともありますが、いかんせん heroku は` git push -f`で強制的に push しても同じ deploy 内容だと拒絶しちゃうし、どうしても10分以上かかっちゃう（ deploy 容量や Gem による）のが悩みどころでした。
今はこのコマンドで解消できているので助かっています。
herorku の再起動は graceful restart なので、アクセス中のユーザがいても特に問題ない（はず）です。

ちなみに、やることがあるか分りませんが WorkerDyno は以下のコマンドで再起動できます。

```
heroku restart worker.1 --app application_name
```


しかし、アプリケーション再起動と Dyno の再起動って内部的にやってることが違うってことなんですかね、やっぱり。
Typed/UntypedなASTの実装アイデアのメモ

アカウントは作ったものの一回もQiitaに投稿したことないので、
お試しがてら今思いついたアイデアをひとつ投下。

例えば

x : 文字列
n : 整数
c ::= () | True | False | n
e ::= c | Let x e e | If e e e

のように定義される式eに対応するASTを実装するにあたり、
Untyped/Typedな型が両方必要だとする。
（例えばパースした直後はUntypedだろうし、型付けする関数typingの型はtyping :: TypeEnv -> UntypedExpr -> TypedExprのようになるはず）

このようなときは子の型をパラメタで置き、ASTの親子構造だけ定義した型を作り、
それに実際にパラメタを渡して作ると綺麗に書ける。
具体的にはこんなん。

```haskell:ast_struct.hs
type VarName = String
data Type = UnitT | BoolT | IntT | FunT Type Type
data ExprStruct child = UnitE | BoolE Bool | IntE Int | Var VarName | Let VarName child child | If child child child
data UntypedExpr = UExp (ExprStruct UntypedExpr)
data TypedExpr = TExp {expr::ExprStruct TypedExpr, typ::Type}
```

Untyped ASTは`If (BoolE True) UnitE UnitE`みたいに書けたらよかったけど、
`type UntypedExpr = ExprStruct UntypedExpr`は流石に通らない。
（この辺うまくやる方法あったら教えてください……）
RspecのCapybaraではまった・・・


http://alindeman.github.com/2012/11/11/rspec-rails-and-capybara-2.0-what-you-need-to-know.html

ここに書いてあったことなんだけど、いまいち意味がわかってなくてですね…

意味なく悩んでしまった
数式を画像で出力できるようにして欲しい

##追記
qiita meetup#6で@yaottiに教えてもらった、@naoya_tさんのTex拡張を使うと、数式をかけます。
こんなかんじで![equation](http://chart.apis.google.com/chart?cht=tx&chl=f%5E%5Cprime(x%29%5C%20%3D%20%5Clim_%7B%5CDelta%20x%5Cto0%7D%5Cfrac%7Bf(x%2B%5CDelta%20x%29-f(x%29%7D%7B%5CDelta%20x%7D)かけます。すごい！
http://qiita.com/items/3d4cf1028b5c438642bc
ご本人がおっけーであれば、本家採用してもられるとうれしいです。

---------------------------------

数学系の記事書きたいので、数式を下記のように表現できるようにして欲しいです。
![test](http://upload.wikimedia.org/math/6/a/f/6af519ad3fa52f05137b9d69f6a53da2.png)
使用するユーザーはそんなに多くなさそうだけど、一部のマニアにはウケそうな気がします。
一般的な画像アップを許可すると色々お金がかかりそうですが、数式の画像だけであれば、そんなに容量を使わないのではないかと思います。
検討よろしくお願いします。

##参考記事
LaTeXの数式を画像に変換してくれる
http://20kaido.com/archives/2294400.html

##追記
コメントのhden@github様のご指摘を受け、クライアント処理のための補足情報を追記します。

jsMath
http://math3.ifdef.jp/jsmath/welcome.htm
使用例
http://www.math.union.edu/~dpvc/jsMath/examples/Henrici.html
Ethnaで、Action名とView名をaccesslogに記録する方法

Action名、View名をWebサーバのログに記録しておくといろいろ捗ります。

## やり方

ViewClassで下記のようにsetPropしておいて、

```php:lib/Ethna/class/ViewClass.php
protected function _setDefault($renderer)
{
...
        $renderer->setProp('actionname', $this->backend->getActionClass()->getActionName() );
        $renderer->setProp('viewname', $this->forward_name);
}
```

Renderer/Smartyで

```php:lib/Ethna/class/Renderer/Smarty.php
                     $captured = $this->engine->fetch($this->template);
                     return $captured;
                 } else {
+                    header('X-MemoryUsage: ' .  memory_get_usage());
+                    header('X-ActionName: ' . strtolower($this->getProp('actionname')));
+                    header('X-ViewName: ' . strtolower($this->getProp('viewname')));
                     $this->engine->display($this->template);
                 }
```

あとはhttpd.confで

```text:httpd.conf
LogFormat "time:%t\thost:%h\tident:%l\tuser:%u\treq:%r\tstatus:%>s\tsize:%b\treferer:%{Referer}i\tua:%{User-Agent}i\taction:%{X-ActionName}o\tview:%{X-ViewName}o" ltsv
```

てな感じです。
ImageMagickで最小サイズを指定してサイズ変換する

imagemagickで画像のサイズ変換は以下のようにします

```sh
convert -geometry 100x200 input.png output.png
```

この場合、input.pngのアスペクト比と100x200のアスペクト比が異なる場合、
アスペクト比が固定される。

たとえば、input.pngが500x500pxだとする。そうするとoutput.pngは100x100
として出力される。
つまり、最大サイズが100x200と解釈されている。

しかし、output.pngは200x200になって欲しい時がある。
つまり指定したサイズよりも必ず大きくなるように変換したい場合。

この場合は

```sh
sh convert -geometry 100x200^ input.png output.png
```

のようにサイズの末尾に^をつける
Ethnaでメモリーリーク

PHP5.1/Ethna2.5で発生。
PHP5.4だと程度は減るがやはりリークする。

```php
$this->af->setApp('data', $veryBigData);
```
みたいに巨大な配列をsetAppしたときに問題が起こる。

Ethnaでは下記のようなメソッドコールが行われ、_getArrayで上記の$veryBigDataが再帰的に処理されるのだが、ここでPHP(httpd)がもりもりメモリを喰ってしまい、リクエスト終了後もメモリをつかんだまま離さない。

```
- Controller::_trigger_WWW
 - ViewClass::preforward
 - ViewClass::forward
   - ViewClass::_getRenderer
    - ActionForm::getAppArray
     - ActionForm::_getArray(→再帰)
```

# 対処方法

Controller::_trigger_WWW()の中で、forward()直後に下記のようにunsetしてやれば
いくぶんかマシになる。(ただし根本解決ではない)

```php
$this->view->forward();

unset($this->action_form->app_vars);
unset($this->action_form->app_ne_vars);
unset($this->action_form->form_vars);
```

原因はよくわからないが、EthnaはControllerやらActionやらBackendやらのインスタンスが相互に参照しあってるので、循環参照になっているのが原因かも？
alternativesを使ってrubyのバージョンを切り替える

最近、Amazon Linuxを使っています。
標準のruby1.8のほか、ruby1.9のパッケージがあるのはいいんだけれど、alternativesの設定が見当たらなかった。。。

というわけで、alternativesの設定をしてバージョンを切り替えるようにしてみた。といっても基本的に切り替えないけどね。。。

```shell_commands
# ruby1.9を入れる
$ sudo yum install -y ruby19 rubygems19

# ruby1.9を入れてもそのままだと有効にならない
$ ruby -v
ruby 1.8.7 (2012-10-12 patchlevel 371) [x86_64-linux]

# alternativesにはなにもない。。。
$ sudo update-alternatives --display ruby

# なのでaltenativesに自分で登録する
$ sudo update-alternatives \
--install /usr/bin/ruby ruby /usr/bin/ruby1.8 0 \
--slave /usr/bin/gem gem /usr/bin/gem1.8
$ sudo update-alternatives \
--install /usr/bin/ruby ruby /usr/bin/ruby1.9 1 \
--slave /usr/bin/gem gem /usr/bin/gem1.9

# 無事登録されました
$ sudo update-alternatives --display ruby
ruby -ステータスは自動です。
リンクは現在 /usr/bin/ruby1.9 を指しています。
/usr/bin/ruby1.8 - 優先項目 0
 スレーブ gem: /usr/bin/gem1.8
/usr/bin/ruby1.9 - 優先項目 1
 スレーブ gem: /usr/bin/gem1.9
現在の「最適」バージョンは /usr/bin/ruby1.9 です。
```

上記はamazon linuxでやってますが、他でも基本的にはいっしょです。ubuntuあたりだとalternativesの設定はパッケージといっしょに入ってくれるかな・・・？
Excelで文字化けしないCSV（UTF-8）を書き出す方法

文字化けを回避するにはファイルの先頭にBOMを明示的に出力しないといけない。

```ruby
# encoding: utf-8
File.open("sample.csv", 'w') do |f|
  f.print "\xEF\xBB\xBF" # BOM
  f.puts "UTF-8,の文字コード,のCSV,文字列"
end
```

Mac版Excelについては下記が参考になる。
http://qiita.com/items/88879711245a420f713d
Capybara-webkitにkeydownイベントを送る方法


なんか簡単な手段は用意されていないらしい。
そんな阿呆な…

とりあえず、Google先生にお伺いを立ててこのコードで凌ぐ。

```ruby
  keypress_script = "var e = $.Event('keydown', { keyCode: #{keycode} }); $('#message_content').trigger(e);"
  page.driver.browser.execute_script(keypress_script)
```

テストは動いたけど…これでよかったのだろうか…
静的アナライザによる解析を特定のファイルで無効にする

Xcodeのビルド設定で "Run Static Analyzer" を有効にしていると、ビルド時に静的アナライザが走ってコードの怪しい箇所を指摘してくれます。非常に助かりますが、サードパーティ製ライブラリを使用していてコードに手を入れたくないクラスや、既に問題がないことを確認済みの箇所等、静的解析が不要な場合もあります。

![cocos2dのクラスでwarning](http://f.cl.ly/items/230m002B2p1m2k2Z2o0d/DisableStaticAnalyzer1_r1_c1.png)

次の方法で、**ファイル毎に静的アナライザを無効にする**（そのファイルについてのwarningが出ないようにする）ことができます。

1. プロジェクト設定画面のBuild Phasesタブを開く
2. 静的解析を無効にしたいファイルを選択してリターンキー押下
3. コンパイラフラグを追加

"-Xanalyzer -analyzer-disable-checker" というコンパイラフラグを追加します。

![コンパイラフラグの追加](http://f.cl.ly/items/3Z02171Z010E0u3R0A42/DisableStaticAnalyzer2.png)

複数ファイルを一括で無効にしたい場合は、まとめて選択した状態でリターンキーを押してコンパイラフラグを編集します。

##参考

- [Clang Tools Documentation](https://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man1/clang.1.html)
- [Clang Compiler User’s Manual](http://clang.llvm.org/docs/UsersManual.html#diagnostics_pragmas)
StoryBoardを使わないiOS開発開始時のメモ

# 新規Project
Empty Applicationを選択

#TopController作成
最初に表示するためのControllerを作成
TopContoller.h / TopController.mとします

#ApplicationDelegeteの修正
TopControllerを起動時に表示するように修正

```obj-c:ApplicationDelegate.h
#import "TopController.h"

@property (strong, nonatomic) TopController *topController;
```

```obj-c:ApplicationDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    //self.window.backgroundColor = [UIColor whiteColor];
    
    _psTopViewController = [[PSTopViewController alloc]init];
    self.window.rootViewController = _psTopViewController;
    
    
    
    [self.window makeKeyAndVisible];
    return YES;
}
```

こんなかんじに修正
重複した要素のみを取得する

```php
<?php
$array = ['A', 'A', 'A', 'B', 'B', 'C', 'D'];

function selectDuplicates($array) {
    $duplicate = array_filter(array_count_values($array), function($v) {
        return $v > 1;
    });

    return array_keys($duplicate);
}

selectDuplicates($array); // => ["A", "B"]
```
CSSやJavascriptをyuicompressorで圧縮しよう！


### ソースディレクトリへ移動
```bash
cd /usr/local/src/
```

### yuicompressor用ディレクトリ作成
```bash
mkdir yuicompressor
```

### ディレクトリ移動
```bash
cd yuicompressor
```

### git Repositoryをclone
```bash
git clone git@github.com:yui/yuicompressor.git
```

### lib以下にコピー（しなくても良い、しない場合は以下の手順でパスを直接に変更する必要がある）
```bash
ln -s /usr/local/src/yuicompressor/yuicompressor/
build/yuicompressor-2.4.8pre.jar /usr/local/lib/yuicompressor.jar
```

### 圧縮してみよう
```bash
java -jar /usr/local/lib/yuicompressor.jar
 aaa.css -o aaa.min.css --charset utf-8
```

### 複数ファイルを纏めて圧縮してみよう。
```bash
java -jar /usr/local/lib/yuicompressor.jar
 aaa.css bbb.css ccc.css -o mix.min.css --charset utf-8
```
AngularJSでroutingするときには、フォルダ構成をしっかりしておきましょう


##事の発端
[AngularJS](http://angularjs.org/)のサンプルを参照しながらroutingを行い以下の様な設定にしました。

```javascript
angular.module('foo', []).
    config(function($routeProvider, $locationProvider)
        {
            $locationProvider.html5Mode(true);
            // ルートプロバイダに設定
            return $routeProvider.
                when('/', {controller:TopCtrl, templateUrl:'top.html'}).
                when('/a', {controller:ACtrl, templateUrl:'a.html'}).
                when('/b', {controller:BCtrl, templateUrl:'b.html'}).
                when('/b/:Id', {controller:BDetailCtrl, templateUrl:'detail.html'}).
                otherwise({redirectTo:'/'});
        }
    );

```

意図としては、ローカルで動かしたときのURLをhttp://localhost:8080とすると、

1. 「http://localhost:8080/」ならtop.htmlの内容表示
* 「http://localhost:8080/a」ならa.htmlの内容表示
* 「http://localhost:8080/b」ならb.htmlの内容表示
* 「http://localhost:8080/b/(なんらかのID)」ならdetail.htmlの内容表示

のつもりでしたが、設定したroutingでは4番目の「http://localhost:8080/b/(なんらかのID)」にブラウザでアクセスしたところ、detail.htmlの内容が表示されない……
ちなみにローカルでnginxを動かしていたため、設定でミスってたかなと思いいろいろいじってみるも改善は見られず、そもそもnginxでこけるならブラウザに表示されてないと判断したのでこの方向性での調査はここで打ち切り。

```bash:nginx.conf
server {
        listen       8080;
        server_name  localhost;

        location / {
            root  (プロジェクトがある場所の絶対パス);
            index index.html index.htm;
            try_files $uri /index.html;
        }

        location ~ ^/.+/$ {
            rewrite .* /index.html last;
        }

        location ~ /\.ht {
            deny all;
        }
}
```

##結果どうなったのよ
先ほどの「4番目のroute設定が意図通り表示されない」ところを細かく見ていくと、以下のindex.htmlのng-viewの箇所がdetail.htmlに置き換わらず、index.htmlの内容が再び表示されるというのが発生している現象でした。
例を出すと、

```html:index.html
<body>
    <!-- Nav Bar -->
    <header class="head">
		<!-- ヘッダーの中身 -->
    </header>

    <!-- ビューが各URLにより変更される -->
    <div ng-view></div>

    <!-- Footer -->
    <footer class="row">
		<!-- フッターの中身 -->
    </footer>

</body>
```

が

```html:index.html
<body>
    <!-- Nav Bar -->
    <header class="head">
		<!-- ヘッダーの中身 -->
    </header>

    <!-- Nav Bar -->
    <header class="head">
		<!-- ヘッダーの中身 -->
    </header>

    <!-- ビューが各URLにより変更される -->
    <div ng-view></div>

    <!-- Footer -->
    <footer class="row">
		<!-- フッターの中身 -->
    </footer>

    <!-- Footer -->
    <footer class="row">
		<!-- フッターの中身 -->
    </footer>

</body>
```

なふうに展開されてたと。つまりdetail.htmlの内容がそもそもロードされてないことに気づいたので、テンプレートとなるファイルを一箇所にまとめて、route設定を以下のようにしました。

```javascript
angular.module('foo', []).
    config(function($routeProvider, $locationProvider)
        {
            $locationProvider.html5Mode(true);
            // ルートプロバイダに設定
            return $routeProvider.
                when('/', {controller:TopCtrl, templateUrl:'/template/top.html'}).
                when('/a', {controller:ACtrl, templateUrl:'/template/a.html'}).
                when('/b', {controller:BCtrl, templateUrl:'/template/b.html'}).
                when('/b/:Id', {controller:BDetailCtrl, templateUrl:'/template/detail.html'}).
                otherwise({redirectTo:'/'});
        }
    );

```

**意図通りに表示された！＼(^o^)／**
Ruby,MySQLの環境を構築する(Linux版)


[Macのローカルな環境でうまくいった](http://qiita.com/items/e2cf0fa27f9763d3bdd4)ので、今度はさくらvps上に環境を構築していきます。

##手順
1. rbenv, Rubyをインストール
2. Bundlerをインストール
3. MySQLをインストール
4. 何か作る


##rbenv, Rubyをインストール
[rbenvで複数のバージョンのrubyを使用する環境を整える - memo.yomukaku.net](http://memo.yomukaku.net/entries/ApoFwmf
)
さくっと行きます。


##Bundlerをインストール
Mac版と同じ。コピペしとく。

```bash:
$ rbenv exec gem install bundler
$ rbenv rehash
```

Budlerというのは、Railsで使われているgem管理ツールで、プロジェクト毎にgem管理する事ができます。Railsをインストール済みならこの作業は不要。
参考：[gem管理の新標準ツール"Bundler"のTips - 昼メシ物語](http://blog.mirakui.com/entry/20100703/1278165723)


##MySQLをインストール
以下の記事を参考に、最新の5.6を入れてみました。インストール後の作業はMac版と同じ。my.cnfが既に置かれていて？中身が違いました。
[CentOS 6.3 に MySQL 5.6 をインストールしてみた - akishin999の日記](http://d.hatena.ne.jp/akishin999/20130207/1360241401)

ささっと終わると思いきや、途中でこんなエラーが出て、えらい詰まりました。

```bash:
[u1@www6042ue ~]$ service mysql start
Starting MySQL. ERROR! The server quit without updating PID file (/var/lib/mysql/www6042ue.sakura.ne.jp.pid).
```

ググってみると、my.cnfに5.6では存在しないパラメータが書かれているとか、プロセスが死んでないとかで、他にも詰まっている人たちが結構居ました。でも色々試してもだめで結局root権限でコマンドを実行していなかったというオチ。。

参考：
- [[Web] さくらVPSでのメンテナンスについて: ものづくりログ](http://blog.be-style.jpn.com/article/62984555.html)
- [G-chan Square - [Linux] CentOS6.3にMySQL5.6をinstall](http://g-chan.dip.jp/square/archives/2013/02/linux_centos63mysql56install.html)

##何か作る
これで環境整ったので何か作ってみましょう！！
つづく。
Ruby,MySQLの環境を構築する(Mac版)


めんどくさい環境構築手順をメモメモ。
ちょっと試すくらいなら、rbenvやBundlerまで使うのは面倒かも。

##手順
1. Homebrew, rbenv, Rubyをインストール
2. Bundlerをインストール
3. MySQLをインストール
4. 何か作る

##Homebrew, rbenv, Rubyをインストール
インストール方法はまとめて以下の記事に載ってます。今回はRailsまでは入れる必要ないです。
[【初心者向け】Mac(OSX Lion)でRuby on Railsを動かすための5ステップ « pplog.org](http://pplog.org/?p=1845)

一箇所、Homebrewのファイルを落とすところが404になったので、URLを以下のように変更する必要がありました。
https://raw.github.com/mxcl/homebrew/go 

###Homebrewとは
Macのパッケージ管理ツール。「MacPors」より人気あるらしい。
参考：[Mac デ Homebrew ノススメ | Kitchen Garden Blog](http://blog.hifumi.info/mac/mac-%E3%83%87-homebrew-%E3%83%8E%E3%82%B9%E3%82%B9%E3%83%A1/)


###rbenvとは
色んなバージョンのruby簡単切替ツール。
参考：[Happy Elements Labs: モテカワるびいすとのための rbenv 入門](http://blog.happyelements.co.jp/2012/10/rbenv.html)


##Bundlerをインストール
```bash:
$ rbenv exec gem install bundler
$ rbenv rehash
```
Budlerというのは、Railsで使われているgem管理ツールで、プロジェクト毎にgem管理する事ができます。Railsをインストール済みならこの作業は不要。
参考：[gem管理の新標準ツール"Bundler"のTips - 昼メシ物語](http://blog.mirakui.com/entry/20100703/1278165723)


##MySQLのインストール
以下の記事を参考にしました。
[Mac OS X 開発環境構築手順:DB実行環境(MySQL)インストール - Shinya’s Daily Report](http://d.hatena.ne.jp/absj31/20121020/1350743258)

ただ、途中で記事にないエラーが出ちゃったのでつまずき。。
その経緯を記事にまとめました。
["$ brew install mysql" でエラー #homebrew - Qiita](http://qiita.com/items/b82704555f6cd04a4209)

あと、今回インストールしたMySQLが5.6だったので、デフォルト設定ファイルがえらいすっきりしてました。この辺いじった事がなかったので、とりあえず "character-set-server = utf8" とだけ追記しとくだけにしました。ちゃんと勉強しないとなー。

同じようにMySQL初心者の方は、とりあえずこのスライド読むと良さそう。
[初心者向けMySQLの始め方](http://www.slideshare.net/tmtm/mysql-13117441)


##何か作る
これで環境整ったので何か作ってみましょう！！
つづく。
Monoで名前付きMutexが期待通りに動作しない問題の解決方法

ぐぐっても日本語の資料が見つからなかったので書いときます。

多重起動チェックのために次のような感じで書いたところ、Windowsでは多重起動した場合に期待通りif文中には入らないのに、Monoだと多重起動しても中に入ってしまった。

```cs:
bool created_new_mutex;Mutex mutex = new Mutex(true, "hoge", out created_new_mutex);if (created_new_mutex) { /* … */ }```

どうも共有ハンドルがデフォルトで無効になっているのが原因らしい。
次のように環境変数 MONO_ENABLE_SHM=1 を設定したら解決した。

```Bash:
export MONO_ENABLE_SHM=1
```

### 参考
- Release Notes Mono 2.8<br />
http://www.mono-project.com/Release_Notes_Mono_2.8
Conversion between NSURL and filePath


NSURLとfilePathの変換をしたい場合。
[参考](http://d.hatena.ne.jp/watanata2000/20120313/1331605820)

## File Path -> NSURL

```
NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:@"/dir/file.txt"];  
  // or
NSURL *fileURL = [NSURL fileURLWithPath:@"/dir/file.txt"]; 
```

## NSURL -> filePath

```
NSString *filePath= [fileURL absoluteString]; 
　// or 
NSString *filePath= [fileURL path]; 
```
Rails/konachaでJavaScriptのテスト環境とCI環境を作ってTravisに載せた

fastladderのリポジトリにJavaScriptのテスト環境を足してみた。その作業ログ。

具体的には以下の二つのコミット参照
https://github.com/fastladder/fastladder/pull/66/files
https://github.com/fastladder/fastladder/pull/85/files

後この記事
http://qiita.com/items/861f913b0f57203420d6

## 利点

- mocha/chaiによるモダンなJSテスト環境
- テスト側でも依存解決にsprockets利用可
- 導入が簡単

## 欠点

- ヘッドレス環境でCI統合がちょっとめんどい
- javascript処理系が必要なのでJSエンジンが必要(PureなCentOSとかだとtherubyracerが必要)


## 導入

Gemfileに以下のものを追加する

```ruby
group :test, :development do
  gem 'konacha'
  gem 'poltergeist'
  gem 'sinon-rails'
end 
```

sinon-railsはJSのモックライブラリ。なくてもいいけど、rspec書く人は入れたほうがいいと思う。


とりあえず一件だけテストを書く。
spec/javascripts/array_extra_spec.js

```javascript
//= require application
//= sinon
describe("Array", function(){
  describe("#map", function(){
    it("return function applied array", function() {
      var arr = [1,2,3];
      var twice = function(i){return i*2;};
      expect(arr.map(twice)).deep.equal([2,4,6]);
    });
  });
});
```

Runnerを起動

```
bundle exec rake konacha:serve
```

http://localhost:3500 を開くとテストが実行される。


## CI環境

poltergeistでヘッドレス実行できるようにする。
config/initializers/konacha.rb

```
Konacha.configure do |config|
  require 'capybara/poltergeist'
  config.spec_dir = "spec/javascripts"
  config.driver   = :poltergeist
end if defined?(Konacha)
```

WebMockがそのままだpoltergeistの邪魔をするのでlocalhostへの接続を許可する
config/environments /test.rb

```
+require 'webmock/rspec'
 Fastladder::Application.configure do
   # Settings specified here will take precedence over those in config/application.rb
   
   (...)

   # Print deprecation notices to the stderr
   config.active_support.deprecation = :stderr
+  WebMock.disable_net_connect!(:allow_localhost => true)
 end
+
+require 'webmock/rspec'
+WebMock.disable_net_connect!(:allow_localhost => true) 

```


実行

```
bundle exec rake konacha:run
```

productionのprecompile後に落ちる場合はコンパイル対象を列挙する
config/environments/production.rb の例

```
  +config.assets.precompile += %w( reader.js share.js subscribe.js)
```



## Travis

travis.ymlのサンプル

```yaml
rvm:
- 1.9.3
- 2.0.0
branches:
  only:
    - master
before_script:
  - 'cp config/database.yml.sqlite3 config/database.yml'
  - 'RAILS_ENV=test bundle exec rake setup'
  - "export DISPLAY=:99.0"
  - "sh -e /etc/init.d/xvfb start"
script: 'RAILS_ENV=test bundle exec rake db:drop db:create db:migrate spec konacha:run && RAILS_ENV=production bundle exec rake assets:precompile '
```
OpenFastladderをherokuにデプロイする方法


# 前提

 * heroku toolbelt がインストール済であること
 * Heroku のアカウントを持っていること

# 準備

まずはheroku用にGemfileの整理などを行なう。

    $ git clone https://github.com/fastladder/fastladder.git
    $ cd fastladder/

heroku用に依存するGemの置き換え。(sqlite3とmysql2をやめて、かわりにpgとthinをいれる)

    $ sed -i -e 's/sqlite3/pg/' Gemfile
    $ sed -i -e 's/mysql2/thin/' Gemfile
    $ bundle install --path .bundle     $ git add Gemfile Gemfile.lock
    $ git commit -m "Gemfile"

Procfileを作る。

    $ echo 'web: bundle exec rails server -p $PORT' > Procfile
    $ echo 'crawler: bundle exec ruby script/crawler' >> Procfile
    $ git add Procfile
    $ git commit -m "Procfile"

それ以外の設定ファイルを生成する。

    $ echo 'gem "therubyracer"' >> Gemfile
    $ echo 'gem "sqlite3"' >> Gemfile
    $ bundle
    $ cp config/database.yml.sqlite3 config/database.yml
    $ bundle exec rake setup i18n:js:export
    $ git add -f app/assets/javascripts/i18n/
    $ git add -f config/initializers/secret_token.rb
    $ git commit -m "some other files"
    $ git checkout .

# Webのデプロイ

    $ heroku apps:create openfl-demo
    $ heroku addons:add heroku-postgresql:dev
    $ git push heroku master
    $ heroku run bundle exec rake db:migrate --app openfl-demo
    $ heroku ps:scale crawler=0 web=1

http://openfl-demo.herokuapp.com にアクセスして、デプロイ結果を確認する。

# クローラのデプロイ
heroku configで、Postgresqlの接続URLを確認する。

    $ heroku config --app openfl-demo
    === openfl-demo Config Vars
    DATABASE_URL:               postgres://xxxx:yyyy@zzz.amazonaws.com:5432/wwwww
    HEROKU_POSTGRESQL_GOLD_URL: postgres://xxxx:yyyy@zzz.amazonaws.com:5432/wwwww

クローラをデプロイする。

    $ heroku apps:create openfl-demo-crawler
    $ heroku config:set --app openfl-demo-crawler  DATABASE_URL=postgres://xxxx:yyyy@zzz.amazonaws.com:5432/wwwww HEROKU_POSTGRESQL_GOLD_URL=postgres://xxxx:yyyy@zzz.amazonaws.com:5432/wwwww
    $ git push git@heroku.com:openfl-demo-crawler.git master
    $ heroku ps:scale --app openfl-demo-crawler crawler=1 web=0

動作してるかどうかは`heroku logs`で確認する。

    $ heroku logs -t --app openfl-demo-crawler

# その他

 * Heroku Postgresqlはサイズ制限が厳しいので、本格的に使うなら有料プランを検討したほうがいい
 * 動作のカスタマイズは `config/application.yml` をいじる
cocos2d-iphone-extensions も CocoaPods で使いたい


cocos2dをCocoaPodsでプロジェクトに追加できるようになったのだから、[cocos2d-iphone-extensions](https://github.com/cocos2d/cocos2d-iphone-extensions)もCocoaPodsで管理したい。

どうやら[CCPods](https://github.com/CCPods/CCPods-specs)というプロジェクトがあるようなのでこれを利用する。

CCPodsのPodSpecはsubspecが切られていて素敵。
例えば、`CCLayerPanZoom`だけを使いたかったら以下のようにPodfileを記述すればOK。

    pod 'cocos2d-iphone-extensions/CCLayerPanZoom', :podspec => 'https://raw.github.com/CCPods/CCPods-specs/master/cocos2d-iphone-extensions/0.2/cocos2d-iphone-extensions.podspec'

Podfileには直接podspecファイルを指定してpodを追加するように記述できるので、これを使うとCCPodsのリポジトリをPod sourceに追加しなくても使える。
vagrant 起動時のshared folder 関連のエラー対処


以下のようなメッセージが出た場合

```
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!
```

ゲストOSにてvboxadd をセットアップし直す．
もし，linux-headers-xxx-generic が入っていなければ事前に入れておく

```bash
$ sudo apt-get install dkms
$ sudo /etc/init.d/vboxadd setup
```

----
## 参考
[Vagrantを入れてみた](http://kenkennote.com/blog/2012/05/30/vagrant-installed/)
Ubuntu にPostgreSQLを用意する


[7つのデータベース 7つの世界](http://goo.gl/iwyK4) に習うため
Ubuntu 12.10 にPostgreSQL を用意する．
実際のDB運用までは考慮しないので，
パッケージを入れて本に従って動かせれば良しとしておく :)
パッケージではPostgreSQL 9.1 が標準らしい．

```bash
$ sudo apt-get install postgresql postgresql-client psotgresql-contrib
```

動作するか確認のため，本のP.10 に従いテーブルを作成してみる．

```bash
$ sudo su - postgres
$ createdb book
$ psql book -c "SELECT '1'::cube"

ERROR:  type "cube" does not exist
LINE 1: SELECT '1'::cube;
```

拡張していないためエラーが出るので，下記のように拡張を追加．
4つめの```cube``` がこのクエリに対応している．

```bash
$ psql book -c "CREATE EXTENSION tablefunc" 
$ psql book -c "CREATE EXTENSION fuzzystrmatch" 
$ psql book -c "CREATE EXTENSION pg_trgm" 
$ psql book -c "CREATE EXTENSION cube" 
$ psql book -c "CREATE EXTENSION dict_xsyn" 
```

再確認してみると無事に結果が返ってきた．

```bash
$ psql book -c "SELECT '1'::cube;"
 cube 
------
 (1)
(1 row)
```
Mac で Vagrant

前提：Lion (10.7.5) にXcode 4.6.1, Homebrew をインストール済み

## rbenv で	ruby 1.9.3 インストール

1.9.3へのこだわりは特になく，Xcode付随のruby を使わず
自分でバージョンコントロールすることが目的．

### rbenv のインストール

```bash
$ brew install rbenv
$ brew install ruby-build
```

これでrbenv が使えるようになっているので

```bash
$ rbenv install 1.9.3-p194
$ rbenv global 1.9.3-p194
$ rbenv rehash
```

とインストール.インストール対象を一覧で見たい場合は

```bash
$ rbenv install
```

で確認できる．
1.9.3を既定にしたのにMac標準にパスが通っている場合，
.bash_profileあたりにrbenv の初期化設定を書いておく．

```~/.bash_profile
eval "$(rbenv init -)"
```

## VirtualBox インストール
https://www.virtualbox.org/wiki/Downloads
からダウンロード．

## vagrant でUbuntu 12.10をインストール

動作確認のために試しにUbuntu を入れてみる．
インストールできるOSの一覧は
http://www.vagrantbox.es/
で確認できる．


```bash
$ gem install vagrant
$ vagrant add box quantal https://github.com/downloads/roderik/VagrantQuantal64Box/quantal64.box
```
### 2013.10 現在
- - -
gem のバージョンが相当古いため，vagrant のサイトからダウンロードしたほうが良い
[Vagrant Downloads](http://downloads.vagrantup.com/)
- - -

ダウンロードが終わったら

```bash
$ vagrant init quantal
$ vagrant up
```

で起動．# 初回起動は時間がかかる様子．

```bash
$ vagrant ssh
```

でログインできる．終了する際は以下のコマンド

```bash
$ vagrant halt
```
git checkout [--theirs][--ours]


Xcodeのxibファイルは開いただけで、modifiedになっちゃうので、しょっちゅうコンフリクトを起こす。
しかも、ファイルが開けなくなるので、手動で修正できない。

そんなときは、

```
# サーバ側に合わせる
$ git checkout --theirs <path>
$ git add <path>

# 自分の方に合わせる
$ git checkout --ours <path>
$ git add <path>
```

あってるかな？
なにかいい解決策を知っている方がいらっしゃったら、教えてください。

##参照
[Gitでコンフリクトした時のための備忘録](http://d.hatena.ne.jp/sinsoku/20110831/1314720280 "Gitでコンフリクトした時のための備忘録")
jQueryを使ってドラッグ＆ドロップでリサイズできる関数を作る

jQueryを使って要素のリサイズが出来る関数を作ってみた。
ついでにクッキーに保存して後でまた使えるようにしてみた。

```javascript:resize.js
/**
 * 指定した要素の幅をリサイズする関数
 * リサイズした幅はクッキーに保存する
 */
function initTableResizer(targetId){
    var target = null;
    var width;

    //指定した要素外にマウスをドラッグした場合の処理
    $(window).mousemove(function(e){
        if (target != null) {
            width = e.clientX - parseInt ($('#' + targetId).offset().left);
            $('#' + targetId).css ({ width: width + 'px' });
            return false;
        }
        return false
    });

    //指定した要素内にマウスをドラッグした場合の処理
    $('#' + targetId).mousemove (function (e) {
        var right = parseInt ($(this).offset().left) + parseInt($(this).css("width"));
        if ((right - 10) < e.clientX) {
            if (e.clientX < (right + 10)) {
                $(this).css ({ cursor: 'col-resize' });
                return false;
            }
        }
        $(this).css ({ cursor: 'default' });
        return true;
    });

    //マウスを押した時cusorがcol-resizeになっていた場合bodyの何処にマウスを動かしてもcol-resizeになる処理
    $('#' + targetId).mousedown (function (e) {
        if ($(this).css('cursor') == 'col-resize') {
            target = $(this);
            $(document.body).css ({ cursor: 'col-resize' });
            return false;
        }
        return true;
    });

    //マウスを放したときクッキーに放したときのサイズを保存しcursorを元に戻す処理
    $(window).mouseup (function (e) {
        $.cookie('width', width);

        target = null;
        $(document.body).css ({ cursor: '' });
    });
}
```
homeberwでMySQL5.6にupgradeしたらユーザーが作成できなくて困ったときのメモ


mysql5.6にアップしてしばらくですが、ユーザーの追加を行おうと思ったら

```mysql
mysql > GRANT ALL PRIVILEGES ON *.* TO 'shikataka'@'localhost' IDENTIFIED BY 'hogehoge' WITH GRANT OPTION;
ERROR 2013 (HY000): Lost connection to MySQL server during query
```

なんて言われてユーザーが作成できませんでした。
一般には外部アクセスに失敗している時のエラーのようですがローカルへの接続なのでアクセスに失敗するというのもおかしい。

とりあえず

``` my.cnf
max_allowed_packet = 32M
```
こんな設定をしてみましたが変わらず…

エラーログ見るとこんなログが

```error.log
… 
2013-03-21 16:41:35 63836 [ERROR] Native table 'performance_schema'.'users' has the wrong structure
2013-03-21 16:41:35 63836 [ERROR] Native table 'performance_schema'.'accounts' has the wrong structure
2013-03-21 16:41:35 63836 [ERROR] Native table 'performance_schema'.'hosts' has the wrong structure
2013-03-21 16:41:35 63836 [ERROR] Native table 'performance_schema'.'socket_instances' has the wrong structure
2013-03-21 16:41:35 63836 [ERROR] Native table 'performance_schema'.'socket_summary_by_instance' has the wrong structure
2013-03-21 16:41:35 63836 [ERROR] Native table 'performance_schema'.'socket_summary_by_event_name' has the wrong structure
2013-03-21 16:41:35 63836 [ERROR] Native table 'performance_schema'.'session_connect_attrs' has the wrong structure
2013-03-21 16:41:35 63836 [ERROR] Native table 'performance_schema'.'session_account_connect_attrs' has the wrong structure
…
```

なんか壊れてるっぽい。
ググってみたら

>I've run mysql_upgrade and after that problem has >gone.

http://stackoverflow.com/questions/6288103/native-table-performance-schema-has-the-wrong-structure

なんてあったのでmysql_upgradeを実行。

```terminal
> mysql_upgrade -u root -p
…

Warning: Using a password on the command line interface can be insecure.
ERROR 1436 (HY000) at line 1904: Thread stack overrun:  11520 bytes used of a 131072 byte stack, and 128000 bytes needed.  Use 'mysqld --thread_stack=#' to specify a bigger stack.
FATAL ERROR: Upgrade failed
```

エラーが出たのでmy.cnfを設定

```my.cnf
thread_stack = 256K
```

再度実行

```
> mysql_upgrade -u root -p
…

OK
```

無事終わったのでユーザーを作成してみる。

```mysql
mysql > GRANT ALL PRIVILEGES ON *.* TO 'shikataka'@'localhost' IDENTIFIED BY 'hogehoge' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)
```

成功しました。
google製のjavascript圧縮処理(Closure compiler)を導入


### スーパーユーザ
```bash
sudo su
```

### srcディレクトリへ移動
```bash
cd /usr/local/src/
```

### 最新のjarファイル取得
```bash
curl -O  https://closure-compiler.googlecode.com/files/compiler-20130227.tar.gz
```

### ちなみに最新版を撮りたい場合
```bash
curl -O  https://closure-compiler.googlecode.com/files/compiler-latest.tar.gz
```

### 展開
```bash
tar zxf compiler-20130227.tar.gz  -C /usr/local/lib/
```

### 読み込み権限付与
```bash
chmod 755 /usr/local/lib/compiler.jar
```

### minify化実行
```bash
java -jar /usr/local/lib/compiler.jar --js=aaa.js --js_output_file=aaa.min.js
```

複数の場合
```bash
java -jar /usr/local/lib/compiler.jar --js=aaa.js --js=bbb.js --js=ccc.js --js_output_file=abc.mix.min.js
```

では、よいminify生活を

## 参考
[公式](https://code.google.com/p/closure-compiler/ "公式")
[ダウンロードリスト](https://code.google.com/p/closure-compiler/downloads/list "ダウンロードリスト")
項目1　どのJavaScriptを使っているのか意識しよう

こんにちは

EffectiveJavaScriptの翻訳版が発売されて社内で「磯野ー！読書会やろーぜ！」といってしまった手前、しょっぱに書かせてもらいます。

まずは最初の最初である項目1について解説をば。

# JavaScriptの経緯
最初はJavaScriptの歴史について軽く書かれていました。ECMAScriptの話ですね。
ECMAScriptは簡単に言ってしまえば、JavaScriptの標準規格（最低○○の動作や仕様は保証してね）というものです。
で、現在は第3版（ES3）と第5版（ES5）が広く普及しているようです。第4版についてはいろいろごたごたがあって標準化が出来ずに終わっています。詳しくは自分で調べるといいと思います。
また本書にはかかれてなかったですが最近では第6版の策定が進められていてなかなか面白い仕様が増えるようですよ奥さん！
ちなみに本書ではES5にフォーカスしていろいろ書かれているようです。

# 非標準機能
上で述べたようにJavaScriptはECMAScriptで標準規格が定まっていますが、逆に言えば「これさえ守っておけば後は独自拡張してもええよ」ということになります。具体的に言うとブラウザごとに動いたり動かなかったりする機能や仕様が存在したりします。

本書で挙げられている例ではconstが挙げられています。
（余談ですがconstについてはECMAScript第6版の標準仕様に盛り込まれる予定らしいです。）
たとえば次のコードではどういう結果を望むでしょうか。

```JavaScript:constExample.js
const x=1;
console.log(x);
x=10;
console.log(x);
```

constで宣言されているためxの値が変わらないことを期待するでしょう。実際のそのとおりに動くものもあります。が、動かないものもあります。（実際に手元のブラウザで確認しましたがChrome,Firefoxは期待通りに動いてIEではsyntax errorを出しました）

# 'use strict'を使おう
こういうのはわかっていてもついつい使ってしまうことがままあるかと思われます。しかしながら複数ブラウザ対応しなくてはいけないのが、web開発においては重要なので、出来るだけわかりやすく警告してくれると助かります。そういうときには'use strict'をコードの先頭に書けば非標準の仕様の利用を禁止することが出来ます。
たとえばグローバル変数宣言をしてしまった場合にエラーを出します。

```JavaScript:strict.js
"use strict";
var x=10;
y=5; //ReferenceError: assignment to undeclared variable y
```

strictモード時にどういうものが禁止になるかは下記を参照してください
https://developer.mozilla.org/ja/docs/JavaScript/Reference/Functions_and_function_scope/Strict_mode

なぜ文字列リテラルを使うかというと後方互換性を保つためです。文字列リテラルなら
ES5よりも古いものだったとしても実行可能だからです。この場合ちゃんとES5環境にしてくれよ！と思うかもしれませんが大人の事情とかもあるかもしれないので、それはまた別の話です･･･。

# strictモードの注意点
strictコードはモダンなJavaScriptを書くときにはほぼ必須といいレベルで書くべきだと思われます。しかし使う場合にもさまざまな問題があります。
strictモードの最大の問題は「"use strict"ディレクティブは必ずそのスコープの先頭におかなくてはならない」ということです。
ぱっと見「そんなの当たり前じゃないか。忘れるわけないよ！」と思うかもしれませんが、規模が大きくなったときにこの問題は顕著になってきます。
JavaScriptではファイル単位でのモジュール機構をデフォルトでは備えていないため最初に読み出されるプログラムファイルの先頭に"use strict"が存在すれば、以下に読み出されるプログラムファイルにも適用されてしまいます。
また逆に"use strict"が最初に読み出されるプログラムファイルがなければstrictモードにはならないということです。
これの問題の解決方法としては即時関数式を用いてスコープを制御する方法があります。
たとえば以下のコードでは上の部分ではstrictモードになっていますが、下の部分ではstrictモードにはなっていません

```JavaScript:strict2.js
(function(){
  "use strict";
  var x=10;
  y=5; //ReferenceError: assignment to undeclared variable y
})();
(function(){
  var a=10;
  b=5; //ok
})();
```

この考え方はモジュール機構と同様の方式です。
このようにしておけば既存コードを保持しつつ、新規部分についてはstrictモードを使ったモダンなJavaScriptを書くことが出来るということです。

ということで長い事欠きましたが第1項を読んだまとめでした。

# 次回もご期待ください!
(あるかわからないけど)
google製のcss圧縮処理(Closure Stylesheets)を導入


### スーパーユーザ
```bash
sudo su
```

### srcディレクトリへ移動
```bash
cd /usr/local/src/
```

### 最新のjarファイル取得
```bash
curl -O  https://closure-stylesheets.googlecode.com/files/closure-stylesheets-20111230.jar
```

### 実行権限付与
```bash
chmod 755 closure-stylesheets-20111230.jar
```

### シンボリックリンク作成
```bash
ln -s /usr/local/src/closure-stylesheets-20111230.jar /usr/local/lib/closure-stylesheets.jar
```

### minify化実行
```bash
java -jar /usr/local/lib/closure-stylesheets.jar aaa.css --output-file aaa.min.css
```

複数の場合
```bash
java -jar /usr/local/lib/closure-stylesheets.jar aaa.css bbb.css ccc.css --output-file abc.mix.min.css
```

では、よいminify生活を

## 参考
[参考ブログ](http://webos-goodies.jp/archives/how_to_use_closure_stylesheets_part_1.html "参考ブログ")
[公式](https://code.google.com/p/closure-stylesheets/ "公式")
[ダウンロードリスト](https://code.google.com/p/closure-stylesheets/downloads/list "ダウンロードリスト")
CentOS5.9を最小インストールしたらyumが入ってなかった…。

CentOS 5.9を最小構成（インストール時のパッケージ選択でBaseグループも含めて全てのものにチェックを入れない）で導入したら、yumもsshdも入ってなかった。

今まではそんなことはなかったように思うんだけど、とりあえず、yumやsshdがないことには進められないので、rpmを利用してyumを入れた。

```sh:GPGキーを導入
rpm --import http://mirror.centos.org/centos/5.9/os/x86_64/RPM-GPG-KEY-CentOS-5
```

```sh:yumの依存パッケージを導入
rpm -ivh http://mirror.centos.org/centos/5.9/os/x86_64/CentOS/m2crypto-0.16-9.el5.x86_64.rpm
rpm -ivh http://mirror.centos.org/centos/5.9/os/x86_64/CentOS/python-urlgrabber-3.1.0-6.el5.noarch.rpm
rpm -ivh http://mirror.centos.org/centos/5.9/os/x86_64/CentOS/yum-metadata-parser-1.1.2-4.el5.x86_64.rpm
rpm -ivh http://mirror.centos.org/centos/5.9/os/x86_64/CentOS/rpm-python-4.4.2.3-31.el5.x86_64.rpm
rpm -ivh http://mirror.centos.org/centos/5.9/os/x86_64/CentOS/python-sqlite-1.1.7-1.2.1.x86_64.rpm
rpm -ivh http://mirror.centos.org/centos/5.9/os/x86_64/CentOS/python-elementtree-1.2.6-5.x86_64.rpm
```

CentOS5.9で入るyum 3.2系は依存が増えているので、依存の少ない3.0系を、3.0系が採用されていた最終版のCentOS5.1から入れる。

```sh:CentOS5.1からyumを導入(URLが違うので注意)
rpm -ivh http://vault.centos.org/5.1/os/x86_64/CentOS/yum-3.0.5-1.el5.centos.5.noarch.rpm
```

今入れたyumを利用してssh関連を導入。ついでにyumも最新版に変更しておく。

```sh:yumとsshを導入
yum -y install yum openssh*
```

## 追記情報

同様の現象に遭遇したらしい人を発見したので掲載しておきます。

> CentOS5.9で上記手法の最小構成で構築したらsshdやyumがインストールされなくなっていた。
> 代わりにhyper-vが最小限選択に選ばれていた。。
> なので、[ベース]を選択を有効にするか、[ベース]の中の[ssh-client][ssh-server][yum]らのみは有効にします。
> そうしないと外部からログインができなく、プログラムの更新もまともにできない。
[OS(Linux) - Chaperone](http://web.chaperone.jp/w/?OS%28Linux%29)

私がCentOS5.8をインストールした際には発生していなかったので、5.9からの変更と思われます。
GitHub の Compare View で差分を見る (hub compare)

`https://github.com/:user/:repo/compare/:start...:end` という URL を叩くと Compare View という画面になり、

* :start から :end までのコミット
* :start から :end までの diff
* :start から :end までのコミットに対してつけられたコメント

が一覧できる。 :start, :end には commit の sha1 や master, HEAD などの名前、そしてタグが使える。 例: https://github.com/fastladder/fastladder/compare/2.3.5...master

----

`master` は不定なので、特定のコミット間の差を見たい場合は commit sha に置き換えたほうが安全。 `git rev-parse master` などとすると commit sha1 が得られる。

```
$ git rev-parse master
711ae09c3de07532c4ee86d7a8ffb08bfa6d369e
```

----

`hub` コマンドは Compare View を開く `hub compare` というサブコマンドがある。

       git compare [-u] [USER] [START...]END
              Open a GitHub compare view page in the system's default web browser. START to END are branch names, tag
              names,  or  commit SHA1s specifying the range of history to compare. If a range with two dots (a..b) is
              given, it will be transformed into one with three dots.  If  START  is  omitted,  GitHub  will  compare
              against the base branch (the default is "master").

```
$ hub compare 2.3.5...master
```

----

`hub` に :start, :end を渡すときに `git rev-parse` で commit sha1 を展開しておくと URL を操作する手間が省けて便利。あまりスマートではないが。

```
$ hub compare 2.3.5...`git rev-parse master`
```

https://github.com/fastladder/fastladder/compare/2.3.5...711ae09c3de07532c4ee86d7a8ffb08bfa6d369e

----

`hub` http://defunkt.io/hub/
ruby2.0.0 + rails4でspork+rspecしようとしたら動かなかった

原因探るのにちょっと時間かかりました。いやー、issueはちゃんと確認するべきですね。
https://github.com/sporkrb/spork-rails/pull/13

この人の対策では、ActionModel::Observingがあるかどうかを確認してるみたいです。
なるほどー。じゃあこれ含めれば直る？　ってことで、fetchしてmergeしてみました。

# 動かしてみる
https://github.com/sporkrb/spork-rails/pull/13#issuecomment-15020203

まさにこの状況になりまして、困ったもんだ。
追跡してみると、どうもLoadErrorで例外はいてるっぽい。

# 原因
実はRuby2.0.0からLoadError#pathが追加されまして、Rails4で追加していたLoadError#pathを```unless method_defined?```で括るようになりました。

この二つのLoadError#pathには挙動に若干違いがありまして、

・Rails 
わたってきた例外メッセージを正規表現で解析して、ファイル名なんかを@pathに突っ込んでます。

```ruby
p LoadError.new("cannot load such file -- helpers/aaa_spec.rb").path
# helpers/aaa_spec.rb
```

・Ruby2.0.0
例外発生時、内部的に@pathにファイル名なんかを渡す（と思う）。

```ruby
p LoadError.new("cannot load such file -- helpers/aaa_spec.rb").path
# nil
```

spork-railsで期待してるのは前者なので、#pathに何も入ってなくて涙目、例外って感じです。

# どうするの？
<del>
こっちは報告にあがってるだけで、誰かがpull requestしたものはなさそうでした。
# フォークした誰かが修正してたら知らないけど。
なので、人生初プルリクを投げてみて、でもここ数ヶ月動いてなさそうな雰囲気だったので、上のプルリクと自分のプルリクをマージしたものを利用してますです。

https://github.com/A-gen/spork-rails

それにしても、英語書くの超難しいですね。拙くて意味わからないかもしれないなー、なんて思いつつ、返事を待ちます。
</del>

20130902追記：
PR棄却されてましたorz
対応を内部で進めていたらしく、自分の対応もそれに加えているのだとか。
なので、特に気にせずcloneすれば使えると思います。
Ruby 2.0.0 から trap handler の中で Mutex をロックできなくなった

某社のプロダクトでは、unicorn のタイムアウトが起きたタイミングで実行される trap handler の中で、ActiveRecord から発行された遅いクエリを FluentLogger を使って記録していたんです。

でも、Ruby 2.0.0 から trap handler の中で Mutex をロックできなくなったので、FluentLogger での書き込みもできなくなっちゃいました。残念。
RequireJSで、テキストファイルを依存関係として指定する方法

RequireJSを使うとき、単純な文字列を依存関係として指定したいという要求があると思う。例えば描画するときに使うHTMLのスニペットとか。

そんなときはこうする。

```javascript
// hoge-html.js
define({
    content: "<div id='hoge' ... >...</div>"
});
```

```javascript
require(['hoge-html.js'], function(hoge){
  $('body').append(hoge.content);
});
```

しかし、たかが文字列を管理するのに、いちいちdefineでラップするのはかっこ良くない。実はもっといい方法がある。


```html
// hoge.html
<div id='hoge' ... >
  ...
</div>
```

```javascript
// 'text!'をファイル名の頭に付ける。
require(['text!hoge.html'], function(hoge){
  $('body').append(hoge.content);
});
```

text.jsプラグインというものがあり、これを使えばテキストファイルをjs化しなくても、RequireJS化で管理できる。

方法は簡単で、

* 下記のレポジトリのtext.jsファイルを、RequireJSが最初に読み込むファイルと同じ階層に置く。
* require/defineで指定する依存関係のファイル名の頭に、 'text!'を付ける。

これで、テキストファイルをjs化+defineでラップしなくて済む。

http://requirejs.org/docs/api.html#text
https://github.com/requirejs/text