OmniAICreator/Qiita-1.07M huggingface dataset:
Gradleからs3にMavenリポジトリをアップロードする


# やりたいこと
* Android用のライブラリをMavenの形式でホストしたい
* ホストにはs3を利用する
* CircleCIでCIを回しmasterへのpushをトリガーにs3へのアップロードも自動化したい

# Android LibraryプロジェクトをMaven形式へ変換
Android LibraryプロジェクトをMaven形式に変換するには、mavenプラグインを利用する。

```groovy
apply plugin: 'maven'

uploadArchives {
    repositories {
        mavenDeployer {
            repository url: "保存先のパス"
            pom.version = '0.0.1' // ライブラリバージョン
            pom.groupId = 'com.example' // グループ名
            pom.artifactId = 'test' // アーティファクト名
        }
    }
}
```

build.gradleにuploadArchivesとして定義しておくと、tasksにuploadArchivesが追加されるのでコマンドラインから実行可能になる。

```bash
$ ./gradlew uploadArchives
```

上記のようにコマンドを実行するとMaven形式で指定したパスに保存される。

# s3へのアップロード
s3にアップロードする場合には、repository urlにs3:で始まるパスを指定する。

```groovy
apply plugin: 'maven'

configurations {
    deployerJars
}
dependencies {
    deployerJars 'org.springframework.build.aws:org.springframework.build.aws.maven:5.0.0.RELEASE'
}

uploadArchives {
    repositories {
        mavenDeployer {
        
        	configuration = configurations.deployerJars

            repository(url: "s3:/${s3のbacket}") {
              authentication(userName: s3Key, passphrase: s3Secret)
            }
            pom.version = '0.0.1' // ライブラリバージョン
            pom.groupId = 'com.example' // グループ名
            pom.artifactId = 'test' // アーティファクト名
        }
    }
}
```
configurationには、repository urlに指定するパスのプロトコルごとに異なるライブラリを指定する。例えばsshならorg.apache.maven.wagon:wagon-ssh:2.2が必要になる。[参考](http://gradle.monochromeroad.com/docs/userguide/maven_plugin.html#wagonLibs)

s3の場合には、[springframeworkのaws-maven](https://github.com/spring-projects/aws-maven)を利用する。s3に認証には、authenticationを記述して行い、key、secretは[環境変数](http://gradle.monochromeroad.com/docs/userguide/tutorial_this_and_that.html)にするか外部ファイルに記述するなどする。

# circle.yml
s3にアップロードする流れは以下の通り。

1. ./gradlew assebleRelease
2. ./gradlew uploadArchives

これらのコマンドをCircleCIのdeploymentフローで実行すれば自動でs3にアップロードされるはず。

# 追記
mavenプラグインを使う方法だとACLを設定する方法が見つからないのでもう一度考え直してみる。別のプラグインを使えば出来そうだけど複雑になりそうなのでできれば使いたくない。Maven形式に変換する部分までをmavenプラグインで行い、s3へのアップロードは別途行った方が良さそう。

# 参考
* http://u1aryz.blogspot.jp/2013/06/githubmavenandroidaar.html
* http://rejasupotaro.github.io/2013/10/31/10.html
* https://github.com/spring-projects/aws-maven
* http://gradle.monochromeroad.com/docs/userguide/tutorial_this_and_that.html
* http://forums.gradle.org/gradle/topics/publish_to_amazon_s3
* http://wadahiro.hatenablog.com/entry/2012/07/24/234727
特定のディレクトリの一番最近更新されたファイルを取得する

『最近』という言葉は「最も近い」はずなのに、「最近」だけだと latest の意味にならない気がしたので『一番最近』にしておきました。日本語めんどくさい。

```
Dir.glob("*").max_by{|f| File.mtime(f) }
```

`max_by` は使いドコロが多そうですね。

### 参考

idioms - Ruby: Finding most recently modified file - Stack Overflow 
http://stackoverflow.com/questions/4823507/ruby-finding-most-recently-modified-file
スペースを含むファイル名を`find`コマンドを使って一括置換する

linux上でファイル名に空白文字が入ってると色々とめんどくさいことが多いので一括置換する方法を覚えておくと便利です。

```
$ find . -name "* *" | rename 's/ /-/g'
```

ただ、`rename`コマンドは Debian系列とRedhat系列で動作が全く異なりますので、ちゃんとやるなら `awk`とか`sed`を使ったほうが良いかもしれません。

### 参考

ファイル/ディレクトリ名に空白が入っているファイル/ディレクトリの空白を下線_に置換する1行コマンド
http://www.nemotos.net/?p=674
僕がRubyMineを使い始めたたった１つの理由

## 「command + クリックでRailsのコードにジャンプしてくれるから」

以上です。





## なぜRailsのコードにジャンプすると嬉しいのか
Railsのコードはコメントに使い方が書いている！
僕がRubyMineを使い始めたのは４年くらい前で、その頃はRails開発しだして数ヶ月くらい。
例えば link_to メソッドの引数には何が渡せるのかもよく分かってなかった。
でも**コード見れば使い方書いてたの！**

![ruby_mine.gif](https://www.dropbox.com/s/kzfmpdezs2gebhm/m8wgM6.gif?dl=1)


## 僕はRubyMineでRailsを覚えました。
これからRailsをやってみようと思う人。
Rails勉強してみたけど挫折してみた人。
RubyMineでRailsのコードにジャンプしながらRailsのメソッドの使い方を覚えるのが早いと思うよ！
Deploygateにgradleからアップロードする際に、メッセージをコンソールから指定する

[Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築](http://www.amazon.co.jp/dp/4798136433?tag=shikajiro-22)
を読んでたら、やっとgradleのプロジェクトに引数渡す方法が分かった。（gradleのヘルプ読め）

```groovy:build.gradle
deploygate {
    userName = "shikajiro"
    token = "hogehoge"

    apks {
        release {
            sourceFile = file("build/outputs/apk/app-release.apk")
            message = deploygateMsg
        }
        debug {
            sourceFile = file("build/outputs/apk/app-debug.apk")
            message = deploygateMsg
        }
    }
}
```
deploygateMsg を変数として扱う感じですね。ただ、これだけだとsyncとかbuildすると「deploygateMsgなんてねぇよ」エラーがでちゃう。とりあえずプロパティに空定義しておく。

```grooby:gradle.properties
deploygateMsg
```

あとはコマンドで実行。

```shell-session
./gradlew uploadDeployGate -PdeploygateMsg="ここにメッセージ"
```

動いた！
Sublimetext の Emacsプラグインで、インクリメンタルサーチ後の微妙な挙動の違いを修正する

Sublimetext3 + sublemacspro をたまに使っていますが、CTRL-sのインクリメンタルサーチ後に、CTRL-g,n,p,f,b などのキー操作を行うと、カーソルが移動しなかったり、CTRL-gにいたっては、カーソルが最初の検索位置に戻ってしまうっていう微妙に使いにくい挙動があったので、少しググってみたら、こんなんでましたという備忘録です。

https://github.com/grundprinzip/sublemacspro/issues/83

キーバインディングのファイルに以下のような定義を追加すると幸せになりそうです。CTRL-gが抜けているので、CTRL-fの行をコピペで、Gにすると使えそうな感じです。

```
{"keys": ["ctrl+f"], "command": "sbp_inc_search_escape", "args": {"next_cmd": "move", "next_args": {"by": "characters", "forward": true}},
    "context": [ {"key": "i_search_active"}, {"key": "panel_has_focus"} ]
},
{"keys": ["ctrl+b"], "command": "sbp_inc_search_escape", "args": {"next_cmd": "move", "next_args": {"by": "characters", "forward": false}},
    "context": [ {"key": "i_search_active"}, {"key": "panel_has_focus"} ]
},
{"keys": ["ctrl+n"], "command": "sbp_inc_search_escape", "args": {"next_cmd": "move", "next_args": {"by": "lines", "forward": true}},
    "context": [ {"key": "i_search_active"}, {"key": "panel_has_focus"} ]
},
{"keys": ["ctrl+p"], "command": "sbp_inc_search_escape", "args": {"next_cmd": "move", "next_args": {"by": "lines", "forward": false}},
    "context": [ {"key": "i_search_active"}, {"key": "panel_has_focus"} ]
},
```
iOS8のUITextView.textに特殊文字を入れてもクラッシュさせない方法？

今回問題になった顔文字。ちなみにそもそもiOS7とiOS8で文字の見え方が違う。
( •ॢ◡-ॢ)-♡

キーボードからの入力（コピペ含む）だとセーフ。
```setText:``` でセットしようとするとクラッシュした。

おそらくこちら([iOS8のUITextView.textに特殊文字を入れるとクラッシュする - Qiita](http://qiita.com/edo_m18/items/54b6d6f5f562df55ac9b))で検証されているのと同じ事象。

原因はわからないけど、こうするとクラッシュを回避できた。

```
NSString *text = @"( •ॢ◡-ॢ)-♡";

textView.text = nil;
[textView insertText:text];
```

(੭ु´͈ ᐜ `͈)੭ु⁾⁾ も大丈夫でした。
他の文字での検証はちゃんとやってないけどとりあえずこれで様子見。
HeadLookController+OculusでキャラクタとHMDの動きを連動させる

![hlc.png](https://qiita-image-store.s3.amazonaws.com/0/46096/e542190e-2cf7-a726-66b9-441764297b46.png)
　
　HeadLookControllerは、任意の場所を向くようにモデルのボーンを操作するものです。
　これを使うと、ゲーム中のキャラクタとHMDの動きを連動することもできます。

#1.HeadLookControllerをモデルに仕込む

　サンプルを参考にしてHeadLookControllerをモデルに仕込みます。
　次にモデルの頭部（今回はHeadボーンを使用）の下に新しくカメラ配置用のGameObject（以下CameraPosition）を作り、モデルの眉間あたりに位置を合わせておきます。カメラがモデルの内側にめり込まないように調整しましょう。

　![hlc.png](https://qiita-image-store.s3.amazonaws.com/0/46096/7f2a6dbf-329f-b7dd-fa59-ad32ea81279a.png)

#2.OVRCameraRigをモデルに仕込む

　OVRCameraRigを配置し、CenterEyeAnchorに視点制御用のGameObject（以下LookPoint）を配置します。
　LookPointにCursorHitスクリプトを追加し、HeadLook値に項1で追加したHeadLookControllerを設定します。

　![hlc.png](https://qiita-image-store.s3.amazonaws.com/0/46096/d11fcd19-55ee-a0f6-8b07-48fafdd11bf4.png)

　最後に、OVRCameraRigのPositionがCameraPositionと連動するようにします。

　![hlc.png](https://qiita-image-store.s3.amazonaws.com/0/46096/ba60fd08-7c1d-515a-d5e6-a5e6db10800c.png)

#3.動かしてみる

　空を仰ぐKyleさん

　![hlc.png](https://qiita-image-store.s3.amazonaws.com/0/46096/75b37be7-1b55-514d-0079-323681dc6283.png)

　右手をじっと見るKyleさん

　![hlc.png](https://qiita-image-store.s3.amazonaws.com/0/46096/6e83dd67-ef7e-8640-ceac-64e119a91678.png)

#4.最後に

　捻る動きが取れないのが難点です。
　HeadLookControllerの値を弄ることで、首だけでなく体全体を前屈みにしたり仰け反ったりさせることもできます。
JenkinsでTest-Kitchen複数台構成のCookbookをテストしたいが、ゴミは残したく無い時の実行シェル

[kitchen-dockerでコンテナ間を接続](http://qiita.com/Marcy/items/92a67bd67a62978131fa)し、Master - Slaveやクラスタ構成のテストができるようになったのですが、今度はそれをCIに乗せたい。

# いつもの

いつもは以下の感じで実行している。

```shell-session
bundle install --path=hoge
bundle exec kitchen test --destroy=always
```

…が、これだと１コンテナずつテストされて破棄されるため、接続先が無くなって２つ目で落ちる。

# 複数台用

以下にするとテストの成否に関わらず必ず```destroy```を走らせることができ、結果も正常に取れる。

```shell-session
bundle install --path=hoge
bundle exec kitchen test --destroy=never || RET=$?
bundle exec kitchen destroy
exit $RET
```
AndroidStudio完全アンインストールマニュアル

※ Android Studio 0.8.14時点での情報です。

ついに[AndroidStudio正式版がリリース](http://www.itmedia.co.jp/mobile/articles/1412/09/news059.html)しました。
EclipseからAndroidStudioに移行したり、AndroidStudioのアップグレードしたりする人がたくさんいると思いますが、いざやってみたらgradleビルドできなくなったりビルドして動かしてみたら落ちたりして「こんなはずじゃなかった。。。もうとりあえず元に戻したい。。。」みたいなことになる人もたぶん出てくると思うので、完全にアンインストールする方法を残します。

Eclipseの場合だと消してDLしなおせばいいだけなんですが、AndroidStudioは色んなところにキャッシュ持ってるせいで、ただappファイルを消して入れ直すだけだと不死鳥のごとくワークスペースやプロジェクトが復活することがあります。


##アンインストールするには、下記コマンドを実行

```
$ rm -Rf /Applications/Android\ Studio.app
$ rm -Rf ~/Library/Application\ Support/AndroidStudio*
$ rm -Rf ~/Library/Logs/AndroidStudio*
$ rm -Rf ~/Library/Caches/AndroidStudio*
```

##キーバインドなどの設定もすべて消す時はこれも実行

```
$ rm -Rf ~/Library/Preferences/AndroidStudio*
$ rm ~/Library/Preferences/com.google.android.studio.plist
```

##関連する全てのプロジェクトも消したい時はこれも実行

```
$ rm -Rf ~/AndroidStudioProjects
```

以上！
【Mac】ブックマークを素早く検索できるやつ作ったったwww

皆さん、Androidしてますか？
それともiOSしてますか？

どちらの開発をする上でも、必要なのがWebの調査。
せっかく調査してブックマークしたのにみつからないなんてありませんでしょうか？

そんなときはSpotlightの出番です！
でも、Chromeを使用していると、ブックマーク情報を検索してくれませんよね。
ご安心ください！
MacのChromeユーザーでSpotlightが使用できるようにしたものを作りました！

以下に全ソースを公開しています！
ソース汚くてすみません＞＜
https://github.com/developerwaiwai/BookmarkSpotlight

上のものをビルドして、Startup時に起動するようにすれば、
ChromeのブックマークをSpotlightで検索出来るようになります！

実際に私も使用していますので、おためしあれ〜！
「習慣」についての考察


# 習慣とは
脳が負荷を減らし、自動作業モードで行うこと
良い習慣もあるし、悪い習慣もある。

> 毎日の行動の、じつに40％以上が、「その場の決定」ではなく「習慣」だという
> "習慣の力" P.2

# 習慣がおきるメカニズム
* 脳が常に楽をしようとするから
* 脳はできるだけ介入を避け、決まった手順をなんでも習慣にしようとする
* ただし節約しすぎると危険を察知できなくなるおそれがあるので、脳の基底核は習慣にバトンタッチするタイミングを決めるシステムをつくりあげた。
* 一連の行動が始まるとき、あるいは終わるときに必ず起こることだ

# 「きっかけ」「ルーチン」「報酬」
習慣は、きっかけ、ルーチン、報酬の３つに分類される

> 脳の中で起こっているこのプロセスは、3段階のループだ。
> 第一段階は「きっかけ」で、これは脳に自動作業モードになるように、そしてどの習慣を使うかを伝える「引き金」である。
> 
> 次が「ルーチン（きっかけに反応して起こる慣例的な行動や思考）」で、これは身体的なものだったり、脳や感情に関わるものだったりする。
> 
> そして最後が「報酬」で、これはある具体的なループを、将来のために記憶に残すかどうか、脳が判断するために役立つ。
> 
> 時間が経つにつれ、この「きっかけ→ルーチン→報酬」というループは、どんどん無意識に起こるようになる。きっかけと報酬が相互につながると、強力な期待や欲求が生まれる。やがて、そこに一つの習慣が生まれる。

**きっかけ**
「ルーチン」となる行動・思考が起こるスイッチ。
その行動が起きるときに毎回あるもの

**ルーチン**
実際の行動・思考

**報酬**
行動・思考の結果、得られるもの。
身体的なものだったり、心理的・感情的なものだったりする。 

## 習慣の例
* ストレスを感じる　→　酒を飲む　→　感情が開放される・リラックスする
* 退屈になる　→　爪を噛む　→　指先に適度な刺激を得る

--
# 習慣を作り出す手法
1. きっかけ、ルーチン、報酬を設定する。
 - 起こしたい行動（ルーチン）によって得られる報酬と、それが行われるきっかけを設定する
2. きっかけと報酬をアピールしつつ、ルーチンをおすすめする
 - きっかけが起きたタイミングで、報酬が得られますよとルーチンを促す
3. 脳がその報酬を求めるようになって初めて習慣化する

## 習慣を作り出して成功した例
### ファブリーズ
「布から嫌なにおいを取り除こう」というキャッチフレーズで、単に消臭・除菌効果がありますよ。と訴えていたときは全然売れなかった。
そこでファブリーズを使う「きっかけ」と使ったことで得られる「報酬」と特定し、「生活のにおいを一新します」とキャッチフレーズも変更。
**掃除のあと**に、ファブリーズを使うことで **お部屋に快適な香り**が広がることを訴求して成功した。



# 習慣を変える手法
1. きっかけ、ルーチン、報酬を特定する。
 - 変えたい習慣（ルーチン）を引き起こす、きっかけ・報酬を特定する
2. きっかけ・報酬はそのままに、ルーチンを変えてみる
 - 変えたい習慣と同じ報酬を得られる、別の手段（新しいルーチン）を検討しきっかけが発生した際に、その新しいルーチンを促すように仕掛ける。
3. 仲間を見つける
 - 同じ境遇の仲間もしくは支援グループなど、習慣を変えられると自分が信じるのを助けてくれるコミュニティを活用することで、挫折せずに続けることができる。

## 習慣を変える例
* ストレスを感じる　→　酒を飲む　→　感情が開放される・リラックスする
 - 酒を飲まずに感情が開放される仕組みを作る。
* 退屈になる　→　爪を噛む　→　指先に適度な刺激を得る
 - 爪を噛む以外の方法で指先に刺激を得る方法を提示する

### アルコール依存症更生会の施策
> P.111
> AA（アルコール依存症更生会）のプログラムが効果的なのは、アルコールの習慣を助長させるきっかけと報酬を自分で突き止めさせ、その後、新しい行動を見つけるのを手助けするからだと専門家は言う。
> 
> P.112
> 次にAAはその人がアルコールからどんな「報酬」を得ているのかを自問させる。どんな欲求が習慣のループを動かしているのか。「酩酊状態」が答えとして出てこない場合も多い。通常、アルコール依存症患者が酒を求めるのは、逃避やリラックス、仲間との交流、不安の軽減、感情の解放の機会が得られるからだ。
> 
> P.113
> AAはアルコール依存症患者がバーで得るのと同じ報酬を与えるため、会合と仲間のシステムをつくり上げ、金曜の夜に酒を飲んで騒ぐのと同じだけの逃避と気晴らしとカタルシスを提供しようと努めている。安堵感が欲しければ、飲み仲間と乾杯するのではなく、支援者と話したり、グループの集まりに参加したりすることでそれが得られる。

# 参考文献
[習慣の力](http://www.amazon.co.jp/習慣の力-The-Power-Habit-チャールズ・デュヒッグ/dp/4062184451)
ActiveFormのクエリ文字列をプレーンにする

フォームモデルをオブジェクトとして扱うさい、ActiveForm は非常に便利なのですが、とくに工夫しないモデルをはめ込むと、このようにクエリパラメータにクラス名を含む形になってしまいます。

```
?EntrySearch[tag]=yii2&EntrySearch[title]=アドベント&EntrySearch[body]=カレンダー
```

POST であれば複雑なクエリ文字列でもかまわないのですが、検索フォームのように GET でリクエストしたい場合は URL が過剰に複雑になってしまいます。

上の `EntrySearch[]` を取り除くには、フォームモデルで `formName()` メソッドを定義します。

```php
class EntrySearch extends ...
{
    public function formName()
    {
        return '';
    }
}
```

これだけで、ActiveForm も `$model->load(...)` もそのまま何もしなくても、クエリ文字列は次のようになります。

```
?tag=yii2&title=アドベント&body=カレンダー
```

ただし、あくまで GET リクエストな検索用フォームのモデルのような、ユーザーから汚い文字列を隠したい場合に絞って使うのがよいでしょう。

フーム名を空にすると、型情報がなくなってしまいます。似たようなフィールドの別の型のモデルが送られてきたとき、`Model::load()` は型の違いを無視してフィールドに読み込んでしまいます。たとえば、もしモデルに `page` プロパティがあったら、ページャーが `page` を指定したときその値で上書きされてしまいます。

開発中どんなフォームになるか定まらないうちは指定せず、最後にやるかやらないか、やるとしても代わりの短い名前を使ったほうが良いのではないかを、慎重に選択しましょう。

もしかしたら、こんなクエリ文字列でも十分かもしれません。

```
?es[tag]=yii2&es[title]=アドベント&es[body]=カレンダー
```
Bootstrap3で簡単モーダル


```
<button class="btn btn-warning" data-toggle="modal" data-target="#myModal">モーダル</button>
```

```
<!-- モーダル部分 -->
<div id="myModal" class="modal fade">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
                <h4 class="modal-title">モーダルtitle</h4>
            </div>
            <div class="modal-body">

            	モーダル中身
               
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">閉じる</button>
            </div>
        </div>
    </div>
</div>
<!-- モーダル部分 -->
```
Ubuntuインストール後にホスト名を変更する方法と反映されるタイミングについて

メモ。SSHによるリモートログインが前提。

|   変更方法   | 反映タイミング |        コマンド例       |            期間            |
|:------------:|:--------------:|:-----------------------:|:--------------------------:|
| コマンド     | 即時           | $sudo hostname          | 暫定（OS再起動後に消える） |
| ファイル編集 | OS再起動後     | $sudo vim /etc/hostname | 恒久                       |

あと、設定後は、名前解決できるように`/etc/hosts`ループバックアドレスに設定したホスト名を記述しておきます。

※ネットワーク再起動後といった記述も見受けられますが、手元のUbuntu14.04ではOS再起動後に反映されていたようです。
テキストに応じて条件を分岐する


テーブルでセルのテキストに応じて、親trの背景色を変えたいと思ったときにちょっとハマったので、メモ。

## 良くない例
これではうまくいきませんでした。

```
$(function(){
	$('table td').each(function(){
		if($(this).text() === 'hoge'){
			$(this).parents('tr').addClass('hoge');
		}else {
			$(this).parents('tr').addClass('huge');
		}
	});
});
```


## どうしていけなかったのか？
文字は、"合っているか"ではなく、”含まれているか”で判定してやらないといけなかった。
` $(this).text() === 'hoge'  ` → `$(this).text().indexOf('hoge') != -1`


## こうしたらうまくいった。
```
$(function(){
	$('table td').each(function(){
		if($(this).text().indexOf('hoge') != -1){
			$(this).parents('tr').addClass('hoge');
		}else {
			$(this).parents('tr').addClass('huge');
		}
	});
});
```
Pryコンソールのプロンプトをカラフルかつ便利にする

## .pryrc

Rubyistの皆さんはもうすでに[Pry](http://pryrepl.org/)を使っていると思います。が、Pryの真の力は`~/.pryrc`をカスタムすることで発揮されます。ファイルがない人は作りましょう（5秒）。

```shell-session
touch ~/.pryrc
```

`~/.pryrc`の内容は、Pryのセッションが開始されるたびに実行されます。たくさんのことができますが、今回はプロンプトを改良することに絞ります。

## Pry.config.prompt

Pryのプロンプトの実体は`Pry.config.prompt`で、文字列または文字列を返す`Proc`オブジェクトを指定できます。プロンプトを動的に変更したい場合は`Proc`を使うのがいいでしょう。

ところで、Pryを使っていると、たまに今のRubyのバージョンがいくつか忘れてしまうことがありますね？まあ、`puts RUBY_VERSION`すればいいんですけど、どうせならプロンプトに表示しましょう。`pryrc`に以下を記述してください（コピペで5秒）。

```rb:pryrc
Pry.config.prompt = proc do |obj, nest_level, _pry_|
version = ''
version << "#{RUBY_VERSION}"

"#{version} #{Pry.config.prompt_name}(#{Pry.view_clip(obj)})> "
end
```

`pryrc`を保存したあとで`pry`コマンドを実行すると、プロンプトに実行中のRubyのバージョンが表示されると思います。

## 色を付ける

ここからが本題、プロンプトに色を付けてみましょう。せっかくなのでRubyの赤色にしてみます（確認含めて20秒）。

```rb:pryrc
Pry.config.color = true

Pry.config.prompt = proc do |obj, nest_level, _pry_|
version = ''
version << "\001\e[0;31m\002"
version << "#{RUBY_VERSION}"
version << "\001\e[0m\002"

"#{version} #{Pry.config.prompt_name}(#{Pry.view_clip(obj)})> "
end
```

どうでしょう、色は付いたでしょうか。大雑把に説明すると、`\001\e`や`\002`というのがエスケープ用のコード、`[0;31m`がANSIカラーコードです。

## Rails用のコード

RailsのコンソールをPryにしている人も多いでしょう。Railsプロジェクトを複数抱えている人の場合、よくバージョンの違いでつまずくことがありますが、そんな人はPryのコンソールにRailsのバージョンが表示されると助かるのではないでしょうか。`pryrc`を以下のように変更します（20秒）。

```rb:pryrc
Pry.config.color = true

Pry.config.prompt = proc do |obj, nest_level, _pry_|
version = ''
version << "Rails#{Rails.version}" if defined? Rails
version << "\001\e[0;31m\002"
version << "#{RUBY_VERSION}"
version << "\001\e[0m\002"

"#{version} #{Pry.config.prompt_name}(#{Pry.view_clip(obj)})> "
end
```

これで`rails c`を実行した際、Pryをコンソールで利用している人なら、プロンプトにRailsのバージョンが表示されたはずです。

## さらに改造

プロンプトの改良はさらに先に進めることもできます。例えば、2.0.0以前のRubyではパッチ番号が意味を持ちますのでそれを表示してもいいですし、Rubyのバージョンによってカラーコードを変更すれば文字で表示する必要はなくなるかもしれません。ほかにも動的な変更を加える余地は大きいはずです。

## 参考資料
http://traz.github.io/post/2013/Pry-prompt/
GAE Javaでカスタムエラーページを表示させたい

# システム構成

Java + Slim3 で GAE/Java のウェブアプリ開発中・・

どのコントローラーも対応しないルートにリクエストが行ってしまった場合、GAEのデフォルトのエラー404ページが出る。

## GAE & Javaでデフォルトのエラーページ

こんなん。↓
![gae_default_404.png](https://qiita-image-store.s3.amazonaws.com/0/5691/2868db6b-765e-95e7-bdf7-8dee9ee853b8.png)

さらっとしすぎでしょ・・
普通カスタマイズしますよね・・？

## Slim3コントローラーの話

Slim3ではデフォルトのルーティングルールではイヤな場合、```RouterImpl```を実装します。

例：
```
public class AppRouter extends RouterImpl {
    public AppRouter() {
        addRouting("/book/{key}/", "/book?key={key}");
    }
}
```

みたいな感じ。
マッチングさせたいルールを記述するんですが、そもそもURL間違えられた場合にはどのコントローラーも対応しません・・状態になります。

では先ほどのさらっとしたエラーページ、誰が出力してんねん？てなりますよね。

## さらっとしかエラー出力してくれないヤツ

犯人はログをみると出ています。

```
com.google.appengine.tools.development.LocalResourceFileServlet doGet
No file found for: /notexists/
```

この、LocalResourceFileServletさんがやってくれてるんですが・・
カスタマイズどうすんねん！

## 普通ならServletのweb.xmlですよね・・？

そう。Servletのエラーページと言えば、web.xmlの中で定義するのが定番。

```web.xml
<error-page>
    <error-code>404</error-code>
    <location>/error/notFound</location>
</error-page>
<error-page>
    <error-code>500</error-code>
    <location>/error</location>
</error-page>
```

GAEだって要はServletでしょ！と記述してみても、全く効かない・・・・
やっぱりさらっとした404ページしか出てくれません（涙）

### 困った時は公式ページ

英語ですが頑張って読みます。
[The Deployment Descriptor: web.xml - Java — Google Cloud Platform](https://cloud.google.com/appengine/docs/java/config/webxml#Error_Handlers)

がしかし、驚愕の事実が・・
```
Note: At present, you cannot configure custom error handlers for some error conditions. Specifically, you cannot customize the 404 response page when no servlet mapping is defined for a URL, the 403 quota error page, or the 500 server error page that appears after an App Engine internal error.
```

404ページのカスタマイズ・・対応してないって・・・マジで？？

## 公式よりあてになったstackoverflow

[How to implement a custom 404 error page on App Engine, Java? - Stack Overflow](http://stackoverflow.com/questions/13187970/how-to-implement-a-custom-404-error-page-on-app-engine-java)

ここの情報に救われた。
なんと、web.xmlに記述したエラーページが効かないのは、ローカル開発環境のみらしい。
試しにさっきのコードでデプロイしてみたら、ちゃんと動きました。。

## 結論

- GAE/Javaでエラーページをカスタマイズしたければ```web.xml```に普通のServletと同じくエラーページの記述を追加する
- ローカル開発環境では無視されるので、必ず本番環境にデプロイして動くことを確認

GAE、ローカルと本番で動き違いすぎ；；
0/0 と 0.0/0 は違います。

多分、後方互換性を持たせるためにこうなってると思うんですが

`0/0` と `0.0/0` はRubyにおいて違う表現になります。

前者は`ZeroDivisionError: divided by 0`を起こしますが、後者は`Float`として計算されるために`NaN`(Not a Number) になります。

```rb
[120] pry(main)> (0.0/0.0).nan?
=> true
```

な感じで`NaN`かどうかの確認もできます。

ちなみに

```rb
0.0/0 == Float::NAN
=> false
```

になります。私にはなんでかわかりませんが比較には`nan?`を使うと覚えておけば問題ないでしょう。
Macにて、認証鍵のpemとppkを相互変換する

MacでPuttyをインストールすることで、変換できる。

1. puttyのインストール
    2. Homebrewでインストール
    3. brew install putty

2. 鍵の変換コマンド
    3. pem to ppk
        4. puttygen aaaaa.pem -O private -o aaaaa.ppk
    5. ppk to pem
        6. puttygen aaaaa.ppk -O private-openssh -o aaaaa.pem
Ubuntu 14.04 で Pandoc を使った Markdown から pdf の生成

## 概要

Markdown から PDF を生成したい。
が、 Mac とかのドキュメントばかりで、 Ubuntu 14.04 で動かすには色々問題があったのでメモ。


## 手順

### インストール

```bash
sudo apt-get install texlive-luatex pandoc #必須
sudo apt-get install texlive-fonts-recommended texlive-fonts-extra # いるかも。
```

### myjsarticle.cls の作成

下記 URL 
http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?Pandoc#h2f8de68
を参照して、myjsarticle.cls を作る。

以下抜粋

```bash
$ cp `kpsewhich ltjsarticle.cls` .
$ patch -p0 < ltjsarticle.cls.patch
$ mv ltjsarticle.cls myltjsarticle.cls
$ sudo mktexlsr
```

### foo.md から foo.pdf を作る

```bash
pandoc foo.md -o foo.pdf -V documentclass=myltjsarticle --latex-engine=lualatex
```

### 閲覧

Google Chrome とか evince を使おう

### 残された課題

luatex のコンパイルなんか遅くないですか？気のせい？

おしまい。


参考資料
-------
* http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?Pandoc#h2f8de68
* http://mith009.hatenablog.com/entry/2013/11/18/025450
* http://qiita.com/mountcedar/items/e7603c2eb65661369c3b
PHPでの動画ダウンロード用ページ


```
<?php

//ダウンロードさせる元ファイルパス
$source = $_POST['source'];
//ダウンロードさせる元ファイル名
$filename = $_POST['filename'];
//ファイルのIDみたいの
$itemid = $_POST['itemid'];

//ダウンロードファイル名をファイルID＋元ファイル名
$j_file   = $itemid.'_'.$filename;
//必要であればエンコード
$j_file   = mb_convert_encoding($j_file, "SJIS", "EUC");

//HTTPヘッダ（コンテンツタイプ)
header("Content-Type: application/octet-stream");
//ダウンロードファイル名
header("Content-Disposition: attachment; filename=$j_file");
//ダウンロードファイルサイズ
header('Content-Length: ' . filesize($source));
//ファイルを読み込んで出力
readfile($source);
?>
```

###主なContent-Type
####文書系
テキスト文書		text/plain
CSVファイル		text/csv
PDF文書	application/pdf
HTML文	text/html
スタイルシート	text/css
JavaScriptファイル	text/javascript

####画像系
JPEG	image/jpeg
PNG		image/png
GIF	image/gif

####音声系
MP3　	audio/mpeg
MP4　	audio/mp4
WAV　audio/x-wav
MIDI　audio/midi


###Content-Typeは適切に指定するための参考リンク

####content-type一覧
http://www.atmarkit.co.jp/fnetwork/rensai/netpro03/content-type.html


####perl の CGI や PHP でよく出力する Content-type ヘッダ一覧 (MIME-type) | perl/CGI | 阿部辰也のブログ――人生はひまつぶし。
http://www.abe-tatsuya.com/web_prog/perl_cgi/mime_type.php
FactoryGirlのattributes_forがassociationを生成してくれない


## 前提
```ruby
# model
class Group
  has_many :users
end

class User
  belongs_to :group
  
  validates :group_id, presence: true
end

# factory
FactoryGirl.define do
  factory :user do
	sequence(:name) {|n| "user #{n}" } 
    group
  end
end
```

## 問題
```ruby
user_params = FactoryGirl.attributes_for(:user)
```
上記では、`user`の`group_id`が空になってハマりました。

## 原因

[FactoryGirl attributes_for](https://github.com/thoughtbot/factory_girl/blob/master/lib/factory_girl/strategy/attributes_for.rb#L5) を読むと、明らかに`association`を生成してない

## 対応

```ruby
user_params = FactoryGirl.build(:user).attributes
```

###  **注意**
`attributes`は`Model`のカラム（プロパティ）なら行けますが、メソッドは対象外です。

よって、`has_secure_password`機能を使っている場合は、上記だけでは、`password`と`password_confirmation`は空になってしまいます。

## 最終版

```ruby
user = FactoryGirl.build(:user)
user_params = user.attributes.merge(password: user.password, password_confirmation: user.password_confirmation)
```
mavenプロジェクトでjarを追加する

Mavenプロジェクトでダウンロードしてきたjarをインストールする方法をメモです。

refs: http://wiki.fdiary.net/maven2/?CookBook#l11 - サードパーティのJarをインストールする

# 対象

mavenで依存関係が定義されているプロジェクト
NetBeansの場合、「依存性」フォルダがあり、「ライブラリ」フォルダないもの

# 方法

1. jarをmavenのローカルリポジトリにインストールします。
   Windowsのgit bashの場合は以下の通りです。
   fileには絶対パスを指定します。
   groupId/artifactId/versionは任意ですが、jarの名前に合わせておきます。

```bash
mvn install:install-file -Dfile=/C/foo/guava-18.0.jar -DgroupId=com.google.guava -DartifactId=guava \
-Dversion=18.0 -Dpackaging=jar -DgeneratePom=true
```

2. プロジェクトのpom.xmlにリポジトリを指定します。
   プロジェクトの直下あるpom.xmlのdependenciesの中に、以下のように追加します。

```xml
<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>18.0</version>
</dependency>
```

これでプロジェクト内でjarのクラスを参照できるようになります。
MySQLのテーブルに登録済みの文字列をまとめていじる

MySQL上に誤って、

```
xxx, xxx
```
のような文字列が登録してしまい、これをまとめて

```
xxx
```
にしたいなということがありました。

こういう場合、下記のようなSQL一発で全部を置き換えることができます。

```mysql
UPDATE テーブル名 SET カラム名 = REPLACE(カラム名, カラム名, SUBSTRING_INDEX(カラム名, ',', 1))
```

SUBSTRING_INDEXで、文字列をカンマ区切りにし、その最初の要素だけを登録し直している感じです。
シンプルなプロビジョニングツールAnsibleを試してみる

YuZakuroです。

この記事は[Python Advent Calendar 2014](http://qiita.com/advent-calendar/2014/python)の9日目の記事です。

# 概要

## Ansibleとは

AnsibleというのはPythonで書かれたプロビジョニングツールです。有名なものに[Chef](https://www.chef.io/)がありますが、その仲間だと思ってもらえるとわかりやすいのではないでしょうか。

## なぜAnsibleを使うのか

Chefは非常に強力で、人気があり、それ故にドキュメントも豊富です。しかし、強力であるが故にわかりづらく、学習コストが高くなってしまいます。Chefは学習コストが高くて使いにくいツールだと言いたいわけではありません。Chefは非常に良いツールなのです。

対してAnsibleはChefほど強力ではありません。しかし、Chefよりもずっとシンプルで簡単です。

## Ansibleの良い所

- 非常にシンプルです。

- SSHを使用するため、管理されるサーバーにAnsibleをインストールする必要がありません

- 自作モジュールを作る際には、入出力フォーマットにさえ従えば好きな言語で作成できます。

# サンプル

Ansibleでは、Playbook(chefでのレシピのようなもの)をyamlを使用して以下のように書くことができます。

~~~yaml
- hosts: test-server
  sudo: yes
  tasks:
    - name: apacheのインストール
      yum: name=httpd state=installed

    - name: apacheを実行
      service: name=httpd state=running enabled=yes
~~~

# まとめ

世の中には高性能で便利なツールがたくさんありますが、その機能が全部いると必要なことはほとんどありません。

Chefは非常に良いツールですが、Ansibleでも十分な場合が多いとおもいます。ぜひ一度使ってみてください。

# 参考

- [構成管理ツール Ansible について - apatheia.info](http://apatheia.info/blog/2013/04/06/about-ansible/)

- [Ansible チュートリアル | Ansible Tutorial in Japanese](http://yteraoka.github.io/ansible-tutorial/)

- [chefからansibleに乗り換えた5つの理由 | TechRacho](http://techracho.bpsinc.jp/yamasita-taisuke/2014_05_29/17567)
BigQueryメモ書き

ただのメモ書き。
SQLのTipsなどなど。

#月初を出す。
 ★bigqueryが持っている関数で月初を出して、それ以上を求める。
`hogehoge >= TIMESTAMP(DATE(DATE_ADD(CURRENT_TIMESTAMP(),
-DAY(DATE_ADD(CURRENT_TIMESTAMP(),-1,"DAY")),"DAY")))`
　※DATEで変換（時間切り捨て）するSTRINGになる。不便。

★うちが持っているタイムスタンプを変換して=で繋げてみる。
　`YEAR(hogehoge) = YEAR(CURRENT_TIMESTAMP()) AND
　MONTH(hogehoge) = MONTH(CURRENT_TIMESTAMP())`
#日本時間
`DATE_ADD(CURRENT_TIMESTAMP(),+9,"HOUR")`
#同年同月比
`TIMESTAMP(DATE(DATE_ADD(DATE_ADD(CURRENT_TIMESTAMP(),-1,"YEAR"),-DAY(DATE_ADD(CURRENT_DATE(),-1,"DAY")),"DAY")))`
#年齢
BIRTHっていうカラムが生年月日。うるう年はどーしようか・・・。
`SELECT
  CASE WHEN DAYOFYEAR(CURRENT_DATE()) < DAYOFYEAR(BIRTH) THEN YEAR(CURRENT_DATE()) - YEAR(BIRTH) - 1
  ELSE YEAR(CURRENT_DATE()) - YEAR(BIRTH) END AS AGE
FROM [HOGEHOGE.HOGE]`

#Viewは便利だけど、ある程度にしよう。
Viewは便利なんだど、ある程度にしましょう。
バッチでテーブル作った方がいいよ。

#bigquery-public-dataの観測所を洗い出す。
http://googlecloudplatform-japan.blogspot.jp/2016/10/ghcn-bigquery.html?m=1
だいたい人が住んでるであろう日本の観測所を出してみる。
なんてことはないです。日本をすっぽり入れた緯度経度を入れただけです。
沖縄だけ飛んでいるのでUNIONしています。

`select *
from
(SELECT
  *
FROM
  [bigquery-public-data:ghcn_d.ghcnd_stations]
where
 latitude between 30 and 45 and
 longitude between 130 and 145),
(SELECT
  *
FROM
  [bigquery-public-data:ghcn_d.ghcnd_stations]
where
 latitude between 25 and 30 and
 longitude between 125 and 130)`

#クソな日付で来た場合の置換方法
acs_dateってところに`2017/01/01 15:15`というなんともならんtimestampが来たときの対処方法。

> update \`dataset.table_name\` 
> set acs_date_new = timestamp(PARSE_DATETIME("%Y/%m/%d %H:%M",acs_date))
> where true

#オープンデータメモ書き
| 何のデータ | 管轄してるところ | URL |
|:-----------------|:-----------------|:-----------------|
|国勢調査||http://www.e-stat.go.jp/SG1/estat/GL08020101.do?_toGL08020101_&tstatCode=000001080615|
MuleSoftのAnypointプラットフォームに於ける Salesforce インテグレーション

## Anypointプラットフォーム
[MuleSoft (ミュールソフト)](http://www.mulesoft.com/)の[Anypoint](https://www.mulesoft.com/platform/enterprise-integration)プラットフォームは、クラウドやオンプレミスか、すべての企業アプリケーションをSalesforceのに連携できます。Salesforceとの連携で顧客のライフサイクルを通じて完全なビューを提供します。リードジェネレーションから、商談管理、注文履歴、課金情報まで、すべての情報がSalesforce内部およびモバイルデバイスからアクセス可能です。

Anypointプラットフォームの利用は[CloudHub](http://www.mulesoft.com/platform/saas/cloudhub-ipaas-cloud-based-integration)というクラウドサービスだけでなく、[MuleESB](http://www.mulesoft.org/what-mule-esb)を通じてオンプレミスシステムも使用可能です。この二つサービスの開発環境が同一し、シームレスなハイブリッド連携ソリューションを提供でき、要望に応じてインテグレーションの実行場所を選択することができます。

![123.png](https://qiita-image-store.s3.amazonaws.com/0/60535/29d06bfd-5062-4acf-6e6d-dcc5fbb8e7d8.png)

## Salesforceをエンタープライズに統合
・Salesforceとバックオフィスシステムを接続することにより、すべてのアプリケーション、データとデバイスが統合されます。
・Salesforce1で重要なデータを統合により、モバイルデバイスからビジネスを加速します。
・同期された顧客体験を提供し、より多くのチャンスとつながり、顧客満足度を向上し、最終的には収益が増加します。

## MuleSoftで迅速に稼動
・ガートナー社のマジック･クアドラントにより、MuleSoftはエンタープライズ [iPaaS](http://www.mulesoft.com/resources/cloudhub/ipaas-integration-platform-as-a-service)（サービスとしてのインテグレーションプラットフォーム）とオンプレミスアプリケーションのインテグレーション分野のリーダーです。
・SSAE16、HiTrustおよびPCI準拠のクラウドサービスを提供します。
・Salesforce to Salesforce、SAP、Siebel、Workdayを含む幅広いデータベース接続を可能とする事前定義されたコネクターのポートフォリオを随時拡張しています。
・最も一般的なSalesforceの統合のユースケースを中心に構築された設定およびカスタマイズ可能なテンプレートは50〜70％の開発時間を短縮できます。


## バックオフィスのロックを解除する
すべてのアプリケーション、データとデバイスを接続します。

**ビジネスプロセスを自動化させる**
Salesforceとバックオフィスシステムの接続することにより、アプリケーションや部門全体が繋がって、取引先の情報が充実し、見積りから入金までのプロセス、入社退社プロセスなどのビジネスを自動化できます。

**必要なツールを全部提供する**
バックオフィス統合をサポートするためのテンプレート、コネクタや安全にクラウドからオンプレミスシステムに接続機能など、必要がある様々なツールを活用できます。

![スクリーンショット 2014-12-09 10.10.34.png](https://qiita-image-store.s3.amazonaws.com/0/60535/f1349b43-275f-e6cd-c6df-f54c7acc3f9b.png)


## モバイルからビジネスを実行する
いつでも、どこでもミッションにクリティカルなデータがアクセスできます。

**Salesforce1にの力を利用**
Salesforce1を通して安全にSAP、Siebelとより多くのシステムと連携してクリティカルなシステムのデータを入手できます、モバイル活用して生産性を上げる。

**革新的な新しいアプリケーションを提供**
Salesforce1プラットフォーム上にカスタムアプリケーションを構築することで複数のチャネルやデバイスで他のアプリケーションと連携します。いつでも、どこでも顧客や従業員にシームレスな体験を提供します。

![スクリーンショット 2014-12-09 10.11.06.png](https://qiita-image-store.s3.amazonaws.com/0/60535/feb4e496-1f21-f7e3-c54c-f5740a331625.png)


## 顧客情報の一貫性を確保
CRMシステムのバリューを拡張します。

**CRMをCRMに接続**
MicrosoftDynamicsまたはSiebelなどのCRMシステムからデータを統合、同期および移行できるだけでなく、企業全体で複数のSalesforceインスタンスを管理することもできます。

**顧客情報の一貫性**
リアルタイムでERP、レガシーCRMとeコマースのような顧客対応や顧客関連のアプリケーションとSalesforceを接続します。それによりすべてのアプリケーションと部門全体の顧客一貫性と信頼性を確実にします。

![スクリーンショット 2014-12-09 10.12.02.png](https://qiita-image-store.s3.amazonaws.com/0/60535/161ee5b7-bab9-0205-4975-cb726eebadb2.png)



##![スクリーンショット 2014-12-09 10.13.08.png](https://qiita-image-store.s3.amazonaws.com/0/60535/6f3f8972-28ee-3643-98ad-b74b82cad971.png)
MuleSoftのミッションはあらゆるアプリケーションとデータサービスまたはAPIベースで接続・連携させるために、最も幅広く利用されているインテグレーションプラットフォームを提供しています。MuleSoftはMasterCard, Nokia, NestleやHoneywellといった数千社にも及ぶ企業の本番環境でおり、また、Salesforce, Netsuite, Workday, IntuitやZuoraなどのSaaSのリーディングベンダーのインテグレーション機能もサポートしています。
CloudWatch Monitoring Scriptsを使ったメモリ使用量取得時の注意点

##Auto Scalingの基準にカスタムスクリプトのメモリ使用量を使う
Amazon CloudWatch Monitoring Scripts for Linux から得られる情報を使って、 Auto Scaling でインスタンスを増減させようと思ったときに、このスクリプトで取得できるメモリ量について少し考えてしまったのでメモを残す。

http://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-tech-amazon-cloudwatch-auto-scaling/14
http://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/DeveloperGuide/mon-scripts-perl.html


##空きメモリとは何か
下記で提供されているスクリプトのコード(mon-put-instance-data.pl)を読んでみると、メモリに関する情報は /proc/meminfo から取得していることがわかる。
また、 MemFree + Cached + Buffers の値が、 Memory Available になることがわかる。このことから、 Cached と Buffers にカウントされているキャッシュは、このスクリプトでは Available な領域と定義されていることがわかる。

http://aws.amazon.com/code/8720044071969977

```pl
  # meminfo values are in kilobytes
  my $mem_total = $meminfo{'MemTotal'} * KILO;
  my $mem_free = $meminfo{'MemFree'} * KILO;
  my $mem_cached = $meminfo{'Cached'} * KILO;
  my $mem_buffers = $meminfo{'Buffers'} * KILO;
  my $mem_avail = $mem_free;
  if (!defined($mem_used_incl_cache_buff)) {
     $mem_avail += $mem_cached + $mem_buffers;
  }
  my $mem_used = $mem_total - $mem_avail;
  my $swap_total = $meminfo{'SwapTotal'} * KILO;
  my $swap_free = $meminfo{'SwapFree'} * KILO;  
  my $swap_used = $swap_total - $swap_free;
  
  if ($report_mem_util) {
    my $mem_util = 0;
    $mem_util = 100 * $mem_used / $mem_total if ($mem_total > 0);
    add_metric('MemoryUtilization', 'Percent', $mem_util);
  }
  if ($report_mem_used) {
    add_metric('MemoryUsed', $mem_units, $mem_used / $mem_unit_div);
  }
  if ($report_mem_avail) {
    add_metric('MemoryAvailable', $mem_units, $mem_avail / $mem_unit_div);
  }

  if ($report_swap_util) {
    my $swap_util = 0;
    $swap_util = 100 * $swap_used / $swap_total if ($swap_total > 0);
    add_metric('SwapUtilization', 'Percent', $swap_util);
  }
  if ($report_swap_used) {
    add_metric('SwapUsed', $mem_units, $swap_used / $mem_unit_div);
  }
```

一方、Linux上で運用する dentry cache は上記の Cached + Buffers には含まれない。dentry cache が増えていくと、MemFreeが減っていくのだが、このスクリプトからはそれを知ることができない。Memory Available が減っていても dentry cache が適切に利用されていない場合では、この値を基準にしたAuto Scalingによるインスタンス増減が本当に問題がないか考える必要がある。たとえば下記のような意図しない negative dentry 増大化が発生した場合、このカスタムメトリクスから取得できるMemory Availableでは適切にインスタンスを増減させることができない。

http://qiita.com/kentaost/items/a2e882d2978fba9e17d3

メモリ使用量については、どのように算出されているものか確認してみると良い。
WinSCPから起動されたPuttyの色をいい感じにする

# 今北産業

1. [putty-colors-solarized](https://github.com/altercation/solarized/tree/master/putty-colors-solarized)から好みのレジストリファイルを持ってくる。
2. エディタで開いてキー名を_[HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\WinSCP%20temporary%20session]_に変更する。
3. ダブルクリックで取り込む。
4. 楽しい！！✌(′ω′ )三✌(′ω′)✌三✌( ′ω′)✌

四行だった。

## 余談

* [GDI](http://ice.hotmint.com/putty/)版でも動いているので、大体のビルドでは動くんだと思う。
* putty.iniファイルがあるとWinSCPとの連携がうまく動かないようだ。接続先ホスト名を入力する画面が表示されてしまう。
* フォント等設定変更を行った後はWinSCP temporary sessionかDefault Settingsを選択した上で保存を押しておかないと消えてしまう。
* ini <-> レジストリの設定移行方法が知りたい（無い気がする）
初めてのPHPUnit

phpunitのインストールと、動作確認を兼ねたテストコードを実行してみるよ。

## インストールの手順

### ダウンロード
まずは、PHPUnitをインストールするところから始めよう。
PHPUnitは
```
https://phar.phpunit.de/phpunit.phar
```
から入手することが出来る。
お好きな方法でダウンロードしてこよう。

### インストール
ダウンロードしたPHPUnitは、そのままでも使うことができるけど、
頻繁に実行することを考えるとパスが通っているところに置いたほうが便利だよね。
今回は/usr/local/binに置くことにしたよ。

```
// 実行環境はUbuntuです
cd /usr/local/bin
wget https://phar.phpunit.de/phpunit.phar
```

.pharを取り除くよ。

```
mv phpunit.phar phpunit
```

こうすれば、どのディレクトリに居てもPHPUnitを実行することが出来るね。
では、適当なディレクトリで

```
phpunit --version
```

を実行してみよう。
Sebastian Bergmannさんの名前が表示されたらOKだ。

```
PHPUnit 4.4.0 by Sebastian Bergmann.
```

## 初めてのテスト
さて、無事にphpunitのインストールが出来たら、さっそくテストコードを書いてみよう。

### テストを実行するクラスを記述する
PHPUnitのテストコードは、テストを実行するクラスを書いていくスタイルだ。
この時、PHPUnit_Framework_TestCaseというクラスを継承することでテストを実行するクラスを定義することが出来るんだ。

クラス名は "テスト対象のクラス名 + Test"
メソッド名は、"test + テストしたいこと"
みたいに書いていくと良いらしいよ。
(ファイル名は自由？)

```php
class FooTest extends PHPUnit_Framework_TestCase
{
    public function testEqual()
    {
        // 第1引数には期待される値
        // 第2引数には、テスト対象のメソッドを記述
        $this->assertEquals(0, 0);
    }
}
```

### 実行してみよう
作成したテストコードを動かしてみよう。

```
phpunit foo_test.php
```

こんな感じに結果が出力されればOKだ。

```
PHPUnit 4.4.0 by Sebastian Bergmann.

.

Time: 49 ms, Memory: 1.75Mb

OK (1 test, 1 assertion)
```
PostgreSQLのpg_dumpコマンドで特定のテーブルのバックアップ(ダンプ)を行う

postgresに付属するpg_dumpツールを利用したテーブルデータのバックアップ(ダンプ)方法についてご紹介します。postgresのバージョンは8.3.7です。

**データベース所有者に変更**
`su - [データベース所有者]`
**ダンプ先のフォルダに移動**
`cd /tmp`
**db_nameデータベースのtable_nameテーブルのすべてデータ(スキーマ&データ)をダンプ**
`pg_dump -t table_name db_name > table_name.sql`
**スキーマのみをダンプ**
`pg_dump -s -t table_name2 db_name > table_name2.sql`


**参考**
PostgreSQL 8.3.7文書 pg_dump
http://www.postgresql.jp/document/8.3/html/app-pgdump.html
PostgreSQLのバックアップ＆リストア手法その1
http://www.atmarkit.co.jp/ait/articles/0810/24/news135_2.html

以上
Ubuntu14.04　Chromeのタッチスクリーンスクロールを有効にする方法

#タッチスクリーンのIDを調べる
```shell-session
$ xinput list
```
我が家のVAIO Pro11ではこんな感じ

```shell-session
$ xinput list
⎡ Virtual core pointer                    	id=2	[master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer              	id=4	[slave  pointer  (2)]
⎜   ↳ eGalax Inc. eGalaxTouch EXC7910-1032-11.00.00	id=9	[slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad              	id=12	[slave  pointer  (2)]
⎣ Virtual core keyboard                   	id=3	[master keyboard (2)]
    ↳ Virtual core XTEST keyboard             	id=5	[slave  keyboard (3)]
    ↳ Video Bus                               	id=6	[slave  keyboard (3)]
    ↳ Sony Vaio Keys                          	id=7	[slave  keyboard (3)]
    ↳ Power Button                            	id=8	[slave  keyboard (3)]
    ↳ USB 2.0 Camera                          	id=10	[slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard            	id=11	[slave  keyboard (3)]
```


この子のタッチスクリーンは eGalax Inc. eGalaxTouch EXC7910-1032-11.00.00ome	id=9

#ChromeにタッチスクリーンIDを渡す
chromeの引数に--touch-devicesを加える

```shell-session
/usr/bin/google-chrome-stable --touch-devices=9
```

あとは適当にスクリプトでも作ってどうぞ

追記
デフォルト値が環境変数で上書きされたとか出てるので、もっとスマートな方法があるかも
imgタグでエラー時の画像をonerror属性で設定する方法

onerror属性はjavascriptでも書くことができますが、今回はimgタグに直接うめこんでしまうことで1行でスマートにエラー時用の画像も含めてimgタグを実装します。

こんなかんじです

```html
<img src="表示したい画像のurl" onerror="this.src='エラー時に表示したい画像のurl';" />
```
例です

入れたい画像の正しいurl:
http://yutarotanaka.com/blog/wp-content/uploads/2014/08/logo-square-ed574fbb8006572197b178cd7f9ad00c.png
<img width="100" height="100" src="http://yutarotanaka.com/blog/wp-content/uploads/2014/08/logo-square-ed574fbb8006572197b178cd7f9ad00c.png"  />

入れたい画像の正しくないurl:
http://yutarotanaka.com/blog/wp-content/uploads/2014/08/logo-square-ed574fbb8006572197b178.png

エラー時に表示させたい画像のurl:
http://smooch.jp/html/noimage.jpg
<img width="100" height="100" src="http://smooch.jp/html/noimage.jpg" />

とします。
では実際にやってみましょう。

正しいurlの場合:

```html
<img width="100" height="100" src="http://yutarotanaka.com/blog/wp-content/uploads/2014/08/logo-square-ed574fbb8006572197b178cd7f9ad00c.png" onerror="this.src='http://smooch.jp/html/noimage.jpg';" />
```
<img width="100" height="100" src="http://yutarotanaka.com/blog/wp-content/uploads/2014/08/logo-square-ed574fbb8006572197b178cd7f9ad00c.png" onerror="this.src='http://smooch.jp/html/noimage.jpg';" />

正しくないurlの場合:

```html
<img width="100" height="100" src="http://yutarotanaka.com/blog/wp-content/uploads/2014/08/logo-square-ed574fbb8006572197b178.png" onerror="this.src='http://smooch.jp/html/noimage.jpg';" />
```
<img width="100" height="100" src="http://yutarotanaka.com/blog/wp-content/uploads/2014/08/logo-square-ed574fbb8006572197b178.png" onerror="this.src='http://smooch.jp/html/noimage.jpg';" />

。。。今回はサイトの性質上onerrorが動かないようですが、通常のブラウザであれば正常に動作はできると思います。
AndroidStudio 1.0へアップデートした際にやったこと

既存アプリがエラーでたので、下記の内容編集で対応した。

# app/build.gradeの編集
http://d.hatena.ne.jp/paraches/20141128/1417154420 を参考に

```java:app/build.grade
    buildTypes {
        release {
-           runProguard false
-           proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

+           minifyEnabled false
+           proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
```

# build.gradeの編集

```java:build.grade
 dependencies {
-        classpath 'com.android.tools.build:gradle:0.8.+'
+        classpath 'com.android.tools.build:gradle:1.0.0'
 }
```

# gradle-wrapper.propertiesの編集

```gradle/wrapper/gradle-wrapper.properties
-distributionUrl=http\://services.gradle.org/distributions/gradle-1.11-all.zip
+distributionUrl=http\://services.gradle.org/distributions/gradle-2.2.1-all.zip
```
Sails.js でファイルの変更を自動検知してサーバを再起動する

人生初の Advent Calendar 投稿です。マサカリ耐性は低めなので、ツッコミはやさしくお願いします。

## Sails での開発は確認のために毎回サーバを再起動する必要がある

[Sails.js](http://sailsjs.org/) に限ったことではないのでしょうが、Node.js 系の開発では Rails の Development モードのようにファイルの変更が即座に反映されません。Sails は View だけは変更が反映されるようですが、Controller や Model はファイルを変更してもサーバを再起動しない限り、変更は反映されません。

[SailsCasts](http://irlnathan.github.io/sailscasts/) を見ていても、変更を加えるたびに手動でサーバを再起動していて、非常にめんどくさそう。

そこで、ファイルの変更を自動検知してサーバを再起動してくれるようにすれば、変更後に即座とは言えないまでも数秒待てば確認できるようになるので、少しは楽になります。


## PM2 を使おう

[PM2](https://github.com/Unitech/pm2) は Node のプロセスマネージャーで、アプリケーションサーバをデーモン化、落ちてもすぐ再起動するようにしたり、モニタリングを簡単にできるようにしたり、はたまたロードバランシングまでやってくれる高機能なパッケージです。

本番環境で使うことが多いこの [PM2](https://github.com/Unitech/pm2) ですが、ファイルの変更を検知してサーバを再起動してくれるオプションがあるので、それを開発環境で使わせてもらおうというのが今回の趣旨となります。

PM2 は NPM パッケージなので、インストールは

```bash
$ npm install -g pm2
```

とするだけ。

## 使い方

```bash
$ pm2 start app.js --watch
```

をアプリのルートディレクトリで実行してみたのですが、なぜかサーバが延々と再起動を繰り返してしまったため、このやり方は×。

設定の JSON ファイルを用意することで、特定のディレクトリやファイルだけを watch してくれるようになるそうなので、今回はその方法をとります。
`config/pm2/development.json` というファイルを作成して、その中身を以下のように設定。

```json
{
  "apps": [{
    "name"    : "sample_app",
    "script"  : "app.js",
    "watch"   : ["api", "config"],
    "env": {
      "NODE_ENV": "development",
      "PORT"    : 1337
    }
  }]
}
```

これで、以下のコマンドで起動すれば、`api/` `config/` ディレクトリの変更を感知してサーバが再起動され、変更が反映されます。

```bash
$ pm2 start config/pm2/development.json
```

ちなみに `views` ディレクトリを `watch` に含めると、サーバが再起動を繰り返すので、先の犯人はこれだった様子。View ファイルはサーバを再起動しなくても変更が反映されるので、`watch` に入れる必要はありません。

標準出力にログを表示するには、

```bash
$ pm2 logs
```

サーバを終了するには、

```bash
$ pm2 kill
```

を実行します。それ以外の PM2 の詳しい使い方は[こちら](https://github.com/Unitech/PM2/blob/development/ADVANCED_README.md)から。
レガシーASPのJSON入出力用ライブラリ "ASPJSON"のメモ

レガシーASPで毎度JSON出力する関数書くのだるい→ライブラリあったやったぜ。
http://www.aspjson.com/


簡単にメモ。随時追記予定。

###パブリックな変数

|変数|用途|
|:--|:--|
|data|Dictionaryオブジェクトで初期化されたPublic変数。JSONデータの格納に使う|

###パブリックな関数
|メソッド名|種類|引数|返り値|使途|
|:--|:--|:--|:--|:--|
|loadJSON|Sub|JSON文字列（inputsource）|なし|JSONデシリアライズ|
|JSONoutput|Function|なし|JSONオブジェクト文字列|JSONシリアライズ|
|Collection|Function|なし|初期化されたDictionaryオブジェクト|dataに値を追加するときに利用。記述量が減らせるだけ。|
|AddToCollection|Function|Dictionaryオブジェクト(dictobj)|dictobj.countキーを追加したdictobj(dictobj.count)|よくわからない|



###仕様

* 全てのデータはDictionaryオブジェクトで管理される
* dataをrootとして、Dictionaryオブジェクトを追加していく形で入れ子を表現する
* Dictionaryオブジェクトのキーに文字列がある場合、そのDictionaryオブジェクトはJavaScriptオブジェクトとして出力
* Dictionaryオブジェクトのキーが全て整数の場合、そのDictionaryオブジェクトはJavaScript配列として出力
* 全ての出力されるJSONデータの出力順は、Dictionaryオブジェクトへのデータの挿入順となる。__配列出力であってもキーの整数値順とはならない__


###疑問
AddToCollectionの使い道。
引数の元オブジェクトも変更されるし謎。

###追記
AddToCollectionについて

####コード
```
Dim a
Set a = New aspJSON
a.AddToCollection(a.data)
a.data(a.data.count-1) = "hoge"
Response.Write a.JSONoutput()

```

####出力
```
[ "hoge" ]

```

こんな感じで配列のPushみたいなノリで使えばいいのかな。
どうせなら挿入する値も引数にセットできればいいのに感はある。
あとキーの取り方が(ディクショナリー).count-1するしかなさそうなのもうーん。
Android SDK : Windows (x86) で SDK Manager が起動しない問題の対処

現時点で最新版の Android SDK (r24) には、Windows (x86) 環境で SDK Manager が正常起動しないというバグがあります。

暫定対処ですが、android-sdk-windows\tools\lib\find_java.bat の27行目を以下のように修正すると起動できるようになります。(arch_ext=32 の後のスペースを抜く)

    誤: find /i "x86" > NUL && set arch_ext=32 || set arch_ext=64
    正: find /i "x86" > NUL && set arch_ext=32|| set arch_ext=64
セキュアでないDocker Repositoryにアクセスできない


Docker 1.3+ではHTTPしかサポートしてない、もしくはちゃんとした証明書がついていないHTTPSのRepositoryにアクセスすると、エラーが出るようになりました。エラーメッセージに対応方法が書いてある通り、Dockerデーモンの起動時に--insecure-registryを渡してあげるといいみたいです。

## Boot2Docker
profileにEXTRA_ARGSを足すとデーモン起動時に渡してもらえます。

```/var/lib/boot2docker/profile
EXTRA_ARGS="--insecure-registry <YOUR INSECURE HOST>"
```

## Fig
Figでは上記の対応に加えてpull, run, upコマンドに--allow-insecure-sslオプションを渡します。
AngularJSもいいけどVue.jsもね!!


Vue.jsアドベントカレンダーの記事です。

世間ではAngularが大人気ですが、一方で根強い人気を持っているのがVue.js

両方使ってみて、行ったり戻ったりするうちに、イイトコとワルイトコがわかってきたのでまとめてみました。

## 学習コストが少なめ

AngularJSに比べて学習コストも詰まりポイントもだいぶ少なめです。

アプリケーションモジュールを作成して、コントローラを生やし、`ng-controller`でバインドする...という手順を踏むAngularJSに比べ、
バインドしたいデータやメソドと、対象のセレクタをコンストラクタに渡してオブジェクトを生成するだけ、のVue.jsは手続き的にも簡単な印象です。


## VMの中身が綺麗に整理されている

Vue.jsのVM(AngularのControllerのようなもの)では、データとメソドを差し込む空間が分離されています。
全て`$scope`変数の中で解決してしまうAngularとくらべて、コードがカオスになりにくいという利点があります。

```javascript:vuejs
vue = new Vue({
	data: {/* some data */},
	methods:{/*some methods */}
	computed:{/* getter/setter for data */}
	....
});
```

バインドしたいオブジェクトである`data`や、ボタン等から呼び出したい処理の`methods`に加え、データの値などを加工して取得/更新できる`computed`も用意されており、全てテンプレート内から`{{ひげ記法}}`で呼び出し/バインドすることができます。

## 今風の開発フローへの対応が豊富

`components`や`browserify`、`webpack`など今風のフロント開発の手法を積極的に取り込んでおり、
開発サンプルも公式で用意されています。

https://github.com/vuejs/vue-browserify-example
https://github.com/vuejs/vue-webpack-example

(componentsの対応は0.10までとなった模様ですよ…)

アプリケーションのコードを機能毎に分割し、フロントではまとめてコンパイルしたコードを利用するという手法がとれるため、開くのがうんざりするような長いコードを作る必要がなくなります。
特に`Coffeescript`などのAltJSを採用する場合、可読性は重要な問題になってきますが、機能毎に小規模なファイルに分割できるなら安心だと思います。

`browserify`や`webpack`を利用する上では、面倒なwrapperを用意しなくても依存性の少ないオブジェクトとして機能を書いていく事が可能なため、
開発の副産物としてのコード資産も生み出す余地が生まれてきます。


## 他ライブラリとの連携が容易

元々Vue.jsは、他ライブラリとの連携を前提に作られているようです。
ルーティングにはngRoute、AjaxにはngResourceなどのサブライブリを用意してくれているAngularJSと異なり、
自分でライブラリを選択する必要が出てくる手間は否めませんが、
要件毎に必要な機能を採択できるのは嬉しい所だと思います。

実装していく上で「詰み」が生じた時にも気軽に別のライブラリを探しに行けるという精神的な楽さも評価したいです。

## Vue.jsの欠点

Vue.jsの欠点はなんと言っても大規模アプリケーションの構築にあると思います。

他ライブラリとの連携を前提とした構築で自由度が高過ぎる分、「アプリケーション」のレベルまで組み上げる頃には「オレオレVue.js開発スタイル」が組み上がってしまいます。

特にAngularでいうところのServiceの概念が内包されていないのが致命的で、

- モジュール化してrequireで対応する
- rootのVMに持たせて、`$root`で参照する
- vue.jsのラッパーを作って、getter/setterを用意する

などの方法を考えてみましたがどれもイマイチな雰囲気でした。

とはいえやはりとっつきやすさ、開発の楽しさではVue.jsに軍配があがるので、
AngularJSが理解しづらい…といって挫折していた人などは是非Vue.jsを試してみるといいと思います。

## 結局どちらを使うべきか

PHPアプリケーション等、サーバサイドを軸に動くアプリケーションに簡単なフロントのギミックを加えたい、程度の場合には圧倒的にVue.jsが楽だと思います。

Vue.jsと`$.ajax`で基本的なAjax通信からの画面制御程度は簡単に捌けますし、記述量の面でもVue.jsで組むほうが楽です。

個人的な切り分けとしては、複数のVMを用意してルーティングを加えて…の規模になってくるとAngularの採用を検討する方が楽だなぁと思っています。

Routingオブジェクトをどこに置くかとか複数VM間でのオブジェクト共有/バインディングをどうするか…みたいなベストプラクティスが出てきたらVue.jsでの大規模アプリケーション構築もありかもしれません。
AngularJSのscriptを一つにまとめる


AngularJS AdventCalendar 9日目のあれです。

## AngularJSのscriptを一つにまとめる

AngularJSを書いているとどうしてもscriptタグの羅列が増えてくる傾向にあります。
個人的にはあれが非常に気になってしまうので、なんとかひとつのファイルにまとめたいわけです。

例えばAngularJSのサンプルアプリ、[Angular phonecat](https://docs.angularjs.org/tutorial)の場合、

```html:
  <script src="bower_components/jquery/jquery.js"></script>
  <script src="bower_components/angular/angular.js"></script>
  <script src="bower_components/angular-animate/angular-animate.js"></script>
  <script src="bower_components/angular-route/angular-route.js"></script>
  <script src="bower_components/angular-resource/angular-resource.js"></script>
  <script src="js/app.js"></script>
  <script src="js/animations.js"></script>
  <script src="js/controllers.js"></script>
  <script src="js/filters.js"></script>
  <script src="js/services.js"></script>
```

これを何とか一つのJSファイルにまとめるのが今回の目標です。
あとついでにCoffeeスクリプトもつかいたい。

ということで、サンプルコードを[こちら](https://github.com/mikakane/angular-phonecat.git)に用意しました。


## browserifyを使う

```
git clone https://github.com/mikakane/angular-phonecat.git
cd angular-phonecat
git checkout browserify
npm init
npm start
```

自動的にサーバが立ち上がるので、http://localhost:8000/app にアクセスすれば動きます。

中身としては、既存のjsファイルを`coffee`ディレクトリにCoffeescriptファイルで書きなおして、
package.jsonにビルド設定を書き足しただけです。

masterブランチがfork元になっているため、masterとbrowserifyブランチとの比較で差分を確認する事ができます。

AngularJSの場合、グローバル変数の`angular`にモジュールをねじ込んでいくスタイルなので、
CommonJS的なモジュールの書き方をしなくても行けるっぽいです。

```
angular = require("angular") # NG angular 変数が消える
require("angular") # これでOK
```

ブラウザでコードを確認すると、JSファイルの読み込みがbundle.jsにまとめられているのが確認できると思います。

## webpackを使う

一応webpack版も用意してあります。

```
git clone https://github.com/mikakane/angular-phonecat.git
cd angular-phonecat
git checkout webpack
npm init
npm start
```

中身は殆どbrowserifyブランチと同じで、`package.json`の記述と`webpack.config`の記載が追加されています。
htmlファイルとcoffeescriptファイルは

こうしてみるとやっぱりコンパイル設定とかを`webpack.config`にまとめられるwebpackの方が便利そうですね。

## まとめ

やってみてから気づいたんですけど、多分Angular的な書き方だと、普通に結合するだけでも行ける気がします。
まぁでも`browserify`や`webpack`などのビルドシステムを使っていれば、開発版のトレース付きコードと、商用のminifiedコードをワンソースで切り分ける事もできますし、
`require`でnodeモジュールを援用できたりと、何かと便利だと思います。

実際に開発する中ではcontrollerなどのファイルが膨らんでくるので、
個々のControllerを`angular`変数に依存しない形でモジュール化してしまうと、
モジュールテストも行えるようになって便利なんじゃないかなぁ…とか。

あ、ちなみに全部のng-系モジュールがwebpackとかbrowserifyに対応しているわけではないのでangular系のライブラリを多用するケースではお気をつけ下さい。
Android LollipopでButtonのTextが大文字(textAllCaps)なるの、仕様です

自分のアプリをLollipopが入った端末で見た時、ある違いに気づきませんでしたか？
そう、ボタンの文字が英文字の時は大文字になっているんです。
ioschedのアプリで見てみると、こんな感じ。

###Lollipop
![スクリーンショット 2014-12-09 11.40.12.png](https://qiita-image-store.s3.amazonaws.com/0/39433/f6bdddb3-1762-b60e-3b25-512af7b529db.png)


###4系
![スクリーンショット 2014-12-09 12.14.10.png](https://qiita-image-store.s3.amazonaws.com/0/39433/1add9ee4-b176-1062-7353-8936447e12f9.png)

##対応
[マテリアルデザインガイド](http://www.google.com/design/spec/components/buttons.html#)には明確に記述されていないのですが,英文字ボタンは全て大文字になっています。これは仕様のようです。

API 21のButtonのデザインをたどるとstyleで大文字(textAllCaps)が設定されています。

```xml:/sdk/platforms/android-21/data/res/values/styles_material.xml
    <style name="TextAppearance.Material.Button">
        <item name="textSize">@dimen/text_size_button_material</item>
        <item name="fontFamily">@string/font_family_button_material</item>
        <item name="textAllCaps">true</item>
        <item name="textColor">?attr/textColorPrimary</item>
    </style>
    
```

なので、もし英文字を使ったボタンを小文字にしたいという要件がある場合、

* style.xmlでButtonのスタイルを定義してあげる
* ButtonをaddViewのようにプログラム上で生成する際はデフォルト(styles_material.xml)が適用されてしまうようなので、意図的にsetAllCapsを指定してあげる

```java:button
Button button = new Button(this.getActivity());
button.setText(test.getLabel());
button.setAllCaps(false);
layout.addView(button);
```

などの対応が必要そうです。