OmniAICreator/Qiita-1.07M huggingface dataset:
共通のテンプレートにアクション毎に設定できる追加ファイルを読み込ませる

#目的：共通のテンプレートを使用している状態で、アクション毎に微修正を加えたい。　例えば、jsファイルの読み込み等

##手順
###1.　テンプレートにアクション毎に設定できるようAssetを仕込む
###　　今回はjsファイルをアクション毎に読み込ませたいので、jsグループを設定し、テンプレートでrender('js')し、出力する

*使用するテンプレート (アクション毎に読み込ませるjsファイルを変えられるようにする)*

```php:/fuel/app/views/template.php
<!DOCTYPE html>
<html>
<head>
</head>
<body>
    <header>
        <?php echo $header; ?>
    </header>
    <div id="content">
        <?php echo $content; ?>
    </div>

    <footer>
        <?php echo $footer; ?>
    </footer>
    <?php
    //</body>の直前にjsグループで定義したjsファイルを読み込ませる。このファイルは各アクション毎に設定
    //jsグループのjsファイルを表示
    echo Asset::render('js');
    ?>
</body>
</html>
```

###2.　アクションのviewファイルでjsグループの設定をする。 (読み込ませたいファイルを指定する)

*アクションのview これがテンプレートのcontentに渡される。　ここで、jsグループを設定する*

```php:/fuel/app/views/hello/index.php
<div>
    コンテンツ領域です
</div>

<?php
//テンプレートの</body>タグ直前に読み込ませたいファイルを指定。グループはjs
//test.js, hello.jsは/public/assets/js/配下に置く
Asset::js(array('test.js', 'hello.js'), array(), 'js', false);
?>
```

*結果*
下記がfooterタグの下に表示される

```html
    <script type="text/javascript" src="http://localhost/fuelphp/assets/js/test.js?1398130262"></script>
    <script type="text/javascript" src="http://localhost/fuelphp/assets/js/hello.js?1398130262"></script>

```
**公式サイト**
[Asset](http://fuelphp.jp/docs/1.7/classes/asset/usage.html)
【個人メモ】Square 製のバリデーションライブラリ lgtm 

# LGTMというデータ検証ライブラリ

[square/lgtm](https://github.com/square/lgtm)

インターネッツをさまよってたら見つけたので、触ってみた。
[Square](https://squareup.com/)製。

# LGTMは何をするのか

フォームなどに入力されたデータの検証を行うライブラリ。
実際に弄ってみよう。

# とりあえず弄ってみる

lgtmの[wiki(github)のリンク先にあるjsbinのテンプレ](http://jsbin.com/edawidev/1/edit)がある。
それを元に適当な入力フォームをjsbinに作った。

http://jsbin.com/edawidev/8/edit?js,output

![スクリーンショット 2014-04-11 20.31.25.png](https://qiita-image-store.s3.amazonaws.com/0/3985/6fe1cbac-402c-f644-17f8-e22b55fa5421.png)

## フォームの入力内容をチェックする

例で作成したフォームに何も入力せずに"Sign up"ボタンを押してみる。

![スクリーンショット 2014-04-11 20.32.53.png](https://qiita-image-store.s3.amazonaws.com/0/3985/55cfaf9f-876c-4196-1feb-3be99b4e1f7a.png)

エラー文言が出た。

続けて、first nameに値を入力して"Sign up"ボタンを押してみる。

![スクリーンショット 2014-04-13 20.24.39.png](https://qiita-image-store.s3.amazonaws.com/0/3985/1e886e0d-8e27-4de3-d4d8-199464528094.png)

first nameは、値が入力されていることが必須(required)にしている。

続けて、適当なメールアドレスをmail addres formに入力する。

![スクリーンショット 2014-04-13 21.37.41.png](https://qiita-image-store.s3.amazonaws.com/0/3985/b0ebb9ba-f0f1-d99b-495e-650ddbe2042f.png)

emailメソッドを使って検証している。
[emailメソッドはフォーマット検証をしている。](https://github.com/square/lgtm/blob/master/src/lgtm/helpers/core.js#L29)
hoge@hogeは、メールアドレスフォーマットとして不正なため、通らない。
hoge@hoge.com として入力し直してみる。

![スクリーンショット 2014-04-13 21.50.42.png](https://qiita-image-store.s3.amazonaws.com/0/3985/88dcdbf9-5f35-4743-e633-39bda0c5f421.png)

メールアドレス形式のフォーマットに合致しているため、
フォーマット検証を通っている。

# 検証内容のカスタマイズも可能

whenメソッドを使って値の検証方法を
自分で作成したfunctionを利用してカスタマイズすることもできる。

別のサンプルについても作ってみた。

[計算結果をチェックするためのサンプル](http://jsbin.com/cutis/2/edit?js,output)

![スクリーンショット 2014-04-22 20.56.08.png](https://qiita-image-store.s3.amazonaws.com/0/3985/e45421e7-8480-8c26-7b5d-0069bdefbc88.png)

## 間違えた計算結果を入力した場合

![スクリーンショット 2014-04-22 20.57.44.png](https://qiita-image-store.s3.amazonaws.com/0/3985/4ce4b4f8-7d49-c1c5-e47f-a1c8c73b20e1.png)

## 計算結果が合っている場合

![スクリーンショット 2014-04-22 20.58.01.png](https://qiita-image-store.s3.amazonaws.com/0/3985/9c09724e-61b9-448a-25cf-e972a52ce4ac.png)

## 気をつけないといけないこと

[using](https://github.com/square/lgtm/wiki/ValidatorBuilder#using) メソッドによって、
検証方法のチェックが可能だが、今現在、
validatesメソッドにチェインしないと使えない。

# LGTMはどうか

検証ロジックを一箇所にまとめ、
特定のモデルに対して行いたい場合に使えると思った。

けど、[using](https://github.com/square/lgtm/wiki/ValidatorBuilder#using) メソッドを利用するときに[validates](https://github.com/square/lgtm/wiki/ValidatorBuilder#validates) を使って
チェインしないといけないのがちょっとイケてない気がする。
でもこういう複雑なことをするなら自分でメソッドを追加しろよって感じなのだろう。

[Coreに分類されているメソッド](https://github.com/square/lgtm/wiki/ValidatorBuilder#core)は数は少ないが、自分でカスタマイズして
新しいメソッドを定義すればよいのかも。

[Square](https://squareup.com/)が作ったものだし、コードを読んで色々と学習してみよう。

# 余談

[Square Open Sourceページ](http://square.github.io/)を見ると、色々あるな...
express.js 4をCoffeeScriptで開発できるようにする

いつの間にかexpress.jsも４です。

では早速

##expressのインストール

4からnpmではexpressをインストールするんじゃなくてexpress-generatorをインストールするようになりました。

`npm install -g express-generator coffee-script js2coffee`

##プロジェクトの作成

適当な名前のプロジェクトを作成　オプションはお好みで

`express hoge -css stylus`

`cd hoge`

ここでjsをcoffeeにする便利ツールjs2coffeeを使い一括で変換

```
find . -type f -name "*.js" | while read f; do js2coffee "$f" > "${f%.*}.coffee"; done
```

上手くできたらjsファイルは削除

`find . -type f -name "*.js" | xargs rm -f`

npm install の前にやらないとnode_modulesの中もcoffeeに代わるので注意

`npm install`

`npm install coffee-script --save`

エディターで bin/wwwを編集

```diff
 #!/usr/bin/env node
-var debug = require('debug')('my-application');
+require('coffee-script/register');
+var debug = console.log //require('debug')('my-application');
 var debug = require('debug')('my-application');
 var app = require('../app');
```

これでbin/wwwを直接またはnode-devから実行すればOKです。

###疑問
```js
var debug = require('debug')('my-application');
```

がデフォルトでありますけど　これいったいなんなのかよくわからないんですよね。

追記: 2014/5/7
`DEBUG=my-application ./bin/www`
で起動するとLogが出るんですね(ちゃんと出力を読めよと言う話)
Google Cloud Platform セッション(4/22)参加してきた

# 始めに
アジア太平洋リージョンが利用可能となり、日本国内から使いやすくなったGoogle Cloud Platform。
4月22日に六本木のグランドハイアットで開催された、Google主催のセッションに参加する事ができましたのでレポートします。

>Google Cloud Platform セッション - 最新技術と日本での展開について -
>http://lp.google-mkto.com/cloud-platform-roadshow-Tokyo.html?utm_source=googledblog&utm_medium=blog&utm_campaign=dblog


# 日本におけるサービス本格展開に関するご説明

Google塩入氏、福田氏による説明がありました。

Google エンタープライズ公式ブログ
>Google Cloud Platform の機能拡張・価格低減と日本市場での本格展開について
http://googleenterprise-ja.blogspot.jp/2014/04/google-cloud-platform_22.html

上記ブログ以外のトピックとして、

* アジア太平洋地区のDCは台湾、シンガポール。
* 各国のGoogle DC間のNWは高速な専用線接続。ユーザはDC跨ぐNWの作成、利用が可能。
* アジアDCも米国と同一価格。
* シンプルでわかりやすい価格設定
* 安定した性能
* VMはライブマイグレーションに対応し、ホスト側メンテに伴う計画停止の影響なし。

などの話が印象的でした。

# お客様事例のご紹介

## 株式会社テレビ朝日様（番組リアルタイム連携事例）

15万のユーザがスマートフォンを利用し番組に参加。
ライブの進行に合わせWebSocket経由されるシステムを、GCE(Google Compute Engine)とGAE(Google Apps Engine)で実現されたお話でした。

> MUSICSTATION スーパーライブ2013
http://www.tv-asahi.co.jp/music/sec/opinion/superlive2013/


## ハウスコム株式会社様（不動産情報提供）

不動産の物件情報掲載した自社サイト、ハードの老朽化や性能不足などの解消を図るため、オンプレからGCEとCloud Storageへの移行されたお話でした。

慣れたLAMP環境を踏襲するため、IaaSのCGEを採用し、
大量の写真コンテンツの蓄積、配信環境として、Cloud Storageが効果的だったとの事でした。
>【賃貸のハウスコム】賃貸マンション・アパート・賃貸一戸建ての賃貸住宅情報満載
http://www.housecom.jp/

インフラ費用、DC費用の削減などでほぼ半減できたとのこと。
顧客情報などデリケートな箇所はオンプレミスに当面残される様ですが、今後もクラウドは積極的に取り入れるそうで、この流れは止まらないものになりそうです。

## 株式会社Zeadle 様（ソーシャルゲーム開発）

スタートアップのソーシャルゲーム基盤として、GCPで開発進行中とのこと。
Web3層システムですが、Zookeeperやfluentなど、クラウドらしい基盤が出来上がりつつあるようです。

## 株式会社JSOL様（各種ソリューション提供）

マーケットや、農業分析などのビックデータ処理、IaaSのGCEで、Hadoopを用いるなどして実装されているとのことでした。
エンタープライズ、業務システムの硬い部分だけでなく、スピード感要求される方面の需要もましているようで、クラウドの芽が育まれつつあるようです。

## シーアイアンドティー・パシフィック株式会社様（キャンペーン制作事例）　

2014ブラジルワールドカップのサポート企業のキャンペーンサイトにGCPを採用。
IaaSとPaaSの連携や、使い分けなど興味深い内容でした。
尚、キャンペーンは現在も進行中、某最大手ドリンクメーカのSNSで投稿された写真、加工されて6/12の開会式でお披露目されるそうです。

# パネル ディスカッション -

モデレータはPublickeyの新野氏。
パネリストは事例紹介の4社の方。
コメンテータにGoogleの佐藤氏。

各社のクラウドの取り組み方から、Google選んだ理由、システム構築方針、今後の展望など興味深い内容でした。


# 感想
Googleの本気を垣間見る事が出来た気がします。
これまでIaaSのGCEを軽く触れた程度でしたが、すぐ使えて効果も大きそうなCloud Storageを初め、色々試してみたいと思います。

# 補足(GCPのプロモーションコード)

参加者特典で配布されたプロモーションコード、下記サイトからの申込を行う事で500$相当の使用権が頂けるとのことです。
Twitterで教えて頂きありがとうございました。

https://cloud.google.com/developers/starterpack/
Ruby 2.1.1をUbuntu 14.04 LTS(Trusty Tahr)にrbenvでインストールする（readlineでコケる対策）

Ubuntu 14.04 LTS(Trusty Tahr)にrbenvを使ってRuby 2.1.1をインストールしようとしたら、readline周りでFunctionが無い！と怒られてしまう。
undefined referenceって言ってるんだから定義が無いんだろうと思って調べたら、readline6.3.4ではFunctionが削除されているということで、まんまな原因だったわけですが、
いやはや、OSSって素晴らしいもので、既にパッチが公開されている。
しかも、rbenvで当てながらインストール出来てしまうらしい。
手順や詳細は以下の記事を参照下さい。
リリース直後で、こうも早く記事にされている方が居らっしゃるとは本当に有難いものです。

http://yosiwo.lowtech.ne.jp/?p=1547
Github をオンラインストレージとして使うとCDNも効いて無料だし最高という話（静的ファイル設置に使える）

# 画像って重いし、サーバーに負荷かけたくない、CDN使いたい、できれば無料で、という贅沢な悩みにこたえます

## けつろん

- github を使おう

## こまかいはなし

github は生データを公開できます。ドメインは raw.githubusercontent.com です。CDNサービスの Fastly が効いてます。試しにトレースルートしてみてね。URLは以下の形式です。

```
https://raw.githubusercontent.com/{User Name}/{Repository Name}/{Branch}/{File Path}
```

以下、例です

https://raw.githubusercontent.com/akiramuramatsu/misc/master/qiita_500_error.png

![Qiita](https://raw.githubusercontent.com/akiramuramatsu/misc/master/qiita_500_error.png "Qiita")

## 他の選択肢

### Dropbox

?dl=1 をシェア用URLの最後につけると、直接アクセス可能、でも **やたらと遅い** 、苦情が来るレベル

### Google Drive

いきなり 403 Error を返すことがあり、原因不明で、苦情が来るレベル

### Amazon Cloud Front

有料

## さんこう

- CDN: Content Delivery Network for Site Acceleration | Fastly - http://goo.gl/vHfv8D

## あとがき

- グロースハッカーいなくなれ！
VimGolfに挑戦。  ～　A HAPPY NEW YEAR 2014 !


VimGolfとは、Vimのキーストロークの少なさを競えるサイトです。
http://vimgolf.com/challenges/52c3cb0d9b8634000200000e


たとえば、初期状態でこうなっている文字列を

```
A HAPPY END WITH YEAR 2013 !
```

Vimで以下のように編集する場合のキーストロークの少なさを競い合います。

```
A HAPPY NEW YEAR 2014 !
```

まだまだ、わたしのVim知識では、スコア12が限界。。。
```
Score12: fE2cwNEW<Esc><C-A>ZZ
```

最少のキーストロークが11みたいだけど、どーやってやんのさ？
上級Vimmerの皆様、教えてちょんまげ。

 **追記 2014-04-22 22:00**
コメントにて、ご教授いただきました。
```
Score11: fE8sNEW<Esc><C-A>ZZ
```
Rails以外でjquery-ujsを使う(アンカークリック時にPOSTやDELETEする方法など)

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

> [rails/jquery-ujs - Ruby on Rails unobtrusive scripting adapter for jQuery](https://github.com/rails/jquery-ujs)
> 
> This unobtrusive scripting support file is developed for the Ruby on Rails framework, but is not strictly tied to any specific backend.

unobtrusiveとはでしゃばらないとか控えめなという意味だそうです。

# インストール
どうやってもいいですが一例としてbowerで。

```
$ bower install jquery-ujs
```

で、HTMLに読み込む。

```:index.php
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <script src="bower_components/jquery/dist/jquery.js"></script>
    <script src="bower_components/jquery-ujs/src/rails.js"></script>
</head>
<body>
<?php var_dump($_POST); ?>
</body>
</html>
```

ここまでテンプレ。

# アンカークリック時にPOSTやDELETEする

```html
<a href="index.php" data-method="delete">DELETE!</a>
```

実際にはdeleteではなくpostして`_method`パラメータに`delete`がセットされる。csrfトークンもpostしたい場合はmetaタグで指定する。

```html
    <meta name="csrf-param" content="token" />
    <meta name="csrf-token" content="abcde" />
```

リンクをクリックすると以下のように表示される。

```
array(2) { ["_method"]=> string(6) "delete" ["token"]=> string(5) "abcde" }
```


# アンカーリック時にconfirmを表示させる

```html
<a href="index.php" data-confirm="本当に？">Go!</a>
```

window.confirm()が表示される。よりリッチなダイアログを表示したい場合は、
`$.rails.confirm`をオーバーライドする。

もう一つ重要な機能としてajax関連があるんだけど調べたら書く。
→書きました [JavaScript - Rails以外でjquery-ujsを使う（ajax編） - Qiita](http://qiita.com/iakio/items/59194b70c02a0ee16893)

追記:Laravelでの例
[Unobtrusive JavaScript with jquery-ujs and Laravel – Barry vd. Heuvel](http://barryvdh.nl/laravel/jquery/2015/04/11/unobtrusive-javascript-with-jquery-ujs-and-laravel/)
デバイスの向きを変えた時にActivityをDestroyさせない方法

# 基本的なんだけど忘れるからメモ

## ぜんてい

- 動画再生中とかデバイスの向きを landscape にされても再生継続させたいときとかにつかう

## じっそう

以下をActivity要素に加える

```AndroidManifest.xml
android:configChanges="orientation"
```

**APIターゲットが13以上の場合**はこっち

```AndroidManifest.xml
android:configChanges="orientation|screenSize"
```

## さんこう

- &lt;activity&gt; | Android Developers - http://goo.gl/q3O9y

## あとがき

とりあえず、グロースハッカーはいなくなって欲しいです
【Android】Eclipse で java.nio.BufferOverflowException. Check the Eclipse log for stack trace.【ビルドできん】


##またBufferOverflowException が出てビルドが通らなくなった。

#症状

Android SDK は **Rev.22.6.2**

こんなエラーログが出ておる。

```
Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.

Conversion to Dalvik format failed: Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.
```

AndroidSDKをバージョンアップする度に出てきやがる。
毎回対処法も違ったりしてするのも厄介。

#過去の対処法

今までの対処法だと、

**・Support Libraryを入れる。**
**・Project Build Target Version を最新にする**

とかで対処できてた記憶があるけど、今回は新手だった。

#新手の原因

Project Build Target Versionは19で最新。

![targetSDK.png](https://qiita-image-store.s3.amazonaws.com/0/24204/efa845dc-8d0a-8689-688e-74332bdf7c16.png)

しかし、AndroidManifest.xmlを見ると

```xml:AndroidManifest.xml
 <uses-sdk
        android:minSdkVersion="9"
        android:targetSdkVersion="15" />
```

おやおやたしかに不整合。15が指定されたまんま。

#対処

なので
**android:targetSdkVersion="19"**
と Target Version と同じ値を指定してやる。
無事ビルドが通った。

#繰り返さない為に
Properties -> Android -> Project Build Target から target version 変更しても、
**AndroidManifest.xmlは更新されない**ことが判明。（まじかよ）

android:targetSdkVersion が Target Versionと同じ値を指定されているか、確認してみましょう。
SSHによる公開鍵認証設定と注意点

公開鍵＝錠前
秘密鍵＝その錠をあけるための鍵

と考えたら案外すんなり理解できました。

秘密鍵は~/.sshのディレクトリに置くことで公開鍵認証ができるようになります。

puttyとWinSCPによる公開鍵認証設定の詳細はこのサイトがわかりやすいです。
http://www.nabe.bne.jp/linux/ssh.html

Puttyの場合、秘密鍵そのままの状態でローカルに移しても、Putty側で読み込めないのでPuttygenを使って、Putty側で読み込めるPPKファイルに変換してpagentで読み込むことで、.sshディレクトリに置いたのと同じ状態にできる。

また注意点であるが、SSHは非常にセキュリティに厳密なので権限をしっかり設定しないといざ公開鍵認証しようとしてもはじかれる。

```
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
```
で.sshディレクトリの権限を指定する。

参考：http://codenote.net/ssh/783.html
JSONModelでBOOLをオプショナルにする方法


## JSONModelとは
JSONをオブジェクトにマッピングしてくれるライブラリ
http://www.jsonmodel.com/

## NSStringとかなら＜Optional＞で可能

```
@property (copy, nonatomic) NSString<Optional> *username;
```

## BOOLはObjcの型でなくプロトコルの指定が出来ないのでこうする

```
+ (BOOL)propertyIsOptional:(NSString *)propertyName
{
    if ([propertyName isEqualToString:@"オプショナルにしたいプロパティ名"]) {
        return YES;
    }
    return NO;
}
```

## 複数あるなら

```
+ (BOOL)propertyIsOptional:(NSString *)propertyName
{
   NSArray *optionalProperties = @[
                                    @"schedule_fixed",
                                    @"place_fixed",
                                    @"budget_fixed",
                                    @"joining",
                                    @"updatable",
                                    @"deletable",
                                    ];
    return [optionalProperties containsObject:propertyName];
}
```
ディスク容量と時間の無駄を防ぐ。BrowserStackでVMなしでクロスプラットフォームテスト

IEの検証はいままでVMか検証機からしかできなかったですが、どれも時間とディスク容量の無駄が多く、とても不便ですが、BrowserStackを使えば、こういう必要ではない手間を大きく削減できます。

![BrowserStack](http://i.imgur.com/1Q1sj8C.png)

**HP**: <http://www.browserstack.com>

BrowserStackでのテストはリモートデスクトップを使う感覚に近いです。テストを行うには、まずサインアップが必要です。LIVEテスト機能の試用期間は30分です。

#### 公開URLのテスト

1. Test a public URLを選択し、テストしたいURLを入れます。   
    ![Step 1](http://i.imgur.com/T1Y61Vn.png)
2. ターゲットのOSとブラウザバージョンを選んで、Start testingを押します。するとローディング画面が出てきます。ローディングは大体30秒ぐらいかかります。  
    ![Step 2](http://i.imgur.com/rxOYF0q.png)
3. 準備ができれば、ブラウザ画面が出てきます。これから自由にデバッグできます。BrowserStackのブラウザには大体デバッグ用のツールが付いています（例えばFireBugなど）。デバッグにはすごく役にたちます。  
    ![Step 3](http://i.imgur.com/RGZu9Ft.png)

#### ローカルURLのテスト

BrowserStackのもう1つのすごいところは、クラウドからローカル環境をテストできます。Chromeの拡張機能を入れれば、テストに必要な環境など自動的に設定してくれます。

1. まずはBrowserStackの[Chrome extension](https://chrome.google.com/webstore/detail/browserstack-local/mfiddfehmfdojjfdpfngagldgaaafcfo?hl=en)をいれます。
2. BrowserStackを開いて、今度はTest a internal URLを選択して、Start local testingを押します。ポップアップにテストしたいローカルURLを入れます。（静的サイトでしたら、フォルダを指定できます。）  
    ![Step 2](http://i.imgur.com/QwM3DdE.png)
3. Finishを押したら、環境の設定が行われますが、できたら下図のようなポップが出てきます。中央にあるリンクを押したら、ブラウザが立ち上げられます。
    ![Step 3](http://i.imgur.com/blTH3nH.png)
4. これでローカルページを表示するブラウザでデバッグできます。
    ![Step 4](http://i.imgur.com/cZXBCoD.png)

#### IEの3ヶ月無料試用プラン

BrowserStackは無料プランで30分の試用期間しか提供していません。でももしBrowserStackでIEだけのテストを行いたい場合、Microsoftさんが提供する3ヶ月無料試用プランを是非お試しください。以下のページのフォームからBrowserStackのテストを行えば、3ヶ月無料プランになります。

**modern.IE**: <http://modern.ie/en-us/virtualization-tools>
word press

# What`s Word Press? (-introduce-)

Hello this is my first post, I wish this information help you.
------------------------------------------------------------

 If you make a homepage by using 'html' and 'css' at first , I think you would be very tired.

 You must be perpared to learan how to make it , because there are many rules to perform it.

 When you want to make it easy, I recommend you to use Word Press.

#### 1 : get word press

  In the first, you download word press in your pc. We can`t  go next step whithout the soft ware.

  [Word Press official ](http://wordpress.org/)  

#### 2 : setting server

 Next, you have to management server. you don`t have your server, you are able to rental in a site.  if you have finished setting of server yet, you would get domain name.

#### 3 : let`s word press

 Finally, we have completed surroundings of system. this page may be showed in your pc.

![word press management](http://en.blog.files.wordpress.com/2013/06/new-wordpress-dashboard.png)  
 
####thank you for reading !
JavaでURLを比較する

http://hostname:8080/hoge/?param1=value1&param2=value2
と
http://hostname:8080/hoge/?param2=value2&param1=value1
はサーバ側とすれば同じURLですが文字列で比較すると異なります。
URLを比較する便利なものを探しましたが見つからず、自作しました。
いけてないロジックなのでもっといい方法があれば教えてください。

```java

import java.net.URI;
import java.net.URL;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.client.utils.URLEncodedUtils;
import org.junit.Assert;

public class AssertExtensions {

    public static void assertUrlEquals(String expected, String actual) {
        try {
            URL url1 = new URL(expected);
            URL url2 = new URL(actual);
            URI uri1 = new URI(expected);
            URI uri2 = new URI(actual);
            
            List<NameValuePair> paramList1 = URLEncodedUtils.parse(uri1, "UTF-8");
            List<NameValuePair> paramList2 = URLEncodedUtils.parse(uri2, "UTF-8");
            
            if (url1.getHost().equals(url2.getHost())) {
                if (url1.getPath().equals(url2.getPath())) {
                    if (url1.getPort() == url2.getPort()) {
                        if (url1.getProtocol().equals(url2.getProtocol())) {
                            if (paramList1.size() == paramList2.size()) {
                                int counter = 0;
                                for (NameValuePair a : paramList1) {
                                    for (NameValuePair b : paramList2) {
                                        if (a.equals(b)) {
                                            counter++;
                                            break;
                                        }
                                    }
                                }
                                if (counter == paramList1.size()) {
                                    return;
                                }
                           }
                        }
                    }
                }
            }
            
        } catch (Exception ex) {
            
        }
        Assert.fail("expected: " + expected + " but was: " + actual);
    }
}



```
検証機なし！Genymotionの導入でAndroidブラウザのデバッグが楽ちんに

Genymotionは自分の知っている範囲で、MacOSで一番使いやすいAndroidエミュレータです。利用する前に、まずGenymotionのホームページにサインアップする必要があります。

![Geny Motion](http://i.imgur.com/vlylP7J.png)

**HP**: <http://www.genymotion.com/>  
**ダウンロード**: <https://cloud.genymotion.com/page/launchpad/download/>

Androidエミュレータを入れるには以下の手順が必要です。

1. ダウンロードされたGenymotionをアプリケーションフォルドに入れます。
2. Genymotion.app を実行します。
3. 初回実行の場合はVirutal Deviceを作成しますかと聞かれますが、ここはYesでいきます。 （後からメニューにあるAddボタンで新規作成できます）  
    ![Step 3](http://i.imgur.com/DCHEhBA.png)
4. 作成したいVirtual deviceを選択して、Nextを押して詳細を確認したら、インストールが始まります。 
    ![Step 4](http://i.imgur.com/rScosC1.png)
5. ダウンロードとインストールは何分ぐらいかかることがありますが、終わったらFinishを押します。 
    ![Step 5](http://i.imgur.com/l4seWU3.png)
6. 先ほど作成されたVirtual deviceを選択して、Playボタンでエミュレータを立ち上げます。  
    ![Step 6](http://i.imgur.com/QtoQB5S.png)
7. エミュレータが立ち上げたら、検証機とまったく同じように使ってデバッグできます。  
    ![Step 7](http://i.imgur.com/C5JId12.png)

#### Genymotionを使ってローカル環境・ローカルプロキシと連携

GenymotionのVirtual devicesはデフォルトでホストであるPCとプライベートネットワークに置かれています。
なので、ホストのIPが分かれば、ローカル環境やCharlesなどのローカルプロキシと連携できます。
例えば、ホストのIPは`192.168.0.1`の場合、`http://localhost:8000`にあるローカル環境のサイトは、Androidブラウザから`http://192.168.0.1:8000`とアクセスすれば見れます。

**ちなみに、Androidの検証機からCharlesやローカル環境に繋ぎたい場合も、同じ手順でできます。（検証機をkomachi）**

これからはCharlesを例にして、Genymotionとローカルプロキシの連携の手順を説明します。

1. まずターミナルで`ifconfig`コマンドをたたいて、ホストのIPを取得します。次はCharlesのProxy Settingにあるポート番号を取得します。  
    ![Step 1](http://i.imgur.com/ct4mB3c.png)
2. Virtual deviceの設定を開きます。
    ![Step 2](http://i.imgur.com/kEQ8P7y.png)
3. Wi-Fi設定を開いて、WiredSSIDに長押しします。  
    ![Step 3](http://i.imgur.com/9knwvxM.png)
4. ポップアップメニュからModify Networkを選択します。  
    ![Step 4](http://i.imgur.com/z3JVjSG.png)
5. Show advanced optionsにチェックを入れて、Proxy settingsからManualを選択します。あとはProxy hostnameにホストのIP、Proxy portにCharlesのポート番号を入力します。  
    ![Step 5](http://i.imgur.com/aXvt7Mk.png)
6. 設定を保存して、Androidブラウザから任意のサイトにアクセスしてみましょう。すると下図のようなポップアップが出てきます。ここでAllowを押します。  
    ![Step 6](http://i.imgur.com/DRQa2n2.png)
7. Androidブラウザに戻ります。これからVirtual deviceからの通信は全部Charlesで追跡・変更できます。  
    ![Step 7](http://i.imgur.com/PCKviak.png)
    ![Step 8](http://i.imgur.com/S3Zh6Kn.png)

#### Genymotionでweinreを使ったデバッグ 

weinreを使ったデバッグはGenymotionでもAndroid検証機でも方法は完全に一致です。

1. テストしたいページにweinreのscript要素を事前に入れるか、あるいはVirtual deviceでテストしたいページをブラウザで開いてから、Bookmarkletを実行します。
2. 続いてPCでweinre debug client interfaceを開いていれば、Chrome Dev Toolに近い感覚でデバッグできます。  
    ![Step 2](http://i.imgur.com/yyDc9Km.png)
検証機なし！iOS EmulatorでMobile Safariを快適にデバッグ

iOS EmulatorはAppだけではなく、Mobile Safariのデバッグにもすごく役に立ちます。Xcodeのコンポネントとしてインストールできますので、無料でダウンロードできます。

![iOS Simulator](http://i.imgur.com/7oengfr.png)

**Xcodeのダウンロード**: <https://itunes.apple.com/jp/app/xcode/id497799835?l=en&mt=12>

インストールの手順は以下になります。

1. まずはXcodeをインストールする必要があります。もしまだいれていなかったら、Mac App Storeからダウンロードできます。
2. iOS Simulatorを立ち上げるには、まずXcode.appを実行します。XcodeメニューのOpen Developer Toolsの下層にiOS Simulatorがあります.  
    ![](http://i.imgur.com/Y4lOMyb.png)
3. 立ち上げたら、下図のようなウィンドウが現れます。これがiOS Simulatorになります。  
    ![](http://i.imgur.com/4Lacsc6.png)
4. Xcodeをインストールした時に、最新版のiOS Emulatorは付いているはずです。もし過去のバージョン（例えばiOS 6.0）のエミュレータが必要でしたら、XcodeのPreferenceにあるDownloadタブでダウンロードできます。  
    ![](http://i.imgur.com/Rxfhhku.png)
    
#### iOS Simulatorをローカル環境と接続する

iOS SimulatorはホストのOSと同じネット環境になりますので、OSがローカル環境やCharlesに繋がっている限り、何もしなくても繋がります。

ただしCharlesを介してSSLを使ったサイトをデバッグする場合、iOS Simulatorから時々セキュリティに関するアラートが出ます。それを解消するには、CharlesのこのFAQを参考してください。  
**[SSL connections from within iPhone applications](http://www.charlesproxy.com/documentation/faqs/ssl-connections-from-within-iphone-applications/)**。

**iPhone検証機からCharlesに繋ぎたい場合は、事前にkomachi_a/gに入れば、Genymotionと同じやり方で連携することができます。**

#### iOS SimulatorでMobile Safariのデバッグ

Safari Dev ToolはSafariで開いているページだけではなく、iOS Simulatorにあるページもデバッグできます。

1. まずMobile Safariでデバッグしたいサイトを開きます。そしてSafariを開いて、トップメニューのDevelopメニューにあるiOS Simulatorの項目を選びます。  
    ![Step 1](http://i.imgur.com/IJcXy1X.png)
2. 選んだら、下図のようなDev Toolのウィンドウが開き、中からMobile Safariにあるページをデバッグできます。  
    ![Step 2](http://i.imgur.com/kWaIQ9M.png)
非エンジニアな僕がRubyインストールではまりまくったのでメモっとく

#前提
・非エンジニアです
・開発者は別にいる会社ですが、勉強がてらやってたらはまっちゃったのでメモ
・Rubyをhomebrew、rbenvでインストールしました。

#基本は下記。

```shell-session
$ brew install rbenv
$ brew install ruby-build
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ rbenv install -l
$ rbenv install 2.0.0-p353
$ rbenv global 2.0.0-p353
$ source ~/.bash_profile
$ ruby -v
$ gem install bundler
$ rbenv rehash
```

ただ、下記で2箇所つまりました。

#1箇所目。

ここでつまる。

```shell-session
$ brew install ruby-build
```

下記参考にして、古いopenssl削除して新しいopensslインストールして、opensslの向き先かえる。
http://apple.stackexchange.com/questions/126830/how-to-upgrade-openssl-in-os-x

#2箇所目

ここでつまる。

```shell-session
$ rbenv install 2.0.0-p353
```

ので、下記のページを参考。
http://qiita.com/manuluu/items/85c42e2ddd03c4832c28
WindowsのSublimeText2でMac同様にCtrl+Rightを行末ジャンプにする

```json
[
{ "keys": ["ctrl+left"], "command": "move_to", "args": {"to": "bol"} },
{ "keys": ["ctrl+right"], "command": "move_to", "args": {"to": "eol"} },
{ "keys": ["ctrl+shift+left"], "command": "move_to", "args": {"to": "bol", "extend": true} },
{ "keys": ["ctrl+shift+right"], "command": "move_to", "args": {"to": "eol", "extend": true} }
]
```

Windowsで`Ctrl+Left`, `Ctrl+Right`はWord単位でジャンプするため、使いづらい。
key-mapに上記のJSONを加えることで変更できた。
なお、Windowsでは`Home`, `End`を使えばよいようだ。
Nginxで同じサーバーに複数のIP address用の証明書を配置する

# Nginxで同じサーバーに複数のIP address用の証明書を配置する

1つのサーバーに対しlocal addressとglobal addressを割り振り、
どちらもHTTPSでアクセスしたい場合の設定です。

例：

    local address：xxx.xxx.xxx.xxx
    global address：yyy.yyy.yyy.yyy

1.まずxxx.xxx.xxx.xxx用とyyy.yyy.yyy.yyy用の証明書を配置します。

  yyy.yyy.yyy.yyy用
  
    /etc/nginx/ssl_certfile/key_yyy_yyy_yyy_yyy/server_pem.crt
    /etc/nginx/ssl_certfile/key_yyy_yyy_yyy_yyy/server_pem.key
    
  xxx.xxx.xxx.xxx用
  
    /etc/nginx/ssl_certfile/key_xxx_xxx_xxx_xxx/server_pem.crt
    /etc/nginx/ssl_certfile/key_xxx_xxx_xxx_xxx/server_pem.key

2.次のように両アドレス用の設定を作成します。
（冗長な書き方になっていますが）

sample_app.conf

    upstream sample_app {
      server unix:/var/www/sample_app/tmp/sockets/unicorn.sock;
    }
    
    server {
      listen       yyy.yyy.yyy.yyy:443;
      server_name  sample_app;
    
      ssl                 on;
      ssl_certificate     /etc/nginx/ssl_certfile/key_yyy_yyy_yyy_yyy/server_pem.crt;
      ssl_certificate_key /etc/nginx/ssl_certfile/key_yyy_yyy_yyy_yyy/server_pem.key;
      ssl_protocols       SSLv3 TLSv1;
      ssl_ciphers         HIGH:!ADH:!MD5;
    
      location / {
        try_files $uri $uri/index.html $uri.html @sample_app;
        client_max_body_size 2M;
      }
    
      location @sample_app {
        proxy_read_timeout 30;
        proxy_connect_timeout 30;
        proxy_redirect     off;
        proxy_set_header   X-Forwarded-Proto https;
        proxy_set_header   Host              $http_host;
        proxy_set_header   X-Real-IP         $remote_addr;
    
        proxy_pass http://sample_app;
    
        proxy_send_timeout 30;
      }
    }
    
    server {
      listen       xxx.xxx.xxx.xxx:443;
      server_name  sample_app;
    
      ssl                 on;
      ssl_certificate     /etc/nginx/ssl_certfile/key_xxx_xxx_xxx_xxx/server_pem.crt;
      ssl_certificate_key /etc/nginx/ssl_certfile/key_xxx_xxx_xxx_xxx/server_pem.key;
      ssl_protocols       SSLv3 TLSv1;
      ssl_ciphers         HIGH:!ADH:!MD5;
    
      location / {
        try_files $uri $uri/index.html $uri.html @sample_app;
        client_max_body_size 2M;
      }
    
      location @sample_app {
        proxy_read_timeout 30;
        proxy_connect_timeout 30;
        proxy_redirect     off;
        proxy_set_header   X-Forwarded-Proto https;
        proxy_set_header   Host              $http_host;
        proxy_set_header   X-Real-IP         $remote_addr;
    
        proxy_pass http://sample_app;
    
        proxy_send_timeout 30;
      }

3.Nginxがglobal addressをbindできるようにします

/etc/sysctl.conf
に次の設定を追加します。

    net.ipv4.ip_nonlocal_bind = 1

システムに設定を反映します。

    $ sysctl -p /etc/sysctl.conf

※設定がない場合、Nginxを起動する時に次のようなエラーが出ます。

    $ sudo /sbin/service nginx start
    Starting nginx: [emerg]: bind() to yyy.yyy.yyy.yyy failed (99: Cannot assign requested address)
Yコンビネータでラムダ式が再帰関数に変わるからフィボナッチ数も計算できる、Java8版

Yコンビネータと言いつつZコンビネータじゃね？

```Program.java
package example;

import java.util.function.*;

public class Program {

	public static void main(String[] args) {

		Function<Integer, Integer> fib
			= Y(f -> n -> n > 1 ? f.apply(n - 1) + f.apply(n - 2) : n);
		System.out.println(fib.apply(8));
	}

	static <A, R> Function<A, R> Y(
		Function<Function<A, R>, Function<A, R>> f) {
		Recursive<A, R> rec1 = r -> a -> f.apply(r.applyRec(r)).apply(a);
		Recursive<A, R> rec2 = r -> a -> f.apply(r.applyRec(r)).apply(a);
		return rec1.applyRec(rec2);
	}
}

@FunctionalInterface
interface Recursive<A, R> {
	public Function<A, R> applyRec(Recursive<A, R> f);
}
```
Drools 6でKieSessionをCDIで取得する方法

Droolsはバージョン6になって、APIにCDIが使えるものが出た。
今のところ、うれしいケースは少ない感触だけど、とりあえず使い方を。

## 依存性を解決
Gradleにしろ、Mavenにしろ、以下を追加。

- javax.enterprise:cdi-api:1.2
- org.jboss.weld.se:weld-se-core:2.2.0.Final

## kmodule.xml
src/main/resources/META-INF/kmodule.xmlは、通常と変わらずに書いて、今回はStatelessセッションに。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
    <kbase name="Base_Rules" packages="rules">
        <ksession name="example.session" type="stateless"/>
    </kbase>
</kmodule>
```

## beans.xml
src/main/resources/META-INF/beans.xmlを内容なしで作っておく。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>
```

## CDIするクラス
例えばこんなクラスでStatelessKieSessionをDIするように記述。
Java EEなプロジェクトじゃなかったので、CDIの実装にWeldを持ってきた。

```java
import javax.inject.Inject;

import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;
import org.kie.api.cdi.KSession;
import org.kie.api.event.rule.DebugAgendaEventListener;
import org.kie.api.event.rule.DebugRuleRuntimeEventListener;
import org.kie.api.runtime.StatelessKieSession;

public class CDIRunner {
	@Inject
	@KSession("example.session")
	private StatelessKieSession session;
	
	public <T> void run(List<T> objs) {
		Weld weld = new Weld();
		WeldContainer container = weld.initialize();
		
		session = container.instance().select(StatelessKieSession.class).get();
		session.execute(objs);
		
		weld.shutdown();
	}
}
```

## ルールを動かす
Groovyなのは、Spockでテストしたから。

```groovy
def fact = new Fact("aaa")
def runner = new CDIRunner()

runner.run([fact])
```

こうすると、CDIRunnerをnewする度に新しいセッションが作られて、ルールが実行されるようになる。

## 参考
- [drools/drools-examples-cdi at master · droolsjbpm/drools](https://github.com/droolsjbpm/drools/tree/master/drools-examples-cdi)
- [JavaEE - JavaSE 環境でCDI（Weld）を使う - Qiita](http://qiita.com/opengl-8080/items/2f03ab496e871cf32f54)
Mac OS Xにおいてrbenv使用時のgemの指定について

Mac OS Xでは，
プリインストールされているrubyが優先されているので，
![無題.jpg](https://qiita-image-store.s3.amazonaws.com/0/42214/aa3901fe-707b-16bb-151c-8a8fd08abbac.jpeg)


rbenvだけ切り替えても意味が無い．
![無題2.jpg](https://qiita-image-store.s3.amazonaws.com/0/42214/81afad77-253e-d351-fb8c-117fd95e626b.jpeg)

PATHを下記のどちらか指定する必要がある．

export PATH="$HOME/.rbenv/bin:$PATH"
export PATH="$HOME/.rbenv/shims:$PATH"

![無題3.jpg](https://qiita-image-store.s3.amazonaws.com/0/42214/7e895f29-1050-48b9-b930-5d2c3092fb15.jpeg)
boot2docker のコマンドを確認する


## 経緯
知人に「dockerいいよ！」と勧められ、ずっとやってなかった。

![Dockerを勧められた様子](https://qiita-image-store.s3.amazonaws.com/0/23370/13feeb41-8778-251d-a600-fa3b3623296b.png)

なぜ？ってどんなツールか知らずに入れたくなかった。
ただ、社内でもどうなんだろうね？的な流れになってきたので、まずはコマンドの内容を確認する。

※ dockerコマンドも別の機会に確認しようと思います。

## インストール
では、まずはインストールをしていきましょう。
公式ドキュメントには、curlで持ってくるとのことでしたが、
`homebrew`でもインストールできるみたいなので、そちらからインストールします。

参考：[OS X をサポートした Docker 0.8 を試す](http://qiita.com/kanekoa/items/cf3cabb23da69c609002)

```
$ brew update
$ brew tap homebrew/binary
$ brew install docker
$ brew install boot2docker
```

これでまずはインストール完了です。
以降、dockerを行っていく上での基礎となるOSインストール作業を行っていきます。

```
$ boot2docker init
$ boot2docker up
$ export DOCKER_HOST=tcp://
```

## boot2docker コマンド
では、今回の本題、コマンドを確認していきます。

今回確認したバージョンはこちら。

```
$ brew info boot2docker
boot2docker: stable 0.8.0, HEAD
https://github.com/boot2docker/boot2docker
/usr/local/Cellar/boot2docker/0.8.0 (4 files, 32K) *
```

[boot2docker/boot2docker](https://github.com/boot2docker/boot2docker)のGithubはこちら。

```
$ boot2docker
Usage /usr/local/bin/boot2docker {init|start|up|save|pause|stop|restart|status|info|delete|ssh|download}
```

```
$ boot2docker init
```

>vagrantをご使用の方ならお馴染み。
>Docker用の仮想マシンを立ち上げる時の設定を行う。

>isoファイルの場所を変えたり、自分で作ったりする場合には、
>設定ファイル`$HOME/.boot2docker/profile`を作成して以下の内容を記述する。

>・`VM_NAME`:VirtualBox での VM の名前 (デフォルト:`boot2docker-vm`)
>・`DOCKER_PORT`:ホスト側で docker 用に使うポート (デフォルト:`4243`)
>・`SSH_HOST_PORT`:ホスト側で ssh サーバー用に使うポート (デフォルト:`2022`)
>・`VM_DISK`:vmdk ファイルのパス (デフォルト:`${BOOT2DOCKER_CFG_DIR}/${VM_NAME}.vmdk`)
>・`VM_DISK_SIZE`:vmdk の容量 (デフォルト:`40000`メガバイト)
>・`VM_MEM`:メモリ (デフォルト:`1024`)
>・`BOOT2DOCKER_ISO`:ISO ファイルのパス (デフォルト:`${BOOT2DOCKER_CFG_DIR}/boot2docker.iso`)

>参考：
[boot2dockerの仮想マシンディスクを外部ディスクに移動する](http://blogs.zealot.co.jp/archives/657)
[boot2dockerでdockerを試す](http://blog.n-z.jp/blog/2014-02-23-boot2docker.html)

```
$ boot2docker start
```

>boot2dockerを最新バージョンに上げる時に利用する。
>`$ boot2docker stop`で止めて、`$ boot2docker download`でアップデート。
>そして`$ boot2docker start`で再度起動する流れ。

```
$ boot2docker up
```

>`$ boot2docker init`でDocker用のVMを設定した後、起動する。

```
$ boot2docker save
```

>稼働しているDocker用のOSを保存してくれる。

>```
$ boot2docker save
[2014-04-22 15:41:17] Suspending boot2docker-vm...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
$ ls -l /Path/to/VirtualBox\ VMs/boot2docker-vm/
(省略) 4 22 15:43 boot2docker-vm.vbox-prev
```

>なお、OSの保存は上書きされるみたいです。

```
$ boot2docker pause
```

>稼働しているDocker用のOSをサスペンドする。

```
$ boot2docker stop
```

>稼働しているDocker用のOSを止める(シャットダウンする)。

```
$ boot2docker restart
```

>稼働しているDocker用のOSを再起動する。

```
$ boot2docker status
```

>Docker用のOSが稼働しているか確認する。

```
$ boot2docker info
```

>Docker用のOSの設定情報を確認する。

```
$ boot2docker delete
```

>Docker用のOSのVMを削除する。

```
$ boot2docker ssh
```

>Docker用のOSにssh接続する。
>デフォルトのssh接続は、
>user: docker / pass: tcuser

```
$ boot2docker download
```

>`boot2docker`をアップデートする。

## 全般で参考にしたサイト
[Docker Installation Mac OS X](http://docs.docker.io/installation/mac/)
Finderの左側に出てるアレ（よく使う項目）から項目を削除する


よく忘れるのでメモ

`コマンドキー（⌘）` + ドラッグ で欄外に移動すると消える。



[Mac OS X v10.6.7 以降で、Finder のサイドバーから項目を削除する方法](http://support.apple.com/kb/HT4580?viewlocale=ja_JP&locale=ja_JP)
便利なEclipseショートカットキーまとめ(Mac)


よく使う便利なやつだけ。

## ショートカットキー
#### デバッグ系

|コマンド|意味|
|:--|:--|
|`F5`|1行ずつ実行（メソッドの呼び出し先まで深掘る）|
|`F6`|1行ずつ実行（そのクラス内において1行ずつ）|
|`F7`|メソッドの呼び出し元に戻る（F5で潜った後使う）|
|`F8`|次のブレークポイントまで実行|
基本的には`F6`と`F8`だけ使えばいい。
メソッドの中まで深掘って見たいときは`F5`で中まで行って、呼び出し元のファイルまで戻ってくるには`F7`を使えばいい。

デバッグの実行をするには、

- カブトムシみたいなボタン押す
- `Command` + `F11`

のいずれかをすれば良い。

#### 便利系

|コマンド|意味|
|:--|:--|
|`Command` + `Alt` + `j`|Javadocつける|
|`Command` + `Alt` + `r`|変数名一括変換|
|`Command` + `Alt` + `s`|ソースメニュー開く（getter,setter,コンストラクタなどを追加できる）|
|`Command` + `/`|選択範囲行（orカーソル行）のコメントアウトの付け外し|
|`Command` + `d`|選択範囲行（orカーソル行）の削除|
|`Command` + `[`|1つ前に開いていたファイルに戻る|
|`Command` + `]`|`Command` + `[` の逆。1ファイル進む|
|`Command` + `i`|選択した範囲のインデントを整える|
|`Command` + `f`|ファイル内検索|
|`Ctrl` + `h`|全体検索|
|`F3`|宣言してるメソッド（orフィールドなど）を開く|
|`Command` + `Shift` + `f`|フォーマット整える|
|`Ctrl` + `fn` + `↑`|タブ切り替え（左へ）|
|`Ctrl` + `fn` + `↓`|タブ切り替え（右へ）|
|`Command` + `F11`|デバッグ|
|`Command` + `Shift` +`F11`|実行|
どれもすごく便利。

#### Eclipseに限らず使える便利なショートカット

|コマンド|意味|
|:--|:--|
|`Command` + `n`|新規作成|
|`Command` + `s`|保存|
|`Command` + `c`|コピー|
|`Command` + `v`|ペースト|
|`Command` + `x`|カット|
|`Command` + `p`|プリント|
|`Command` + `a`|全選択|
|`Command` + `z`|1つ戻る|
|`Command` + `Shift` + `z`|1つ進む|
|`Command` + 矢印|行けるとこまでカーソル移動|
|`Shift` + 矢印|範囲選択しながらカーソル移動|
|`Command` + `Shift` + 矢印|上2つの組み合わせ|



## その他（便利な設定）
ショートカットキーではないが、作業効率が上がる設定を2つほど。

#### エディタに行番号を入れる
`Command` + `,`（←設定のショートカット）
→エディタ
→テキストエディタ
→「行番号の表示」のチェックボックスにチェック入れる

#### コンテンツ・アシスト（補完機能）
`Command` + `,`（←設定のショートカット）
→Java
→エディタ
→コンテンツ・アシスト
→Auto Activationの「Enable auto activation」にチェックを入れ、下記を設定する。

- Auto activation delay (ms)：200
- Auto activation triggers for Java：`._abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`

#### おまけ
必要に応じてプラグイン入れてみてもいいかも！
CheckstyleとかFindBugsとか！
Aptana Studio3も便利！（←Eclipse上でJSやsassなどフロントのファイルもいじれる）
【参考URL】
▼Sass+compassをEclipse環境にインストール
http://frmmpgit.blog.fc2.com/blog-entry-33.html
WordPress3.9でTypePad 絵文字 for TinyMCE 記事に挿入できないとき

pluginのtypepad-emoji-for-tinymce > InsertEmoji.js
19 Line

```js:InsertEmoji.js
// 下記の行を
//window.tinyMCE.execInstanceCommand('content', 'mceInsertContent', false, icontag);
// こちらに(WP3.9というかTinyMCE Advancedがバージョン 4.0.X以降？)
window.tinyMCE.execCommand('mceInsertContent', false, icontag);
```

で動作しました。
他の方も同じ現象の方がいた場合用メモメモ。
AngularDartで他の要素にイベント通知する

例えば、下記のような構造があったとして、

- ControllerA
	- ComponentA
	- ComponentB
	- ComponentC

ここで、ComponentAからイベントを通知させて、それをControllerが受信するような場合にどうやるのか。

## angular:coreのScopeを使う
### イベント通知側の処理 (ComponentA)

```Dart:ComponentA.dart
class ComponentA {
	Scope _scope;

	ComponentA(this._scope);

	void click() { // ng-clickで呼ばれるメソッド
		_scope.rootScope.broadcast('onItemSelected');
	}
}
```

こんな具合でScopeの一番上に対しbroadcastさせる。
また、ScopeにはparentScopeというのもあるので、それで通知させる範囲を調整できるっぽい。

### イベント受信側の処理 (ControllerA)

```Dart:ControllerA.dart
class ControllerA {
	Scope _scope;

	ControllerA(this._scope) {
		_scope.on('onItemSelected')
			   .listen((event) {
					print(event.name);
				});
	}
}
```

これでOK。
ちなみに、この状態でComponentBやCにControllerAと同じような受信処理を書くと、きちんと受信してくれる。
Google Play Store の「ユーザーがインストールした他のアプリ」に意図したアプリを表示させる方法

**TODO 後で書く**

# 自分が公開したアプリに競合アプリが載るのは気に入らないよね

## これ公開していいのかな・・・？

## ぜんてい

- G社の実装次第だから今できても、将来できなくなる可能性は高いです
- そうなっても責任は持てません
- 自分でアプリをつくっている人が対象です
- 他人が公開しているアプリの表示をコントロールすることはできません
EditText に、ソフトウェアキーボードから懐かしのあの絵文字たちを入力する

# スマホのソフトウェアキーボードと絵文字

ガラケー時代の名残の"あの絵文字機能"は、スマホ時代にも健在で、おそらく国内で発売されているどのスマホを買っても、キャリアごとの絵文字が入力できるような機能が、ソフトウェアキーボードに搭載されています。

Google 日本語入力先生も、地味に絵文字対応していたりして、Nexus4だと何故か絵文字が画面上に表示されませんが、入力自体はできるようになっています。

## 標準では入力制限がかかっている

特になにもしていないと、おおよそキャリアメールクライアント以外では、ソフトウェアキーボードの絵文字機能は使えないようになります。

なので、Google 日本語入力先生なんかでは、記号ボタンを押した後の画面で、絵文字ボタンはグレーアウトして押せないはずです。

## ユーザが自由に絵文字増やせる端末も

で、世の中には面白いスマホ端末が発売されていて、SoftBank Mobile から京セラさんが出している HoneyBee という前衛的な端末では、写真にとったものを絵文字にできるという愉快な機能（オリジナルマイ絵文字）が搭載されています。

さらにおもしろいことに、この HoneyBee に載ってるソフトウェアキーボードは、上記の入力制限なく、ところかまわず絵文字が入力できるように作られているようで、他の端末では絵文字入力できない EditText にも、HoneyBee なら絵文字入力できます。

一体どんな文字コード体系で扱われるのかは知りませんが、メールに添付できたりもするようです。デコメ的な扱われ方なんでしょうか。いずれにしても、何の気なしにオリジナルマイ絵文字を自分のアプリに入力されてしまうと、何が起こるんです？

> undef

# 絵文字を入力できるようにしよう

やりかたは、本当は 2 つあるはずなんですが、動かしてもフレームワーク側で弾かれてぬるぽになるので、実質 1 つです。

## xml で頑張る

実は、しれっと Android のリソースの中には、`<input-extras>`なるものがあって、この中に、Bundle にデータを打ち込む要領で、`android:name`属性と`android:value`属性をもつ`<extras>`要素をぶら下げると、`Bundle`に`<extras>`の中身が入ってるようなものが、静的リソースとして定義できるよって書いてあります。
で、そのリソースを`res/xml`ディレクトリに放り込んで、その`Bundle`を使いたい`EditText`の属性に、`android:editorExtras="@xml/emoji_extras"`みたいに書いておくと、指定したリソースで定義した`Bundle`が`EditText`に放り込まれ、オプショナルな機能がいじれるようになります、って書いてあります。

Google 先生に聞いてもそれなりの情報は出てきたりはするので、どっかで使っている人は居るんでしょう。実際、絵文字用に、以下の様な `<input-extras>`のリソースがサンプルとして作られていたりします。

```xml

<input-extras xmlns:android="http://schemas.android.com/apk/res/android">
	<extra android:name="allowEmoji" android:value="true"/>
</input-extras>
```

```xml
<EditText
	...
	android:editorExtras="@xml/emoji_extras"
	... />
```

動かすと落ちます。

知らない xml の要素を検出したとかで、ぬるぽで死にます。
同じように困っている人がいるので、現時点ではこれは正しいやりかたではないようです。

https://code.google.com/p/android/issues/detail?id=38122

## コードで何とかする

で、どうするかというと、Java で何とかします。

```java

EditText edit = (EditText) findViewById(R.id.edit);
Bundle extras = edit.getInputExtras(true);
if (extras != null) {
	extras.putBoolean("allowEmoji", true);
	extras.putBoolean("allowDecoEmoji", true); // デコメ的なやーつもあるらしい
}
```

これで絵文字ボタンが有効化されました（ソフトウェアキーボードの種類によってはガン無視するやつも居るかもしれません）。

ヒャッハー！これでガラケー時代の絵文字が俺達のアプリでも使えるんだぜ！

って思うんですが、なんか使えませんでした。絵文字は残念なことに、真っ白。一応、入力自体はできているようで、謎の空白が詰め込まれていき、キャレットだけが静かに動きます。これは Nexus 端末だからなのでしょうか…
カーネル法とサポートベクトルマシンへの応用

[前回](http://qiita.com/ynakayama/items/dc54c48b94db7bc8d939)、[前々回](http://qiita.com/ynakayama/items/d356360ef909f04366ae)と [PRML](http://www.amazon.co.jp/dp/4621061240/) の内容を追って来ましたのでここで再び復習を兼ねてまとめてみたいと思います。

## カーネル法 (kernel method)

内積だけを用いて学習や分類をおこなうことを **カーネル法 (kernel method)** と言い、事例の対を引数として高次元の内積を与える関数を **カーネル関数 (kernel function)** と言います。

**多項式カーネル (polynomial kernel)** では 2 つのベクトル x_i と x_j に対して次のような値を与えます。

```math
K_{poly}(x_i, x_j) = (x_i・x_j + r)^d
```

これに対し昨日出てきた RBF カーネルでは次のように定義されます。 s は正の定数です。

```math
K_{RBF} (x_i, x_j) = exp(-s|x_i - x_j|^2)
```

## サポートベクトルマシン

古典的な線形二値分類器であり、カーネル法と組み合わせることで非線形な分類も可能となります。

訓練データ D を {(x_1, y_i), (x_2, y_2), ... ,(x_D, y_D)} という素性ベクトルだとし、正例のクラスラベルを +1 、負例のクラスラベルを -1 としたとき、線形分類器であるので分離平面の方向ベクトル w と切片 b をパラメータとして次式の関数で導かれます。

```math
f(x) = w・x-b
```

マージン最大化については[以前に説明した](http://qiita.com/ynakayama/items/d204e9d9d4a18ab13a39)通りです。最適化問題は ||w||^2 を最小化する問題に帰結するのを思い出しましょう。

### 多値分類器への応用

正例、負例だけでなくクラス数が 3 以上あるような問題に対してサポートベクトルマシンを適用したい場合には色々な方法がありますがここでは 2 つを紹介します。

* one-versus-rest 法 : 各クラスについて分離平面を作り、 2 つ以上のクラスについて正例となった場合は関数距離の大きいクラスに分類します。
* ペアワイズ法 : クラスペアごとにそれぞれの分離平面を作ります。結果として分離平面は n(n-1)/2 個となります。

## 参考

言語処理のための機械学習入門 (自然言語処理シリーズ) 
http://www.amazon.co.jp/dp/4339027510
[CakePHP 2.x] ComponentでConstructorを使う、ついでにShellからComponentを使うまとめ

cakephp?でのコンストラクタの使い方をメモ。


まずComponentの方。

```php:AsagohanComponent.php
<?php
App::uses('Component', 'Controller');

class AsagohanComponent extends Component {

    const BURNER_ACCESSKEY = "hidarihajinaraok";
    const BURNER_SECRETKEY = "jikkurimawasu";
    const BURNER_REGION = "hidarihaji";

    private $_ochawan;
    private $_owan;
    private $_burner;

    public function __construct(ComponentCollection $collection, $settings = array()) {
        // Burnerオブジェクト作成
        try {
            $this->_burner = Burner::factory(array(
                'key' => self::ACCESS_KEY,
                'secret' => self::SECRET_KEY,
                'region' => self::REGION
            ))->get('burner');
        } catch (S3Exception $e) {
            throw new CakeException($e, Configure::read('AsagohanErrorCode.cannot_use_burner'));
        }

        $this->_ochawan = "zakkokumai"
        $this->_owan = 'omisoshiru' . $this->_ochawan;

        parent::__construct($collection, $settings);
    }

    // Getter
    public function getOchawan() {
        return $this->_ochawan;
    }
    
    // Getter
    public function getOwan() {
        return $this->_owan;
    }

```

これを Console/NeokiShell.php から呼び出します。

```php:Console/NeokiSHell.php
<?php
App::uses("ComponentCollection", "Controller");
App::uses("AsagohanComponent", "Controller/Component");

class NeokiShell extends AppShell {
    public function startup() {
        $collection = new ComponentCollection();
        $this->Asagohan = new AsagohanComponent($collection);
        parent::startup();
    }

    public function main() {
        $gohannisuru = $this->Asagohan->getOchawan();
        $shirumono = $this->Asagohan->getOwan();
    }

}
```

こんな感じ。
少しコードがスッキリするかな。
印刷時とりあえずA4 1枚に収めるための最小限のCSS

やっつけ感ありますが、とりあえずA4 1枚に収まります。

```scss
@media print {
	// 印刷したくない領域
	.hidden-print {
		display: none;
	}
	// 印刷したい領域
	.content-print{
		top:0 !IMPORTANT;
		left:0 !IMPORTANT;
		width:172mm !IMPORTANT;
		height:251mm !IMPORTANT;
	}
}
```
Rubyプロジェクトのコンフィグ読み出しでChamberを使ってみた

<!-- permanent -->

[Settingslogicを使ってconfig.yml, config.local.yml運用してみる - Qiita](http://qiita.com/sawanoboly/items/1d776006ed24513e1b55 "Settingslogicを使ってconfig.yml, config.local.yml運用してみる - Qiita") の続編で、[binarylogic/settingslogic](https://github.com/binarylogic/settingslogic "binarylogic/settingslogic")から[m5rk/chamber](https://github.com/m5rk/chamber "m5rk/chamber")に乗り換え。


## こうしたかった

- 設定はYamlに書きたかった
- CIやPaaS(Heroku)にフィットさせるため、環境変数と併用したかった
  - ChamberはSettingsLogicと同じように、Yamlを一度ERbで処理する
- hoge.yml, hoge.local.ymlとあったら、hoge.local.ymlを優先するようにマージしたかった
  - ローカル作業時はわざわざ環境変数を変更するのが面倒なことが多い
  - test-kitchenの設定の持ち方を参考にした
  - hoge.ymlは基本的にERbのENVから取るので、センシティブな値を除去してリポジトリにADDできるのが嬉しい。



## このように書いた

```
require 'chamber'

env_confs = [
  File.expand_path('../../config/environment.yml', __FILE__),
  File.expand_path('../../config/environment.local.yml', __FILE__)
]
EnvSettings = Chamber.load files: env_confs


app_confs = [
  File.expand_path('../../config/app.yml', __FILE__),
  File.expand_path('../../config/app.local.yml', __FILE__)
]
AppSettings = Chamber.load files: app_confs
```

まあまあスッキリした。
GitHubのissue番号を自動でcommitに書き、issue番号がないコミットははじくようにするgit hooksまとめ！

#①issue番号がないとコミットできない
どうなるかというと。。。

```git
[pall@pall:~](79_imgAddAltTag)$ git st
# On branch 79_imgAddAltTag
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   README.md
#
[pall@kazumasa:~](79_imgAddAltTag)$ git commit -m "test"                               
コミットにチケット情報入れてーーー
```
となる

##やり方
レポジトリの`.git/hooks/commit-msg`に書く

```
$ cd レポジトリのトップの階層に
$ vim .git/hooks/commit-msg
$ chmod +x .git/hooks/commit-msg
```

※実行権を付けないとうまく動きません！！！

```shell
#!/bin/sh

#チケットに関するログが記載されているかのチェック
exp="(?:close|closed|closes|fix|fixed|fixes|addresses|references|refs|re|see)"
exp=$exp".?(#[0-9]+(?:(?:[, &]+| *and *)#[0-9]+)*)"
grep -E "$exp" $1 > /dev/null

if [ $? -ne 0 ]; then
    echo 'コミットにチケット情報入れてーーー'
    exit 1
fi
```

これで完了

#②git commit ってするとissue番号が自動付与
どうなるかというと。。

```shell
[pall@pall:~](79_imgAddAltTag)$ git commit

      1 refs#79
      2 
      3 # Please enter the commit message for your changes. Lines starting
      4 # with '#' will be ignored, and an empty message aborts the commit.
      5 # On branch 79_imgAddAltTag
      6 # Changes to be committed:
      7 #   (use "git reset HEAD <file>..." to unstage)
      8 #
      9 #   modified:   README.md
     10 #
```

ってなる。
`git commit -m "test"`だとうごかない。。
branch名を `isuue番号_branch名`　にすること！！
1isuue 1branch !!

##やり方

```git
$ cd レポジトリのトップの階層に
$ vim .git/hooks/prepare-commit-msg
$ chmod +x .git/hooks/prepare-commit-msg
```

```shell
#!/bin/sh

if [ "$2" == "" ] ; then
  mv $1 $1.tmp
  echo "refs #`git branch | grep "*" | awk '{print $2}' | sed -e "s/^\([0-9]*\).*/\1/g"`" > $1
  cat $1.tmp >> $1
fi
```

で完了。



参考：

 - [コミット時にチケットに関するコメントが書かれていることをチェックする](http://nakaji.hatenablog.com/entry/20091213/1260684500)
 - [issue番号を勝手にcommit commentに入れてくれるやつ](http://qiita.com/jumbOS5/items/9e63f4835b9335cbaf22)
 - [Git hooks まとめ](http://qiita.com/khlizard/items/dfe1ec9d82c0ed5da7c6)



番外編
shではなく、rubyでもかけるって。。

 - [gitのhooksを使ってissue番号を付け忘れたコミットを弾く](http://blog.androbook.net/post/65680944034/git-hooks-issue)
 - [gitのpre-commit hookを使って、綺麗なPHPファイルしかコミットできないようにする](http://blog.manaten.net/entry/645)
 - [pre-commit hookでmasterへのcommitを禁止した](http://blog.n-z.jp/blog/2014-02-07-pre-commit-hook.html)
 - [Gitのフック（hook）を使って自動的にデプロイする](http://rfs.jp/server/git/git-hook-post-receive.html)
RemoteNotificationはcancelAllLocalNotificationsがきかない


RemoteNotificationで受信した通知は、cancelAllLocalNotificationsメソッドでは通知センターからクリアされない。

### バッジの数字変動がカギになっている

バッジ数が1以上から0になった時に通知センターから通知が消去される

#### バッジ数が1以上設定されているバッジの場合

```Objective-C:バッジクリア
UIApplication *application = [UIApplication sharedApplication];
application.applicationIconBadgeNumber = 0;
```

これで､通知センターから消える

#### バッジ数が設定されていない（バッジ数が0）の通知の場合

上記の方法では通知センターから消えない。
一度バッジ数を1以上に変更してから0にしないと消えないので以下のように一度数値を1に変更する。

```Objective-C:バッジ0の場合の消し方
UIApplication *application = [UIApplication sharedApplication];
application.applicationIconBadgeNumber = 1;
application.applicationIconBadgeNumber = 0;
```
openjpa logging configuration with slf4j.

#summary
1. Declare a property which configure openjpa to use slf4j in *persistence.xml*
2. Declare loggers in *logback.xml* with names of [Logging Channels](http://openjpa.apache.org/builds/2.2.1/apache-openjpa/docs/ref_guide_logging.html)

#example

```xml:persistence.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL">
 <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>

        <properties>
            <property name="openjpa.Log" value="slf4j"/><!-- Details are specified in logback.ml -->
        </properties>
    </persistence-unit>
</persistence>
```

```xml:logback.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE logback>
<configuration debug="false">
<logger name="openjpa.Runtime" level="OFF">
   <appender-ref ref="someAppender" />
</logger>
</configuration>
```


# reference
- [Chapter 3.  Logging and Auditing](http://openjpa.apache.org/builds/2.2.0/apache-openjpa/docs/ref_guide_logging_slf4j.html)
- [Definition of Logging Channel](http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfiguration.java?view=markup)