OmniAICreator/Qiita-1.07M huggingface dataset:
gitのsubmoduleをmvする方法

# git version 1.7.2.3の方法

gitで管理されてるファイルやディレクトリをmvする場合、普通`git mv`するわけだけども、その中にsubmoduleが含まれていると以下のようなエラーが出た

```
[$] <git:(develop*)> git mv zsh.d .zsh.d
zsh: correct '.zsh.d' to 'zsh.d' [nyae]? n
fatal: source directory is empty, source=zsh.d/auto-fu.zsh, destination=.zsh.d/auto-fu.zsh
```

ぐぐったらこんなページが見つかった
http://noone.org/blog/English/Computer/VCS/How%20to%20move%20a%20git%20submodule.html
要はgitのバグで、まだ修正されてないから手動で回避しないといけないらしい。

で、その回避の仕方（大体上記ページに書いてあることを訳しただけ）

1. 普通に`mv`する (`mv zsh.d .zsh.d`)
2. mvした先のファイルを`git add`する(`git add zsh.d`)
3. mvする前のインデックスを`git rm --cached`で消す(`git rm -r --cached .zsh.d`)
4. .gitmodule ファイルの、mvしたところの記述を書き換える
5. 普通にコミット

これでsubmoduleのmvが出来た。めんどくさ...

# git version 1.7.10.2 (Apple Git-33) の方法
※色々試行錯誤しながらやってたので、ちょっと自信無いです

1. 普通に`mv`する (`mv zsh.d .zsh.d`)
2. mvした先のファイルを`git add`する(`git add zsh.d`)
3. mvする前のインデックスを`git rm --cached`で消す(`git rm -r --cached .zsh.d`)
4. .gitmodule ファイルの、mvしたところの記述を書き換える

ここまでgit version 1.7.2.3と同じ。しかしこのversionだとこの後`git status`さえ出来ない。`git status` すると

```
fatal: Could not chdir to '../../../../zsh.d/auto-fu.zsh': No such file or directory
fatal: 'git status --porcelain' failed in submodule .zsh.d/auto-fu.zsh
```

みたいなエラーが出る。ので、更に手を加える必要がある。

5. submoduleを取り込んでいる方のgitプロジェクトの.git内の以下のファイルの中の記述を、mvしたディレクトリのところを書き換える。

```
.git/modules/[renameしたディレクトリ名]/[submoduleディレクトリ名]/config
```

6. ↑とは別に、submoduleのディレクトリの`.git`というファイルの中に記述されているディレクトリ名を新しいものに変える。

これで直る。多分。

# っていうか
ここまで来ると新しく`git submodule add`して古い方削除した方が早い気がする。
もっと簡単な方法あったら教えて下さい
混乱を招くポインタ宣言の構文についてメモ


たまに書くとき、混乱する上にググりにくいポインタ宣言の構文についてメモ.

Cの勉強でとても腹がたったのが、`int *p`と`int* p`の違いがわからんところ。微妙に使い分けている風でありつつも、同じように使えているような。
結論からいうとどちらも同じ。


```c:ptr
// 型 変数名の順で宣言するのでこちらがわかりやすい。
int* p;

// ただし、こう書いても良い。
int *p;
```

僕も前者のほうが絶対わかりやすいと思うんだけど、あんま見ないのはなんか良くない現象とか起きるのかな。Cの教本とかだと後者の書き方をよく見るきがする。 
　
## 宣言と代入のまとめ

```c:
#include <stdio.h>

int main()
{
	/* {intへのポインタ}型でpを宣言 */
	int* p;
	/* int型でxを宣言 */
	int x = 20;
	/* 変数pに、アドレス演算子&を使ってint型のxへのアドレスを代入 */
	p = &x;

	/* 間接演算子*を使い、変数pが指し示す先の値を取り出す */
	printf("%d", *p);
}
```

教本だと、よく以下のように書いてある気がする

```c
int x = 10;
int *p = &x;
printf("%d", *p);
```

初学者が、型宣言時の`*p`と、ポインタの先を参照する時の`*p`は全然違う意味を持っているということを__その後の文書で解説されたとしても__理解するのは難しいと思うんだけどな。
しかしこの誤解を呼ぶクソ構文さえ理解しちゃえば、そんなに難しいもんでもないのかも。
Rackhubで新しいnode.jsを入れるときにImportError: No module named bz2が出たら

Rackhubが良い感じなのでnode.jsで遊んでみようと思ったらnvmで入ってるバージョンがちょっと古かったのでnvm install v0.8.12をしたらエラーが起こったのでその時の対応。
出たエラーは以下のとおり。(2012-10-25現在)

```bash
Traceback (most recent call last):
  File "../../tools/js2c.py", line 36, in <module>
    import bz2
ImportError: No module named bz2
make[1]: *** [/home/rackhuber/.nvm/src/node-v0.8.12/out/Release/obj/gen/libraries.cc] エラー 1
make[1]: ディレクトリ `/home/rackhuber/.nvm/src/node-v0.8.12/out' から出ます
make: *** [node] エラー 2
nvm: install v0.8.12 failed!
```

全部の仮想マシンが同じエラーが起きるとも限らないし、その内発生しなくなる気もするけど、nvmでnodeの0.8.12をインストールしようとしたらエラーが起きた。試しに0.8.7もやってみたけど同じだった。


bz2が入ってなくてpythonがbz2入りでビルドされていないからっぽい。
というわけでbz2-devを入れてPythonをpybrewを使ってインストールしてみる。

```bash
$ sudo apt-get uninstall libbz2-dev
```

正直Pythonのバージョンはどうでもいいのでまだインストールされていないテキトーなところで入れてみた。3系にしてもいいとは思う。

```bash
$ pybrew install --configure="--with-zlib --with-bz2 --with-ssl
 --with-readline --with-ncurses --with-expat --with-sqlite3 --with-crypt
 --with-md5 --with-sha" 2.7.2
``` 

無事インストールが終わったらそれをデフォルトにする。

```bash
$ pybrew switch 2.7.2
```

前にインストールしようとして失敗したnodeがあると邪魔なので消しておく(これはうっかり色々消してしまうとまずいと思うので慎重に指定) 

```bash
$ rm -fr .nvm/src/node-v0.8.12
```

で、改めてnvmを使ってインストール

```bash
$ nvm install v0.8.12
```

インストール成功して

```bash
$ node -v
v0.8.12
```

となった。
第五回オフラインリアルタイムどう書くの参考問題の実装例(ruby)

オフラインでリアルタイムに「どう書く」をやるイベント。
http://atnd.org/events/32979
の参考問題
http://nabetani.sakura.ne.jp/hena/ord5railsontiles/ ( http://qiita.com/items/0ddde0164a745cd09c34 )
の実装。

最初に書いたもの。

自分としては普通に書いたつもりだけど、今ひとつエレガントではないというか、スマートさに欠けるというか、そんな感じ。

```ruby
#!ruby
#coding:utf-8

def nextpos( path, tiles )
    dir = path.last[1]
    pos=path.last[0].ord - ?A.ord
    newdir=case tiles[ pos ]
    when "1" then dir.reverse
    when "2" then dir.reverse.map{ |i| -i }
    else dir.dup
    end
    newpos = [ pos%3+newdir[0], pos/3+newdir[1] ]
    return nil unless newpos.all?{ |xy| (0..2)===xy }
    [ (newpos[0]+newpos[1]*3+?A.ord).chr, newdir ]
end

def solve( tiles )
    path=[['B',[0,1]]] # array of (  pair of position and direction )
    loop{
        np = nextpos( path, tiles )
        break unless np
        path << np
    }
    path.map{ |i| i[0] }.join
end

DATA.each{ |line|
    num, input, expected = line.split( /\s+/ )
    actual = solve( input )
    error = actual==expected ? "" : " ** expected is : #{expected} **"
    puts "%s -> %s %s" % [input, actual, error]
}
__END__
#0  101221102   BEDGHIFEH
```

例によって、テストデータの大半を省略。

こうしてみてみると、やっぱり solve の中の loop が汚い気がする。

戦術としては、

* 二次元のままで処理。
* 終了判定は番兵ではなく座標の値。
* 地図データは文字コードから生成。

と、すべて nidouchi さんの実装( http://qiita.com/items/ed5fa743164638de72b1 )と逆になっている。
iPhoneキーボードの外をタップしてキーボードを閉じる方法


テキストフィールドがあるビューでよくやるパターンです。

キーボードを閉じるためのシングルタップジェスチャを用意

```objc:
@interface HogeVC ()
@property(nonatomic, strong) UITapGestureRecognizer *singleTap;
@end
```

ビューの初期化時にジェスチャをself.viewに登録

```objc:
-(void) viewDidLoad {
	[super viewDidLoad];

	self.singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onSingleTap:)];
	self.singleTap.delegate = self;
	self.singleTap.numberOfTapsRequired = 1;
	[self.view addGestureRecognizer:self.singleTap];
}
```


ビューコントローラにUIGestureRecognizerDelegateを実装

```objc:
@interface HogeVC : UIViewController
<UITextFieldDelegate, UIGestureRecognizerDelegate>
@end
```

シングルタップされたらresignFirstResponderでキーボードを閉じる。

```objc:
-(void)onSingleTap:(UITapGestureRecognizer *)recognizer {
	[self.textField resignFirstResponder];
}
```

キーボードを表示していない時は、他のジェスチャに影響を与えないように無効化しておく。

```objc:
-(BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
	if (gestureRecognizer == self.singleTap) {
		// キーボード表示中のみ有効
		if (self.textField.isFirstResponder) {
			return YES;
		} else {
			return NO;
		}
	}
	return YES;
}
````
AdMobのバナーを使う。


CocoaPodsでビルドできなかったので手動でやる。

##SDKのインストール

https://developers.google.com/mobile-ads-sdk/docs/ からSDKをダウンロード。

展開すると下記のようなディレクトリ構成となっている。

```
├── Add-ons
│   ├── DoubleClick
│   ├── Mediation
│   └── Search
├── GADAdMobExtras.h
├── GADAdNetworkExtras.h
├── GADAdSize.h
├── GADBannerView.h
├── GADBannerViewDelegate.h
├── GADInterstitial.h
├── GADInterstitialDelegate.h
├── GADRequest.h
├── GADRequestError.h
├── README.txt
└── libGoogleAdMobAds.a
```

これを次のような構成にして``vendor/GoogleAdMobSDK``に入れる(``Add-ons``に入っている``Mediation``を1つ上のディレクトリに入れた状態)

```
├── Mediation
├── GADAdMobExtras.h
├── GADAdNetworkExtras.h
├── GADAdSize.h
├── GADBannerView.h
├── GADBannerViewDelegate.h
├── GADInterstitial.h
├── GADInterstitialDelegate.h
├── GADRequest.h
├── GADRequestError.h
├── GoogleAdMobAdsSDK.bridgesupport
├── README.txt
└── libGoogleAdMobAds.a
```

##設定

``Rakefile``の``Motion::Project::App.setup``のブロックに下記を追加。

```ruby:Rakefile
  app.frameworks += ["OpenGLES", "OpenAL", "AVFoundation", "QuartzCore", "AudioToolbox", "MessageUI", "SystemConfiguration"]

  app.vendor_project('vendor/GoogleAdMobAdsSDK/', :static)

  app.libs << "/usr/lib/libz.dylib"
  app.libs << "/usr/lib/libxml2.2.dylib"
```

##使用方法

``viewDidLoad``で下記のようにしてバナーを追加。

```ruby
@banner = GADBannerView.alloc.initWithAdSize(KGADAdSizeBanner).tap do |b|
  # 自分のパブリッシャIDに変更する
  b.adUnitID = 'hogehogehoge'
  b.rootViewController = self
  b.frame = [[0, 0], [320, 50]]
  self.view.addSubview(b)
  b.loadRequest(GADRequest.request)
end
```

こんな感じで表示される。

![スクリーンショット 2012-10-28 12.31.51.png (396×744)](http://f.cl.ly/items/200C2Q0r2z122h2k0I3e/スクリーンショット 2012-10-28 12.31.51.png)

##参考

[RobertLowe/Admob-Hpple-Example](https://github.com/RobertLowe/Admob-Hpple-Example)

こちらのサンプルから該当のAdMobの動作に必要な部分だけ抜き出した。
RailsでTwitterの認証をOmniAuthで行う。


##参考

[Twiwt:Blog / jugyo : OmniAuth で簡単 Twitter 認証！](http://blog.twiwt.org/e/c3afce)

[Omniauth NoMethodError in SessionsController - Stack Overflow](http://stackoverflow.com/questions/10771176/omniauth-nomethoderror-in-sessionscontroller)

##Gemfileに以下を追記後、bundle install

```ruby:
gem 'omniauth'
gem 'omniauth-twitter'
```

その後

```shell:
bundle install
```


##Twitterのconsumer key/sercret を記入

config/initializers/omniauth.rb に取得したKeyを入れる。

```ruby:omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :twitter, 'CONSUMER_KEY', 'CONSUMER_SECRET'
end
```

##SessionsControllerを作成

```shell:
rails g controller sessions
```

app/controllers/sessions_controller.rbを以下に編集<br>

```ruby:sessions_controller.rb
class SessionsController < ApplicationController
  def callback
    auth = request.env["omniauth.auth"]
    user = User.find_by_provider_and_uid(auth["provider"], auth["uid"]) || User.create_with_omniauth(auth)
    session[:user_id] = user.id
    redirect_to root_url, :notice => "Signed in!"
  end

  def destroy
    session[:user_id] = nil
    redirect_to root_url, :notice => "Signed out!"
  end
end
```

##config/routes.rb に認証のルーティングを記入

```ruby:routes.rb
match '/auth/:provider/callback' => 'sessions#callback'
match "/signout" => "sessions#destroy", :as => :signout
```

##User モデルの作成

```shell:
rails g model user
```


 db/migrate/XXXXXXXXXXXXXX_create_users.rb を編集。

```ruby:XXXXXXXXXXXXXX_create_users.rb
class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.string :provider, :null => false
      t.string :uid, :null => false
      t.string :screen_name, :null => false, :uniq => true
      t.string :name, :null => false

      t.timestamps
    end
    add_index :users, [:provider, :uid]
    add_index :users, [:screen_name]
  end

  def self.down
    drop_table :users
  end
end
```

app/models/user.rbを編集。

```ruby:user.rb
class User < ActiveRecord::Base
  def self.create_with_omniauth(auth)
    create! do |user|
      user.provider = auth["provider"]
      user.uid = auth["uid"]
      user.name = auth["info"]["name"]
      user.screen_name = auth["info"]["nickname"]
    end
  end
end
```

編集後、migrate

```shell:
rake db:migrate
```

##ApplicationControllerを編集

app/controllers/application_controller.rb を編集

```ruby:application_controller.rb
class ApplicationController < ActionController::Base
  ...

  helper_method :current_user

  private

  def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end
end
```

##Viewの作成

```shell:
rails g controller login index
```

app/views/login/index.html.erb に以下を追加

```ruby:index.html.erb
<% if current_user %>
  Welcome <%= current_user.name %>!
  <%= link_to "Sign Out", signout_path %>
<% else %>
  <%= link_to "Sign in with Twitter", "/auth/twitter" %>
<% end %>
```

config/routes.rbを編集

```ruby:routes.rb
root :to => "login#index"
```


public/index.htmlがあれば、削除。

```shell:
rails s
```
でサーバー起動。
そののち、http://localhost:3000/ にアクセスでログインできるか確認できる。
z.shを導入した時はまったところとその対策

#概要
最近z.shなる便利zshプラグインを知って導入した。その時はまったところとその対策をまとめる。

#そもそもz.shって何？
z.shを導入すると`z`というコマンドが使えるようになって、例えば最近移動したことがある`/home/hogehoge`というディレクトリに行きたい時
`z hoge`
とか書いてtabを押すと
`z /home/hogehoge`
が補完されて、すぐ移動出来る、というもの。
ね？便利でしょ？（とか言いつつまだ導入しただけで使ってない）

#導入の仕方
ソースが↓にある
https://github.com/rupa/z
ので、cloneする
`git clone git@github.com:rupa/z.git`
で、読み込む
`source z/z.sh`
これで使えます。

#本題
で、普通はこれで使えるはずなんだけど、↓のエラーが出て困った。

```
precmd_functions:1: unrecognized modifier `A'
```

ソース読んだら180-190行目あたりにprecmd_function関係のコードがあって、

```
    _z_precmd() {
      _z --add "${PWD:A}"
    } 
```
ここの`A`が問題っぽい。
よく分かんないけど

```
    _z_precmd() {
      _z --add "$(pwd -P)"
   }
```

に書き換えたら動いた。

#考察
多分zshのバージョン古かったからエラー出たんだと思う。本家にプルリク送ればいいかもだけど、この変更が何を意味してるのか分かってないのでほっとく。
Eclipseを使わないAndroidアプリ開発


Eclipseめんどくさい.
ターミナルやVimで開発を行いたい.

## Android SDK のセットアップ

homebrew で Android SDK をインストールする.

```
$ brew install android-sdk
```

Android SDK Manager を起動して SDK Platformをインストールする.

```
$ android sdk
```

` android --help ` でヘルプを確認できる.

```
$ android --help

       Usage:
       android [global options] action [action options]
       Global options:
  -h --help       : Help on a specific command.
      .
      .
      .
```

## 仮想デバイスを作成する

### コマンドラインで作成する

```
$ android create avd \
> --name emudroid \
> --target 1
Auto-selecting single ABI armeabi
Android 2.3.3 is a basic Android platform.
Do you wish to create a custom hardware profile [no]
Created AVD 'emudroid' based on Android 2.3.3, ARM (armeabi) processor,
with the following hardware config:
hw.lcd.density=240
vm.heapSize=24
hw.ramSize=256
```

ターゲットは以下のコマンドで確認できる.

```
$ android list target | grep "^id"
id: 1 or "android-10"
id: 2 or "Google Inc.:Google APIs:10"
id: 3 or "Sony Mobile Communications AB:EDK 2.0:10"
```

### Android Virtual Device Manager で作成する　

Android Virtual Device Manager を起動する.

```
$ android avd
```

Newボタンをクリックし、仮想デバイス名、ターゲットなどを設定して作成する.

## プロジェクトの作成とビルド

プロジェクトのディレクトリを作成し、プロジェクトを作成する.

```
$ mkdir helloworld
$ android create project \
> --name helloworld \
> --target 1 \
> --path ./helloworld \
> --package com.sample.helloworld \
> --activity HelloWorldActivity
```

以下のようなディレクトリ構造になる.

```
helloworld/
  AndroidManifest.xml
  ant.properties
  bin/
  libs/
  local.properties
  proguard-project.txt
  project.properties
  res/
    layout/
      main.xml
    values/
      strings.xml
  src/
    com/
      sample/
        helloworld/
          HelloWorldActivity.java
```

作成したプロジェクトをビルドする.
ビルドターゲットはデバッグ用の'debug'とリリース用の'release'がある.

```
$ cd helloworld
$ ant debug
```

## 仮想デバイスの起動とアプリのインストール

仮想デバイスは`emulator`コマンドで起動する.

```
$ emulator -avd emudroid
```

`adb install`コマンドでアプリを仮想デバイスにインストールする.

```
$ adb install ./bin/helloworld-debug.apk
```

仮想デバイスのアプリ一覧を開き、HelloWorldActivityを起動すると、
'Hello World, HelloWorldActivity'と表示される.

## Android 端末へのアプリのインストール

Android 端末をPCに接続し、仮想デバイスと同様に`adb install`コマンドでインストールする.
また、端末を接続した状態、かつ仮想デバイスを起動したままの場合はインストール先のデバイスのシリアルナンバーを指定する必要がある.

```
$ adb -s <serial number> install ./bin/helloworld-debug.apk
```

アプリを再インストールするには`install`に`-r`オプションを加える.

```
$ adb -s <serial number> install -r ./bin/helloworld-debug.apk
```

デバイスのシリアルナンバーは`adb devices`で確認できる.

```
$ adb devices
<serial number>	device
emulator-5556	device
```

もしくは、`adb`コマンドに`-d`オプションを加えるとUSB接続されたデバイスへの操作を行える.
`-e`オプションを加えると仮想デバイスへの操作を行える.

```
$ adb -d install ./bin/helloworld-debug.apk
$ adb -e install ./bin/helloworld-debug.apk
```
UIBarButtonItemで中にUIBarButtonがなくてなくしたい時

UIBarButtonが中にあれば、

```objectivec
UIBARBUTTONNAME.hidden = YES;
```

でボタンを隠せるが、無いときはできないので以下のようにwidthを0.1にすれば隠れる。

```objectivec
UIBARBUTTONITEM.width = 0.1;
```

また表示したいときは0.0（auto width）にすればいい

```objectivec
UIBARBUTTONITEM.width = 0.0;
```

ただこれだとボタンが非表示の時でもクリックできちゃうのが問題点、、、
sbtでjarファイル作成


https://github.com/sbt/sbt-assembly
を参考にsbt設定を追加する

```
// project/plugins.sbt
resolvers += Resolver.url("artifactory", url("http://scalasbt.artifactoryonline.com/scalasbt/sbt-plugin-releases"))(Resolver.ivyStylePatterns)

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.8.4")


//build.sbt
import AssemblyKeys._ // put this at the top of the file

assemblySettings

//メインクラスを明示的に指定
mainClass in assembly := Some("com.example.Main")
```

```
# target以下にjarファイル作成
$ sbt
> assembly

# jarファイルの実行
$ java -jar target/jar-file.jar
```
コンソールの日本語表示を英語にする方法


# コンソール表示を英語にしたい
```
$ date
2012年 10月 10日 水曜日 03:33:32 JST
```

ContOSをインストールしたらコンソール表示が日本語になっていた。
英語表示に慣れているし、エラーを調査する際も日本語だとやりにくいので、設定を変更する。

# 設定変更方法

```
export LANG=en_US
```

とすると、英語に切り替えられる

```
$ date
Wed Oct 10 03:41:04 JST 2012
```

ただし、これだとログイン中のシェルのみで有効。
常に英語にするには、.bashrcに記載する。

```~/.bashrc
export LANG=en_US
```

# 参考資料
[CentOS/コンソールで日本語を表示する（文字化けしないようにする）](http://www.maruko2.com/mw/CentOS/コンソールで日本語を表示する（文字化けしないようにする）)
CoreImageを使った画像フィルター実装方法 

## CoreImageとは？

CoreImageを使えば簡単に画像にフィルターを通すことができます。
Instagramみたいなフィルターもすぐ作れます。

参考にしたURL：http://www.raywenderlich.com/22167/beginning-core-image-in-ios-6

## フィルターの掛け方

ざっと説明すると以下のような感じ

1. 画像データ（UIImageなり、XXX.pngなり）を元に、CIImageのオブジェクトを作成
2. CIContextのオブジェクトを作成する
3. CIFilterのオブジェクトを作成する
4. CIFIlterのオブジェクトの中のoutputImage関数の返り値を受け取り（CIImage）UIImageに再度変換

## 1. 画像データ（UIImageなり、XXX.pngなり）を元に、CIImageのオブジェクトを作成

### UIImageから作成する場合

```objectivec
CIImage *CIMAGEOBJECT = [CIImage imageWithCGImage:UIIMAGEOBJECT.CGImage];
```

### XXX.pngなりから作成する場合

```objectivec
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"IMAGENAME" ofType:@"png"];
NSURL *fileNameAndPath = [NSURL fileURLWithPath:filePath];

CIImage *CIIMAGEOBJECT = [CIImage imageWithContentsOfURL:fileNameAndPath];
```

## 2. CIContextのオブジェクトを作成する

フィルターを通すときにCPUをベースにするのかGPUをベースにするのかとかを選べる。再利用できるので毎回オブジェクトを作成する必要はない。

**作業工程4. で行う、CIImage -> UIImageへの変換時にimageWithCIImageを使用する場合は作成不要**

nilのところには、様々なパラムを渡すことができる

```objectivec
CIContext *context = [CIContext contextWithOptions:nil];
```

## 3. CIFilterのオブジェクトを作成する

```objectivec
CIFilter *FILTEROBJECT = [CIFilter filterWithName:@"CISepiaTone" keysAndValues: kCIInputImageKey, CIIMAGEOBJECT, @"inputIntensity", @0.8, nil];
```

## 4. CIFIlterのオブジェクトの中のoutputImage関数の返り値を受け取り（CIImage）UIImageに再度変換

```objectivec
CIImage *outputImage = [FILTEROBJECT outputImage];

UIImage *UIIMAGEOBJECT = [UIImage imageWithCIImage:outputImage];
```

あとは出来上がったUIIMAGEOBJECTをUIImageViewなりに突っ込んでおしまい！
「An error occurred uploading to the iTunes Store」への対応

Organaizerからアップロードしている最中に
「An error occurred uploading to the iTunes Store」
と出た。
/var/log/system.log
には
 15:44:05 xxx Xcode[36812]:  Error:
 15:44:05 xxx Xcode[36812]:  Out:
と、表示されていて、エラーの内容もわからない。

下記参照。
http://stackoverflow.com/questions/5783481/an-error-occurred-uploading-to-the-itunes-store

```bash
cd /System/Library/Frameworks/JavaVM.framework/Versions
sudo ln -s CurrentJDK /System/Library/Frameworks/JavaVM.framework/Versions/1.5
sudo ln -s CurrentJDK /System/Library/Frameworks/JavaVM.framework/Versions/1.5.0
```
するも変わらず。同スレッドの

``` bash
cd /Library/Java/JavaVirtualMachines
sudo rm -rf jdk1.7.0_09.jdk/
```
にて対応した。
jojo-modeのセリフ「次にお前は「xx」という！」のひな形

.emacsなど設定ファイルに以下を追加

```Emacs:twittering-jojo-tweet
(defun twittering-jojo-tweet (msg)
  (interactive "s相手が言うセリフ: ")
  (when (and (string= "Japanese" current-language-environment)
             (or (< 21 emacs-major-version)
                 (eq 'utf-8 (terminal-coding-system))))
    (let ((text
           (concat
            (concat
             (concat
              "お前は次に「") msg "」という！"))))
    (twittering-call-api 'update-status `((status . ,text))))))
```

あとは

```Emacs:.emacs
(let km twittering-mode-map
  (define-key km (kbd "\C-c j") 'twittering-jojo-tweet)
  nil)
```

と設定しておけば来る2部TLに備えられる。
admob を簡単に埋め込むスクリプト

admobの埋め込みを毎回コピペして面倒だったので、もうちょっと簡単にした。

```
-(void)addAdmobOn:(UIViewController *)viewController
{
    
    GADBannerView *bannerView_;
    
    bannerView_ = [[GADBannerView alloc]
                   initWithFrame:CGRectMake(0,
                                            0.0,
                                            GAD_SIZE_320x50.width,
                                            GAD_SIZE_320x50.height)];
    bannerView_.adUnitID = AD_ID;
    
    
    GADRequest *request = [GADRequest request];
    request.testing = YES;
    bannerView_.rootViewController = viewController;
    
    [bannerView_ loadRequest:request];
    
    [viewController.view addSubview:bannerView_];
    
}
``` 

こんな感じのAdmobクラスを作っておいて、あとは、それぞれのViewControllerで、

```
[[Admob alloc] addAdmobOn:self];
```

こんなかんじで呼ぶだけ。
RailsでAmazon S3上に画像アップロードする


AWSコンソールを開いて、まずは画像ファイル保存場所としてS3のbucketを用意します。
https://console.aws.amazon.com/s3/home

Gemfileに以下を足します。

```Ruby:Gemfile
gem 'paperclip'
gem 'aws-s3'
gem 'aws-sdk'
```

S3接続設定用のファイルconfig/s3.ymlを作成します。接続情報はAWSコンソールから確認できます。
**東京リージョンを利用する場合はs3_host_nameを説定する必要があります。ここは軽くはまりました。**

```config/s3.yml
development:
  bucket: hoge-bucket
  access_key_id: xxxx
  secret_access_key: xxxx
  s3_host_name: s3-ap-northeast-1.amazonaws.com

production:
  bucket: hoge-bucket
  access_key_id: xxxx
  secret_access_key: xxxx
  s3_host_name: s3-ap-northeast-1.amazonaws.com
```

モデルのmigrationファイルに画像用のフィールドを追加します。

```Ruby:2012..._create_items.rb
class CreateItems < ActiveRecord::Migration
  def change
    create_table :items do |t|
      t.string :photo_file_name
      t.string :photo_content_type
      t.integer :photo_file_size
      t.datetime :photo_updated_at
    end
  end
end
```

モデル定義に画像用のフィールドを追加します。

```Ruby:item.rb
class Item < ActiveRecord::Base
  attr_accessible :photo

  has_attached_file :photo,
                    :styles => {
                      :thumb  => "100x100",
                      :medium => "200x200",
                      :large => "600x400"
                    },
                    :storage => :s3,
                    :s3_credentials => File.join(Rails.root, 'config', 's3.yml'),
                    :path => ":attachment/:id/:style.:extension"
end
```

フォームにアップロード機能を追加します。
multipart説定をして、file_fieldでアップロード用フィールドを追加します。

```Ruby:_form.html.erb
<%= form_for(@item, :html => {:multipart => true}) do |f| %>
  <div class="field">
    <%= f.label :photo %><br />
    <%= f.file_field :photo %>
  </div>
<% end %>
```

画像を表示する部分を書き加えます。

```Ruby:show.html.erb
<p>
  <b>Photo:</b>
  <%= image_tag @item.photo(:medium) %>
  <%= image_tag @item.photo(:thumb) %>
  <%= image_tag @item.photo(:large) %>
</p>
```

以上です。
heroku上でもすんなりできました。

-

参考:http://d.hatena.ne.jp/d4-1977/20120529/1338303498
QiitaMailの使い方

続きを書きました → [[Qiitaの記事をニュース形式で毎日メールする)]](http://qiita.com/items/984e02f4d8ce33def6a0) 

Qiitaで今盛り上がっている記事をピックアップしてメールで送信してくれます。[Qiita Hackathon](http://hackathon.jp/)で作っていたやつです。 

![qiita_mail](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tuto0621/20121017/20121017010506_original.jpg)


## インストール
```
$ gem install qiita_mail
```

## 初期設定
`qiita_mail init`を実行します。

```
$ qiita_mail init
Create -> /Users/ongaeshi/.qiita_mail.yaml
Please edit YAML settings!
```

`~/qiita_mail.yaml`を開きます。

```yaml:qiita_mail.yaml
---
email: ''     # メールを送信したいメールアドレス
keywords: []  # 興味のあるキーワード(空でもいいです)
```

YAMLファイルを編集しましょう。

```yaml:qiita_mail.yaml
---
email: 'xxxx@gmail.com'
keywords:
  - ruby
  - インストール
  - ruby sinatra
```

これで初期設定は完了です。

## メールを送信
```
$ qiita_mail deliver
Pickup <---- Qiita.com
Calculate Score ..
Send mail -> xxxx@gmail.com
```

一日一回位送っておくといい感じです！

## メールが送れない・・
[mail](https://rubygems.org/gems/mail)の`:sendmail`を使って送信しています。ソースコードだと[この辺](http://kodeworld.ongaeshi.me/home/qiita_mail/lib/qiita_mail/mailer.rb?query=/qiita_mail/lib/qiita_mail/mailer.rb:27&shead=package#n27)です。

sendmailコマンドが動けば送れると思います。設定は以下のリンク等を参考にしてみて下さい。

- [Mac OS X で Postfix(sendmail) を使って CLI でメールを送る - EAGLE 雑記](http://d.hatena.ne.jp/eagletmt/20090218/1234965601)

## テキストやHTMLで結果を受け取る
テキスト形式で出力

```
$ qiita_mail text
Pickup  <------ Qiita.com
Calculate Score ..
Write 'text' -> 
php-qiita: Qiita API PHPライブラリ
http://qiita.com/items/34fd34182ab2abd092fb
ストック(4) コメント(0) 16日前
.
.
```

HTMLファイルに書き出し

```
$ tqm html qiita.html
Pickup     <- Qiita.com
Calculate Score ..
Write html -> qiita.html
```

## 感想
ハッカソン楽しかったです。
バグ報告、要望、感想はコメント欄や[Twitter](https://twitter.com/ongaeshi)までどうぞー。

## リンク
* [qiita_mail | RubyGems.org](https://rubygems.org/gems/qiita_mail)
* [ongaeshi/qiita_mail](https://github.com/ongaeshi/qiita_mail)

* [Qiita Hackathonプロダクト一覧](http://hackathon.jp/)
* [Qiita Hackathonツイートまとめ - Togetter](http://togetter.com/li/389431)
.NET Framework にステップインする。

以下のように設定する。

1.http://referencesource.microsoft.com/Default.aspx を開く
2.左側のメニューから .NET Framework を選択する
3.表の中の .NET の ver 4.0 の行の Download をクリック
4.ダウンロードした msi を実行してソースコードとシンボルを展開。(msiはアンインストールのためにどこかに保存しておく。)
5.VisualStudio 2010 を開き、メニューから ツール > オプション を選択。オプションダイアログを開く。
6.ツリーから デバッグ > 一般 を選択。右ペインから .NET Framework ソースのステッピングを有効にする のチェックを入れる。いろいろ言われるけど OK する。
7.ツリーから デバッグ > シンボル を選択。シンボルファイルの場所に <install directory>\Symbols を追加する。シンボルのキャッシュが始まるので終わるまで待機。
重み付き乱択アルゴリズム

Rubyの勉強してます。

会社で昼休みに昼飯を選ぶアプリを作っているのですが、
DBから取得した昼飯リストの中から、なんかいい方法で
選択できないかなー？　と情報を漁っていると

[algorithm - 重みをつけて乱択する](http://blog.livedoor.jp/dankogai/archives/51761113.html)

弾さんのブログで良い情報があったので、Rubyで書いてみました。

```ruby:make_random_picker.rb
#! ruby
class DUP
	def initialize(name, age)
		@name  = name
		@age = age
	end
	attr_accessor :name,:age
end

def make_random_picker(dup)
	dup.sort{|a,b| a.age <=> b.age}
	age_sum = 0
	dup.each do |d|
		age_sum +=  d.age
	end
	dup.each do |d|
		d.age /= age_sum
	end
	r = rand()
	sum = 0
	dup.each do |d|
		sum += d.age
		return d if r < sum
	end
	return dup[dup.length - 1]
end

20.times do
	p make_random_picker([DUP.new("digiko", 10.0),
						  DUP.new("usada",	14.0),
						  DUP.new("puchiko", 5.0),
						  DUP.new("piyoko", 7.0),
						  DUP.new("rinna", 10.0),
						  DUP.new("mike", 10.0)]).name
end
```

実行結果は
`$ ruby weight_random.rb | sort | uniq -c | sort -r`

とかで計測します。とりあえず、1000回回すと

```bash:result.sh
    274 "usada"
    179 "digiko"
    171 "rinna"
    171 "mike"
    130 "piyoko"
     75 "puchiko"
```

となったので、まあ悪くない結果だと思います。

しかし、一番結果の上位に出てくるのがうさだとは、どういうことにょ！？

目からビィーーーーム！！
eachのelseの書き方

**2012/11/7 追記:個人的には面白いとは思いますが、クリーンな書き方だと思ってないので参考程度にお願いします。**

例えばブログのシステムなどで投稿がないときに”投稿はありません”って表示するような場合。
なんか他にいい方法があった気がするので、下記よりまともな方法をだれか教えてください。

```ruby
if @posts.each do |post|
  # do something
end.empty?
  # ポストはありません
end
```
MacOSXの開発環境を整えるメモ


##構築する環境

- iOSアプリ開発環境
- Python開発環境
- JavascriptとかHTML5とかその他

##インストール

- Xcode
	- XVim
	- コードフォーマッターなんかあれば入れる
- Python
	- あとで調べる(Pythonプロフェッショナルプログラミングとか見る)
- Shell
	- zsh(bashに戻したいけどめんどくさいからこっちで)
- Terminal
	- iTerm2
- Ruby/rubygems(ツールを使うのに必要: RVMでいいや)
	- CocoaPods
	- gemignore
	- sass/compass
	- jasmine(buster.jsとどっちか)
	- rake
	- capistrano
	- bundler
- Node/npm(ツール使うのに必要)
	- grunt.js
	- buster.js(jasmineとどっちか)
- MacOSX Environments
	- Homebrew
- Editor
	- Kobito
	- vim
		- Neobundle
			- zen-coding.vim
			- gist.vim
			- unite.vim
			- vimfiler
			- vimshell
			- その他(tag系とかSyntaxCheckとかそんなの)
- Documents/Reference-GUI
	- Dash(主にiOS/Canvas系)
- SCM-GUI
	- SourceTree
- Adobe
	- Illustrator
	- Photoshop
	- Edge inspect
	- Dream weaver
- その他
	- ImageOptim
	- ImageAlpha
	- Balsamiq Mockups
apt-getでnginx-1.2.4 stableをubuntu 11.10にインストール

ubuntuでapt-get install nginxするとちょっと古いバージョンがインストールされてしまいます。
折角なら最新のstableを使いたい、そして自分でmakeとか./configureとかしたくない！のでapt-getで出来るように。

[公式サイト](http://nginx.org/en/download.html)にやり方は書いてあります。

```console
$ wget http://nginx.org/keys/nginx_signing.key
$ sudo apt-key add nginx_signing.key
$ sudo vim /etc/apt/sources.list
 + deb http://nginx.org/packages/ubuntu/ oneiric nginx
 + deb-src http://nginx.org/packages/ubuntu/ oneiric nginx
$ apt-get update
# Get:1 http://nginx.org oneiric Release.gpg [287 B] とかちゃんと取ってきてるのを確認
$ apt-get install nginx
# Setting up nginx (1.2.4-1~oneiric) ...

$ w3m 127.0.01
# Welcome to nginx!
```

Yay!
要素をスクロール時にウィンドウ上部にひっかかるようにする jQuery プラグイン


うまい表現がみつからないのですが、facebook のサイドバーとかのアレです。

```jquery.headbutt.js
$.fn.headbutt = function (offset) {
  if (offset == null) {
    offset = 0;
  }
  this.each(function () {
    var $elem = $(this)
      , initialTop = $elem.offset().top
      , initialPosition = $elem.css('position')
    ;
    $window = $(window).on('scroll', function () {
      if ($window.scrollTop() > initialTop - offset) {
        $elem.css({ position: 'fixed', top: offset });
      } else {
        $elem.css({ position: initialPosition });
      }
    });
  });
};
```

こんな感じで使います。

```js
$('#side-menu').headbutt();
```

固定レイアウトのヘッダーがあるような場合には、オフセットも設定できます。

```js
$('#side-menu').headbutt($('#fixed-menu').height());
```

Gist にも貼っておきました。
https://gist.github.com/3957501
30秒で使えるtcpdump

そのホストまで通信が来ているのか、
確認するにはtcpdumpコマンドを使うと簡単に確認できます。
(tcpdump実行にはroot権限が必要です。)

#####とにかく特定のポートに通信は来ているのか。
```
tcpdump dst port 8080
```
8080ポート宛の通信が来ているか。
dst(=destination:目的地)


#####とにかく特定のホストからの通信はきているのか。
```
tcpdump src host 192.168.1.xxx
```
192.168.1.xxxからの通信は来ているか。
src(=source:元)


#####それらを合わせて
```
tcpdump dst port 8080 and src host 192.168.1.xxx
```

出力はこんな感じ。
```
[root@dev01 log]# tcpdump dst port 22 and src host 172.16.xxx.xxx
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
15:36:16.287730 IP 172.16.xxx.xxx.53367 > 172.16.xxx.yyy.ssh: . ack 1319651685 win 16279
15:36:16.353410 IP 172.16.xxx.xxx.53367 > 172.16.xxx.yyy.ssh: . ack 249 win 16217
```

Linux標準だと、messagesに以下のようなログが出力されるので監視をされている方はご注意を。
```
Oct 26 15:30:28 host kernel: device eth0 entered promiscuous mode
Oct 26 15:30:28 host kernel: device eth0 left promiscuous mode
```

これらは、tcpdumpの機能のほんの少しにすぎません。
本来のコマンドの目的はなんて言ってもパケットのダンプです。
フィルタを通すことによりパケットの解析が出来ます。
http,ftp,telnetなどの平文の通信は簡単に中身を見れるのでとても面白いです(?)
hiveのmetastoreにPostgreSQLを使う


MySQLの情報は多いですがPostgreSQLはあまり見当たらなかったので書いておきます。
バージョンは2012/10/26時点での最新なので適宜入れ替えて下さい。

1. $HIVE_HOME/libにpostgresのJDBCドライバーを入れる

	```
	$ wget http://jdbc.postgresql.org/download/http://jdbc.postgresql.org/download/postgresql-9.2-1000.jdbc4.jar
	$ mv postgresql-9.2-1000.jdbc4.jar $HIVE_HOME/lib/
	```

2. hive-conf.xmlの設定

	```
	  <property>
	    <name>javax.jdo.option.ConnectionDriverName</name>
	    <value>org.postgresql.Driver</value>
	    <description>DBの接続ドライバを指定</description>
	  </property>
	
	  <property>
	    <name>javax.jdo.option.ConnectionURL</name>
	    <value>jdbc:postgresql://localhost:5432/hive</value>
	    <description>JDBCの接続URLを指定</description>
	  </property>
	
	  <property>
	    <name>javax.jdo.option.ConnectionUserName</name>
	    <value>hive</value>
	    <description>DBの接続ユーザを指定</description>
	  </property>
	
	  <property>
	    <name>javax.jdo.option.ConnectionPassword</name>
	    <value>hive</value>
	    <description>DBの接続パスワードを指定</description>
	  </property>
	
	```

3. postgresにDB、ユーザーを追加する

	```
	$ createuser -P hive
	Enter password for new role: hive
	Enter it again: hive

	$ createdb -O hive hive
	```

4. hiveを起動しshow tablesを実行

	```
	$ hive
	> show tables; --ここでmetastoreに必要な諸々がDBに追加される
	```

5. 完了

## PostgreeSQL 9.1以上の場合

show tablesで下記のエラーが出ます

```
hive> show tables;
FAILED: Error in metadata: MetaException(message:Got exception: java.lang.reflect.UndeclaredThrowableException null)
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask
```

### 原因

詳細なエラーを確認します

```
$ hive -hiveconf hive.root.logger=DEBUG,console
> show tables
```

スタックトレースの途中にこんなエラーが出ていると思います

```
Caused by: javax.jdo.JDODataStoreException: Error executing JDOQL query "SELECT "THIS"."TBL_NAME" AS NUCORDER0 FROM "TBLS" "THIS" LEFT OUTER JOIN "DBS" "THIS_DATABASE_NAME" ON "THIS"."DB_ID" = "THIS_DATABASE_NAME"."DB_ID" WHERE "THIS_DATABASE_NAME"."NAME" = ? AND (LOWER("THIS"."TBL_NAME") LIKE ? ESCAPE '\\' ) ORDER BY NUCORDER0 " : ERROR: invalid escape string
  Hint: Escape string must be empty or one character..
```

これはPostgreSQL 9.1から文字列中のエスケープの扱いが変更されたことが原因です

参考: [PostgreSQL: Documentation: 9.1: Lexical Structure](http://www.postgresql.org/docs/9.1/static/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-ESCAPE)

### 対応

1. $PGDATA/postgresql.confに以下の設定を追加

	```
	standard_conforming_strings = off
	```

2. postgresの設定を再読み込み

	```
	$ pg_ctl reload
	```

3. 完了
WordPress で検索結果の body クラスからページ関連のクラスを取り除く


検索結果の body には、何故か検索にひっかかったページに関連するクラスも出力されます。検索結果に他のページのスタイルがあたってしまったりして不便なので、フィルターを使って取り除きます。

```functions.php
function remove_page_class_from_search($classes, $class) {
  if (is_search()) {
    foreach ($classes as $i => $class) {
      if (strpos($class, 'page-') === 0 || strpos($class, 'parent-page-') === 0) {
        unset($classes[$i]);
      }
    }
    $classes = array_values($classes);
  }
  return $classes;
}
add_filter('body_class', 'remove_page_class_from_search');
```
PHP で array から要素を削除


`unset()` で要素を削除した後、必要があれば `array_values()` で歯抜けになったのを詰めます。

```php:
$arr = array(0, 1, 2, 3);
unset($arr[1]);
foreach ($arr as $key => $value) {
  echo $key . ' => ' . $value . "\n";
}
// 0 => 0
// 2 => 2
// 3 => 3
$arr = array_values($arr);
foreach ($arr as $key => $value) {
  echo $key . ' => ' . $value . "\n";
}
// 0 => 0
// 1 => 2
// 2 => 3
```

`array_splice()` でもできますが、毎回インデックスを詰め直すため、複数のバラバラな要素を削除する場合はパフォーマンスが落ちるかもしれません。

しかし `unset()` って演算子なのか関数なのかよくわからなくて気持ち悪いですね。

参考
[How to delete an element from an array in php? - Stack Overflow](http://stackoverflow.com/questions/369602/how-to-delete-an-element-from-an-array-in-php)
プログラムにフリックさせてイベントを受け取る

- フリックで左右にスクロールできるだけでなく、ナビゲーションバーにあるボタンからも左右にスクロールできるUIを想定。（標準のメールアプリみたいなイメージ）
- ボタンからスクロールした場合も、フリックしたときと同様に、スクロール前後のイベントを受け取ってあれこれやりたい。

```obj-c:MainViewController.m
- (void)viewDidLoad {
	[super viewDidLoad];

	self.scrollContainer.animationDelegate = self;
}

- (void)scrollViewWillBeginDragging:(ScrollContainer *)scrollContainer {
	NSLog(@"offset: %d", self.scrollContainer.contentOffset.x);
}

- (void)scrollViewDidEndDecelerating:(ScrollContainer *)scrollContainer {
	NSLog(@"offset: %d", self.scrollContainer.contentOffset.x);
}

- (void)segmentDidChange:(id)sender {
	if (![sender isKindOfClass:[UISegmentControl class]]) {
		return;
	}
	UISegmentControl *segmentControl = sender;

	if (segmentControl.selectedSegmentIndex == 0) {
		[self.scrollContainer moveToPreviousContent];
	} else if (segmentControl.selectedSegmentIndex == 1) {
		[self.scrollContainer moveToNextContent];
	}
}
```

- `UISegmentControl`で作ったボタンが押されると、`ScrollContainer`クラスのメソッドを呼び出して、左右どちらかにスクロールされる。
- `ScrollContainer`は以下のような`UIScrollView`のサブクラス。

```obj-c:ScrollContainer.m
static CGFloat kContentWidth = 320.0f;

- (void)moveToNextContent {
	[UIView beginAnimation:nil context:NULL];
	[UIView setAnimationDuration:0.3f];
	[UIView setAnimationDelegate:self.animationDelegate];
	[UIView setAnimationWillStartSelector:@selector(scrollViewWillBeginDragging:)];
	[UIView setAnimationDidStopSelector:@selector(scrollViewDidEndDecelerating:)];

	CGPoint nextContentOffset = CGPointMake(self.contentOffset.x + kContentWidth, 0);
	self.contentOffset = nextContentOffset;

	[UIView commitAnimations];
}

- (void)moveToPreviousContent {
	[UIView beginAnimation:nil context:NULL];
	[UIView setAnimationDuration:0.3f];
	[UIView setAnimationDelegate:self.animationDelegate];
	[UIView setAnimationWillStartSelector:@selector(scrollViewWillBeginDragging:)];
	[UIView setAnimationDidStopSelector:@selector(scrollViewDidEndDecelerating:)];

	CGPoint previousContentOffset = CGPointMake(self.contentOffset.x - kContentWidth, 0);
	self.contentOffset = previousContentOffset;

	[UIView commitAnimations];
}
```

- `setContentOffset:animated:`メソッドでもプログラムによるフリックを実現できるんだけど、スクロール前後のイベントを受け取ってあれこれすることはできないっぽい。
- そこで、`UIView`クラスのアニメーションを使って、アニメーション前後のイベントを利用する。
- `setAnimationWillStartSelector:`や`setAnimationDidStopSelector:`に直接`scrollViewDidEndDecelerating:`などを指定することで、プログラムによるフリックの場合でもイベントを受け取ることができる。
MacのPostgreSQLでFATAL:  could not create shared memory segment: Cannot allocate memoryが出る場合の対応


Mac(OS X 10.7で確認)はカーネルで取得できるshared memoryの量がかなり低く設定されているので、shared bufferを確保できずにエラーになることがあります。

```
$ pg_ctl start                              
server starting
FATAL:  could not create shared memory segment: Cannot allocate memory 
```

その場合は、パラメータを調整してやれば動きます。

```
sudo sysctl -w kern.sysv.shmmax=1073741824
sudo sysctl -w kern.sysv.shmall=1073741824
```
C++/CLIでThrustを使うとgenericキーワードでコンパイルできない問題

Thrustには`generic`という名称の名前空間（例えば、`thrust::detail::backend::generic`）があって、これがC++/CLIの[genericキーワード](http://msdn.microsoft.com/ja-jp/library/8z2kbc1y)と衝突している。
これが原因で[C2059コンパイルエラー](http://msdn.microsoft.com/ja-jp/library/t8xe60cf.aspx)で、コンパイルできない。

どうやら[既知のバグ](https://github.com/thrust/thrust/issues/94)らしく、解決方法も書いてあった。つまり

```cpp:error.cpp
#include <thrust/device_vector.h>
```

とThrustをインクルードしているところの前後

```cpp:ok.cpp
#define generic THRUST_GENERIC
#include <thrust/device_vector.h>
#undef generic
```

と強制的に変えてやれば通る。

ただ、これ全部のヘッダー読み込み時にやってるとめんどい＆忘れる（忘れてもコンパイルエラー起きるだけだけど）。解決策としては、

1. 忘れないように努力する。
2. C++/CLIのプロジェクトを分離して、Thrustを使う側は`/clr`を切ってネイティブでコンパイルする。ただしC++/CLI側のプロジェクトで呼び出すヘッダー側には依然として忘れないように前後に入れておかないと同じ事になる。
3. thrustを読み込むだけの`thrust_include.hpp`とか使って、その前後に入れておく。
4. thrustのgitレポジトリをフォークして自分で直接書き換える。

上から順に挿入量が少なくなっていく分、最初の手間が増えます、たぶん。もっとスマートな解決方法ないかなぁ・・・。
たまに見かける[Y/n]での分岐処理のサンプル

```bash
#!/bin/bash

echo "こちらでよろしいですか？ [Y/n]"
read ANSWER

case $ANSWER in
    "" | "Y" | "y" | "yes" | "Yes" | "YES" ) echo "YES!!";;
    * ) echo "NO!!";;
esac
```
after_commit内ではchangesが空になってるので注意

```ruby
require "active_record"
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
ActiveRecord::Migration.verbose = false
ActiveRecord::Schema.define do
  create_table :users do |t|
  end
end
class User < ActiveRecord::Base
  after_save do
    changes                     # => {"id"=>[nil, 1]}
  end
  after_commit do
    changes                     # => {}
  end
end
User.create!
```

ちょいとハマりました。
Git でマージ済みのブランチを一括削除する


すでにマージ済みのブランチをまとめて削除するには以下のようにする (master ブランチを checkout していると仮定する)

```
$ git branch --merged | grep -v '*' | xargs -I % git branch -d %
Deleted branch foo (was ce1b0d5).
Deleted branch bar (was 7623b2b).
Deleted branch baz (was d4c396d).
```

----

長いのでエイリアスをはるとよい。シェルの特殊文字 `*` のエスケープが必要なことに注意。

```
$ git config --global alias.delete-merged-branches '!git branch --merged | grep -v \* | xargs -I % git branch -d %'
```

以下のように設定されていれば、以降は `git delete-merged-branches` で実行できる。

```
$ git config --list  | grep alias.delete-merged-branches
alias.delete-merged-branches=!git branch --merged | grep -v \* | xargs -I % git branch -d %
```

```~/.gitconfig
[alias]
        delete-merged-branches = !git branch --merged | grep -v \\* | xargs -I % git branch -d %
```

----

2015/03/18 改訂

- [git-flow](http://danielkummer.github.io/git-flow-cheatsheet/index.ja_JP.html) ライクなブランチ運用ルールを採用している場合に `master` ブランチまで消してしまってびっくりする問題を修正
- 以下のコードスニペットをシェルスクリプトにしたものを [GitHub で公開](https://github.com/kyanny/git-delete-merged-branches)

```
git branch --merged | grep -vE '^\*|master$|develop$' | xargs -I % git branch -d %
```

自分は以下のようなエイリアスを作って `git fetch` や `git pull` したとき同時に実行されるようにしている（シェルスクリプト `git-delete-merged-branches` をパスの通った場所にインストールしておくこと）

```~/.gitconfig
[alias]
        fp = !git fetch -p && git-delete-merged-branches
        pp = !git pull -p && git-delete-merged-branches
```
Qiitaで扱う情報の範囲を少し広くする提案

Qiitaで扱う情報の範囲を少し広くする提案です。

現在、Qiitaは

>「プログラミングに関する知識を記録、共有する最適なサービス」

ということになっていますが、プログラミングによって実現できる何らかの手段・方法についての解説において「確かにプログラミングを用いて実現・解説はされているけど、実際に解説しているのは、プログラミングの領域外についての説明」ということがありえます。

例えば、数学的な幾何学の問題や、アルゴリズムそのものの説明などがあります。これらは、確かにプログラミング言語のコードによる説明ができますが、実際に説明しているのは「数学」「アルゴリズム」の問題です。

数学的な部分について詳しい解説をしようとした場合には、もはやソースコードは登場せず、数式のみ登場してくるパターンもありえます。しかし、このような解説の場合でも、確かに「ソフトウェアの開発」という場面において、重要な知識であることが大いにあります。

このようなパターンも考慮して、Qiitaで扱う情報の範囲を「プログラミング」から「ソフトウェア開発全般に関わる知識」に広げるというものを提案してみます。

これによって扱う範囲として広がるであろう対象の予想は以下のとおりです。

- 数学
- アルゴリズム
- オブジェクト指向（理論）
- プロジェクト管理
- ユーザーインターフェイス／ユーザーエクスペリエンス
- ゲーム開発関連（ゲームデザインなど）

また、これらからの派生もしくは基礎知識となる一般学問に関する話題についても範囲が広がることも期待できます。

もちろんこれに伴う問題も起きることが予想できます。扱う情報の範囲が広がるので、タグは氾濫することになり、取り留めのない状況になる可能性があります。
盲腸の話

周知の通り、 `NilClass#to_i` は `0` を返す。

* http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/29088

> nil.to_iが過去との互換性のための盲腸のようなものだから、です
かね。だから、変えるならむしろnil.to_iをなくすべき。

2001 年時点での盲腸は現在でも残っている模様。。。

ちなみに、 ActiveSupport 環境のもとでは、 `nil.try :to_i` はちゃんと `nil` なので、必要な場合はこちらを使う方が良さそう。

```ruby
[3] pry(main)> show-method NilClass#try

From: /Users/ukondo/.rvm/gems/ruby-1.9.3-p194/gems/activesupport-3.2.2/lib/active_support/core_ext/object/try.rb @ line 50:
Number of lines: 3
Owner: NilClass
Visibility: public

def try(*args)
  nil
end
```

あっ、某PJのRailsのバージョンがまだ `3.2.2` なのがバレて恥ずかしい……

### Thanks

* https://twitter.com/Spring_MT/status/261664339889627136
画像URLを絶対パスから相対パスにする


絶対パスの記述って好きじゃないので。。

``` functions.php
/**
 * 画像パスの相対化
 * @param $url 画像パス
 */
function delete_host_from_attachment_url($url)
{
  $regex = '/^http(s)?:\/\/[^\/\s]+(.*)$/';
  if(preg_match($regex, $url, $m)){
    $url = $m[2];
  }
  return $url;
}
add_filter('wp_get_attachment_url', 'delete_host_from_attachment_url');
```
URLを絶対パスから相対パスにする方法


めも。

```php:functions.php
class relative_URI
{
  function relative_URI()
  {
    add_action('get_header', array(&$this, 'get_header'), 1);
    add_action('wp_footer', array(&$this, 'wp_footer'), 9999);
  }

  function replace_relative_URI($content)
  {
    $home = trailingslashit(get_home_url('/'));
    return str_replace($home, '/', $content);
  }

  function get_header()
  {
    ob_start(array(&$this, 'replace_relative_URI'));
  }

  function wp_footer()
  {
    ob_end_flush();
  }
}
new relative_URI();
```
Qwarkeeで出力したパス描画コードで拡縮


出力コードのままだと大きさ固定で描画されてしまう(あたりまえ)。
せっかくパスで描画しているのだから超拡大して綺麗なラインを見てうっとりしたい！
ということで簡単に拡大率を変更するにはどうすればいいのか？

CGContextScaleCTM()関数を呼べばそれっぽいことはできた。



```obj-c
- (void)drawRect:(CGRect)rect
{
  CGContextRef context = UIGraphicsGetCurrentContext();
  CGContextScaleCTM(context, 4.0, 4.0); //倍率
  〜
```

これが正しい方法なのかどうかは分からないけどうっとりはできた。
ブラケット([])によるコレクション要素へのアクセス

Xcode4.5からブラケットを使用して要素にアクセスできるようになりました。
以前(Xcode4.4?)から小細工すれば使えていましたが。


####配列の場合

```objective-c
NSArray* array = @[@1, @"hoge"];
id tmp = array[0];
NSLog(@"%@", tmp);	//1を出力
```

####辞書の場合

```objective-c
NSDictionary* dict = @{@"key1":@1, @"key2":@"hoge"};
id tmp = dict[@"key2"];
NSLog(@"%@", tmp);	//hogeを出力
```
Haxeのfor文を正しく理解する。

Haxeには、Java,C,AS3のような通常のfor文がありません。

iを0からlength-1までループさせたい場合。

```as3
for( i in 0...length ) {}
```

と書きます。

```as3:ダメな例
for(i = 0; i < length; i++) {}
```

は使えません。

あまり見ないfor文なので、どういう挙動をするか具体的に確認しておきます。

#できないこと

逆順ループは出来ません。

```hx:Main.hx
class Main {
	static function main() {
		for ( i in 20...0 ) {} //エラー
	}
}
```

ループ中にカウンタ変数の変更はできません。

```hx:Main.hx
class Main {
	static function main() {
		for ( i in 0...20 ) {
			i++; //エラー
		} 
	}
}
```

#終値について

終値は変更可能です。

```hx:Main.hx
class Main {
	static function main() {
		var length:Int = 10;
		for ( i in 0...length ) {
			length = 5;
		} 
	}
}
```
↓JavaScriptに出力してみます。

```js:Main.js
var Main = function() { }
Main.main = function() {
	var length = 10;
	var _g = 0;
	while(_g < length) {
		var i = _g++;
		length = 5;
	}
}
Main.main();
```

ただし、フィールド変数の変更はループ回数に反映されません。

```hx:Main.hx
class Main {
	static var len:Int = 10;
	static function main() {
		for ( i in 0...len ) {
			len = 5;
		} 
	}
}
```
↓

```js:Main.js
var Main = function() { }
Main.main = function() {
	var _g1 = 0, _g = Main.len;
	while(_g1 < _g) {
		var i = _g1++;
		Main.len = 5;
	}
}
Main.len = 10;
Main.main();
```

配列の長さも反映されません。

```hx:Main.hx
class Main {
	static function main() {
		var arr = [0,1,2,3];
		for ( i in 0...arr.length ) {
			arr.pop(); //配列を1つ短くする。
		} 
	}
}
```
↓

```js:Main.js
var Main = function() { }
Main.main = function() {
	var arr = [0,1,2,3];
	var _g1 = 0, _g = arr.length;
	while(_g1 < _g) {
		var i = _g1++;
		arr.pop();
	}
}
Main.main();
```

ここら辺は速度重視みたいですね。

#その他
中断できます。

```hx:Main.hx
class Main {
	static function main() {
		for ( i in 0...20 ) {
			break; //ココでループを中断。
		} 
	}
}
```

continueもできます。

```hx:Main.hx
class Main {
	static function main() {
		for ( i in 0...20 ) {
			continue;
			//continue以下は実行されず次のループに入ります。
		} 
	}
}
```

いわゆるForeach文のような使い方もできます。

```hx:Main.hx
class Main {
	static function main() {
		var arr = ["Hello","World","!","!"];
		for ( str in arr ) {
			trace( str ); //「Hello」「World」「!」「!」が順番に出力。
 		} 
	}
}
```

オブジェクトのプロパティでループさせることもできます。
(AS3のfor-inループに当たります)

```hx:Main.hx
class Main {
	static function main() {
		var o = { x:10, y:20 };
		for ( key in Reflect.fields( o ) ) {
			trace( key ); 					//「x」「y」が出力。
			trace( Reflect.field(o, key) );	//「10」「20」が出力。
 		} 
	}
}
```
SinatraでのRABLの使い方

## RABLとは…

- [https://github.com/nesquena/rabl](https://github.com/nesquena/rabl)
- jsonでのレスポンスを簡単に書くためのテンプレートエンジンみたいです。
- ちょっとしたAPIサーバーをSinatraで作るときにRABLを併用することはありそう。

## インストール

```ruby:Gemfile
source :rubygems

gem 'sinatra'
gem 'rabl'
```

```sh
$ bundle install
```

## 基本

```ruby:my_app.rb
class MyApp < Sinatra::Base
  Rabl.register!

  set :rabl, :format => :json

  get '/' do
    get :rabl, :home
  end
end
```

```views/home.rabl
node(:greeting) do
  'Hello, Sinatra with RABL!'
end
```

```sh
$ curl http://myapp.dev
{"greeting":"Hello, Sinatra with RABL!"}
```

## レイアウト

- APIのレスポンスとしては、ステータスコードなどのメタ情報をすべてのレスポンスに共通して含めたい。
- なので、Sinatraのテンプレートを使ってみる。

```ruby:views/layout.erb
{
  "status": <%= response.status %>,
  "result": <%= yield %>
}
```

```ruby:my_app.rb
get '/' do
  render :rabl, :home, :layout_engine => :erb
end
```

```sh
$ curl http://myapp.dev
{
  "status": 200,
  "result": {"greeting":"Hello, Sinatra with RABL!"}
}
```

- RABLの[wiki](https://github.com/nesquena/rabl/wiki/Using-Layouts)にあるように、ruby 1.9.xではRABLでレイアウトを書けないので、erbを使う。
- レスポンス本体とレイアウトのエンジンが異なる場合は、`:layout_engine => :erb`と指定する必要があるっぽい。
Twenty Eleven を使っていると IE6 で画像がランダムなサイズになる


キャッシュがない状態で起こります。`img` タグに `width` と `height` を指定していても、めちゃくちゃなサイズになってしまいます。

以下の `width` と `height` が問題のようです。

```twentyeleven/style.css
img.size-full,
img.size-large {
	max-width: 97.5%;
	width: auto; /* Prevent stretching of full-size and large-size images with height and width attributes in IE8 */
	height: auto; /* Make sure images with WordPress-added height and width attributes are scaled correctly */
}
```

問題は、いまいち良い解決策がないところ。CSS の記述をなかったことにすることはできません。

状況に応じて `img` タグに `size-full`, `size-large` クラスをつけないようにするか、該当部分をコメントアウトしてしまいましょう。前者は画像の自動挿入でつくクラスですし、後者は WordPress のアップデートの際に対応しなければならないので、悩ましいところですね。
Twenty Eleven テーマのメニューの IE6 対応


[Twenty Eleven](http://theme.wordpress.com/themes/twentyeleven/) のマウスをのせると出てくるサブメニューは `li:hover` で設定されているので、IE6 では動きません。

しょうがないので JS で書きます。

```js
jQuery(function ($) {
  if ($('html').attr('id') === 'ie6') {
    $('#access ul > li').on('mouseover', function () {
      $(this).find('ul').show();
    }).on('mouseout', function () {
      $(this).find('ul').hide();
    });
  }
});
```
ブラウザバックで元の画面が復元される問題

自分用メモです。

[戻るボタンが押された際、ページのJavaScriptを途中の状態から実行させない方法](http://nmi.jp/archives/273)

まず、 B.html から「戻る」をしたときに、（s1 ではなく） s3 の状態になってしまうのは、Back Forward Cache というブラウザの機能によるものでした。

任意のページで予め、

```javascript
window.onunload = function() {};
```

のように window.onunload に空の関数を代入すると、 Back Forward Cache が機能しなくなるようです。  
また、 Back Forward Cache が発生した場合（戻るで s3 に到達した場合）であっても、pageshow イベント（ window.onpageshow ）が呼ばれるようです。

onunload を書き換える以外にも、 onpageshow を書き換えてそこで処理を行なったり、onpageshow イベントが発火して呼ばれる関数内で event.persisted の値を参照することで Back Forward Cache が利用されているか判定できるようです。
java batch(JSR 352) Early Draft の MR っぽいのは MR じゃない

JSR 352 に @PartitionMapper と @PartitionReducer っていて、あたかも MapReduce をサポートしているかのように見えるけど、役割が全然違って MapReduce できないっぽい。

@PartitionMapper は並列実行を振り分けるもので、@PartitionReducer は並列処理の事前・事後の処理を行うもの、みたい……orz
gitのブランチとgithubのissueを結びつける

gitのブランチ名とgithubのissueを結びつける.

以下の内容で.git/hooks/commit-msgを作る.

``` bash:commit-msg
#!/bin/bash

BRANCH=$(git symbolic-ref HEAD)

grep '^refs #[0-9]\+: ' $1
if [ $? -eq 0 ]; then
  exit
fi

ISSUE=$(echo $BRANCH | sed -e 's/^.*-id-\([0-9]*\)$/#\1/')
if [ "$ISSUE" != "$BRANCH" ]; then
  echo "Auto append: $ISSUE"
  mv $1 $1.$$
  echo -n "$ISSUE: " > $1
  cat $1.$$ >> $1
  rm $1.$$
fi

```

忘れずに実行権限をつける

```bash
chmod +x commit-msg
```

gitのブランチ名を`hogehoge-fugafuga-id-1`のように一番後ろに`id-チケット番号`にしておいて、マージすると、#チケット番号が自動的に付与される