OmniAICreator/Qiita-1.07M huggingface dataset:
PhpStormの質問にいくつか答えてみたよ

こんなAdvent Calendarを始めたおかげで、嬉しいかな質問をいただくことがありました。粒度バラバラですが、いくつか答えてみました。

## Q: PhpStormでのVagrant活用方法が知りたいです。
A: 結論から言うとボクはPhpStorm経由では使っていません。現状は[Up] [Reload] [Suspend]...といった機能しか使えないので、別に連携させる必要ないかなという判断です。
自動テストの流れでPhpStormのマクロからVagrant Upをしてテスト…のような使い方をするようになったら連携を考えるかもしれません。


## Q: [Split Horizontally]などでタブ分割した時に分割元にもタブが残るので、これを分割先だけに表示する方法があったら教えてください。

A: これはちょっと不便ですよねー。デフォルトでそれを解決するような手段はないです。
なので、「Split分割して、元のタブにフォーカスを戻して、Closeする」マクロを組んでみました。こんな感じで登録したマクロを使ってやれば良いと思います。
ちなみにマクロの作り方については[Macroを使ってみよう](http://qiita.com/Vexus2/items/b72ef192d2b328213218)をご参照ください。


![Edit_Macros_と_ModelBehavior.php_-_cakephp-2.3.0_-____www_cakephp-2.3.0_.png](https://qiita-image-store.s3.amazonaws.com/222/20074/f8f80627-c268-dd81-a8f3-7fd4e0285f73.png "Edit_Macros_と_ModelBehavior.php_-_cakephp-2.3.0_-____www_cakephp-2.3.0_.png")


## Q: 今年はいつ半額なりますか？
A: 代理店じゃないのでわかりません。ごめんなさい。

## Q: 任意の拡張子ファイルの割り当てはどうやりますか？
A: 任意の拡張子ファイルをPHPファイルとして認識して開きたい、というようなものであれば以下の手順で行えます。

- [Preferences] - [File Types]からPhp Files(PHP)を選択
- 下の窓の[+]から、登録したい拡張子を入力

![Add_Wildcard_と_Preferences.png](https://qiita-image-store.s3.amazonaws.com/222/20074/c8ca3889-31de-d763-2494-e5fef06a4b74.png "Add_Wildcard_と_Preferences.png")


## Q: VCS->LocalHistory機能って？
A: GitやSVNなどのVCS機能とは別に、PhpStormで保持している擬似バージョン管理機能です。特に設定は不要で、ファイルの編集時やVCSへのCommit時などのトリガーで自動的にファイル単位で保存されています。
Local History一覧から○○分前の状態や○○commitの時点と現在のファイルの差分が表示して、その時点までRevert出来たりもします。


## Q: Tab(ソース内の半角スペース4つみたいなアレ)の表示が主張しすぎているので変えれないかな
A: [Preferences] - [Editor] - [Appearance] - [Show whitespaces]
からTab文字表示のON/OFFは出来ます。
が、Tab文字を別の文字は出来ないみたいです。

## Q: ファイルタブが動きすぎるのを止める方法
A: 動きすぎて困った…って思ったことがなかったのでちょっと解決策が出てこないんですが、Tab Limitを増やしてみたり、ファイルが閉じた際に次に開くファイルのポリシーを変えるとか、タブをSingle Rowにしてみる…とかどうでしょう？

![Preferences.png](https://qiita-image-store.s3.amazonaws.com/222/20074/a318c056-4576-2898-ef59-15c2befb71e5.png "Preferences.png")


## Q: 機能が多すぎてどんな機能があるのかわかりません。
A: 高機能ゆえに機能がありすぎて使いこなせない…ってなって使うのを止めちゃう方は多い気がします。
一朝一夕で全て把握出来るわけもないので、普段使っていて、ここをもうちょっと便利に出来ないかな？と思ったタイミングでtwitterとかで聞いてみたり、調べてみて少しずつ快適にしていくのが良いと思います。

同じPhpStormなどのエディタを使っている人とペアプロ出来ると、その人の使っているショートカットとか機能とかも見れるのですごくいいです。
あとは、JetBrainsのwebinarで色々な機能の使い方を紹介しているので、それらの動画を見てみるのもいいかもしれないです。ちょっと長いですが。
http://www.youtube.com/user/JetBrainsTV?feature=watch
Actor modelが好きすぎて勢いだけで作ってしまったナニカ


メリークリスマス。Elixir Advent Calendar 2013 24日目ですよ。

Elixirが大好きなみんなは、ErlangやRubyにも興味があると思うんですよね。ああ、もしかしたらScalaにも興味があるかもしれませんね。

RubyでElixir/Erlang/ScalaのようなActor modelを実現しようとしたら、Celluloidが定石かなと思いますし、最近はconcurrent-rubyというのも出てきましたが、でもCRubyのマルチスレッドは実質シングルスレッドだったりして（CRuby 2.0時点）、そのままでは計算機リソースを活かすことが難しいです。

というわけで先週日曜に半日かけて一通り作りました。

https://github.com/keithseahus/actory

# actoryとは

RubyでActor modelや並列処理を実現するためのフレームワークです。actoryは```Actor model like, concurrent and distributed framework for Ruby```の略で、Oxford English Dictionaryによると、```An agent , esp. an administrator ; a person who acts on behalf of another .```とか```A person who performs or takes part in any action; a doer.```とかいう意味合いです。

特徴は4つ。

* Actor modelっぽいMessage PassingができるAPIを提供します。
* プラグインは動的ローディング対応です。Erlangからインスパイヤ。
* 出来る限り並列化します。ジョブスケジューラはまだ単純ですが。。。
* オーバーヘッド少なめ。通信＆シリアライズ部分にMessagePack RPCを使っています。

# 用語集

* Sender
  * actoryの送信側。
* Receiver
  * actoryの受信側。
* actor
  * Receiverとほぼイコール。
  * Receiverについて、Senderを意識しない文脈や、Actor modelを意識する文脈において、こう呼ぶ。

# 設計思想

## Message Passing

Elixirとは全体的に異なります。
Elixirの<-演算子に相当する部分は、Senderで実行するmessageインスタンスメソッドとして実装しました。
ただ、Elixirで関数自体を渡すようにブロックをProcオブジェクトとして渡すことはできません。この処理はMessagePack RPCとの相性が悪く、結局のところ、渡される関数に相当する部分はプラグインの動的ローディングでカバーすることとし、Receiverで実行するメソッド名と処理対象のオブジェクト（テキストベース）を渡すという形にしました。
Receiverについても、Elixirにおけるreceive文とは、かなり異なります。
actoryでは、Actory::Receiver::EventHandlerのreceiveメソッドとして実装していますが、Elixirのreceive文におけるcase文のような振る舞い、すなわちactoryにおいて渡されたデータを見てどのプラグインのメソッドを実行するかは、Rubyの方に任せています。
処理が終わって値を返したらまた待受状態に戻るという点では、Scalaに近いかもしれません。

## プラグイン

専用のディレクトリに突っ込んでおけば自動的にロードされるようにしています。
作り方としては、Actory::Receiver::Pluginとしてメソッドを定義すればオーケー。Rubyのクラスは再オープンできるので便利です。
また、Receiver自体の機能も、できるだけプラグインで実現するようにしています。

## 並列処理

Parallelを使っています。クライアントがSenderに渡した処理対象のデータ（配列）をバラして、それぞれをactorに振り分けています。
SenderもReceiverも、基本的にCPUコア数の分だけプロセスを生成します。これらのプロセスをどのCPUコアが処理するかはOSのジョブスケジューラ任せにしています。

## 通信

プロセス間通信は、MessagePack RPCを使用しています。シリアライズの高速性と扱いやすさが決め手です。

# インストールとか使い方とかアーキテクチャとかプラグインの書き方とか

こちらをご覧下さい。
https://github.com/keithseahus/actory

# 課題

* テストを書く
  * 半日＋αくらいで、勢いだけで作ったので…。仕事ではちゃんとテスト書いてますよ（迫真）
* 戻り値の形式改善
  * もう少し扱いやすい形式があるように思える。
* ジョブスケジューラの追加(1)
  * actorに127.0.0.1のホストがいる場合、リモートのReceiverに投げずに、ローカルで処理した方が早い処理もある。そのためのスケジューラの追加。
* ジョブスケジューラの追加(2)
  * actorの計算機リソースの状況を取得するプラグインは既に作ってあるので、それを使ったロードバランシングができるスケジューラが欲しいところ。ScalaのAkkaルータ的なものを実現したい。
* メッセージング方法の柔軟性向上
  * ネットワークで例えるとユニキャスト，マルチキャスト，ブロードキャスト的な制御を任意に切り替えられるようにしたい。
* メールボックス
  * Receiverに対するキューイング処理が欲しい。
  * Senderについても、Receiverからの返却を非同期で受け取って取り出せる機構が欲しい。
* ゼロ・コンフィギュレーション
  * 設定ファイルでactorを列挙してしまっている時点でイケてない。

# まとめ

* Actor modelが好きすぎて勢いだけでactoryというものを作りました。
* CRuby縛りの開発でActor modelと並列処理が欲しい時に、意外と使えるかも？
* 明日は最終日、 @mururu さんによる完走です。
checkboxで選択した際に、背景色を変更する。


完成イメージは、<a href="http://xn--zckvcycd0cycv666a8mxc.com/" title="【A-STAR フリーランス】フリーエンジニアの案件と仕事">【A-STAR フリーランス】フリーエンジニアの案件と仕事</a>の検索条件指定欄のcheckboxです。

###html

jsのonclickイベントで背景色を変えるように実装します。

```html
<form method="" action="">
    <label><input class="check" type="checkbox" id="hoge" onclick="chebg('hoge')" value="hoge">hoge</label>
    <label><input class="check" type="checkbox" id="hoge2" onclick="chebg('hoge2')" value="hoge2">hoge2</label>
    <label><input class="check" type="checkbox" id="hoge3" onclick="chebg('hoge3')" value="hoge3">hoge3</label>
    <div class="menu-submit">
        <input type="submit" value="送信" />
    </div>
</form>
```


###javascript


if文でcheckboxにチェックがついているかどうかで分岐させます。

```javascript
function chebg(chkID){//タグの背景色変更
    Myid=document.getElementById(chkID);
    if(Myid.checked == true){
        Myid.parentNode.style.backgroundColor = '#CC28A8';
        Myid.parentNode.style.color = '#FFFFFF';
    }else{
        Myid.parentNode.style.backgroundColor = '#FFFFFF';//背景色
        Myid.parentNode.style.color = '#333333';//文字色
    }
}
```

###css
今のままだと、チェックボックスが見えていますので、cssで隠します。

```css
.check{
    display:none;
}
```
年と月から年度を取得する

「年」と「月」から、年度を取得します。
2013年3月であっても、3月決算の会社であれば年度は2012年となります。

```php
function get_financial_year($year, $month, $financial_month){

    if($month > $financial_month){
        return $year;
    } else {
        return $year - 1;
    }
}
```

2013年3月の年度（3月決算月）は？

```php

echo get_financial_year(2013, 3, 3);

2012
```
公式ガイドの「Dialogs and Sidebars in Google Apps」を制覇する！（その３）

## Custom Dialog？
Custom DialogはHtmlServiceかUIAppを使って、Dialogの中身を構築して表示するものです。これは、Google Document、Spreadsheet、Formどれでも利用可能です。

Custom DialogはPromptや、Alertと違って、サーバ側のスクリプトの処理を中断しないので、クライアントでの操作のHandlerを実装する必要があります。（何も実装しないと表示したまま動かないということ）

HtmlServiceを使ってUIを表示する場合は、google.script.host.close()をJavaScriptで呼び出すことで、ダイアログを閉じることができます。UiAppを利用した場合は、UiInstance.close()を呼び出して、ダイアログを閉じます。（詳しくはSpreadsheetとFormAppのサンプルをごらんください。）

また、表示する方法は、Ui.showDialog()を使うか、Spreadsheet.show()を呼び出すことでダイアログが表示されます。（Spreadsheetでは、Uiを取得する方法がありません）

## Google Document編
HtmlServiveを使ってUIを構築しています。これまでのサンプルと同じような感じで利用できます。

```js:コード.gs
// 事前にUiオブジェクトを取得しておく
var ui = DocumentApp.getUi();

function onOpen(e) {
  ui.createMenu("テストメニュー")
  .addItem("CustomDialog表示", 'showCustomDialog')
  .addToUi();
}

// 最初に承認が必要です。
function showCustomDialog() {
  var html = HtmlService.createHtmlOutput('Hello, world! <input type="button" value="Close" onclick="google.script.host.close()" />')
  .setSandboxMode(HtmlService.SandboxMode.NATIVE)
  .setTitle("Custom Dialog")
  .setWidth(400)
  .setHeight(300);
  
  ui.showDialog(html);
}
```

## Google Spreadsheet編
敢えて、UiAppを使ってカスタムダイアログにしています。HtmlServiceを使ってUIを構築する事ができますが、UiAppを使っても実現可能です。
ただし、FormAppの例もUiAppを使っていますが、Spreadsheetの場合はUiを事前に取得することができない（SpreadsheetAppにはなぜかgetUi()が存在しない）のでSpreadsheet.show(obj)を使って、UIを表示させるようにします。

```js:コード.gs
function onOpen(e) {
  var subMenus = [{name: "CustomDialog表示", functionName: "showCustomDialog"}];
  
  SpreadsheetApp.getActiveSpreadsheet().addMenu("テストメニュー", subMenus);
}

// 最初に承認が必要です。
function showCustomDialog() {
  var app = UiApp.createApplication();
  var panel = app.createHorizontalPanel();
  var label = app.createLabel("Hello World!");
  var button = app.createButton("Close", app.createServerHandler('onClick'));
  panel.add(label);
  panel.add(button);
  app.add(panel);
  app.setTitle("CustomDialog")
  .setWidth(400)
  .setHeight(300);
  
  SpreadsheetApp.getActiveSpreadsheet().show(app);
}

// ダイアログのcloseボタンが押された時のコールバック
function onClick(e) {
  var app = UiApp.getActiveApplication();
  app.close();
  
  return app;
}
```

## Google Form編
Spreadsheetと同じくUiAppを使ってUIを構築しています。どちらがいいのかは好みが別れるところかもしれませんが、UiAppも以前よりも落ち着いてきたんだろうか。

```js:コード.gs
// 事前にUiオブジェクトを取得しておく
var ui = FormApp.getUi();

function onOpen(e) {
  ui.createMenu("テストメニュー")
  .addItem("CustomDialog表示", 'showCustomDialog')
  .addToUi();
}

// 最初に承認が必要です。
function showCustomDialog() {
  var app = UiApp.createApplication();
  var panel = app.createHorizontalPanel();
  var label = app.createLabel("Hello World!");
  var button = app.createButton("Close", app.createServerHandler('onClick'));
  panel.add(label);
  panel.add(button);
  app.add(panel);
  app.setTitle("CustomDialog")
  .setWidth(400)
  .setHeight(300);
    
  ui.showDialog(app);
}

// ダイアログのcloseボタンが押された時のコールバック
function onClick(e) {
  var app = UiApp.getActiveApplication();
  app.close();
  
  return app;
}
```
LiveEditを使ってみよう

LiveEditは「ブラウザをリロードせずにファイルを動的に書き換えて表示する」という機能です。
が、対象がHTMLやCSS、JSということもありどちらかいうとコーダ、デザイナ、フロントエンドエンジニア向けの機能です。


## 事前準備

まずはPhpStorm用のプラグインとブラウザ用のExtentionをインストールします。

最新のPhpStorm7.1にはLiveEditのプラグインがデフォルトで含まれていないので、そちらをインストールします。

[Preferences] - [Plugins] - [Browse repositories...]から[Live Edit]プラグインを選択してインストールします。

また、ブラウザはここではGoogle Chromeを使用します。
Chrome上で以下のプラグインをインストールしておきます。

[JetBrains IDE Support](https://chrome.google.com/webstore/detail/jetbrains-ide-support/hmhgeddbohgjknpmjagkdomcpobmllji)

事前準備はこれで完了です。

## 動かしてみる

任意のHTMLファイルを右クリックし、Debugを選択します。

![index.html_-_liveedit_sample_-____Dropbox_100_Programming_php_liveedit_sample_.png](https://qiita-image-store.s3.amazonaws.com/222/20074/33e4c4d5-324e-94e5-af94-9a141809291f.png "index.html_-_liveedit_sample_-____Dropbox_100_Programming_php_liveedit_sample_.png")

ブラウザが立ち上がって、「JetBrains IDE Supportがこのタブをデバッグしています」と表示されていればOKです。
HTMLやCSSなどを書き換えると動的に表示が反映されます。

※反映が遅い、もしくはAuto Deploymentを設定していてアップロードまでに数秒かかっている場合は、Synchronize(Ctrl+Cmd+Y)を押すと即座に反映されます。

実際に動いている動画はこちらを御覧ください。

http://www.youtube.com/watch?v=2N5XlqJYhIg

ちなみに…。PHPも一応動作はしますが使えるのは基本的な静的ページのみです。
例えばSNSなどのログインが必須な画面だったりしたらLiveEdit実行時にリロードしちゃうので使えません。なので、ボクは普段の開発では使ってません。
今後の拡張に期待しています。
PhpStorm内のカラースキーマをカスタマイズする

他のエディタなどと同様、PhpStorm内でもカラースキーマが変更出来ます。
スキーマは

- IDE全体のカラースキーマ
- エディタ内のカラースキーマ

の2つが変更出来ます。それぞれ変更の仕方とカスタマイズ方法について見ていきます。

## IDE全体のカラースキーマ

エディタ以外の部分、例えばProject StructureビューやTerminal、その他ウィンドウなどIDE内のすべてのカラースキーマが置き換わります。
以下の設定画面から変更出来ます。

- [Preferences] - [Appearance] - [UI Options] - [Theme]

から変更出来ます。もともとはホワイトカラーのみでしたが、PhpStorm6からDracula(読み方はドラキュラ)UIが追加されて、いい感じのブラックカラーが追加されています。

「エディタは黒いもの」という思想のもとに私はDraculaにしています。

![Preferences.png](https://qiita-image-store.s3.amazonaws.com/222/20074/f1dae905-28cb-24f0-5a75-74aa1b1e3084.png "Preferences.png")

## エディタ内のカラースキーマ

以下の箇所から変更出来ます。

- [Preferences] - [Editor] - [Colors & Fonts]

デフォルトで10数個のカラーテーマが用意されているので、好みのものをインポートして使うことが出来ます。

![Preferences.png](https://qiita-image-store.s3.amazonaws.com/222/20074/067f3756-9155-7ddf-bdb0-16f4589589c0.png "Preferences.png")

また、以下のサイトでいくつかテーマが公開されているので、好みのものを落としてきてインポートするのも良いでしょう。

[PhpStorm Themes](http://phpstorm-themes.com/)

また、選択したカラースキーマの中身を自分カスタマイズすることも出来ます。
デフォルトのカラースキーマは上書きできないので、設定画面上部の[Save As...]から自分用のカラースキーマ名を設定して保存する形になります。

この設定画面はかなり親切です。

![Preferences-5.png](https://qiita-image-store.s3.amazonaws.com/222/20074/b04456b5-5041-fd2d-0eef-122a57457a05.png "Preferences-5.png")

![Preferences-13.png](https://qiita-image-store.s3.amazonaws.com/222/20074/e3af336e-fb89-a08e-a6f4-be95479e09a3.png "Preferences-13.png")

こんな感じで、変更したい箇所をエディタ内で選択するとフォーカスが自動的に移るので、あとは右上から色を変えてやるだけで変更出来ます。わざわざ長ったらしい設定項目を自分で検索する手間がないので非常に楽です。
良い技術書の見つけ方

[ダメな技術書の見定め方](http://qiita.com/nappa/items/24a4e156b84d6f0a0354) の別バージョンです。お金のない人、初心者の人はこうやって技術書を選ぶと良いと思います。個人的な経験をベースにしたものです。当てはまらないケースも多々あると思うのでご容赦を。また、その本が自分によって合う・合わない、という点に別途注意してください。

## 売れている本 ##

実も蓋もない言い方ですが……。

部数が出ている、増刷を繰り返している本は良本である可能性が高いです。

そもそも良本でなければ売れないでしょうし。

## 雑誌連載をまとめたもの ##

雑誌掲載時に好評でなければ、本になりませんから。

## 翻訳書 ##

そもそも原書がクソ本であれば翻訳されることはないでしょうね。ただ翻訳がクソである可能性があるので注意。Amazon のレビューを見て確認しましょう。

## レビュアーを公募している ##

業界のトップレベルのエンジニアだけでなく、初心者視点からのレビューも受けていたらとしたら、良本である可能性がグッと高まりますな。

## サポートページが充実している ##

こういうところに著者の誠意が出ますね。

[ソフトバンク クリエイティブ:【正誤情報】『体系的に学ぶ 安全なWebアプリケーションの作り方』](http://www.sbcr.jp/support/9859.html)

[増補改訂版Java言語で学ぶデザインパターン入門](http://www.hyuki.com/dp/)
ライブコーディング環境 tidal で音を鳴らすまでの手順

即興音楽のコーディング環境である tidal (Pattern language for improvised music) を使って、音を出すまでの手順のメモ。

[tidal](https://github.com/yaxu/Tidal) 

### 前提
---
- jack がインストールされていること
- dirt がインストールされていること
- tidal がインストールされていること

### 音を出す手順
---
手数が多くて案外めんどうである。

#### 1. アプリケーションの起動
```bash
# 1. jack を起動する
~:500$ jackd -d coreaudio
jackd 0.121.3
Copyright 2001-2009 Paul Davis, Stephane Letz, Jack O'Quinn, Torben Hohn and others.
jackd comes with ABSOLUTELY NO WARRANTY
This is free software, and you are welcome to redistribute it
under certain conditions; see the file COPYING for details

JACK compiled with POSIX SHM support.
loading driver ..

# 2. シンセサイザー/サンプラー を起動する
# ※ 別のタブ・ウィンドウで実行 
Dirt:508$ ./dirt 
init audio
engine sample rate: 44100
init osc

# 3. エディタを実行
# ※ さらに別のタブ・ウィンドウで実行する
emacs

```

#### 2. コードの編集と実行
すべて emacs 上で実行する。
Terminal.app から emacs を実行してもよいし、Emacs.app で実行しても構わない。

```el
; tidal のマクロがロードされていることを確認
M-x tidal- 

; tidal 開始
C-c C-s

; 適当なファイルを開く
C-x C-f aNewFile.tidal

; シーケンスの開始 & 停止
d1 $ sound [bd]    C-c C-c
d1 $ silence  C-c C-c

; tidal の終了
C-c C-q

; Emacs の終了
C-x C-c
```

#### 3. 後片付け

- dirt と jackd は `Ctrl + d` で終了させる。
- jackd が起動できないときは、`ps -ef | grep jackd` でプロセスを確認して、生きているようであれば
`killall jackd` する。


#### よく使うキーバインド

- `C-c C-s` tidal-start-haskell  tidal を開始する。tidal から dirt にメッセージが飛ぶようになる
- `C-c C-q` tidal-quit-haskell  tidal の終了(これを実行せずに emacs を終了させるとカーネルパニックになることが多いので注意)。
- `C-c C-c` tidal-run-line  行の評価。一番よくつかうキーバインド。
- `C-c C-e` tidal-run-multiple-lines


tidal のインストール方法は[こちら](http://qiita.com/tgck@github/items/cc339b7a43ec5d8ce92d)。
L-intersection(2012.12.15の過去問)

1日1個 @nabetani さんの作った問題を解く、どう書くAdventCalendarの23日目です。

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

```hs
module Doukaku.LAndLs (solve) where
import Data.Char (digitToInt)

type L = (Pt, Pt, Pt)
type Pt = (Int, Int)

parse :: String -> (L, L)
parse (x1:y1:'-':x2:y2:'-':x3:y3:',':x1':y1':'-':x2':y2':'-':x3':y3':_) =
  (((digitToInt x1, digitToInt y1), (digitToInt x2, digitToInt y2),
    (digitToInt x3, digitToInt y3)),
   ((digitToInt x1', digitToInt y1'), (digitToInt x2', digitToInt y2'),
    (digitToInt x3', digitToInt y3')))

solve :: String -> String
solve input = show . length $ [(x, y) | x <- [0 .. 9], y <- [0 .. 9]
                                       , contains l1 (x, y) && contains l2 (x, y)]
  where
    (l1, l2) = parse input

contains :: L -> Pt -> Bool
contains (p1, p2, p3) p = squareContains (p1, p2) p || squareContains (p1, p3) p

squareContains :: (Pt, Pt) -> Pt -> Bool
squareContains ((x1, y1), (x2, y2))  (x, y) =
  (x1 - x) * (x2 - x) <= 0 && (y1 - y) * (y2 - y) <= 0
```

L字に含まれるかを判定する`contains`を実装し、100マスのうち双方のL字に含まれるマスの数を数えました。L字は長方形2つで構成されるため、長方形に含まれるかを判定する`squareContains`を実装して、この関数の`||`として表現しました。

http://qiita.com/Nabetani/items/4c60f10b73812e86441c に他の方の回答もありますので、見ると参考になるでしょう。
Ceylon IDEでのショートカットなど

今回はceylon1.0と同時にリリースされたeclipseプラグインCeylon IDEのショートカットの紹介。

今までもEclipse上での操作を前提にしていたので
すでにCeylon IDEの恩恵を受けながらの操作でした。

ただ、実際の開発ではソースコードを書いている時間が長いので
コードを書くときの時間を短くするために
ショートカットはまず覚えることとして重要なことかと思います。

Ceylon IDE のショートカットをチェックしましょう。

#主要なショートカットの紹介


| ショートカット|効果 |
|:---:|:---:|
| command + 1 | クイックフィックス。エラー問題の解決やサポート |
| command + space | コード補完 |
| option + c | import文の整理します |
| option + t | valueで宣言され居る場所を型にします |
| command + i | インデントの調整(選択されている部分のみ) | 
| command + /  |  一行コメント |
| option + control + / | ブロックコメント |
| shift + command + o | ceylonの宣言を検索して開く |

今回の投稿をしている中で
よく使うショートカットはこんな感じでした。

まだまだ手になじんだり深く調べたりしていないので
他にも便利なショートカットが眠っているかもしれないので
その辺りはコメントなどで教えてもらえると嬉しいです。

#Ceylon IDEの個人的感想

インデントの調整では選択されている部分のみしか調整されず。
全選択してから実行しないといけなかったり。

クイックフィックスでは候補が少なく、
エラー問題解決のときの候補もイマイチだったり。

JavaをEclipseで書いているときに比べるとまだまだな印象です。。
Javaを書いてるときのサポートの気遣いの深さのレベルが高すぎると言う話もありますが、
Javaから移るなら同じレベルが欲しくなってしまうのは仕方が無いところ。

valueで宣言されている箇所を型に置き換えてくれるというのは
ちゃんと使いどころを考えれば宣言の型が省略されてしまう最近の世の中で
コードの読み手の気持ちを考えるとなかなか良いかもしれません。


ともかくプラグインとしてはもう一歩パワーアップして欲しいところ。
[iOS7][TextKit] letter press

#概要
iOS7 TexKitで letter pressをサポートするようになりました。前には名刺、はがきなどで使うことが多いのですが、アプリに使うと結構きれいな表示ができます。例としてはappleのnote，リマインダーのリストタイトルの方使ってます。
![7minder-01.jpg](https://qiita-image-store.s3.amazonaws.com/0/9564/f8fac3ad-b260-91e3-99cf-0fde1ed5e0c1.jpeg)
#実装
実装は簡単、NSAttributedStringのattributeをNSTextEffectLetterpressStyleを設定するだけです。

```objc
-(void)p_pressLetter{
    //色とletterpress style設定
    NSDictionary *attrs = @{NSForegroundColorAttributeName : [UIColor redColor],
            NSTextEffectAttributeName : NSTextEffectLetterpressStyle};

    NSAttributedString *letterpressString = [[NSAttributedString alloc] initWithString:@"LOVE YOU FOR EVER"
    attributes:attrs];

    self.label.attributedText = letterpressString;
}
```
## 注意:
iPhone4サポートしない
https://developer.apple.com/library/ios/releasenotes/General/RN-iOSSDK-7.0/
#参考
https://github.com/huiping192/iOS7/blob/master/TextkitSample/TextkitSample/RSViewController.m
https://developer.apple.com/library/ios/documentation/UIKit/Reference/NSAttributedString_UIKit_Additions/Reference/Reference.html
Cygwinで別ドライブへアクセスする方法

Windowsのコマンドプロンプトからmklinkを使用してシンボリックリンクをcygwinフォルダ以下に作成する。

Dドライブをリンクする場合
C:\Users/ユーザー名>mklink /D C:\cygwin64\D D:\
C:\cygwin64\D <<===>> D:\ のシンボリック リンクが作成されました
UIActionSheetでtwitterアカウントを選択させる


```objective-
_accounts = [_accountStore accountsWithAccountType:_accountType];
```

```objective-c
-(void)showActionSheet {
    UIActionSheet *sheet = [[UIActionSheet alloc] init];
    [sheet setDelegate:(id)self];
    for (int i = 0; i < _accounts.count; i++) {
        [sheet addButtonWithTitle:[_accounts[i] valueForKey:@"username"]];
    }
    [sheet showInView:self.view];
}

-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    _currentAccount = _accounts[buttonIndex];
}

```
[解決済み] Python mechanizeに詳しい方に質問です。

Python mechanizeを使って、JTBのサイトからツアー商品の情報を自動収集したいと思っています。

例えば、

下記のリンクにPCのブラウザ上から飛ぶと、

http://ovspkg.jtb.co.jp/pkg/toursearch/search_result.aspx?deptplacecd=HND&destareacd=HWI

羽田出発、目的地ハワイのツアー商品が

読み込み中と出た後、ブラウザ上で表示されますが、

下記のコードを使って、スクレイピングすると、

br = mechanize.Browser()$
br.addheaders = [('User-agent', 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_0 like Mac OS X; ja-jp) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1     Mobile/5A345 Safari/525.20')]
br.open('http://ovspkg.jtb.co.jp/pkg/toursearch/search_result.aspx?deptplacecd=HND&destareacd=HWI')
print br.response().resd()

読み込みという状態でのHTMLは取得できませんが、

その後の読み込み後のリンクなどを取得できません。

どうにか、読み込み後のHTMLを取得したいのですが、

良い方法を知っている方はいらっしゃいませんでしょうか？

よろしくお願いします。
【解決済】ActionScriptやmxmlに詳しい方、<mx:Button>のwidthについて質問です

方眼紙状のアプリケーションを作っているときに
Flexライブラリのmx:Buttonのwidthの指定に欠陥があるのではないかと思いました。

------------------------
    <?xml version="1.0" encoding="utf-8"?>
    <s:Application name="test2"
      xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark"
      xmlns:mx="library://ns.adobe.com/flex/mx">
        <mx:Button width="500" height="500" />
    </s:Application>

------------------------

これだと大きな四角いボタンができます。
インラインCSSだとwidthを受け付けるようですね。

しかし外部からのCSSにすると

------------------------

    <?xml version="1.0" encoding="utf-8"?>
    <s:Application name="test2"
        xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark"
        xmlns:mx="library://ns.adobe.com/flex/mx">
        <fx:Style>
            @namespace mx "library://ns.adobe.com/flex/mx";
                mx|Button {
                    width: 500;
                }
        </fx:Style>
        <mx:Button />
    </s:Application>

------------------------
これだと幅は広がりません。

次に

------------------------
    <?xml version="1.0" encoding="utf-8"?>
    <s:Application name="test2"
        xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark"
        xmlns:mx="library://ns.adobe.com/flex/mx">
        <fx:Style>
            @namespace mx "library://ns.adobe.com/flex/mx";
                mx|Button {
                    fontSize: 500;
                    width: 500;
                }
        </fx:Style>
        <mx:Button label="test" />
    </s:Application>

------------------------
はテキストの幅と同じだけボタンの幅を広げられます。

他にも、ActionScriptからButtonのidを指定して`id.setStyle("width", 500);`なども試しましたが、フォントサイズは変更できても幅は変更できません。

Flexのドキュメントにはmx:Buttonのプロパティとしてwidthもheightも登録されていないため、インラインCSSでwidthが指定できてしまうのも謎です。

mxmlのButtonの幅はフォントやアイコンなどの内容物の大きさに依存して決定するようにしか実装されていないのだなと思いました。

しかし、そうなるとインラインCSSでwidthが変更できることとつじつまが合わないような気がして、やっぱり外部からのwidthの変更が上書きされないバグなのかなあと悩んでおります。

外部CSSで上書きができれば動的にボタン幅を変更できる方眼紙状の機能が作れてとても助かるのですが、何かアドバイスなど頂けませんでしょうか・・・？

---

#後日談

[stack overflow](http://stackoverflow.com/questions/20737411/do-you-know-about-this-weird-thing-as3-button-width-cannot-change-by-setstyle)で質問したところ、Flash開発ではCSSプロパティとMXMLプロパティが存在し、インラインCSSにはその両方が統合されているらしいです。CSSにx,yプロパティを書いても全く意味がないのはx,yプロパティはMXMLに記述するべきだったからみたいですね。
Ceylonでコマンド実行

Ceylonからコマンドを実行したいと思います。

今回はモジュール追加なしで動きます。


#さくっとコード

```ceylon

void runCommand() {
	
	Process p = createProcess("echo 'hello ceylon call'");
	
	Output|Reader r = p.output;
	
	if(is Reader r) { 
		while (exists line = r.readLine()) {
			print(line); // -> 'hello ceylon call'
		}
	}
	
	value result = p.waitForExit();
	
	print(result); // -> 0
}

````

すぐ分かる感じですね。
ほとんどJavaのときと変わらない使い方が出来る気がします。
メソッド名もほとんど変わらないですし。

１つ気をつけるのはoutputがReaderかOutputかどっちでくるか定義されていないところですね。
今回は単純にコマンド実行なのでReaderだったのですが
場合によってはOutputで帰ってくるのかな。。

今までの投稿を全部読んでいたら
もう、Ceylonでいろんなものが作れる気がします。

何か作ったら教えてくださいー。
Objective-CでAbstractパターン


Objective-CでAbstractパターンを書く。Abstractクラスのヘッダにメソッドを定義して、継承したクラスで実装を行う。Abstractクラスのメソッドが呼び出された場合には例外を送出するようにする。

Abstractクラスのヘッダと実装

```objectivec:parentClass
@interface parentClass : NSObject

- (void)someMethod;

@end


@implement parentClass

- (void)someMethod
{
    // 継承したクラスで実装する
    [NSException raise:NSInternalInconsistencyException
                format:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)];
}

@end
```

継承したクラスの実装

```objectivec:childClass.m
@interface childClass : parentClass
@end


@implement childClass

- (void)someMethod
{
    // 実装を書く
}

@end
```

呼び出し（書く必要ないと思うけど）

```objectivec
- (void)hogehoge
{
    childClass *cls = [[childClass alloc] init];
    [cls someMethod];
}
```
コマンドライン+VimでArduinoをはじめよう


**Arduino**には[公式の統合開発環境](http://arduino.cc/en/Main/Software)が存在するが，これが痒いところに手が届かず微妙に使いにくい．
コード中に謎の *h* *j* *k* *l* といった文字が紛れ込んだりする（？）．

ということで，なるべく公式の開発環境を使わないことを目標に，普段から慣れ親しんでいるVimで楽しくストレスフリーなものづくりをするためのメモ．

# やることリスト

- Vimのシンタックスハイライトを有効にする
- コマンドラインからビルド&転送をできるようにする

## Vimのシンタックスハイライト有効化

これはプラグインとして提供されているのでインストールする（[**sudar/vim-arduino-syntax**](https://github.com/sudar/vim-arduino-syntax)）．
プラグイン管理に[**NeoBundle**](https://github.com/Shougo/neobundle.vim)を使用している場合は`~/.vimrc`に以下の記述をしてから`NeoBundleInstall`を実行すればOK．

```~/.vimrc
NeoBundle "sudar/vim-arduino-syntax"
```

## コマンドラインから操作

### Inoの導入

[**Ino**](http://inotool.org/)という超便利コマンドラインツールを導入する．
（Inoの動作には[**Arduino IDE**](http://arduino.cc/en/Main/Software)が必要なのでインストールしておく）

Ino自体はPythonで書かれているらしいのでMacなら` $ sudo easy_install ino`でインストールできる．
また，シリアルモニタを使用したい場合は`picocom`が必要．これは`$ brew install picocom`でOK.

### Inoの使い方
#### プロジェクトを作る
ディレクトリは自分で作る．`$ ino init`を実行するとカレントディレクトリに`src`と`lib`ディレクトリが生成される．また，`src`には`sketch.ino`が作られる．

```bash:console
$ mkdir test & cd test
$ ino init
```

-

#### ボード一覧の確認

```bash:console
$ ino list-models
```

-

#### プロジェクトのビルド
 
```bash:console
$ ino build
```

こんな感じ．下画像はVim上で`!ino build`を実行した結果．
![ino build](https://qiita-image-store.s3.amazonaws.com/0/14845/b7d82754-8a14-d61a-60f4-837adf70b712.png)

-

#### ボードに書き込み

```bash:console
$ ino upload
```

![ino upload](https://qiita-image-store.s3.amazonaws.com/0/14845/ac8af286-102c-defe-5581-14fdf3d2bf76.png)

-

#### シリアルモニタ

```bash:console
$ ino serial
```

![ino serial](https://qiita-image-store.s3.amazonaws.com/0/14845/1e09bee3-5f3c-de2e-f511-e1dd7dd961a2.png)

-

それ以外にもあるっぽい．`$ ino help`で確認可．
C++のテンプレートで特定メソッドだけ特殊化

C++11だかC++14だかでできるようになったらしいけど。

テンプレートクラスの特定メソッドだけ特殊化したい。そんな場合ヘッダには一般型の **宣言だけを** 書き、それを特殊化したものの定義をソースに書くといちいち型違いを宣言せずに済むようだ。

もちろん特殊化して定義したもの以外の型で使おうとするとリンクエラーになる。ちなみに、テンプレートは使われないと展開されないのでソース側(.ccファイル)に一般型の定義を書いても意味がない(VC++ではそれもおｋって話を聞いたことがある気がするが)。

具体的にはヘッダには、

```cpp
template<typename T> class Hoge{
  ...
  void Huga();
  ...
```

こんな感じに宣言だけにして、ソースに、

```cpp
void Hoge<Abeshi>::Huga(){
  ...
}
```

みたいに特定のテンプレートパラメタを与えた状態のメソッドを定義しとく。完全に特殊化するかすべてのテンプレートパラメタを与えられて使われない限り定義は有効ではないので-というかその二つは同じことなんだけど-その条件は満たしておく必要がある。
playframework(2.2) + herokuでメール送信（SendGrid(heroku メールアドオン））

## SendGrid

* addonで有効にする。
https://addons.heroku.com/sendgrid

* $ heroku config 
SENDGRID_PASSWORD:
SENDGRID_USERNAME: 
↑パスワードとユーザ名を確認

## playframework

playframework のプラグインはこちら。
https://github.com/typesafehub/play-plugins/tree/master/mailer

最新版は下記です。
 "com.typesafe" %% "play-plugins-mailer" % "2.2.0"

```conf/application.conf

smtp.host=smtp.sendgrid.net
smtp.port=587
smtp.user=[SENDGRID_USERNAME]
smtp.password=[SENDGRID_PASSWORD]

```

例に習って、以下のようなobjectを作る

```scala

import play.api.Play.current
import com.typesafe.plugin._

object Mailer {

  def send = {

    val mail = use[MailerPlugin].email

    mail.setSubject("mailer test")
    mail.setRecipient("[宛先メールアドレス]")

    mail.setFrom("[送信元メールアドレス]")
    mail.send( "text" )
  }

}

```


##
ジェネレータとは？

久しぶりにXAMPPをインストールしたらPHPのバージョンが5.5.6だったので、新しい機能を調べてみると、ジェネレータというものが入ってました。

##ジェネレータとは
PHPマニュアルの[ジェネレータとは](http://www.php.net/manual/ja/language.generators.overview.php)に書いてありました。

途中で一時停止・再開が出来る関数のようなものらしいです。

応用範囲が広くて、無限の数列から一部を取得することが出来たり、非同期処理を分かりやすく書けたりするらしいです。

らしいばっかりです。

##日付を選択するセレクトボックス
いまいちピンと来ないので、PHPらしく、HTMLのフォームと組み合わせてみます。

例えば年月日を選択するセレクトボックスを表示するとき、年→月→日の順にoption要素を埋めるPHPコードを書く場合がよくあると思います。いや今どき自前で書かないと思うのですが、もし書くとしたら。

デザインとプログラムを分離するためには、予め3箇所のタグの文字列を生成しておいて出力するか、3つの関数かメソッドを作って出力するとか引数で区別するとかすると思うのですが、ジェネレータを使うとひとつの関数で済むのではないかと思いました。

```php
<?php
function genOpt() {
  yield;
  $ny = date('Y');
  foreach (range($ny, $ny - 80) as $y) {
    echo "<option>$y</option>";
  }
  yield;
  foreach (range(1, 12) as $m) {
    echo "<option>$m</option>";
  }
  yield;
  foreach (range(1, 31) as $d) {
    echo "<option>$d</option>";
  }
}
$opt = genOpt();
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>date</title>
</head>
<body>
  <select><?php $opt->next() ?></select>年
  <select><?php $opt->next() ?></select>月
  <select><?php $opt->next() ?></select>日
</body>
</html>
```

yieldの部分でジェネレータが一時停止し、nextメソッドで再開します。

こういう続きものの処理を分割するのに便利かもしれませんね…無理やり感は拭えませんが。
ジェネレータはすごく使えそうな機能なのでいろいろと使って行きたいです。
PhpStormの設定を別PC間で共有する

# 2016-01-04追記
こちらで紹介している [IntelliJ Configuration Server Plugin](https://plugins.jetbrains.com/plugin/4560)は Deprecated となっています。

>Deprecated - please use Settings Repository plugin. 

代替ツールとして [Settings Repository](https://github.com/develar/settings-repository) が提供されています。
以下の記事が参考になりますのでご参照ください。

- [IntelliJの設定を端末間で共有する](http://qiita.com/sotetsuk/items/39622a0219e93052c8dc#_reference-e4ea55449a2677dcaa46)

# 元記事
自宅PCと会社PCなどで設定したい場合など、普段使っているPhpStorm上でのキーマップや色設定などを他PCでも使いたい、という場合は結構あると思います。

設定を別PCでも共有出来る方法を紹介します。

## jarファイルを読み込む

こちらは物理的に設定ファイルをjarファイルをエクスポートしておく方法です。
手順は以下のとおりです。

- (エクスポート側PCで)PhpStormから[File] - [Export Settins...]からjarファイルを出力する
- (インポートする側PCで) [File] - [Import Settings...]から、上で出力したjarファイルを読み込む
- PhpStormを再起動

これだけです。完了です。
設定ファイルとして出力したい項目はExport Settings内のチェックボックスで細かく選べますが、基本的にはすべてチェックを入れておけば良いと思います。

ちなみに、PhpStormに自分で入れたプラグインは設定ファイルには含まれないので、設定ファイル移行後（もしくは移行前）に自身でプラグインをインストールする必要があります。

jarファイルはDropBoxなどに入れておけば別PCから取り出すのも楽なのでオススメです。

## プラグインを使って自動的に読み込む

[IntelliJ Configuration Server Plugin](http://devnet.jetbrains.com/docs/DOC-1143)というプラグインを使って、設定ファイルを自動的に同期出来ます。

このプラグインを利用するにはJetBrains Accountが必要になるので、事前に登録しておきます。
http://account.jetbrains.com/

手順は以下の通りです。

- (エクスポート側PCで)[Preferences] - [Plugins] から[IntelliJ Configuration Server Plugin]プラグインをインストールしPhpStorm再起動
- PhpStormを再起動
- 再起動後に表示される設定ウィンドウ(下図)にアカウント情報を設定
- (インポート側PCで)同様にIntelliJ Configuration Server Pluginプラグインをインストールし再起動
- 上記と同様に設定画面でアカウントを入力してログイン

![Login_to_IntelliJ_Configuration_Server.png](https://qiita-image-store.s3.amazonaws.com/222/20074/0ace55aa-ac8d-8716-a730-39fe8a88bfc1.png "Login_to_IntelliJ_Configuration_Server.png")


これで完了です。
右下のアイコンが緑になっていれば同期している状態です。


![index.php_-_cakephp-2.3.0_-____www_cakephp-2.3.0_.png](https://qiita-image-store.s3.amazonaws.com/0/20074/3f627eb5-2c31-ccc3-750e-195540b59117.png "index.php_-_cakephp-2.3.0_-____www_cakephp-2.3.0_.png")
Mojoliciousでわからない事があったらどこで聞けばいい？


日本語リソースも充実しつつあるMojolicious。国内でもそうですが、世界的にもユーザ数が多いサービスではありますが、なかなか具体的な活用事例が出てきていない感じもします。

潜在的にMojoliciousの国内ユーザは多いと思うのですが、では困ったときにどこで聞けばいいのか、よくわからないユーザが多いと思いますので、私が知っている場所をいくつかご紹介します。

なお、私自身も英語が苦手なので、ここでは日本語で質問が出来る場所に限定しています。

##各地のPerl Mongerの集まり「地域.pm」

Hachioji.pm などの Perl Monger の集まりに参加すると、その中に一人くらいはMojoliciousユーザがいることでしょう。そういう人に質問をぶつけてみると良いでしょう。 **顔と顔を付き合わせて聴くことが出来る生の声は一番です。**

主だった地域.pmを列挙しておきます。お近くの地域.pmに足を運んでみると相談相手が見つかるかもしれませんよ。

- Hokkaido.pm
- Sendai.pm
- Niigata.pm
- Shibuya.pm
- Chiba.pm
- Yokohama.pm
- Kamakura.pm
- Hachioji.pm
- Machida.pm
- Mishima.pm
- Nagoya.pm
- Kansai.pm
- Namba.pm
- Kyoto.pm
- Fukuoka.pm
- Yomitan.pm

##Perl入学式

[Perl入学式](http://www.perl-entrance.org)という勉強会では、現在のカリキュラムの最後にMojoliciousで簡単なウェブサービスを作るという科目があります。これに出てみることで、Mojoliciousの基礎の基礎が分かります。

また直接カリキュラムに関係ないMojoliciousのアドバンスドな質問も、その時にMojoliciousに詳しいサポーターがいれば答えてくれたり一緒に考えてくれるかもしれません。

##Mojolicious日本語メーリングリスト

- https://groups.google.com/forum/#!forum/mojolicious_ja

Googleグループを使ったメーリングリスト。

2013年12月現在、作成当時の投稿がいくつかあるだけで活発ではないようです。ただ、投稿してみると返事が返ってくるかもしれません。

##IRC Freenode の #mojolicious-ja チャンネル

Freenode には #mojolicious-ja というチャンネルがあります。時々著名な方々によって発言が行われているようです。

IRC や Freenode についての説明は割愛します。適宜検索してみてください。

チャンネルの文字コードはUTF-8です。

##Lingrのチャンネル「Mojoliciousの話題を日本語で」

- http://lingr.com/signup?letmein=mojo_jp
- http://lingr.com/room/mojo_jp

以前五反田で行われた[Mojoliciousやmod_perlを話題にした飲み会 #2](http://atnd.org/events/43807)で作成されました。同じLingrにある[「Perlの話題を日本語で」](http://lingr.com/room/perl_jp)の真似。

Lingrへの登録が必要ですがそれほど手間ではなく、IRCよりもハードルが低いのではないかと思います。現在はそれほどメンバー数も多くなく、気軽に質問できる場所といえるでしょう。少なくとも私は常にウォッチするようにしています。

----

その他にも思いついたら追記していきます。
カスタム Enum.TryParse

基になる数値の文字列表現はパースできません。

速度については、これまた測定していません。

```csharp:EnumHelper.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;

class Program
{
    static void Main(string[] args)
    {
        var enumType = typeof(FooBar);
        var helper = (EnumHelperBase)Activator.CreateInstance(typeof(EnumHelper<>).MakeGenericType(enumType));
        TestParse(helper, "");
        TestParse(helper, "Default");
        TestParse(helper, "Foo");
        TestParse(helper, "Bar");
        TestParse(helper, "Baz");
        TestParse(helper, "Fizz");
        TestParse(helper, "Buzz");
        TestParse(helper, "FizzBuzz");
    }

    private static void TestParse(EnumHelperBase helper, string value)
    {
        object result;
        bool success = helper.TryParse(value, out result);
        Console.WriteLine("Success={0}, Result={1}", success, result);
    }
}

public enum FooBar
{
    Default = 0,
    Foo = 0,
    Bar = 3,
    Baz = 6,
    Fizz = 3,
    Buzz = 5,
    FizzBuzz = 15,
}

public abstract class EnumHelperBase
{
    public abstract bool TryParse(string value, out object result);
}

public class EnumHelper<T> : EnumHelperBase where T : struct
{
    private readonly Dictionary<string, T> table;
    public EnumHelper()
    {
        Type t = typeof(T);
        if (!t.IsEnum)
        {
            throw new InvalidOperationException("Type parameter is not enum.");
        }
        var fields = t.GetFields(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
        table = fields.ToDictionary(x => x.Name, x => (T)x.GetRawConstantValue());
    }

    public bool TryParse(string value, out T result)
    {
        return table.TryGetValue(value, out result);
    }

    public override bool TryParse(string value, out object result)
    {
        T enumResult;
        bool success = this.TryParse(value, out enumResult);
        result = enumResult;
        return success;
    }
}
```
C++11: ランデブー(バリア)によるスレッドの待ち合わせ

N個のスレッドの待ち合わせ場所を用意する。
各スレッドがそこで`wait`すると、
全員が揃うまで各スレッドは待ち状態となり、
全員が揃った時点で全スレッドの待ちが解ける。

こんな待ち合わせ場所(`rendezvous`)があれば、各スレッドをひとつずつ`join`しなくていい。

```cpp
#include <thread>
#include <mutex>
#include <condition_variable>
#include <stdexcept>

/* 
 * rendezvous(ランデブー) あるいは barrier(バリア)
 */
class rendezvous {
public:
    rendezvous(unsigned int count)
        : threshold_(count), count_(count), generation_(0) {
        if (count == 0) { throw std::invalid_argument("count cannot be zero."); }
    }

    bool wait() {
        std::unique_lock<std::mutex> lock(mutex_);
        unsigned int gen = generation_;
        if (--count_ == 0) {
            generation_++;
            count_ = threshold_;
            condition_.notify_all();
            return true;
        }
        condition_.wait(lock, [&](){return gen != generation_; });
        return false;
    }

private:
    std::mutex mutex_;
    std::condition_variable condition_;
    unsigned int threshold_;
    unsigned int count_;
    unsigned int generation_;
};

/* おためし */
#include <iostream>
#include <array>
#include <mutex>

using namespace std;

int main() {
    const int N = 4; // 子スレッド数
    array<thread,N> threads;

    rendezvous period(N);
    rendezvous quit(N+1);
    mutex mtx;

    for ( int i = 0; i < N; ++i ) {
        threads[i] = thread([&,i]() {
            { lock_guard<mutex> guard(mtx); cout << "thread " << i << " 位置について\n"; }
            period.wait(); // 全スレッドが揃うまで待機
            { lock_guard<mutex> guard(mtx); cout << "thread " << i << " よーい\n"; }
            period.wait(); // 全スレッドが揃うまで待機 
            { lock_guard<mutex> guard(mtx); cout << i << " どん!\n"; }
            quit.wait();
        });
    }
    quit.wait(); // 全スレッドが wait するまで待つ
    cout << "はい、次の組...\n";

    for (thread& thr : threads ) { thr.join(); }
}

/* 実行結果:
thread 0 位置について
thread 1 位置について
thread 2 位置について
thread 3 位置について
thread 3 よーい
thread 2 よーい
thread 0 よーい
thread 1 よーい
1 どん!
0 どん!
3 どん!
2 どん!
はい、次の組...
*/
```
CodeIgniterの怖いデフォルト設定 - database.php

まず、結論から

```php
$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'username';
$db['default']['password'] = ''password;
$db['default']['database'] = 'database';
$db['default']['dbdriver'] = 'mysql';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = FALSE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = FALSE;
$db['default']['stricton'] = FALSE;
```

こうした方がよくて、デフォルトと何が違うかっていうと

```php
$db['default']['pconnect'] = FALSE;
$db['default']['autoinit'] = FALSE;
```

この二つです。

前々からCodeIgniter使ってるときにDatabaseの最大コネクション数でエラーに陥っていました。

しょうがないので、データベースサーバのスケールアップとかで対応していのですが、実はこいつらの所為だったぽいのです。

こいつらなんなのかというと、

- `pconnect`はDBと永続的な接続を行う
- `autoinit`はモデルが生成されたとき？に勝手にデータベースを初期化する

これらで接続数が稼がれていたようです。

接続数でお困りの方はこれらを`FALSE`にするのをおすすめします。
system/libraries/Log.phpをオーバーライドする

公式が用意しているLogクラスって少し使いにくいんですよね。

設定でログをapplication/logsに出すようにしても、CIのsystemクラスたちがログ出力するゴミが多いんです。

なので、systemクラスのLog.phpをオーバーライドしたものを紹介します。

まず、application/librariesフォルダの中に、MY_Log.phpを定義して`CI_Log`を継承するようにします。

```php
class MY_Log extends CI_Log {
// something
}
```

そうしたら、実際にログ出力に使っているLog.phpの中にある`write_log`メソッドをそのままコピペして、'log-'の部分をメソッドの引数（使われているのをしっかり理解して引数とする）にしてしまい、それを使うようにします。

```php
public function write_log($level = 'error', $msg, $php_error = FALSE, $prefix = 'log-', $ignore_level = false) {
// something
}
```

実際のファイルはこれです。こいつを使って下さい。

- [application/libraries/MY_Log.php](https://github.com/kaneshin/CodeIgniter/blob/kaneshin/application/libraries/MY_Log.php)


これを作ったら、今度はapplication/helpersフォルダにlog_helper.phpというファイルを作り、ヘルパー内でLogクラスをロードして、先ほどの`write_log`のラッパー関数を作ります。

```php
if (!function_exists('debug_log'))
{
    function debug_log($message, $prefix = 'debug', $php_error = FALSE)
    {
        $_log =& load_class('Log');
        $_log->write_log('DEBUG', $message, $php_error, $prefix.'-', TRUE);
    }
}
```

いい名前が思いつかないので、`debug_log`という名前で使ってます。

これがあれば、

```php
debug_log('Exception message is here', 'exception');
```

のように使用すると、application/logsフォルダの中に`exception-2013-12-23.php`のように作成されます。

これオススメ！
Adding My Flavor in CodeIgniter

いや、決してさぼってたわけじゃない。

仕事が忙しかったんです。。

ちょっと、ネタがないのでCodeIgniter公式のソースをフォークして自分好みにしたものをgithubにあげているのでよかったら見てみて下さい。

という紹介。

[kaneshin/CodeIgniter](https://github.com/kaneshin/CodeIgniter)


書こうと思えば書く事はあるんだ…（時間が…）
gitのコマンド補正機能 - Autocorrect

いつの間にか自分が書く日を過ぎていた。

さて、gitのAdvent Calendar 2013の19日目の記事です。

何を書こうかな〜って思ってたんですが、多分あまり知られてないようなものにしました。

それは「勝手にコマンドを補正してくれる」機能です。

例えば何かをコミットしたくて`add`するときに焦っちゃって`addd`にした場合、

```shell-session
$ master git addd -u
WARNING: You called a Git command named 'addd', which does not exist.
Continuing under the assumption that you meant 'add'
in 0.1 seconds automatically...
```

このように勝手に補正してくれます。（紹介してて何ですが、こういう機能は好きじゃないです。笑）

さて、本題で、どうやったら設定できるの？ですが、

１行をターミナルに打ち込むだけです。

```shell-session
git config --global help.autocorrect 1
```

これを打ち込むだけで、勝手に補正されるようになります。

もし無効にしたのであれば

```shell-session
git config --global help.autocorrect 0
```

でokです。

簡単ですね。

なんか待たされるの嫌なんだけどって人は

```shell-session
git config --global help.autocorrect -1
```

負数を与えるとよいです。

## おまけ

.gitconfigに設定してあるaliasを見たいときにaliasにaliasを表示するaliasを設定するといいっす。

```shell-session
alias = !git config --list | grep 'alias\\.' | sed 's/alias\\.\\([^=]*\\)=\\(.*\\)/\\1\\\t => \\2/' | sort
```

ね、簡単でしょう。

補正機能使うなら、alias設定を推奨します。
Mac に NetBeans + Glassfish の環境を整える


Mac OS X に NetBeans + Glassfish の環境を整える手順。
今回、インストールするバージョンは

* Glassfish 3.1.2
* NetBeans 7.2

です。バージョンは少し古いですが諸事情でｗ
これにフレームワークとして JSF を使います。

## NetBeans のインストール

NetBeans IDE 7.2 をダウンロードします。

7.2 は[こちら](https://netbeans.org/downloads/7.2/index.html)からダウンロードできます。

プラットフォームを Mac OS X を選択し、 GlassFish Server が含まれている Java EE を選択します。

![NetBeans_IDE_Download.png](https://s3-ap-northeast-1.amazonaws.com/yosh18qiita/NetBeans_IDE_Download.png "NetBeans_IDE_Download.png")

ダウンロードした .dmg を実行するとインストーラが実行されます。

![NetBeans_Install_start.png](https://s3-ap-northeast-1.amazonaws.com/yosh18qiita/NetBeans_Install_start.png "NetBeans_Install_start.png")

あとは、指示に従ってインストールを完了します。

![NetBeans_Install_finished.png](https://s3-ap-northeast-1.amazonaws.com/yosh18qiita/NetBeans_Install_finished.png "NetBeans_Install_finished.png")


## NetBeans の実行

NetBeans を実行します。

![NetBeans_Startup.png](https://s3-ap-northeast-1.amazonaws.com/yosh18qiita/NetBeans_Startup.png "NetBeans_Startup.png")

![NetBeans_start_page.png](https://s3-ap-northeast-1.amazonaws.com/yosh18qiita/NetBeans_start_page.png "NetBeans_start_page.png")

メニューから [ファイル] - [新規プロジェクト] を選択し、 Java EE -> エンタープライズ・アプリケーションを選択します。
![NetBeans_NewProject_1.png](https://s3-ap-northeast-1.amazonaws.com/yosh18qiita/NetBeans_NewProject_1.png "NetBeans_NewProject_1.png")


プロジェクト名、プロジェクトの場所、プロジェクトフォルダを指定し、次にサーバーと Java EE バージョンの設定を行います。

ここでサーバーに [GlassFish Server 3.1.2] が出てくるので、それを選択します。
![NetBeans_NewProject_3.png](https://s3-ap-northeast-1.amazonaws.com/yosh18qiita/NetBeans_NewProject_3.png "NetBeans_NewProject_3.png")

これで、アプリケーションの雛形が完成。

次に JSF の設定をします。
war のノードを右クリックし [プロパティ]  を選択。
[フレームワーク] カテゴリを選択し、[追加] をクリック。
[フレームワークの追加] で [JavaServer Faces] を選択し、[OK] をクリック。
![NetBeans_NewProject_4.png](https://s3-ap-northeast-1.amazonaws.com/yosh18qiita/NetBeans_NewProject_4.png "NetBeans_NewProject_4.png")

これで JSF が追加されます。

この状態で [プロジェクトの実行] をすると、[Hello from Facelets] というメッセージ画面が立ち上がります。
![NetBeans_JSF_start.png](https://s3-ap-northeast-1.amazonaws.com/yosh18qiita/NetBeans_JSF_start.png "NetBeans_JSF_start.png")
DropwizardのConfiguration

Hello Worldから続けて[User Manual](http://dropwizard.codahale.com/manual/core/)を確認していく。

Dropwizardのバージョンは0.6.2。

# 設定ファイル

使用できる設定ファイルはyamlとjson。
ファイルの拡張子がyml、yamlでない場合はjsonとしてパースをするとのこと。

```yaml:message-queue.yml
messageQueue:
  host: mq.example.com
  port: 5673
```

```json:message-queue.json
{
  "messageQueue" : {
    "host" : "mq.example.com",
    "port" : 5678
  }
}
```
# 設定のグループ化

Configurationはある程度のまとまりでグループ化することができる。
入れ子になったyamlに対応するConfigurationは以下のとおり。

```yaml:message-queue.yml
messageQueue:
  host: mq.example.com
  port: 5673
```

```java:MessageQueueConfiguration.java
package example.core.configuration;

import com.fasterxml.jackson.annotation.JsonProperty;
import org.hibernate.validator.constraints.NotEmpty;

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;

public class MessageQueueConfiguration {

    @NotEmpty
    @JsonProperty
    private String host;

    @Min(1)
    @Max(65535)
    @JsonProperty
    private int port = 5672;

    public String getHost() {
        return host;
    }

    public int getPort() {
        return port;
    }
}
```

```java:ExampleServiceConfiguration.java
package example.core.configuration;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.yammer.dropwizard.config.Configuration;

import javax.validation.Valid;
import javax.validation.constraints.NotNull;

public class ExampleServiceConfiguration extends Configuration {

    @Valid
    @NotNull
    @JsonProperty
    private MessageQueueConfiguration messageQueue = new MessageQueueConfiguration();

    public MessageQueueConfiguration getMessageQueue() {
        return messageQueue;
    }
}
```

# 設定の検証

ConfigurationはHibernate Validatorのアノテーションを付与することでサーバ起動時に検証することができる。
入れ子になっている場合も`@Valid`で検証可能。

# システムプロパティで上書き

サーバ起動時のコマンドに`-Ddw.(設定のパス)=(値)`を追加することでyamlファイルの設定値を上書きすることができる。

```
java -jar example.jar -Ddw.messageQueue.port=5432 server message-queue.yml
```
非ジェネリック版 Enum.TryParse

```csharp:EnumEx.cs
using System;
using System.Collections.Generic;
using System.Reflection;


class Program
{
    static void Main(string[] args)
    {
        object vt1;
        bool b1 = EnumEx.TryParse(typeof(FizzBuzz), "Buzz", out vt1);
        Console.WriteLine("{0} {1}", b1, vt1);
        object vt2;
        bool b2 = EnumEx.TryParse(typeof(FizzBuzz), "-", out vt2);
        Console.WriteLine("{0} {1}", b2, vt2);
    }
}

enum FizzBuzz
{
    Fizz,
    Buzz
}

class EnumEx
{
    private delegate Tuple<bool, object> Parser(string value);
    private static readonly MethodInfo genericMethod = typeof(EnumEx).GetMethod("DoTryParse", BindingFlags.NonPublic | BindingFlags.Static);
    private static readonly Dictionary<Type, Parser> delegates = new Dictionary<Type, Parser>();

    public static bool TryParse(Type enumType, string value, out object result)
    {
        if (enumType == null)
        {
            throw new ArgumentNullException("enumType");
        }
        if (!enumType.IsEnum)
        {
            throw new ArgumentException("enumType is not Enum");
        }
        if (value == null)
        {
            result = (ValueType)Activator.CreateInstance(enumType);
            return false;
        }
        Parser p;
        if (!delegates.TryGetValue(enumType, out p))
        {
            p = (Parser)Delegate.CreateDelegate(typeof(Parser), genericMethod.MakeGenericMethod(enumType));
            delegates[enumType] = p;
        }
        var tuple = p.Invoke(value);
        result = tuple.Item2;
        return tuple.Item1;
    }

    private static Tuple<bool, object> DoTryParse<TEnum>(string value)
        where TEnum : struct
    {
        TEnum e;
        bool success = Enum.TryParse<TEnum>(value, out e);
        return Tuple.Create(success, (object)e);
    }
}
```
LaravelのRoute

Laravelで地味にハマったのでメモ

Laravelのドキュメントルートはデフォルトだと

https://localhost/作業ディレクトリ/public

らしい。
http://laravel4.kore1server.com/docs
にならってRouteにusersを追加。

```php

Route::get('users', function()
{
    return 'Users!';
});

```

とりあえずURIをたたいてみる

https://localhost/作業ディレクトリ/public/users

すると
Not Found

The requested URL /作業ディレクトリ/public/users was not found on this server.

なんでやねん＼(^o^)／

調べてたらここに行き着いた
http://forums.laravel.io/viewtopic.php?pid=19860

index.phpを起動させる？的な意味でURIに入れなきゃいけないらすい
https://localhost/作業ディレクトリ/public/index.php/users

なんかかっこ悪いけど動いた。
ちなみにindex.phpを入れたくない(そもそもpublicもいらね)ってのだとなんか設定が必要っぽい
http://forums.laravel.io/viewtopic.php?id=926

とりあえずはこのままでいいかなーと思っている。
Unityで Windows Phoneアプリを開発しよう


#Unityというゲームエンジンを使用してWindows Phoneアプリが作れる

Unityというマルチプラットフォーム対応のゲームエンジンを利用すると、iOS, Android, Windowsストア, WindowsPhone8向けのゲームアプリをほぼ同時に開発することが可能です。

Unityは、大変すばらしい開発環境であり、ゲームエンジンでもあります。とりあえずは無料で開発ができて、しかもプロトタイプであればあっという間にゲームが作れます。

それに、なんとC＃でコーディングができるんです。１度、Windows PhoneアプリのゲームをUnityで開発してみては、どうでしょうか。

アプリがヒットした場合でも、iPhoneやAndroid用に簡単に書き出すことができるのは、すごいアドバンテージになります。（時間とコストがセーブできます。）

#Unityで作成したゲームをWindows Phoneアプリとしてリリースした時のメモ

（このとき僕は、Unity4.2で開発したので、VisualStudio 2012を使用しました。今はUnity4.3がリリースされています。Unity4.3を使用する場合は、VS2013を使用して下さい。）

##Unity側：

BackButtonの対応をUnity側でする。

ネイティブ プラグインを使用する場合は、Assets¥Plugins¥WP8の下にソースを作成する。

Windows Phoneだけに有効にしたいソースコードは、#if UNITY_WP8 を使用する。

あと、Publishingフォルダを作成し、3つのLogoを追加。(150×150,310×150,30×30)

Logo50x50, SplashScreen620x300も追加する。


##VisualStudio側:

WMAppManifest.xmlを変更

```
<DefaultTask Name=”_default” NavigationPage=”MainPage.xaml” ActivationPolicy=”Resume”/>
```

リリース用のBuildをする時は、必ずDevice-Master-ARMで行うこと。

プロジェクト-ストアキットを開くで、テストを行う時は、なぜかRelease-ARMでないとできない。(これを配布用として使用しないように注意のこと)


##Unityで開発した Windows Phone8 のゲームアプリ：「走れテディ」
http://www.windowsphone.com/ja-jp/store/app/teddy-run/b9422f97-0830-4eb5-9f46-5278b3f6ce9d



最後に、Windows Phone8のゲームアプリ「走れテディ」をご紹介させて頂きました。

Unity 楽しい 最高だ!! by Twitter: @sadaki7