OmniAICreator/Qiita-1.07M huggingface dataset:
[iOS] 「インストール直後のみxxする/アップデート直後のみyyする」的な処理を簡単に書く方法

インストール直後やアップデート直後の初回起動時のみに何かを実行したいことって、あると思います。

例えばインストール直後にアプリのチュートリアルを表示したり、アップデート直後に新機能の紹介をしたりなんかですね。

そこでインストールやアップデートを起点にした処理を簡単に書けるようなライブラリを作ってみたので紹介します。

## SRGAppVerWatcher

https://github.com/soragoto/SRGAppVerWatcher

## 導入してみる
Podfileに以下の行を追加して`pod update`します。

```ruby:Podfile
pod 'SRGAppVerWatcher'
```

導入後は利用するクラスファイルで`SRGAppVerWatcher.h`をimportすれば利用できます。

```objc:File.m
#import "SRGAppVerWatcher.h"
```

## インストール直後に特定の処理を実行してみる

AppDelegateでインストール後の初回起動時にのみ特定の処理を実行する場合は以下のようなコードになります。

```objc:AppDelegate.m
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    .... 
    [[SRGAppVerWatcher sharedWatcher] executeOnceAfterInstall:^{
        // この処理はアプリインストール後に一度だけ実行されます.
        // (例:チュートリアルをenableにする処理やremote-logingなどなど )
    }];
}
```
`executeOnceAfterInstall`に渡したBlocksがインストール直後に起動した時に一度だけ実行され、2回目以降は実行されません。

## アップデート直後に特定の処理を実行してみる

AppDelegateでアップデート後の初回起動時にのみ特定の処理を実行する場合は以下のようにブロックを渡します。ブロック引数の`from`にはアップデート前のバージョンが、`to`にはアップデート後のバージョンが入っています。

```objc:AppDelegate.m
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    .... 
    [[SRGAppVerWatcher sharedWatcher] executeOnceAfterUpdate:^(NSString *from, NSString*to){
        // この処理はアップデート後に一度だけ実行されます.
        // (例:アプデによる新機能の紹介処理、データ以降処理、remote-logingなどなど)
    }];
}
```

## バージョンに関する記録を取得する

```objc:Example.m
// インストール日の取得
NSDate *installDate     = [[SRGAppVerWatcher sharedWatcher] installDate];

// 最初にインストールした時のアプリのバージョンの取得
NSString *installVersion = [[SRGAppVerWatcher sharedWatcher] installVersion];

// 現在のバージョンにアップデート(orインストール)した日付を取得
NSDate *updateDate      = [[SRGAppVerWatcher sharedWatcher] updateDate];

// バージョン2.0にアップデート(orインストール)した日付を取得
NSDate *updateDateOfVer2  = [[SRGAppVerWatcher sharedWatcher] updateDateOf:@"2.0"];
```

## インストール後、xx日以上経過したユーザにのみ特定の処理を実行

インストールやバージョンごとのアップデートの日付が取得できるので以下のようにすれば、経過日数で処理をわけることもできます。

```objc:Example.m
NSTimeInterval Days    = 60*60*24;
NSDate *installDate    = [[SRGAppVerWatcher sharedWatcher] installDate];
NSTimeInterval elapsed = [[NSDate date] timeIntervalSinceDate:installDate];

if( elapsed > 10*Days ){
    // インストール後 10日以上経過している場合のみ実行される
}

```

## 注意点

内部での実装としてSRGAppVerWatcherはインスタンスが生成される部分の処理で、現在のバージョンと、保持しているバージョンを比較してインストールかアップデートかを判定しています。　

なのでSRGAppVerWatcherを導入する際は、最初のバージョンから導入しておかなければインストールなのかアップデートなのかの判定ができません。

アップデートの履歴などは後からとれるものでもないので、新規プロジェクトで、もしかしたら必要になるかも？と思ったら、とりあえず導入しておいて損はないかもです！

以上、バージョンの変更情報を検知/保持するSRGAppVerWatcherの紹介でした！
Sass,Compassでフォルダ内のファイルリストを取得するカスタム関数


* site: http://develo.org/2014/05/08/1000.html
* GitHub: https://github.com/kamem/compass.develo

Sass,Compassでフォルダ内にある複数の画像をとってきて背景画像を指定したいときなどに、「全部書くのってめんどくさいなぁ・・」って思っていました。

なので！指定したフォルダ内のファイル名を取得してくれるやつを作ってみました！コードも省略できたり。
新たにフォルダ内に画像を追加してコンパイルすればコードを書く手間も省けたりで使い勝手良いと思います。


仕様・使い方
-----
* <code>fileList('folderName/*')</code>でフォルダ内の全てのファイルリストが取得できます。（例えばgifの画像だけを取得したい場合には<code>fileList('folderName/*.gif')</code>となります。）
* 初期状態ではcompass watchした場所からのパスを全て表示します。
* 第2引き数にfalseを入れることにより<code>fileList('folderName/*',false)</code>ファイル名 + 拡張子だけを取得することができます。
* 拡張子が必要ない場合には第3引き数に必要のない拡張子を指定します<code>fileList('folderName/*',false,'.gif')</code>


実際に使う
-----

「html/img」フォルダ内のgif画像を階層なし拡張子無しファイル名を取得したい場合。

「$images_dir」にconfig.rbで指定しているimages_dirの値を持っておくと便利です。
※ config.rb内のimages_dirの値を取ってこれたら便利だなぁと思ったのですが、見つかりませんでしたので、sass内で持つようにしています。

### Sass 
	$images_dir: 'html/img/';
	$imgs: fileList($images_dir + "*.gif",false,'.gif');
	
	.fileList li {
		@each $img in $imgs {
			#{"&." + $img} {
				background: image-url("#{$img}.gif");
			}
		}
	}

### CSS
	.fileList li.img1 {
	  background: url('/html/img/img1.gif?1394796721');
	}
	.fileList li.img2 {
	  background: url('/html/img/img2.gif?1394796721');
	}
	.fileList li.img3 {
	  background: url('/html/img/img3.gif?1394796721');
	}
	.fileList li.img4 {
	  background: url('/html/img/img4.gif?1394796721');
	}
	.fileList li.img5 {
	  background: url('/html/img/img5.gif?1394796721');
	}
Sass,Compassファイルの有無を返してくれるカスタム関数


* site: http://develo.org/2014/05/08/1000.html
* GitHub: https://github.com/kamem/compass.develo

配列で繰り返し処理をし、<code>image-url</code>などを使ってその名前の画像を表示するような仕組みの場合
そのファイルが無いとsassではエラーになってしまいます。
その時にその画像の有無をとってきて画像がない場合には処理が走らないようにしたり。
またはファイルの有無によって処理を変えたりなどの用途に使うことができます。

仕様・使い方
----
1. config.rbに記述
	（rbフォルダ内に入れている場合）

		require "./rb/isFile.rb"

2. isFile('fileName')で ture or false が文字列で返って来ます。
※ fileNameは<code>compass watch</code>している場所からのパスになります。

3. 実際に使う
		
	    @if isFile('fileName') == 'true' {

		}

例
----
img（数字）.gifの画像を背景に指定する際にimg6以降がない場合。

### Sass
	$img: img1,img2,img3,img4,img5,img6,img7,img8,img9,img10;
	$num: 0;
	ol li {
		text-indent: -9999px;
		@each $name in $img {
			$num: $num + 1;
			&#{':nth-child(' + $num + ')'} {
				@if isFile('html/img/' + $name + '.gif') == 'true' {
			    	background: image-url($name + '.gif');
			    }
			}
		}
	}

### CSS
	ol li {
		text-indent: -9999px;
	}
	ol li:nth-child(1) {
		background: url('/html/img/img1.gif?1394796721');
	}
	ol li:nth-child(2) {
		background: url('/html/img/img2.gif?1394796721');
	}
	ol li:nth-child(3) {
		background: url('/html/img/img3.gif?1394796721');
	}
	ol li:nth-child(4) {
		background: url('/html/img/img4.gif?1394796721');
	}
	ol li:nth-child(5) {
		background: url('/html/img/img5.gif?1394796721');
	}
Sublime Text2,3のDropbox, Gitを使った同期の方法

# まとめ
win,mac,unix共に[公式](https://sublime.wbond.net/docs/syncing)にある方法がベストなのでそちらを見るべし。

# (2014/5/18時点での)公式のまとめ

## 注意

> 同期させる際には```Packages/```, ```Installed Packages/```をそのまま同期させるべきではない。パッケージによってはOSごとに異なるバージョンをインストールすることがあるからだ。上記のフォルダをそのまま同期させると、パッケージが正しく認識されない可能性がある。

> 適切な同期の方法は```Packages/User/```フォルダを同期させることだ。このフォルダにある```Package Control.sublime-settings```には今までインストールしたパッケージの一覧が記述されている。このファイルが異なる端末にコピーされた状態でSublime Textを起動させると、（未インストール状態のパッケージについて）正しいバージョンをインストールするようになっている。

## Dropbox
win,macともにSublime Text2の場合は下記の3を2に変更するだけで動く。  
どちらもDropbox上にSublimeというディレクトリを作成し、SublimeのUserフォルダを移動させ、シンボリックリンクを元の場所に張る方法。

### windows(vista以降)の場合

```zsh
cd "$env:appdata\Sublime Text 3\Packages\"
mkdir $env:userprofile\Dropbox\Sublime
mv User $env:userprofile\Dropbox\Sublime\
cmd /c mklink /D User $env:userprofile\Dropbox\Sublime\User```
```

### mac(OSX)の場合

```zsh
cd ~/Library/Application\ Support/Sublime\ Text\ 3/Packages/
mkdir ~/Dropbox/Sublime
mv User ~/Dropbox/Sublime/
ln -s ~/Dropbox/Sublime/User
```

別の端末でも同じようにDropbox側のUserを参照するシンボリックリンクを貼ればOK

## Git

基本的には```Packages/User/```を管理すれば良いが、以下の方法でやると **Githubの公開リポジトリを利用している場合 、商用パッケージなどのライセンスキーが公開される場合があるので注意** （プライベートリポジトリであらえば問題ない。）

以下のファイルは特に同期する必要が無いので、```.gitignore```で無視する設定にすると良い。

```
Package Control.last-run
Package Control.ca-list
Package Control.ca-bundle
Package Control.system-ca-bundle
Package Control.cache/
Package Control.ca-certs/
```
CCLabelTTFのenableStrokeがiOS7で効かない

Cocos2d-x で開発をしていて、CCLabelTTFに縁取りをしたいと思って、
以下のように記述

```objc
CCLabelTTF* pLabel = CCLabelTTF::create(labelType.c_str(), GAME_FONT, 28);
// 影をつける
pLabel->enableShadow(CCSizeMake(4,-4),0.5,0.8,true);
// 縁取りをする
pLabel->enableStroke(ccGRAY,1.0,true);
```

cocos2d-x のバージョンは、cocos2d-x-2.2.3

iOS7だと、縁取りが反映されない。

ここに対処方法が乗ってた。
[Stroking not working on CCLabelTTF in cocos2d-x ios in c++](http://stackoverflow.com/questions/21720431/stroking-not-working-on-cclabelttf-in-cocos2d-x-ios-in-c)

これを参考に、以下のように修正しました。

修正前:

```objc
// actually draw the text in the context
// XXX: ios7 casting
[str drawInRect:CGRectMake(textOriginX, textOrigingY, textWidth, textHeight) withFont:font lineBreakMode:NSLineBreakByWordWrapping alignment:(NSTextAlignment)align];
```

修正後:

```objc
// actually draw the text in the context
// XXX: ios7 casting
[str drawInRect:CGRectMake(textOriginX, textOrigingY, textWidth, textHeight) withFont:font lineBreakMode:NSLineBreakByWordWrapping alignment:(NSTextAlignment)align];

// New Code Start

if(pInfo->hasStroke) {
    CGContextSetTextDrawingMode(context, kCGTextStroke);
    CGContextSetRGBFillColor(context, pInfo->strokeColorR, pInfo->strokeColorG, pInfo->strokeColorB,1);
    CGContextSetLineWidth(context, pInfo->strokeSize);
    [str drawInRect:CGRectMake(textOriginX, textOrigingY, textWidth, textHeight) withFont:font lineBreakMode:NSLineBreakByWordWrapping alignment:(NSTextAlignment)align];
}

//New Code End
```

試してませんが、以下のサイトの方法でも大丈夫かもです。

[CCLabelTTFのenableStrokeをiOS7に対応させる](http://poppingames.hatenablog.com/entry/20131206/1386272980)
SublimeText2,3 package controlでインストールしているもの一覧の見方

コマンドパレットからpackage control listとかでインストール済みパッケージ一覧を見ることができるんですが、テキストじゃないので人に渡せなかったりして辛かったのでテキストで見れ無いかなーと思っていました。

[公式](https://sublime.wbond.net/docs/usage)みたら

>installed_packages list in Packages/User/Package Control.sublime-settings. The installed_packages list allow Package Control to automatically install packages for you if you copy your Packages/User/ folder to another machine.

らしく、普通に```Packages/User/Package Control.sublime-settings```みたらありました。

ちなみにSublime Text3では```~/Library/Application Support/Sublime Text 3/Packages/User/Package Control.sublime-settings```
に同じファイルがあります。
Cannot find executable for CFBundleの直し方がやっと分かった

iOSシミュレータで開発していて、ずっと出ていた謎のエラー"Cannot find executable for CFBundle"。特に実害はないし直し方がわからなかったので（シミュレータをリセットするとしばらくでなくなる）泣く泣く放置していたけどようやく分かった。

http://stackoverflow.com/questions/18888059/cannot-find-executable-for-cfbundle-certuiframework-axbundle

BetterTouchToolを起動していると、このエラーが出てしまう模様。BTTはアプリごとにOn/Offを切り替えられるので、iOSシミュレータ起動している状態で、メニューバーからBTTアイコンをクリック＞"Disable BTT for Current App"とすればでなくなる。

エンジョイ快適エラーなしライフ！
Marvericksにgensimをインストールする


# 公式ページ
http://radimrehurek.com/gensim/

# ソースコード
https://github.com/piskvorky/gensim

# 依存パッケージ
numpy
scipy

# 事前作業
[MarvericksにPython開発環境をセットアップする](http://qiita.com/saicologic/items/b5c342001d262207d4ed)
[Marvericksにnumpyをインストールする](http://qiita.com/saicologic/items/9208f5e6d384df7a9ce0)
[Marvericksにscipyをインストールする](http://qiita.com/saicologic/items/107ecc8c4ed340ae9793)


# インストール

```bash
$ sudo pip install --upgrade gensim
```
zshの個人的に便利だと思った機能（suffix alias、略語展開）

zshデビューしたので、個人的に便利だと思った機能をまとめた。

## suffix alias

```alias -s ```を利用することで拡張子に応じたコマンドを実行してくれるようになる。  
例えば

```zsh
python hello.py # hello.
```

のような実行においても

```zsh
alias -s py='python'
```

としておくと

```zsh
./hello.py # hello.
```

のような形式で実行できる。

[こちら](http://d.hatena.ne.jp/itchyny/20130227/1361933011)で紹介されている.cファイルを実行すると自動でビルド->実行までしてくれるような設定が可能で、もはやなんでもできそうな感じがする。ｽｺﾞｲ

現在は下のように設定している。練習がてらjavaを追加。

```zsh
alias -s txt='cat'
alias -s html='google-chrome'
alias -s rb='ruby'
alias -s py='python'
alias -s hs='runhaskell'
alias -s php='php -f'
alias -s {gz,tar,zip,rar,7z}='unarchive' # preztoのarchiveモジュールのコマンド(https://github.com/sorin-ionescu/prezto/tree/master/modules)
alias -s {gif,jpg,jpeg,png,bmp}='display'

function runcpp () {
    g++ -O2 $1
    shift
    ./a.out $@ 
}
alias -s {c,cpp}='runcpp'

function runjava () { 
    className=$1
    className=${className%.java}
    javac $1
    shift
    java $className $@
}
alias -s java='runjava'
```

#### ネタ元
* [zshのalias -s (suffix alias)が神な件 - プログラムモグモグ](http://d.hatena.ne.jp/itchyny/20130227/1361933011)
* [漢のzsh (16) 拡張子ごとにコマンドを自動実行 - 「alias -s」 | マイナビニュース](http://news.mynavi.jp/column/zsh/016/)


## 略語展開(iab)

zshでは```alias -g```とすることで、先頭以外でも展開されるエイリアス（グローバルエイリアス）の設定が可能だ。
ただ、（他のエイリアスと同じく）展開結果を目視することは不可能なので、グローバルに展開されるとなると少し不安が伴う場合がある。

不安で胃に穴が空きそう人やグローバルと聞くと蕁麻疹が出る人には、[こちら](http://d.hatena.ne.jp/rubikitch/20071104/1194183191)で紹介されているvimのiabと同じような動作をする略語展開の設定が有効。

この設定で```"G"```を```"| grep"```あたりに設定しておくと、```G␣```（Gのあとにスペース）と入力すると```| grep```に自動で置換される。```<C-x>```を入力してからスペースを押せば展開させないことも可能だ。（もちろんhogeG␣で暴発みたいなことはない。ｽｺﾞｲ）

現在は下のように設定している。設定したいときは```.zshrc```あたりに下記をコピペして(または別ファイルに書いて ```.zshrc```あたりで```source hogehoge```とする。)、```abbreviations```を好きなように書き換えればOK。

```zsh
setopt extended_glob

typeset -A abbreviations
abbreviations=(
    "G"    "| grep"
    "X"    "| xargs"
    "T"    "| tail"
    "C"    "| cat"
    "W"    "| wc"
    "A"    "| awk"
    "S"    "| sed"
    "E"    "2>&1 > /dev/null"
    "N"    "> /dev/null"
)

magic-abbrev-expand() {
    local MATCH
    LBUFFER=${LBUFFER%%(#m)[-_a-zA-Z0-9]#}
    LBUFFER+=${abbreviations[$MATCH]:-$MATCH}
    zle self-insert

}

no-magic-abbrev-expand() {
    LBUFFER+=' '

}

zle -N magic-abbrev-expand
zle -N no-magic-abbrev-expand
bindkey " " magic-abbrev-expand
bindkey "^x " no-magic-abbrev-expand
```

追記(fishの話）

fishには`abbr`というコマンドがありますが暴発防止のために展開位置に制限があり、上記のようなパイプを展開する用途では利用できません。

同じような挙動になるように調節した関数を作ったので参考になれば幸いです。
https://gist.github.com/matsu-chara/cb7c3eb81ffd909e922db39e87fec873

#### ネタ元
* [vimのiabのよう略語展開 - (rubikitch loves (Emacs Ruby CUI Books))](http://d.hatena.ne.jp/rubikitch/20071104/1194183191)
* [examples:zleiab [ZshWiki]](http://zshwiki.org/home/examples/zleiab)
Marvericksにscipyをインストールする


# 事前準備（オプション）
### gfortranをインストールする

以下のページから`gfortran`をインストールする
http://gcc.gnu.org/wiki/GFortranBinaries


Download
http://coudert.name/software/gfortran-4.9.0-Mavericks.dmg

### Cythonをインストールする

```bash
$ sudo ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future pip install cython
```

# インストール

```
$ sudo ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future pip install scipy
```


### トラブルシューティング

```
Running cythonize failed
```

原因: cythonがない
=> Cythonいれる
タブをスペースに変換する

## 概要
とあるRailsプロジェクトで、API側はRuby(Rails)で2spaceでコーディングしましょうっていう決まりがあって、ほとんど、2spaceでコーディングされています。

でも、フロントエンドのjavascript,css,htmlはtabまじりでコーディング規約が決まってないとします。

でも、2spaceでエディター(vim)を設定してる状態でフロントエンドもいじりたいです。とそういうときに、タブをスペースに変換したかった。

## 変換

https://rubygems.org/gems/code-cleaner

これを使います。

```rb
gem install code-cleaner
```

ですよ

で、直したいリポジトリのディレクトリまでチェンジディレクトリして

```rb
code-cleaner .
```

これだけで、タブを2spaceにしてくれます。あと、不要な改行とか消してくれます。

でも、このままだと、rubyしか変換してくれないのでjavascriptもcssも変換してくれるようにします。

## 拡張

https://github.com/yanap/code-cleaner/commit/98bfa08e22dc180c33c299222416c72f2849034d

こんな感じで適用したい拡張子増やします。

## やってること

結局のところ

https://github.com/yanap/code-cleaner/blob/master/bin/code-cleaner#L137

```rb
normalized_line = line.gsub(/\t/, "  ").rstrip + "\n"
```

これなんですよねー

おしまい
Marvericksにnumpyをインストールする


```
sudo pip install numpy
```
をしたら以下のエラーが出た。

```
RuntimeError: Broken toolchain: cannot link a simple C program
```


## 解決策

以下のコマンドを実行した。

```
$ sudo ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future pip install --upgrade numpy
```

成功！

```
Successfully installed numpy
Cleaning up...
```

## 参考

[problems-with-pip-install-numpy-runtimeerror-broken-toolchain-cannot-link-a](
http://stackoverflow.com/questions/22388519/problems-with-pip-install-numpy-runtimeerror-broken-toolchain-cannot-link-a)
【初めてのRails4】 railsでrspecの設定


[Ruby on Rails](http://rubyonrails.org/)を触ることになったので、[Ruby on Rails チュートリアル](http://railstutorial.jp/)を参考にしながら作成記録のメモ

## 前の投稿

[【初めてのRails4】 CRUDをまとめて作る rails g scaffold](http://qiita.com/ryurock/items/37e91719f853e07dfacd)

## 環境

* CentOS6.4
* Rails 4.0.4

## 事前準備に必要なもの

* Ruby 2.x
 * インストールされていない場合は[【Rails4】 インストール編
](http://qiita.com/ryurock/items/77542e00cbca5268e323)を参考してください。
 * プロジェクトの作成をしていない場合は[【Rails4】 プロジェクトの作成 rails new](http://qiita.com/ryurock/items/79bc39a7bb473f140546)を参考にしてください。
 * 前の記事は[【Rails4】 gemライブラリを吟味する](http://qiita.com/ryurock/items/79bc39a7bb473f140546)です。

* MYSQL
 * インストールされていない場合は[virtualbox(centos)でMYSQLインストールメモ(mysqld_multiで複数インスタンス起動まで)](http://qiita.com/ryurock/items/73df4ab45c96092b63b8)を参考してください。

## 参考にしたサイト

* [Ruby on Rails チュートリアル](http://railstutorial.jp/)
* [Rails Girls ガイド](http://railsgirls.jp/)


## BDDしましょう

ということで[rspec](http://rspec.info/)でカキカキしたいですのでそちらの方法をメモ

## rails g rspec:installでspec_helperを作る

railsでアプリケーションを作るときにrspecで作るとspec_helperが何やら作成されなかったです。。。。

なので最初に下記のコマンドを実行する必要があるみたいです

```
rails g rspec:install
```

## でrspceを実行する

いつも通りに

```
rspec spec
```

de OK!!!
LEGOで遊んで3D業界へ乱入〜最終目標はUnityで活用〜

# Unityで使うオブジェクトのモデリング、しんどそうだよ。わかんないよ。

どうしても3Dって時間かかりそう、ってか専門家じゃないと・・ってイメージがあります。
だから俺みたいなんは諦めてせいぜいレゴブロックで遊ぶとします。

# せいぜいレゴブロックで遊ぶ。
俺ちっちゃい頃は滅茶苦茶レゴで遊んだんだ。朝から晩まで。本当さ。大好きだったんだ。
だからこれからも無茶苦茶レゴで遊ぶんだ。パソコンでもバーチャルで遊べるよ↓
http://ldd.lego.com/ja-jp/

# 生産性がないと、つまらないね。
海外なら組み立てに必要としたブロックの実物をアプリからそのままオーダー出来るんだって。でもジャパンは非対応さ。
嗚呼・・・なんとかしてアウトプットしていきたいよね！

# じゃあこのブロックで作ったやつ、Unityで活用しよう。
なんでそういう流れになったかは置いといてやってみよう。
これがうまくいけばLEGOの公式アプリを活用してゲームアプリ作れるはずだよ。
まずLEGOでldrというファイル形式でエクスポートしよう。
これを汎用的な形式にしなければ使い物にならない。
blenderを準備しよう。
http://blender.jp
で、いいアドオンを見つけたんだ。↓
http://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts/Import-Export/LDRAW_Importer
作った人、ありがとう。

blenderを起動して設定を開いてアドオンを取り込む。
アドオンはzipで落として来たら解凍せずにblenderからそのままそのzipを指定してインストール出来るぞ。

あとはアドオンを使う準備として
http://www.ldraw.org/help/getting-started.html
から必要なライブラリ（ブロックのデータ）を取ってくるんだ。
設置場所は
Windowsの人はC:\\LDraw
Macの人は/Applications/ldraw
Linuxの人は~/ldraw
になるようにするんだって。

# デフォの設置場所が気に入らない
作った人、ごめんなさい。
Mac使ってるとアプリでもないファイルを/Applications/に置きたくないのさ。
WindowsだってC直下に置きたくないはず。
Linuxなんてルート直下だってさ。すげえな。

てことで場所変えます。
OSごとにblenderでインストールしたアドオンが格納されるディレクトリ違うと思うからファイルの場所は割愛するけどMacなら~/Library/Application Support/Blender/バージョン/scripts/addonsかな。

さきほどの手順できちんとアドオンがインストールされていればimport_ldraw.pyってファイルがある。
テキストエディタとかで見てみると次のような行がある。

```py:import_ldraw.py
"""
Default LDraw installation paths
Index 0: Windows
Index 1: Mac OS X
Index 2: Linux
Index 3: User defined, raw string
Storing the paths in a list prevents the creation of global variables
if they are changed. Instead, simply update the proper index.
"""
LDrawDirs = ["C:\\LDraw", "/Applications/ldraw/", "~/ldraw/", r""]
```

開発者さん気が利きます。
3つめの引数にお好きなパスを設定しろって書いてあるからお言葉に甘えて

```py:import_ldraw.py
"""
Default LDraw installation paths
Index 0: Windows
Index 1: Mac OS X
Index 2: Linux
Index 3: User defined, raw string
Storing the paths in a list prevents the creation of global variables
if they are changed. Instead, simply update the proper index.
"""
pwd = os.path.dirname(__file__)
LDrawDirs = ["C:\\LDraw", "/Applications/ldraw/", "~/ldraw/", pwd + r"/ldraw/"]
```

とかしてやってimport_ldraw.pyがあるところと同じディレクトリ、つまりblenderのアドオンディレクトリの中にldrawディレクトリを入れてやればスッキリさ。
blenderのバージョンアップ時にもそのまま持って行けそうな気がするなっしー。
python歴１分の俺が書いたけど動くかなドキドキ。

# 準備出来たから使ってみる
blenderの画面左上のメニューからimport->LDrawを選ぶ。
で先ほど作ったであろうldrファイルを指定する。

あ〜すっごい。
ちゃんと読み込めた。

# どうやってUnityで活かすんだ？
~~そのうち考えますが、今日はここまで。
でもblenderにインポート出来たって事はあとは大抵の汎用的なデータとして書き出せるから無限の可能性があることは保証されているという事でどうでしょうか？？~~
Blenderの標準的な保存形式、.blenderファイルをUnityではサポートしているようです。なのでBlenderで普通に保存してやって、.blenderファイルをUnityで直接インポートしてやってください。

## 誤解のないよう追記
LEGOブロックは本当に好きでした。物心つく前からちょっとしたシムシティを作れるくらい大量に与えられました。ペアレントにシェーシェー。（謝謝）
bhyveのソースコードリーディングメモ(iommu_init():その2:AGAWとdomain)

## 参考ドキュメント
####[前回ドキュメント](http://qiita.com/akachochin/items/3638733711b3c41c189c)
####[ASADA氏の公開記事](http://syuu1228.github.io/howto_implement_hypervisor/)
この記事から引用したときは「ChapterXX」とする。例えば第15回の記事なら(Chapter15)となる。

####[Intel ® Virtualization Technology for Directed I/O Architecture Specification](http://www.intel.co.jp/content/www/jp/ja/intelligent-systems/intel-technology/vt-directed-io-spec.html) 
このドキュメントから引用したときは(仕様書:XXX)とする。

## domainを作る
今回はiommu_init()の以下処理から読んでみる。

```c
	/*
	 * Create a domain for the devices owned by the host
	 */
	maxaddr = vmm_mem_maxaddr();
	host_domain = IOMMU_CREATE_DOMAIN(maxaddr);
	if (host_domain == NULL)
		panic("iommu_init: unable to create a host domain");
```

IOMMU_INIT()経由でvtd_create_domain()が呼ばれる。

## AGAW
```c
	/*
	 * Calculate AGAW.
	 * Section 3.4.2 "Adjusted Guest Address Width", Architecture Spec.
	 */
```

この処理では、最初に引数で与えられた最大物理アドレスのAGAW(Adjusted Guest Address Width)を計算する。
要するに「アドレス幅がどのくらいか」である。

上記引用コメント以下でごにょごにょと計算しているが、要するに以下表のようなagaw値を作りたいのである。

| Address範囲|AGAW|
|:-----------:|------------:|
| 0x00000000_00001000 - 0x00000000_001fffff |21|
| 0x00000000_00200000 - 0x00000000_3fffffff |30|
| 0x00000000_40000000 - 0x0000007f_ffffffff |39|
| 0x00000080_00001000 - 0x0000ffff_ffffffff |48|

なぜ、AGAWの計算が必要なのか。それは以下コメントにあるとおり、ページテーブルの深さが決まるためである。

```c
	/*
	 * Select the smallest Supported AGAW and the corresponding number
	 * of page table levels.
	 */
```

次に、IOMMU側でサポートされているAGAWを取得する。

```c
	tmp = VTD_CAP_SAGAW(vtdmap->cap);
```

## ここでちょっとCAPについて
CAPについては、仕様書10.4.2「Capability Register」を見て欲しい。これはその名前のとおり、「このremapping H/Wでできることを調べる」ためのレジスタである。
このレジスタのSAGAW(Supported Adjusted Guest Address Width)は5bitのビットフィールドでこのremapping H/Wでサポートするゲスト物理アドレスのアドレス長を表す。
現時点では、bit1,2がそれぞれ39bit Address Widthと48bit Address Widthを表す。

この関数のループでは、計算から求められたAGAWとハードがサポートしているAGAWの両方を満たすAGAWの中で一番最小のものを選ぶ。おそらく、できる限りページテーブルを小さくするためだと思われる。

## domainについて
そして、domain構造体を割り当てる。仕様書3.2「Domains and Address Translation」の記述によると、「プラットホーム内の独立した環境に対して割り当てられたホストの物理アドレスのサブセット」であり、あるデバイスが使うアドレス空間を表現するためのものである。
※ただし、今回作成するドメインはホストの物理アドレス空間そのものと1:1対応する特殊なドメインを作成する。
IOMMU_CREATE_DOMAIN()を呼び出すところに以下コメントがあったことを思い出すと良い。

```c
	/*
	 * (省略)
	 * Create a domain for the devices owned by the host
	 * (省略)
	 */
struct domain {
	uint64_t	*ptp;		/* first level page table page */
	int		pt_levels;	/* number of page table levels */
	int		addrwidth;	/* 'AW' field in context entry */
	int		spsmask;	/* supported super page sizes */
	u_int		id;		/* domain id */
	vm_paddr_t	maxaddr;	/* highest address to be mapped */
	SLIST_ENTRY(domain) next;
};
```

そして、domain構造体を初期化する。
ここで一点注意することがある。
domain構造体のptpメンバはゲストのアドレス空間を表現するためのページテーブルの仮想アドレスが格納される。
(次回あたり書くが、今回はホストドメインという「ホストの物理アドレス空間」を表現するための特殊なドメインを作成する)
この時点でptpが指すページテーブルはAGAWによって決まるLevel分の段数をすべて割り当てるのではなく、ルートとなるページテーブル(Page Map)をただひとつだけ割り当てることである。

今回はここまで。次回は物理アドレス間のマップ(Page Table)について書こうと思う。
GitHub API v3 で既に Pull Request が存在するブランチを指定してもう一度 Pull Request を作ろうとするとどうなるのか

`422 Unprocessable Entity` レスポンスが返される。

レスポンスボディには "Validation Failed" ないし "A pull request already exists for USER:BRANCH." という内容が含まれており、同じ head:base が指定された Pull Request を複数作ることはできない。

逆に言うと、 Pull Request 作成 API は冪等なので、重複を心配せず常に POST しても構わない、とも言える。ただし、公式 API ドキュメントに記載されていないので、予告無く変更されるかもしれない。利用する場合は自己責任で。
https://developer.github.com/v3/pulls/#create-a-pull-request

```
$ curl -i -H "Authorization: token $token" -d '{"title":"pr_test","head":"pr_test","base":"master"}'　https://api.github.com/repos/kyanny/test/pulls
HTTP/1.1 422 Unprocessable Entity
Server: GitHub.com
Date: Sat, 17 May 2014 13:41:36 GMT
Content-Type: application/json; charset=utf-8
Status: 422 Unprocessable Entity
X-RateLimit-Limit: 5000
X-RateLimit-Remaining: 4993
X-RateLimit-Reset: 1400334277
X-OAuth-Scopes: repo
X-Accepted-OAuth-Scopes: 
X-GitHub-Media-Type: github.v3
X-XSS-Protection: 1; mode=block
X-Frame-Options: deny
Content-Security-Policy: default-src 'none'
Content-Length: 281
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval
Access-Control-Allow-Origin: *
X-GitHub-Request-Id: 6E86961F:522B:5CED2CE:53776710
Strict-Transport-Security: max-age=31536000
X-Content-Type-Options: nosniff

{
  "message": "Validation Failed",
  "documentation_url": "https://developer.github.com/v3/pulls/#create-a-pull-request",
  "errors": [
    {
      "resource": "PullRequest",
      "code": "custom",
      "message": "A pull request already exists for kyanny:pr_test."
    }
  ]
}
```
Gruntでjshintを使いたい場合に除外したいファイルを設定する


jshint使うのは結構便利なんだけど、たまに「このファイルはエラー出るけど解決しなくても大丈夫なのは分かってるしいい加減エラー出さないようにしてくれん？」ってなるときがある。平たく言うと黙れよ、って思う。そんな時の対処法。

## ! を使う
jshintのオプションに ignores ってのがあったからそれかと思ったんだけどイマイチちゃんと動いてくれないから多分何か別のオプションなんでしょ、知らんけど。

なのでしょうがないから ! を使って除外する。

````coffeescript
grunt.initConfig
  jshint:
    files:
      src: [
        'js_path/**/*.js'
        '!js_path/ignore_file.js'
      ]
    options:
      jshintrc: 'config/.jshintrc'
````

何かちょっとアレな気もするけどとりあえずこれでディレクトリ毎指定もできるし良いとする。
playFramework2.2.3 mysqlのつなぎ方(リンク集)

個人的メモ（てかリンク集）

前提条件
・play2.2.3インストール済み(単体で動く状態)
・Mysqlインストール済み(単体で動く状態)
・Jdbcのjarファイルを入手済み

参考サイト
ぐぬぬダイアリー
[備忘録] Play2.0 (Java) でMySQLを使うよ
http://gununu.tumblr.com/page/2
＊ほとんどコレのとおりに設定した
＊けれど、JDBCドライバの依存関係を設定する場面でproject/Build.Scalaが見つからないので調べた。

C Sharpens you up
Play! 2.1 アプリを Play! 2.2 に移行した作業の覚え書き
http://cs.hatenablog.jp/entry/2013/12/15/234618
＊コレを参考に、プロジェクト直下のbuild.sbtを編集
作業している“フリ”をできる休憩用xUnit


## はじめに
[巷で話題になってる作業しているフリの…](http://icon.jp/archives/7832)のxUnit(今回はPHPUnit)版を作りました。
ジョークアプリです。休憩用です。
指定した時間、テストを流しているフリをします。

## Demo
![ju.gif](https://qiita-image-store.s3.amazonaws.com/0/39026/94dfbe2a-0b3e-9866-3b42-c13d3915660f.gif "ju.gif")

## 使い方
`./jokeUnit.php -m [休憩時間(分)]　-s [休憩時間(数)]`
すごくテキトーです。

## ソース
```php:jokeUnit.php
#!/usr/bin/php
<?php
// オプション -m [分] -s [秒]

// オプション取得
// (オプションが何も指定されていなければデフォルト10秒
$options = getopt('m:s:');
$minutes = (is_null($options['m'])) ? 0  : $options['m'];
$sec     = (is_null($options['s'])) ? 10 : $options['s'];

// 処理秒数
$processing_sec = $sec + ($minutes * 60);
// 終了時間(unixtime)
$end_unix_time = time() + $processing_sec;
// 最大ドット数
$max_dot = $processing_sec * 2;

// 画面クリア
print("\033[2J");
print("\033[0;0H");

print("PHPUnit 4.1.0 by Sebastian Bergmann.\n\n");

// 表示したドット数
$dot = 0;
$wait_time = $processing_sec / $max_dot * 1000000;
while(time() < $end_unix_time){
    print('.');
    $dot++;
    if ($dot % 61 == 0){
        print('  '.str_pad($dot, strlen($max_dot), ' ', STR_PAD_LEFT).' / '.$max_dot.' ( '.str_pad(floor($dot/$max_dot* 100), 2, ' ', STR_PAD_LEFT).'%)'."\n");
    }
    usleep($wait_time);
}
print("\n\n");
print('Time: '.$processing_sec.' seconds, Memory: 8.00Mb'."\n");
print("\n");
print('OK ('.$max_dot.' tests, '.($max_dot + rand(1, $max_dot * 3)).' assertions)'."\n");
```
MarvericksにPython開発環境をセットアップする


# 検証環境

`OSX`
10.9.2

`Python`
2.7.5

# セットアップ

## インストール pip

```
$ sudo easy_install pip
```

## インストール virtualenv

```
$ sudo pip install virtualenv
```

## インストール virtualenvwrapper
```
$ sudo pip install virtualenvwrapper
```

### 初期設定

```
$ vi ~/.bash_profile
```


```.bash_login
source /usr/local/bin/virtualenvwrapper.sh
```

保存後、再度ターミナルを開く

### 仮想環境を作成する

```
$ mkvirtualenv test
```

仮想環境に変わるので、あとは好きにパッケージをインストールする。

```
(test)$ pip install xxxx 
```

再度ログインするとき

```
$ workon
test
```

仮想環境に切り替える

```
$ workon test
```
Rails4.1.0以降でPC，スマホ向けに自動的にページを切り替えて表示する


Ruby on Rails 4.1.0以降でパソコンでアクセスした時，スマホでアクセスした時，タブレットでアクセスした時に表示を切り替える方法が簡単になったようなのでまとめます！

ちなみに今回はiPhone，iPadからアクセスする事を想定してます．
まず，適当にRailsのアプリを作ります．今回はtryvariantというアプリ名にします．

```
$ rails new tryvariant
```

その後，コントローラを作ります．
今回はIndexコントローラとします．

```
$ rails g controller Index
```

indexコントローラに次のコードを書き込みます．

```app/controller/index_controller.rb
	before_action :detect_devise_variant  # 何でも良い?? --- (1)

	def index
	end

	private
		def detect_devise_variant  # (1)と同じ名前
			case request.user_agent
			when /iPad/
				request.variant = :tablet
			when /iPhone/
				request.variant = :mobile
			end
		end
```

あとは，スマホとタブレットに対応するビューを作成するだけです．
ただrequest.variantに設定したシンボルをファイル名に追加していくだけです．
例えば...

```
request.variant = :tablet
```
であれば，

```app/views/index/index.html+tablet.erb
index.html+tablet.erb
```
とするだけです．
:mobileの時も同じ要領です．
ちなみに，request.variantに設定されていないuser_agentが返って来たら，``index.html.erb``が表示されます．

簡単ですが，こんな感じです．
before_actionにメソッドを書いているので，同じコントローラ内の全アクションに有効になるので，簡単に切り替えが出来て便利ですね!!
PHPで標準入力

#PHPで標準入力
##1行のみの読み込み

###PHPのコード
fgets(STDIN)で標準入力を読み込める

```php:single.php
<?php  
$stdin = trim(fgets(STDIN));  
var_dump($stdin);
?>
```

###コマンドラインのコード

```bash

C:\xampp\htdocs\PhpProject1>php ./single.php
1
string(1) "1"

```
コマンドラインでphp 実行したいファイル名を押下してエンター
そうすると標準入力できるので1を入力しエンター
var_dumpで結果を表示。


##複数行の標準入力　(値を入力せずエンターを押下すると入力が終わる)
###PHPのコード

```php:multi.php
<?php  
$stdins = array();
	while(true)
	{
		$stdin = trim(fgets(STDIN));
		if ($stdin === '')
	 	{
			var_dump($stdins);
			return;
		}  
		$stdins[] = $stdin;
	}
?>
```

###コマンドラインのコード

```bash:
C:\xampp\htdocs\PhpProject1>php ./multi.php
1
2
3
テスト
5

array(5) {
  [0]=>
  string(1) "1"
  [1]=>
  string(1) "2"
  [2]=>
  string(1) "3"
  [3]=>
  string(6) "テスト"
  [4]=>
  string(1) "5"
}

```
$this->を書くのが面倒なのでメソッド内で変数展開する

PHPのメソッド内でプロパティを参照する場合、$thisを省略することができない。
`$this->` 7文字！しかも記号が二つも増えている！ 
プロパティを何度も参照する場合、タイプするのが面倒に思うし、後で読む場合もわかりにくい。

```php
<?php
class A
{
    private $b, $c, $d;

    // ...

    function doSomething()
    {
        $hoge = $this->b->doFuga($this->c, $this->d);
        //↑なんか冗長だなあ…
    }

    function doSomething2()
    {
        $b = $this->b;
        $c = $this->c;
        $d = $this->d;
        $hoge = $b->doFuga($c, $d);
        //↑こう書けばいいんだけど、これはこれで面倒…
    }
}
```

**参照のみで、書き込みをしていない場合に限るが** 、Iteratorなどを特に実装していないPlainなクラスであれば、こんな一行でサクッと展開できる。

```php
//メソッド内の冒頭にこの一行を追加！
foreach ($this as $n => $v) $$n = $v;

//追記：この書き方の方が無駄な一時変数を作らないので良い
extract(get_object_vars($this));
```

さっきの例だとこんな感じ。

```php
class A
{
    private $b, $c, $d;

    // ...

    function doSomething()
    {
        extract(get_object_vars($this));

        $hoge = $b->doFuga($c, $d);
        //↑ちょっとすっきりした
    }
}
```

PHPの変数はコピーオンライトを採用しているので、単なるコピーであればほとんどメモリは消費しないし、パフォーマンスに悪影響は与えないだろう。

[PHP: extract - Manual](http://php.net/manual/ja/function.extract.php)と同じように、引数なども上書きしてしまうので注意が必要だが、横着したい場合はそれなりに使える。
【Unity】Meshをワイヤーフレーム表示する

![001.png](https://qiita-image-store.s3.amazonaws.com/0/43772/2ff9f23f-fd59-7f1e-4a6e-9e7ffa35d0bc.png)
箱をワイヤーフレーム表示できたらカッコイイかもと思って調べてみました。

## ワイヤーフレーム表示にする
```csharp:Cube.cs
using UnityEngine;
using System.Collections;

public class Cube : MonoBehaviour {

  // Use this for initialization
  void Start () {
    MeshFilter mf = GetComponent<MeshFilter>();
    mf.mesh.SetIndices(mf.mesh.GetIndices(0),MeshTopology.LineStrip,0);
  }
}
```

MeshTopology.Lines だと微妙だったので、MeshTopology.LineStrip にしたところ、
![002.png](https://qiita-image-store.s3.amazonaws.com/0/43772/f64e1cdd-b98e-95f9-3c03-8381bc9847f2.png)
こんな感じでワイヤーフレーム表示ができました。

## 影を無効にする
ただ、このままだと影がついてしまっているので、これを無効にします。![003.png](https://qiita-image-store.s3.amazonaws.com/0/43772/01a78391-4221-ca1c-8b27-23869f269636.png)
Mesh Renderer の Material を Default-Diffuse から Sprites-Default に変更します。

さらにスクリプトでマテリアルカラーを変更します。

```csharp:Cube.cs
  MeshRenderer mr = GetComponent<MeshRenderer>();
  mr.material.color = new Color(0.4f, 0.4f, 0.9f);
```

色は青色に変更してみました。

![005.png](https://qiita-image-store.s3.amazonaws.com/0/43772/fd609e8a-f7ef-ef23-7296-cfd8793e3e7b.png)
これで完成です。
javascript - Sieve of Eratosthenes

[エラトステネスの篩](http://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9)です。100までの素数を出力します。

```javascript
const LIMIT = 100;
var flags =[];

var limit = Math.sqrt(LIMIT);
for (var i = 2; i < limit; i++) {
  if (!flags[i]) {
    for (var j = 2; i * j < LIMIT; j++) flags[i * j] = true;
  }
}

for (i = 2; i < LIMIT; i++) {
  if (!flags[i]) console.log(i);
}
```
git clone しないでブランチやタグの一覧を表示する

今日覚えた Tips のメモ代わりです。

Git のリポジトリのブランチの一覧を `git clone` しないで表示したい場合は `git ls-remote -h` コマンドが使えます。

```console
$ git ls-remote -h https://github.com/pypa/pip
68c3cc58a8d1ab8861c34725ce60846be7ccc620	refs/heads/0.5.X
0380b566f6ed67b905c8db003394fca06fdbb574	refs/heads/0.6.X
cf3497005c6fd132caf9ccf2cd3cecbc849ccb16	refs/heads/0.7.X
c6fab6ac5424b18f5cbae9a0ca1aeedfe053a36a	refs/heads/1.3.X
8d8e4e1c09acf95da6b014f44098d4439704b42f	refs/heads/1.4.X
52ffb9f9ea88596e7a7953eaf04eaed681bf19cf	refs/heads/1.5.X
8ba11ed5656f353831fdb36c3ae8b66e6fb3f858	refs/heads/develop
c02811f3d8dfdc4c02835e04ffcc87dc77fd4e84	refs/heads/feature/install-target
...
```

タグの一覧を表示したい場合は、`-h` の代わりに `-t` を指定するだけです。

```console
$ git ls-remote -t https://github.com/pypa/pip
ade11f6eebf16460a7bbe59d7f99b65ce352baf3	refs/tags/0.3
46369de381c86d838367d1030aff681916d8a687	refs/tags/0.4
44625539c248e6b562abb08c75f61082913d693a	refs/tags/0.5
2407b7426e14da75af1b716c8feff8d8fba727dc	refs/tags/0.6
506e575738a301797815c0da929b065fb46726a0	refs/tags/0.6.1
00bcd13bb545379f43ed7beb265961d20044a4be	refs/tags/0.7
edbc041e87a6c6f0d78344299821bba1bc31204b	refs/tags/0.7.1
f54e63e819917de0f0268321178d6be2b7650b49	refs/tags/0.7.2
...
```

絞り込みも可能です。

```console
$ git ls-remote -t https://www.github.com/pypa/pip 1.4\*
180986fa1b8af83dd321cedba1e01e1eef0393d7	refs/tags/1.4
c6bde0adf737684d69b404c5ce3f92729203c1b7	refs/tags/1.4^{}
158e4eb9892734c5a31d00f659ebf180643b5567	refs/tags/1.4.1
77f959a3ce9cc506efbf3a17290d387d0a6624f5	refs/tags/1.4.1^{}
dcfeb4eb94675c4cf074931b65273104ab29bf2f	refs/tags/1.4rc1
978662b08b118bbeaae5aba57c823090b1c3b3ee	refs/tags/1.4rc2
a1fa1ae8a94182389c9990fe5690269d840bda09	refs/tags/1.4rc3
98ade7af6c4291749de68983b44378cb1ef28161	refs/tags/1.4rc4
70a45c3d074391c0ccd470b2a929ffbd7145782e	refs/tags/1.4rc5
```

詳細については [git-ls-remote のマニュアル](https://raw.githubusercontent.com/git/git/master/Documentation/git-ls-remote.txt) をご覧ください。

`git ls-remote` は [GIT v1.5.4 で導入された機能](https://raw.githubusercontent.com/git/git/master/Documentation/RelNotes/1.5.4.txt)のようですので大抵の環境では使えると思います。
[memo] CLLocationManagerに登録されている ロケーション情報一覧とビーコン情報一覧を取得する

ちょっとハマったのでメモ。


```objc

CLLocationManager * locationManager = [[CLLocationManager alloc] init];

NSSet *allBeaconRegions =[locationManager rangedRegions];
NSLog(@"[beaacon] 監視中のビーコン一覧 : %@", allBeaconRegions);

NSSet *allLocationRegions =[locationManager monitoredRegions];
NSLog(@"[location] 監視中のロケーション一覧 : %@", allLocationRegions);

```
Click Modular Router でFizzBuzzを書いてみた

##前回までのあらすじ

clickを使えば、どんな(!?)ネットワークノードでも作れることが分かりました。
>[前回](http://qiita.com/amayaw9/items/3c63910ef34b1dbaa004)

##サンプルパッケージ(.click)を作成

さて、実際にパッケージを作るにはどうするのでしょうかか？サンプルパッケージがCLICKDIR/etc/samplepackageにあります。先ずは、これを実際にビルドしてみましょう。ディレクトリ構造は以下の通りです。

```
etc/samplepackage/
├── Makefile.in
├── README
├── configure.ac
├── sampleelt.cc
├── sampleelt.hh
└── test.click
```

###ビルド手順

ビルド手順を下記に示します。

```shell-session
$ cd CLICKDIR/etc/samplepackage
$ autoconf
$ sudo ./configure --prefix=CLICKDIR
$ sudo make install
$ cd CLICKDIR && sudo make elemlist
```

###動作確認

さらに、サンプルパッケージの作成が成功しているか確認。

```shell-session
$ cd CLICKDIR
$ sudo ./userlevel/click etc/samplepackage/test.click 
etc/samplepackage/test.click:3: While initializing ‘test :: SamplePackageElement’:
  Successfully linked with package!
```

##自前でパッケージ(.click)を作成

流れが分かった所で、自前のパッケージを作成。

1. パッケージ用のディレクトリを作成する

1. (.hhファイルと.ccファイルで `element`　を実装する)

1. .clickファイルを記述する

1. etc/configure.ac　をコピーして書き換える

1. etc/Makefile.in　をコピーして書き換える

1. 後は、上述のビルド手順と同じ

##FizzBuzz IP Print

ping箱(icmp エコー要求を受信すると標準出力するネットワークノード)を簡単に拡張。連続するエコー要求に対してFizzBuzzする `element` とそのパッケージを作成してみた。

###実装

`element` についてはCLICKDIR/eements/ip/ipprint.*を、パッケージファイルについてはCLICKDIR/conf/print-pings.click
を参考にして実装(ちょっと書き足しただけ)。

###実行結果

```shell-session
$ sudo ./userlevel/click fizzbuzzipprint/fizzbuzz-print-ping.click 
1400319739.238376: 192.168.0.6 > 192.168.0.2: icmp echo (38919, FIZZBUZZ)
1400319740.238418: 192.168.0.6 > 192.168.0.2: icmp echo (38919, 1)
1400319741.239264: 192.168.0.6 > 192.168.0.2: icmp echo (38919, 2)
1400319742.240362: 192.168.0.6 > 192.168.0.2: icmp echo (38919, FIZZ)
1400319743.240233: 192.168.0.6 > 192.168.0.2: icmp echo (38919, 4)
1400319744.242769: 192.168.0.6 > 192.168.0.2: icmp echo (38919, BUZZ)
1400319745.243883: 192.168.0.6 > 192.168.0.2: icmp echo (38919, FIZZ)
1400319746.245183: 192.168.0.6 > 192.168.0.2: icmp echo (38919, 7)
1400319747.246686: 192.168.0.6 > 192.168.0.2: icmp echo (38919, 8)
1400319748.247602: 192.168.0.6 > 192.168.0.2: icmp echo (38919, FIZZ)
1400319749.248823: 192.168.0.6 > 192.168.0.2: icmp echo (38919, BUZZ)
1400319750.250107: 192.168.0.6 > 192.168.0.2: icmp echo (38919, 11)
1400319751.251322: 192.168.0.6 > 192.168.0.2: icmp echo (38919, FIZZ)
1400319752.251410: 192.168.0.6 > 192.168.0.2: icmp echo (38919, 13)
1400319753.253154: 192.168.0.6 > 192.168.0.2: icmp echo (38919, 14)
1400319754.254597: 192.168.0.6 > 192.168.0.2: icmp echo (38919, FIZZBUZZ)
1400319755.255436: 192.168.0.6 > 192.168.0.2: icmp echo (38919, 16)
1400319756.256580: 192.168.0.6 > 192.168.0.2: icmp echo (38919, 17)
```

###ソースコード
[GitHub](https://github.com/amayaw9/fizzbuzzipprint)に置いてあります。

##参考
[Click Modular Router](http://www.read.cs.ucla.edu/click/faq#how-can-i-add-my-own-element-class-to-click)
VimFiler いまさら導入編


Vimを触り始めて7年程たった。

その間、ファイラーはデフォルトのnetrwを使っていたが、MacでFinderとVimの間を行き来するのが面倒になり、本格的にファイラーを導入ということで、VimFilerをいまさら導入する事にした。

# インストール

NeoBundleで簡単インストール

.vimrcに

`NeoBundle 'Shougo/vimfiler'`

を追加して、`:NeoBundleInstall`で、インストール完了。

以下、よく使うキーバインドの自分用チートシート。

# 起動

`:VimFiler`で起動。.vimrcに以下を設定しておくと、`:e .`でnetrtの変わりにVimFilerが起動します。


`" VimFilerをデフォルトのファイラにする
let g:vimfiler_as_default_explorer=1`

|キー|機能|
|:-----------|:-----------|
|o|バッファを縦分割 or ディレクトリ同期|
|O|別バッファに選択中のディレクトリの中を展開|
|gs|セーフモード on/off|
|q|VimFilerを終了|

# 移動

|キー|機能|
|:-----------|:-----------|
|Tab|バッファ切替|
|j|カーソルを下に移動|
|k|カーソルを上に移動|
|l|選択中の子ディレクトリ配下に移動|
|h|親ディレクトリに移動|
|~|ホームディレクトリに移動|
|¥|ルート・ディレクトリに移動|
|I|指定したディレクトリに移動|

# ファイル表示・ファイル操作

|キー|機能|
|:-----------|:-----------|
|.|隠しファイルの表示/非表示切替|
|Space|ファイル選択/選択解除|
|*|全ファイル選択/選択解除|
|v|プレビューを表示|
|S|表示をソート|
|Ctrl-g|ファイル名を表示|
|M|ファイルマスクを設定|
|r|リネーム|
|m|ファイル移動|
|c|ファイルコピー|
|p|ファイルをペースト|
|d|ファイルを削除|
|K|新規ディレクトリ作成|
|N|新規ファイル作成|

プレビューを実行すると小さいバッファが開いてプレビュー表示。
ファイルマスクは*.txtなどで拡張子等を指定して、表示するファイルをフィルタする。

# ファイル実行

|キー|機能|
|:-----------|:-----------|
|e|ファイルをVimで開く|
|x|ファイルをシステムの関連付けに沿って開く|


# その他

|キー|機能|
|:-----------|:-----------|
|?|キーバインド表示|
|Ctrl-l|バッファを再描画|
Click Modular Router 事始め

## Click Modular Routerとは

MIT(マサチューセッツ工科大学)が作ったソフトウェアルータで、 プロトコルを実装・評価するためのシミュレータ。`SDN` 、さらには `DPN` ができるすごいヤツ。簡易なDSLを記述することでルータやゲートウェイなど、様々なネットワークノードを実装できるので便利です。

## どのように使うの？

`element` というモジュールを組み合わせることでノードを設計・実装します。様々なモジュールが提供されています。また、ドキュメントも充実していて親切。欲しいモジュールがあればユーザ自身で `C++` を用いて実装することも可能です。

### モジュール(element)

下図に `element` を接続することで設計されたノード(CLICKDIR/conf/demo.click)を示します。薄黄色の箱の一つ一つが `element`です。
![Screenshot_from_2014-05-17 16:09:35.png](https://qiita-image-store.s3.amazonaws.com/0/27389/43079ef4-32ec-97cc-7099-1c4112db6cfa.png "GUI clickyの実行例")
`element` は其々が `C++` 実装されたクラスです。提供される仮想クラスを継承・仮想メンバ関数を実装することで `element` を作れます。

### パッケージ(.click)

ノードを記述するときにDSLを用います。`element` を宣言・接続するだけ、とても簡単。下記に.clickファイル(CLICKDIR/conf/demo.click)を示します。

```
// Suck stuff in.
PollDevice(eth7) -> c0 :: Classifier(12/0806 20/0001,
                                     12/0806 20/0002,
                                     12/0800,
                                     -);

out :: Queue(1024) -> ToDevice(eth4);

// ARP request need to be answered, obviously
c0[0]
    -> ARPResponder(7.0.0.1 00:C0:95:E1:FC:D6)
    -> out;

// ARP responses are handed to Linux
c0[1]
    -> ToHost();

// Non-IP packets are dropped
c0[3]
    -> Discard;

// Other IP packets. Split on UDP, TCP and rest
c0[2]
    -> Strip(14)
    -> CheckIPHeader()
    -> c1 :: Classifier(9/17, 9/6, -);


// TCP packets
c1[1] -> Print(TCP) -> out;

// UDP packets
c1[0]
    -> Print(UDP)
    -> udp_mon :: IPRateMonitor(DST, PACKETS, 0, 10, 30)
    -> udp_block :: Block(20)
    -> out;

// non-UDP and non-TCP packets
c1[2] -> Print(UNKNOWN) -> out;
```

## インストール手順

下記にインストール手順を示します。足りないモノが何かがあれば `configure` が教えてくれるはず。

```shell-session
$ git clone git://github.com/kohler/click.git

or

$ wget read.cs.ucla.edu/click/click-VERSION.tar.gz
$ tar czvf click-VERSION.tar.gz click


$ cd click && autoconf
$ sudo ./configure --prefix=CLICKDIR
$ sudo make
$ sudo make install
```

### 動作確認

テスト用のパッケージ `conf/test.click` を実行、"ok"が5つ出ればインストール完了。

```shell-session
$ userlevel/click conf/test.click
ok:   40 | 45000028 00000000 401177c3 01000001 02000002 13691369
ok:   40 | 45000028 00000000 401177c3 01000001 02000002 13691369
ok:   40 | 45000028 00000000 401177c3 01000001 02000002 13691369
ok:   40 | 45000028 00000000 401177c3 01000001 02000002 13691369
ok:   40 | 45000028 00000000 401177c3 01000001 02000002 13691369
```

ついでに、ping箱(icmp エコー要求を受信すると標準出力するネットワークノード)を実行。他の計算機から `ping` してみると

```shell-session
$ sudo ./userlevel/click conf/print-pings.click
1400313867.128195: 192.168.0.6 > 192.168.0.2: icmp echo (9733, 0)
1400313868.124981: 192.168.0.6 > 192.168.0.2: icmp echo (9733, 1)
1400313869.126363: 192.168.0.6 > 192.168.0.2: icmp echo (9733, 2)
1400313870.127983: 192.168.0.6 > 192.168.0.2: icmp echo (9733, 3)
1400313871.128845: 192.168.0.6 > 192.168.0.2: icmp echo (9733, 4)
1400313872.129952: 192.168.0.6 > 192.168.0.2: icmp echo (9733, 5)
1400313873.131363: 192.168.0.6 > 192.168.0.2: icmp echo (9733, 6)
1400313874.132591: 192.168.0.6 > 192.168.0.2: icmp echo (9733, 7)
```

##参考

[Click Modular Router](http://read.cs.ucla.edu/click/)
[memo]ssh_config の Host 指定でちょっとだけはまった話

github.com に対して、~/.ssh/config の設定を以下のようにしていました。

```console
Host github
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/github
```

あるとき、GitHub 上にあるリポジトリをローカルにあるリポジトリにリモートとして追加しようとしました。

```shell-session
$ git remote add origin git@github.com:mdstoy/newrepos.git
$ git remote update
Permission denied (publickey).
fatal: The remote end hung up unexpectedly
```

エラーが出ました。
あれー？と思い、既存のうまくいってるリポジトリの設定を確認してみました。

```shell-session
$ git remote -v
origin	git@github:mdstoy/oldrepos.git (fetch)
origin	git@github:mdstoy/oldrepos.git (push)
```

あー、.com がついてない・・・。
そうか、`Host github` って設定したら、`github` というエイリアスに対しては有効になるけど、`github.com` という名前に対して有効になるわけじゃないのか。（考えれば当たり前ですが・・・）

絶対また忘れたころに同じ事をやりそうなので、Qiita に書き記すとともに `github` に加えて `github.com` も設定に書き加えたのでした。

```console
Host github github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/github
```
テスト用にPHPで簡単なTCPサーバを書いた


```php:server.php
<?php

class TestTCPServer
{
    public $sock = NULL;

    public function __construct($addr = "127.0.0.1", $port = 5000)
    {
        $sock = $this->newSocket($addr, $port);
        $this->sock = $sock;
    }

    public function newSocket($addr, $port)
    {
        if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
            throw new \Exception("socket_create() failed: ".socket_strerror(socket_last_error()));
        }

        if ((socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1)) === false) {
            throw new \Exception("socket_set_option() failed: ".socket_strerror(socket_last_error()));
        }

        if ((socket_bind($sock, $addr, $port)) === false) {
            throw new \Exception("socket_bind() failed: ".socket_strerror(socket_last_error($sock)));
        }

        if (socket_listen($sock) === false) {
            throw new \Exception("socket_listen() failed: ".socket_strerror(socket_last_error($sock)));
        }

        return $sock;
    }

    public function run(Closure $code)
    {
        while ($remote = socket_accept($this->sock)) {
            while ($line = socket_read($remote, 1024)) {
                $code($remote, $line, $this->sock);
            }
        }
    }
}
```

データを受信した後の処理は、コールバックで書くようにしている。
echoサーバを書く場合は、以下のようになる。

```echo_server.php
<?php

require_once 'server.php';

$server = new TestTCPServer();
$server->run(function($remote, $line, $sock) {
    socket_write($remote, $line);
});
```

実行するとブロックするので、
バックグランドで実行しつつ、以下のように動作確認できる。

```shell
$ telnet 127.0.0.1 5000
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
test message
test message
```


クライアント側もPHPで書くとしたら、以下のようになる。

```echo_client.php
<?php

if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
    die("socket_create() failed: ".socket_strerror(socket_last_error()));
}

if (socket_connect($sock, '127.0.0.1', 5000) === false) {
    die("socket_connect() failed: ".socket_strerror(socket_last_error()));
}

$buf = "foo\n";
socket_write($sock, $buf, strlen($buf));
echo socket_read($sock, strlen($buf));

$buf = "bar\n";
socket_write($sock, $buf, strlen($buf));
echo socket_read($sock, strlen($buf));

socket_close($sock);
```



# 参考

http://www.php.net/manual/ja/ref.sockets.php
RubyMine で Rails+RSpec を使う時のヒント (teamcity/formatter関連のエラー解決)

私の環境固有かもしれないのですが、RubyMine で RSpec を使おうとすると、こんなエラーが出ることがあります。

~~~ruby
..../gems/activesupport-4.1.0/lib/active_support/dependencies.rb:247:in `require': cannot load such file -- teamcity/spec/runner/formatter/teamcity/formatter (LoadError)
~~~

これは、一部の Gem が、RubyMine のアプリケーションパッケージファイル(RubyMine.appの中)にあって、それを見付けられていないせいです。

実行時に Gem の検索パス ( `$:` ) がそこを通っていれば良いのですが、rspec 実行する時に `-I`オプションで与えるようにするなどしても、どうも、うまくいきません。

しかたないので、以下の方法で対処しています。

## 環境変数の設定

環境変数 `MY_RUBYMINE_HOME` が RubyMineの app パッケージファイルを指すように設定します。OS X の環境で設定してもよいし、それが嫌ならRubyMineの中で、ツールの実行環境毎に設定できるので、それを用います。

メニューの Run → Edit Configuration から、設定を呼び出します。

RSpecのデフォルト設定、あるいは、既に作られているRSpecの実行環境を選び、
環境変数の追加設定ができるので、`MY_RUBYMINE_HOME` に `/Applications/RubyMine.app` と設定します。

以前は`RUBYMINE_HOME`という環境変数がセットされていたはずで、これを用いれば良かったと思うのですが、6.x では、どうもそうではなさそうなので、こうします。

## rspec binstub の変更

Rails のプロジェクトルートディレクトリの `bin` ディレクトリの下、`bin/rspec` の頭に、以下のように追加します

~~~ruby
#!/usr/bin/env ruby

if ENV["MY_RUBYMINE_HOME"]
  $:.unshift(File.expand_path("rb/testing/patch/common", ENV["MY_RUBYMINE_HOME"]))
  $:.unshift(File.expand_path("rb/testing/patch/bdd", ENV["MY_RUBYMINE_HOME"]))
end
~~~

これで、Rubymineの中からエラー起こさずに実行できるはずです。
PHPでFizzBuzz最短56バイト

http://golf.shinh.org/p.rb?FizzBuzz#PHP
PHPのFizzBuzzで最短56バイトを投稿、9位になりました。(NurseAngel = rana_kualu)

以下を読み進める前に、とりあえず前提知識
・php変態文法最速マスター
　http://d.hatena.ne.jp/milieu/20100203
・可変変数
　http://www.php.net/manual/ja/language.variables.variable.php
・文字列のビット演算
　http://perl-users.jp/articles/advent-calendar/2010/sym/2
を見といてください。


PHPでは現状[56バイト](http://golf.shinh.org/p.rb?FizzBuzz#PHP)が最高記録ですが、何故か何処にも公開されていません。

公開されているものでは59バイトが最短のようです。
http://d.hatena.ne.jp/milieu/20100204/1265305089
http://oflow.me/archives/110
http://d.hatena.ne.jp/ts_asano/20130320/1363791538
よく見たら最後のは改行ではなくスペースになってるので間違ってるな。

私はずっと58バイトで詰まっていたのですが、このたびようやく56バイトに成功しました。


まず公開されている[59バイト](http://d.hatena.ne.jp/milieu/20100204/1265305089)のから始めてみます。

60バイトまでは、普通に三項演算子とかをいじっていれば減らせます。
そこから"\n"を直接LFにすると1バイト減って59バイトになります。
そこからちょっとだけいじってみます。

```php
<?for(;$i++<100;)echo$i%3?$i%5?$i:"":Fizz,$i%5?"":Buzz,~ ;
```

~の後ろの空白は普通の文字ではないのでたぶん正しくアップできてませんが、[chr(245)](http://php.net/manual/ja/function.chr.php)です。
この文字を~でビット反転するとASCIIコード10、つまりLFになるので『~ 』は『"\n"』と同じ意味です。
直接LFを書くよりさらに1バイト減らすことができ、該当部分を差し替えるだけで58バイトになります。

しかしこっちはこれで行き止まりです。
56バイトはこんなかんじ。

```php
<?while($i++<100)echo$i%3?!$$i=$i:Fizz,$i%5?$$i:Buzz,~ ;
<?for(;$i++<100;)echo$i%3?!$$i=$i:Fizz,$i%5?$$i:Buzz,~ ;
```

とりあえずコードをわかりやすく分解。

```php
<?php
	while($i++<100){
		// $iが3の倍数であれば「Fizz」を表示、倍数でなければ「!$$i=$i」を表示
		echo $i%3 ? !$$i=$i : 'Fizz';
		// $iが5の倍数であれば「Buzz」を表示、倍数でなければ「$$i」を表示
		echo $i%5 ? $$i : 'Buzz';
		// 改行
		echo ~ ;
	}
```

「`!$$i=$i`」ってなんだよ。

まず1行目。
3の倍数だった場合は単にFizzを表示して終わりです。
3の倍数でなかった場合、`$$i=$i`で、`$$i`に`$i`を代入しています。
例として`$i=4`だった場合、`$$i = ${4} = 4`、つまり`${4}`という変数に4が代入されます。
これはただの代入なので、「`$$i=$i`」全体の値は`$i`になります。
ところで数値を!するとfalseになります。
結果として「`!$$i=$i`」全体の値はfalseとなり、echoでは何も表示されません。

1行目のまとめは、
・`$i`が3の倍数であれば「Fizz」を表示する。
・`$i`が3の倍数でなければ`${$i}`に`$i`を代入する。何も表示しない。
です。

次に2行目ですが、
・`$i`が5の倍数であれば「Buzz」を表示する。
・`$i`が5の倍数でなければ`${$i}`を表示する。
です。

5の倍数であれば単にBuzzを表示して終了なので問題ありません。
5の倍数ではない時を見てみましょう。

`${$i}`は、`$i`が3の倍数でないときは1行目によって`$i`が代入されているので、結果として`$i`が表示されます。
`$i`が3の倍数だった場合、`${$i}`は未定義なのでNULLとなり、結果としてなにも表示されません。
例として`$i=4`の場合、1行目により`$$i = ${4} = 4`が代入されていたので4となります。
`$i=6`だった場合、`$$i = ${6}`は何も代入されていないのでNULLです。

以上をまとめると、
・`$i`が15の倍数である場合、1行目でFizzが表示され、2行目でBuzzが表示される
・`$i`が3の倍数であり5の倍数ではない場合、1行目でFizzが表示され、2行目で`$$i=NULL`なので何も表示されない
・`$i`が3の倍数ではなく5の倍数である場合、1行目で`$$i=$i`が実行され、2行目でBuzzが表示される
・`$i`が3の倍数でも5の倍数でもない場合、1行目で`$$i=$i`が実行され、2行目で`$$i=$i`が表示される

となりFizzBuzzの定義を満たしました。
めでたし。

ということで次は55バイトなわけですが、さすがに世界中誰も成功してないから無理かな？
Rails以外でjquery-ujsを使う（ajax編）

# あらすじ

jquery-ujsとはRuby on RailsについてくるJavaScriptのライブラリ。エレメントのdata-*属性にいろいろ書くだけでいろいろしてくれる。

詳しくはこちらから
[JavaScript - Rails以外でjquery-ujsを使う(アンカークリック時にPOSTやDELETEする方法など) - Qiita](http://qiita.com/iakio/items/3f5e7f120bd54aea8d85)

# formをajaxで送信

formエレメントに`data-remote`属性を付ける。

```html
<form action="ajax.php" method="get" data-remote>
<input type="text" name="name" value="aaa">
<input type="submit" value="submit" data-disable-with="loading...">
</form>
```

フォームの入力内容がajax.phpにPOSTされる。応答が返るまでの間、submitボタンは無効となり、ボタンのテキストが"submit"から"loading..."に変わる。

ajaxのイベントは、`data-remote`を付けたエレメントのajaxイベントとして受け取る。

```html
<script>
$("form")
    .on('ajax:success', function (data, status, xhr) {
        console.log(data, status, xhr);
    })
    .on('ajax:complete', function (xhr, status) {
        console.log(xhr, status);
    })
    .on('ajax:error', function (xhr, status, error) {
        console.log(xhr, status, error);
    })
</script>
```

その他`ajax:(before|beforeSend|send|abort:required|abort:file)などのイベントがある。詳しくはこちらから

[ajax · rails/jquery-ujs Wiki](https://github.com/rails/jquery-ujs/wiki/ajax)

# form以外でajax

* select, input, textareaエレメントのchangeイベント
* a, buttonエレメントのclickイベント

などでもajaxを実行できる。この場合は`data-method`、`data-url`(aタグの場合は不要)を指定する。`data-params`で追加のパラメータを指定できる。

```html
<input type="text" name="name" data-remote
 data-url="ajax.php"
 data-method="post"
 data-params="foo=bar"
>
<a href="ajax.php" data-remote>link</a>
```

# その他

* `data-type``$.ajax()`のdataType
* `data-cross-domain` `$.ajax()`のcrossDomain
* `data-with-credentials`  xhrFields: {withCredentials: true}