OmniAICreator/Qiita-1.07M huggingface dataset:
bundle installでrmagick 2.13.1が途中でコケる場合の対応

Homebrewで既にImagemagickをインストールしてる前提で。

```shell:
cd /usr/local/Cellar/imagemagick/6.8.0-10/lib/
ln -s libMagickCore-Q16.7.dylib libMagickCore.dylib
ln -s libMagickWand-Q16.7.dylib libMagickWand.dylib
```

あとは普通にbundle install rmagic
Windows の Vagrant で 64 bit OS が起動しないとき

今北産業
========

Windows の Vagrant で
64 bit OS を起動できないときは
BIOS をチェック

もっと詳しく
============

Vagrant 便利ですね。でも Windows だとちょっとハマります。公式サイトに書いてある lucid32 やら precise32 ならちゃんと入るんですが、[id:naoya さんの記事](http://d.hatena.ne.jp/naoya/20130205/1360062070)にある 64 bit 版の CentOS を入れようとすると、こんな状況に遭遇することがあります。

```
[default] -- 22 => 2222 (adapter 1)
[default] Booting VM...
[default] Waiting for VM to boot. This can take a few minutes.
```

……

……

……

待てど暮らせど進まない！※1

こんなとき、VirtualBox を起動すると、たぶんプレビューがこうなってます。

![起動しない画面](http://s9.postimage.org/f3tw4jrin/virtualbox.png)

[画像](http://postimage.org/image/7b38ckljf/)

ここで自力でゲストOSの電源をオフ、オンすると、たぶんこんなダイアログが出ます。

![仮想化支援機能(VT-x/AMD-V)を有効化できません](http://s18.postimage.org/yj9rim8x5/virtualbox2.png)

[画像](http://postimage.org/image/5tmvlz4x1/)

この文章で検索すると、["仮想化支援機能(VT-x/AMD-V)を有効化できません - ablog"](http://d.hatena.ne.jp/yohei-a/20110124/1295887695) という素晴らしい記事に行き着きます。そこでの案内に従い、BIOS で VT を有効にするなどすると、無事に起動するはずです。

※1. なお、precise64 で試したところ、最初の全然進まない場面では、進むことは進んだんですが、エラーになりました。

※2. VT を有効化しても Android のエミュレータを爆速化する Intel Hardware Accelerated Execution Manager が入っていると起動しないことがあります。その場合はアンインストールしてください。
UIWebViewの上下フリックでツールバーを表示したりしなかったり


SmartNewsやPintrestを見ているとスクロールに応じてツールバー（もしくはタブ）を表示したりしなかったりしている。

これは、UIWebViewの下を見ようとフリックしていく際にはツールバーを消し、逆に上を見ようとフリックした際にはツールバーを表示していて、iPhoneの狭い画面でもなるべく広く使うためのテクニックになっている。

![](http://24.media.tumblr.com/eb7e1860e00ecca733d00343ecefb68f/tumblr_mjzlp5in8x1qzzao7o1_400.jpg)

↑このツールバーは常に表示する必要がないので出したり出さなかったり

## 仕様をまとめる

- 画面の下を見ようとする動作でツールバー消す
 - 上に向けてフリック
 - スクロール後のy軸オフセット値がスクロール前より増える
 - =>スクロールビューのdelegateでオフセット値を計算
 - => scrollViewWillBeginDragging:でスクロールし始めを取得
 - => scrollViewDidScroll:でスクロール後に増えてたら消す

- 画面の上に戻ろうとする動作でツールバーを表示
 - 下に向けてフリック
 - スクロール後のy軸オフセット値がスクロール前より減る
 - =>スクロールビューのdelegateでオフセット値を計算
 - => scrollViewWillBeginDragging:でスクロールし始めを取得
 - => scrollViewDidScroll:でスクロール後に増えてたら表示

- ツールバーはアニメーションで消す
 - すでにアニメーションが行われていれば割り込まない
 - =>フラグもしくは列挙体でステータスを制御

## コード
スクロールのステータスを表すenumを用意しておく

```objectivec:
typedef enum {
    QVToolBarScrollStatusInit = 0,
    QVToolBarScrollStatusAnimation ,
}QVToolBarScrollStatus;
```

スクロールしはじめのオフセット値を保持するプロパティを用意

```objectivec:
@property(nonatomic) CGFloat beginScrollOffsetY;
```

UIScrollViewのdelegateを実装して計算

```objectivec:
//スクロールビューをドラッグし始めた際に一度実行される
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;
{    
    self.beginScrollOffsetY = [scrollView contentOffset].y;
}

//スクロールビューがスクロールされるたびに実行され続ける
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (QVToolBarScrollStatusAnimation == self.toolBarScrollStatus) {
        return;
    }
    
    if (self.beginScrollOffsetY < [scrollView contentOffset].y
        && !self.toolBar.hidden) {
        //スクロール前のオフセットよりスクロール後が多い=下を見ようとした =>スクロールバーを隠す
        [UIView animateWithDuration:0.4 animations:^{
            self.toolBarScrollStatus = QVToolBarScrollStatusAnimation;
            
            CGRect rect = self.toolBar.frame;
            self.toolBar.frame = CGRectMake(rect.origin.x,
                                            rect.origin.y + rect.size.height,
                                            rect.size.width,
                                            rect.size.height);
        } completion:^(BOOL finished) {
            
            self.toolBar.hidden = YES;
            self.toolBarScrollStatus = QVToolBarScrollStatusInit;
        }];
    } else if ([scrollView contentOffset].y < self.beginScrollOffsetY
               && self.toolBar.hidden
               && 0.0 != self.beginScrollOffsetY) {
        self.toolBar.hidden = NO;
        [UIView animateWithDuration:0.4 animations:^{
            self.toolBarScrollStatus = QVToolBarScrollStatusAnimation;
            
            CGRect rect = self.toolBar.frame;
            self.toolBar.frame = CGRectMake(rect.origin.x,
                                            rect.origin.y - rect.size.height,
                                            rect.size.width,
                                            rect.size.height);
        } completion:^(BOOL finished) {
            
            self.toolBarScrollStatus = QVToolBarScrollStatusInit;
        }];
    }
}
```
emacsでのRubyMotionの開発にauto-completeを使う

[RubyMotion用のmotion-mode.elを作ったましましブログ | ましましブログ](http://blog.ainam.me/2013/03/21/rubymotion-motion-mode-el-emacs/)

motion-modeというものを作りました。
機能はほとんどないのですが、gitのリポジトリの中のRakefileを元に
RubyMotionのプロジェクトかどうかを判定して、
motion-mode(ruby-modeの派生モード)に切り替えます。

一応、付属機能として、auto-completeのための辞書を作るスクリプトが添付されてます。
make_dict.rbで、辞書を作り、~/.emacs.d/ac-dictなどに、motion-modeという名前で
辞書を設置すると簡易的な補完ができるようになります。

ruby-mode以外のメジャーモードで環境を切り分けることで、
今後、motion-mode上にいろいろなキーバインドなり機能を継ぎ足すことができるかと思います。
RVMでruby 2.0.0をインストールしようとしてハマった

rvmでruby2.0.0を入れようとしたら、RubyGemsが上手く入らなかったので、その時のメモ。


まずはrvmのアップデート。`rvm update`方式は廃止されたようなので、

```Bash:
$ rvm get stable
$ rvm reload
```

さくっとインストールする。

```Bash:
$ rvm install 2.0.0
```

そして、さくっとエラーが吐かれる。

```Bash:Error
\Error running'env GEM_PATH=/Users/atom/.rvm/gems/ruby-2.0.0-p0:/Users/atom/.rvm/gems/ruby-2.0.0-p0@global:/Users/atom/.rvm/gems/ruby-2.0.0-p0:/Users/atom/.rvm/gems/ruby-2.0.0-p0@global GEM_HOME=/Users/atom/.rvm/gems/ruby-2.0.0-p0 /Users/atom/.rvm/rubies/ruby-2.0.0-p0/bin/ruby -d /Users/atom/.rvm/src/rubygems-2.0.3/setup.rb --verbose',
please read /Users/atom/.rvm/log/ruby-2.0.0-p0/rubygems.install.log
Installation of rubygems did not complete successfully.
```

どうやら、RubyGemsがちゃんと入らなかったらしい。
いろいろぐぐってみると、

```Bash:
$ echo ${LANG:-empty}
$ export LANG=en_US.utf-8
```

の2つを叩けばいいらしい。1つ目の`echo`で、`LAND=ja_JA.utf-8`が返されたので、どうやらこれが原因らしい。2つ目の`export`を実行して、

```
$ rvm install 2.0.0
```

をしたら無事インストールできた。
StoreKit アプリ内課金で正常に終了していないトランザクションに対する対処方法


# 追記

記載のコードだとクラッシュする致命的なバグがあるので以下を追記しました。

```
if (t.transactionState != SKPaymentTransactionStatePurchasing) {
	[[SKPaymentQueue defaultQueue] finishTransaction:t];
}
```

*※`SKPaymentTransactionStatePurchasing`に`-finishTransaction:`すると例外が発生します*

ただこれだと`SKPaymentTransactionStatePurchasing`なtransactionがある場合はどうすればいいのだろう・・・やはり`SKPaymentTransactionObserver Protocol`で何とか処理する方法がいいんですかね・・・。

---

Non-Consumable(非消耗型)での正常に終了していないトランザクションに対する対処方法です。

![すでにこのアイテムを購入されていますが、ダウンロードされていません。今すぐダウンロードするには「OK」をタップします。](http://f.cl.ly/items/3d3i021b1u0T080p461m/ss.png)

購入処理が正常に終了しなかった場合に再度購入しようとすると上記のアラートが出る場合があります。
このアラートが出る原因は、`finishTransaction:`がされてないトランザクションに対して同一のアイテムで再度購入リクエストを送ると表示されます。ちなみにOKを押しても購入処理は完了されません。

ユーザーが何をすれば起きるかですが、

- 購入処理中にアプリを強制終了
- 購入処理中にバックグラウンドに遷移する(※詳しくは補足で説明)

などが発生の原因になりそうです。(ようはそのトランザクション処理が`finishTransaction:`されなければ起きるということです)

*※以前、LINEアプリで起動の度にAppleIDとパスワードのアラートが出てしまうバグが起こっていましたが、この正常に終了してないトランザクションが原因かと思われます。*

## 対応

単純に`defaultQueue`に未処理のトランザクションがないかを確認し、その後未処理の各トランザクションに対して`finishTransaction:`すれば解決します。

```objectivec:StoreKitHelper.m
+ (BOOL)isUntreatedTransaction
{
    return [SKPaymentQueue defaultQueue].transactions.count > 0 ? YES : NO;
}
```
確認と一緒に`finishTransaction:`したければ以下のようにすれば良いかと思います。
(更に購入フラグを立てたければ、各トランザクションを個別で判断やRestore処理をする必要があります)

```objectivec:StoreKitHelper.m
+ (BOOL)isUntreatedTransaction
{    
    BOOL isUntreated = NO;
    NSArray *transactions = [SKPaymentQueue defaultQueue].transactions;
    for (SKPaymentTransaction *t in transactions) {
        NSLog(@"%@ %@ %@ %@ %d", t, t.transactionIdentifier, t.transactionReceipt, t.transactionDate, t.transactionState);
		 if (t.transactionState != SKPaymentTransactionStatePurchasing) {
        	[[SKPaymentQueue defaultQueue] finishTransaction:t];
		 }
        isUntreated = YES;
    }
    return isUntreated;
}
```

## 注意

	- application:didFinishLaunchingWithOptions:

の時点では、未処理のトランザクションがあっても`transactions`は0で確認出来ませんでした。
タイミングがわからないので、起動時とかでなくリクエストを送る前に確認するようにしています。

## 補足

iOS5とiOS6では微妙に挙動の違いがあります。
iOS6でのほとんどの場合に購入処理中にバックグラウンドに遷移してもキャンセル処理が発生します。(iOS5ではキャンセル処理が発生しないタイミングがiOS6より多かったです。)
ただし、購入アラートが表示されている状態(or直前)でバックグラウンドに遷移するとホーム画面で購入処理画面が表示され、そのまま購入処理を進めることが出来てしまいます。ようはタイミングによってはキャンセル処理が呼ばれない場合があります。
もしもそこで正常に購入処理を最後まで進めてしまいかつアプリに戻らなかった場合、今回の`finishTransaction:`されてないトランザクションが出来てしまいます。

別の対処法で`UIApplicationDelegate`でバックグラウンドに遷移した場合にトランザクションを終了させてしまえばいいとも考えられます。ただしその場合でも強制終了には対応出来ないと思われますので、やはりリクエストを送る時に確認する方法が良いかと思います。
shellスクリプトを書きたくなったときのための覚え書き


##コメントの書き方
> \# コメントは「シャープ」で始める

##スクリプト指定のために冒頭に必要な記述(必ず必要)
> \#!/bin/sh

##シェル変数の宣言
> svar1=value1

変数威名svar1を定義して、値「value1」を代入する。

※ 「=」の前後にスペースを空けてはいけない

####文字列の宣言
空白文字やメタキャラクタを含んだ文字列を代入するときにはクオーテーション「'」かダブルクオーテーション「"」で囲みます。

> svar1='example of value'

##変数の参照
変数を参照するときには変数名の前に「$」を付加する
（シェル出力コマンド echo）

> echo 'シェル変数 svar1 の値は' $svar1

##if文
if文を書くときにはif 条件 then コマンド fiで囲む。
複数コマンドの時はelif文を使う。
（真偽値は便宜的に、True: 0 False: 1）
以下、簡単な構造例

```ifの構造例
if condition1
then 
	command1
elif condition2
then
	command2
else
	command3
fi
```

##リダイレクト
　コマンドを実行したときにその出力をファイルに書き込みたいときにダイレクトとリダイレクトを用いる。

**出力先をファイルへ**

>$ command > file.txt

**出力先をファイルへ（追記）**

>$ command >> file.txt

**入力元の切り替え（１行）**

>$ command < input

**入力元の切り替え（複数行）**

>$ command << input

※ 標準出力と標準エラー出力をリダイレクトで強制的に出力しない方法。

> $ command > /dev/null 2>&1

##その他よく使うコマンド（その内追記）
・case文
・while文
・until文
・for文
・break文
・exit文

##参考ページ
・[日経Linux: シェル・スクリプト](http://itpro.nikkeibp.co.jp/article/COLUMN/20060724/244143/)
・[]()
・[]()
・[]()
複数のデータをまとめて扱う　〜複数データを扱うデザインパターン〜

「配列変数じゃもの足りない。データベースじゃ大げさ。」
そんな場合には、こんな方法で処理しています。

目次
1.配列を使う、今までのの方式
2.ArrayListを配列の代わりとして使う
3.ジェネリッククラスを使う
4.LINQで検索する

## 1.配列変数を使う、今までの方式

あるデータを複数まとめて扱う場合、配列変数に入れておくことは、よくあることだと思います。  
例えば、チームのメンバーを配列変数に入れておく、といったような場合です。  
まず、メンバー一人を表現するクラスを作ります。

```vb.net:human.vb
Public Class Human

    ''' <summary>
    ''' 名前
    ''' </summary>
    ''' <remarks>苗字＋名前の名前の部分</remarks>
    Private pFirstName As String

    ''' <summary>
    ''' 苗字
    ''' </summary>
    ''' <remarks>苗字＋名前の名前の苗字</remarks>
    Private pLastName As String

    ''' <summary>
    ''' 生年月日
    ''' </summary>
    Private pBarthday As Date

    ''' <summary>
    ''' コンストラクタ
    ''' </summary>
    ''' <param name="isFirstName">この人の名前</param>
    ''' <param name="isLastName">この人の苗字</param>
    ''' <param name="idBarthday">この人の生年月日</param>
    Public Sub New(ByVal isFirstName As String, ByVal isLastName As String, ByVal idBarthday As Date)
        pFirstName = isFirstName
        pLastName = isLastName
        pBarthday = idBarthday
    End Sub

    ''' <summary>
    ''' 氏名（苗字＋名前）を返す
    ''' </summary>
    ''' <returns>氏名</returns>
    Public Function getFullName() As String
        Return pLastName & pFirstName
    End Function

End Class
```
こんな感じ。  
次に、メンバー達を管理するために、配列変数を作ります。

```vb.net:testcode1.vb
        Dim members(0 To 2) As Human 'あらかじめ大きさを決めておかないといけない
        members(0) = New Human("太郎", "山田", #3/1/1950#)
        members(1) = New Human("花子", "佐藤", #8/31/1970#)
        members(2) = New Human("次郎", "山田", #3/1/2010#)
        'すぐ追加できない。ReDimでサイズを変更しないと。
```

VB.NET(.NET Framework)の配列は賢いので、C言語のそれと比べれば扱いやすいですが、それでも、要素を追加したり削除するのは面倒です。

## ArrayListを配列の代わりとして使う

そこで、ArrayListを使います。

```vb.net:testcode2.vb
        Dim membersArrayList As New ArrayList '大きさを決めておかなくていい！
        membersArrayList.Add(New Human("太郎", "山田", #3/1/1950#))
        membersArrayList.Add(New Human("花子", "佐藤", #8/31/1970#))
        membersArrayList.Add(New Human("次郎", "山田", #3/1/2010#))

        '追加はAddすればいい!
        membersArrayList.Add(New Human("智子", "鈴木", #5/1/1990#))

        'For Each文で、簡単に各要素へアクセス
        For Each oneMember As Human In membersArrayList
            Debug.Print(oneMember.getFullName)
        Next
```

上記のように、配列のように大きさを気にする必要がなくなる分コーディングが楽になり、本来コーディングしたい内容に集中でき、バグも入り込みにくくなります。

### でも、ArrayListってめんどくさい

しかし、`ArrayList.Add()`は引数にObject型を受け取るので、下記のように、違うものも追加できてしまいます。

```vb.net:testcode3.vb
        '違う型も追加できてしまう！まぜるな危険！
        Dim otherObject As New Object
        membersArrayList.Add(otherObject)
```

こんな風に混じり物があると、`For Each`で回した時、実行時エラーになってしまいます。

### 取り出すとオブジェクト型になってる

もう１つ厄介なことがあります。`ArrayList.Items()`で１件のデータを取り出すと、Object型になっているので、キャストしないとHuman型の`getFullName()`を呼び出せません。
また、さっきのように「まぜちゃった」ら、キャストしたときに実行時エラーになってしまいます。

## 3.ジェネリッククラスを使う

## 4.LINQで検索する

（書き途中ですが、upしちゃいます）
PDFDocumentをDiskに書き出す前に、そのサイズを知る


タイトルの通りなのですが、PDFDocumentをDiskにFileとして書き出す前に、そのファイルサイズが知りたかったので調べてました。
あっさり簡単に出来てしまったのですが、メモとして残しておこうと思います。

```objectivec
PDFDocument *pdf = （省略） ;
```

ってなっているPDFを、

```objectivec
int pdfFileSize = [[pdf dataRepresentation] length] ;
```

ってやることで、Diskに書き出す前にそのサイズを取得できました。

これで、目的に一歩近づいた（笑）
Twitter Bootstrap3 を試す


みんな大好きBootstrapですが、次のバージョンである3、[こんなサイト](http://rc.getbootstrap.com/)ができて、夏にはでるんじゃないかという話も聞いたので、その前にどんな感じか確認してみました。以下その方法です。

## githubからbootstrap3を入手
まずは[bootstrapのgithub](https://github.com/twitter/bootstrap)から入手。3っぽいbranchは3.0.0-wipなので、それを。

## npm install と make を実行
入手したらそのディレクトリへ移動し、`npm intall`を実行すると、必要なものをごっそり取ってきてくれます。npmなんじゃらほいな人はnodeをインストールするとnpmが入ります。ちなみに最近はインストールパッケージもあるみたいですねnode。途中-gがどうとかWARNが出ましたが、とりあえずの確認にはスルーして問題ありませんでした。

`npm install`でごっそり導入し終わったら、そのまま`make`を実行すると、JSHintやらLESSやらが実行されて、ビルド完了！

## htmlファイルを見るためにJekyll実行
サンプルとかが見られるドキュメントはdocs/index.htmlとかなのですが、開いてみるとヘッダとかがない。調べてみたところ、これはJekyllのテンプレートのようです。２まではMustache使ってたのがJekyllに変わるようですね。Jekyllについては[30分のチュートリアルでJekyllを理解する](http://melborne.github.com/2012/05/13/first-step-of-jekyll/)が参考になりました。

Jekyllを導入。`gem install jekyll`でOK。

インストール後はファイルを変換してもよいのですが、めんどくさかったのでサーバで起動しました。`jekyll --server`で起動して http://localhost:9001 にアクセスすると、見られます！

まだ一部おかしなところもあったりしますが、情報はありますし、ボタンなどの見た目もみられます。いわゆるフラットデザインっぽい感じになってますね。
Vimのpython3で日本語表示するの面倒くさすぎワロタｗｗｗ

注：以下の内容は、KaoriYa版Vim 7.3.865 (2013/03/17版)でしか確認していません。

VimのPython 3インターフェイスで、文字列をバッファの一行目に表示する場合、"abcde" という文字列であれば、

```python
py3 text = "abcde"
py3 import vim
py3 vim.eval('setline(1, "{}")'.format(text))
```

で良いのですが、日本語文字列、例えば "あいうえお" を表示する場合は、

```python
py3 text = "\u3042\u3044\u3046\u3048\u304A"  # == "あいうえお"
py3 import vim
py3 vim_encoding = vim.eval("&encoding")
py3 vim.eval('setline(1, "{}")'.format(''.join([r"\x{:02x}".format(x) for x in text.encode(vim_encoding)])))
```

としなければいけませんでした。面倒くさいですね。

日本語を表示するだけでここまで手間がかかるのは、Python 3インターフェイスの vim.eval() の仕様に原因があります。

Python 3インターフェイスの vim.eval() は、引数としてPython文字列しか受け取ってくれないのですが、その文字列をUTF-8でエンコードしてからVimのエンコーディングでデコードするという謎仕様になっているのです。

そのため、日本語文字列を渡したい場合は、Python文字列（例："あ"）をVimのエンコーディングでエンコード（例：b'\\x82\\xa0'）してから16進エスケープした文字列を作成（例：'\\\\x82\\\\xa0'）した上で、ダブルクォート文字列にして vim.eval() に渡す（例：'setline(1, "\\\\x82\\\\xa0")'）という手間をかける必要がありました。

ひょっとしたらもっと簡単な方法があるのかもしれませんので、もしどなたかご存知でしたら教えてください。m(__)m
スキューエフェクトをかける

そんなになじみの無い名前だと思うのでスクショを見ていただいた方がいいと思います。

![スキュー](http://farm9.staticflickr.com/8092/8573816037_759aa7c6c4_b.jpg "スキュー")

平行四辺形に変換するわけです。
これはCATransform3DとCALayerを使って実現します。

ちなみにこの方法はUIViewに結びついたCALayerには少々使いにくいです。
（Autolayoutが有効だとエラーが出る）

以下のように行列を作成します。（CA~~~という名前で自分で定義するのは良くないかも？）

```
static CATransform3D CATransform3DMakeShearY(float rotation)
{
    CATransform3D shear = {
        1.0, 0.0, 0.0, 0.0,
        tanf(rotation), 1.0, 0.0, 0.0,
        0.0, 0.0, 1.0, 0.0,
        0.0, 0.0, 0.0, 1.0,
    };
    return shear;
}
static CATransform3D CATransform3DMakeShearX(float rotation)
{
    CATransform3D shear = {
        1.0, tanf(rotation), 0.0, 0.0,
        0.0, 1.0, 0.0, 0.0,
        0.0, 0.0, 1.0, 0.0,
        0.0, 0.0, 0.0, 1.0,
    };
    return shear;
}
```

これをCALayerのtransformプロパティにセットするだけです。
当然アニメーションにも利用可能です。

結局行列として表現できる変形であれば、なんでも実現できるわけなので、
標準のAPIばかりにとらわれないようにしたいですね。
機会があればパースペクティブトランスフォーム系も調べてみようとおもいます。

プロジェクト一式欲しい方はこちらから

https://github.com/Ushio/ShearTransform
mongodb 2.2系から2.4系へのアップグレード手順

# mongodb 2.2.xから2.4.xへのアップグレード手順

2.4.0のRelease Notes
何がどう変わったかは、ここを見てね
http://docs.mongodb.org/manual/release-notes/2.4/

### 現在のバージョン確認
```bash
$ mongo --version
MongoDB shell version: 2.2.2
```

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

### データファイルバックアップ
```bash
cp -pr /var/lib/mongo{,.`date +"%Y%m%d"`}	
```

### src格納ディレクトリ移動(任意のディレクトリ)
cd /usr/local/src/
```

### mongo 2.4.x取得
```bash
curl -O  http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.0.tgz
```

### 展開
```bash
tar zxf mongodb-linux-x86_64-2.4.0.tgz
```

### 圧縮ファイル削除
```bash
rm -f mongodb-linux-x86_64-2.4.0.tgz
```

### mongodサービス停止
```bash
$ service mongod stop
Stopping mongod:                                           [  OK  ]
```

### mongoプロセス起動確認
```bash
$ ps auxww | grep mongo
root     19788  0.0  0.0   6380   664 pts/0    S+   20:59   0:00 grep mongo
```

### binコピー
```bash
$ cp -r --force mongodb-linux-x86_64-2.4.0/bin/* /usr/bin/
cp: overwrite `/usr/bin/bsondump'? y
cp: overwrite `/usr/bin/mongo'? y
cp: overwrite `/usr/bin/mongod'? y
cp: overwrite `/usr/bin/mongodump'? y
cp: overwrite `/usr/bin/mongoexport'? y
cp: overwrite `/usr/bin/mongofiles'? y
cp: overwrite `/usr/bin/mongoimport'? y
cp: overwrite `/usr/bin/mongooplog'? y
cp: overwrite `/usr/bin/mongoperf'? y
cp: overwrite `/usr/bin/mongorestore'? y
cp: overwrite `/usr/bin/mongos'? y
cp: overwrite `/usr/bin/mongosniff'? y
cp: overwrite `/usr/bin/mongostat'? y
cp: overwrite `/usr/bin/mongotop'? y
```

### mongodサービス起動
```bash
$ service mongod start
Starting mongod: about to fork child process, waiting until server is ready for connections.
forked process: 19939
all output going to: /var/log/mongo/mongod.log
child process started successfully, parent exiting
                                                           [  OK  ]
```

### mongo version確認
```bash
$ mongo --version
MongoDB shell version: 2.4.0
```


これで完了。
mongoを使ってるシステムでも、問題なく動いてる事が確認できました。
めでたし。

でも、実際に複数台で運用している場合は、手順を変える必要がありそうですね

もし、もっといい更新方法があれば教えて下さい＞＜
Mac活用定番サイトリンク集

# ソフト紹介
- [Mac AppStorm](http://mac.appstorm.net/)

# ライター連載
- [広田稔のMacでいこう](http://www.itmedia.co.jp/keywords/macdego.html) [@ITmedia](http://www.itmedia.co.jp/)

# iOS jailbreak
- [Tools 4 Hack](http://tools4hack.santalab.me/)
CentOSでsudoコマンドを使用できるようにする


sudoコマンドは設定しないと使用することができません。
ubuntuとは異なりますね。
最近はubuntuしか使っていなかったのでここで躓いた…

試しにsudoを叩いてみると次のように表示されて機能しないです。

```
pakiln is not in the sudoers file. This incident will be reported.
```

# sudoコマンドの使用を許可する

まずrootでログインします。
次にターミナルでvisudoを実行。

pakilnユーザーにsudoの許可を与えてみます。
どこでも良いので次の一行を追加します。

```
pakiln  ALL=(ALL)       ALL
```

今回は「root ALL=(ALL) ALL」の下に追加して保存。

```
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
pakiln  ALL=(ALL)       ALL
```

これでpakilnユーザーでsudoを使えるようになりました。
Titaniumでつくったアプリを4-inchディスプレイに対応させる。

Titaniumをつくったアプリを実行するときに、4-inch用アプリとして評価されるときと、されないときがあったので、ちょいと調べてみました。

結論から書くと、スプラッシュスクリーンの大きさで判断しているようで、
640px * 1096pxの画像をDefault-568h@2x.pngという名前で、Resources/iphone 以下に保存するだけで、4-inch用のアプリとして評価されるようになるみたいです。
「Please ensure that you set the default write concern for the database by setting」on connect-mongodb

connect-mongodbを利用している場合、起動時にこんな表示が出る場合がある。

DBヘの書き込み時のデフォルトのポリシーを設定していない為のようだ。詳しくは下記。
http://docs.mongodb.org/manual/core/write-operations/#write-concern

ジャーナルのような機能にも関係するので下記で補完できると思う。
http://doryokujin.hatenablog.jp/entry/20110614/1308010072

先のエラーメッセージには
ex: new Db(new Server('localhost', 27017), {safe:false}) 
と表記されていたが、connect-mongodbではまだ対応していない様子。
本当は修正してあげてpull requestが良いのだろうけど、先に回避コードを書いてしまっていたのでそれは気が向いた時にする。以下回避コードの例。

connect-mongodbはセッション情報を溜めておくのに必要なので、チェックが緩くて良いはず。{safe:false}とした。

```js
app.use(express.session(
        {
            secret:'secret',
            store:new mongoStore(
                {
                    db: new mongo.Db(dbname, new mongo.Server(dbhost, dbport), {safe:false}),
                    username: dbuser,
                    password: dbpass
                }
            ),
            cookie:{maxAge:cookieMaxAge}
        }));
```
"Error: database names cannot contain the character '.'"と出た場合

自分の環境ではconnect-mongodbとmongooseでMongoLabへ繋いでいる。暫くバージョンを上げていなかったので上げたところ、今回のエラーに出くわした。

※結論
パスワードに"@"が含まれていたのでURLに@が二つ含まれていたのが諸悪の根源だ。そりゃ当然か。
CakePHP DebugKit の導入手順

#### 手順.1
***
リポジトリからソースをDL
[https://github.com/cakephp/debug_kit](https://github.com/cakephp/debug_kit)


#### 手順.2
***
解凍後、DebugKit にリネームして /plugins/ へコピー


#### 手順.3
***
/app/Config/bootstrap.php に、プラグインのロードの記述を追加

```php
	CakePlugin::load('DebugKit');
```

#### 手順.4
***
/app/Controller/AppController.php 内で、コンポーネントの読込

```php
	class AppController extends Controller {
		public $components = array('DebugKit.Toolbar');	// この行を追加
	}
```

#### 手順.5
***
/app/View/Layouts/default.ctp に記述された sql_dump エレメントの出力を削除

```html+php
	<?php echo $this->element('sql_dump'); ?>
```

#### 手順.6
***
ビューの画面右上に固定表示されるアイコンをクリック
アクティビティ／フィード実装 - public_activity

* [pokonski/public_activity · GitHub](https://github.com/pokonski/public_activity)
* [#406 Public Activity - RailsCasts](http://railscasts.com/episodes/406-public-activity)

----

Gemfile:

```rb
gem 'public_activity'
```

```
bundle update
```

```
rails g public_activity:migration
rake db:migrate
```

app/models/item.rb

```rb
class Item < ActiveRecord::Base
  include PublicActivity::Model
  tracked owner: Proc.new{ |controller, model| controller.current_user }, recipient: Proc.new{ |controller, model| model.user }, params: { reason: 'TEST' }
  〜
end
```

app/controllers/application_controller.rb

```rb
class ApplicationController < ActionController::Base
  include PublicActivity::StoreController

  # ログインユーザ
  def current_user
    @current_user ||= User.where( id: session[:user_id] ).first
  end
end
```

```
rails s
```

app/controllers/activities_controller.rb

```rb
class ActivitiesController < ApplicationController
  # 一覧
  def index
    @activities = PublicActivity::Activity.where( recipient_id: current_user.id ).order( "created_at DESC" ).all
  end
end
```

config/routes.rb

```rb
  resources :activities
```

app/views/activities/index.html.erb

```erb
<% @activities.each do |activity| %>
  <div class="activity"><%= render_activity activity %></div>
<% end %>
```

app/views/public\_activity/item/\_create.html.erb

```erb
<%= link_to activity.trackable.canva.name, activity.trackable.canva if activity.trackable %>：<%= link_to activity.trackable.board.name, activity.trackable.board if activity.trackable %> に<%= link_to( activity.owner.name, activity.owner ) if activity.owner %>さんが新しいカードを投稿しました。
```

```rb
rails c
> PublicActivity::Activity.all.tapp
----------
  PublicActivity::ORM::ActiveRecord::Activity Load (0.3ms)  SELECT "activities".* FROM "activities" 
[
    [7] #<PublicActivity::ORM::ActiveRecord::Activity:0x007fd81d2511e0> {
                    :id => 8,
          :trackable_id => 57,
        :trackable_type => "Item",
              :owner_id => 3,
            :owner_type => "User",
                   :key => "item.create",
            :parameters => {
            :reason => "TEST"
        },
          :recipient_id => 3,
        :recipient_type => "User",
            :created_at => Wed, 20 Mar 2013 18:16:16 JST +09:00,
            :updated_at => Wed, 20 Mar 2013 18:16:16 JST +09:00
    }
]
----------
```

----

app/models/item.rb

※メソッド名を「create_activity」にするとGem側のメソッド名と被り「wrong number of arguments (1 for 0)」エラーになる

```rb
  after_create :generate_activity

  # メンバー分アクティビティ生成
  def generate_activity
    members = Membership.where( canva_id: self.canva_id, status: "approval" ).all
    members.each { |member|
      self.create_activity( action: 'create', owner: self.user, recipient: member.user )
    }
  end
```
Objective C のプロパティ属性まとめ


```objectivec:
@property (ここ) NSString *name;
```
上のカッコの中のやつ。

## Setter の作成有無の指定

指定無し: readwrite

### readonly

setter を作らない。

### readwrite

setter、getterを両方作成する。readonlyプロパティをオーバーライドする時に有用。

## Setter の書き方の指定

指定無し: strong (非ARCではassign)

### assign

渡された値をそのまま保持。
**参照先のオブジェクトが消えた！** -> ゾンビ状態になり、それにメッセージを送るとプログラムがクラッシュする。

### weak

渡された値をそのまま保持。
**参照先のオブジェクトが消えた！** -> 自動的に nil に書き換え。

### strong (昔のretain)

渡されたオブジェクトのオーナーシップを取得して保持。
**参照先のオブジェクトが消えた！** -> いやいや、そんなことはないって。

### copy

渡されたオブジェクトの copyWithZone メソッドを呼び、結果を strong で保持。

実際にオブジェクトがコピーされるかされないかは、渡されるオブジェクトのクラス次第。

**Mutable (変更可能) なオブジェクト** 渡されたオブジェクトと同じ値が設定された Immutable (変更不能) なオブジェクトを作成する。(例: NSMutableArray -> NSArray)

> いや俺はどうしても Mutable なオブジェクトを設定したいんだ！ -> mutableCopy メソッドでコピーするような setter を自前で用意すれば可能。

**Immutable (変更不能) なオブジェクト** 無駄なのでコピーは作成しない。つまり、実質 strong と同じ動作。

## Setter と Getter の排他関係の指定

指定無し: atomic

###atomic

生成された getter と setter の中にロック処理が書き込まれる。

> setter を呼び出して、それを動作している最中に getter を呼んだときには、オブジェクトの値の設定処理が完全に終わるまで待ってからオブジェクトを取得する。getter の処理中に setter が呼ばれたときは、オブジェクトの取得処理が完全に終わってから設定処理を行う。

このため、getter で中途半端なものが返ってきてアプリがクラッシュする可能性が(元々ほとんどないけど...)なくなる。

> ただし、あくまでも値が「中途半端なものになっていない」ってだけで、取得した値が開発者の意図したものになっているかは別の話。それはアプリ側でちゃんと対応する必要がある。

###nonatomic

ロック処理が getter と setter に書き込まれない分、高速に動作する。

## SetterとGetterのメソッド名の指定

###setter
`setter=setValue:`のようにすると setter のメソッド名を変更できる。引数が一つ付いたセレクタ名にすることに注意。
###getter
`getter=value`のようにすると getter のメソッド名を変更できる。
google製のjs,css圧縮処理(Closure Compiler)を手軽に実行する方法

今回は、Closure Compiler は導入済みという前提で書きたいと思います。

内容としては、js,cssを圧縮したい！
けどコマンドを毎回入力するのは面倒臭い。
bashのaliasに登録するとか、シェルスクリプトで実装するとか
色々方法があると思いますが、今回は
makeコマンド一つで、コンパイル処理を行えるようにして行きたいと思います。

Closure Compiler とは
https://developers.google.com/closure/compiler/?hl=ja

それでは、実装編

通常コマンド実行するとしたら

```bash
java -jar /usr/bin/compiler.jar --js=aaaa.js --js_output_file=aaaa.min.js
```

これをソース修正の度に入力するのは、ちょっと。。。

```bash
java -jar /usr/bin/compiler.jar --js=aaaa.js --js=bbbb.js --js=cccc.js --js_output_file=mix.min.js
```

しかも、ファイルが増えると更に、、、
なので、makeコマンド一つで実行出来るようにしてみよう！

````sh:makefile

# minify対象のファイル
SRC=aaaa.js bbbb.js cccc.js

# minify後のxxxx.min.jsのxxxxの部分
MAKE_NAME=mix

# minify後の名前
MINFY_FILE=$(MAKE_NAME).min.js

# 一時ファイル作成(aaaa.js,bbbb.js,cccc.jsを結合したファイル)
COMBINE=/tmp/js.$(MAKE_NAME).js
COMPRESS=$(MINFY_FILE)

all : $(COMPRESS)

# aaaa.js,bbbb.js,cccc.jsを一つのファイルにまとめてます
$(COMBINE) : $(SRC)
        cat $^ > $@

$(COMPRESS) : $(COMBINE)
       # まとめた一時ファイルを指定した名前でminify化します。
        java -jar /usr/bin/compiler.jar --js=$< --js_output_file=$@
       ＃一時ファイル削除
        rm -f $(COMBINE)

.PHONY: clean
clean :
        rm -f $(COMBINE) $(COMPRESS)
```

これで

```bash
make
```
一つでファイルが作成される様になりました！

ついでに

```bash
make clean
```

で、一時ファイル、minify後のファイルを無かったことにできます。

makefileは色々できるので、他にも便利な方法があるかもしれません。
C++で別のcppにあるテンプレート関数を使う

忘れがちなのでメモ。

A.cpp にあるテンプレート関数をB.cppで呼び出したい。

```C++:A.cpp
template<typename T> T func(T a) { 
...
} 
template int func<int>(int a); 
```

```C++:B.cpp
template<typename T> T func(T a);
int nanka(){ 
func(0);
} 
```

実体化するときはfunc\<int>()なんですね、紛らわしい。
A.cppをヘッダにすればいいじゃんとかあるが、ビルドに時間がかかるじゃないですか…。
Control.Lens


Lensはゲッターとセッターが一緒になったもの。フィールド名だと思ってもいい。`makeLenses`を使えば自分で定義した型のLensを作ってくれて便利。Lensをゲッターとして使いたければ`^.`、セッターとして使いたければ`.~`を使うと良い。`age .~ 36`は年齢を36に変更する関数で、`Man -> Man`になっている。

```haskell:
% runghc
{-# LANGUAGE TemplateHaskell#-}
import Control.Lens

data Man = Man { _name :: String, _age :: Int } deriving (Show, Eq, Ord)
emptyMan :: Man
emptyMan = Man { _name = "", _age = 0 }
makeLenses ''Man

main :: IO ()
main = do
  print $ hiratara ^. age
  putStrLn $ hiratara ^. name
  return ()
  where hiratara = (age .~ 36) . (name .~ "hiratara") $ emptyMan
```

結果。

```
36
hiratara
```

`MonadState`に閉じ込めて使いたければ `use` や `.=`を使うとよい。

```haskell:
import Control.Lens
import Control.Monad.Trans
import Control.Monad.Trans.State

...

main :: IO ()
main = flip evalStateT emptyMan $ do
  age .= 30
  name .= "hiratara"
  lift . print =<< use age
  lift . putStrLn =<< use name
  return ()
```
Node+Expressで最速でWebサービスのセットアップ

下記、作業用備忘です。もし、間違いあれば指摘・コメント頂けるとありがたいです。

##対象
・サーバーの設定とかめんどくさい、手早く基盤を構築して、アプリ開発したい人
・サーバーサイド言語をいちいち覚えたくない人(JS大好きな人)
・将来的には、Websocketとか使って先進的なサービスを企む人

##事前準備　（以下、全てMac環境前提にしてます）
下記がインストールされていること

```
npm
node
express
（npm install -g express　でインストールしましょう）
heroku tool belt
git
herokuのアカウント作成
```

##ローカル環境構築

・不安症の人は、インストールとバージョン確認（省略可）してから。。。

```Shell
node -v
npm -v
express --version	
heroku --version
git --version

```

・プロジェクトの作成（アプリひな形の作成） ※下記のsampleはアプリ名

```Shell
//アプリひな形の作成
// -eはejsを使う場合。jadeを使う場合は-eはなくてOK
express sample -e
//作成されたプロジェクトフォルダに移動
cd sample
```


※プロジェクトフォルダに作成されたpackage.jsonの編集。package.jsonは追加したいパッケージ（モジュール）をjson形式で記述。後からでも追加は出来るので、まずは、なにも変更しなくてOK

```Shell
//パッケージのインストール
sudo npm install
//Nodeサーバーの起動
node app.js
```

・ブラウザで以下にアクセスして「Welcome to Express」が出ていればOK
http://localhost:3000/


##heroku環境構築
//プロジェクトルート直下（Package.jsonがあるフォルダ）で下記実行

```Shell
//herokuにアプリを作成(sampleはアプリ名)
heroku create sample
//成功すると　アプリURLとgitURLが表示される（後々使います）
http://sample.herokuapp.com/ | git@heroku.com:sample.git
```

Procfileの作成
（下記一行のファイルを作成する。herokuにこれから登録するアプリケーションの種類を教えてあげます）

```Procfile
web: node app.js
```

※Profileじゃないよ。大文字小文字に注意、間違えると修正が少し面倒

.gitignoreの作成
(下記の２行のファイル。先頭のドットは必須)
※　モジュールはheroku側で別途インストールされるので、gitのpush対象外としてモジュールフォルダを設定します

```.gitignore
node_modules
.DS_Store
```

・Package.jsonにenginesの追加

```Package.json
{
  "name": "application-name",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node app"
  },
  "dependencies": {
    "express": "3.1.0",
    "jade": "*"
  },
  "engines": {
      "node": "0.8.4",
      "npm": "1.1.49"
  }
}
```
※　後続のherokuへpushするときにモジュールの追加が上手くいかない場合、engines、dependenciesのバージョンの組み合わせに注意する（herokuで使用できるバージョンは公式サイトより参照可）



・Gitに登録する

```Shell
git init
git add .
git commit -m "initial commit"

//git remoteは最初の一回だけ　
git remote add heroku git@heroku.com:sample.git

git push heroku master
```
・後はローカルでソースいじって変更したら、以下だけでデプロイ完了

```shell
$ git add .
$ git commit -m "modify hoge"
$ git push heroku master

```
・ブラウザで以下にアクセスして「Welcome to Express」が出ていればOK
http://sample.herokuapp.com/
※上記URLはダミー。



##トラブルシューティング
###偉人の知恵をお借りします。
・herokuのpushするとこでkeyなんちゃらエラーが出た場合
http://tacamy.hatenablog.com/entry/2013/02/16/235127
RVMでRuby2.0.0をインストールしようとしてコケた


`rvm install 2.0.0`ってやると、

> There is no checksum for 'http://production.cf.rubygems.org/rubygems/rubygems-2.0.3.tgz' or 'rubygems-2.0.3.tgz', it's not possible to validate it.


と怒られた。
rvm のバージョンが古いため、[チェックサムが含まれていないのが原因](https://github.com/wayneeseguin/rvm/issues/1669)。

よって`rvm get latest`として最新にしたあと、`rvm reinstall 2.0.0`でインストール完了。
[CentOS]rbenvコマンドを使ったRubyインストール方法

##導入準備
rbenvがインストールされている環境が必要です。

* rbenvのインストール方法については以前書いた[こちら](http://qiita.com/items/641fbdc4082e9f56f1c5)を参考してください。

##インストール方法
####インストールする前に
インストールできるrubyのバージョン表示

```bash:ruby-version
rbenv install -l
‥
 1.9.3-p385
  1.9.3-p392
  1.9.3-preview1
  1.9.3-rc1
  2.0.0-dev
  2.0.0-p0
  2.0.0-preview1
  2.0.0-preview2
  2.0.0-rc1
  2.0.0-rc2
  2.1.0-dev
‥
```

####rubyのインストール

```bash:ruby-install
rbenv install 2.0.0-p0
```
<font color="red">重要!!</font>
インストール後は`rbenv rehash`コマンドを使う
gemでインストールした実行ファイルを実行するためにも`rbenv rehash`が必要
実行すると`~/.rbenv/shims`が出来る

```bash:rbenv-rehash
rbenv rehash
```


使うrubyのバージョン指定
`rbenv global`コマンドでバージョン出来ます。

```bash:ruby-versionconfig
rbenv global 2.0.0-p0
```
<br>

##rubyの管理
`rbenv version`コマンドで現在のrubyのバージョンを表示できます。

```bash:ruby-version
rbenv version
```

`rbenv versions`コマンドでrbenvで管理されているバージョンを表示できます。

```bash:rbenv-versions
rbenv versions
  system
  1.9.3-p362
* 2.0.0-p0 (set by /Users/localhost/.rbenv/version)
```
以上です。
RでEMアルゴリズムとしてのK-meansクラスタリング

PRML 9.1に記載の通り、K-meansクラスタリングが行われる過程と、コスト関数の収束の様子を示します。

![](https://dl.dropbox.com/sh/cwfemibvr7gk4cy/sQPmUsfoT1/21.KMeansClustering.png)

```r
library(MASS)
frame()
set.seed(0)
par(mfrow=c(4, 4))
par(mar=c(2.5, 2.5, 1, 0.1))
par(mgp=c(1.3, 0.5, 0))
xrange <- c(-2, 2)
yrange <- c(-2, 2)
D <- 2
K <- 2
data(faithful)
x <- as.matrix(faithful)
N <- nrow(x)
#N <- 100
#x <- mvrnorm(N / 2, c(-1, -1), matrix(c(.4, 0, 0, .4), D))
#x <- rbind(x, mvrnorm(N / 2, c(1, 1), matrix(c(.4, 0, 0, .4), D)))
x <- t((t(x) - apply(x, 2, mean)) / apply(x, 2, sd))  # normalize
mu <- matrix(c(-1, 1, 1, -1), K, byrow=T)
r <- matrix(NA, nrow=N, ncol=K)
j <- numeric()

cost <- function() {
	sum(sapply(1:N, function(n)
		sum(r[n, ] * rowSums(t(x[n, ] - t(mu)) ^ 2))
		))
}

iteration <- 0
repeat {
	iteration <- iteration + 1
	
	# E step
	for (n in 1:N) {
		diff <- numeric(K)
		for (k in 1:K) {
			diff[k] <- sum((x[n, ] - mu[k, ]) ^ 2)
		}
		minK <- which.min(diff)
		r[n, minK] <- 1
		r[n, -minK] <- 0
	}
	j <- c(j, cost())
	plot(x, xlim=xrange, ylim=yrange, col=hsv(0.4 * apply(r, 1, function(r) which(r == 1) - 1)), pch=16)
	par(new=T)
	plot(mu, xlim=xrange, ylim=yrange, xlab="", ylab="", col=hsv((1:K - 1) * 0.4, 1, 0.8), pch=0, cex=2)
	title(paste0("E step#", iteration))
	
	# M step
	for (k in 1:K) {
		mu[k, ] <- colSums(x * r[, k]) / sum(r[, k])
	}
	j <- c(j, cost())
	plot(x, xlim=xrange, ylim=yrange, col=hsv(0.4 * apply(r, 1, function(r) which(r == 1) - 1)), pch=1)
	par(new=T)
	plot(mu, xlim=xrange, ylim=yrange, xlab="", ylab="", col=hsv((1:K - 1) * 0.4, 1, 0.8), pch=15, cex=2)
	title(paste0("M step#", iteration))
	
	if (length(j) > 2 && j[length(j)] == j[length(j) - 2]) {
		break
	}
}

names(j) <- paste0(rep(1:(length(j) / 2), each=2), c("E", "M"))
plot(j, type="o", axes=F, xlab="iteration")
axis(1, at=1:length(j), labels=names(j))
axis(2)
title("cost")
```
ディレクトリ内のプログラムの行数を数える

めも

```shell
$ find . -name "*.js" | xargs wc -l | tail -n 1
  100 total
```

数字だけ出す

```shell
$ find . -name "*.js" | xargs wc -l | tail -n 1 | awk '{ print $1 }'                              
100
```
[CentOS]ruby-build,rbenvのインストール方法

##導入準備
gitが必要になるのでインストールします。

```bash:gitinstall
sudo yum install git
```
<br>

##ruby-buildのインストール
ruby-buildはrubyをビルドするためのツールになります。

[github ruby-build](http://github.com/sstephenson/ruby-build "github")
インストール方法は上記のサイト、READMEに書いてありますのでそちらを参照するほうがより正確だと思います。
と言ってもそのままなんですが‥

```bash:ruby-build
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
cd ~/.rbenv/plugins/ruby-build
sudo ./install.sh
```
gitをcloneするディレクトリは適宜変えてもらって結構だと思います。
<br>

##rbenvのインストール
rbenvはrubyのバージョンを管理するツールになります。
よく聞くBundlerはgemパッケージを管理するツールになります。（＊余計な話）

[github rbenv](https://github.com/sstephenson/rbenv#section_2)

```bash:rbenv
git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
```
cloneした場所にPATH,rbenvの初期化を追加
bashを使っている方は`.bash_profile`にzshを使っている方は`.zshrc `に追記します

```bash:rbenvPATHinit
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(rbenv init -)"' >> ~/.zshrc
source ~/.zshrc
```
以上でインストール終了です。
rbenvコマンドが使えるかどうか確認お願いします。
iOSアプリの main.m は何をしているか



```objectivec:main.m

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([XXXDelegate class]));
    }
}
```

1. UIApplication オブジェクトを作成
2. XXXDelegate オブジェクトを作成
3. XXXDelegate を UIApplication の delegate に設定
4. XXXDelegate の application:didFinishLaunchingWithOptions: を呼び出す

また、どこかの時点で Info.plist を読み込む
attr_accessorをメタプログラミングで実装


##概要

define_methodを用い、```p self``` でスコープをたしかめながら実装します。
```String.x = 10```のように、クラスにもプロパティを持たせられることを確かめます。これはクラスもClassクラスのインスタンスであることによります。

##実装

```attr_a.rb
class Object
  def self.attr_a name
    p "out define_method :" + self.to_s
    define_method name do
      instance_variable_get "@#{name}"
    end
    define_method name.to_s + "=" do |x|
      p "in define_method :" + self.to_s
      instance_variable_set("@#{name}", x)
    end
  end
end

```

なおClassクラスはModule, ModuleはObjectを継承しています。

##インスタンスでテスト


```attr_a_instance_method.rb
class Foo
  attr_a :x # =>  "out define_method :Foo"
end
f = Foo.new 
f.x = "hoge" # =>  "in define_method :#<Foo:0x007fd722108898>"
p f.x # => "hoge"

```

##クラスでテスト

特異クラスのコンテキストでメソッド定義をすると、クラスメソッドが定義されることを確かめます。

```attr_a_class_method.rb
class Foo
  class << self
    attr_a :y # => "out define_method :#<Class:Foo>（特異クラス）"
  end
end
Foo.y = "hoge" # => 	"in define_method :Foo"
p Foo.y # => "hoge"
```
pythonからfluentdを使う


fluentdはinstallされた状態を前提
(参考) http://qiita.com/items/c89b53301a540be72744

ライブラリをinstall

```
pip install fluent-logger
```

configを修正

```
<source>
  type forward
  port 24224
</source>
<match fluent.test.**>
  type stdout
</match>
```

起動

```
fluentd -c ./fluent/fluent.conf -vv &
```

python script

```
#! /usr/local/bin/python
# -*- coding:utf-8 -*-

from fluent import sender
from fluent import event

# params -> *(tag, host, port)
sender.setup('fluent.test', host='localhost', port=24224)
event.Event('follow', {
    'from': 'userA',
    'to': 'userB'
    })
```

実行すると

```
2013-03-20 11:44:07 +0900 fluent.test.follow: {"to":"userB","from":"userA"}
```

と出力
スワイプでUIViewControllerを戻る動作


最近色んなアプリがスワイプで戻る動作を実装してて、対応していないアプリでもついつい指がスワイプしてしまうので、自分の作るアプリでもコピペで実装できるか調べてみた（大変だったらやりたくない、オープンソースのクラスとかわざわざ入れたくない）。

調べたらやり方は簡単、UIViewControllerのviewDidLoadでUIPanGestureRecognizerを登録、selectorでPanしたx軸の移動距離を見てViewControllerをpopする。

```objectivec:
- (void)viewDidLoad
{
    [super viewDidLoad];
	
	UIPanGestureRecognizer *backGestureRecognizer
        = [[UIPanGestureRecognizer alloc] initWithTarget:self
                                                  action:@selector(backGesture:)];
    [self.view addGestureRecognizer:backGestureRecognizer];
}

- (void)backGesture:(UIPanGestureRecognizer *)sender
{
	CGPoint translation = [sender translationInView:sender.view];
    //閾値を良い感じに調整
	if (60.0 < translation.x) {
        [self.navigationController popViewControllerAnimated:YES];
        [self.view removeGestureRecognizer:sender];
	}
}
```

スワイプを戻る動作と認識させる閾値は、自分的には60pointくらいが丁度いい(自分がよく使うSmartNewsは52か54pointくらいでやってそう)。

iOS4.0でUIPanGestureRecognizerのtranslationがちゃんとした値を返すのかは未検証。

## UIWebViewで使う時
UIWebViewで使う場合、viewの横幅が大きくなりスクロールが必要になるとジェスチャーが認識しないので、cssでbody要素の文字を折り返しさせる。pre要素も要素内でスクロールするようにしておくといい感じ。

```css:
body {word-break:break-all;}
pre {overflow:scroll;}
```

# 参考

1行で導入するback gestureの話とUINavigationBarを拡張した話
http://blog.ishkawa.org/blog/2013/02/24/backgesture-in-confwd/

UIPanGestureRecognizerはiOS4.0ではtranslationプロパティを正しく返さない
http://akisute.com/2011/08/uipangesturerecognizerios40translation.html
fluentdをmacにインストールしてとりあえず使ってみる


Gemを使ってistall(Ruby1.9.2以上が必要)

```
gem install fluentd --no-ri --no-rdoc
```

起動
fluentd --setup ./fluent
fluentd -c ./fluent/fluent.conf -vv &

デーモンで起動させることも可能

confファイル

source -> 標準入力、ファイル、ポート指定のHTTP通信など

```
# $ echo <json> | fluent-cat <tag>
<source>
	type forward
</source>

# http通信
<source>
	type http
	port 8888
</source>

# ファイル
# 例ではapacheのaccess-log
<source>
	type all
	format apache
	path /var/log/httpd-access.log
	tag apache.access
</source>

# デバッグ出力
<source>
	type debug_agent
	port24230
</source>
```

match -> マッチしたログの処理　標準出力、ファイル出力、他サーバへの転送など

```
## tagがapache.accessのときpathにファイル出力
<match apache.access>
	type file
	path /var/log/fluent/access
</match>

## tagがdebug.** (**はワイルドカード??)のとき標準出力
<match debug.**>
	type stdout
</match>

## tagがsystem.**のとき他のサーバに転送
<match system.**>
	type forward
	host 192.168.0.11
	<secondary>
		host 192.168.0.12
	</secondary>
</match>

## tagがmyapp.**のとき他サーバのファイルに保存andファイルに保存(出力先複数)
<match myapp.**>
	type copy
	<store>
		type forward
		host 192.168.0.13
		buffer_type file
		buffer_path /var/log/fluent/myapp-forward
		retry_limit 50
		flush_interval 10s
	</store>
	<store>
		type file
		path /var/log/fluent/myapp
	</store>
</match>

## tagがfluent.**のとく何もしない
<match fluent.**>
	type null
</type>

## マッチしなかったもの(else的な)はgzip圧縮してファイル出力
<match **>
	type file
	path /var/log/fluent/else
	compress gz
</match>
```

include ->confファイルの読み込み。他サーバからも

```
include config.d/*.conf
include http://pokopoko.com/fluent.conf
```

使ってみる

```
echo '{"hoge":"fuga"}' | fluent-cat debug.forward
```

で元のコンソールに

```
2013-03-20 11:06:03 +0900 debug.forward: {"hoge":"fuga"}
```

のように標準出力される

```
curl http://localhost:8888/debug.http -F 'json={"foo":"bar"}'
```

するとリクエストを受け取り

```
2013-03-20 11:07:44 +0900 debug.http: {"foo":"bar"}
```

と出力
リダイレクトまとめ

リダイレクトについてすぐに忘れちゃうので記載

|I/O||
|:-----------|:-----------|
|標準入力|stdin, 0|
|標準出力|stdout, 1|
|標準エラー出力|stderr, 2|

|操作|説明|
|:-----------|:-----------|
|command > file|コマンドの実行結果をファイルに書き込み|
|command < file|ファイル内容をコマンドに入力|
|command >> file|コマンドの実行結果をファイルの末尾に追加|
|command 2> file|コマンドのエラーをファイルに書き込み|
|command > file 2>&1|コマンドの実行結果とエラー出力をファイルに書き込み|
|command > /dev/null 2>&1|コマンドの実行結果とエラー出力をどこにも表示しない|
端末のエコービットを変える

端末のエコービットは、下記のようにすると分かります。
echoと表示されているので現在は、設定されています。-echoの場合は、設定されていない状態です。

```sh
[hoge@localhost unixandlinux]$ stty --all
speed 38400 baud; rows 46; columns 158; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?; swtch = M-^?; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
[hoge@localhost unixandlinux]$ 
```

下記のように現在の状態を取得して、ECHOビットをオフにしてセットする。
これで、offになります。逆にonにする場合は、info.c_lflag |= ECHO;にする。


```c:sample.c
#include <termios.h>

int main(int argc, char *argv[])
{
    struct termios info;

    tcgetattr(0, &info);
    info.c_lflag &= ~ECHO;
    tcsetattr(0, TCSANOW, &info);
    return 0;
}
```

コマンドでもできます。
コマンドでechoビットを落とす場合には、stty -echoを使います。
コマンドでechoビットをあげる場合には、stty echoを使います。
Table内のtdのdiv要素にheight:100%をきかせる

table要素のtdのなかにtdの高さいっぱいのdiv要素を作りたい場合はtable要素とtd要素にもheight:100%を指定しないといけない。
scssで書くと以下のようになる。

```scss:test.scss
table{
    height: 100%;
    td{
        height: 100%;
        div{
            height: 100%;
        }
    }
}
```
javascript で四則演算数式を評価する例

javascript でのパーサージェネレーター pegjs をつかって数式評価をしてみました。
（google 検索で数式を指定したときに現れる電卓の様なものを作る場合、このような数式パーサーが必要になりますね）

デモ：http://homepage2.nifty.com/youichi_kato/src/pegjs/expression/calc_01.html

pegjs のソース： http://homepage2.nifty.com/youichi_kato/src/pegjs/expression/arithmetics.pegjs
gist 上のソース：  https://gist.github.com/katoy/5201247

このコードは演算子の右結合、左結合の例を含んでいます。
"*", "/" は左結合、 "^" は右結合としています。

pegjs での左結合の実装については以下を参考にしました。
  https://groups.google.com/forum/?fromgroups=#!topic/pegjs/shpo7POBHuE
  > ....
  > When fed this equation: 1/2*3 
  > Returns: 0.166666666... 
  > When it should return: 1.5 
  > Because it is essentially being parsed as 1/(2*3)
  > How can I change this grammar around to parse from left to right?
  > ...
省メモリで(UIスレッドが)ノンブロッキングなファイルの走査

## JSで巨大なファイルを扱う時の問題点

* 落ちる
* 固まる

## 解決策

* 落ちる → `file.slice`でファイルを部分的に読み込む
* 固まる → Workerを使う
* ついでにWorker内では`FileReaderSync`が使えるので同期的にプログラムを書ける

例: ファイルからバイト列を検索してオフセットの配列を返す

```javascript
function search(e) {
    var file = e.data.file,
        target = e.data.target,
        bufflen = 0x8000,
        targetlen = target.length,
        fr,
        buff,
        i, j, k, n, m,
        positions = [];

    for (i = 0, n = file.size; i < n; i += bufflen - targetlen + 1) {
        fr = new FileReaderSync();
        buff = new Uint8Array(fr.readAsArrayBuffer(file.slice(i, Math.min(i + bufflen, n))));
        L1: for (j = 0, m = buff.length - targetlen + 1; j < m; ++j) {
            for (k = 0, targetlen; k < targetlen; ++k) {
                if (target[k] !== buff[j + k]) continue L1;
            }
            positions[positions.length] = i + j;
        }
    }

    postMessage(positions);
}

var blob = new Blob(['onmessage = ' + search.toString()]);
var worker = new Worker(URL.createObjectURL(blob));
worker.onmessage = function (e) {
    console.log(e.data);
};

document.getElementById('file-chooser').onchange = function (e) {
    worker.postMessage({
        file: e.target.files[0],
        target: [0x50, 0x4b, 0x03, 0x04] // zipのlocal file header
    });
};
```

そこそこ時間はかかりますね。
シェルスクリプトで、マルチスレッド処理風実装

今回は、別の処理で書きだしたコード一覧ファイルを読み込み
それを複数個まとめて実行するという処理を作成するとします。

```txt:command_list.txt
java -jar /usr/bin/compiler.jar --js=test1.js --js_output_file=test1.min.js
java -jar /usr/bin/compiler.jar --js=test2.js --js_output_file=test2.min.js
java -jar /usr/bin/compiler.jar --js=test3.js --js_output_file=test3.min.js
java -jar /usr/bin/compiler.jar --js=test4.js --js_output_file=test4.min.js
java -jar /usr/bin/compiler.jar --js=test5.js --js_output_file=test5.min.js
java -jar /usr/bin/compiler.jar --js=test6.js --js_output_file=test6.min.js
java -jar /usr/bin/compiler.jar --js=test7.js --js_output_file=test7.min.js
java -jar /usr/bin/compiler.jar --js=test8.js --js_output_file=test8.min.js
```
まずコマンド一覧ファイルには、googleのcompilerコマンドを８回分書いてます。
※極端な例ですので、内容は気にしないでください。

通常８回も実行すると、結構な時間が掛かってしまうので
もう少しだけ早くしたいですよね。。

各コマンドの後ろに「&」を付けて
バックグラウンドで実行する方法を使って
４個同時×２回で処理を行う様にしたいと思います。

```sh:multi.sh
echo "マルチスレッド開始";
OUTPUT_FILE="command_list.txt"
n=3;
i=0
while read line
do
  # バックグラウンド
  eval ${line} &

  # 直前のPIDを取得
  pid[${i}]=$!

  #3以上になったら、0
  i=`expr $i \+ 1`;
  if [ ${n} -eq ${i} ];then
    wait;
    i=0;
  fi
done < ${OUTPUT_FILE}
echo "マルチスレッド終了";
```

以上です。
今後は更に、プログレスバーとか出して進捗が見れればなとか思ってますが

※もっとこうすればいいよとかあれば教えて下さい＞＜
zbar で画像からバーコードを読み取る


ZBar (http://zbar.sourceforge.net/) という、すばらしい OSS でバーコードを読み取るまで。
OSX 10.8.2 + Homebrew で。


`brew install zbar` でエラーでたので、formula 編集。

```bash
brew edit zbar
```

args に --without-xshm --without-xv 追加

```ruby
  def install
    args = %W[
      --disable-dependency-tracking
      --prefix=#{prefix}
      --without-python
      --without-qt
      --disable-video
      --without-gtk
+     --without-xshm
+     --without-xv
    ]
```


```bash
brew install zbar
```

`zbarimg` 実行すると `/usr/local/lib/libltdl.7.dylib` がないといわれるので ln -s。

```bash
ln -s /usr/local/Cellar/libtool/2.4.2/lib/libltdl.7.dylib /usr/local/lib/libltdl.7.dylib
```

iPhone で撮った本の裏表紙↓を読んでみる。

![barcode.jpg](http://i.imgur.com/0NeLHqIl.jpg?1)

```bash
zbarimg barcode.jpg
```

```bash
EAN-13:1920290007000
EAN-13:9784004314097
scanned 2 barcode symbols from 1 images in 3.5 seconds
```

おおー。

JPEG だけならこれでいいんだけど TIFF を読む必要があったためため imagemagick を --with-libtiff つきでビルドしなおした。

```bash
brew uninstall imagemagick
brew install imagemagick --with-libtiff
```

ちなみに zbar にはカメラから読み取る zbarcam コマンド、各言語用のバインディングもある。

また Windows 向けのバイナリはインストーラ付きで依存ライブラリも同梱してて、いたれりつくせり。TIFF 読めなかったけど。
PStore


**PStore**を使うとRubyのオブジェクトを簡単に外部ファイルに保存することが出来る。

```pstore.rb
# -*- coding: utf-8 -*-
require 'pstore'

# 引数に保存するファイル名を指定
db = PStore.new('pstore.db')

# ハッシュと同じようにキーを指定して保存
db.transaction do
  db['key_string'] = "hoge"
  db['key_array'] = ['fuga', 'poka']
end # ここで保存される

# transactionメソッドの引数にtrueを指定すると読み込みモード
db.transaction(true) do
  puts db['key_string']        # => hoge
  puts db['key_array']         # => fuga poka

  #root?メソッドでキーが存在するか確認
  puts db.root?('key_string')  # => true
  puts db.root?('ahaaha')      # => false

  #ループ
  db.roots.each { |key|
    puts "#{key}: #{db[key]}"
  }
end
```

```
$ ruby pstore.rb
hoge
fuga
poka
# root?
true
false
# root
key_string: hoge
key_array: ["hoge", "fuga"]
```

##参照
・久保秋真 著 作りながら学ぶRuby入門 第2版
・[PStore](http://www.ruby-lang.org/ja/old-man/html/PStore.html "PStore")
・[標準添付ライブラリ紹介 【第 9 回】 PStore](http://jp.rubyist.net/magazine/?0016-BundledLibraries "標準添付ライブラリ紹介 【第 9 回】 PStore")
rpmbuild環境の構築

<<追記>>
色々と書きましたが、`rpmdev-setuptree`コマンドがあるよと教えてもらいました。
`rpmdev-setuptree`コマンドを使うと一発で以下の環境を構築できます。
なにこれ、便利、しらなかった (´･ω･`)

`rpmdev-setuptree`をインストールします

```bash:rpmdev-setuptree
sudo yum install rpmdevtools yum-utils
```

`rpmdev-setuptree`コマンドを実行

```bash:rpmdev-setuptree
rpmdev-setuptree
```
上記のコマンドを打つだけで、下記に書かれている環境構築完了です。
よって下記手順を実行する必要はありません。
<br>
---

1.`rpmbuild`のインストール

```bash:
sudo yum install rpm-build
```
2.`rpm-build`の作業フォルダの作成
ホームディレクトリから下を作業フォルダとする場合

```bash:
#mkdir に -p　オプションをつけるとサブディレクトリまで作成する
mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
```

3.作業ディレクトリの指定
`rpmbuild`のデフォルトの設定を表示するコマンド(`man`参照)

```bash:
コマンド
rpmbuild --showrc
rpmbuild が使う設定ファイル、 rpmrc と macros で現在セットされているオプションすべての値を表示する。
```

_topdirと書かれているところがおそらく本来の場所

```bash:
% rpmbuild --showrc | grep top
-14: __desktop_provides	%{_rpmconfigdir}/desktop-file.prov
-14: _builddir	%{_topdir}/BUILD
-14: _buildrootdir	%{_topdir}/BUILDROOT
-14: _desktopdir	%{_datadir}/applications
-14: _rpmdir	%{_topdir}/RPMS
-14: _sourcedir	%{_topdir}/SOURCES
-14: _specdir	%{_topdir}/SPECS
-14: _srcrpmdir	%{_topdir}/SRPMS
-14: _topdir	%{_usrsrc}/redhat
cat >$RPM_BUILD_ROOT%{_sysconfdir}/X11/applnk/%4/%1.desktop <<EOF
[Desktop Entry]
```
その場所をホームディレクトリ以下に設定

```bash:
echo "%_topdir $HOME/rpmbuild" > ~/.rpmmacros
```
以上でrpmbuildの環境構築完了