OmniAICreator/Qiita-1.07M huggingface dataset:
Java7からのjcmdのススメ(ThreadDump/HeapDump他)


Java7(JDK1.7)から`jcmd`という診断ツールが追加されました。
元はJrockitというVM(Oracleが買収したBEAが開発してきてたJavaVM)に付属していた```jrcmd```を移植したツールです。

Java6までの方法も継続して使えますが、折角なのでjcmdを使った方法も試してましょう。

（※JDK7u4以降で使用可能です。）

## JavaプロセスID取得
```
$ jcmd
```

`jps -l`と同じ

## スレッドダンプ出力
```
$ jcmd <pid> Thread.print 
```

`jstack <pid> `と同じ

## ヒープダンプ出力
```
$ jcmd <pid> GC.heap_dump /fullpath/to/dump_file
```

`jmap -dump:format=b,file=/fullpath/to/dump_file <pid>`と同じ

## 他のコマンド
とまぁ、基本的に既存コマンドの代替が多いですが、jcmdには他にも以下の様なコマンドが用意されています。

書式

```
$ jcmd <pid> <command> <option>
```

### コマンド一覧
+ VM.uptime `起動時間(秒)`
+ VM.flags `起動オプションの表示`
+ VM.flags -all `全オプションの値表示`
+ VM.system_properties `Systemプロパティの表示`
+ VM.command_line `起動時のコマンドライン表示`
+ VM.version `バージョン表示`
+ GC.run `System.gc()の実行`
+ GC.run_finalization `System#runFinalization()`の実行
+ GC.class_histogram `ヒープ上のインスタンス数、バイト数出力`

## 備考
javaのプロセス出力だけで言えば、

```
jps -lv
```

が起動時のコマンドまで出力してくれて、複数のjavaプロセスが動いているときなどに把握しやすかったりするなど、既存のコマンドが不要になったわけではありません。
また、`jcmd`でぐぐってもj **r** cmd (jrockit付属時のコマンド名)が多く引っかかったりするなど、どれだけ使われているのかも甚だ疑問です。(既存のコマンドで代替可能だし)

とはいえ、バージョン表示やSystemプロパティなどが取得しやすくなっていたりするのでツールは目的に応じて使い分けていくのがいいと思います。
AirRecordでBOOLEAN型の値が、必ず「true」として保存されてしまう不具合の対処方法

AirRecordでBOOLEAN型の値が、必ず「true」として保存されてしまう不具合の対処方法

###問題

AirRecord 1.2で、フィールドをBOOLEAN型として「false」の値をインサートしても、DB上に「true」として保存されてしまい困っていました。

###対処方法

下記のように、「true」と「false」の場合で処理を分岐するよう、コードを修正をしました。

```as3:ARSQLite.as
		public function value(value:*):String
		{
			if (value == null || (value is Number && isNaN(value))) return 'NULL';
			/* ここから */
			if (value == false) {
				return 'false';
			}
			if (value == true) {
				return 'true';
			}
			/* ここまで 追加 */
			value = this.escape(value);
			return "'" + value + "'";
		}
```

###原因

AirRecordでは、SQL文に直す際に文字列化(?)を行っており、その際に「true」と「false」はBoolean型ではなくString型として変換されていました。
また、Action Scriptでは、String型をBoolean型として強制型変換を行うと、NULL（空）以外はすべて「true」扱いになるため、どんな値をいれようとも「true」として認識されていたようです。

###謝辞

また、今回の修正にあたり以下の記事を参考にさせていただきました。感謝です。

- [ActiveRecordは、ByteArrayを保存できない](http://d.hatena.ne.jp/takanemu/20101019/1287502190)

- [AIRでのsqlite環境をActiveRecordパターンにして快適に！ついでにByteArrayを扱えるように。](http://qiita.com/masamunet/items/d87df6ec7aa42d55574d)
GitHub に Explore というのがあるというのを最近知った



知らんかったわー！ってことでQiitaに書いた。


## Explore

https://github.com/explore

![819b5d503fe1b2eeb52c56898478ab63.png](https://qiita-image-store.s3.amazonaws.com/0/17133/006a67af-0971-5556-fb1f-378c127f45d8.png "819b5d503fe1b2eeb52c56898478ab63.png")


これは何かというと、最近イケてる（trendingな）リポジトリを一覧できるページ。

主に3つの一覧があるみたい。

- Showcases
- Trending
- Stars

## Showcases 

- 各ジャンルごとのリポジトリが色々載ってる。
  - 例えば [showcases/devops-tools](https://github.com/showcases/devops-tools) というページには puppet, chef, ansible 等々のリポジトリ一覧がある
- https://github.com/showcases
  - ↑のページの右上をみると RSS feed もあるみたい

## Trending

- https://github.com/trending

#### Trending repositories (today / this week/ this month)

:fire: 今日（今週/今月）話題になってるリポジトリ一覧

- 最近だと [webscalesql/webscalesql-5.6](https://github.com/webscalesql/webscalesql-5.6) や [facebook/Tweaks](https://github.com/facebook/Tweaks) がよくでてる

## Stars

- https://github.com/stars

#### Starred by people you follow (today / this week/ this month)

:star: 今日（今週/今月）あなたがフォローしている人がスターしたリポジトリ一覧

- ソーシャルですね！

#### Starred by GitHub staff (today / this week/ this month)

:octocat: 今日（今週/今月）GitHubスタッフがスターしたリポジトリ一覧

- さすが中の人だけあって boxen や atom とかに関係するのがちらほら見られます


## Subscribe できるみたい

https://github.com/explore/subscribe

- 定期的にこういう情報は見ていたいなって思った人はデイリーとかでメールが来るようにも設定できるらしい。

普段GitHub使ってるので、こういう情報にも触れていたいですね :)

以上！
cornerRadiusを片側だけ効かせる（UIViewの一部だけ角丸にする）

ビューの角を丸くしたいとき、

````
view.layer.cornerRadius = 3.0;
view.layer.masksToBounds = YES;
````

みたいにすればOKですが、「上側だけ」「下側だけ」「右側だけ」「左側だけ」丸くしたい、というケースがあります。

例えば片側だけ角丸にすることで、角丸になってない方に「画面の続きがある」ように見せる、とか。

<img src="https://qiita-image-store.s3.amazonaws.com/0/3180/7c717758-0837-bc63-0fac-9265913ecf5e.jpeg" width="240">

（左側だけ角丸にしたビュー）

##方法

どうやるかというと、cornerRadius自体は使えないのですが、

1. UIBezierPathで角丸のパスを生成
2. CAShapeLayerを生成し、1のパスをセット
3. 2をマスクレイヤーとして（片側だけ角丸にしたいビューのlayerに）セットする

という感じで実現できます。


##サンプル

たとえば、下側（左下、右下）だけ角丸にする場合は、下記のようなコードになります。

```swift:Swift
let maskPath = UIBezierPath(roundedRect: bounds,
                            byRoundingCorners: [.BottomLeft, .BottomRight],
                            cornerRadii: CGSizeMake(3, 3))
let maskLayer = CAShapeLayer()
maskLayer.frame = bounds
maskLayer.path = maskPath.CGPath
layer.mask = maskLayer
```

```objc:Objective-C
UIBezierPath *maskPath;
maskPath = [UIBezierPath bezierPathWithRoundedRect:self.view.bounds
                                 byRoundingCorners:(UIRectCornerBottomLeft | UIRectCornerBottomRight)
                                       cornerRadii:CGSizeMake(3.0, 3.0)];

CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = self.view.bounds;
maskLayer.path = maskPath.CGPath;
self.view.layer.mask = maskLayer;
````

##参考ページ

[how to set cornerRadius for only top-left and top-right corner of a UIView?](http://stackoverflow.com/questions/10167266/how-to-set-cornerradius-for-only-top-left-and-top-right-corner-of-a-uiview)
Selenium: alert, confirm, promptを扱う方法



alertなどが表示された状態でリクエストを行うと下記の例外が発生する

```
org.openqa.selenium.UnhandledAlertException
```

その場合は、`UnhandledAlertException`をキャッチして、alertを閉じることで対処できる:

```scala
    try {
      driver.getCurrentUrl // org.openqa.selenium.UnhandledAlertException: unexpected alert open
    } catch {
      case e: org.openqa.selenium.UnhandledAlertException =>
        val alert = driver.switchTo.alert
        alert.accept()
    }
```

Selenium2でalertなどを操作するときは、`Alert`オブジェクトをWebDriverから取得する:

```scala
val alert = driver.switchTo.alert
```

* alertで「OK」を押す
* confirmで「OK」を押す
* promptで「OK」を押す

```scala
alert.accept()
```

confirmで「Cancel」を押す

```scala
alert.dismiss()
```


promptで文字列を入力する

```scala
alert.sendKeys("テキスト")
```

alert, confirm, promptに表示された文言を取得する

```scala
val text = alert.getText
```
Javaで和暦→西暦、西暦→和暦に変換する

#Javaで和暦を使う
Java6から標準で和暦対応のCalendarクラスが提供されています。
Calendarクラスのインスタンス生成時にロケールが「ja_JP_JP」となっていれば
和暦に対応したJapaneseImperialCalendarインスタンスが生成されます。

DateFormatのパターンで元号は「G]で表します。
「G」が1～3個の場合「H」「S」のようにアルファベットで表示し、
4個の場合「平成」「昭和」のように漢字で表示します。

```WarekiSample.java
//ロケールを指定してCalendarインスタンスを取得
Locale locale = new Locale("ja", "JP", "JP");
Calendar calendar = Calendar.getInstance(locale);

//calendar.getTime()で現在日時を取得して和暦にフォーマットする
DateFormat japaseseFormat = new SimpleDateFormat("GGGGy年M月d日", locale);
String dateStr = japaseseFormat.format(calendar.getTime());
System.out.println("和暦:" + dateStr);

//和暦にフォーマットした現在日時を西暦にパースする
//日付の妥当性をチェックするためsetLenient()にfalseを渡す
calendar.setLenient(false);
Date date = japaseseFormat.parse(dateStr);
System.out.println("西暦:" + date);	
```

###実行結果
` 和暦:平成26年3月25日
西暦:Tue Mar 25 00:00:00 JST 2014 `
WindowsでVagrant+Chefする

2014年3月19日、Vagrantは1.5.1の時点の話です。

まとめ
======

knife soloを使うハックが何種類かある。

* fstabでどうにかする（http://knowledge.sakura.ad.jp/tech/1192/)

```:/etc/fstab
c:		/cygdrive/c
```

  knife-soloのlib/chef/knife/solo_cook.rb:163でcygdriveとかベタ書きなんだけどもうちょっと何とかならんのこれ。

* もしくはrsyncだけCygwin用のを使う。
* もしくはVagrantfile中に記述してvagrant provisionで行う。VagrantじゃなくてChefしたい時とか再利用できないしなー。
* vagrant-berkshelfプラグインはもう古いらしい。入れない。
* VagrantとかBerkshelfとかChefのスケルトンは、とりあえず最低限で作っていったほうが理解が早い。
* なんか遅くない？

最低限
======

* vagrant plugin install vagrant-omnibus
* vagrant plugin install vagrant-proxyconf
* (私の環境では必要なので。)
* 最低限のVagrantfileでいい。

```rb:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|

  config.vm.hostname = "xxx-berkshelf"

  config.vm.box = "cent6.4"

  config.vm.box_url = "https://dl.dropbox.com/u/31081437/Berkshelf-CentOS-6.3-x86_64-minimal.box"

  config.vm.network :private_network, ip: "33.33.33.10"
  config.proxy.http     = ENV['http_proxy']
  config.proxy.https    = ENV['https_proxy']
  config.proxy.no_proxy = "localhost,127.0.0.1,.example.com"
  config.yum_proxy.http     = ENV['http_proxy']

  config.omnibus.chef_version = :latest
end
```

* 最低限のBerksfileを作る

```rb:Berksfile
site :opscode

cookbook 'yum'
cookbook 'yum-epel'
cookbook 'mysql'
cookbook 'cookbook-yumfastestmirror', git: 'https://github.com/DQNEO/cookbook-yumfastestmirror.git'
cookbook 'chef-yumrepo', git: 'https://github.com/priestjim/chef-yumrepo.git'
```

* vagrant up
* vagrant ssh-config --host melody >> ~/.ssh/config
* LANG=C knife solo cook melody
* LANG=ja_JP.UTF-8だと、berkの結果cookbook以下に変なディレクトリが出来る模様。

* デフォルトでsite-cookbooks以下は実行してくれるので、cookbookはそっちに追加する。knife cookbook createだとファイルが多いので、最低限っぽいcookbookだと[Cookbook for 最低限の開発環境構築](https://github.com/amacbee/chef-env)がわかりやすいかな。


Vagrantにproviderを追加するプラグイン([vagrant-aws](https://github.com/mitchellh/vagrant-aws)とか)を入れて、vagrantのprovisionでやるのもatomicだしいいのかもしれないけど、個人的にはknifeでちまちまやるほうがわかりやすい気がする。

しかし時代は[ansible](http://www.ansible.com/home)らしいですね。（[Vagrant と Ansible で Windows でも快適開発 ](http://qiita.com/garbagetown/items/d9a4eb64b778bd7d659c)）
#Gentoo Linuxに #rbenv インストールするときのメモ

Gentoo Linuxにrbenv入れる手順をよく忘れるのでメモ。

----

## libs

* libyaml

```shell-session
# emerge -pqv libyaml
[ebuild   R   ] dev-libs/libyaml-0.1.6  USE="-doc -examples -static-libs {-test}" 
```

* libiconv

```shell-session
# emerge -pqv libiconv
```

## rbenv

普通に。

```shell-session
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ echo 'export PATH="$HOME/.rbenv/shims:$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
```

### rbenv install

`/tmp`が`noexec`付きでmountされていると[こんな感じ](http://qiita.com/mazgi/items/2ea799d84f42f3071ddf)にコケるので、

```shell-session
# mount | grep /tmp
tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noexec,relatime)
```

`TMPDIR`環境変数に別のディレクトリを指定する。

```shell-session
$ mkdir -p tmp
$ TMPDIR="${PWD}/tmp" rbenv install 2.1.1
```

## bundler

```shell-session
$ rbenv shell 2.1.1
$ ruby -v
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-linux]
$ which ruby
${HOME}/.rbenv/shims/ruby
$ gem install --no-ri --no-rdoc bundler
Fetching: bundler-1.6.0.gem (100%)
Successfully installed bundler-1.6.0
1 gem installed
```
Elasticsearchで全てのデータ(index)を削除する

Elasticsearchで全てのデータ(index)を削除する
===

方法
---
* WebAPIを直接たたいて削除します

例
---
```
# curl -XDELETE 'http://localhost:9200/*'
{"acknowledged":true}
```

終わりに
---
怖いコマンドだから気を付けて！

参考
---
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-delete-index.html
Salesforce1におけるレコードへのダイレクトアクセス方法

# Salesforce1について

Salesforce1とは、Salesforceが提供しているスマフォ版モバイルアプリ（およびその関連プラットフォームの総称としても用いられます）です。
利用方法としてはハイブリッドアプリであるSalesforce1をAppStoreなりGoogle Playなりからダウンロードする方法と、各組織内のURL　(`https://{インスタンス名}.salesforce.com/one/one.app`) にWebブラウザからアクセスする、という方法があります。

![Salesforce1.png](https://qiita-image-store.s3.amazonaws.com/0/6495/18591c94-2777-7bf1-e3e1-23230a7d9b59.png)


# 外部アプリからの連携

Salesforceに外部から連携するモバイルアプリを作成している場合、あるSalesforce内のレコード（取引先とか商談とか）のモバイル用の詳細画面にダイレクトにアクセスしたい、という要求があります。

PC版のURLは `https://{インスタンス名}.salesforce.com/{recordId}` でアクセスできますが、Salesforce1のレコード詳細画面のURLについては、`/one/one.app#eyJ......` のような意味不明な文字列が`#`以下に設定されており、よくわかりません。

しかし、この文字列は解析不可能なものではありません。実はレコード情報を含むJSON文字列をBase64encodeしたものになっています。

Google Chrome でSalesforce1画面を立ちあげ、任意のレコード詳細画面を表示した状態で Developer Tools を開き、以下のスクリプトを実行してみます。

```js
JSON.parse(atob(location.hash.substring(1)))
```

![Salesforce1ChromeDevTools.png](https://qiita-image-store.s3.amazonaws.com/0/6495/dfb484d9-1de0-69dc-d48e-2e950488007f.png)

エンコードされているJSONは以下の様な形式になっています。

```json
{
    "componentDef": "force:recordHome",
    "attributes": {
        "values": {
            "recordId": "0018000000OxOkjAAF"
        }
    },
    "t": 1396239886613
}
```

`atob`はBase64デコードを行う組み込み関数です。iOS, Androidを含め、Webkitベースの最新のモバイルブラウザはほぼ対応しています。反対にBase64エンコードを行う関数は`btoa`で提供されています

ここで、JSON内の`recordId`の部分を表示したいレコードのIDを設定し、同様のJSON文字列を生成してBase64エンコードしたものをハッシュに設定してみます。（`t`はおそらくタイムスタンプ）

```js
location.hash = "#" + btoa(JSON.stringify({
  "componentDef": "force:recordHome",
  "attributes": {
    "values": {
      "recordId": "00580000001oRWZAA2"
    }
  },
  "t": Date.now()
}))
```

するとハッシュに設定したレコードの詳細ページが開きました。

![Salesforce1ChromeDevTools_after.png](https://qiita-image-store.s3.amazonaws.com/0/6495/c559a7bc-9fd4-2eb6-a824-ac3bbf873be6.png)


# 免責事項

以上の動作は特にマニュアルに記載されたものではないので、予告なく動作が変更になる可能性があります。その辺ご考慮の上でご利用下さい
FragmentのトランジションでXML以外のアニメーションを指定する

Fragmentのトランジション(切り替えアニメーション)を指定する場合、`FragmentTransaction#setCustomAnimations()`または`FragmentTransaction#setTransition()`を使用しますが、これらはリソースで定義されたアニメーションか、標準で定義されたアニメーションしか指定できません。
XMLで表現できないような高度なアニメーションを指定したい場合には以下の方法で行うことができます。

##Support Library v4を使う場合
`Fragment#onCreateAnimation(int, boolean, int)`は切り替えアニメーションの生成時に呼ばれ、第一引数には`FragmentTransaction#setTransition(int)`で指定したトランジション識別子が渡されます。
この事を利用し、独自のトランジション識別子を定義してそれに応じたAnimationを返すようにします。

```java:CustomFragment.java
public class CustomFragment extends Fragment {

    // FragmentTransaction.TRANSIT_XXXと重複しないIDを定義
    public static final int TRANSIT_HOGE = 0x10000;

    @Override
    public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {
        if (transit == TRANSIT_HOGE) {
            Animation anim;
            if (enter) {
                // enter用アニメーションを生成
                anim = new HogeAnimation(...);
                ...
            } else {
                // exit用アニメーションを生成
                anim = new HugaAnimation(...);
                ...
            }
            return anim;
        } else {
            return super.onCreateAnimation(transit, enter, nextAnim);
        }
    }
}
```

```java:FragmentTransactionの実行
getSupportFragmentManager()
  .beginTransaction()
  .replace(container, newFragment)
  .setTransition(CustomFragment.TRANSIT_HOGE)
  .commit();
```
既存のトランジションIDと重複しないIDを定義することで、既存の動作を変えずに新しいアニメーションを追加定義することができます。


##Support Libraryを使わない場合
`onCreateAnimation()`が`onCreateAnimator()`に変わり、返すオブジェクトが`Animation`から`Animator`に変わります。それ以外は一緒だと思います。
【グラフ描画ライブラリ】ccchartの使い方メモ

# はじめに
Javascriptのグラフライブラリ[ccchart](http://ccchart.com/)の使い方をメモ。
ccchartは折れ線、棒、積み上げ、面、円、散布図等いろいろなチャートが手軽に描画できるライブラリです。
ここでは折れ線グラフの作り方をメモ。


# 読み込み

[ccchart.js](http://ccchart.com/js/ccchart.js)をダウンロードし、適当な場所に配置してHTMLで読み込みます。
また、設定を記述するためのjsファイルも用意します（ここではmy.js)。

```html:sample.html
<script type="text/javascript" language="javascript"  src="/sample/public/javascripts/ccchart.js"></script>
<script type="text/javascript" language="javascript"  src="/sample/public/javascripts/my.js"></script>
```

# canvasタグを記述
HTMLにcanvasタグを記述します。

```html:sample.html
<canvas id="chart_sample1"></canvas>
<canvas id="chart_sample2"></canvas>
```

# 共通プロパティ設定

ここからはjavaScriptを記述します。
ccchart.baseを使って、すべてのチャート共通の設定を行います。

```js:my.js
  ccchart.base('', {config : {
    "type" : "line", //チャート種類
    "useVal" : "yes", //値を表示
    "xScaleFont" : "100 16px 'meiryo'", //水平軸目盛フォント
    "yScaleFont" : "100 16px 'meiryo'", //垂直軸目盛フォント
    "hanreiFont" : "bold 16px 'meiryo'", //凡例フォント
    "valFont" : "bold 16px 'meiryo'", //値フォント
    "paddingTop" : "25", //上パディング
    "paddingRight" : "140", //右パディング
    "colorSet" : ["blue"], //データ列の色
    "useShadow" : "no", //影
    "height" : "300", //チャート高さ
    "width" : "900", //チャート幅
    "useMarker" : "arc", //マーカー種類
    "markerWidth" : "7", //マーカー大きさ
    "valYOffset" : "8", //値オフセット
    "valXOffset" : "-8", //値オフセット
    "bg" : "#fff", //背景色
    "textColor" : "#333", //テキスト色
    "lineWidth" : "1", //ラインの太さ
  }});
```

# 個別プロパティ設定

チャートに個別のプロパティを設定します。

```js:my.js
  var chart_sample1 = {
    "config" : {
      "colorSet" : ["red"], //データ列の色
      "minY" : 0, //Y軸最小値
      "maxY" : 100, //Y軸最大値
      "axisXLen" : 10, //水平目盛線の本数
      "roundDigit":0, // 軸目盛値の端数処理
    },
    "data" : [
                ["日付"],
                ["売上A"],
             ]
  };
  var chart_sample2 = {
    "config" : {
      "colorSet" : ["blue"], //データ列の色
      "minY" : 0, //Y軸最小値
      "maxY" : 50, //Y軸最大値
      "axisXLen" : 5, //水平目盛線の本数
      "roundDigit":0, // 軸目盛値の端数処理
    },
    "data" : [
                ["日付"],
                ["売上B"],
             ]
  };
```

# データ設定

先ほど設定したハッシュにデータを追加します。

```js:my.js
// チャート用データ設定  
var sales1 = {4:10, 5:30, 6:40, 7:30, 8:60, 9:50};
var i = 0;
for (key in sales1){
  i++;
  chart_sample1["data"][0][i] = key;
  chart_sample1["data"][1][i] = sales1[key];
}

// チャート用データ設定  
var sales2 = {2011:7000, 2012:7500, 2013:8000};
var i = 0;
for (key in sales2){
  i++;
  chart_sample2["data"][0][i] = key;
  chart_sample2["data"][1][i] = sales2[key];
}
```

# チャート表示

ccchart.initでチャートを表示します。

```js:my.js

// 第一引数：canvasのID、第二引数：設定とデータが入ったハッシュ
ccchart.init("chart_sample1", chart_sample1); 
ccchart.init("chart_sample2", chart_sample2);
```

出来上がり。

![ccchart_sample.PNG](https://qiita-image-store.s3.amazonaws.com/0/38582/940f28f5-b26c-e9a5-cbf2-a5552853a17c.png)


とりあえず表示できたら、[公式サイト](http://ccchart.com/)を見ながらいろいろ試してみましょう。
Objective-CでJSONを使う


頻繁に使うわけじゃなくて、毎回使うときに忘れるのでメモ。
`NSString`から`NSData`を生成して、それを`JSONSerialization`する、という流れ。

```objc
NSString *jsonString = @"{\
    \"body\": \"hoge\",\
    \"fuga\": \"foo\"\
}";

NSData *data = [jsonString dataUsingEncoding:NSUTF8StringEncoding];

NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data 
                                                     options:NSJSONReadingAllowFragments
                                                       error:nil];

// JSONのパースに失敗した場合は`nil`が入る
if (json) {
	NSLog(@"%@", json);
}
```
KVMゲストの時間が起動時に9時間ずれてる問題の対応

ntpdでしばらくすると調整されるものの、修正しておいた方がいい

```
# vi /etc/libvirt/qemu/test01.xml
<clock offset='utc'/>
↓
<clock offset='localtime'/>
# virsh define /etc/libvirt/qemu/test01.xml
# virsh shutdown test01
# virsh start test01
```
Qiita 謎の input

なんか表示がおかしい。

![SnapCrab_NoName_2014-3-31_12-51-20_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/26292/d81157fc-5c3d-b442-afbd-eb28caece940.png)


この input はなんだろう。


環境

Windows 7
Chrome 33.0.1750.154
DynamoDBでSEQUENCE

## 目的
以前S3でシーケンスを行うみたいな記事を書いて
(S3上でSEQUENCE)[http://qiita.com/supertaihei02/items/16b9d1cd938fb074e01e]
会員情報とかS3で管理してランニングコストを下げたいんだー！とか抜かしましたけれども、
これ無理でした。詳細は元記事に追記してます。
代案としてこちらの方法を発見したわけであります。
そうなってくるとランニングコスト下がるかなー？って突っ込みは受け付けません。

とにかく具体的な情報が少なかった。。意外とマイナー？
ずばっとソースを書きます。これでできました！ 2014/03/31現在！

## 下準備

AWSにアクセスしてーDynamoDBを有効化してーもろもろの部分はちょっと他で調べてたも。
準備ができたらまずはクライアント取るところまで。

```php

require(dirname(__FILE__).'/aws.phar'); // load aws.phar
use Aws\Common\Aws;
use Aws\Common\Enum\Region;

$accesskey = 'Your AWS Access Key'; // TODO
$secret = 'Your AWS Access Secret'; // TODO
$region = 'Your Region'; // TODO (Tokyo => Region::AP_NORTHEAST_1)

$aws = AWS::factory(array(
    'key' => $accesskey,
    'secret' => $secret,
    'certificate_authority' => false,
    'region' => $region
));
$client = $aws->get('dynamodb');
```


## シーケンス
これは正式(?)にはatomic counterと呼ばれている手法の様です。
DynamoDBテーブルレコード上のTypeが"Number"のAttributeに対してのみ実行できるアップデートコマンドと考えるとしっくりきます。

以下ソースです。Your ~の部分は自分パラメータに置換してくださいね。

```php
$num = 1;
try {
    $item = $client->updateItem(array(
        'TableName' => 'Your Tablename',
        'Key' => array(
            'Your object keyname' => array(
                'Your object keytype' => 'Your object keyvalue'
            )
        ),
        'AttributeUpdates' => array(
            'Your update object keyname' => array(
                'Action' => 'ADD',
                'Value' => array('N' => $num)
            )
        ),
        'Expected' => null,
        'ReturnValues' => 'UPDATED_NEW'
    ));

    echo intval($item['Attributes']['memberSequence']['N'], 10);
} catch(Exception $e) {
    echo $e->getMessage();
}
```

指定したAttributeが$num値ずつインクリメントされます。
ReturnValuesにUPDATED_NEWを指定しているので更新された後の番号が$itemに入ってきます。
他に（NONE | ALL_OLD | UPDATED_OLD | ALL_NEW）が指定可能です。
Action => ADDのとこがポイントですねー。
Expectedの部分を指定すると条件付きアップデートってのもできそう。

以上！
MapにFunction1/PartialFunctionがmix-inされている理由（美しい・・）

# はじめに
Mapのscaladocを見ていた時、継承しているもの一覧中に異質なものを見つけました。
他のはなんとなくわかると思うのですが、Function1？ PartialFunction？？ んんん？？
![scala.png](https://qiita-image-store.s3.amazonaws.com/0/159/060bae50-d778-8cc7-7d83-4760fd128af2.png)

# Function1とPartialFunctionおさらい
Function1は引数一個を取る関数を表します。
以下、数字を文字列に変換するFunction1の宣言例です。

```scala
val int2String: Function1[Int, String] = _.toString
```

次にPartialFunctionですが、Function1を継承しています。


**trait PartialFunction[-A, +B] extends (A) ⇒ B**

scaladocに書かれている説明では「総称型Aのすべての値を満たすわけではない単項の関数」とあります。
以下、PartialFunctionの宣言例です。

```scala
val pf: PartialFunction[Int, String] = { case 1 => "one" }
```

orElse(やandThen/compose)関数を使って関数合成が行えます。

```scala
val pf1: PartialFunction[Int, String] = { case 1 => "one" }
val pf2: PartialFunction[Int, String] = { case 2 => "two" }
val pf: PartialFunction[Int, String] = pf1 orElse pf2

pf(1) // one
pf(2) // two
pf(3) // MatchError発生
```

なお、上記はお馴染みのこれと同義ですね。

```scala
n match {
  case 1 => "one"
  case 2 => "two"
}
```

# MapにFunction1/PartialFunctionがmix-inされている理由
もうお気づきだと思いますが、要はMapからキーを指定して値を取り出す処理というのが、引数一つを与えて結果を返すFunction1[K,V]/PartialFunction[K,V]だよねってことですね。

```scala
val map = Map(1->"one", 2->"two")
map(1) // one
```

ということは・・・
やはり！Listにも同様にmix-inされていました。
![scala.png](https://qiita-image-store.s3.amazonaws.com/0/159/e0e61d18-f8a2-13ab-ca5f-666432540cde.png)

但しこちらはFunction1[Int, A]/PartialFunction[Int, A]で、入力は常にInt型で固定されている、というのがMapとの違いです。
興味深いですね。

```scala
val list = List("zero", "one", "two")
list(0) // zero
```

# 何が嬉しいのか？
お馴染みの関数達の中にはFunction1やPartialFunctionを引数に取るものが多いため、うまくいけばMap/Listだけで代用出来るようになり、より簡潔に記述できるようになります。

## map関数
map関数は引数にFunction1を取ります。

### before
戻り値はList(one, two, three, unknown)となります。

```scala
List(1,2,3,4) map { n => 
  if(n == 1) "one"
  else if(n == 2) "two"
  else if(n == 3) "three"
  else "unknown"
}
```

※なお、PartialFunctionはFunction1の子なので当然PartialFunctionを渡しても同様の結果を得ることが出来ます。

```scala
List(1,2,3,4) map {
  case 1 => "one"
  case 2 => "two"
  case 3 => "three"
  case _ => "unknown"
}
```

### after
mapはすべての要素について写像処理を行うため、マッチしないものがないようorElseで関数合成してMapを補足してやります。

```scala
List(1,2,3,4) map { Map(1->"one", 2->"two", 3->"three") orElse { case _ => "unknown" } }
```

## collect関数
collect関数は引数にPartialFunctionを取ります。
この関数の振る舞いはfilter + mapを1度に行うもので、PartialFunctionを満たさないものは処理されません。

### before
用意していない4は処理されず、戻り値はList(one, two, three)となります。

```scala
List(1,2,3,4) collect { 
  case 1 => "one"
  case 2 => "two"
  case 3 => "three"
}
```

### after

```scala
List(1,2,3,4) collect { Map(1->"one", 2->"two", 3->"three") }
```

Scalaの構造の美しさに大変感動しました。

# 追記
@gakuzzzz さんに、SetはA=>Booleanをmixinしているという情報をtwitterで[教えていただきました](https://twitter.com/gakuzzzz/status/616556625940221952)。
有難うございます。

```scala
val acceptable = Set(1,2)
val o = Option(1)
o.exists(acceptable)
```
UILabel の文字色をハイライト時に暗めの色にする

UI のインタラクションとしてテキストカラーを少し暗めにしたいことがあったのでその時に使った方法です。

## HSB(HSV) で元の色の Brightness を変更する

先に書いたとおり暗くしたいだけなので RGB でどうこうしようとするのはめんどくささこのうえないです。ですので[前回紹介した HSB(HSV) ](http://qiita.com/griffin_stewie/items/26a9c7f40e1042f79351)を素直に使いたいと思います。HSB(HSV) で元の色の Brightness を変更するアプローチです。

## やりかた

まず暗くしたい元の UIColor から HSB の要素を抜き出します。これには `- (BOOL)getRed:(CGFloat *)red green:(CGFloat *)green blue:(CGFloat *)blue alpha:(CGFloat *)alpha` を使います。各要素の値が抜き取れたところで Brightness の値だけ変更します。今後使いやすいように変更率で調整出来るようにします。すると以下のような感じです。

```objc

+ (UIColor *)csn_colorWithBaseColor:(UIColor *)baseColor brightnessRatio:(CGFloat)ratio
{
    CGFloat hue = 0;
    CGFloat saturation = 0;
    CGFloat brightness = 0;
    CGFloat alpha = 0;
    
    BOOL converted = [baseColor getHue:&hue saturation:&saturation brightness:&brightness alpha:&alpha];
    if (converted) {
        return [UIColor colorWithHue:hue saturation:saturation brightness:(brightness * ratio) alpha:alpha];
    }
 
    return nil;
}

```

## 使い方
   
```objc
self.label.textColor = [UIColor redColor];
self.label.highlightedTextColor = [UIColor csn_colorWithBaseColor:self.label.textColor brightnessRatio:0.65];
```

0.6 ~ 0.7 くらいの値を brightnessRatio に渡してやるとほどほどに暗くなっていいと思います。

## まとめ

RGB でやるよりも HSB でやった方が遙かに直感的に明度の調整ができると思います。今回のメソッドを UIColor のカテゴリメソッドとしてヘッダファイルも含めて Gist に置いておきます。良かったら使って見てください。

[UIColor+CSNAdditions](https://gist.github.com/griffin-stewie/9884611)
ELBのConnection Drainingを使ってみる

[ELBのConnection Drainingがサポート](http://aws.typepad.com/aws_japan/2014/03/elb-connection-draining-remove-instances-from-service-with-care.html)されたので試してみた。
今までApacheのgraceful-stopでELBからインスタンス外してたりしてたけどこれで安全、簡単に取り外しができそう。


## 使ってみた環境

ELB <=> EC2(<=> sinatra)な構成を構築
sinatraは以下のようなコード

```rb
require 'sinatra'

get '/' do
  sleep 30
  'test'
end

get '/status' do
  'ok'
end
```

## management consoleから使ってみる
 * オフの確認
  1. ELBのConnection Drainingオフ
  2. ブラウザやcurlでELBドメインの/にアクセス
  3. ELBからEC2をRemove
  4. /からレスポンスが返らないことを確認(curlではEmpty reply from serverでエラー)
 * オンの確認
  1. ELBのConnection Drainingオン
  2. ブラウザやcurlでELBドメインの/にアクセス
  3. ELBからEC2をRemove
  4. /から"test"が返ることを確認

## API(rubyのaws-sdk)から使ってみる

 * ELBのConnection Drainingオン
 * ブラウザやcurlでELBドメインの/にアクセス
 * 以下のスクリプトを実行

```rb
require 'aws-sdk'

REGION = "ap-northeast-1"
ELB_NAME = "test"

elb = AWS::ELB.new(:proxy_uri => ENV['HTTP_PROXY'] || ENV['http_proxy'], 
                   :region => REGION).load_balancers[ELB_NAME]

deregister_instances = []
elb.instances.each do |instance|
  elb.instances.deregister(instance)
  deregister_instances << instance
  puts "#{instance.instance_id} #{instance.tags["Name"]}"                                                             
end

while true
  sleep 3
  deregister_instances.each do |instance|
    p instance.elb_health
  end 
end
```
 
 * 結果確認(レスポンス返す間はInService)

```bash
$ bundle exec ruby elb_ec2_deregister.rb
i-12345678 test
{:description=>"Instance deregistration currently in progress.", :state=>"InService", :reason_code=>"N/A"}
{:description=>"Instance deregistration currently in progress.", :state=>"InService", :reason_code=>"N/A"}
{:description=>"Instance deregistration currently in progress.", :state=>"InService", :reason_code=>"N/A"}
{:description=>"Instance deregistration currently in progress.", :state=>"InService", :reason_code=>"N/A"}
{:description=>"Instance deregistration currently in progress.", :state=>"InService", :reason_code=>"N/A"}
{:description=>"Instance deregistration currently in progress.", :state=>"InService", :reason_code=>"N/A"}
{:description=>"Instance deregistration currently in progress.", :state=>"InService", :reason_code=>"N/A"}
{:description=>"Instance is not currently registered with the LoadBalancer.", :state=>"OutOfService", :reason_code=>"Instance"}
```
RailsでAjax呼び出し時にリダリレクする方法


例えば、loginしていなかったらlogin画面に遷移する場合。

```controller
def check_login
	unless login?
 		render js: "window.location = '#{login_path}'"
	end
end
```

check_login.js.erbを用意して、そのjsファイルないで以下をおこなってもよいですが、上記のように直接指定してもOKです。

```check_login.js.erb
<% unless login? %>
window.location = '<%= login_path %>'
<% end %>
```
【Graph API】リンクシェアでプレビューが上手く表示されない？そんなときは・・・

クロールのバグな感じがするが・・・、
あれ？っと思ったときの回避手段のひとつとして。

----

'POST /me/links'でリンクをシェアすると、 __たまに__ ”サムネイルが表示されない”とか起きることがある（あった）。

```
POST /me/links HTTP/1.1
Host: graph.facebook.com

message=This+is+a+test+message
link=http://example.com/
```

そんなときは（そんなときのために？）[POST /me/feed](https://developers.facebook.com/docs/graph-api/reference/user/feed/)を使うのがよい。
要は、'POST /me/feed'でプレビューのパラメータを全部渡してしまおう、と。

```
POST /me/feed HTTP/1.1
Host: graph.facebook.com

message=This+is+a+test+message
link=http://example.com/
picture=http://example.com/pic.jpg
name=title
description=This+is+a+description
```

以下、その結論に至った考察のタネ。備忘録として。

* 投稿のプレビューは、以下のパラメータで構成されている
 * picture: プレビューに表示する画像のリンク
 * name: プレビューのタイトル
 * caption: プレビュータイトル下のキャプション
 * description: プレビューの説明
* リンクをシェアすると、[Open Graph](https://developers.facebook.com/docs/opengraph/overview/)によってリンク先のメタ情報（＝パラメータ）を取得する
* パラメータは、優先順位がある
 * APIで渡した値が最優先
 * [こちら](http://blog.digital-squad.net/article/229651773.html)が参考になった
* サイト側に問題があって、Open Graphが失敗するケース
 * [アクセス制限されている](https://developers.facebook.com/docs/opengraph/howtos/maximizing-distribution-media-content/#crawl)
 * [Open Graphタグが不正](https://developers.facebook.com/docs/opengraph/howtos/maximizing-distribution-media-content/#tags)
* サイト側には問題がなく、 __たまに__ プレビュー表示がおかしくなるケース
 * （問題ない＝デバッガーツールでも警告は無い）
 * 'POST /me/links'リクエストしてから、しばらく経ってもOpen Graphリクエストがやってこない
* プレビュー表示がおかしい、とは
 * picture: なし
 * name: リンク（URL）
 * caption: ドメイン名
 * description: なし
* 一度、Open Graphリクエスト（＝クロール）に成功すると問題は起きなくなる
 * キャッシュされるから
 * キャッシュ更新の仕方は[3パターン（デバッガー、7日経過、更新API)](https://developers.facebook.com/docs/opengraph/using-objects/)
rubyでMongoDBクエリしてみた（mongoid）

## ケース

* コレクション名は、access_log
* apacheのログをLTSV形式で収集している
 * http://ltsv.org/
 * LogFormat "host:%h\tident:%l\tuser:%u\ttime:%t\treq:%r\tstatus:%>s\tsize:%b\treferer:\%{Referer}i\tua:%{User-Agent}i" combined_ltsv

## 準備
### Configuration

http://mongoid.org/en/mongoid/docs/installation.html#configuration
省略

### Document定義

http://mongoid.org/en/mongoid/docs/documents.html

```rb
class AccessLog
  include Mongoid::Document
  store_in collection: "access_log"
end
```

```irb
AccessLog.last.as_document
=> {"_id"=>"5338b6e0058281474986c8a6",
 "host"=>"10.0.0.1",
 "ident"=>"-",
 "user"=>"-",
 "time"=>2014-01-01 00:00:00 UTC,
 "req"=>"\"GET / HTTP/1.1\"",
 "status"=>"200",
 "size"=>"1024",
 "referer"=>"-",
 "ua"=> "\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:27.0) Gecko/20100101 Firefox/27.0\""}
```

##　クエリ

http://mongoid.org/en/mongoid/docs/querying.html
ActiveRecordライクな（？）DSLが定義してあるので、あとは慣れの問題か。

MyDSLを定義しておくと、少しは便利かな。

```rb
module DSL
  def time(times)
    where({time: times})
  end

  def status(code)
    where(to_status_hash(code))
  end
  alias :status_and :status

  def status_or(*codes)
    self.or(codes.map{|code| to_status_hash(code)})
  end

  def status_not(code)
    self.not(to_status_hash(code))
  end

  private
  def to_status_hash(code)
    {status: code.is_a?(Regexp) ? code : Regexp.new(code.to_s)}
  end
end

module Mongoid
  class Criteria
    include DSL
  end
end

class AccessLog
  include DSL
end
```

以下、どれも同じselectorとなる。

```irb
AccessLog.where(time: 1.days.ago..Time.now).where(status: /5\d\d/)
=> #<Mongoid::Criteria
  selector: {"time"=>{"$gte"=>2014-01-01 00:00:00 UTC, "$lte"=>2014-01-01 10:00:00 UTC}, "status"=>/5\d\d/}
  options:  {}
  class:    AccessLog
  embedded: false>

AccessLog.where(time: 1.days.ago..Time.now, status: /5\d\d/)
=> #<Mongoid::Criteria
  selector: {"time"=>{"$gte"=>2014-01-01 00:00:00 UTC, "$lte"=>2014-01-01 10:00:00 UTC}, "status"=>/5\d\d/}
  options:  {}
  class:    AccessLog
  embedded: false>

AccessLog.time(1.days.ago..Time.now).status(/5\d\d/)
=> #<Mongoid::Criteria
  selector: {"time"=>{"$gte"=>2014-01-01 00:00:00 UTC, "$lte"=>2014-01-01 10:00:00 UTC}, "status"=>/5\d\d/}
  options:  {}
  class:    AccessLog
  embedded: false>
```
gitでsvn exportみたいなことをしたい

gitリポジトリの`.git`ディレクトリを除いたコピーが欲しい、つまり`svn export`みたいな事をしたいんだけどー、`git archive`とは違うしー、と思って調べてみたらぴったりなサブコマンドがありました。

```bash
$ git checkout-index -a -f --prefix=dir/
```

でOKです。

---

- `-a, --all`
  - すべて
- `-f, --force`
  - 上書き
- `--prefix=<string>`
  - prefixを付けて

ということみたい。（`$ git checkout-index --help`を斜め読みした感じだと）

---

```bash
$ git checkout-index -a -f --prefix=dir
```

と`--prefix`の最後に`/`を付け忘れると残念なことになるので気を付けると良いかも。

```bash
$ git checkout-index -a -f --prefix=$HOME/test
```

とかやってしまうと、`$HOME`に`testREADME.md`とかが生成されてしまうので、リポジトリ直下にファイルがたくさんある場合は面倒なことになったりします。

---

```ini
[alias]
  export = "!sh -c 'git checkout-index -a -f --prefix=$1/' -"
```

とかエイリアス作ると楽です。

---

というような内容がここに書いてありました。

- http://stackoverflow.com/questions/160608/how-to-do-a-git-export-like-svn-export
- http://stackoverflow.com/questions/7005513/pass-an-argument-to-a-git-alias-command
AnyでFirst取得するかFirsrOrDefaultで取得するか

気になったのでちょっと検証してみた。

```csharp
if (list.Any())
　return list.First();
```

と

```csharp
var data = list.FirstOrDefault();
if (data != null)
　return data;
```

で、どっちが速いのか。

Stopwatchで前後でStart、Stopで計ったところ、

| 回数 | AnyとFirst | FirstOrDefault |
|:----|------------:|------------:|
| 1回目 | 0.0002417 | 0.0001677 |
| 2回目 | 0.0002348 | 0.0001782 |
| 3回目 | 0.0002376 | 0.0001665 |

ってことで後者の方が速いらしい。

なので今後は後者を使おう。

[追記]

よくよく考えてみたら、

```csharp
if (list.Any(x => x.hoge == 1))
　return list.First(x => x.hoge == 1);
```

より

```csharp
var data = list.FirstOrDefault(x => x.hoge == 1);
if (data != null)
　return data;
```

の方が速いのは明確だったか…。
【メモ】Macのfnキーを２回押すと...


Siri的なUIが出てきたので何かと思って調べてみたら、音声入力があることを偶然発見。
Mountain Lion以降の機能とのこと。
なかなか便利そうだけど、通常のオフィスでは恐らく使えないでしょう。

### 設定方法
[システム環境設定]->[音声入力と読み上げ]の[音声入力]タブ


### 参考
- [Mac Basics：音声入力](http://support.apple.com/kb/HT5449?viewlocale=ja_JP)
- [OSX Mountain Lionで音声入力を試してみる。: 50おとこのiPad](http://otoko50.cocolog-nifty.com/blog/2012/08/osx-mountain-li.html)
- [Everything You Need to Know about Dictation in OS X Mavericks | Mac.AppStorm](http://mac.appstorm.net/reviews/os-x-reviews/everything-you-need-to-know-about-dictation-in-os-x-mavericks/)
Railsのマイグレーションでbigintを使うには


## はじめに

みなさんRailsやってますか？

DBのマイグレーションを行うとき、integerとかstringとか指定すると思うんですが、あれ指定すると

```Ruby
 t.integer ## 10桁までの数値
 t.string  ## 255文字までの文字列
```

って限定されてしまいますよね。文字列ならtext型使えとかいろいろありますが、それにしても数値型をbigintにできないのは不便です。

## bigint使いたい！

コンシューマー向けサービスだとユーザ数がとんでもなく増えていくので、ユーザIDだけでもすごい数になります。そんなユーザ数いないとしてもFacebookでログインとかさせていると、IDがRails指定のintegerではエラーになります。

そこでどうしてもbigintが必要になるんですが、指定方法わかりづらいですよね。

Railsのマイグレーションファイルで、limitオプションつければそれができるんです。

```Ruby
create_table 'example' do |t|
  t.integer :int8, :limit => 8   # bigint
end
```

これで指定したカラムがbigintになります。

limitオプション他にもたくさんあるので、調べていただければ。

それではよいRailsライフを！
[Decode error - output not utf-8]  Haxe のビルドに失敗する

結論から言うと、SublimeText2を SublimeText3にアップグレードしたら直った。

エラーの再現
===========

まずは、コマンドラインからhaxeが動作することを確認。

```bash
>haxe -neko test.n -main Test
>
```
問題ない。


まず、SublimeTextにパッケージマネジャーとHaxeプラグインを入れた後に、build.hxmlファイルを作成する。

```xml:build.hxml
 -neco test.n
 -main Test
```

.hxを開いた状態で
Ctrl+B あるいは　F7　を押すとビルドされるべきところだが・・・

```
[Decode error - output not utf-8]
[cmd:  [u'haxe', u'build.hxml']]
```


と表示されて、ビルドに失敗した。

解決手段
=========
よく分からないが、SublimeTextを２から３にインストールし直すだけでビルドできるようになる。

```
[Finished in 0.1s]
```




なお、当然ながら、パッケージマネジャーの再インストールした後に、Haxeプラグインをインストールしなおす必要がある。
JPAを使うときの指針メモ

# はじめに
JPAを使うときの指針メモです。

# JPQLではなくCriteriaを使う
SQLを知っているとJPQLの方がとっつきやすいのですが、以下の理由からCriteriaを使ったほうがよさそうです。

## CriteriaはDB変更に強い
JPQLはタイプセーフではないので、Entityクラス名や変数名が変わってもコンパイルエラーになりません。
対応箇所は自分で洗い出すか、動かしてエラーになるまでわかりません。
一方Criteriaは、Entityを変更した時点でコンパイルエラーになるので対応箇所がすぐにわかります。

## JPQLをデバックするのは大変
SQLと違ってDBのコンソールで試すことが出来ないので、SQLの感覚で長いJPQLを書いてエラーになったらデバックするのがかなり大変です。
エラーメッセージとにらめっこする羽目になります。

## コード例
```java:JPQLのサンプル
// nameが"aaa aaa"のデータを検索
List<User> users = User.find("name", "aaa aaa").fetch();
```

```java:Criteriaのサンプル
// nameが"aaa aaa"のデータを検索
Session session = (Session) JPA.em().getDelegate();
Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.eq("name", "aaa aaa"));
List<User> users =  criteria.list();
```

※サンプルコードはPlayFramework1.2系のものです。参考程度に見ていただき、実際の書き方は各FWのサイト等でご確認ください。

# JPAからいきなりDTO（画面に表示するためのオブジェクト）にマッピングしようとしない
クエリの結果は単項目かEntityオブジェクトの形で受け取るのが普通です。
複数のEntityから任意の項目を取得したい場合、JPAでは単純なクエリを投げて、結果をEntityとして取得します。
複数Entityの情報が必要な場合は複数回クエリを投げて、ビジネスロジックでオブジェクトを操作してDTOに詰め直します。

![jpa.png](https://qiita-image-store.s3.amazonaws.com/0/38582/b79f2f95-186b-b44b-9adb-5cc8e7a913cd.png)

慣れるまではSQLで書けば一発なのにムキー！となりますね。
Wowza Streaming Engineライセンスとアドオンの種類

## Bring Your Own License
* AWSと別途で課金
* 有償アドオン利用可

## DevPay License
* AWSとまとめて課金
* [種類](http://qiita.com/alingogo/items/0e5830d2319c74c4f08e)によって、有償アドオン利用可

## アドオンの調査
* 無償系
 * いろいろ

* 有償系
 * DRM Addon
 * Transcoder Addon
 * nDVR Addon
メソッドが書かれているソースファイルの場所を知る方法

[ruby - Get class location from class object - Stack Overflow](http://stackoverflow.com/questions/13012109/get-class-location-from-class-object)

```rb
ActiveRecord::Base.method(:validates).source_location
```

メソッドオブジェクトにして、source_location メソッドを呼ぶ。

- 呼び出したいメソッドではないメソッドが呼ばれているようで不安なとき。
double→BigDecimal変換

double→BigDecimal変換ではnewではなくvalueofを使う。
newを使うと期待通りの値にならない。

```javajava
double doubleVar = 0.1;
System.out.println("doubleVar:" + doubleVar);

BigDecimal aaa = BigDecimal.valueOf(doubleVar);
System.out.println("BigDecimal.valueOf(doubleVar):" + aaa);

BigDecimal bbb = new BigDecimal(doubleVar);
System.out.println("new BigDecimal(doubleVar):" + bbb);
```

結果
>doubleVar:0.1
>BigDecimal.valueOf(doubleVar):0.1
>new BigDecimal(doubleVar):0.1000000000000000055511151231257827021181583404541015625
配布用埋め込みタグ開発の注意点 (iframeまわり)


各サイトに埋め込めるタグなどを配布側として開発する場合の注意です。 (例：Tweet Feed)
おもにiframeまわりの話となります

## 埋め込みスクリプト

以下みたいなのを各サイトに埋め込んでもらう前提です。

```html
<div id ='hoge'></div>
<script type="text/javascript">
    (function() {
        var js = document.createElement('script'){
        js.async = true;
        js.src = '//yourOrigin/hoge.js';
        document.getElementsByTagName('head')[0].appendChild(js);
    })();
</script>

```

要するに、各サイトに```//yourOrigin/hoge.js``` を読み込んでもらいます。
 ```hoge.js``` は```$('#hoge')``` 内にiframeを作成して埋め込みたいコンテンツをロードしたり、子フレームからのイベントのハンドリングをしたりします。

以下、注意点をつらづら書いておきます


## cross origin


* 異なるドメイン間で、親フレーム ⇔ 子フレーム間のjavascriptでの直接通信はできません 例：```window.parent.hoge()```
 * ```postMessage```で子フレームからイベントを送り、親フレームでイベントをハンドリングしてください
 * どうしてもやりたいときは、孫フレームとして親フレームと同じドメインを用意するとよいです（今回の用途からは外れますが）

## https

* 親フレームがhttpsの場合に、子フレームとしてhttpが埋め込めないブラウザがあります (chromeなど)
 * 子フレーム内コンテンツのSSL対応は必須と考えたほうが良いかもしれません

## 子フレーム起因でページ遷移する場合
子フレーム内のリンクをクリックした際に、子フレーム内でページ遷移するのは変ですよね。
ですので以下などをしてあげることになると思います

* 方法1: ```postMessage```して親フレームがイベントを受け取って遷移する
* 方法2: 子フレーム内で```window.open```する


### 方法1
```location.href``` してください。理由は以下。

親フレームが```window.open```すると、「ユーザーの意図しないタイミングでウィンドウ開こうとしてるだろう！ポップアップブロックするぞ！」と主要ブラウザさんに怒られてしまいます。
例えばiOS Safariではポップアップブロック機能がデフォルトでONになっています。さらにブロックされたことが通知されないため、ユーザー視点で何も起こりません。



### 方法2
シンプルで良い方法なのですが、Android2.xの標準ブラウザにて、UIが不自然(同タブ内でpopup画面として開かれる)になってしまいます。

Android2.xの場合は方法1にしてあげるとよさそうです。

### Android2.xでも絶対にwindow.openがいい場合
もはやマニア向け。

Android2.x標準ブラウザでは、javascriptがDOM click eventを発火させた場合でも、ブラウザバグなのかユーザーのアクション起因とみなされ、ポップアップブロックが効きません。
(全端末で確かめた訳ではありません。念のため。)
親フレームが適当な要素のclick eventを発火させて、そのevent起因で```window.open```するとよさそうです。
Clojureでfuzzy-getとsleep関数を作ってみる

ClojureでsleepするにはJavaのThread/sleepを使えばいいわけですが、`(sleep 1 :min)` `(sleep 2 :minute)` `(sleep 3 :s)`などのように単位をつけてsleepできるものを作ってみます。

単位についてはある程度あいまいに指定が可能なように、前方一致していればマップから値を取得できるfuzzy-get関数も一緒に作ります。

※ついでにfuzzy-getはkeyが文字列かキーワードかシンボルか区別せずに取れるようにもしておきます。
※複数該当する場合は辞書順で早いほうとします。

```fuzzy-get.clj
(defn name? [x] (or (string? x) (instance? clojure.lang.Named x)))

(defn fuzzy-get [hmap key]
  (if (or (not (map? hmap)) (contains? hmap key)) (get hmap key)
    (let [f #(if (name? %) (name %) (str %))
          ks (sort-by f (keys hmap))]
      (some #(when (.startsWith ^String (f %) (f key)) (get hmap %)) ks))))
```

```
user=> (def v {:abc 1 "aiu" 2})
user=> (fuzzy-get v 'ab)
1
user=> (fuzzy-get v :ai)
2
```

＃脱線しますが、varやnamespaceはNamedではないようですね。

```
user=> (instance? clojure.lang.Named :a)
true
user=> (instance? clojure.lang.Named 'a)
true
user=> (instance? clojure.lang.Named #'instance?)
false
user=> (instance? clojure.lang.Named (the-ns 'user))
false
```


これでfuzzy-getができたので、次はsleepです。


```sleep.clj
(def time-unit
  (apply hash-map (interleave [:_milliseconds :seconds :minutes :hours :days]
                              (reductions * [1 1000 60 60 24]))))

(defn ^long milliseconds [^double t unit]
  (long (* t (fuzzy-get time-unit unit))))

(defn sleep
  ([^long ms] (Thread/sleep ms))
  ([^double t unit] (sleep (milliseconds t unit))))
```

これで`(sleep 3 :sec)` `(sleep 0.1 :m)`などでsleepできるようになりました。
PHPのループ操作：continue, break

最近、コードを書いていて使ったので共有なのですが、for文などのループ操作にcontinueやbreakを使うことがあると思います。
こんな感じ。

```php
for ($i = 0; $i < 10; $i++) {
     if ($i === 5) continue;
     var_dump($i);
}
```

簡単な場合は良いのですが、for文の中にfor文があったりする場合、結構混乱すると思います。
そんなときは、continueやbreakの後に数字を挿入すると、どこまでcontinue、breakするのか指定することができます。
"continue;"は1つ分のネスト、"continue 2;"は2つ分のネスト・・・というように使えます。

下記は、ちょっと長いですが、私がInterestingDigitsという課題に取り組んだ時のコードです。

```php
public function digits($base) {
    $results = [];

    for ($i = 2; $i < 1000; $i++) {

        for ($j = 1; $j < 1000; $j++) {

            $sum = 0;

            foreach (str_split(base_convert($i * $j, 10, $base)) as $value) {
                $sum += base_convert($value, $base, 10);
            }

            if ($sum % $i !== 0) continue 2;

            if (strlen($i * $j) >= 3) {
                if ($j !== 1) $results[] = $i;
                continue 2;
            }
        }
    }

    return $results;
}
```

たぶん、"continue 2;"を使ったことで、少し読みやすくなったのではないかなと思います。
ASP.NET WebFormsのCheckBoxでvalueを指定する

```html
<form runat="server">
　<asp:Repeater ID="RptCheckBox" runat="server">
　　<ItemTemplate>
　　　<asp:CheckBox ID="ChkSelect" runat="server" Text="選択" />
　　<ItemTemplate>
　</asp:Repeater>
　<asp:Button ID="BtnPostBack" runat="server" Text="送信" />
</form>
```

みたいなページで選択されたCheckBoxの項目だけ取得したいとき、ASP.NET WebFormsのCheckBoxコントロールにValueプロパティがなくて困るときがあるんじゃないかと思う。

そういうときに、

```html
<asp:CheckBox ID="ChkSelect" runat="server" Text="選択" Value="hoge" />
```

とか、RepeaterのItemDataBoundイベント内で

```csharp
var chkSelect = (CheckBox)e.Item.FindControl("ChkSelect");
chkSelect.Attribute.Add("value", "hoge");
```

とかやると、実際に出力されるHTMLが

```html
<span value="hoge">
　<input type="checkbox" name="RptCheckBox_ChkSelect_1" />
　<label for="RptCheckBox_ChkSelect_1">選択</label>
</span>
```

ってなってなかなかvalueを取るのが面倒臭い。

そんなときはRepeaterのItemDataBoundイベントの中で

```csharp
var chkSelect = (CheckBox)e.Item.FindControl("ChkSelect");
chkSelect.InputAttribute.Add("value", "hege");
```

ってやると

```html
<input type="checkbox" name="RptCheckBox_ChkSelect_1" value="hoge" />
<label for="RptCheckBox_ChkSelect_1">選択</label>
```

という風にHTMLが出力されるので、CheckBoxのvalueが取れるようになる。

valueを取りたいときは

```csharp
var values = Request.Form.AllKeys.Where(keys => keys.Contains("ChkItem")).Select(key => Request.Form[key]);
```

ってやればIEmunerable<string>で選択されたCheckBoxのvalueが取れる。

Repeaterの中にCheckBoxがなくても、コードビハインドで

```csharp
ChkSelect.InputAttribute.Add("value", "hoge");
```

でvalueが指定できるし、valueを取るときは

```csharp
string value;
if (ChkSelect.Selected)
　value = ChkSelect.InputAttribute["value"];
```

で取れる。
Crash Report解析サービスのBugSenseを試してみた


## 概要

アプリ開発では必須になりつつあるCrash Report解析サービスですがその一つであるBugSenseを導入した時のメモです。

## 導入手順

無料プランがあるので気軽に試せます。(残念ながら完全無料ではなく有料プランがメインです)
下記からまずユーザー登録をします。

https://www.bugsense.com

ログインしたらまずプロジェクトを作ります。
下記の情報を求められるので登録しましょう。

![スクリーンショット 2014-03-30 23.53.11.png](https://qiita-image-store.s3.amazonaws.com/0/30826/178adeb0-3f04-8cc4-d886-78b0c6984f74.png "スクリーンショット 2014-03-30 23.53.11.png")

登録後にAPIキーが発行されるのでメモしておきます。
導入についてはCocoaPodsでインストールできるので簡単です。
まずPodfileを作成します。

```
platform :ios, '7.0'
pod 'BugSense'
```

下記コマンドを実行してインストールしてください。

```
pod install
```

次は使用方法ですが、BugSenseを使用するソースファイルでヘッダーファイルをインポートします。

```objc
#import <BugSense-iOS/BugSenseController.h>
```

あとはApplication Delegate内でBugSenseの初期化処理を行うだけで、Crash Report がBugSenseに送信されるようになります。ここでメモしておいたAPIキーを指定してください。

```objc
- (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [BugSenseController sharedControllerWithBugSenseAPIKey:@"<Your BugSense API Key>"];
    // ...
}
```

テストとしてわざとエラーが発生する処理を記述して実行させます。

```objc

- (IBAction)crashAction:(id)sender{
    NSArray *array = [NSArray array];
    id data = array[0];
}
```

上記処理を実行するとBugSenseにCrash Reportがリアルタイムで送信されます。
下記のように情報を見る事ができます。

![スクリーンショット 2014-03-30 23.54.55.png](https://qiita-image-store.s3.amazonaws.com/0/30826/104c9d40-8f99-5b0d-df6e-d0c3b6ed4240.png "スクリーンショット 2014-03-30 23.54.55.png")

送信するタイミングは調整可能です。
その他にも細かい設定ができるので詳しいことは下記URLを参考にしてください。

https://www.bugsense.com/docs/ios

## 感想

機能としては申し分ないので、無料でできる範囲がもう少し増えればもっとよいと思います。
特に無料ではプランではsymbolicate(デバッグシンボルの復元)ができないので、エラーの特定がつらいです。
また500エラーまでしか表示できないので、素直に有料プランを使う前提で検討した方がよいです。
有料プランでできる内容については下記を参考にしてください。

https://www.bugsense.com/pricing
Python 3.4.0 の新機能 (3) -　Single-dispatch generic functions


今日は Single-dispatch generic functions (PEP-443)。Generic functionは汎用関数と訳されることも多いが、言語によって微妙に違う使われ方をしている。Pythonでは「引数の型によって動作が異なる複数の関数に同じ名前をつける」という意味合いで使われているようだ。

と書いてもさっぱりわからないので、例示。引数の型によって出力が異なる関数を考える。Generic functionsを使わないとこんな感じ。


```py3
def print_func(arg):
    arg_type = type(arg)
    if arg_type is int:
        print("found integer:", arg)
    elif arg_type is list:
        print("found list:", arg)
    else:
        print("found something:", arg)

print_func(1)
print_func(['a','b','c'])
print_func(1.23)
```

入力された引数の型をif文で一つずつチェックしながら処理する。
実行結果はこう。

```
found integer: 1
found list: ['a', 'b', 'c']
found something: 1.23
```

これを、Single-dispatch generic functionsで書くとこうなる。

```py3
from functools import singledispatch

@singledispatch
def print_func(arg):
    print("found something:", arg)

@print_func.register(int)
def _(arg):
    print("found integer:", arg)

@print_func.register(list)
def _(arg):
    print("found list:", arg)

print_func(1)
print_func(['a','b','c'])
print_func(1.23)
```

ベースになる関数をsingledispatch decoratorで修飾し、それに型ごとの処理をregisterメソッドを使って追加していく感じ。どちらが良いのかは微妙だが、型ごとの処理がもっと長くなる場合は一つのif文に入れるよりもこちらの方がすっきりするかも。

結果は上と一緒なので省略。

にしてもあまり使い道が思いつかない。ある値を見てDispatchするのはよくやっていて、例えばHeaderの値からその後に続くデータの形式がわかるのでそういうデータ群のparsingとか。そういう場合は、値から関数を引くDictを用意して実現することが多いが、これは型だもんなぁ。
【F#】Seq.pairwise

F# の Seq.pairwise は良いですね。
pairwise は zip を使って次のように実装することもできますが、

```fsharp
let pairwiseByZip x = Seq.zip x (Seq.skip 1 x)
```

これだと、シーケンスによっては扱いが面倒になる場合があります。たとえば、ファイルを読み込んでシーケンスにするような場合を考えます：

```fsharp
let lines =
    seq {
        use r = new StreamReader(path)
        printfn "read: %s" path
        while r.Peek() >= 0 do
            yield r.ReadLine()
    }

printfn "%d" (lines |> pairwiseByZip |> Seq.length)
```

これに対し、10行のファイル sample.txt のパスをpathとして与えて実行すると、次のようになりました。

read: sample.txt
read: sample.txt
9

2回ファイルを読み込んでいました。ここで、pairwiseByZipをSeq.pairwiseに変える：

```fsharp
printfn "%d" (lines |> Seq.pairwise |> Seq.length)
```

と結果は

read: sample.txt
9

となり、ファイルの読み込みは1回です。

シーケンスを扱う場合はこういうことにも気をつけないと（自戒）。
パーサジェネレータ"caper"の紹介

# パーサジェネレータ caper

["caper"](http://jonigata.github.io/caper/caper.html) 　（[github](https://github.com/jonigata/caper)）は拙作のパーサジェネレータです。yaccやbisonなどと同じ場所で使うツールです。

基本的にはC++コードを生成するために作ったのですが、そのほかにもJavascript, D, Java, C#などのコードを出力することができます。

## 特長

大きなところでは、こんな特長があります。

* 出力コードが全部テンプレートクラスでヘッダファイル一つなので、ライブラリなどをリンクする必要がない
* 出力コードが大変ヒューマンリーダブル（手書きで書いたと強弁できるLALRパーサ、というコンセプト）
* PUSH型（パーサは常に受身で、トークンをポストするまで動かない）

そのほかの特長については、http://jonigata.github.io/caper/caper_more.html を御覧ください。

## 歴史など

このソフトは結構古いソフトで、初出は2006年です。なんで今頃また持ち出してきたかというと、とある人から「大きい文法で7分かかってたのを30秒にした」というプルリクエストを受け取ったためです。それをきっかけに、今まで戦略的なアルゴリズムの問題で遅いと思ってたのが、実は戦術的な問題で遅かっただけなのでは？　と疑念を抱いていろいろ見なおしてみたところ、3秒まで縮まってしまいました。さらに、すでにほとんど忘れていたソースを読みなおすことによってほぼ把握できたため、積んでいた拡張リクエスト（C++11対応、EBNF対応）を消化する気になってしまったわけです。

## 新仕様

### EBNF

というわけで、そこのドキュメントにはまだ書いてありませんが、githubの最新バージョンでは、EBNF対応が実装してあります。対応する機能は以下のとおりです。

  * '*' 0個以上のリスト
  * '+' 1個以上のリスト
  * '?' 0個または1個
  * '/' (オリジナル仕様) a/bの形で指定すると、a(ba)*にマッチしてbを捨てる（コンマ区切りリストなどに有用）

カッコには対応していません。caperの型付けの強い仕様だと、カッコには結局セマンティックアクションを指定しなければならず、「名前を考えなくて良い」以外のメリットが見当たらなかったためです。

EBNF拡張の文法等については https://github.com/jonigata/caper/tree/master/caper/samples/grammar にある"list0" "list1" "list2" "optional"あたりを参考にしてください。これらの文法ファイルを使う側はどうすればよいかについては、https://github.com/jonigata/caper/tree/master/caper/samples/cpp この辺りを参考にしてください。

### エラーリカバリ

また、簡単なエラーリカバリを実装してあります。機能は多分yaccとだいたい同じです。

%recover error;

で"error"という識別子をリカバリ指定用識別子として利用できるようになります。

文法等についてはサンプルディレクトリの「recovery0」「recovery1」を参考にしてください。

### ジェネレータをリライト

その他、この機会に書きづらかったジェネレータをヒアドキュメント的な記法で一新しました。新しいジェネレータを作るのも簡単になっていると思います。

## 関連情報

 * こんな記事を書いてくださった方もいます。出力パーサが読みやすいので、LALRの学習にも向いているようです。（http://d.hatena.ne.jp/ytqwerty/20080304#p3）

 * また、どの程度の範囲かわかりませんが、caperから一部利用するなどしてパーサジェネレータを作られた方もいらっしゃいます。自分でも信じられませんが、アルゴリズムには問題なかったみたいですね。
  * https://code.google.com/p/castling/
  * https://github.com/marionette-of-u/kp19pp

## 各言語ジェネレータ

上記出力可能な言語のうちC++, Javascript, Dについては最近書きなおしたので新しい仕様に追従していますが、C#・Javaに関しては気に入ってくださったユーザの方からいただいたコードである上、自分で使わない言語なので今でもcaperの仕様変更や言語自体の仕様変更に追従して動く状態なのかどうか自信がありません。どなたか得意な方に書きなおして貰えると嬉しいです。ジェネレータを書く場合は、現状のまま当該言語で一度hello0.cpgなどからパーサを出力しておいて、上記3つの中から近いものを選んで置き換え、最初の出力を見ながら直すのが一番ラクなのではないかと思います。

その他の言語についてもプルリクエストは大歓迎です。
Windows用 printfの値をTeraTermに出力して確認する

デバッグ時の強い味方、printf。
lcdディスプレイに文字列を出す手もあるが、これはなかなか大変なのでTeraTermなどシリアルポートから値を受けとれるもので出力を受け取る。

基本的にはドライバをインストールし、設定するのみ。ドライバはこちらからインストール可能。

http://mbed.org/handbook/Windows-serial-configuration

あとは、TeraTermでシリアルポートを選択すればOK。