OmniAICreator/Qiita-1.07M huggingface dataset:
const関数でコンテナを扱う場合の注意【個人用備忘録】

const関数でメンバ関数のコンテナ関数を扱うとき、そのままでは扱うことができない。
例えば

```cpp
class hoge {
  public:
     std::string GetValue(int key) const;
  private:
     std::map<int, std::string> keyvaluemap;
};

std::string hoge::GetValue(int key) const {
  return keyvaluemap[key];
}
```

上記のソースコードは、GetValue関数内でコンパイルエラーが発生する。
どうもコンテナは[]でアクセスすると格納されている値のコピーを作成するらしい。
下記のようにソースコードを書き換えると回避できるようだ。

```cpp
std::string hoge::GetValue(int key) const {
  std::map<int, std::string>::const_iterator itr;
  itr = keyvaluemap.find(key);
  return itr->second;
}
```

***
10/10追加
上記のようなめんどくさい方法を取らなくても、以下の方法で取得できるようだ。

```cpp
std::string hoge::GetValue(int key) const {
  return keyvaluemap.at(key);
}
```
ログイン時に自動起動するMacアプリを作成する

> [kainjow/NSAppLoginItems](https://github.com/kainjow/NSAppLoginItems)

を使うと、以下のメソッドが使えるようになる

- `[NSApp addToLoginItems];`
- `[NSApp removeFromLoginItems];`
- `[NSApp isInLoginItems];`


なにこれ便利！
tmlib-rpg ウィンドウクラスの作成

まずは、ウィンドウクラス
参考にするのは、やっぱりRGSSかな～と思うので、ウィンドウスキン素材を入れ替えれるようにするのがまず必要。

tmlib でイメージを表示して、ウィンドウを作成する。
ってことで、こんな感じ。
![ss20131007a.png](https://qiita-image-store.s3.amazonaws.com/0/30417/3001a4c3-c2cc-1ab9-752d-27b6901979f8.png)

ローカル環境なので、VX Ace のウィンドウ素材をそのままつかってます。

```coffeescript:MainScene.coffee
tm.define "MainScene",
	superClass: "tm.app.Scene"
	init: ->
		# 親の初期化
		@superInit()

		window1 = rpg.Window(50, 50, 200, 200)
		window1.drawText("はろ～!",0,0)
		@addChild(window1)
```

tmlib.js を触り始めたけど、なかなか良い感じ？
いろいろ用意されてるし、RGSSで必要になりそうな Map 関連もあるみたい。
これは大きい、あれを再実装するのは疲れるし…

ウィンドウスキンでもやったけどレイヤーも対応できそう。
tmlib-rpg 環境準備

tmlib.js のプロジェクトを見つつ参考に…

node.js と npm を、もちろん使って、grunt でビルドタスクとか
サーバサイドは、とりあえず、expressjs
ついでに、coffee script でやってみることに

リポジトリは、github にしようと思うけど、まだぜんぜんなのでもうちょっと形が見えてから？
特に名前がこまる～

tmlib-rpg はさすがに大きすぎるとか思いつつ、悩み中。

gruntjs も初めてつかってるけどなかなか便利

```
grunt server
```

で、expressjs のテストサーバを起動できるので、そのまま tmlib.js を実行して確認できるようにしてみた。
watch タスクも入ってるので、coffee スクリプトを直してからそのまますぐに動作確認を～って感じ。

便利だわ。
定番のhoverで背景画像とテキスト色変更の処理をCoffee script で書く

結構忘れる Coffee script での hover 処理。

こんなんなる。

```coffeescript
$ ->
  $("#foo").hover(
   ->
    $(@).css("background-image", "url('01.png')")
    $(@).css("color", "#fff")
   ->
    $(@).css("background-image", "url('02.png')")
    $(@).css("color", "#000")
  )
```

## 参考

coffeescript - Translate this jquery into coffee script? - Stack Overflow
http://stackoverflow.com/questions/10969788/translate-this-jquery-into-coffee-script
tmlib-rpg

tmlib.js でRPGをつくろうかな～と思ってQiitaでメモをとることに。

RPG JS もあるけど、スマホアプリにする場合にも tmlib.js でつくっておけば楽にいけそうかな？とかとか
やっぱり作るのが楽しいしネタ的に。
第14回 オフラインリアルタイムどう書く参考問題解答(Ruby)

問題：http://nabetani.sakura.ne.jp/hena/ord14crosscircle/
解答例：http://qiita.com/Nabetani/items/66806c9dc14a96f2fd42

```rb
def count f, b
  cnt = 0
  f.chars do |ff|
    b.chars do |bb|
      cnt+=1 if	ff==bb
    end
  end
  cnt
end

def calc src
  dst =	0
  src.size.times do |i|
    (i+1..src.size).each do |j|
      dst += count src[i+1,	j-i-1] , src[j+1,	src.size-j-1] + src[0, i] if src[i]==src[j]
    end
  end
  dst/2
end


DATA.each do |data|
  n, s,	r = data.split
  d = calc s
  puts "ng:#{n}	 #{d} != #{r}" unless d==r.to_i
end

__END__
0       aabbca1bcb      14
1       111ZZZ          0
2       v               0
3       ww              0
```
osxでmailtoリンクをクリックした時にでGmailのウェブUIを開く

最近は連絡先にfacebookとかtwitterアカウントが置かれてることが多いので mailto リンクなんてクリックすることも滅多になかったんですが、バドミントンのサークルを探したら10年前から時が止まったようなサイトが沢山出てきて mailto 全盛期が垣間見えて栄枯盛衰を感じられます。

## やり方

Gmail をデフォルトのメール アプリケーションにするにはどうしたらよいですか。 - Gmail ヘルプ
https://support.google.com/mail/answer/10966?hl=ja

に書いてる。要はブラウザじゃなくて、常駐のアプリによってデフォルトのメーラーとしてGmailを使うように指定する方法を取ることになる。何でブラウザないで完結させられへんかはよくわからん。

ちなみにWindowsならChromeの設定だけでいけるっぽい。
WIndowsでsymlinkみたいなものを作る方法

よく忘れるので

`mklink /j "target_directory" "source_directory"`

でディレクトリにSymlinkみたいなものができる。(ジャンクションと呼ぶらしい。機能の違いはよく知らないけど同じような動作するっぽい)

気をつけるのは ln コマンドとターゲットとソースの順番が逆な点。
CompassとかCoffee Scriptのファイル変更監視のためのタブを一つで済ます方法

scss(compass)とcoffee scriptを使い始めて「な、なんじゃ、この便利なものはーーーー！！！」と味王さんみたいなリアクションをしていたのですが、人間怖いもので慣れてくるとどんなに素晴らしいものでも文句をつけたくなってくるものです。

んで、compassやcoffeeの困った所は watch するためにそれぞれにターミナルのタブを開いとかないと行けない所。まあ CodeKitとかそういうの使えば良いらしいんですが有料だし、ニートの自分は少しでもお金を節約したい。「お金はあるけど、時間はない。」タイプの人は素晴らしいソフトがもっと増えるためにどんどんこういうソフトを買えばいいと思います。

## 対策

バックグラウンドで動かせばOKだということに気づきました。つまり

```
$ compass watch &
$ coffee -o js -cw coffee &
```

としておくと scss と coffee のフォルダが両方監視されてて変更された方のメッセージを表示してくれるようになります。素晴らしい！

`&` の意味を知りたい人は `jobs` とか `fg` とか `bg` で調べれば幸せになります。もしくはLPICとか受けるといい。

## もっとだらけるために

```bash:~/.bashrc
watch () {
  compass watch &
  coffee -o js -cw coffee &
}
```

とか書いておくとファイルがあるディレクトリに移動して `watch` と打つだけで監視ができるようになります。
Backbone.jsをモジュール化するライブラリを公開しました

　[Backbone.Module]( https://github.com/hagiwaratakayuki/backbone-module)というライブラリを公開しました。
　
##これは何？

　Backbone.jsの各クラスを必要な機能ごとにモジュール化して再利用できるライブラリです。　jQueryのプラグイン感覚で必要な機能のモジュールをつなぎ合わせて開発できるようになります。
　基本的にはBackbone.jsでイベントがextendできない問題を解消して再利用性を高めたものです。ただし、そのままだとjavascriptの仕様上スーパークラスのメソッドをラップする形の拡張がやりづらいのと、モジュールがグローバルな名前空間を汚染する問題があるので、そこをサポートする機能を追加してあります。

##使い方

　Backbone.jsのセットを一揃い、そして最後にBackbone.ModuleのファイルをHTMLにリンクします。

```html
    <script src="js/jquery.min.js" type="text/javascript"></script>
    <script src="js/underscore.js" type="text/javascript"></script>
    <script src="js/backbone.js" type="text/javascript"></script>
    <script src="js/backbone.module.js" type="text/javascript"></script>
```

　次にモジュールを登録します.

```js
    Backbone.Module.regist('my.cool.module',//モジュール名.
    {
    	events:{
		"click":"onClick"	
	},
	onClick:function(event,next){
		if(next){//スーパークラスに同じメソッドがあれば、引数の最後に追加されます.
			next.call(this,event);
		}
		window.alert('click');
	}
    
    })
```

　登録したモジュールを拡張して登録したいときは次のようにします

```js
        Backbone.Module.registWrap('my.cool.module.extend',//モジュール名
            'my.cool.module',//拡張したいモジュール。登録済みのモジュール、またはオブジェクト(複数指定可能)
            {
                events:{
                     "mouseover":"onMouseover"	
                },
                onClick:function(event,next){
                         next.call(this,event);//my.cool.moduleのonClick
                         window.alert('extend!');
                 },
                 onMouseover:function(event,next){
                      if(next){
                           next.call(this,event);
                       }
                       window.alert('mouseover');
                  }
             });

```

　利用するときには、Backbone.jsの基本クラスをモジュールで拡張します。Viewを拡張したいのならば　　

```js
    var view = Backbone.Module.extendView('my.cool.module.extend',//拡張したいモジュール名（複数指定可）
                                    {
                                                el:"#test" 
                                     }
                     );
    
    $(function(){
    	 new view();
    });
```

##Todoとか

　モジュールとテストがほとんどないので、追加する必要があります。
Unityで半透明オブジェクトのシルエットを際立たせる方法


またもWikiBookのUnityチュートリアルからです。
ほぼ翻訳もの。記事はこちら「[GLSL Programming/Unity/Silhouette Enhancement](http://en.wikibooks.org/wiki/GLSL_Programming/Unity/Silhouette_Enhancement)」

実際に適用してみると以下の感じになります。

![Silhouette.jpg](https://qiita-image-store.s3.amazonaws.com/0/5616/ddd40168-98b5-ce05-d786-908669a1cf01.jpeg "Silhouette.jpg")

シェーダソースは以下。

```glsl
Shader "Custom/Silhouette" {
	Properties {
		_Color ("Color", Color) = (1, 1, 1, 0.5)
	}
	SubShader {
		Tags { "Queue" = "Transparent" }
		Pass {
			ZWrite Off
			Blend SrcAlpha OneMinusSrcAlpha //標準的なアルファブレンディング
			
			GLSLPROGRAM
			
			//シェーダ用にシェーダプロパティを定義
			uniform vec4 _Color;
			
			//ワールド座標系のカメラの位置
			uniform vec3 _WorldSpaceCameraPos;

			//Model matrix
			uniform mat4 _Object2World;

			//Model matrixの逆行列
			uniform mat4 _World2Object;
			
			//正規化された表面の法線ベクトル
			varying vec3 varyingNormalDirection;
			
			//正規化されたビュー方向ベクトル
			varying vec3 varyingViewDirection;
			
			#ifdef VERTEX
			
			void main()
			{
				//unity_Scale.wの乗算は不要です。
				//なぜならベクトルを正規化するためです。
				mat4 modelMatrix = _Object2World;
				mat4 modelMatrixInverse = _World2Object;
				
				varyingNormalDirection = normalize(vec3(vec4(gl_Normal, 0.0) * modelMatrixInverse));
				varyingViewDirection = normalize(_WorldSpaceCameraPos - vec3(modelMatrix * gl_Vertex));
				
				gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
			}
			
			#endif
			
			#ifdef FRAGMENT
			
			void main()
			{
				vec3 normalDirection = normalize(varyingNormalDirection);
				vec3 viewDirection = normalize(varyingViewDirection);
				
				float newOpacity = min(1.0, _Color.a / abs(dot(viewDirection, normalDirection)));
				
				gl_FragColor = vec4(_Color.rgb, newOpacity);
			}
			
			#endif
			
			ENDGLSL
		}
	} 
}
```

ここで行っていることの概要を説明すると、そもそも、半透明のものを実際に見てみると輪郭部分が一番不透明になり、結果輪郭がしっかりします。
それを計算によって表現しよう、というのがこの内容です。

具体的には、表面（surface）の法線方向と視点方向の内積を取り、その結果を元に透明度を変化させる、というものです。

まず、各頂点をワールド座標変換してワールド座標系に置き、視点ベクトルとの差分から頂点→視点のベクトルを算出します。
（`normalize(_WorldSpaceCameraPos - vec3(modelMatrix * gl_Vertex))`の部分）

![vector-sample.png](https://qiita-image-store.s3.amazonaws.com/0/5616/2875c705-89df-c65f-32d0-4cf95e5d96f5.png "vector-sample.png")

これで、各頂点に置ける視点方向へのベクトルが得られました。

次に求めるのは法線のワールド座標系での方向です。
法線のワールド座標系への変換行列は、通常のモデルの変換行列の逆転置行列になるので、`_Object2World`ではなく、`_World2Object`行列を使います。
（詳細についてはこちらの記事が参考になります→[法線の変換の話](http://d.hatena.ne.jp/h013/20130325/1364229762)）
よって、`normalize(vec3(vec4(gl_Normal, 0.0) * modelMatrixInverse));`を計算すれば求まります。

上記2点をvarying変数からフラグメントシェーダに送ります。
あとはこのふたつのベクトルを利用して、輪郭部分に近づくほど透明度が下がるよう計算してやれば終わりです。
具体的なコードは

```glsl
float newOpacity = min(1.0, _Color.a / abs(dot(viewDirection, normalDirection)));
```
の部分ですね。

`abs(dot(viewDirection, normalDirection))`の部分で視点方向のベクトルと法線ベクトルの内積（dot）を計算し、さらにその絶対値を取ります。
絶対値にする理由は、求めたいものがふたつのベクトルがどれだけ直行しているか、という点のためです。（内積の結果は直行していると0になる。つまり、0に近づくほど視点方向ベクトルと直行するようになり、つまり輪郭に近づいていく、ということです）

さらにそれで求まった数値で、設定しているカラーのアルファ値を割ることで、逆に視点方向に向いている法線ベクトルの位置を透明に、輪郭に近づくに連れて不透明になっていく、というのを実現しています。
PHPにもオブジェクトとして扱えるprimitiveな型が欲しかったんだ…

PHPは元がテンプレートエンジンだった歴史がある。
そのせいかは分からないけど、いろんな人に酷いことを言われたりもする。
それでも、最近は流行りを何とか取り入れて`modern php`なんて単語が出てくるぐらいに言語仕様は強化された。

しかし、それでも始まりが始まりだっただけに超えられない壁があるのです。
僕はPHPのprimitiveな型をオブジェクトとして扱いたかったんだが、どうにもそれが出来ないんだ…

## 他の言語はどうなの？

### rubyなら全てがオブジェクトだから次のように書くことが出来る。

```rb
s = 'hoge'
s.gsub('hoge', 'fuga') # 'fuga'
```

文字列を代入したらそれがオブジェクトになるから（というか文字列自体がオブジェクトなので変数にオブジェクトを参照渡ししたことになる）、代入したオブジェクトからメソッドをコールすることが出来る。

### javascriptは暗黙の型変換が効くので次のように書ける。

```js
var s = 'hoge';
s.replace('hoge', 'fuga'); // 'fuga'
```

javascriptのstringはオブジェクトではないけどjavascriptはStringクラスを持っていて、
stringを代入した変数からメソッドをコールしようとすると内部的にStringクラスオブジェクトに自動変換してくれる。
色々酷いと言われているけど（実際に理解していないと大変なことがたくさんあるけど）、javascriptのこういうところは好きだ。

ちなみに暗黙の型変換を効かせない場合は次のように書く。

```js
var s = new String('hoge');
```

### しかしPHPは次のように書けない、悲しい…

```php
$s = 'hoge';
$s->replace('hoge', 'fuga'); // PHP Fatal error:  Call to a member function replace()
```

当たり前といえば当たり前なんだけど、PHPのStringはオブジェクトではないし、
オブジェクトに型変換してくれる機能も無い。というか、Stringクラスが無い。

色々と酷いこと言いたくなる人の気持ちも分からなくもない。
（色々とおっしゃる方々はもっといろんな角度からおっしゃっているとは思いますが；）

## PHPにはStringクラスが無いので作ってみた
すごくシンプルに書いてみた。

```php
<?php
class String
{
	protected $val;

	public function __construct($val='')
	{
		if (!is_string($val)) {
			throw new StringTypeException('Error: argument should be string.');
		}
		$this->val = $val;
	}

	public function set($val)
	{
		if (!is_string($val)) {
			throw new StringTypeException('Error: argument should be string.');
		}
		$this->val = $val;

		return $this;
	}

	public function get()
	{
		return $this->val;
	}

	public function replace($search, $replace)
	{
		return str_replace($search, $replace, $this->val);
	}
}

class StringTypeException extends Exception {}
```

他の言語みたいに綺麗には使えなくて、値を取得するにはアクセサを通す必要があるけど、
これで以下のように書けるようになった。

```php
// コンストラクタでセットする
$s1 = new String('hoge');
$s1->replace('hoge', 'fuga'); // 'fuga'

// アクセサからセットする
$s2 = new String();
$s2->set('hoge')->replace('hoge', 'fuga'); // 'fuga'
```

Stringはオブジェクトなのでタイプヒントにも指定出来る。

```php
$s = new String('hoge');

function fuga(String $s) {
  // some proc
}
```

### 実用性は？
他にもIntクラスとかArrayクラスとか作りこめば色々と気持ちが晴れそう。
でも、何かしらの値を作るたびにインスタンスを生成するわけだからすごくコストがかかると思う。
実用性は無いよね。

## まとめ
遊びで作るにしても、何かしらの言語の型システムはハックしておかないと綺麗には作れないなと思った。
Frank-Cucumberをpryから叩いてみた

Frank-Cucumberを使ってiOSアプリへアクセスするまとめ。

* Cucumber-driverを **使わずに** `pry`や`rspec`から叩くことを狙います。
* `frank console`も使わないようにします。
* Frank-Cucumner 1.1.12 を対象にしています。

# まとめ

以下で一通り叩けるようになります。

```rb
require 'frank-cucumber/cli'
require 'frank-cucumber/rect'

include Frank::Cucumber::FrankHelper
Frank::Cucumber::FrankHelper.use_shelley_from_now_on
```

1. アクセスしたいViewをShelly selectorで選択して
2. FrankHelperにメソッドがあれば、それを使う。
3. 無ければ `frankly_map(<セレクタ>, <ObjCメソッド名>, パラメータ, ...)` を呼ぶ。

----

# 接続

* 参考:`/usr/local/bin/frank`

```rb
$ pry -r frank-cucumber/cli
pry> include Frank::Cucumber::FrankHelper
=> Object
pry> frankly_dump
{
  "frame": { ... }
}
```
(JSONが表示される)

## frankly_dumpの中身

* 参考:`Frank::Console#frankly_dump`

```rb
pry> j=frank_server.send_get('dump');nil
pry> JSON.parse(j)
{"frame"=>{...}}
```
(Hashオブジェクトを得ることができる)

# 各種操作
## touch

* 参考:`Frank::CLI#console`

```rb
pry> Frank::Cucumber::FrankHelper.use_shelley_from_now_on
pry> sel="view:'UIRoundedRectButton' marked:'connect'"
pry> touch(sel)
```

## キーボード入力

* 参考:`Frank::Cucumber#KeyboardHelper`

```rb
pry> sel="view:'UITextFIeldLabel' marked:'192.168.1.1'"
pry> fill_in '192.168.1.1', {:with=>"127.0.0.1", :append_return=>true}
```

又は

```rb
pry> touch(sel)
pry> type_into_keyboard("127.0.0.1", :append_return=>true)
```

## ドラッグ

任意の点から任意の点へのドラッグは未対応(らしい)が、「特定ののViewの中央から任意の位値」へのドラッグは可能。

```rb
# GLKView中央から上へ5pxの場所へ
pry> require 'frank-cucumber/rect'
pry> sel = "view:'GLKView' index:0"
pry> f = accessibility_frame(sel)
pry> f.center
=> #<OpenStruct x=160.0, y=250.0>
pry> frankly_map(sel, 'FEX_dragWithInitialDelayToX:y:', 160, 255)
```

## pickerの選択

FrankHelperには無いがiOS-APIを叩けばできる。

* 例: 0番目のUIPickerViewの、0番目の項目の2番目の要素を選択

```rb
pry> frankly_map "view:'UIPickerView' index:0", \
 'selectRow:inComponent:animated:', 3-1, 0, false
```

元のAPIは `UIPickerView` の

```objc
-(void)selectRow:(NSInteger)row
     inComponent:(NSInteger)component
        animated:(BOOL)animated
```


# 要素の確認
## エレメントの存在の確認

* 参考:`FrankHelper#check_element_exists`

```rb
pry> element_exists "view:'GLKView'"
#=> true
```

Arrayでない点に注意

## hidden属性の確認

* 参考:`FrankHelper#check_element_exists_and_is_visible`

```rb
pry> element_is_not_hidden "view:'GLKView'"
#=> true
```

Arrayでない点に注意

## enabled属性の確認

標準では未対応だが組み合わせで。

```rb
def element_is_enabled( sel )
  return false unless
         element_is_not_hidden(sel)
  matches = frankly_map(sel, 'isEnabled')
  matches.delete(false)
  !matches.empty?
end
pry> element_is_enabled "view:'UIRoundedRectButton' marked:'exec'"
#=> true 
```


## 表示されていることの確認

ボタンなら `touch` が一番簡単。
表示されていない場合は `RuntimeError` になる。


hidden属性を得るには

```rb
pry> frank_map sel, 'FEX_isVisible'
#=> Array<Boolean>
```

# スクリーンキャプチャ

## フルスクリーンキャプチャ

* 参考:`ImageCaptureRoute#handleRequestForPath:withConnection:`

```rb
pry> frankly_screenshot "fullscreen.png"
#=> ファイルに保存される
```

## 部分キャプチャ

```rb
pry> frankly_screenshot "rect.png","0.0.100.200"
#=> (0,0)からwidth=100, height=200。
```
ピリオド区切り。
カンマで区切るとiOSアプリが落ちる。


## 指定のViewのキャプチャ

1.1.12では未実装。
ある文字列を特定のEncodingで指定バイト数に収まる長さで切り出す


こんな感じ？
もっと楽な方法ないかな？

```ruby:truncate_with_encoding.rb
  def truncate_with_encoding(string, target_encoding, max_byte)
    original_encoding = string.encoding

    encoded_string = string.encode(target_encoding)
    result = ""
    encoded_string.each_char {|c|
      total_bytes = result.bytesize + c.bytesize
      result << c if total_bytes <= max_byte
    }

    result.encode(original_encoding)
  end
```

実行結果

```
truncate_with_encoding("abcあいう", Encoding::SJIS, 6)
# => "abcあ"
```
第14回オフラインリアルタイムどう書くの参考問題 in python

書いてみました。正直に言ってオフラインじゃないんですが(汗

```py:sleeping_monsters.py
def parse(str):
    # count each letters
    return map(lambda x:ord(x) - ord('a'), list(str.lower()))

def test(in_str, answer):
    max = len("aBcDeFgHiJkL")-1
    xs = [parse(in_str).count(i) for i in range(max+1)]
    killed = 0
    idx = 0

    while idx < max:
        if xs[idx] != 0: # i got a weapon
            for monster in range(idx+1, max+1, 2) + range(1, idx, 2):
                if xs[monster] == 0:   # no monster here
                    break
                killed += xs[monster]  # found! kill monsters!
                xs[monster] = 0
                idx += 2
        idx += 2

    if killed != int(answer):
        print "failed! " + in_str + " expect: " + answer + " got: " + str(killed)
        exit()

test( "gLDLBgBgHDaD", "6" );
```
CapybaraでDELETEリクエストを送る法法


[Capybara](https://github.com/jnicklas/capybara)でログアウト処理を書くためにどうすればいいか調べた。Stackoverflowにて親切な人が教えてくれた。

http://stackoverflow.com/questions/9228831/how-to-make-capybara-do-a-delete-request-in-a-cucumber-feature


たとえば /users/sign_out にDELETEリクエストを送りたいときには

```ruby
page.driver.submit :delete, "/users/sign_out", {}
```

のように書けばいい。

Capybara 2.1.0でもこれでうまくいった。

http://rubydoc.info/github/jnicklas/capybara/master/Capybara/RackTest/Driver:submit
「眠れるモンスターを狩る」をErlangで(横へな14)

「[眠れるモンスターを狩る](http://nabetani.sakura.ne.jp/hena/ord14linedung/)」をErlangでやってみました。他の実装は [第14回オフラインリアルタイムどう書くの問題](http://qiita.com/Nabetani/items/0597bd3af481e5834ae1) から辿れます。

```erlang:sleepmonster.erl
-module(sleepmonster).
-compile(export_all).

%% 武器・モンスター対応表 {武器, 倒せるモンスター, 得られる武器}
table() -> [{$a, $B, $c}, {$c, $D, $e}, {$e, $F, $g},
            {$g, $H, $i}, {$i, $J, $k}, {$k, $L, $a}].

%% 解く
solve(Data) ->
  Arms = lists:usort([X || X <- Data, X > $Z]), % 小文字のみ集める
  integer_to_list(hit(Arms, Data)).

%% 武器と全体のリストから倒したモンスターの数を返す
hit([], _) -> 0;
hit([Arm | RestArms], Data) ->
  {Monster, NewArm} = lookup(Arm),
  HitMonster = fun(M) -> M =:= Monster end,
  {Hits, NoHits} = lists:partition(HitMonster, Data),
  case Hits of
    [] -> hit(RestArms, Data); % その武器で倒せるモンスターが居ない
    _  -> length(Hits) + hit([NewArm | RestArms], NoHits) % 倒せた
  end.

%% 武器から倒せるモンスターと得られる武器を返す
lookup(Arm) ->
  hd([{M, NA} || {A, M, NA} <- table(), A =:= Arm]).

%% テスト
test(Data, Expected) ->
  Result = solve(Data),
  OkNg = case Result =:= Expected of true -> ok; false -> ng end,
  io:fwrite("~s: ~s -> ~s~n", [OkNg, Data, Result]).

tests() ->
  test("gLDLBgBgHDaD", "6"), %0
  test("DBcDLaLgDBH", "6"), %1
  test("JJca", "0"), %2
  test("FJDLBH", "0"), %3
  test("HJBLFDg", "6"), %4
  test("HBaDLFJ", "6"), %5
  test("DJaHLB", "2"), %6
  test("gDLHJF", "3"), %7
  test("cJFgLHD", "5"), %8
  test("FFBJaJJ", "1"), %9
  test("FJeJFBJ", "2"), %10
  test("iJFFJJB", "3"), %11
  test("JBJiLFJF", "5"), %12
  test("JDiFLFBJJ", "8"), %13
  test("BDFDFFDFFLLFFJFDBFDFFFFDDFaDBFFB", "28"), %14
  test("DDFBFcBDFFFFFFLBFDFFBFLFDFDJDFDF", "24"), %15
  test("FDLBFDDBFFFeFFFFFDFBLDDFDDFBFFJF", "16"), %16
  test("FDBFFLFDFFDBBDFFBJDLFgDFFFDFFDFF", "0"), %17
  test("FDiFLDFFFFBDDJDDBFBFDFFFBFFDFLFF", "31"), %18
  test("FDFDJBLBLBFFDDFFFDFFFFFDDFBkFDFF", "30"), %19
  test("HBkFFFFHBLH", "3"), %20
  test("FBHHFFFHLaB", "2"), %21
  test("LFHFBBcHFHF", "0"), %22
  test("LFBHFFeFHBH", "7"), %23
  test("LgFHHHBFBFF", "3"), %24
  test("FFiFHBHLBFH", "0"), %25
  test("BFHHFFHBeFLk", "10"), %26
  test("FHFaBBHFHLFg", "5"), %27
  test("FFgacaFg", "0"), %28
  test("JHDaDcBJiiHccBHDBDH", "9"), %29
  test("FHJJLckFckFJHDFF", "12"), %30
  test("DeDHJHDFHJBLHDLLDHJLBDD", "22"), %31
  test("gJLLLJgJgJLJL", "0"), %32
  test("DaaaDDD", "0"), %33
  test("HFeJFHiBiiBJeJBBFFB", "9"), %34
  test("FJFFJDBHBHaLJBHJHDLHkLLLFFFgJgHJLHkJkB", "32"), %35
  test("giFLBiBJLLJgHBFJigJJJBLHFLDLL", "23"), %36
  test("cgkLJcLJJJJgJc", "2"), %37
  test("LDFHJHcFBDBLJBLFLcFJcDFBL", "22"), %38
  test("JJHHHkHJkHLJk", "1"), %39
  test("kHHBBaBgHagHgaHBBB", "11"), %40
  test("HDBFFDHHHDFLDcHHLFDcJD", "20"), %41
  test("HFFFHeFFee", "7"), %42
  test("gLLDHgDLgFL", "1"), %43
  test("JJJBBaBBHBBHaLBHJ", "7"), %44
  test("FBFBgJBDBDgF", "0"), %45
  test("LLLLakakLakLL", "7"), %46
  test("HeJHeJe", "0"), %47
  test("LDFLBLLeBLDBBFFBLFBB", "4"). %48
```

結果の一部:

<pre>
ok: gLDLBgBgHDaD -> 6
ok: DBcDLaLgDBH -> 6
...
ok: HeJHeJe -> 0
ok: LDFLBLLeBLDBBFFBLFBB -> 4
</pre>
golangで配列(スライス)

```go
package main

import "fmt"

var (
	n = []int{1, 3, 5}
	d = []string{"hage", "hoge"}
)

func main() {
	fmt.Println(n)
	// [1 3 5]

	fmt.Println(n[0])
	// 1

	fmt.Println(n[1:])
	// [3 5]

	fmt.Println(n[2:])
	// [5]

	fmt.Println(n[3:])
	// []

	fmt.Println(n[:1])
	// [1]

	fmt.Println(n[:2])
	// [1 3]

	fmt.Println(n[:3])
	// [1 3 5]

	fmt.Println(d)
	// [hage hoge]

	fmt.Println(d[0])
	// hage
}
```
Groovyのちょっとしたこと「マップを使ってオブジェクトの実装」

マップの表現を使って匿名クラスのようなオブジェクトを初期化できる。

JavaScriptでよく書く書き方と一緒。

```groovy
[leftShift:{c->println c}] << 'hello world'
```
[メモ] Androidのサイトをデバッグしなきゃいけないとき


あんまり慣れてないので、勉強してかなきゃいけない。

## 参考リンク集

これがつかいやすいらしい。

 - [Androidの実機でウェブサイトのJavascriptをデバッグする方法 | ohsexybabyのWebログ](http://ohsexybaby.com/web/953/)

エミュレータも、たまにはちゃんと動くものが。

 - [那覇レポート: Androidを仮想マシンで使う-Genymotionの使い方](http://nahareport.blogspot.jp/2013/09/android-genymotion.html)

7連打…!?

- [Android 4.2で「開発者向けオプション」を表示する方法 | juggly.cn](http://juggly.cn/archives/75086.html)
10万行ごとに出力ファイルを変えるスクリプト。


今回もほとんどメモの小技です。悪しからず…
##モチベーション
ライフサイエンスの略語を調べる時にとっても便利な[Allie](http://allie.dbcls.jp/)というサービスがあるのですが，  
もっと多くの人に知ってもらいたいということで，略語のURL Listを作りました。
## Allieとは？
以下引用です。
>Allie(アリー)は生命科学分野において利用されている略語とその展開形を検索するサービスです。文献中に多く出現する略語は多義語であることが多く、特に専門外の読者には理解するのに困難を伴うことがあります。 Allieはこの問題に対する一つの解となるよう開発されています。 Allieは米国国立保健図書館(National Library of Medicine, NLM)の生物医学分野における書誌情報データベースであるMEDLINE®に含まれる全ての題目と要旨を対象として略語とその展開形を検索します。 MEDLINEは2000万件を超す書誌情報を収めており、実際の文献中に出現する領域固有の略語とその展開形を抽出するのに相応しいものとなっています。

詳しくは，[こちら。（からご利用ください。）](http://allie.dbcls.jp/)

##もっと多くの人に使ってもらうためには？
Sagaceの経験上，クエリのリンク集を作っておくことが，検索エンジンのロボットさんにとっても良いらしいということが，わかったので，リストを作りました。[こちらから](http://allie.dbcls.jp/)，データをダウンロードして使いました。
(こうしたクエリのリンクのリストがあることで，ロボットがそのページがリンクされているということと，そのページが，何に関するページなのかということが分かるので，検索結果に良い影響を与えているらしいのです。検索エンジン経由でサービスを発見してくれる人の多さは侮れないので，今回SEO対策的にリストを作ってみたということです。略語を大手の検索エンジンで調べた時に，Allieの結果が上位に来たら，ハッピーになる人が増えるのではなかろうかと。)

##10万行ごとに出力するファイルを変更するプログラム
最初に取得したデータをタブ区切りで配列に入れ，略語だけ取り出します。重複を除いたあとは，ループでまわして出力しています。その際に，出力するファイルを区別したかったので，最初に```filename = 'alice_url_0.txt'```とした後に，10万個ごとにファイル名を変更しその中に出力しています。

```ruby
lineabAry = []
File.open("alice_output_130107.txt"){|file| #読み込み
while line = file.gets
    lineAry =  line.split("\t") #タブ区切り
    lineabAry << lineAry[6].chomp 
end
}
lineabAry.uniq!
filename = 'alice_url_0.txt' #最初のファイル名


lineabAry.each_with_index{ |elem,i|
 if i % 10000 == 0 #10万個ごとにファイル名を変更する。
  if i != 0
         filename = "alice_url_" + i.to_s + ".txt"
  end 
end
File.open(filename,'a'){|f| #追記の"a"でする。
 if i % 10000 == 0 #markdown形式の表を出力する。最初の行に説明を入れる。
 f << "| Abbreviation | Allie URL |\n|:----------:|:------------:|\n" 
 end 
 f << "|"+ elem +"|[http://allie.dbcls.jp/short/exact/Any/"+ elem +".html](http://allie.dbcls.jp/short/exact/Any/"+ elem +".html)|\n"
}
}

```
##リストが出来たよ
出力したファイルをアップしたら，[こんな形](https://github.com/maoringo/SampleRepository/wiki/Sample-Allie-URL-List-500000)で，リストが出来ました(≧∇≦)/　分割したリストのページに飛べるページは[こちら](https://github.com/maoringo/SampleRepository/wiki/URL-List-for-Allie)。
CentOSでndenvをシステムワイドにインストールした時のメモ



[hubot](http://hubot.github.com/)を触ってみたーい。
という衝動にかられてNodeJsが必要になった。
ずっと[nodebrew](https://github.com/hokaccha/nodebrew)を使っていたけどrubyは[rbenv](https://github.com/sstephenson/rbenv)だし
pythonは[pyenv](https://github.com/yyuu/pyenv)だし
どうせだったら同じ概念で言語管理ツール入れたいと思っていたら
[riywo](http://blog.riywo.com/2013/06/21/152736)さんがrbenv真似して作成してくれたので導入した見たときのメモ。

## 環境 

* centos6.4（ゲストOS）macosx10.8(ホストOS)

## 注意事項

* ここから先は全てroo(権限)ユーザーで実行しています
* 開発環境構築の話です。本番環境などはもっと詳しいブログをみつけてください。

## 参考にしたサイト
* [node.jsのバージョン管理のためにndenv & node-buildを作ったのとanyenvの宣伝](http://blog.riywo.com/2013/06/21/152736)

## ndenvをgitからクローンする

ズバッと

```shell: 
cd /usr/local/
git clone https://github.com/riywo/ndenv.git
```

## ndenv用のグループを作成する

作っておけばグループでビルド権限とかをコントロールできます
vagrantはユーザー名です

```shell
groupadd ndenv
usermod -G ndenv vagrant
```

## ndenvのパーミッションの設定

```shell
chmod -R g+rwxXs /usr/local/ndenv/
```

## node-buildプラグインをインストール

```shell
mkdir /usr/local/ndenv/plugins
git clone https://github.com/riywo/node-build.git
```

## ndenvのPATHを通す

```shell:/etc/profile.d/ndenv.sh
vim /etc/profile.d/ndenv.sh

export NDENV_ROOT=/usr/local/ndenv
export PATH="$NDENV_ROOT/bin:$PATH"
eval "$(ndenv init -)" 
```

## NodeJSのインストール

一旦profileを反映してから行う事

```shell
source /etc/profile.d/ndenv.sh

which ndenv
/usr/local/ndenv/bin/ndenv
```

ndenvにPATHが通ったのでインストール

```shell
ndenv install v0.10.20
```

結構長いです。辛抱しましょう。

##NodeJSのデフォルトのバージョン設定

コマンド一発

```shell
ndenv global v0.10.20
ndenv rehash
```

## NodeJSのバージョン確認

```shell
node --version
```

NodeJSのインストールができました。
ずっとNodeJS版rbenvあったらいいなぁと思っていたので
[riywo](http://blog.riywo.com/2013/06/21/152736)さん
ありがとうございます！！
ActiveRecord で merge メソッドの引数に order メソッドを含んだ Relation を渡すと ORDER BY のテーブルが変わってしまう

2014.4.7追記 この投稿は Rails 4.0.1の頃のものであり、4.1系では修正済のようです。

次のような Blog と Entry というモデルがあった場合、

```ruby
class Blog < ActiveRecord::Base
  has_many :entries
end
```

```ruby
class Entry < ActiveRecord::Base
  belongs_to :blog
end
```

以下のように、Blog のmerge メソッドを呼び出すと、Entry の order を呼び出しているのに、発行される SQL は "ORDER BY blogs.udated_at" になってしまう。

```irb
irb(main):001:0> Blog.joins(:entries).merge(Entry.order(updated_at: :desc))
  Blog Load (0.2ms)  SELECT "blogs".* FROM "blogs" INNER JOIN "entries" ON "entries"."blog_id" = "blogs"."id" ORDER BY "blogs"."updated_at" DESC
=> #<ActiveRecord::Relation []>
```

回避するには、order メソッドの引数に文字列でテーブル名を指定する。

```irb
irb(main):002:0> Blog.joins(:entries).merge(Entry.order("entries.updated_at DESC"))
  Blog Load (0.6ms)  SELECT "blogs".* FROM "blogs" INNER JOIN "entries" ON "entries"."blog_id" = "blogs"."id" ORDER BY entries.updated_at DESC
=> #<ActiveRecord::Relation []>
```

特に、再利用目的で scope に order を使用している場合は、冗長でもテーブル名を指定した方がよい。
初心者から一歩抜け出すためのGitの業 〜 git add -p

Gitはとても便利だけど、一歩踏み込むと人外魔境だったりしてちょっとこわい。
ので、俺がGitを勉強していて「これは超便利」と感じたものをTIPS的にまとめておくことにする。

## git add -p

↓こんな感じで起動する。

```
$ git add [ファイルパス] -p
```

で、何が出来るのかっていうと、 **これからコミットする変更内容を取捨選択したり、編集したりする** ことができる。
たとえば、

```diff
diff --git a/git-add.md b/git-add.md
index 356ee59..dbf3428 100644
--- a/git-add.md
+++ b/git-add.md
@@ -1 +1,5 @@
 # git-add
+
+- add line-a
+- add line-b
+- add line-c
```

っていう変更があったとして、通常なら全部コミットするか、vimで開いて編集して別のコンソールでコミットした後、編集をロールバックするとか、そういうアナログな感じのことをやらなきゃいけないし、実際俺も最初の頃はそうしていた。
ところがどっこい、Gitにはちゃんとそれを回避する方法がある。

試しに`git add . -p`してみよう。すると、以下のように表示されるはずだ。

```diff
diff --git a/git-add.md b/git-add.md
index 356ee59..dbf3428 100644
--- a/git-add.md
+++ b/git-add.md
@@ -1 +1,5 @@
 # git-add
+
+- add line-a
+- add line-b
+- add line-c
Stage this hunk [y,n,q,a,d,/,e,?]? 
```

この時`?`と入力してReturnすることで、簡易的なヘルプを見ることができる。今回は真ん中の`- add line-b`だけをコミットしたかったと仮定する。どうするかというと、おもむろに`e`と入力してReturnするのだ。
すると、突然エディタが立ち上がる。俺の環境だとVimだ。

```vim
  1 # Manual hunk edit mode -- see bottom for a quick guide
  2 @@ -1 +1,5 @@
  3  # git-add
  4 +
  5 +- add line-a
  6 +- add line-b
  7 +- add line-c
  8 # ---
  9 # To remove '-' lines, make them ' ' lines (context).
 10 # To remove '+' lines, delete them.
 11 # Lines starting with # will be removed.
 12 #
 13 # If the patch applies cleanly, the edited hunk will immediately be
 14 # marked for staging. If it does not apply cleanly, you will be given
 15 # an opportunity to edit again. If all lines of the hunk are removed,
 16 # then the edit is aborted and the hunk is left unchanged.
```

この状態で例えば5行目と7行目を削除して、保存してみる。すると、おもむろに`git-add`を抜けて、通常のコンソールに戻るはずだ。そして、改めて`git diff --cached`を覗いてみよう。

```diff
diff --git a/git-add.md b/git-add.md
index 356ee59..577a4b4 100644
--- a/git-add.md
+++ b/git-add.md
@@ -1 +1,3 @@
 # git-add
+
+- add line-b
```

なんと、さっき消した2つの行が消えているではないか！
じゃぁどこに消えたのか？安心して欲しい、ちゃんと編集内容は残っている。`git diff`を見てみよう。

```diff
diff --git a/git-add.md b/git-add.md
index 577a4b4..dbf3428 100644
--- a/git-add.md
+++ b/git-add.md
@@ -1,3 +1,5 @@
 # git-add
 
+- add line-a
 - add line-b
+- add line-c
```

つまり、さきほど`e`でやったことは、 **これからコミットしたいものだけを残して保存することで、それらだけを `Changes to be committed` にする** ということだったのだ。
この業を上手く使いこなせば、コミットの効率が飛躍的に伸びるはずだ。

（後大事なのは、Gitを使いこなしてる感があって「俺SUGEEEEE」できるという自己満足に浸れるという点である）
Homebrewでrsync3.1.0をインストールする方法

# 以下のコマンドを実行するだけ
brew install https://gist.github.com/osamu2001/6861739/raw/1b0fce9f7f726f05ea8fa0c3a9e1d69fdfd6a749/rsync.rb

# 中身
https://gist.github.com/osamu2001/6861739

# ネタ元
http://d.hatena.ne.jp/bose999/20110706/1309961412
[ReVIEW Tips] いわゆる「JISにない文字」を出力する

「いわゆるJISにない文字」とはASCIIやJIS X 0208にないけどUnicodeのUCSにはある文字のことです（JIS X 0212とかJIS X 0213とかはなかったことにする場合の言葉です）。

特にLATEXBuilderを使う場合、UTF-8などでReVIEWのソースファイルを記述していても、JIS X 0208にはない文字を使った場合に(LaTeXの処理で)止まる場合があります。そのため、JISにない文字はソースコードに使わない方が無難です。

しかし、どうしてもJISにない文字を使いたい場合もあります。そのような場合、ReVIEWではUnicodeの文字をコードポイントで指定することができます。これには``@<uchar>``インライン記法を使います。これを使えば、

```review
@<uchar>{2460} @<uchar>{9AD9}橋
```

などと記述すると、LATEXBuilderでも以下のように出力できます。

![latex-sample.png](https://qiita-image-store.s3.amazonaws.com/0/4293/fd720cfb-21c7-45f6-6dd8-af09889d0dbd.png)

もちろんEPUBでも正しく出力されます。

![epub-sample.png](https://qiita-image-store.s3.amazonaws.com/0/4293/66ea8caa-d361-0b60-0e45-e7d37c9eac22.png)

なお、ReVIEWで文字を正しく指定していても、当然ながらフォントにその文字がない・フォントの指定が間違っている等の場合には出力されません。ご注意下さい。
CSSの自動試験の仕組み（案）

CSSの試験を書くのは良いけど、その試験をJavaScriptで書かなくちゃいけないのは辛い人が多そうなので、HTMLのdata属性で持たせてみてはどうか。

```css:main.css
a {
  color: #00f;
}
.gnav a {
  color: #f00;
}
```

```html:tests/main.css.html
<p>
  <a data-expected-style="color:#00f"></a>
</p>
<div class="gnav">
  <a data-expected-style="color:#f00"></a>
</div>
```

既存FWの調査はしてないです。

----

期待通りに表示される事の試験ではなくて、カスケーディングして期待通りのプロパティになる事の試験、という方針。

値を変数（という名の定数）で指定している場合は、期待値も変数で指定出来た方が良いかも。

あと`data-expected-style`は長いから`data-es`という省略形も使えると（見た目が短くなって）簡単（そう）になりそう。
nodeのprocessが終わっちゃう or 終わらない


nodeでシェルスクリプト書いてたら、標題の通りのことが起きたのでちょっと調べた。

 - DBにクエリ投げてるのにプロセスが閉じちゃう!
 - callbackが来るまでtimerで無理矢理プロセス延命してたら、いつまでも終わらない!

という感じだったので、
ともかくnodeのプロセスが終わるときの条件を復習。

 - [そうだったのか！ よくわかる process.nextTick() node.jsのイベントループを理解する](http://www.slideshare.net/shigeki_ohtsu/processnext-tick-nodejs)
   - めっちゃいい資料。

後半のややこしいはなしはいいんですが、
ともかく```handle```あるいは```req```というものが生きてると、プロセスは終了されないらしい。

つまり終わっちゃうということは、handleがない…というところまで調べて、

いま書いてるシェルスクリプトで、 **DBへのconnectionをopenしてなかった** ことに気づきましたーあははは。


 - connectionのhandleが作られてないので、イベントループ終了しちゃう
 - connectionないので、クエリ返ってこない
   - connectionないときエラー吐いてくれないんかな。。



笑っちゃうけど、ありがちなので気をつけたい。
いまイベントループを維持しているのはどのhandleなのかとか、
なるべく常に意識できてたほうがよさそう。
RailsアプリでPDFを出力する (Heroku対応)


`wicked_pdf`というGemを使うとHTMLを元にPDFを生成できるのでこれを使う。

## Gem



`wicked_pdf`は、`wkhtmltopdf`コマンドを叩くという実装になっているので、まずはそのバイナリをインストールする必要がある。
普通にインストールしてもいいのだが、`wkhtmltopdf-binary` gemで入れることをお薦めする。これで、`wkhtmltopdf`をインストールする必要があることを知らない他のメンバーのPCでも動き、Herokuでも動くアプリになる。

結果Gemfileは以下のようになる。

```ruby:Gemfile
gem 'wkhtmltopdf-binary'
gem 'wicked_pdf'
```

やらなくてもいいのかもしれないが、本家ドキュメントに書かれているので、PDFのMimeタイプも設定しておく。

```ruby:config/initializers/mime_types.rb
Mime::Type.register "application/pdf", :pdf
```

後は表示用にroutes, controller, view, layoutを作成していく。

## Controller

ここでは`http://localhost:3000/pdf/sample.pdf`でアクセスできるようなページを作る。

```ruby:config/routes.rb
Your::Application.routes.draw do
  resource :pdf, only: [] do
    get :sample
  end
end
```

```ruby:app/controllers/pdfs_controller
class PdfsController < ApplicationController
  def sample
    respond_to do |format|
      format.html { redirect_to sample_pdf_path(format: :pdf, debug: 1)}
      format.pdf do
        render pdf: 'sample',
               encoding: 'UTF-8',
               layout: 'pdf.html',
               show_as_html: params[:debug].present?
      end
    end
  end
end
```

Contllorの注意点：

- layoutはControllerにつけるlayoutは効かないので、個別に設定してあげる。
- `debug=1`でアクセスした時HTML表示できるようにしておく。そうするとうまくPDFが生成されない時、HTML出力の時点で失敗しているのか、`wkhtmltopdf`でPDFを生成するときに失敗しているのかが区別できる。
- `.pdf`をつけずにhtmlでアクセスした場合はdebug用のhtml表示するようにしておく。PDF出力したい場合、そのURLでHTMLも、JSONも、PDFもなんてことはなかなかないと思うので、これが一番いい気がする。

## View

```haml:app/views/layout/pdf.html.haml
!!!
%html
  %head
    %meta{ charset: "utf-8" }
    = wicked_pdf_stylesheet_link_tag 'pdf'
  %body
    = yield
```

```haml:app/views/pdfs/sample.pdf.haml
%h1 hoge
%h2 あいうえお
%h3 愛上尾
= params[:debug].present? ? image_tag('foo') : wicked_pdf_image_tag('foo')
```

個別viewの拡張子はデフォルトで`.pdf`を見に行くので注意。
変えたい場合は、`pdf`オプションではなく、`templete`や`file`オプションで指定することによって対象のテンプレートファイルを変更できる。

```css:app/assets/stylesheets/pdf.css.scss
html {
  font-family: 'IPAexゴシック', 'IPA Pゴシック', 'ヒラギノ角ゴ ProN W3', 'Hiragino Kaku Gothic ProN', 'メイリオ', Meiryo, 'MS Pゴシック', sans-serif;
}
```

## Font

Herokuだと日本語フォントが存在しなくて出力されないなどということがあるので、世の中にあるTrue Typeフォントを取ってこないといけない。
フリーでダウンロードできる普通っぽいフォントだとIPAフォントがいい気がした。

- http://ipafont.ipa.go.jp/

今回はこの中のIPAexゴシックのみ使ってみる。Herokuの場合`.fonts`ディレクトリを作成し、その中に`.ttf`ファイルを放り込めば良い。

```bash:bash
$ tree .fonts/
.fonts/
└── ipaexg.ttf
```

後は生成したいPDFのHTMLとCSSを書くだけ！！(これが一番大変だけど・・・)

## 参考

- https://github.com/mileszs/wicked_pdf
- http://d.hatena.ne.jp/deeeki/20120902/heroku_wkhtmltopdf_fonts
UnityのGLSLで半透明を扱う


まだ細かい書式について把握しきれていませんが、とりあえず以下のようにすると半透明になります。
詳細についてはこちらの記事（[GLSL Programming/Unity/Transparency](http://en.wikibooks.org/wiki/GLSL_Programming/Unity/Transparency)）を参考に。

```glsl
Shader "Custom/Transparency" {
	SubShader {
		Tags { "Queue" = "Transparent" }
		Pass {
			//最初のパスは背面のみレンダリング。つまり内側。
			Cull Front

			//他のオブジェクトをはじかないように深度バッファの書き込みをしない
			ZWrite Off
		
			//アルファブレンディングを使う
			Blend SrcAlpha OneMinusSrcAlpha			
			GLSLPROGRAM
			
			#ifdef VERTEX
			
			void main()
			{
				gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
			}
			
			#endif
			
			#ifdef FRAGMENT
			
			void main()
			{
				//4番目のアルファ成分が重要。
				//下記は半透明のグリーン。
				gl_FragColor = vec4(0.0, 1.0, 0.0, 0.3);
			}
			
			#endif
			
			ENDGLSL
		}

		Pass {
			//二回目のパスは表のみレンダリング
			Cull Back
			
			ZWrite Off
			
			Blend SrcAlpha OneMinusSrcAlpha
			
			GLSLPROGRAM
			
			#ifdef VERTEX
			
			void main()
			{
				gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
			}
			
			#endif
			
			#ifdef FRAGMENT
			
			void main()
			{
				gl_FragColor = vec4(0.0, 1.0, 0.0, 0.3);
			}
			
			#endif
			
			ENDGLSL
		}
	}
}
```

ポイントは3点。
冒頭の`Tags { "Queue" = "Transparent" }`と、`Blend SrcAlpha OneMinuesSrcAlpha`の部分です。
Tagsの詳細については[ドキュメント](http://docs.unity3d.com/Documentation/Components/SL-SubshaderTags.html)を。

ここのTagsで指定しているQueueは、ドキュメントではレンダリングの順序を指定するもののようです。
つまり、Queue = Transparetとタグが付けられたシェーダを持つオブジェクトのレンダリング順（キュー）が最後の方に回される、ということでしょう。（そうしないと半透明にならない）

原文では

> this render queue is rendered after Geometry and AlphaTest, in back-to-front order. Anything alpha-blended (i.e. shaders that don't write to depth buffer) should go here (glass, particle effects).

となっています。


Blendの方はフラグメントにある元の色と新しい色とをどう合成するかの指定です。
つまり、現在計算中のソースカラーと呼ばれる色と、フレームバッファに書き込まれているディスティネーションカラーとの合成比率を指定するものです。

ドキュメントの原文は

>One of the operations is the blending stage, which combines the color of the fragment (as specified in gl_FragColor), which is called the “source color”, with the color of the corresponding pixel that is already in the framebuffer, which is called the “destination color” (because the “destination” of the resulting blended color is the framebuffer).

となっています。
ちなみにサンプルの合成方法を計算式にすると以下のようなものになります。

```glsl
vec4 result = vec4(gl_FragColor.a) * gl_FragColor + vec4(1.0 - gl_FragColor.a) * pixel_color;
```

これで半透明を実現しているわけですね。（ソースカラーのアルファ値が1なら半透明にならなくなる）


さて、最後のポイントが`Pass { … }`をふたつ書いている点です。
これは表のレンダリングと裏のレンダリングを分けている部分です。
普通、負荷軽減のために裏面のポリゴンは描かれません。
ゲームとかしてカメラが変な所に入るとポリゴンが消えたりするあれです。

しかし半透明ということは裏面もレンダリングされないとおかしなことになってしまいます。
そこでPassをふたつ設定し、それぞれ表と裏を両方レンダリングしている、というわけです。

ちなみに上記のシェーダを適用すると以下のように表と裏で違う色になるようになります。

![front-back-facing.jpg](https://qiita-image-store.s3.amazonaws.com/0/5616/beda8a8d-66b4-68de-e0af-7671a50a9190.jpeg "front-back-facing.jpg")
経度、緯度、時刻から、太陽、月の方角を計算する

前に[書いた](https://github.com/skonb/CelestialUtil)もの。

日の出・日の入りの計算 : 天体の出没時刻の求め方 / 長沢工著, 東京 : 地人書館, 1999.12
と言う本に書いてあった近似式を用いている。

例えば、

`[[[CMMoon instance] azimuthAngleAtDate:[NSDate date] inLocation:location TimeZone:[NSTimeZone defaultTimeZone]]`

で現時点での月の方位角が、

`[[[CMSun instance] declinationAtDate:[NSDate date] inLocation:location TimeZone:[NSTimeZone defaultTimeZone]]`

で現時点での太陽の赤緯が計算される。

`CMCelestialObject`の適当な関数をオーバーライドすればどんな天体でもサブクラス化できるつもりで作ったが、天文の知識は無いので実際の計算過程で問題が出ないのかは不明。

月の近似式は非常に複雑で、400個強の係数を使っている。

また、名前は忘れたが反復法によって経緯から経緯までの方位を計算するものも入っている。

```objc

@interface CMLocationUtility : NSObject

+(CLLocationDegrees)angleFromCoordinate:(CLLocationCoordinate2D)from toCoordinate:(CLLocationCoordinate2D)to;

@end

```

何かの参考になれば。
スポットライト的なことをするビュー

githubの[レポジトリ](https://github.com/skonb/SWHSpotlightView)
基本的にはDrawRectでパスを描く。

```objc
- (void)drawRect:(CGRect)rect
{
    // Drawing code
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextClearRect(context, rect);
    [self.fillColor setFill];
    CGRect holeRect = CGRectMake(self.centerOfHole.x - self.radiusOfHole , self.centerOfHole.y - self.radiusOfHole , self.radiusOfHole * 2, self.radiusOfHole * 2);
    UIBezierPath *circlePath = [UIBezierPath bezierPathWithOvalInRect:holeRect];
    [circlePath appendPath:[UIBezierPath bezierPathWithRect:rect]];
    circlePath.usesEvenOddFillRule = YES;
    [circlePath fill];
}

```

`centerOfHole`や`radiusOfHole`を変更することでライトの位置を動かす。
動かすのは`NSTimer`でやっている。

使い方としては、

```objc

SWHSpotlightView *spotlightView = [[SWHSpotlightView alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
[spotlightView moveCenterTo:CGPointMake(160, 160) animated:YES];
[spotlightView changeRadiusTo:100 animated:YES];

```

のようなもの。他に`duration`と`completion`を指定できるメソッドもある。

また、

```objc
spotlightView.zoomInOutAnimation = YES;
```
とするとふわふわ微妙に拡大縮小を続ける。

何かの参考になれば。
Google Analytics SDK v3でUncaughtExceptionのフルスタックトレースを送る

まず、カスタムパーサーを定義する。

```java
//AnalyticsExceptionParser.java


import org.apache.commons.lang3.exception.ExceptionUtils;
import com.google.analytics.tracking.android.ExceptionParser;

public class AnalyticsExceptionParser implements ExceptionParser {
    /*
     * (non-Javadoc)
     * @see com.google.analytics.tracking.android.ExceptionParser#getDescription(java.lang.String, java.lang.Throwable)
     */
    public String getDescription(String p_thread, Throwable p_throwable) {
        String res= "Thread: " + p_thread + ", Exception: " + ExceptionUtils.getStackTrace(p_throwable);
        return res;
    }
}

```

Applicationを定義し、パーサーをセットする。

```java
//Application.java

    @Override
    public void onCreate() {
        super.onCreate();
        initializeGa();
        // Change uncaught exception parser...
        ExceptionReporter myHandler;          // Current default uncaught exception handler.
        myHandler = new ExceptionReporter(GoogleAnalytics.getInstance(this).getDefaultTracker(), // Tracker, may return null if not yet initialized.
                GAServiceManager.getInstance(),                        // GAServiceManager singleton.
                Thread.getDefaultUncaughtExceptionHandler(), this);

        myHandler.setExceptionParser(new AnalyticsExceptionParser());
        Thread.setDefaultUncaughtExceptionHandler(myHandler);
    }
```

AndroidManifest.xmlでApplicationを定義したものに変更する。

```xml
<!--AndroidManifest.xml-->

    <application
        android:name="com.example.Application"

```

参考: http://stackoverflow.com/questions/14009883/exception-stack-trace-lost-in-google-analytics-v2-for-android
「Varying Vagrant Vagrants（VVV）」のWordPressを日本語化する

Vagrant環境に、WordPressを簡単にセットアップできる「Varying Vagrant Vagrants（VVV）」は便利ですが、セットアップされるWordPressが英語版になっています。

これを、日本語化するためには次のような手順を行います。

## 1. wp-config.phpの書き換え

次の場所に保存されている「wp-config.php」を書き換えます。

/www/wordpress-default/wp-config.php
/www/wordpress-develop/src/wp-config.php
/www/wordpress-trunc/wp-config.php

65行目付近

```php
define('WPLANG', '');
```

↓

```php
define('WPLANG', 'ja');
```

## 2. 言語ファイルのコピー

最初に、日本語版のWordPressをダウンロードして解凍しておきます。

```shell-session
wget http://ja.wordpress.org/latest-ja.zip
unzip latest-ja.zip
```

そして、言語ファイルをコピーします。

```shell-session
cp -R wordpress/wp-content/languages www/wordpress-default/wp-content/
```

## 3. WP Multibyte Patchのコピー

次に、マルチバイト言語版にのみ同梱されている「WP Multibyte Patch」をインストールします。

```shell-session
cp -R wordpress/wp-content/plugins/wp-multibyte-patch www/wordpress-default/wp-content/plugins
```

これで日本語版として利用することができます。
サーバのIPアドレスを得るワンライナー

サーバのIPアドレスと一概に言っても、２枚指しだったり、alias で１つのNICに複数のIPアドレスが付与されていたり、ブリッジや bonding や vlan でインターフェース名が変わっていたり、[そもそも eth* ではないこともあるので](http://ja.community.dell.com/techcenter/b/weblog/archive/2011/08/29/rhel-6-sp1.aspx) 、存在しないはずのIPアドレス（255.255.255.255）に対するソースアドレス（デフォルトゲートウェイに向かうパケットのソースアドレス）を表示させます。

```console
$ /sbin/ip -o route get 255.255.255.255 | /bin/grep -Eo 'src\s+\S+' | /bin/awk '{print $2}'
```
さくらVPSで躓いたMysql関連の権限設定

さくらVPSでワードプレスを入れたとき躓いたMysqlの権限の設定について

①実体ファイルの権限

実体ファイルの権限を変更しないと、create databeseやらなんやらができなかった。
変更するファイル(実体ファイル)のパスは、さくらVPSでワードプレス！的なモノを参考にやっていったらこんな感じ(のはず)
<pre>/var/lib/mysql</pre>

ここのオーナーをmysqlに変更

<pre>chown -R mysql:mysql /var/lib/mysql</pre> 

これでmysqlに書き込めるようになります

②Mysqlサーバ(mysqld)の権限

次にMysqlサーバの権限も変更しないとサーバちゃんが起動してくれませんでした(ヽ'ω`)

そこでここの権限も変更しちゃいます。

<pre>chown -R mysql:mysql /var/run/mysqld</pre>

以上で無事ワードプレスでブログサイト開設できました＼(^o^)／
↓ブログ
<a href="http://www13163uj.sakura.ne.jp/ ">とりあえず</a>

終わり
Opacity や RBGa を使ってもテキストを透過せずに背景画像のみを透過することはできません

できることだけじゃなくて、もっとできないことの共有はされるべきだと思うんですよ。

やりたい事に近いことをしてるサイトは山のように見つかるのにやりたい事自体の情報は見つからない。
結局かなりの時間を検索に費やした結果できない諦めて別の方法を探す、そんな経験ありませんか？

「○○はできません」とはっきり書いてあるサイトが見つかればそこでGoogleさんとの検索の旅を終わらせられるですよ。だからみんなもっと「できないとわかったこと」の共有をしましょう！

## 前置き終わり

というわけで後はタイトル通りです。

「テキストは透過せずに背景色を透過する」には方法がありますが
「テキストは透過せずに背景画像を透過する」には現時点で背景画像自体を透過しておく必要があります。

何でできないかとか背景色のみの透過方法とかはリンク先をどうぞ。

## 参考

css - Opacity of background, but not the text - Stack Overflow
http://stackoverflow.com/questions/637921/opacity-of-background-but-not-the-text

html - Change background image opacity - Stack Overflow
http://stackoverflow.com/questions/12605908/change-background-image-opacity
ImageMagickを使って PDF を 連番JPGに変更してzipファイルにまとめる

シェルスクリプト書いてGistに置いといた。
https://gist.github.com/ironsand/6304285

`$ pdf2jpg foo.pdf` とすると foo.zip が出力される。
`foo` ってディレクトリも作成されるけど変換後いらないので消してください。
ちなみに変換には結構時間がかかるので短くしたい人は -density の値を小さくすれば早くなります。もちろん画質も下がります。

Qiita内で検索して出てこなかったので自分が検索した時に見つけやすいようにこの記事書いてます。
Illustrator の `.ai` ファイルをImageMagickで `.png` に変換する

動画変換なら大体出来ちゃうのが `ffmpeg`、そして画像変換なら大体出来ちゃうのが`ImageMagick`。

ということで素材集サイトによくある `.ai`ファイルを適当なサイズで `.png`にImageMagickなら変更できるだろうと信じて作業を行っています。

でも `$ convert input.ai output.png` としてみるとこんなエラー

```
convert: Postscript delegate failed `input.ai': No such file or directory @ error/ps.c/ReadPSImage/837.
convert: no images defined `output.png' @ error/convert.c/ConvertImageCommand/3106.
```

「ん、`input.ai`が見つかんないのかな？ 」と思ったけどそうじゃなくて作業を投げる先のPostscriptがなくてエラーになってるっぽい。

Postscriptを使うためにはGhostscriptが必要らしいので

`$ brew search ghostscript`

で探してみるといけるっぽいので

`$ brew install ghostscript` 

してからもう一回

`$ convert input.ai output.png` してみる。

でも出力画像がちょっと汚いので

`$ convert -density 300 input.ai output.png`

もっと良い画質にしたいなら `600` を設定すればOK。もちろん変換時間は増える。
Haskellの基本まとめ2


## 関数の基本

構文

`関数名 [引数] = 関数本体`

例

```haskell:sample.hs
doubleMe x = x + x
```

```haskell
> :l sample.hs
> doubleMe 10
20
> doubleMe 2.3
6.4
```

## Haskellにおける関数の特徴

* 関数の定義の中で、自分で定義した関数を呼び出すことも出来る。
  * 例： `doubleUs x y = doubleMe x + doubleMe y`
* 必ず何かしらの値を返す。
* 関数名にアポストロフィ( ' )が使える。
  * 慣習的に正格（遅延じゃない）版の関数を表したり、少し変更した場合に元の関数名に似た名前にするために使う。
* 関数名は小文字から始める。

## リストの基本

Haskellのリストは一様なデータ構造

```haskell
> let numbers = [1, 2, 5, 7, 10]
> numbers
[1, 2, 5, 7, 10]

> let strings = ['h', 'e', 'l', 'l', 'o']
> strings
"helloe"
```

リストの連結

```haskell
> [1, 2, 3] ++ [4, 5, 6]
[1, 2, 3, 4, 5, 6]
> "hello" ++ " " ++ "world"
"hello world"

> "OK":" Google"
"OK Google"
> 4:[1, 2, 3]
[4, 1, 2, 3]
```

リストの要素へのアクセス
※添字は0から

```haskell
> "abc" !! 1
'b'
> [2, 4, 6, 8] !! 3
8
```

リストの入れ子

```haskell
> let lists = [[1, 1, 1], [2, 2], [3, 3, 3, 3]]
> lists
[[1, 1, 1], [2, 2], [3, 3, 3, 3]]
> lists !! 1
[2, 2]
```

リストの比較
中の要素を辞書順で比較する

```haskell
> [3, 2, 1] > [1, 2, 1]
True
> [1, 2, 3] == [1, 2, 3]
True
```

基本的なリスト関数

1. head : 先頭の要素を返す
2. tail : 先頭を除いた残りのリストを返す
3. last : リストの最後の要素を返す
4. init : 最後の要素を除いた残りのリストを返す
5. length : リストの長さを返す
6. null : リストが空かどうかを調べる
7. reverse : リストを逆順にする
8. take : 先頭から指定された数の要素を取り出したリストを返す
9. drop : 指定された数の要素を先頭から削除したリストを返す
10. maximum : リストの中で最大の要素を返す
11. minimum : リストの那珂で最小の要素を返す
12. sum : 数のリストの和を返す
13. product : 数のリストの積を返す
14. elem : 指定した要素がリストに含まれているかを調べる

```haskell
> head [1, 3, 5, 7]
5
> tail [1, 3, 5, 7]
[3, 5, 7]
> last [1, 3, 5, 7]
7
> init [1, 3, 5, 7]
[1, 3, 5]

> length [1, 3, 5, 7]
4
> null [1, 2, 3]
False
> null []
True
> reverse [1, 2, 3]
[3, 2, 1]
> take 2 [1, 3, 5, 7]
[1, 3]
> drop 2 [1, 3, 5, 7, 9]
[5, 7, 9]

> maximum [3, 9, 1, 5]
9
> minimum [3, 9, 1, 5]
1
> sum [2, 4, 6, 8]
20
> product [2, 4, 6, 8]
384

> 2 `elem` [1, 3, 2, 5]
True
> 4 `elem` [1, 3, 2, 5]
False
```

レンジ：列挙出来る要素のリスト

```haskell
> [1..10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
> ['a'..'g']
"abcdefg"
```

ステップを指定したレンジ

```haskell
> [2, 4..10]
[2, 4, 6, 8, 10]
> [5, 4..1]
[5, 4, 3, 2, 1]
```
Cocoa Applicationでboostをやる。その2

環境
OSX 10.6.8
Xcode 4.2
boost 1.54
##1. 問題が起きた。
上記で、threadを使おうとすると、
リンクエラーになる。
##2. 解決策
Build PhasesのLink Binary With Librariesに
/opt/local/lib/libboost_thread-mt.a を追加する。
##3.さらに
serializeの場合、
/opt/local/lib/libboost_serializetion-mt.a を追加する。
現在時刻に依存したモジュールのテスト

現在時刻に依存するモジュールでテストを書く場合、まあ Mock ライブラリを使えばいいんだけど

+ 数行程度のモジュール
+ テスト環境を最小限にしたい（普段の環境以外でテストさせたい）

とかいう場合のサンプル。というかメモ。
やってることは簡単で、テスト期間限定で Date.prototype の メソッドをオーバーライドして 期待値を返すようにするだけ。今回はスタブ（？）の手法を使う。

```js:stub.js
var test = require('tape')

test('stub for Date#toString', function (t) {
    t.test('hook .toString', function (tt) {
        var stub = {}
        var toString

        function setup () {
            toString = Date.prototype.toString
            Date.prototype.toString = function () { return stub.time }
        }
        function teardown () {
            Date.prototype.toString = toString
            stub.time = null
        }
        function subtest (time) {
            stub.time = time
            tt.equal((new Date).toString(), time
              , '(new Date).toSting() === "' + time + '"')
        }

        setup()
        subtest(12)
        subtest('hoge')
        teardown()

        tt.end()
    })

    t.test('reset .toString', function (tt) {
        var d = new Date
        var str = d.toString()
        tt.ok(/\d\d:\d\d:\d\d\sGMT[+-]\d\d\d\d/.test(str)
          , '(new Date).toString() === "' + str + '"')
        tt.end()
    })

    t.end()
})
```

テスト結果

```:result.txt
TAP version 13
# stub
# hook .toString
ok 1 (new Date).toSting() === "12"
ok 2 (new Date).toSting() === "hoge"
# reset .toString
ok 3 (new Date).toString() === "Sun Oct 06 2013 16:56:13 GMT+0900 (JST)"

1..3
# tests 3
# pass  3

# ok
ok      127 ms
All tests successful.
Files=1, Tests=3,  0 wallclock secs ( 0.06 usr  0.01 sys +  0.06 cusr  0.02 csys =  0.15 CPU)
Result: PASS
```
zshrcの設定

#はじめに
なぜbashじゃなくて、zshなのかと問われると・・。
正直、はっきりとした答えはありません。
ただ、初めてターミナルをちゃんと使いだそうとした時に、
教えてくれた友人がzshの設定をしてくれたのでzsh派になりました。
.zshrcを設定することで、だいぶターミナルが使いやすくなります！
ここでは、おすすめの設定を紹介させていただきます。

ちなみに僕はTerminalのプロファイルはProを使っております(^^)

#.zshrc
設定の特徴
・とにかく時間を表示・残す
・カレントディレクトリを表示
・出来るだけ機能を無くす

ファイルは、githubにあげておりますので、こちらをそのまま~/.zshrcファイル（無ければ作成）にコピーペーストしてください。
https://github.com/bpymasinn/Config/blob/master/.zshrc

もし、こうしたほうがいい！とか、使いにくい等がありましたら教えてください！

#参考
http://d.hatena.ne.jp/oovu70/20120405/p1（ほぼここと一緒です）
http://calcurio.com/wordpress/?p=1131