OmniAICreator/Qiita-1.07M huggingface dataset:
Mroongaにおける様々なレコード件数カウント方法とパフォーマンスについて

# はじめに
MySQLで高速に全文検索するためのオープンソースのストレージエンジンMroongaでは、テーブルのレコード件数をカウントする方法がいくつかあります。

これらの方法のパフォーマンスの違いを簡単に比較してみます。

# テストデータ

`year`カラムに`2001`～`2010`を合計10,000,000件(1,000万件)セット
`text`カラムは空白

```sql
CREATE TABLE IF NOT EXISTS `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `year` int(11) NOT NULL,
  `text` text NOT NULL,
  PRIMARY KEY (`id`),
  KEY `year` (`year`),
  FULLTEXT INDEX `text` (`text`)
) ENGINE=mroonga  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
INSERT INTO test (year) VALUES (2001);
INSERT INTO test (year) VALUES (2002);
INSERT INTO test (year) VALUES (2003);
INSERT INTO test (year) VALUES (2004);
INSERT INTO test (year) VALUES (2005);
INSERT INTO test (year) VALUES (2006);
INSERT INTO test (year) VALUES (2007);
INSERT INTO test (year) VALUES (2008);
INSERT INTO test (year) VALUES (2009);
INSERT INTO test (year) VALUES (2010);
CREATE TABLE IF NOT EXISTS `test2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `year` int(11) NOT NULL,
  `text` text NOT NULL,
  PRIMARY KEY (`id`),
  KEY `year` (`year`),
  FULLTEXT INDEX `text` (`text`)
) ENGINE=mroonga  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
INSERT INTO test2(SELECT '',test.year,'' FROM test, test test2, test test3, test test4,test test5,test test6,test test7);
```


# 方法1 - 普通にSQLでカウント
普通にSQLの<code>COUNT(*)</code>で2005以降の<code>year</code>の件数をカウントしてみます。

```sql
mysql> SELECT COUNT(*) FROM test2 WHERE year > 2005;
+----------+
| COUNT(*) |
+----------+
|  5000000 |
+----------+
1 row in set (2.06 sec)
```

# 方法2 - AGAINST句にGroongaのクエリ構文を使う方法でカウント
[MroongaによりMySQLで複数インデックスを有効に全文検索する方法](http://createfield.com/Mroonga%E3%81%AB%E3%82%88%E3%82%8AMySQL%E3%81%A7%E8%A4%87%E6%95%B0%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E5%85%A8%E6%96%87%E6%A4%9C%E7%B4%A2%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95) に記載のAGAINST句にGroongaのクエリ構文を利用した最適化の方法を使って2005以降の<code>year</code>の件数をカウントしてみます。

```sql
mysql> SELECT COUNT(*) FROM test2 WHERE MATCH(text) AGAINST('+year:>2005' IN BOOLEAN MO
DE);
+----------+
| COUNT(*) |
+----------+
|  5000000 |
+----------+
1 row in set (2.76 sec)
```

# 方法3 - mroonga_commandを使ってカウント
<code>mroonga_command</code>のUDFを使って、Groongaのselectコマンドにより2005以降の<code>year</code>件数をカウントしてみます。

```sql
mysql> SELECT mroonga_command('select test2 --query +year:>2005 --limit 0 --output_columns _key') as cnt;
+----------------------------------+
| cnt                              |
+----------------------------------+
| [[[5000000],[["_key","Int32"]]]] |
+----------------------------------+
1 row in set (0.84 sec)
```

# まとめ
複数種類のカウント方法のパフォーマンスを比較してみました。

Mroongaでは、SQLの他に直接Groongaのコマンドを扱うUDFも提供されています。
Groongaのコマンドでは、結果がJSON形式となりますが、速度差や扱いやすさ等を比較してみて、より馴染む方法を探ってみると良いのではないでしょうか。
chrome拡張開発Tip

chrome拡張機能を自作し、自分もインストールして使用している場合、アイコンが全く同じなので

+ 現在開発中のもの
+ ウェブストアからインストールしたもの

の２つの見分けがつかなくて困ることが多々ある。
#Badgeをつける
backgroundページやその他のHTMLファイルで以下のJavaScriptファイルを読み込めば良い。

```js:build-prefix.js
var dev_build = 1;

!function() {
  if(dev_build) {
     var title = document.getElementsByTagName("title")[0];
     if(title != undefined) {
          title.innerHTML = "[dev] " +  title.innerHTML;
     }
     chrome.browserAction.setBadgeText({"text": "dev"});
     chrome.browserAction.setBadgeBackgroundColor({"color": "#FF0000"});
  }
}();
```

すると、以下のように、拡張機能のアイコンには赤色の`dev`バッジが付き、アプリ内の各ページのタイトルには先頭に`[dev]`が付加される。

>![dev.png](https://qiita-image-store.s3.amazonaws.com/0/34697/2c8239e1-706b-6381-c017-6ce8a7a276c0.png)
>
>![tab.png](https://qiita-image-store.s3.amazonaws.com/0/34697/f96e8182-0f97-b1d1-297f-c67246504ee3.png)

これで、どちらが現在開発中のものかがすぐに分かる。
##実際にリリースするときには
上のコードの１行目の変数 `dev_build` の値を `0` に変更するだけで良い。

>var dev_build = 0;


------
見分けをつけるだけならば、開発中の方のアイコンを変えるなどの策もあるが（実際にやっていたが）、リリース前に元に戻す作業が面倒だったのでこのような方法を考えてみた。
これならリリース前の変更は一文字で済むのでかなりラクになった。
guide-keyの新機能棚卸

この記事は[.emacs Advent Calendar 2013](http://qiita.com/advent-calendar/2013/dot-emacs)の22日目の記事です。
outline-magic.elについて書くとか言ってましたが、急遽自分のライブラリの[guide-key](https://github.com/kbkbkbkb1/guide-key/blob/master/README.ja.org)について紹介することにしました。outline-magic.elについては別の機会に書きます。

guide-keyについては[去年も](http://qiita.com/kbkbkbkb1/items/16bd5cb65be18e804c63)紹介しています。この1年で以下の新しい機能が追加されているのでそれらを紹介します。

- ポップアップウィンドウの表示遅延
- 特定のモードに関する設定
- プレフィクスキーの再帰的なチェック
- `key-chord`との連携
- ポップアップウィンドウのテキストサイズ調整

くわしくは[こちら](http://www.kaichan.info/blog/2013-12-22-emacs-advent-calendar-2013-22.html)
GitHub's Xamarin starter apps  について


Github社は、割と Xamarin に熱心で、[Xamarin Evolve というイベントでセッション](http://xamarin.com/evolve/2013#session-zm59b5yptf)を行ったり、その時の資料が日本の速報系サイトで 「[Ruby を捨てて C# と MVVM に完全移行](http://blog.livedoor.jp/itsoku/archives/33671593.html)」なんてヒドい扱い受けちゃったりしてます。

でその Github 社が Xamarin でアプリ開発するならこれ使うといいよ、的なアプリケーションのひな形？を公開しています。

* [GitHub's Xamarin starter apps](http://log.paulbetts.org/open-source-githubs-xamarin-starter-apps/)

Github社は、自前の MVVM フレームワーク「ReactiveUI」、非同期KVS の 「Akavache」を作ってますので、それを利用したものになっています。

* [ReactiveUI](http://www.reactiveui.net/)
* [Akavache](https://github.com/akavache/Akavache)

Starter Apps を Xamarin Studio で開くとこんな感じです。

![](http://blog.amay077.net/assets/images/posts/xamarin_startup_apps_by_github_01.png)

アプリケーション自体は MVVM で作られていて、前述の RectiveUI によって、View 以外は極力プラットフォームに依存しないように作ることができます。

Starter-Core-Android と Starter-Core-iOS が、「View以外」の部分に相当します。(ここ PCL化 できれば１プロジェクトで済みそうですが)

Starter-Android と Starter-iOS は、各プラットフォームの View に相当します。

かくいう私もまだソースをじっくり読んでないのですが、クロスプラットフォームで開発する時の教材になるかなーと思います。
Emacs24.3のインストール方法まとめ


日本語版Emacs24.3を動かす方法をまとめています(私が使っているOSや環境の情報が中心です)。間違いや他環境での情報ありましたらプルリクエスト歓迎です。[ongaeshi/emacs-brave](https://github.com/ongaeshi/emacs-brave)を動かすことで動作確認しています。

## Windows
[gnupack](http://sourceforge.jp/projects/gnupack/)を使いましょう。`emacs-24.3-20130503.exe`などをダウンロードして適当な場所に解凍します。

## Mac
### MacPortsの場合
+patchesオプションを付けてインストールします。

```
$ sudo port install emacs-app +patches
```

*/Applications/MacPorts/Emacs.app* にインストールされます。

```
open /Applications/MacPorts/Emacs.app
```

*~/.emacs.d/init.el* に以下の設定を追加します。

```
(setq default-input-method "MacOSX")
```
### コンパイル済みパッケージ
[GNU Emacs For Mac OS X](http://emacsformacosx.com/)

からdmgファイルがダウンロード出来ます(IMEパッチは適用されていません)。MacPortsやHomebrewを持っていない人は一番手っ取り早いかもしれません。

[ここ](http://emacsformacosx.com/builds)から古いバージョンや開発中の最新版もダウンロード出来ます。

## 参考文献
- [Emacs24 のインストールと新機能 : 紹介マニア](http://sakito.jp/emacs/emacs24.html#id3)
- [EmacsでIMEと仲良くする - Qiita [キータ]](http://qiita.com/catatsuy/items/886f1e0632c0b2760fb4)
- [MacPorts で インラインパッチをあてた emacs-app (aqua) をインストールしてみた。いわゆる Cocoa Emacs23。 - 牌語備忘録 - pygo](http://d.hatena.ne.jp/CortYuming/20100901/p1)
Ceyonのユニットテスト２

今回はテストの違う実行のしかたを紹介してみます。

[テストのコードは前回のもの](http://qiita.com/newta/items/eea83a8e8eb504f1b66a) を利用します。

このテストを実行するときにTestRunnerを利用して実行します。

```ceylon


test
void runTest() {
	
	TestRunner testRunner = createTestRunner(
		[`success`,`failure`,`successCounterTest`,`failureCounterTest`]);
	TestRunResult result = testRunner.run();
	
	print(result);	
}

````

createTestRunnerの呼び出し時に
テストケースの関数を渡します。
前回のテストの４つを渡して実行しています。

resultの出力結果は以下の通り

````
TEST RESULTS
run:     4
success: 2
failure: 2
error:   0
ignored: 0
time:    0s

hogehoge.abc::failure - failure (ceylon.language.AssertionException "always fail")
hogehoge.abc::failureCounterTest - failure (ceylon.test.AssertionComparisonException "assertion failed: 3 != 300")

TESTS FAILED !

````

TestRunResultをそのまま渡すと全ての情報をコンソールに出力出来ますが
個別に情報が取りたい場合には各メソッドを使います。

| isSuccess | 成功失敗を返します。１つでも失敗しているとfalseになります|
|:-----------|------------:|
| elapsedTime       |  実行時間(ms) | 
| runCount       | 実行個数 |
| failureCount       | 失敗個数 | 
| successCount       | 成功個数 |
| results | 個別の実行結果の詳細 |

詳しいAPIはこちら。
http://modules.ceylon-lang.org/repo/1/ceylon/test/1.0.0/module-doc/TestRunResult.type.html

テスト自動化のためのプラグインを作るときに使うかも！
普通にテストを書くときにはあまり使わないかも。

そんな感じで、誰かceylonで作ってみたら良いと思いますー。
年賀状がパソコンなしでも作れる時代がくる～～～～？？？

**結論：きませんでした**  

この記事は[Eject Advent Calendar 2013](http://www.adventar.org/calendars/108)の23日目です。  
みなさんEjectしてますか？  
クリスマスにはなにをwhile ;do;eject -T;done; される予定の人もいるかと思いますが、ぜひ爆発していただきたく存じ上げます。  

# 私のEject遍歴  
2004年にはじめて（コピペを駆使してわけもわからず）書いた[プログラム(言語：ひまわり)](https://dl.dropboxusercontent.com/u/7235224/%EF%BD%83%EF%BD%84%E9%96%8B%E9%96%89.txt)がトレイをejectしてひっこめるだけものであったり、ドライブを増設した際に興奮のあまりこんな[動画](http://www.nicovideo.jp/watch/sm9416912)をうｐしてしまうくらいの無類のEject好きのようでした。当時の私がいったい何を思ってトレイ開閉プログラムをつくってしまったのかは忘れてしまいましたが、何としてでも自動開閉したかったんだと思います。  
そんな隠れEjectanな私がEjectが好きなんだとはっきりと自覚したのはつい最近のことでした。  

<blockquote class="twitter-tweet" lang="ja"><p>イジェクト教やば</p>&mdash; mnnn (@menonon) <a href="https://twitter.com/menonon/statuses/409917756637589504">2013, 12月 9</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>  
<blockquote class="twitter-tweet" lang="ja"><p>名乗ってないのに、Eject教って呼ばれる現象に名前を付けたい <a href="https://t.co/IgyLnSygrp">https://t.co/IgyLnSygrp</a></p>&mdash; あっきぃ@3日目西す-08b (@Akkiesoft) <a href="https://twitter.com/Akkiesoft/statuses/409918188571209728">2013, 12月 9</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>  


# Ejectではんこを押すなにか
閑話休題。  
<blockquote class="twitter-tweet" data-cards="hidden" lang="ja"><p>せっかくなのでスタンプ押す <a href="http://t.co/tFMZfGCvz7">pic.twitter.com/tFMZfGCvz7</a></p>&mdash; あっきぃ@3日目西す-08b (@Akkiesoft) <a href="https://twitter.com/Akkiesoft/statuses/413670920247840768">2013, 12月 19</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>  
<blockquote class="twitter-tweet" lang="ja"><p>それEjectでやればよかったのでは感</p>&mdash; mnnn (@menonon) <a href="https://twitter.com/menonon/statuses/413843558039158784">2013, 12月 20</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>  
というわけで今回、Eject工作としてEjectではんこを押して年賀状を制作するなにかを、  
**作れませんでした。**  
Ejectなめてた。  
SATA延長ケーブルや100均のはんこなどで2000円くらいかかりました。ケーブル調達に日本橋オタロードまで行きましたが、その後に寄った梅田ヨドバシにも普通においてあった。  
![](https://dl.dropboxusercontent.com/u/7235224/vlcsnap-2013-12-22-12h24m07s210.png)  
トレイに両面テープではんこをくっつけただけのシンプルなつくりです。マジックテープ式ではんこの換装を容易にしたつもりでしたが、両面テープの粘着力が弱くてはんこを取るときにマジックテープもいっしょについてきてしまいます。本当は上から下に押せるように垂直にしたかったのですが、このドライブ壊れているのか仕様なのか水平でないと開閉してくれないのでしかたなく水平にしました。  水平にしていても稀に開かないので壊れていると思います。DVDドライブなのにDVD読めなくなったし。ダンボール工作マンなので土台はダンボールです。入手性良し加工性良し。高捨てられビリティ。  
![](https://dl.dropboxusercontent.com/u/7235224/IMGP1784.JPG)  
おあつらえ向きに細いはんこがあったので勝ちを確信したのですが。    
ejectコマンド自体はワンライナーでただejectを繰り返すだけのものです。  


# 結果  
[動作ムービー](http://www.youtube.com/watch?v=8fvHdj3VMU0)  
![](https://dl.dropboxusercontent.com/u/7235224/IMGP1783.JPG)  
上5つがejectで押印したもの、下1つが普通に押印したものです。押す力が弱いのと、はんこが重力でわずかに傾いてしまうせいで、まともに押印することができませんでした。ダンボールだけよりは良くなるかと思って装着したマスクは、ほとんど無駄な抵抗でした。スタンプ台を毎回挟まないといけないのがクソ面倒臭かった。。。インク内蔵型は必須だなと思いました。そうなると重くなるので垂直姿勢も必須になってきます。  

# 今後の課題
* どんな姿勢でも開閉する安いドライブをみつける
* シャチハタのようなインク内蔵型のスタンプをみつける
* 年賀状を送る相手を見つける
ゲーム制作16日目!!

#今日のメニュー
・リザルト画面について
・ポーズ画面について
・マウス従属オブジェクト消去
・敵について

#リザルト画面について
リザルト画面を整え、記録が表示されるようになりました。
sceneを作成する関数にゲームの結果の引数を与え、その値を表示します。
表示方法はゲーム中に表示する方法と同じく、画像として表示します。
この方法については[ゲーム制作13日目!!](http://qiita.com/picoslime/items/37830e79fe6ffd5fdc4f)を参照。

#ポーズ画面について
ゲーム中に一時停止が可能になりました。
ゲーム中に上ボタンを押すことでゲームを一時停止することができます。
一時停止状態からの復帰には開始時と同様に上ボタンを押します。

一時停止の画面は新しいシーンとして作成しました。
このシーンは、背景を透過しゲーム画面が見えるようにするために、
pushScene関数を使用して、元のゲーム画面にかぶせています。
他のシーンがかぶせられている間、もとのシーンの処理は進行しないため、
popScene関数を使用して、元のシーンを復帰させない限り、一時停止状態を維持することができます。

一時停止シーンの作成で注意した点は、
上ボタンの長押しによりシーンの切り替えが連続で起こらないようにすることです。
判定条件を単に「上ボタンが押されている」とすると、
上ボタンが押されシーンが移ったとしても、ボタンを離す前に新しいのシーンの判定が行われ、
すぐにもとのシーンに戻ってしまうことがあります。
これを防ぐため、一度上ボタンを離した上で、再びボタンを押さないとシーンは移り変わらないようになっています。
これは、「ボタンが押されていない」という条件によって真となるフラグを用意することによって実現しています。

以下がシーンのソースコードです。

```js
		var createPauseScene=function(){
			game.fps=24;
			var scene=new Scene;
			var backFlag=false;
			scene.backgroundColor='rgba(0,0,0,0.9)';
			scene.onenterframe=function(){
				if(!game.input.up)backFlag=true;
				if(backFlag&&game.input.up)game.popScene();
			}

			return scene;
		};
```

#マウス従属オブジェクトについて

すでに実装されていた機能、マウス従属オブジェクトは、使用しないことにしました。

#敵について

敵を実装しました。

##動き方について

とくに頭の良い追いかけ方はせず、ランダムに動きます。

ランダムの詳細について説明します。
オブジェクトの作成時に次のことが乱数によって決定されます。
・速度
・出発辺
・出発位置
・角度変化

敵は画面の見えない位置で生成され、画面中心に向かって進みます。
画面のどの辺から登場するかを決定する変数が「出発辺」です。
一辺のどの位置から登場するかが「出発位置」で決定されます。

敵オブジェクトは毎フレームごとに以下の処理を行います。
・角度変化に応じて、現在角度を修正。
・速度、現在角度に応じて、現在位置を修正。
・画面からはみ出たら消去。

敵オブジェクトは一定フレームごとに以下の処理を行います。
・乱数を使用して角度変化の変更。

以上の処理から、敵オブジェクトは、弧を描いて進みます。
この弧は一定歩数ごとに変化します。

##討伐について

敵は倒すことができます。
敵をマウスで10回クリックすると倒すことができます。
これは、ボタンの処理の応用で行うことができます。

Spriteオブジェクトはontouchstartというプロパティに関数を代入することで、
クリックされた時の処理を定義することができます。
このイベントが発生するごとにカウンタを進め、10回になった時点でオブジェクトの消去処理を行います。

消去時、簡単なエフェクトを用意しました。
小さくなりながら、透明になり、大きさが0になった時点でオブジェクトが消去されます。
これは、scaleX,scaleY,opacityの値を操作することで実現します。
エフェクト中、衝突判定が行われないようにします。

##敵の発生について

敵の発生はエネミーゲートとというオブジェクトを用意し管理します。
エネミーゲートは敵の管理と発生を行います。

敵の管理は配列を使用して行います。
要素数は有限です。

発生について説明します。
ゲーム開始時、一体の敵が作成されます。
敵が作成されるたびに、ゲートは次の敵が発生するまでの時間を決定します。
この時間は乱数を使用します。
具体的な計算式は次の通り。単位はフレームです。
（待ち時間）＝200+（0から1の乱数）×200-5×（子供の数）
これは、初項が一定時間の定数、第二項が乱数によって伸びる時間、第三項が成長による難易度変化です。
この数値は毎フレームデクリメントされ、0以下になると次の敵が発生します。
計算時、運悪く0以下の値が出た場合、即時次の敵が発生します。
ただし、配列に空きがない場合、敵の発生は行われません。

##todo
画面からはみ出したときに、敵がステータス画面よりも上に描画されてしまい、
見えては行けない部分が見えてしまう状況になっています。
以下のサイトを参考にさせていただき、
今日中に改善しようと思います。

Spriteの表示順について参考にさせていただくサイト。
[４１６番地【enchant.js】Nodeの表示順 v0.6対応版【Advent Calendar】](http://v416.hateblo.jp/entry/2012/12/14/003038)

#ソースコード
[GitHubからどうぞ](https://github.com/picoslime/SnakeGame/tree/master)

#今日の成果
[ゲーム画面へ飛びます](https://dl.dropboxusercontent.com/u/35809589/SnakeGameGirl/index.html)

#今日の感想
ベースだけ完成してて、
あとは追加機能とかつければいいだけのこの段階って一番おいしいですよね。
計画不足過ぎて楽しむ時間がすごく短いのが残念です。。。

あとgithubのreadmeなど全然整えていないのでなんとかせねば

どういうのが読みやすいのかわからないのですが、
改行がすごくメールチックですね。
ruby環境

Mac で homebrew がインストールされていること

### rbenv , ruby-build, その他インストール

brew install readline
brew install opessl
brew install ruby-build
brew install rbenv

### ~/.bashrcに以下を追加

```
if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi
```

### rubyのインストール

opensslのオプションを指定
```
CONFIGURE_OPTS="--with-readline-dir=`brew --prefix readline` --with-openssl-dir=`brew --prefix openssl` --with-iconv-dir=`brew --prefix libiconv`" rbenv install 2.1.2
```

 
### bundlerのインストール

rbenv exec gem install bundler
rbenv rehash
plenv や perl-build をさっくりアップデートする

こんばんは。いよいよ年の瀬という趣になってきましたが，みなさんはいかがおすごしでしょうか。わたしはまだ大掃除やっていないので面倒だなぁこまったなぁと思っているところです。

さて，みなさんは plenv や perl-build のアップデート (追随)，どうしていますか？
各ディレクトリに移動して `git pull` する，でしょうか。でも，ひとつひとつのディレクトリに移動して `git pull` するの，めんどうですね (ということにしてください)。

今回ご紹介する `plenv-update` を使えば，ワンステップで各プロダクトをアップデートできます。

# インストール

以下のようにして `~/.plenv/plugins/` 以下にプラグインをチェックアウトします。

```
$ git clone https://github.com/dayflower/plenv-update.git ~/.plenv/plugins/plenv-update
```

# 実行

あとは `plenv update` と入力するだけです。

```
$ plenv update
updating plenv
 |  Already on 'master'
 |  From git://github.com/tokuhirom/plenv
 |  * branch            master     -> FETCH_HEAD
 |  Already up-to-date.

updating perl-build
 |  Already on 'master'
 |  From git://github.com/tokuhirom/Perl-Build
 |  * branch            master     -> FETCH_HEAD
 |  Already up-to-date.

updating plenv-update
 |  Already on 'master'
 |  From https://github.com/dayflower/plenv-update
 |  * branch            master     -> FETCH_HEAD
 |  Already up-to-date.
```

ああら簡単，すべての plenv プロダクトがアップデートされました。
(ごめんなさい，手元だとすべてすでに最新版でした)

# 解説

plenv には rbenv と同等の plugin system があります。

そして，この plenv-update は [rbenv-update](https://github.com/rkh/rbenv-update) の<del>パクリ</del> plenv への移植です。

rbenv にはほかにも[沢山のプラグイン](https://github.com/sstephenson/rbenv/wiki/Plugins)があります。いくつかは plenv 用に移植できるかもしれませんね。
D言語パーフェクトガイド

あ、今回技術的な内容じゃないので、悪しからず。

# D言語パーフェクトガイドとは

本日、D言語パーフェクトガイドが発売されて、

なんと

__10周年！！！__

まで

あと365日になりました。

D言語パーフェクトガイドというのは、2004年12月22日に発売されたD言語に関する初の日本語書籍です。

ソースは[Amazon](http://www.amazon.co.jp/gp/product/4774122084/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4774122084&linkCode=as2&tag=s0bdab-22)。

> 純粋なプログラミング言語として一部で注目を集めている

などと、なんかよくわからないけど、今となってはある意味的を射ている内容の紹介になっていますが…

この書籍、現在D言語erの間では焚書指定扱いとなっています。

なぜでしょうか？

今回は、この理由について、歴史的経緯を交えてちょっとだけ解説します。

# 2004年のD言語

D言語のバージョン1がリリースされたのは、2007年の1月3日です。
つまり、2004年というのは、D言語が様々な試行と検証を繰り返していた時期でした。
そんな時期にサードパーティによって発売された書籍は、当然、当時のD言語についてしか語ることはできません。

当時のD言語はどんなものだったのでしょう。[Changelog](http://www.digitalmars.com/d/1.0/changelog1.html)をたどってみると

おぉ…  [D 0.100](http://www.digitalmars.com/d/1.0/changelog1.html#new0100) がリリースされたのも2004年ですね。
ひょっとして、0.99→1.00を予想して書籍を書き始めた？いやまさかね。発売12月だし。

D0.99→D0.100 は誰もがズッコケました。(しかも変更内容がただのバグフィックスだけ)
いい思い出です。

D言語パーフェクトガイド発売前後の変更内容を追っていくと

* デバッグ情報の追加
* \__FILE__, \__LINE__, などの追加
* []内の$追加
* Cスタイルキャストの廃止
* static ifの追加

などインパクトの大きい変更が続いています。

今でこそ1年に2～3回ほどしかバージョンアップのないD言語も、当時は1週間～1ヶ月程度の周期でバージョンアップを繰り返し、そのたびにいままで動いていたコードが使えなくなる「破壊的変更」がありました。

そのような状況で出た書籍です。サンプルコードもすぐに使えないものが出てきます。
D言語のバージョン1が出る頃にはだいぶ言語の仕様が変わってしまい、ほとんど使いものにならない書籍となってしまいます。

# 2013年のD言語

そんなD言語もいまや100以上のリリースを繰り返し、D 2.064がリリースされています。
メジャーバージョンも1のリリースを経て2へ。D2となり、安定期へと入った今ではDバージョン1と比較してもなお大きく仕様に改善がなされ、2004年当時とはもはや別言語といっても差し支えない程度の進化がありました。

今年、日本語のD言語書籍として、新しく[TDPL(邦訳)](http://www.amazon.co.jp/gp/product/B00G9QJ74O/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=B00G9QJ74O&linkCode=as2&tag=s0bdab-22)が発売されました。TDPLっていうのは、「The D Programming Language」の略です。邦訳版では「プログラミング言語D」として販売されています。
これは、D言語のオフィシャルな書籍の邦訳であり、著者はD言語そのものの筆頭開発者の一人、Andrei Alexandrescu氏で、翻訳にあたってD言語のコントリビューターである @repeatedly さんや @9rnsr さんが関わっています。
現状のD言語に留まらず、将来的な仕様、仕様の理由についても述べた良書です。

TDPLの発売を機に、D言語パーフェクトガイドは完全にその役目を終えたと言っていいでしょう。

D言語パーフェクトガイドは、もはや書籍の冒頭にある"Hello, world"すらコンパイルが通らず、書籍の随所に突っ込みどころが散見されます。
もっとも、D言語の芯のようなものは残っていて、当時から続くコンセプトのようなものはちゃんと記載されているので侮れないところではありますが。しかしながら、今となっては、これを解説しなければD言語の解説書としてはパーフェクトじゃない！といった部分も多々見受けられます。
一度、現状のDと対比してみると面白そうですね。

とまぁ、そのような状況から、D言語パーフェクトガイドはその名に恥じる、全然パーフェクトじゃないダメ書籍という烙印が押されてしまっています。
いわゆる黒歴史扱いで、「パーフェクトガイド」という名前だけでシュールなネタになってしまうような風潮もあったりします。
(D言語パーフェクトガイドの筆者様にとっては大変不名誉かもしれませんが…。) [参考1](https://twitter.com/mono_shoo/status/414630090761187330) [参考2](https://twitter.com/Rayerd/status/414684300294909952)


今後、D言語の書籍が出たとしても、やはり今後バージョンアップしていく過程で破壊的変更にさらされ、情報は鮮度を失うことでしょう(おそらくTDPLであっても)。しかしながら、それを恐れることなく書籍が発売され、D言語の情報源が増えることは歓迎すべきことではないかと思います。
情報源の不足は、やはりD言語に足を踏み入れる人にとってまずぶち当たる壁ですからね。

# 現在のD言語の情報源

ちなみに、現状WEBにてD言語の情報を当たるには、以下の様な手段があります。

* [公式ページ](http://dlang.org) [和訳](http://www.kmonos.net/alang/d/)
* [d-manual](https://github.com/k3kaimu/d-manual)
* [Qiita#dlang](http://qiita.com/tags/dlang)
* [D言語友の会(記事)](http://dusers.dip.jp/modules/wiki/?Articles)

それと、ツイッターで「D言語」とか「#dlang」とか含めて発言すれば、高確率で返信が飛んでくるので便利です。
[D言語はオープンソースで開発されている](https://github.com/D-Programming-Language)ので、ソースを読んでみるのも一興ですね
ShellScript 内での並列処理

ShellScript 内で並列処理をする方法を調べたのでメモ

以下の例は、複数IPアドレスへのPingを並列処理している

`exec_ping()` はPingを実施する関数（Pingが成功する迄３回実施している）
`seq -f "192.168.100.%g" 1 10` は対象IPアドレス（192.168.100.1 ~ 10）

```bash
#!/bin/bash

exec_ping(){
        IP_ADDR=$1

        ping -c 1 $IP_ADDR > /dev/null 2>&1 || sleep 1 ; \
        ping -c 1 $IP_ADDR > /dev/null 2>&1 || sleep 1 ; \
        ping -c 1 $IP_ADDR > /dev/null 2>&1

        echo $IP_ADDR $?
}

export -f exec_ping

seq -f "192.168.100.%g" 1 10 | xargs -n 1 -P 10 -I % bash -c "exec_ping %"
```

`xargs -n 1 -P 10 -I % bash -c "exec_ping %"` 部分で `exec_ping()` を１０プロセス同時実行

環境に合わせて `exec_ping()` 部分を変更することで上手く動作するはず
aタグのdownload属性

chromeではaタグの属性としてdownloadが使えるらしい
#基本

```html:使い方
<a href="image.png" download="icon">ダウンロード</a>
```

こうすると、hrefで指定した`image.png`がdownload属性で指定したファイル名`icon`でダウンロードされる。

#応用
chrome拡張機能などでプログラムが生成したテキストファイルをダウンロードする方法
（ユーザーデータのエクスポートなどに使えそう）
まず、土台となるHTMLソースはこちら。

```html:app.html
<a href="#" download="myData" id="export">エクスポート</a>
```

これに対して以下のJavaScriptを実行する。

```js:app.js
var txt = "任意のテキスト";
var blob = new Blob([ txt ], { type: "text/plain" });
var url = window.webkitURL.createObjectURL(blob);
document.getElementById("export").href = url;
```

これで、ユーザーがリンクをクリックしたときにテキストファイル`myData.txt`のダウンロードが始まる。
symfony2でGoogleの画面情報取得して表示

symfony2でGoogleの情報取得して表示

http://issei-m.hatenablog.jp/entry/2013/06/14/130030

上記を参考に、
composer使って、
Buzz\Browserを取得して実行


以下を、使いたいPJのディレクトリで実行するとインストールされる
```
composer require kriswallsmith/Buzz:dev-master
```

あとは、上記のリンク通りで、

ソースは以下にした

```
public function googleAction()
    {
        $browser = $this->get('buzz.browser'); # ContainerInterface::get()

        # グーグル
        $response = $browser->get('https://www.google.co.jp/');
        if (!$response->isSuccessful()) {
            throw new HttpException($response->getReasonPhrase(), $response->getStatusCode());
        }

        $content = $response->getContent(); # 診断くんの HTML ソース
        echo $content;
    }
```
C++11: lockせずにデータ競合を防ぐ

データ競合(data-race)を引き起こす典型例:

```cpp
#include <iostream>
#include <thread>
using namespace std;

int value = 0;

void increment(int n) {
    for (int i = 0; i < n; ++i) {
        value = value + 1;
    }
}

void decrement(int n) {
    for (int i = 0; i < n; ++i) {
        value = value - 1;
    }
}

int main() {
    const int N = 100000;
    thread th0(&increment, N);
    thread th1(&decrement, N);
    th0.join(); th1.join();
    cout << value << endl; // はたして0か!?
}
```

複数のスレッドがひとつのデータを読み書きするときは排他制御が必要になります。

```cpp
#include <iostream>
#include <thread>
#include <mutex>
using namespace std;

int value = 0;

void increment(int n, mutex& mtx) {
    for (int i = 0; i < n; ++i) {
        lock_guard<mutex> guard(mtx); // こいつが有効な間は他のスレッドに邪魔されない
        value = value + 1;
    }
}

void decrement(int n, mutex& mtx) {
    for (int i = 0; i < n; ++i) {
        lock_guard<mutex> guard(mtx); // こいつが有効な間は他のスレッドに邪魔されない
        value = value - 1;
    }
}

int main() {
    const int N = 100000;
    mutex mtx;
    thread th0(&increment, N, ref(mtx));
    thread th1(&decrement, N, ref(mtx));
    th0.join(); th1.join();
    cout << value << endl; // はたして0か!?
}
```
多くのシチュエーションではこれでいいのですが、`mutex`による排他制御はかなりコスト高です。
排他しなければならない期間が短く、しかもさほどに競合しないのであれば、

「書く前に現在値を読み、以前と変わりないなら変更する。
　変わってたら(途中で誰かが変更したとみなして)書くのをあきらめる」

...ってことを行えばいい。で、あきらめたときは再度書くのを試みるという、なんとも楽観的な戦術。
そのためには上記「...」がアトミックに(途中割り込まれることなく)行われにゃなりません。
それを実現するのが `atomic<T>::compare_exchange_weak`

```cpp
#include <iostream>
#include <thread>
#include <atomic>
using namespace std;

atomic<int> value = 0;

/* bool atomic<T>::compare_exchange_weak(T& expected, T desired 
 * 現在の値が expected に等しければ desired を書いて true を返す
 * さもなくば expected を現在の値に書き換えて false を返す
 */

void increment(int n) {
    for (int i = 0; i < n; ++i) {
        int expected = value.load();
        int desired;
        do {
            desired = expected + 1;
        } while ( !value.compare_exchange_weak(expected, desired));
    }
}

void decrement(int n) {
    for (int i = 0; i < n; ++i) {
        int expected = value.load();
        int desired;
        do {
            desired = expected - 1;
        } while (!value.compare_exchange_weak(expected, desired));
    }
}

int main() {
    const int N = 100000;
    thread th0(&increment, N);
    thread th1(&decrement, N);
    th0.join(); th1.join();
    cout << value << endl; // はたして0か!?
}
```
MacにqtbindingとRuguiをインストールする


#概要

Mac OS X MavericksでQtをRubyから実行できるqtbindingsをインストールする方法のメモ。
qt4とqtbindingsが動くようになったことで、QtやGTK+アプリテンプレートをRailsライクに生成できるRuguiも動くようになった。
Mac/Win/Linuxで共通で動作するRuby GUI環境にはいくつかあるけれど、Qtbindingsか後述のShoesが有望そう。
#前提条件

以下が準備されていること。

* Mac OS X Maverics (でもMount Lionとかでもたぶん大丈夫)
* XCode5 (4でもたぶん大丈夫)
* homebrew
*  rbenv

(Mac Portsやrvmについては未検証)

ネット上の古い情報にいろいろ惑わされてはまってしまったのだけど、実際にはgccは4.2でなくてもいいし、rubyのバージョンは1.9.3でなくても2.0で動いた。

#インストール方法
## qtbindings

参考: 
* https://gist.github.com/reisub/5549359
* http://www.anagix.com/gijutsu-memo/gijutsu-sapoto-1/macosxlionnirbenvderuby193toqtbindings

* `brew install qt`

これでQt4 (4.8.5) がインストールされる。Qtは最近5が出てスマホ対応もできたらしいので楽しみ。

* `brew install cmake`

最大のポイントは、rubyをrbenv(またはrvm)でオプション付きでインストールすること。

* `RUBY_CONFIGURE_OPTS=--enable-shared rbenv install 2.0.0-p353 --keep` 

自分は最新のp353にしたけど、1.9あたりまでいけるのではないか。

以下のいずれかを実行して、オプション付きでコンパイルされたrubyが使用できるようにする。
* `rbenv global 2.0.0-p353` — グローバルに使用する場合
*  `echo “2.0.0-p353” > .ruby-version` — 現在のディレクトリ以下のみで使用する場合

* `gem install qtbindings`

以上でインストールは完了。以下のファイルを作って`ruby helloworld.rb`を実行してウィンドウが表示されたら成功。

``` helloworld.rb
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
$VERBOSE = true; $:.unshift File.dirname($0)

require 'Qt'

a = Qt::Application.new(ARGV)
hello = Qt::PushButton.new('Hello World!', nil)
hello.resize(100, 30)
hello.show()
a.exec()
```
![qt.png](https://qiita-image-store.s3.amazonaws.com/0/20266/b7e17a5e-8e8a-8aac-9386-6150eb218fe3.png)

お楽しみ: https://github.com/ryanmelt/qtbindings/tree/master/examples をダウンロードして`ruby run_all.rb`を実行すればデモがすべて実行される。

#rugui
https://github.com/rugui/rugui
ruguiはRubyのGUIアプリをRailsっぽく生成できる。GTK+とQtとrubygamesに対応していて、Qtは結局qtbindings経由で呼び出されている。
基本的に https://github.com/rugui/rugui のReadmeのとおりに実行すればruguiは使用できるようになる (rubygameだけはまだ動かせてない)。
Qtbindingsを実行できるようになっていれば、以下の要領でQt4アプリを生成・実行できる(デフォルトはGTK+)。

* `rugui -a qt <アプリ名>`
* `cd <アプリ名>`
* `bundle install —path bundle/vendor`

`bundle install`に`—path bundle/vendor`を付けているのは、rbenvのgemに余分なものを追加したくないので。これを行った場合はrakeやrailsの前に`bundle exec`を必ず付ける必要がある。

これで`bundle exec rake run`を実行してウィンドウが表示されれば成功。
![rugui.png](https://qiita-image-store.s3.amazonaws.com/0/20266/b4823af4-63a9-d0a0-4eba-30cd37e34b7b.png)

#おまけ: shoesrb

Shoes (http://shoesrb.com/) というGUIは機能は少ない代りにかなり軽くてよさそう。ただしshoes3 (https://github.com/shoes/shoes) は更新が止まっていて、JRubyベースのshoes4 (https://github.com/shoes/shoes4) はまだ作り中らしい。
Shoesにはスタンドアロンパッケージを作成する機能があるらしいのだけど最近のMac版は生成できなくなっているらしい...残念。
Mroonga/GroongaのMeCabトークナイザの全文検索性能について

# はじめに

Mroonga/Groongaでは、トークナイザにより文章が分割されて、分割されたトークン（語句）で転置インデックスが作成されます。

Mroonga/Groongaでは、様々な環境に柔軟に対応できるよう、多数の[トークナイザ](http://mroonga.org/ja/docs/userguide/storage.html#how-to-specify-the-parser-for-full-text-search)が用意されています。

トークナイザの種別に応じて、分割ルールが異なり、転置インデックスの語句のサイズや、種別数および出現回数が異なります。

[Ngramのサイズに応じたMroonga/Groongaの全文検索性能について](http://createfield.com/Ngram%E3%81%AE%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%AB%E5%BF%9C%E3%81%98%E3%81%9FMroonga/Groonga%E3%81%AE%E5%85%A8%E6%96%87%E6%A4%9C%E7%B4%A2%E6%80%A7%E8%83%BD%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)では、NgramのNのサイズが大きいほど、良好な検索性能が得られることが判りました。特にTokenUnigramでは、顕著に検索性能が劣化しました。

MeCabトークナイザでは、形態素解析用辞書に応じて、様々なサイズで文章が分かち書きされます。たとえば、「今日は雨です。」という文章は、「今日/は/雨/です/。」と、分かち書きされます。「は」等の助詞は、文章中の出現頻度が極めて高く、データベース規模が大きくなるにつれて、語句の出現回数が爆発的に増えます。

このような助詞等の頻出語句は、（たいして）検索に寄与をしないにも関わらず、検索性能に大きな影響を与えます。

そこで、このような頻出語句を除去させた場合のMeCabトークナイザの全文検索性能と、頻出語句を除去させない場合のMeCabトークナイザの全文検索性能およびNgramトークナイザの全文検索性能を比較してみます。

[続きを読む](http://createfield.com/Mroonga/Groonga%E3%81%AEMeCab%E3%83%88%E3%83%BC%E3%82%AF%E3%83%8A%E3%82%A4%E3%82%B6%E3%81%AE%E5%85%A8%E6%96%87%E6%A4%9C%E7%B4%A2%E6%80%A7%E8%83%BD%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6 "Mroonga/GroongaのMeCabトークナイザの全文検索性能について") 

![mecab_pe.png](https://qiita-image-store.s3.amazonaws.com/0/33156/5ba384aa-16d7-2e5c-2fbb-eac273c15bf0.png)
2要素認証でもhomesickが使いたい！


dotfiles（`.vimrc`とか`.bash_profile`とか）を複数マシン間で同期するのに便利なのが[**homesick**](https://github.com/technicalpickles/homesick)というgem．
これを2要素認証を有効にしたGitHubアカウントでも使えるようにしたいメモです．
（homesickについては「[GitHub と homesick を使って複数 Mac 間で dotfiles を同期する ｜ Developers.IO](http://dev.classmethod.jp/etc/github-homesick-dotfiles/)」が参考になりました）

# 手順

やり方は「[GitHub - hubを2-factor authentication（2要素認証）有効でも使いたい - Qiita [キータ]](http://qiita.com/izumin5210/items/28dfd5fa9e03fb68c042)」と似たような感じ．ていうかほぼ同じようなもん．

ここ（[**New Personal Access Token**](https://github.com/settings/tokens/new)）をこうして…
![New Personal Access Token](https://qiita-image-store.s3.amazonaws.com/0/14845/c8539e09-162e-8dbd-d3d7-0c248ec87ab4.png)

こんな感じになるのでトークンをコピーして…
![Personal Access Tokens](https://qiita-image-store.s3.amazonaws.com/0/14845/9a8939e8-c233-f7aa-8ef3-8013d77171da.png)

パスワードの代わりにトークンを貼り付ければOK．
![homesick clone](https://qiita-image-store.s3.amazonaws.com/0/14845/d530df58-2afc-2fb3-889b-6e33e10c75cf.png)

たぶん他のGitHubの認証が必要なソフトとかでも，パスワードの代わりにPersonal Access Tokenを使えばいいんだと思います．
詳しいことはよく知らないですが…．
LaTeX Beamer + bibliography

Beamer で bibliography を使おうとしたら、色々とつまずいたので覚書。

## dvipdfm(x) を使っていると "`beamericonarticle.xbb' not found" といわれる

dvipdfmx (or dvipdfm) を使っている場合、```\thebibliography``` のところで次のようなエラーが出ます。

```text
      ./slide.bbl:1: LaTeX Error: File `beamericonarticle.xbb' not found. Use -shell-
      escape option to generate automatically.
       :
       :
      l.1 \begin{thebibliography}{1}

      ?
      ./slide.bbl:1: LaTeX Error: Cannot determine size of graphic in beamericonartic
      le.xbb (no BoundingBox).
       :
       :
      Transcript written on slide.log.
      *** Errors detected while running LaTeX on slide.tex:
      ./slide.bbl:1: LaTeX Error: File `beamericonarticle.xbb' not found. Use -shell-
      ./slide.bbl:1: LaTeX Error: Cannot determine size of graphic in beamericonartic
      ./slide.bbl:1: Emergency stop.
```

見ての通り、```beamericonarticle.xbb``` が存在しないため怒られています。実は各参考文献の頭に文献アイコン ```beamericonarticle.pdf``` が自動で埋め込まれるのですが、そのバウンディング・ボックスの情報を保存する ```.xbb``` ファイルがデフォルトでは用意されていません。（次の図は、正しくアイコンを埋め込めた場合のスクリーンショットです。）

![ss-beamericon-20131222.png](https://qiita-image-store.s3.amazonaws.com/0/2251/622c3c37-3712-22ea-5a32-530a26d03a8e.png "正しく表示した場合の参考文献リスト")

これを直すには、```.xbb``` ファイル（もしくは ```.bb``` ファイル）を用意してやります。Debian の場合であれば、問題の PDF ファイルは ```/usr/share/texmf/tex/latex/beamer/base/art/beamericonbook.20.pdf``` にあります。

```shell-session
uda@host:~/slide $ extractbb -O /usr/share/texmf/tex/latex/beamer/base/art/beamericonbook.20.pdf > beamericonbook.xbb
```

```-O``` オプションを使って tex ファイルと同じディレクトリに ```.xbb``` ファイルを書き出しています。書き込み権限があれば、直接 ```/usr/share/texmf/tex/latex/beamer/base/art/``` 以下に ```.xbb``` ファイルを出力することもできます。

\# ```ebb beamericonbook.20.pdf``` としてできた ```beamericonbook.bb``` ファイルの拡張子を変更して ```beamericonbook.xbb``` にすればいいなんて言っている人もいましたが…… ちゃんと dvipdfmx の場合は ```extractbb``` で作った ```.xbb``` ファイルを、dvipdfm の場合は ```ebb``` で作った ```.bb``` ファイルを使った方が良いでしょう。

## ```\cite{...}``` の行で "Undefined control sequence" といわれる

次に、```\cite``` したときに出るエラーです。

```text
./section8.tex:7: Undefined control sequence.
\beamer@sort #1#2->\long \def \beamer@todo 
                                           {#1}\def \beamer@ospec {}\beamer@...
l.7 \cite{book:hoge:fuga}
                           ,
? 
```

このエラーは ```\usepackage{cite}``` との競合（？）により出るようです。```cite``` パッケージを使わないようにすると解消します。
数を作る(2013.3.18の過去問)

1日1個 @nabetani さんの作った問題を解くAdventCalendarの22日目です。明後日にイブを控えて、今年作られた我が家の<a href="http://blog.livedoor.jp/o0_hamuhamu_0o/archives/7009905.html">クリスマスケーキも数えきれないほど</a>の数になりました。もうまもなくですね！

今日の問題は http://nabetani.sakura.ne.jp/hena/ord9nummake/ にあります。

```hs
module Doukaku.Numbers (solve) where
import Data.List (sort)
solve :: String -> String
solve input = let ns' = drop (read order - 1) . uniq . sort $ ds
              in if null ns' then "-" else head ns'
  where
    (order, _:is) = break (== ':') input
    is' = concatMap inflate . zip is $ [(0 :: Int)..]
      where
        inflate (d, n)
          | d `elem` "69" = [('6', n), ('9', n)]
          | otherwise = [(d, n)]
    ds = [[d1, d2, d3, d4] | (d1, n1) <- is', d1 /= '0',
                             (d2, n2) <- is', n2 /= n1,
                             (d3, n3) <- is', n3 `notElem` [n1, n2],
                             (d4, n4) <- is', n4 `notElem` [n1, n2, n3]]
    uniq (x:y:ys) = (if x == y then id else (x :)) . uniq $ (y:ys)
    uniq xs = xs
```

内包表記で順列を作り、`uniq`と`sort`して指定された順のカードを返します。`6`と`9`の扱いはカードにID値をふったので特に苦労もなく。

http://qiita.com/items/7c46e8409c456e8fabd1 に他の方の回答もありますので、見ると参考になるでしょう。
hubを2-factor authentication（2要素認証）有効でも使いたい

**追記（2015/05/13）**
hubさんが2FAに標準対応したようです（たぶん1年以上前？）．
![image](https://qiita-image-store.s3.amazonaws.com/0/14845/8d95ea66-dc37-4b48-631e-c0f858f165cc.png)

---

GitHubをコマンドラインから操作するための便利ツール[**hub**](https://github.com/github/hub)．
これをGitHubで2要素認証を有効化している状態でも使えるようにする．
（hubの使い方については`README.md`もしくは「[GitHubユーザーのためのhubコマンド - Qiita [キータ]](http://qiita.com/yaotti/items/a4a7f3f9a38d7d3415e3)」がわかりやすいです）

# 手順
## アクセストークン生成
「[**New Personal Access Token**](https://github.com/settings/tokens/new)」にアクセスし，新しいアクセストークンを生成する．
`Token description`には自分がわかるような説明を書いておく．

![Create a new Personal Access Token](https://qiita-image-store.s3.amazonaws.com/0/14845/9a500758-028a-1f75-c705-4ab3103a6dfb.png)

`Create Token`をクリックしたらアクセストークンが生成され，下画像のような感じで表示されるのでコピーしておく．
![Personal Access Tokens](https://qiita-image-store.s3.amazonaws.com/0/14845/4f97b8c5-7c01-09a4-93d2-0a4c741610ac.png)


## hubの設定

`~/.config/`に`hub`というファイルを作成し，以下のようにyaml形式で保存する．
`ACCESS_TOKEN`は先ほど生成しコピーした文字列，`USERNAME`にはGitHubでのアカウント名（僕なら`izumin5210`）に置き換え．

``` yaml:~/.config/hub
—--
github.com:
- oauth_token: ACCESS_TOKEN
  user: USERNAME
```

これで2要素認証が有効でも問題なくhubが使える．ちょーべんり．

# 参考
- [authentication fails with two factor auth · Issue #412 · github/hub](https://github.com/github/hub/issues/412)
Bootstrapでメガメニューを作成する。



##準備

yammを使用してメガメニューを作成していきます。
まずはgithubよりcssファイルををダウンロード。

・<a href="https://github.com/geedmo/yamm3" title="geedmo/yamm3">geedmo/yamm3</a>



##実装

1,ヘッダーでyamm.cssを読みこませる。

```html
<link rel="stylesheet" type="text/css" href="css/yamm.css" media="all">
```

2,jsを読み込ませる。


```html
<script type="text/javascript">
    $(document).on('click', '.yamm .dropdown-menu', function(e) {
                e.stopPropagation()
    })
</script>
```

3,メニュー作成

```html
<nav class="navbar navbar-inverse navbar-fixed-top yamm" role="navigation">
    <div class="container">
        <div class="navbar-header">
            <a class="navbar-brand" href="/">サイト名</a>
        </div>
        <ul class="nav navbar-nav">
            <li class="dropdown">
                <a href="#" class="dropdown-toggle" data-toggle="dropdown">メニュー1</a>
                <ul class="dropdown-menu">
                    <li>
                        <div class="yamm-content">
                            <div class="row">
                                'コンテンツ中身'
                            </div>
                        </div>
                    </li>
                </ul>
            </li>
        </ul>
    </div>
</nav>

```
RubyでただのArrayだと思ってデータを追加したつもりなのに気がついたら全文検索出来ていた・・的なものを作った


![](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tuto0621/20131222/20131222153820_original.png?1387694423)

Array#grepよりも高速に全文検索出来る配列を作ってみました。

[[本文へ]](http://ongaeshi.hatenablog.com/entry/ruby-grn-array)
MongoDB Tips findOrCreate、存在すれば何もせず、存在しなければ insert する

タバコを辞めよう辞めようと思って、いまだに禁煙が３時間も続かない今日この頃

先日、
「あるドキュメントを探し、既存のドキュメントが存在すれば何もせず、存在しない場合に insert を実行する」
ということをアトミックにやる必要が出てきた。

update コマンドの upsert オプションでできそうだ！
と思ったが無理っぽい。
「あるドキュメントを探し、既存のドキュメントが存在すれば update を行ない、存在しない場合に insert を実行する」

findAndModify というものがあり、これを使えばできそうだ！
ってことで、このコマンドの挙動を調べる。

## やりたいこと
「あるドキュメントを探し、既存のドキュメントが存在すれば何もせず、存在しない場合に insert を実行する」

## ドキュメント
http://docs.mongodb.org/manual/reference/command/findAndModify/
http://mongodb.github.io/node-mongodb-native/api-generated/collection.html#findandmodify

## findAndModify
本家のドキュメントがこちら
http://docs.mongodb.org/manual/reference/command/findAndModify/

## オチ

いろいろ、ドキュメント読んでみたが無理そうだった。
そして、英語で「insert if not exists mongodb」とググってみたら、
一発で解決した笑

「insert if not exists mongodb」、「findOrCreate」とかで検索すると良かったみたいです。

http://stackoverflow.com/questions/16358857/mongodb-atomic-findorcreate-findone-insert-if-nonexistent-but-do-not-update

### $setOnInsert オペレータ
http://docs.mongodb.org/manual/reference/operator/update/setOnInsert/#op._S_setOnInsert

基本的にこのオペレータは, findAndModify、update コマンドと一緒に使用する.
$setOnInsert オペレータにセットした値は、upsert のときだけ更新される.
というシロモノである.

#### 使用例
本の管理用コレクションに例を取ってやってみる.

```
> show collections;
> db.books.insert({ "name": "basic_of_C++", "price": "200", "num": "20"} );
> db.books.insert({ "name": "basic_of_PHP", "price": "100", "num": "10"} );
> db.books.find();
{ "_id" : ObjectId("52b692c03823dba66d0fcd95"), "name" : "basic_of_C++", "price" : "200", "num" : "20" }
{ "_id" : ObjectId("52b692ce3823dba66d0fcd96"), "name" : "basic_of_PHP", "price" : "100", "num" : "10" }
```

ここで, ```basic_of_Perl``` という本を追加してみる.

```
> db.books.update({ "name": "basic_of_Perl" }, { $setOnInsert: {"name": "basic_of_Perl", "price": "100", "num": "10"} }, true, false);
> db.books.find();
{ "_id" : ObjectId("52b692c03823dba66d0fcd95"), "name" : "basic_of_C++", "price" : "200", "num" : "20" }
{ "_id" : ObjectId("52b692ce3823dba66d0fcd96"), "name" : "basic_of_PHP", "price" : "100", "num" : "10" }
{ "_id" : ObjectId("52b6945e626624bd1b04a678"), "name" : "basic_of_Perl", "num" : "10", "price" : "100" }
```

追加できた.
続いて, もう一度, basic_of_Perl という本を追加してみる.
basic_of_Perl という本は既に存在しているので, 追加されないはずである.

```
> db.books.update({ "name": "basic_of_Perl" }, { $setOnInsert: {"name": "basic_of_Perl", "price": "100", "num": "100000"} }, true, false);
> db.books.find();
{ "_id" : ObjectId("52b692c03823dba66d0fcd95"), "name" : "basic_of_C++", "price" : "200", "num" : "20" }
{ "_id" : ObjectId("52b692ce3823dba66d0fcd96"), "name" : "basic_of_PHP", "price" : "100", "num" : "10" }
{ "_id" : ObjectId("52b6945e626624bd1b04a678"), "name" : "basic_of_Perl", "num" : "10", "price" : "100" }
```

追加されていない.
期待通りの結果である.
Pythonメモ：pipコマンドが使えないとき

参考ページ
http://d.hatena.ne.jp/rudi/20110107/1294409385

なお、easy_installすら使えない場合は[これ](http://qiita.com/juniskw/items/10a4155dbd0864fa40e4)を参考にするといいかも
iTerm にフォーカスを移動するショートカットキーを設定する

## iTerm2 標準のホットキー設定との違い

自分はターミナルをホットキーで必要な時にさっと呼び出して使う Visor 的な使い方が好きなので、これまで iTerm2 に標準で用意されている、"Show/hide iTerm2 with a system-wide hotkey" のオプションを利用してきました。

しかし、OS X Mavericks になってからこの機能がうまく動かず、他のフルスクリーンアプリを表示させている状態で iTerm を呼び出すと、Dockが被って表示されてしまいます。

![iterm_dock.jpg](https://qiita-image-store.s3.amazonaws.com/0/15706/b775e6dc-571d-e830-0939-e9c5d6f8bd0b.jpeg)

また、Mavericks ではマルチディスプレイ環境でのフルスクリーン機能が使いやすくなったので、iTerm もフルスクリーンモードで動かすようにしたほうが何かと都合が良いように思うようになりました（iTerm標準のホットキー設定でフルスクリーン前面表示させた状態で別スクリーンのウィンドウを操作しようとするとiTermの画面が消えてしまう）。

iTerm をフルスクリーンモードにして、ホットキーで iTerm にフォーカスを移動させることができれば基本的に同じ使い方ができそうだったので、Automator と AppleScript を使って設定してみました。大した事では無いですが作業メモとして書いておきます。


## 設定方法

Automater で iTerm2 にフォーカスを当てる AppleScript をサービスとして登録し、ショートカットキーから呼び出せるように設定します。

### Automater でサービスを登録

1. 新規作成時に聞かれる書類の種類を選択するダイアログで「サービス」を選択
2. サイドバーから「AppleScriptを実行」をドラッグ
3. `(* Your script goes here *)` の部分を `tell application "iTerm" to activate` に置き換える
4. 適当な名前を付けて保存する（ここでは `Activate iTerm` ） 

![Automator_Activate_iTerm.jpg](https://qiita-image-store.s3.amazonaws.com/0/15706/10e18d9a-3b8f-e4bb-a788-95d6d2446777.jpeg)

### ショートカットキー設定

1. 「システム環境設定」→「キーボード」の「ショートカット」タブで、「サービス」を選択
2. リストの一番下辺りに先ほど作成した `Activate iTerm` のサービスが追加されているので、そこにチェックをいれて好みのショートカットを設定する

![Keyboard_Shortcut.jpg](https://qiita-image-store.s3.amazonaws.com/0/15706/af1809bc-b85b-abbe-a510-f6349e099438.jpeg)

iTerm2標準のホットキー設定では、 `Alt + Space` を割り当てていたのですが、システム環境設定のショートカット設定では `Alt + Space` を設定してもなぜかうまく機能してくれませんでした。なので私はとりあえず適当に競合しない `Cmd + Ctrl + ;` を設定しました。

## 使用方法

iTerm 以外のウィンドウにフォーカスしている状態で設定したホットキーを押すと iTerm にフォーカスが移動します。フルスクリーンモードにしている場合でもちゃんと移動します。

iTerm で作業したあと、元のウィンドウにフォーカスを戻したい場合は、 Cmd + Tab を一回押すなりすれば良いです。
JavaCCをインストールしてみました

## はじめに

JavaCCのインストール作業について少し書きます。使用したOSはOSX 10.9です。

## Download

[こちら][1]から圧縮ファイルをダウンロードします。

## Install

インストールの流れは次のようになります。

- コマンドラインの実行
- スクリプトファイル(/usr/local/javacc/bin/javacc)の編集

順番に見ていきます。
まずはコマンドラインです。

``` bash
$ unzip javacc-6.0.zip
$ mkdir /usr/local/javacc/lib
$ cp ./javacc-6.0/bin/lib/javacc.jar /usr/local/javacc/lib/
$ mkdir /usr/local/javacc/bin
$ touch /usr/local/javacc/bin/javacc
$ chmod u+x /usr/local/javacc/bin/javacc
$ ln -s /usr/local/javacc/bin/javacc /usr/local/bin/javacc
```

次にスクリプトファイル(/usr/local/javacc/bin/javacc)です。

``` bash
#!/bin/bash
# javacc

cmd_path="$(readlink -n $0)"
javacc_root="$(dirname "$(dirname "$cmd_path")")"

CLASSPATH="$javacc_root/lib/javacc.jar"
export CLASSPATH

java javacc "$@"
```

## 使い方

使い方は「ふつうのコンパイラをつくろう」に詳しく記載されています。私は「ふつうのコンパイラをつくろう」を参照しました。[こちら][2]にも使い方が記載されているようです。こちらはインターネットで閲覧できます。

[1]: https://javacc.java.net/
[2]: http://cis.k.hosei.ac.jp/~nakata/lectureCompiler/JavaCC
Star Wars Intro in Vim


Created by [Damian Conway](https://github.com/thoughtstream)

Download from [SWTC.vim](https://github.com/shinokada/SWTC.vim)

## Installation

Using NeoBundle, add the following to your .vimrc

    NeoBundle 'shinokada/SWTC.vim'

When you save .vimrc, NeoBundle is clever enough to download SWTC.vim.

## Prepare

Use set nonumber in your .vimrc or from normal mode input

    :set nonumber

Check your pwd

    :pwd

## To use

Then use this to start.

    # if your pwd is SWTC.vim
    :SWTC ./intro.swtc
    # if somewhere else
    :SWTC /path/to/.vim/bundle/SWTC.vim/intro.swtc

## Modify

Modify intro.swtc.
zsh で編集子を使ってグロブ展開とかをその場で編集する

zsh には編集子(modifiers)というのがある。
こいつを使うと、グロブ展開(ワイルドカード展開)の結果をいろいろと編集できるようになる。

### 簡単な例

とりあえず例を見てもらったほうが早いと思う。

```zsh
# 今このディレクトリにいる
% pwd
/home/mollifier/tmp

# ファイルが2つある
% echo *
fuga.txt  hoge.txt

# :a は編集子の一種で、フルパスに変換する
% echo *(:a)
/home/mollifier/tmp/fuga.txt /home/mollifier/tmp/hoge.txt

# :r も編集子の一種で、ファイルの拡張子の部分を取り除く
% echo *(:r)
fuga hoge

# 並べて書けば2つ以上使うこともできる
% echo *(:a:r)
/home/mollifier/tmp/fuga /home/mollifier/tmp/hoge
```

## 編集子(modifiers)とは

編集子(modifiers)とは、グロブ展開の結果などを編集するための記号のこと。グロブ展開以外にも変数展開、履歴展開でも同じ記号が使える。

変数展開で使う場合はこんな感じ。`()` で囲うのではなく、`{}` の内側に書く。

```zsh
% pwd
/home/mollifier/tmp

# この変数の値を編集子で編集する
% var="list.txt"

# フルパスにする
% echo ${var:a}
/home/mollifier/tmp/list.txt

# 拡張子部分を取り除く
% echo ${var:r}
list

# 複数使う場合
% echo ${var:a:r}
/home/mollifier/tmp/list
```

履歴展開で使う場合はこんな感じ。履歴展開の場合はカッコで囲まずそのまま書く。

```zsh
# まず履歴を貯める
% echo list.txt
list.txt

% echo !!:1:a
/home/mollifier/tmp/list.txt

% echo !!:1:a:r
/home/mollifier/tmp/list
```

## 編集子一覧

編集子として使える記号の一覧はは以下。

| 記号                      | 意味                                      |
|:--------------------------|:------------------------------------------|
| a                         | フルパスにする                            |
| A                         | aと同じ。ただしシンボリックリンクを実際のパスに置き換える |
| e                         | 拡張子だけを残す(.とそれより左を削除する) |
| r                         | 拡張子の部分を取り除く(root)              |
| h                         | ディレクトリ名の部分だけを残す(head。dirname するのと同じ)      |
| t                         | ファイル名の部分だけを残す(tail。basename するのと同じ)           |
| l                         | すべて小文字に置き換える                  |
| u                         | すべて大文字に置き換える                  |
| s/<var>old</var>/<var>new</var>/ | 最初の <var>old</var> を <var>new</var> で置換する                |
| gs/<var>old</var>/<var>new</var>/ | すべての <var>old</var> を <var>new</var> で置換する             |

詳細は man zshexpn の「HISTORY EXPANSION」->「Modifiers」 を参照。

うまく使うと今まで `echo $var | sed s/old/new/` とかしてたところがスマートに書けると思うので使ってみてください!
Text/Labelでwordwrapがうまくいかずに文字がはみ出してしまう時の対処方法

私の場合は`QtQuick.Layouts`のRow/ColumnLayoutを使って区切ったcellの中にテキストを入れようとした時に起こった

```qml:main.qml
import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Layouts 1.1

ApplicationWindow {
	title: qsTr("Hello World")
	width: 640
	height: 480

	property string loremIpsum:
		"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor "+
		"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor "+
		"incididunt ut labore et dolore magna aliqua.\n Ut enim ad minim veniam, quis nostrud "+
		"exercitation ullamco laboris nisi ut aliquip ex ea commodo cosnsequat. ";

	RowLayout {
		anchors.fill: parent
		Rectangle {
			Layout.preferredWidth: parent.width / 4
			Layout.fillHeight: true
			color: "red"
		}
		Label {
			text: loremIpsum
			wrapMode: Text.Wrap
		}
		Rectangle {
			Layout.preferredWidth: parent.width / 3
			Layout.fillHeight: true
			color: "blue"
		}
	}
}
```

![window.png](https://qiita-image-store.s3.amazonaws.com/0/25047/d785395c-f880-8f37-5012-6e72a5c05731.png)

Text/Labelは何かしらの方法で`width`を設定してやらないとはみ出すようだ
上の場合は`Label`に`Layout.fillWidth: true`を追加するとうまくいく

```qml:main.qml
		Label {
			Layout.fillWidth: true
			text: loremIpsum
			wrapMode: Text.Wrap
		}
```

![window2.png](https://qiita-image-store.s3.amazonaws.com/0/25047/c36c824a-175c-6fbb-4935-401ddaab05b2.png)

wordwrapできずにはみ出すときは`width`かそれに相当するプロパティが設定されてるか確認するといいと思う
[Ruby] オブジェクトのメソッド探索順序

複雑な継承関係がある状態でオブジェクトのメソッドを呼び出すと、どのような順番でメソッドが呼び出されているかというお話。

原則は

+ 特異クラスはクラスの前に呼び出される
+ Moduleは`include`したクラスやModuleの後に呼び出される
+ Moduleを複数`include`すると後で`include`したものが先に呼び出される

### 継承

```rb
class Parent
  def hello
    p "hello Parent"
    super
  end
end

class Child < Parent
  def hello
    p "hello Child"
    super
  end
end

Child.new.hello
# => 
"hello Child"
"hello Parent"
NoMethodError: super: no superclass method `hello' for #<Child:0x3eeccb0>
```

[Child, Parent]という順番。

### Moduleをmixinする

```rb
module ModuleA
  def hello
    p "hello ModuleA"
    super
  end
end

module ModuleB
  def hello
    p "hello ModuleB"
    super
  end
end

module ModuleC
  def hello
    p "hello ModuleC"
    super
  end
end

class Parent
  include ModuleA
  def hello
    p "hello Parent"
    super
  end
end

class Child < Parent
  include ModuleB
  include ModuleC
  def hello
    p "hello Child"
    super
  end
end

Child.new.hello
# =>
"hello Child"
"hello ModuleC"
"hello ModuleB"
"hello Parent"
"hello ModuleA"
NoMethodError: super: no superclass method `hello' for #<Child:0x4556b98>
```

[Child, ModuleC, ModuleB, Parent, ModuleA]という順番。
Moduleはクラスのあとに呼び出される。複数のModuleを`include`したときは、後から`include`されたものが先に呼び出される。

### 特異クラス

```rb
class Parent
  def hello
    p "hello Parent"
    super
  end
end

class Child < Parent
  def hello
    p "hello Child"
    super
  end
end

child = Child.new
def child.hello
  p "hello singleton Child"
  super
end

child.hello
# =>
"hello singlteon Child"
"hello Child"
"hello Parent"
NoMethodError: super: no superclass method `hello' for #<Child:0x3f0ce28>
```

[SingletonChild, Child,  Parent]という順番。
特異クラスはクラスの前に呼び出される。

### 特異クラスでModuleを使う

```rb
module ModuleA
  def hello
    p "hello ModuleA"
    super
  end
end

class Parent
  def hello
    p "hello Parent"
    super
  end
end

class Child < Parent
  def hello
    p "hello Child"
    super
  end
end

child = Child.new
class << child
  include ModuleA
  def hello
    p "hello singlton Child"
    super
  end
end

child.hello
# =>
"hello singlton Child"
"hello ModuleA"
"hello Child"
"hello Parent"
NoMethodError: super: no superclass method `hello' for #<Child:0x34e2f10>
```

[SingletonChild, ModuleA, Child,  Parent]という順番。
特異クラスはクラスの前に呼び出される。またModuleは`include`したクラスの後に呼び出される。

### Module内でModuleを使う

```rb
module ModuleA
  def hello
    p "hello ModuleA"
    super
  end
end

module ModuleB
  def hello
    p "hello ModuleB"
    super
  end
end

module ModuleC
  include ModuleA
  include ModuleB
  def hello
    p "hello ModuleC"
    super
  end
end

class Parent
  def hello
    p "hello Parent"
    super
  end
end

class Child < Parent
  include ModuleC
  def hello
    p "hello Child"
    super
  end
end

Child.new.hello
# =>
"hello Child"
"hello ModuleC"
"hello ModuleB"
"hello ModuleA"
"hello Parent"
NoMethodError: super: no superclass method `hello' for #<Child:0x393a968>
```

[Child, ModuleC, ModuleB, ModuleA,  Parent]という順番。
Moduleは`include`したModuleの後に呼び出される。
knife solo 実行の流れ

knife solo は chef solo を chef-server/client となるたけ同じようにできるもの。

##0. knife soloのインストール

```bash
$ gem install knife-solo
```

##1. レポジトリを作成する

```bash
$ knife solo init .
```

こんな感じのレポジトリができる

```bash
+- chef
|     +- chef/knife.rb
+- cookbooks
+- data_bags
+- environments
+- nodes
+- roles
+- site-cookbooks
```

##2. ノードの設定を行う

対象のノード上で、以下を設定しておく。

* ssh でログインできること (ssh-agent を設定しておくと楽)
* sudo を実行できること

```bash
$ knife solo prepare ホスト名
....
Thank you for installing Chef!
Generating node config 'nodes/ホスト名.json'...
```

.chef/knife.rb に設定ファイルが出力されるので確認

```
cookbook_path    ["cookbooks", "site-cookbooks"]
node_path        "nodes"
role_path        "roles"
environment_path "environments"
data_bag_path    "data_bags"
#encrypted_data_bag_secret "data_bag_key"

knife[:berkshelf_path] = "cookbooks"
```

##3.レシピを書く

mysql-server をインストールするレシピ

```bash
$ knife cookbook create mysql
$ vim cookbooks/mysql/recipes/default.rb 
#
# Cookbook Name:: mysql
# Recipe:: default
#
# Copyright 2013, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#
package "mysql-server" do
    action :install
end
```

##4.node のrun_list に追加する

```bash
$ vim nodes/ホスト名.json
```

```json
{
   "run_list":[ 
         "recipe[mysql]" 
   ] 
}
```

##5. Why Run 実行をしてみる

実際にkitchenをアップロードして、ファイルの差分など調査して表示する（処理はおこなわない）。

```bash
$ knife solo cook ホスト名 -W
```

##6. 実行！

```bash
$ knife solo cook ホスト名
```

##7. ゴミ掃除

ノードに作成された作業ディレクトリ（各ノードのユーザホームディレクトリ/chef-solo)を削除する

```bash
$ knife solo clean ホスト名
```