OmniAICreator/Qiita-1.07M huggingface dataset:
AWS Lambda にパラメータを渡す方法を思いついた！

## Update
2016/11/18 Lambda で環境変数が使えるようになりました。
https://aws.amazon.com/jp/blogs/aws/new-for-aws-lambda-environment-variables-and-serverless-application-model/

--------
## 概要
AWS Lambda は超便利ですね！
しかし、「環境変数が無い」といった声をよく聞きます。
(アップロードしたコードは変更せずに)パラメータとして変更したい場合は、確かにありますよね。
S3に環境変数ファイルを置いておく手法もよく見受けられますが、そのファイル名は結局、埋め込みが必要なんですよね。

## 解決案
Configration の Description で、設定を渡せばいいんじゃない！
(その際、さすがに自分自身(Lambda関数)のarnは、ハードコードでもいいだろう。)

## 例

例えば、ホスト名をパラメータで渡して、データをPOSTする場合を考えます。

#### Lambda 関数
```js

"use strict";

var AWS = require("aws-sdk");
var lambda = new AWS.Lambda();
var http = require('https');

// 自分自身(Lambda関数)のarnを指定する
var name = "arn:aws:lambda:ap-northeast-1:521180000000:function:test";

exports.handler = function (event, context) {

  // 自分自身の設定を取得する
  var option = {FunctionName: name};
  lambda.getFunctionConfiguration(option, function (err, data) {

    console.log("ERROR: " + JSON.stringify(err));
    console.log("PARAMS: " + data.Description);

    // Description を JSON にパース
    var params = JSON.parse(data.Description);

    var postData = {
      text: "Hello World!"
    };
    postData = JSON.stringify(postData);

    var options = {
      hostname: params.hostname,   // ここのホスト名をパラメータで渡したい
      path: "/postpath",
      headers: {
        "Content-Length": postData.length,
        "Content-Type": "application/json"
      }
    };

    var req = http.request(options, function (res) {
      console.log("STATUS: " + res.statusCode);
      res.setEncoding("utf8");
      res.on("end", function () {
        console.log("No more data in response.");
        context.done(null, "No more data in response.");
      })
    });

    req.on("error", function (e) {
      console.log("problem with request: " + e.message);
      context.done(e, "problem with request: " + e.message);
    });

    req.write(postData);
    req.end();
  });

};
```

#### パラメータ設定
Configuration の Description に、以下のようにパラメータとなる JSON を記載します。

```json
{"hostname":"hogehoge.com"}
```


![スクリーンショット_2015-12-02_18_15_12.png](https://qiita-image-store.s3.amazonaws.com/0/69410/8eb8119d-7921-3767-04b0-28a2eb4c7863.png)

#### Role 設定
自分自身の設定が取得できるように、Role は適切に設定してください。
こんな感じ。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "lambda:getFunctionConfiguration"
            ],
            "Resource": "arn:aws:lambda:*:*:*"
        }
    ]
}
```

## まとめ
 - AWS Lambda 関数に、簡易にパラメータを渡す方法を試しました。
 - 環境変数の要望は多いようなので、そのうち、実現されるかもしれません。
XAMPPで任意のディレクトリをバーチャルホストにする方法

久々にXAMPPをいじったら構築に手間取ったのでメモ．

#やりたいこと
デフォルトでは，XAMPPのバーチャルホスト（localhost）のパスは，Cドライブ直下にインストールした場合`C:\xampp\htdocs`となっているが，
`C:\Users\Documents\test`などの任意のパスもバーチャルホストにしたい．


#環境
Windows 8
XAMPP 5.6.14


#手順
##手順1. フォルダパスとドメイン名の設定
まず，`C:\xampp\apache\conf\extra\httpd-vhosts.conf`の20行目あたりにある

```
##NameVirtualHost *:80
```

のコメントアウト(##)を消す．

次に，以下のように追記して参照したいフォルダを指定．

```
<VirtualHost *:80>
    DocumentRoot "C:\Users\Documents\test"
    ServerName localhost2
</VirtualHost>

```

`DocumentRoot`にはフォルダパスを，`ServerName`には任意のドメイン名を設定する．
ここではドメイン名はlocalhost2とする．

##手順2. アクセス権付与
注意点として，`C:\xampp\htdocs`以外をバーチャルホストとするとき，別途アクセス権を与えなければならない．そうしないと403エラーになる．
引き続き`C:\xampp\apache\conf\extra\httpd-vhosts.conf`に，以下のように追記すればOK．

```
<Directory "C:\Users\Documents\test">
    Options Indexes
    AllowOverride All
    Require all granted
</Directory>
```

`Options Indexes`とは，以下のようにブラウザ上でフォルダのインデックスGUIを見れるようにするオプション．書かなくてもOK．

![image](https://qiita-image-store.s3.amazonaws.com/0/71593/a026b529-7300-dacb-77db-ee550405deb0.png)


##手順3. hostsファイル編集
`C:\Windows\System32\Drivers\etc`にある，`hosts`を開き，以下のように先ほど設定したドメイン名を追記．

```
127.0.0.1       localhost2
```

これでOK.
XAMPPからApacheを起動し，http://localhost2 を叩けば上記の画像のように任意のフォルダをバーチャルホストにできる．


##参考
以下のサイトを参考にさせていただきました．
http://web77.info/xampp/set/virtual.html
入社してから導入したインフラツールについて

aibouと言います。最近では社員から本名で呼ばれることはマレです。

前職ではサーバサイドエンジニアとしてJavaプロダクトのお守りをしていまして、6月に入社して半年ほどAWSのオペレーションエンジニア（造語）の仕事をしています。括りにとしてはインフラ園児ニアです。

僕が入社するまでは、インフラエンジニアがひとりしかいない状態だったので、現状の設定・構成等々は色々空気を読みつつ、自動化出来るところは自動化していこうということで複数のツール導入しました。
今回はその紹介をします。

## chefspec

Gunosyでは、AWS Opsworksを利用してサーバの構築・デプロイまで実施しています。
Opsworksを使う以上、必ず使うのがプロビジョニングツール「Chef」です。

これまでウェイソイヤ（※）でトライアンドエラーによってレシピを作ってきたのもあり、レシピ自体の検証がかなり怪しい状態だったので、chefspecを入れてみました。

https://github.com/sethvargo/chefspec



## roadworker

Route53でのドメイン管理をRubyのDSLでコード化できるwinebarrelさんのツールです。

http://roadworker.codenize.tools/

Route53では、設定変更の差分や以前の値の参照がかなり難しいので、バージョニング化できるのは本当に便利です。

## piculet

EC2セキュリティグループをRubyのDSLでコード化できる、同じくwinebarrelさんのツールです。

http://piculet.codenize.tools/

こちらも差分や履歴を追いづらいのでメリットがありますが、それ以上にコメントをつけれるのが非常に大きいです。
これまでは登録済みグローバルIPとエクセルを照らし合わせる日々でしたが、その無駄作業から解放されました。

## 入れる前と入れた後で変わったこと

### chefspec

chefspecを入れた結果、「テンプレートファイルに値入ってなかったテヘペロ」は事前に検出できるようになりました。
結構ありがたい反面、「生成されたテンプレートが対象のシステム的に正しいのか」という検証ができません。
test-kitchenあたりまで導入するべきかと悩むんですが、網羅するべき検証項目が多かったり、opsworks側で用意されているレシピを流したうえでテストすべきだと考えたりで、やや気が重い状態です。

serverspec？おっとその話はいまはやめておこう

## codenized.tools

roadworker、piculetはかなり効果絶大で、これまで

> チャット・口頭での依頼 → 作業実施 → 連絡

という一連の流れが、

> プルリク → マージ → 自動反映

となり、インフラエンジニアへの負担が大幅に低減されました。

<img width="793" alt="スクリーンショット 2015-12-02 15.35.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/12031/80f0397e-b78a-e43d-9372-fe16c0ea1a9c.png">

↑の方は解析チームの方なんですが、まともにレクチャーしてないのにもかかわらずプルリクを送ってきてくれました。

アプリケーションエンジニアにしっかりした人（≒ 空気読める人）が多くて、この運用が通用しているんだろうなぁと感謝しつつ、どんどん移譲していきたいです。

実際に運用してみたのを軽く書いたのがこちらです。
http://qiita.com/aibou/items/4144a4e8feb140fbc942

## これから入れようとしているもの

__Barkdog__: 
こちらもwindbarrelさんのツールで、datadogのアラートをDSLで管理できるようになります。
GunosyではOS内の監視・メトリックダッシュボードの作成にDatadogを利用しており、異常検知時はSlackやPagerDutyを経由して担当者に通知を投げます。
現状の設定がかなりカオス化してる（運用サービスによってアラートのレベルが違うことが原因）ので、バージョニング化・共通化を目指したいですね。

__Terraform__: 
Opsworksを使ってサーバ自体の構築・デプロイまで自動化出来るようになりましたが、今後はOpsworksを含めたEC2 SecurityGroupやIAM roleの管理も自動化していきたいと思っています。

その手段としてTerraformを、また現状の状態を吸い上げるTerraformingを併用して運用したいなーという願望があったりします。

https://github.com/dtan4/terraforming

## 注釈

（※）については、後日12/10のGunosyアドベントカレンダーに記述予定です。
ElectronでノートアプリBoostの開発を頑張ってる話



#　Boostを作ろうと思った背景
＊すごく個人的なエントリーでごめんなさい。
現在は事業として開発を行っているBoostですが、もともとは
1. markdownで取ったノートをローカルに保存していたが検索しづらい・アクセスしづらい、などの問題があり不便だった。
2. 他のメンバーにシェアするのも不便だった。

などという課題がチーム内にありました。そんな課題を解決するためにシンプルで管理がしやすい、ノートアプリを作り始めたのがきっかけです。

#　Boostとは
## Boostとは最もシンプルなエンジニア向けノートアプリです。
[Boost公式ページ](http://b00st.io/)
![スクリーンショット 2015-12-02 16.42.13.png](https://qiita-image-store.s3.amazonaws.com/0/41986/5a6c745c-c1b4-561e-4681-5dadf3b13b7d.png)


マークダウンノートの管理・コードの管理・検索・利用に最適化したエンジニアの脳の代わりになるようなツールです。
Boostを使うことで昔覚えたことや書いたコードにすぐにアクセスすることができ、開発が効率化されるはずです。

ポイントはおもに下の３つ。
①マークダウン・シンタックスハイライトに完全対応
マークダウンはもちろん各種プログラミング言語100種類以上のシンタックスハイライトに対応しております。
ドキュメントだけでなく、よく使うスニペットや日本語テンプレートの保存などにも利用できて便利です。

![スクリーンショット 2015-12-02 16.58.10.png](https://qiita-image-store.s3.amazonaws.com/0/41986/95bae418-ba81-6295-9d45-fcff7fae2a53.png)


②Finderでノートを一瞬でコピー&ペースト
**Control + Shift + Tabで"Finder"を呼び出すことができます。**
保存したコードやマークダウンはfinderと呼んでいる小さなウィンドウで表示・検索が可能です。
コードを書いている最中にドキュメントを開くのは以外と億劫ですがそんなこともなくなります。
![スクリーンショット 2015-12-02 16.58.17.png](https://qiita-image-store.s3.amazonaws.com/0/41986/1be2a673-8f1b-8f20-5a81-382c1ba4abc4.png)

③フォルダとタグでシンプルに管理
投稿はわかりやすくフォルダわけすることが可能であり、タグをつけることで検索も簡単になります。
検索条件もキーボードだけで簡単にソートすることができて便利かも。
![スクリーンショット 2015-12-02 16.58.24.png](https://qiita-image-store.s3.amazonaws.com/0/41986/d27867e2-a57b-8209-b94d-1af191725368.png)


# BoostではElectronを使ってみた！
BoostではElectron(V0.35 )を利用して開発しております。

実はElectronの公式ページに掲載されていたりもしてます。
 **[Electron公式ページ](http://electron.atom.io/)**

![スクリーンショット 2015-12-02 18.03.14.png](https://qiita-image-store.s3.amazonaws.com/0/41986/e2e365d8-a764-95a8-51ed-5ccb64efea45.png)

#　今後のBoostの展望
個人で使いやすいノートを目指してBoostは今開発を進めております！
Windows版・Linux版の対応、各種他サービスとの連携、クラウドバックアップ、emacs
・Vim対応、、、、、、などなど色々と対応の準備をしてます。

# まとめ
最近ではElectronのもくもく会やMeetupを開催してたりするのでぜひ遊びにきてください！そちらではより詳しい開発秘話や開発手法などもお話していますのでぜひ。

**[Boost公式ページ](http://b00st.io/)**
**[Boost公式ブログ](http://blog-jp.b00st.io/)**

全体的に宣伝ぽくなってしまい申し訳ございませんがぜひ一度触ってみてください〜〜。

明日は
@koki_cheese　さんです！
re:dashは何が良くて、何が足りないのか

re:dashを使い始めて約半年、社内で実運用を始めて約10ヶ月が経ちました。

re:dashに繋がらなくなると苦情が出るレベル、にまでは社内で使われるようになりました。

その感想を書きます。

かなり主観も入ってますが、これから使おうとしている方は是非参考に。

# 現在の使用状況

* クエリ数は約900
  * このうちスケジューリングで定期実行しているのは約200

* ダッシュボード数は約150

# 何が良いのか

## OSSであること
これは非常に大きいです。

商用のBIツールの場合、よくわからない挙動や動作をした場合でもベンダーに問い合わせたりする必要があります。

ただしre:dashはOSSです。
意味不明な動作をしたらコードを読めば動作が把握出来ます。
(※もちろんPythonのコードをある程度読める必要があります)

また、開発が非常に活発で外部からのPRもちゃんと見てくれます。
作者の@arikfrさんが開発する際にも必ずPRを作ってMergeされています。

@arikfrさんはTwitterも積極的にチェックしているそうです。

## WEB UIであること

クライアント型の可視化ソフトは開発泣かせですよね。。

## 対応したデータソースが多いこと
対応データソースがとにかく多いですが、大部分が外部からのcontributionsです。
作者の人が作ったquery runnerはほとんどないのではないでしょうか。

ただ、さすがにTreasure DataやVerticaといった商用系のデータソースを作者の人がレビューするのは無理があります。
データソースの追加に関しては最近plugableになりました。
REDASH_ADDITIONAL_QUERY_RUNNERSという環境変数に独自のコードのPathを記述することで実現できます。
[ここ](http://docs.redash.io/en/latest/datasources.html#python)を参照

## 細かな便利機能

以下は細かい機能ですが、

* SQLの実行結果がキャッシュされる
  * 夜中などにSQLをスケジューリングしておけば、朝会社に来てSQLの実行結果を待たされるといったことはありません

* スケジューリング機能を持っている

* SQLを共有出来る
  * クエリごとにパーマリンクがあるというのは本当に素晴らしいことです

* 程よくプログラマブル
  * sqlのテンプレート機能
  * JSON API
  * 独自UIをJavascriptで生成([re:dashのダッシュボードで入力フォームを活用する - Qiita](http://qiita.com/yokotty/items/55ffab41ec5e49bc4a30))

* アラート機能
  * SQLの結果によってアラートをメール,Hipchat,Slack,webhook等で通知できます

## 可視化までの手間が少ない

やることは

* SQLを書く
* グラフを作る
* ダッシュボードに組み込む
* スケジュールを組む

を継続的に回していくイメージです。

Excelなどにして渡すなどに比べると大幅にデータ抽出コストが削減できます。

## 最低限のセキュリティ機能が実装されていること

* 権限管理
* SSL
* Google Apps認証
* 操作ログ
* SAML認証

といった最低限のセキュリティ機能が備わっています。

権限については別のAdvent Calendarで書こうかと思います。

# 足りないと思う点

## セキュリティ系

* ダッシュボード別、クエリ別の権限設定

## 表示系

* レポーティング
  * ダッシュボードをPDFにして出したい
  * ダッシュボードの内容を定期的にメールで送信

* もう少し高度な可視化
  * バブルチャートやツリーマップなど

## その他
* ドキュメントに書いていない裏機能みたいなものが数多く存在し、コードを読まないとわからない。
  * 仕様変更が激しいため、使っていた機能急に別の場所に移動されたりする

* 依存モジュールが多くて、Ubuntu以外のOSで構築するのがきつい

# 発生した問題
* クエリの数が増えすぎており、適切なスケジューリングがされていないとクエリが詰まる。
  * Worker数を設定できるのでスケールアップで回避可能
  * 350クエリ程度ならAWSのm3.medium程度でも特に問題はない
  * Prestoなど数分かかるクエリを実行する場合はスケジュールをうまく調節すること

* StableではないVersionにアップデートすると大抵バグが見つかります^^
  * ただ、自分は許容できるようなバグが多いです
Nutanixでのハイパーバイザーのサポートポリシー

#はじめに

この記事は、[Nutanix Advent Calendar 2015](http://www.adventar.org/calendars/1124) 12月2日の分として作成しました。
本記事の内容はこの日付の情報に基づいています。

本記事の対象は商用版のNutanixプラットフォームです。Community Editionではありませんのでご注意ください。

# Nutanix上で利用できるハイパーバイザー
Nutanixでは広く利用されている3種類のハイパーバイザーをサポートしています。

- VMware vSphere (vSphere 5.0以降※)
- Microsoft Hyper-V (Windows Server 2012 R2)
- Nutanix Acropolis Hypervisor (KVMベース)

※サポートされるvSphereのバージョンはNutanixのモデルによって異なります。最新のHaswel CPUベースのモデルではESXi5.5、ESXi6.0がサポートされています。詳細はVMware社の[HCL](http://www.vmware.com/resources/compatibility/search.php?deviceCategory=server)をご確認ください。

#新バージョンやパッチのサポートポリシー
システムは一度導入して完結するものではありません。(しばらく塩漬けにすることはあるかもしれませんが…) 
例えばESXi5.5で導入したシステムをESXi6.0にアップグレードするケースや、セキュリティパッチやアップデートリリースを適用するケースなどは運用中にほぼ必ず発生するシチュエーションです。

各ハイパーバイザー共にセキュリティパッチや不具合対応のパッチがリリースされています。これらのパッチを適用することはサポートされているのでしょうか。

Nutanixでは、ストレージコントローラーを各物理サーバ上の仮想アプライアンスとして実装し、ハイパーバイザーとは独立して動作させるアーキテクチャーを採用しています。これにより、ユーザの方はかなり柔軟にパッチを適用いただくことが可能です。

各ハイパーバイザー毎のサポートポリシーはNutanixのサポートの[FAQ](http://www.nutanix.com/support/support-faqs/#hypervisor-support
)に記載されています。以下に簡単にご紹介します。

## VMware vSphere
vSphereについては、ESXiのバージョン番号に紐づくメジャー、マイナーリリース(ESXi5.5や6.0など)、アップデートリリース(ESXi6.0 update1など)、パッチリリース(ESXi5.5u2p4のpatch4など)の3種類についてそれぞれサポートポリシーがあります。
### メジャー、マイナーリリース
メジャー、マイナーリリースについては、VMware社がGAリリースを行った日を起点として、90日以内にQA(品質保証)の検査を行い、サポートを開始します。
サポートを開始する際には、Nutanixから公式にアナウンスします。
### アップデートリリース
ESXi6.0update1などのアップデートリリースについては、VMware社がリリース後即時サポート対象となります。並行して45日以内にQAの検査を行います。
### パッチリリース
ESXi5.5u2patch4などのパッチリリースについては、VMware社がリリース後即時サポート対象となります。

## Microsoft Hyper-V
### メジャー、マイナーリリース
Hyper-Vのメジャー/マイナーリリースはMicrosoft社のGAリリース後即時サポート対象となります。並行して90日以内にQAの検査を行います。
### アップデートリリース
Hyper-Vのアップデートリリースについては、Microsoft社がリリース後即時サポート対象となります。並行して45日以内にQAの検査を行います。
### パッチリリース
パッチリリースについては、Microsoft社がリリース後即時サポート対象となります。

セキュリティ上の重大な脆弱性に対応するパッチなど、即時適用が望ましいパッチも存在します。
Nutanixのハイパーバイザーに密結合していないアーキテクチャーと、それによる柔軟なパッチのサポートポリシーは運用上大きなメリットになるのではないでしょうか。
PHPでのLINUXコマンド実行 （あれ？ファイルのコピーができない・・・）

かなり長時間躓いた為メモ。
PHPの処理でexec関数によりLINUXコマンドを実行する際のこと。

<?php
    $page_code = 'copy_test';
    exec('cp -r ../test ../' . $page_code);
?>

この処理は「test」というディレクトリとその配下をコピーし、
「copy_test」というディレクトリを作成するという処理ですが、
何度実行してもコピーされませんでした。
こういう時にもっとも陥りやすいのがアクセス権限の問題です。

exec関数でアクセスしようとしているディレクトリのパーミッションを変更しなくてはなりません。
例えば「/home/greenwich/html/testtemp/ ・・・・」の場合、
copy_testを作成するディレクトリ「html」のパーミッションを書込み可に変更すれば実行できるようになります。

毎回パーミッションの件で時間を費やしている気がする…
NEURONの解説書

　明日以降のNEURON Advent Calenderの記事では主にThe NEURON BOOKを参考図書とする予定です．以下は参考リンクです．

Yale UniversityのPublicationページ
http://www.neuron.yale.edu/neuron/nrnpubs

Amazon
http://www.amazon.co.jp/The-NEURON-Book-Nicholas-Carnevale/dp/0521115639

その他の資料などは随時以下のサイトに追加していく予定です．
y³ lab.  | NEURON
https://ycubedlab.wordpress.com/neuron/

　NEURONは神経活動のシミュレーションに対する有用さから，先日のリンク先である玉川大学のサイトなどでは「高校生が扱うのにも適したソフトである」とも述べられています．しかし実際のところは，小中高生や大学生で脳科学分野に関心がある人の多くはプログラミング初心者であったり，ある程度慣れていてもこのソフトの扱いが難しいと感じる人は多いのではないでしょうか．また，情報系に通じていても神経についての知識や概念を腑に落ちて理解している人はあまりいないように思います．
　この一方で，NEURONを扱いそのシミュレーションの結果の意味するところを紐解くための情報は乏しいのが現状です．というのも，NEURONの解説書は上述の本のみであり，今現在邦訳版も存在しません．英文サイトや研究者の方々が解説なさった資料は多いものの，小中高大生にとっつきやすい印象を与えないように思いました．
　NEURON自体が生物的な正確さと情報処理での高い効果の均衡を図って開発されたソフトなので，このような状態を一学生として何かよくできたらと思いこのAdvent Calenderを作りました．何か初学者の参考になる資料を増やすこととその記事を書く中で私自身もNEURONで遊べるようにしていけたらと思います．

※現在NEURON Advent Calenderは私個人でほぼ日程を埋めてしまっています(一般的にはマイナーで25日分埋まらないのではと考えています)．もし，他の使用者の方で記事を書いてくださる方がいらっしゃったらどうぞお知らせください．
sbtでセッティング(またはタスク)の実装を分離して記述する

テストしたsbtのバージョンは0.13.9
# 背景
sbtでセッティングを構築するコードを`:=`の右辺に直接書くのは避けて、トップレベルの`val`として記述したいという場合がある。例えばsbt-assemblyを使った次のようなコードを考える。

```scala:
lazy val root = (project in file(".")).
  settings(
    assemblyMergeStrategy in assembly := {
      case PathList("test", _ @ _*) => MergeStrategy.discard
      case ".classpath" | ".project"  => MergeStrategy.discard
      case x =>
        val oldStrategy = (assemblyMergeStrategy in assembly).value
        oldStrategy(x)
    }
  )
```

ここで次のように`:=`の右辺を単純に`val`にすると、`value`メソッドを使っているためエラーになる。

```scala:
lazy val mergeStrat: String => sbtassembly.MergeStrategy = {
      case PathList("test", _ @ _*) => MergeStrategy.discard
      case ".classpath" | ".project"  => MergeStrategy.discard
      case x =>
        val oldStrategy = (assemblyMergeStrategy in assembly).value
        oldStrategy(x)
    }

lazy val root = (project in file(".")).
  settings(
    assemblyMergeStrategy in assembly := mergeStrat
  )
```

```shell-session
***/build.sbt:5: error: `value` can only be used within a task or setting macro, such as :=, +=, ++=, Def.task, or Def.setting.
        val oldStrategy = (assemblyMergeStrategy in assembly).value
```

# 解決法
エラーメッセージにもあるが、`Def.setting`がこの目的のために使える。

```scala:
lazy val mergeStrat = Def.setting {
  (x: String) => (x) match {
      case PathList("test", _ @ _*) => MergeStrategy.discard
      case ".classpath" | ".project"  => MergeStrategy.discard
      case x =>
        val oldStrategy = (assemblyMergeStrategy in assembly).value
        oldStrategy(x)
  }
}

lazy val root = (project in file(".")).
  settings(
    assemblyMergeStrategy in assembly := mergeStrat.value
  )
```

タスクであれば`Def.task`を使えばいい。

# 参考文献
[sbt Reference Manual — sbt 0.13.0 - 0.13.2](http://www.scala-sbt.org/0.13/docs/ChangeSummary_0.13.0.html#New+task%2Fsetting+syntax)
AppVeyor 設定項目 - Build編

# AppVeyor
.NET開発者向けのCI&デプロイツール
[Continuous Integration and Deployment service for Windows developers - Appveyor](http://www.appveyor.com/)

[AppVeyor 設定項目 - General編 - Qiita](http://qiita.com/shoooo/items/3137a93c355f3ca07656)

[AppVeyor 設定項目 - Environment編 - Qiita](http://qiita.com/shoooo/items/c4c0456fd0899dee55c6)

## SETTINGS
GUIでの設定項目について概要をまとめます。

### Build
ビルド設定
以下の3タイプから選ぶ

- MSBUILD：MSBuildを用いたビルドの設定
- SCRIPT：PowerShellかCmdでビルドスクリプトを記述
- OFF：そもそもビルドしない（必要ない）

`MSBUILD`以外は特に記述することはないので、以下`MSBUILD`について記載する

#### Configuration
ビルド構成（`Release`や`Debug`）を指定する
未指定の場合はプロジェクトの既定の設定が採用される
複数した場合は、[Environment編のEnvironment variables](http://qiita.com/shoooo/items/c4c0456fd0899dee55c6#environment-variables)のように複数回ビルドされる
`Environment variables`で2つ、`Configuration`で2つ指定した場合
それぞれの組み合わせで実行され、計4回実行される

#### Platform
プラットフォーム（`Any CPU`や`x64`）を以下から指定する

- Any CPU
- x86
- x64
- ARM

`Configuration`と同様に複数指定可


#### Visual Studio solution or project file
ビルドルートディレクトリ（デフォルト：`c:\projects\{プロジェクト名}`）にソリューションファイルまたはプロジェクトファイルがあれば特に指定せずにビルドできる
明示したい場合はファイルパスを記述する

#### MSBuild options

##### Enable parallel builds
`/maxcpucount`オプションを使用するか
[MSBuild での複数のプロジェクトの並行ビルド](https://msdn.microsoft.com/ja-jp/library/bb651793.aspx)

##### Verbosity level
ビルドログ出力レベルの指定

- Quiet
- Minimal
- Normal
- Detailed

#### Automatic packaging
デプロイ用作業の指定

- Package Web Applications for Web Deploy
    - Web Deploy パッケージの作成
- Package Web Applications for XCopy deployment
    - XCopyでの配置用パッケージの作成
- Package Azure Cloud Service projects
    - Azure Cloud Serviceプロジェクト(`.ccproj`)があれば、Azure Cloud Serviceパッケージ(`.cspkg`)の作成
- Package NuGet projects
    - `*.nuspec`があればNuget用パッケージの作成

#### Before build script
ビルド前に実行するスクリプトを記述
PowerShellかCmdが選べる
例えばNuGetパッケージの復元をしたい場合、以下のように記述

```bat
nuget restore
```

#### After build script
ビルド前に実行するスクリプトを記述
PowerShellかCmdが選べる
hubot-google-image で Google Custom Search API を利用する設定

長らく DEPRECATED だった [Google Image Search API](https://developers.google.com/image-search/) がとうとう使えなくなった模様です。

Hubot の hubot-google-images も（何も設定していなければ）この API を叩いて画像を取得していたので、「突然 Bot が画像をとってきてくれなくなった！」という人もいるのではないでしょうか。

もともと hubot-google-images の README には[「Custom Search Engine の設定しろよな」](https://github.com/hubot-scripts/hubot-google-images#custom-search-engine)と書いてあり、この通りに設定をすれば問題ないのですが、その手順をもう少し詳しく解説するのがこのエントリです。

## 注意点
Google Custom Search API は [１日 100 リクエストまでは無料ですが、それ以上は 1000 リクエストにつき $5](https://developers.google.com/custom-search/json-api/v1/overview#pricing) かかります。注意しましょう。

## 手順
hubot-google-images で画像検索を行うのに必要なものは以下のふたつです。

- `HUBOT_GOOGLE_CSE_ID`: カスタム検索エンジン ID
- `HUBOT_GOOGLE_CSE_KEY`: Custom Search API を叩く権限を持つ API Key

これらふたつの値をを取得するための手順を以下に書きます。

### カスタム検索エンジンを作成する
[カスタム検索エンジンの作成](https://cse.google.com/cse/create/new) から新しいカスタム検索エンジンを作成します。

![01_cse_create.png](https://qiita-image-store.s3.amazonaws.com/0/16369/b1277d89-ee11-4077-f740-bef68fc3ec1d.png)

作成したら、コントロールパネルからカスタム検索エンジンの設定を変更します。

![02_cse_settings.png](https://qiita-image-store.s3.amazonaws.com/0/16369/a90288e9-cf47-0dce-213f-5b25de1d541b.png)

これで「カスタム検索エンジンID」が取得できました。

### API Key を作成する
[Google Developers Console](https://console.developers.google.com) のプロジェクトを新しく作りましょう。
既にあるプロジェクトで API Key を発行する場合はそちらで構いません。

[API Manager](https://console.developers.google.com/apis) から Custom Search API を有効にします。

![03_enable_api.png](https://qiita-image-store.s3.amazonaws.com/0/16369/f8b820e3-2fd6-1a3b-a4d4-83ad5e7b65df.png)

次に、「認証情報」>「認証情報を追加」から新しい API Key を発行しましょう。
今回は Hubot から利用するための API Key なので「サーバーキー」を作成します。

![04_create_api_key.png](https://qiita-image-store.s3.amazonaws.com/0/16369/6bc4cfbb-8e14-afb4-8629-0bd7adada274.png)

これで「Custom Search API を叩く権限を持つ API Key」が取得できました。

### Hubot に設定する
あとはこれらの情報を `HUBOT_GOOGLE_CSE_ID` `HUBOT_GOOGLE_CSE_KEY` として Hubot の環境変数として設定するだけです。
[jrubyfx] NameError: cannot load Java class com.sun.javafx.Loggingの回避

# 注意
この情報はすでに陳腐化した。
Windows10 64bitにおいて、

- jdk-8u121
- jruby 9.1.7.0
- jrubyfx 1.1.1

の環境でjrubyfxが動作することを確認している。

# 前置き
以下、Windows7 64bitにおいて、

- jdk-8u40
- jruby 1.17.16.1
- jrubyfx 1.1.1

の環境では、jrubyfxが動いていた。

ところが、jdkとjrubyをアップデートしたところ、
下のエラーが発生して、jrubyfxを使用したプログラムが動かなくなってしまった。

```
NameError: cannot load Java class com.sun.javafx.Logging
          for_name at org/jruby/javasupport/JavaClass.java:1286
   get_proxy_class at org/jruby/javasupport/JavaUtilities.java:34
       java_import at file:/C:/jruby-1.7.18/lib/jruby.jar!/jruby/java/core_ext/object.rb:27
               map at org/jruby/RubyArray.java:2412
```

# 調査
どうも、Javaのインテグレーションに伴うjrubyの問題なようだ。
https://github.com/jruby/jrubyfx/issues/95
https://github.com/jruby/jruby/issues/3366

## jrubyfxが動くjdkとjrubyのバージョンは
jruby 1.7.16.1を固定し、jrubyfxが動作するJDKのバージョンを調査した。

|結果|バージョン|
|:---|:---|
|NameError|8u60, 8u66|
|無事に動作した|8u51とそれ以前|

次に、jdk-8u51を固定し、jrubyfxが動作するjrubyのバージョンを調査した。

|結果|バージョン|
|:---|:---|
|無事に動作した|1.7.18とそれ以前|
|警告(※1)|1.7.19 - 1.7.22|
|別のエラー(※2)|9.0.0.0 - 9.0.4.0|

※1

```
io/console not supported; tty will not be manipulated
```

https://github.com/jruby/jruby/issues/2944
https://github.com/asciidoctor/asciidoctorj/issues/401

※2

```
Exception running Application:
\#<NameError: uninitialized constant Java::JavafxStage::Stage::Scene>
C:/jruby-9.0.4.0/lib/ruby/gems/shared/gems/jrubyfx-1.1.1-java/lib/jrubyfx/core_ext/stage.rb:75:in `layout_scene'
```

# 結論
jrubyfxを使用するなら、2015/12/02現在、

- jdk-8u51
- jruby 1.7.18
- jrubyfx 1.1.1

で使用すること。
最新版のjdkが入っている環境に配布するにはどうすればいいんだろう。
あんまり話題になっていないところから考えて、みなさん、あまりjrubyfx使ってないのかな。
Centos　zabbix-agent のインストール（Centos6）

１．zabbixのyumリポジトリを登録
rpm -ivh http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch.rpm

２．zabbix-agent のインストール
yum -y install zabbix-agent

３．zabbixのyumリポジトリを無効化
vi /etc/yum.repos.d/zabbix.repo

[zabbix]
name=Zabbix Official Repository - $basearch
baseurl=http://repo.zabbix.com/zabbix/2.4/rhel/6/$basearch/
enabled=0
●0に変更
 
[zabbix-non-supported]
name=Zabbix Official Repository non-supported - $basearch
baseurl=http://repo.zabbix.com/non-supported/rhel/6/$basearch/
enabled=0
●0に変更

４．ZabbixサーバのIPアドレスを設定
vi /etc/zabbix/zabbix_agentd.conf

Server=127.0.0.1
●zabbixサーバーのIPアドレスを指定

５．zabbix-agentを起動
service zabbix-agent start

６．zabbix-agentを自動起動に設定
chkconfig zabbix-agent on

７．Selinux無効化
 vi /etc/selinux/config

SELINUX=disabled
●disabledを指定

８．iptables無効化
chkconfig iptables off

９．再起動
reboot
PipelineDBのバージョンアップ履歴


アドベントカレンダー2日目という事で運用する時のTipsを書こうと思いましたが、他に運用している人を知らないので予定を変更します。
PipelineDBは頻繁にバージョンアップされているので、その内容を遡ってみたいと思います。

なお、私は今PipelineDBのEnterpise版(write scale)の検証をしていますが、NDAがあるのでそれらの情報を書くのはNGっぽいです。
というわけで、当たり障りの無いアップデート情報と、その解説(気になったものだけをピックアップ)をします。
性能改善のアップデートが多いので最新版を使う事を推奨します。

# 0.8.0

- 起動ポートがpostgresqlと同じポートになりました
- Smarter Step-sizes for Sliding Window Queries
- その他大量の改善

Sliding Windowの改善とは、
streamに高頻度でデータを投入すると、実体のデータを持つテーブル(mrel0)に細かい単位で記録されていってしまいます。continuous viewを参照する時はこの実体テーブルを集計して結果を返すため、大量のレコードをselect, groupingする事になります。
このバージョンから、WHERE句の `arrival_timestamp` に`hour`や`minute`等の関数をサポートするようになりました。`hour`や`minute`は`date_trunc`のaliasなので、`date_trunc`で出来る事は全てサポートされています。
これを指定する事で、実体のデータもこの単位で作るようになるため、大幅な性能改善をする事ができます。

# 0.8.1

- Kafkaをサポート
- TopKの処理を Filtered Space Saving のアルゴリズムでサポート
	- http://www.l2f.inesc-id.pt/~fmmb/wiki/uploads/Work/misnis.ref0a.pdf
- Sliding Windowの改善
- 各種バグFixと性能改善
- `stream_commit_interval`のオプションを追加



このバージョンから、amazon-linuxのrpmでインストールした時に各スクリプトの権限設定がぶっ壊れているのが直りました。0.8.0では、pipeline-init等に適切なパーミッションが設定されていませんでした。

また、このバージョンから`\d`でcontinuous viewが表示されなくなりました。
(最新の0.8.4より後のnightly buildでは直っています)

# 0.8.3

- アドホックな継続クエリのサポート
- TopKは今まで固定長の型しかサポートしなかったが、可変長の型をサポートするように
- Keyed Min/Max のサポート
- `step_factor`を使ってSliding Windowを調整できるように
- 1個のstreamから複数のcvを作る時の性能改善


`padhoc`というコマンドラインツールが追加され、アドホックにCVを試せるようになりました。

```
padhoc -c 'select x::text, count(*) from stream group by x'
```

このような感じで使います。
コンフィグファイルでadhoc queryを有効にしてサーバを起動しないと使う事はできません。


TopKは今まで固定長の型(intなど)しかサポートしませんでしたが、VARCHAR等もサポートするようになりました。

Keyed Min/Maxとは、その名の通り`keyed_max` `keyed_min`をサポートするするようになりました。`keyed_max(arg1, arg2)`は、arg1が最大のarg2を保持するためのものです。
ちょっと気になるのは、`arg1`が同じ値の場合に最後のarg2ではなく最初のarg2が返ってくる点です。

# 0.8.4

- マルチコア環境下での性能改善
- 書き込みI/Oの改善
- 厳密な異なり数の算出が可能に

書き込みI/Oについて、
streamにデータが連続で来ますが、例えばbloomFilterやHLLの場合、同じ値が連続して来た場合に律儀に更新しに行く必要はありません。このバージョンから、同じ値が連続で来ている場合は、後続の値の更新はしないようになりました。

厳密な異なり数について、
今までは、`count(distinct column)` とすると確率的データ構造のHyperLogLogを使って算出します。厳密な異なり数は出せなかったのですが、このバージョンから `exact_count_distinct(column)` を使う事ができるようになりました。

# まとめ

というわけで、最新版を使いましょう。
アップグレードする時にデータを移行したい場合は、以下のような方法で出来るようです。
（データを消しても良いならクリーンインストールをオススメします）

https://github.com/pipelinedb/pipelinedb/issues/1255
eZ Publish の特徴

**eZ Publish** をはじめ、昨今のCMSはいずれも高機能化しており、その中において eZ Publish はどのような特徴があるのかをまとめたい。なお、概念の違いや具体的な他CMSとの比較は明日のアドベントカレンダー記事で詳細をまとめる予定。

## eZ Publish の主な特徴
**eZ Publish** は汎用性が高く、標準で高機能であり、強力なユーザー権限管理、無理のない多言語コンテンツ管理などが特徴的である。
他のCMSのデフォルトの機能と比較して、特に以下のような概念的、機能的に優位な点や特徴がある。

* PHPフレームワークの **Symfony 2** でフルスタックとして開発されている。
    * **Drupal** も Symfony を採用しているが部分的な利用に留まる。
* コンテンツツリーによるコンテンツの構造的な管理
* サイトアクセスの概念により1つのコンテンツを複数パターンで出力可能
    * 1つのコンテンツを複数のテンプレートで出力可能
* 多言語コンテンツがデフォルトで管理可能
* ステートの概念により全てのコンテンツに一括してフラグやパラメーターを付加可能
* データ構造（コンテンツクラス≒カスタム投稿タイプ）が標準の管理画面から登録可能
* ロールとポリシーで管理ユーザーの権限を細かく柔軟に制御可能
* デフォルトで差分が表示されるなどコンテンツのバージョン管理が容易
* ロケーションの概念により無制限にコンテンツの親子関係を紐付け可能
* 設定やテンプレートに上書き（オーバーライド）の概念がある

## 特徴的な概念
### サイトアクセス
**サイトアクセス**とは、1つのコンテンツに複数のテンプレートを持たせる概念。
これにより、1つのコンテンツに対して、PC用とスマートフォン用にテンプレートを分けるということが可能になる。
サイトアクセスの切り替えはURLによって行われる。例えば `http://example.com/pc/` と `http://example.com/sp/` などといった具合になる。

### コンテンツタイプ、コンテンツタイプグループ
**コンテンツタイプ**とは、コンテンツの種類を規定する定義。WordPress の「カスタム投稿タイプ」、PowerCMS の「カスタムオブジェクト」に相当。例えば「ブログ記事」や「ウェブページ」など。
ユーザーもコンテンツタイプの1つとして扱われるのも特徴。
また、コンテンツタイプをグルーピングする**コンテンツタイプグループ**も定義可能。
いずれも標準の管理画面で登録可能。

### フィールドタイプ
**フィールドタイプ**とは、コンテンツが持つフィールド（項目）の種類と性質を規定する定義。WordPress や Movable Type の「カスタムフィールド」に相当。例えば「テキスト」や「ファイル」など。
4系以前では**データタイプ**と呼ばれていた。
標準の管理画面で登録可能。
バンドル開発により独自に追加可能。

### コンテンツ（オブジェクト）
**コンテンツ**とは、コンテンツタイプで定義されたフィールドで登録されたデータの集まり。例えばブログ記事として登録された実際のデータ。
ユーザーデータなども全てコンテンツとしてデータベース内に一元的に格納される。
4系以前では**オブジェクト**と呼ばれていた。

### ステート
**ステート**とは、すべてのコンテンツに対して、コンテンツタイプによらずに、その**状態**を一括して持たせる概念。
コンテンツタイプごとにはフィールドタイプでデータを持たせればよいが、コンテンツタイプが多い場合などはステートを使うと管理が楽になる。
標準の管理画面で登録可能。

### ロケーション（ノード）
**ロケーション**とは、コンテンツを**コンテンツツリー**上に紐付ける概念。これによりコンテンツの親子関係を紐付けることが可能になると共に、1つのコンテンツをショートカットのように複数のコンテンツに紐付けることが可能になる。
また、ロケーションとは別にフィールド値として紐付けることも可能。
4系以前では**ノード**と呼ばれていた。

## eZ Publish が不得意な部分
### 拡張
管理画面から**バンドル**（≒プラグイン、モジュール、エクステンション）を追加することはできず、バンドルのインストールはやや手間である。

### デザイン
標準では1種類のデモバンドルしか用意されておらず、管理画面からデザインを検索したり適用したりすることはできない。
原則的にゼロベースで設計、実装する必要がある。従って、初期工数が多くなる傾向にある。


## リンク
1. [eZ Publish とは](http://qiita.com/bezeklik/items/d1cdc65d57e14e0a18d2)
2. [eZ Publish の特徴](http://qiita.com/bezeklik/items/e168f99064a9233353ec)
3. [eZ Publish と他の CMS との比較](http://qiita.com/bezeklik/items/7c07df73fa6f0ddf1203)
4. [eZ Publish のバージョンによる違い](http://qiita.com/bezeklik/items/3c98ae4764199931da86)
シンプルにnodejsをインストール

https://nodejs.org/download/
ここから好きなバージョンをダウンロードする

今回はこれ
https://nodejs.org/download/release/v0.12.8/node-v0.12.8-linux-x64.tar.gz
サーバーにアップロードして好きなところに展開します

$ tar -xzvf node-v0.12.8-linux-x64.tar.gz
$ mv node-v0.12.8-linux-x64 /usr/local/

bin/nodeにリンクをはる
$ ln -s /usr/local/node-v0.12.8-linux-x64/bin/node /usr/bin/node
（パスを通しても良いでしょう）

以上です

確認します
$ node --version
v0.12.8
【GitHub】Pull Requestの手順

Git勉強会（社内勉強会）でできなかった、Pull Requestについての説明です。



# Pull Request の手順


## 手順

単純にソースコードを取得したいなら<code>git clone http://{対象のGitHubリポジトリ}</code>で大丈夫です。もしコードの内容を修正したい場合はリポジトリをForkする必要があります。


1. 対象のGitHubリポジトリをFork
2. ローカルへclone（クローン）
3. ローカルリポジトリで新規ブランチを作成
4. 修正を加える（コミット）
5. 作成したブランチをpush（プッシュ）する
6. Pull RequestをGitHub上で作成


## 1. 対象のGitHubリポジトリをFork


対象のGitHubリポジトリをブラウザ上でアクセスします。


んで、そこにある<code>Fork</code>ってボタンをクリック。
![スクリーンショット-2015-11-28-17.26.37.png](https://qiita-image-store.s3.amazonaws.com/0/101690/8beb2f9f-d13b-9cc2-fb3f-d525bfed3332.png)


自分のアカウントに対象のリポジトリがForkされます。


### Forkって何？


基本的には<code>git clone</code>と何らかわらない機能です。


gitの機能ではなくGitHubのサービスの機能です。「GitHub上で他の人のリポジトリを修正するためのClone」とでも覚えておいてください。

※厳密な意味じゃないので、間違っていたら修正依頼よろしくおねがいします！


## 2. ローカルへclone（クローン）


自分のPC（ローカルPC）で編集するために、<code>git clone</code>します。


SourceTreeを起動して、左上あたりにある「クローン」 -> 「URLからクローン」を選択。


1でForkしたリポジトリのURLをセットしてクローンしてください。


黒い画面が好きな人向けに、コマンドラインではこんな感じ

```sh
$ git clone https://github.com/Aipakazuma/test.git
```


## 3. ローカルリポジトリで新規ブランチを作成


修正前にブランチを作成します。


SourceTree上で「ブランチの作成」を選択して新規ブランチを作成してください。


```sh
$ git checkout -b test3
Switched to a new branch 'test3'
```


## 4.修正を加える（コミット）


修正を加えます。


修正したら<code>git add</code>して<code>git commit</code>してください。


自分のローカルでは空ファイル作成してコミットしました。


```sh
# 空ファイル作成
$ touch ozisan_tundereka_kaikaku.txt

# ステージに追加
$ git add ozisan_tundereka_kaikaku.txt 

# コミット
$ git commit -m "add ozisan wo deredere ni shitai"
[test3 0ed309f] add ozisan wo deredere ni shitai
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 ozisan_tundereka_kaikaku.txt
```

## 5.作成したブランチをpush（プッシュ）する


ブランチを選択して<code>push</code>してください。


```sh
$ git push origin test3
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 302 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To https://github.com/Aipakazuma/test.git
 * [new branch]      test3 -> test3
```

## 6.Pull RequestをGitHub上で作成


GitHubで自分のアカウントページから、Forkしたリポジトリへアクセスし、Pull Requestのボタンを選択。（「New pull request」っていう緑のボタン）

![スクリーンショット-2015-11-28-17.26.50.png](https://qiita-image-store.s3.amazonaws.com/0/101690/93af4b24-4a70-ac05-5947-57fe6c78bace.png)



マージしたいブランチ（右側）を選択します。
次に作成したブランチを選択します。
<img width="989" alt="スクリーンショット 2015-11-28 17.30.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/101690/1b47612c-ff5c-4aa1-7b83-ecc85a6b1bce.png">


するとこのような画面になる（はず）。次に「Create pull request」っていう緑のボタンを押してください。
![スクリーンショット-2015-11-28-17.31.09.png](https://qiita-image-store.s3.amazonaws.com/0/101690/4b950409-e4d2-5053-ef96-fcf596e7d139.png)


すると入力欄が表示されるので、内容を入れます。
入力したら、右すみの「Create pull request」を押せばおｋ
![スクリーンショット-2015-11-28-17.31.37.png](https://qiita-image-store.s3.amazonaws.com/0/101690/6aed1d77-fd37-8356-d3ee-172ad7babb3a.png)



こんな画面になるかと。
<img width="1001" alt="スクリーンショット 2015-11-28 17.31.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/101690/f8abd6e0-c6e6-2acd-7d25-32e5bf6d0bb9.png">


ここまで。お疲れ様です。

## <code>git clone</code>した場合の<code>pull request</code>

この場合は、リポジトリに特定のユーザーを許可しないといけません。ので、面倒（？）なのでいいかなと。
AndroidのTabLayoutで泥臭くfontawesomeのアイコンを使う方法


# TL;DR
fontawesomeのアイコンをフォントのまま使う方法はあちこちにありますが、

[アイコン]
[テキスト]

と上下に並べてタブに表示する方法がどうしてもわからなかったのでfontawesomeのフォントをPNGとして出力する方法で乗り切りました。
泥臭さ満載ですが、シンプルで問題も起きずらいということでいい....はず。



# PNGアイコンを用意する

fontawesomeのアイコンをPNG化する方法として以下のサイトを使いました。

FA2PNG
http://fa2png.io/

色やサイズを細かに指定できて便利！


今回はアクティブなタブを赤色で表現することにして、赤と灰色のアイコンを用意します。

![home_active.png](https://qiita-image-store.s3.amazonaws.com/0/74328/7b412b79-f0c2-81d8-f542-0f0d4f38539c.png)

[home_active.png]

![home_normal.png](https://qiita-image-store.s3.amazonaws.com/0/74328/01a391bb-6d7c-9352-7bfc-824de37fa281.png)

[home_normal.png]

生成した画像は res/drawable以下に格納します。



# selector.xmlを作成する

こんな感じ


```res/drawable/home.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@drawable/home_active"
            android:state_pressed="true" />
        <item android:drawable="@drawable/home_active"
            android:state_selected="true" />
        <item android:drawable="@drawable/home_normal" />
</selector>
```

ディレクトリ配置はこんな感じ

<img width="226" alt="Screen Shot 2015-12-02 at 16.55.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/74328/bda2cc8f-d2d4-51d4-2869-095d14e14457.png">



これでタブがアクディブの場合、非アクティブな場合のアイコン切り替えを実現します。

参考
Tab with icon using TabLayout in Android Design Library
http://stackoverflow.com/questions/30828951/tab-with-icon-using-tablayout-in-android-design-library


# TabLayoutにタブを設定する


アクティビティの中でタブを設定します。

```MainActiviy.java
.
.
tabLayout = (TabLayout)findViewById(R.id.tab_layout);
.
.
tabLayout.setSelectedTabIndicatorColor(Color.parseColor("#FF0000"));     // 選択時のタブのインジケーターの色を赤に
Tab home = tabLayout.newTab(); 
home.setText("Home"); 
home.setIcon(R.drawable.home); 
tabLayout.addTab(home);
```

とこうなります。

選択時
![active.png](https://qiita-image-store.s3.amazonaws.com/0/74328/14683dea-eba0-5847-bd78-d78f57bdecc6.png)




非選択時
![diactive.png](https://qiita-image-store.s3.amazonaws.com/0/74328/0c243d9c-c908-041f-6cae-f3e26a5b24a5.png)




これでよし。
qTranslate X と WP REST API と WordPress のサブフォルダ名

WordPress 多言語対応プラグインの [mqTranslate が開発終了](https://wordpress.org/support/topic/deprecation-of-mqtranslate)になってしまったので、代替としておすすめされている [qTranslate X](https://wordpress.org/plugins/qtranslate-x/) をインストールしたら、[WP REST API](https://wordpress.org/plugins/json-rest-api/) が動かなくなってしまったのだけど、原因がわかったので書いておきます。

ふつうに WordPress をインストールして、WP REST API と qTranslate X をいれただけでは、問題おこらない。

Giving WordPress Its Own Directory « WordPress Codex
https://codex.wordpress.org/Giving_WordPress_Its_Own_Directory

↑みたく WordPress 関連ファイルを site root からサブディレクトリに移動させて、かつ、その移動先のフォルダ名が 2 文字の英字からなる名前（ぼくのばあい wp）だと、その 2 文字を qTranslate X が言語指定とみなして誤動作します。（正確にいうと、かつ qTranslate の "URL 変更モード" が "事前パスモード" のとき）

qTranslate X の該当コードここ
https://github.com/qTranslate-Team/qtranslate-x/blob/73613e5a144daa83ea8a55f38a5291d53e7b7890/qtranslate_core.php#L240

バグかというと、微妙なラインだけど、、、
CentOS6.x で rbenvを入れて Ruby環境を作る

# 作業環境
* centos6.7
* インストール先 /opt/rbenv
* インストールする rubyバージョン 2.2.3
* システム全体で使う

# rbenv
https://github.com/rbenv/rbenv

# 先に関連する開発用パッケージをインストール
```shell-session
yum install gcc make openssl-devel libffi-devel readline-devel git
```

# 公式gitからclone
```shell-session
cd /opt/
git clone git://github.com/sstephenson/rbenv.git
mkdir /opt/rbenv/plugins
cd /opt/rbenv/plugins
git clone git://github.com/sstephenson/ruby-build.git
```

# /etc/profile 設定

/etc/profile に下記３行を追記

```shell-session
export RBENV_ROOT="/opt/rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init -)"
```

再ログイン等で反映し rbenv にパスが通った事とバージョン確認

```
rbenv -v
```


# rbenv を利用して ruby 2.2.3をインストール

インストール可能なrubyのバージョンを確認

```
rbenv install -l
```
2.2.3をインストール

```
rbenv install 2.2.3
```

2.2.3をシステム標準のバージョンとして設定

```
rbenv global 2.2.3
```

ruby のバージョンを確認

```
ruby -v
```
継続的じゃなくていいから、CommitIDを指定して手動ビルドしたいです....


## 手動実行したいケースについて：

まだまだお世話になっているJenkinsさんですが、わたしはあまり『継続的』（コミットのたび）にビルドするという作業はしたことがなく、どちらかというと以下のような作業を行なっていました。

1. 作業日程を決めて、作業用チケットを作成する（Redmineです）
2. 指定のブランチのビルド（リリース）を手動実行する
3. ビルド結果をチケットに添える

という作業を行なっていました。

※ Jenkinsの各ジョブの結果と実行ログのリンクをRedmine側のチケットに追記するために [こんなJenkins用プラグイン](https://github.com/akiko-pusu/redmine-build-notifier-plugin) を作ったりしてました。

この作業の時は、常時masterブランチを対象としていました。

みなさんはいかがでしょうか。やはり少数派なんでしょうかね...。

## ブランチやタグではなく、CommitID指定でビルドしたい！

さて、なんだかんだで、CIしちゃっていい環境と、一定のタイミングで指定のコミットを適用したい環境があります。（開発環境はガンガンCIするけど、チーム外のユーザに評価してもらう環境はある程度落ち着いたものを提供したいとか）

このへんは、ブランチにpush/margeしたタイミングとか、タグを付けたタイミングで実行するようにすればいいのですが、『そういえば、コミットID指定でビルドするのって、どうやればいいかな...』と、ふと思いました。

（やったこと無かったのです）

で、ちょっと試してみると、こんな感じで設定できました...

### ブランチの代わりにパラメータを入れる

JenkinsのGitプラグインには、『ビルドするブランチ入れてねー』と書いてありますし、例もブランチの設定しか出ていませんが **コミットID（Gitのハッシュ）も指定可能**です....。

コミットIDは実行時に切り替えたいので、$COMMIT_ID というビルドパラメータを指定するようにしました。 

![scm-setting.jpg](https://qiita-image-store.s3.amazonaws.com/0/27976/28082c17-4bcc-c2e3-2b00-035010e56c91.jpeg "scm-setting.jpg")

### ビルドパラメータを指定する

パラメータの指定方法が良く判らないとか、指定無しならデフォルトでdevelopブランチなど特定のブランチを取り出すようにしたいのであれば、このように設定しておきます。

以下は、指定無しなら develop ブランチを使う設定です。

![parameter-setting.jpg](https://qiita-image-store.s3.amazonaws.com/0/27976/8d1c7d39-3ad4-6095-c280-6f5dd67e0a81.jpeg "parameter-setting.jpg")


あとは、実行時にCommitIDを入力してあげれば、希望通りに動いてくれます。

## その他の工夫

たぶん周回遅れかもしれませんが、フロント側の場合は、いつのCommitIDのものが環境に適用されているか、ぱっと見分かりやすいように、画面のフッターの部分（HTMLもしくはHTMLのテンプレート）に、CommitIDとビルドIDを差し込むようにしています。

ここはJenkinsのステップの中で、シェルを使って置換しています....
こんな感じ。

```
# ビルドID差し込んでねーというパラメータがあったら
if $INJECT_BUILD_INFO = true ; then　

  # 書き換えたいテンプレートのフォルダに移動 (exp. template)
  cd template
  export GIT_NUMBER=${GIT_COMMIT:0:8}  # 環境変数にCommit IDを入れる (長いので8桁にする）
  perl -i -pe 's/置換する直前の文字/置換する直前の文字 \/ BUILD_ID: $ENV{BUILD_NUMBER} (Commit:$ENV{GIT_NUMBER})/' 差し替えたいファイル
fi
```

以上、ほんとうに小さなことですが、メモとしてアップしてみました。
「そんなことしなくても、こうすれば出来るよ！」というご指摘、ご意見もいただければ幸いです！

みなさんの毎日が、God JOBでありますように〜!

![1470071_559616800785443_390682318_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/27976/9d5ec0b1-2321-2dfe-efce-b5c23d41c1c1.jpeg "1470071_559616800785443_390682318_n.jpg")
MyBatisでのupdate

自動生成したMapperとEntityを使って、updateをする方法
いくつかメソッドがあり、素直に書くと無駄が多かったのでメモ。

# 最初の実装
- updateByPrimaryKey()を使う

1. selectByPKey()で更新対象のrecordを取得してEntityに保持
2. Entityの中身をsetXX()で値変える
3. updateByPrimaryKey(record)で更新

```sql:これで流れるSQL
update TABLE set col1 = ?, col2 = ? …(全項目)… where key = ?
```

# 別の方法
- updateByPrimaryKeySelective()を使う

1. 空のrecordのEntityを作成
2. keyと、変えたい値(col1)だけset
3. updateByPrimaryKeySelective(record)で更新

```sql:これで流れるSQL
update TABLE set col1 = ? where key = ?
```

MyBatisは使ってなかったけど、過去のPJではレコードを取得⇒更新の流れが普通だったので意識してなかったが、
Keyだけ指定して更新の方が確実で無駄が無いので良い。
もし、空のEntityじゃなくて取得した物を使ってSelectiveを呼ぶ場合、「更新対象の項目」かどうか判断するのは
「項目がnullかどうか」らしいので、注意。(まぁkeyだけセットするのが普通かな)
MacOSXでKinect for WindowsV2をopenFrameworksで利用する


           
##始めに
今回は今までMacOSでは利用できなかったKinectV2が[hanasan](https://github.com/hanasaan)のアドオン[ofxMultiKinectV2](https://github.com/hanasaan/ofxMultiKinectV2)のおかげで使えるようになったのでサンプルプログラムを作ってみました。
サンプルプロジェクトはこちら→[https://github.com/SakuragiYoshimasa/kinectv2_sample](https://github.com/SakuragiYoshimasa/kinectv2_sample)

##環境構築１
まず以下のコマンドで必要なライブラリ及びパッケージをインストールします
それぞれの説明は今回は割愛します

```
brew update
brew install libusb
brew tap homebrew/science
brew install jpeg-turbo
brew tap homebrew/versions
brew install glfw3
```

##環境構築２
次に[libfreenect2](https://github.com/OpenKinect/libfreenect2)を導入します
上と同じようにlibfeenectを置きたいところで以下のコマンドを打ち込みます

```
git clone https://github.com/OpenKinect/libfreenect2.git
cd libfreenect2
mkdir build && cd build
cmake ..
make
make install
```

以上の操作が完了したら

```
./bin/Protonect
```
で動作確認し、問題なければ環境構築は完了！
次はopenFrameworksのサンプルプロジェクトを作っていきます

##Addonの追加
例によってaddonフォルダにて

```
git clone https://github.com/hanasaan/ofxMultiKinectV2.git
```
でofxMultiKinectV2をaddonに追加します
もしくは[ここ](https://github.com/hanasaan/ofxMultiKinectV2)からzipをダウンロードしてaddonフォルダに突っ込みましょう

##プロジェクトの作成
いつもどおりProjectGeneratorでofxMultiLinectV2をaddonに追加して新しいプロジェクトを作成します

<img width="500" alt="スクリーンショット_2015_12_02_15_53.png" src="https://qiita-image-store.s3.amazonaws.com/0/68570/bd61578c-8899-596a-ab7f-0bcd4b884475.png">


プロジェクトができたらXcodeプロジェクトを開いてください
しかしこのままではビルドが通らないので
Project->BuildPhases->LinkBinaryWithLibrariesに
OpenCL.framework　と usb-1.0.0-superspeed.a　の二つを追加します
ちなみにusb-1.0.0-superspeed.aはofxMultiLinectV2->libs->libusb->lib->osxの中にあります

以上でプロジェクトの作成は完了です

##サンプルコード
今回は簡単に映像を映し出すサンプルにしました

```cpp:ofApp.h
#include "ofMain.h"
#include "ofxMultiKinectV2.h"


class ofApp : public ofBaseApp{
     
     ...  

     ofxMultiKinectV2 kinect;
     ofTexture texture;
};
```

```cpp:ofApp.cpp

void ofApp::setup(){
    kinect.open(true, true, 0);
    kinect.start();
}

void ofApp::update(){
    kinect.update();
    if(kinect.isFrameNew()){
        texture.loadData(kinect.getColorPixelsRef()); 
    }
}

//--------------------------------------------------------------
void ofApp::draw(){
    if(texture.isAllocated()){
        texture.draw(0, 0, 600, 400);
    }
}
```

そしてその結果、こんな感じでちゃんとkinectが撮っている映像が表示されます

<img width="800" alt="スクリーンショット_2015_12_02_16_10.png" src="https://qiita-image-store.s3.amazonaws.com/0/68570/e425132e-2074-23f5-84eb-cd81fef7e236.png">



##終わりに
自分は今までKinectV1は持っていなかったため、
oFでkinectを使うことが出来なかったのですがこれで使えるようになりました！
感謝申し上げます。

今回は単純な映像のみでしたが時間があれば他も色々試して投稿したいと思います



2015.12.02
laravel collective

illuminate/htmlはもうメンテされていないらしいので
laravelcollective/htmlに変更しました。

```composer.json
"require": {
    "laravelcollective/html": "~5.0"
}
```

```config/app.php
'providers' => [
     Collective\Html\HtmlServiceProvider::class,
  ],

'aliases' => [
      'Form' => Collective\Html\FormFacade::class,
      'Html' => Collective\Html\HtmlFacade::class,
  ],
```

composer updateして終了。
つまづかないSwift Optional

#I はじめに
##Optionalは難しくない
Swift初学者にとってOptionalの概念はつまづきやすいポイントの一つと考えられる。(私自身もつまづきました）。しかしいくつかのポイントを抑えれば、Optionalは簡単に理解でき、難しいものではない。

自分が学んだときに知っておきたかった事をまとめてみたので、新たに学ぶ人の参考になれば幸いです。

##記事の対象レベル
プログラミング経験はあるが、Swiftは初学という人。
プログラミングは初めてだがSwiftやプログラミングについて若干の知識と理解がある人（ざっくりすぎてゴメンなさい）

#II 概要
##Optional型の概念
Optionalとは言語仕様によってnil参照を不可能にすることで、プログラムの安全性を高める仕組みである。

nilを参照してしまいプログラムがクラッシュするというような事態をほぼ回避できる。
(ちなみにObjective-Cではnil参照してもクラッシュしないがSwiftからしっかりクラッシュする仕様になった)

##それぞれの型の違い
###非Optional型（通常の型）
nilを入れられない。それ以外は普通の型。
nilが入らないので、この型を使う限りnil参照は起こらない。
###Optional型
nilを入れられる。

使う際（型に値を入れるとき以外、メソッドを呼び出すなど）にはnilチェックを強制される。
このnilチェックの仕組みをappleはunwrapと呼んでいてunwrapの方法は複数用意されている。

使う際にnilチェックを強制されるので、この型を使う限りnil参照は起こらない。(例外あり）

#III 使い方
##宣言
###宣言方法
宣言時に型の後ろに"?"をつける事で、その型をOptionalとして宣言できる。

```swift:OptionalDeclaration.swift
var name: String? // Optional
var name: String  // 非Optional

var count: Int?   // Optional
var count: Int    // 非Optional
```

###宣言できる型（=全ての型）
しっかり確認したわけではないが、基本的にはあらゆる型をOptionalとして宣言できるようだ。
独自クラスにも適用可。

```swift:Declaration2.swift
var myClass: MyClass? // Optional
var myClass: MyClass  // 非Optional
```

###宣言できる / すべき 場所
基本的に型を宣言する場所全てでOptional型を宣言できる

- ローカル変数
- メソッドの引数、戻り値
- クラスのヘッダー
etc.


##それぞれの型の挙動
###非Optional型（通常の型）
以下のようなことを行うとコンパイルエラーになる

- nilを入れようとする
- 初期化前に参照する
- クラスのヘッダーで宣言して、initで初期化しない
etc.

```swift:NonOptionalRules.swift
var name: String = nil         // コンパイルエラー

var station: String            // ローカルで宣言するだけではエラーにならない
station.lowercaseString        // 初期化前に参照したので、ここでコンパイルエラー
var nextStop: String = station // 同じくコンパイルエラー

// nameをinitで初期化してないのでコンパイルエラー,nameをOptionalで宣言すればエラーにならない
class MyClass {
    var name: String

    init() {
    
    }
}
```

###Optional型
- nilが入る
- 初期化しなくてもOK
- Unwrap(nilチェック)せずに使おうとするとコンパイルエラー

```swift:OptionalRules.swift
var name: String? = nil         // OK

var station: String?            // OK, 初期化しないと中身はnil
station.lowercaseString         // Unwrapしないで使おうとしたので、ここでコンパイルエラー

var lastStop:String? = station  // OptionalからOptionalへの代入はOK
```
##Unwrap(nilチェック)
Optional型はUnwrapという作業を行うことで使用できる。事実上のnilチェック。
最も代表的な方法のみを２つ紹介する。
あまり詳しく書かないので、Unwrapに関しては他の資料の参照をおすすめする。

###Optional Binding
ifの後に新しく変数を宣言して(以下の例ではunwrappedName)、その変数にunwrapしたいOptional型の値が入るかをチェック。

Optionalに値が入ってる場合は、unwrappedNameにOptionalの中身が入り、if文の中身が実行される。
Optionalに値がない場合(中身がnil）はif文の中身は実行されない。

elseを付け加えることも可能。

```swift:OptionalBinding.swift
var guest: String = ""
var name: String?

if let unwrappedName = name {
    guest = unwrappedName
}
```

###Forced Unwrapping
Optional型の変数の後ろに"!"をつけると、強制的にunwrapされる。もし変数の中身がnilだった場合は、Forced Unwrapを行おうとした瞬間にエラーになる。基本非推奨。

```swift:ForcedUnwrapping.swift
var guest: String = ""
var name: String?

guest = name!          // nameの後に"!"をつけて強制unwrap,このケースは実行時エラーになる
name!.lowercaseString  // メソッドの呼び出し。このケースも同じく実行時エラー


// 以下のケースはForce Unwrap時にUnwrapする型に値が入っているので、実行時エラーにはならない
var leader: String = ""
var member: String?

member = "Obi-Wan"
leader = member!
```
ROMA のステータスの見方(stat)

ROMAのステータスの確認方法です。
ROMAのインストール方法は昨日のポストを参照
http://qiita.com/hiroaki-iwase/items/d00936fc0e2bcb64a62a

# コマンド
```
stat [regexp]
```
- `telnet <address> <port>`でROMAにアクセスできます
- `regexp`オプションは表示項目を正規表現で指定することが出来ます

# 見方
## stat
```
> stat
version 1.2.0
config.DEFAULT_LOST_ACTION auto_assign
.
.
.
END
```
- 全ステータス項目を表示します

## stat node
```
> stat node
stats.run_receive_a_vnode {}
routing.nodes.length 2
routing.nodes ["localhost_10001", "localhost_10002"]
routing.vnodes.length 512
routing.short_vnodes 0
routing.lost_vnodes 0
routing.version_of_nodes {"localhost_10001"=>66048, "localhost_10002"=>66048}
END
```
- 基本的なステータス情報を表示します
- `routing.short_vnodes`は冗長度の落ちたvnodeの数を表します
<ul>
<li>冗長度2の場合、1つのvnodeにアクセスできなくなっている状態です</li>
<li>dataの読み書きは行えます</li>
<li>通常時は0です</li>
</ul>
- `routing.lost_vnodes`は冗長度が0になったvnodeの数を表します(通常時は0です)
<ul>
<li>冗長度2の場合、2つ(両方)のvnodeにアクセスできなくなっている状態です</li>
<li>dataの読み書きが行えません</li>
<li>通常時は0です</li>
</ul>

## stat primary|secondary
```
> stat primary|secondary
routing.primary 263
routing.secondary1 249
END
```
- telnetでアクセスしたnodeが担当しているvnodesの数を表示します

## stat path
```
> stat path|PATH
config.LOG_PATH /home/roma
config.RTTABLE_PATH /home/roma
config.WRITEBEHIND_PATH /home/roma/wb
stats.config_path roma/config
storages[roma].storage.storage_path /home/roma/localhost_10001/roma
write-behind.path /home/roma/wb
```
- ROMAが参照している各ファイル、ディレクトリのpathを表示します

## stat storage
```
> stat storage
storages[roma].storage.storage_path /home/roma/localhost_10001/roma
storages[roma].storage.st_class RubyHashStorage
storages[roma].storage.divnum 10
.
.
.
```
- ROMAのstorage情報を表示します
- `st_class`は使用しているstorageのタイプを表示します  
例  
RubyHashStorage : メモリーモード  
TCStorage : TokyoCabinet  
GroongaStorage : Groonga

# roma-admコマンド
telnetが使用できない/install出来ない場合は以下のroma-admコマンドでもステータスを確認できます  
```roma-adm <adm-command> <port No.>```

例

```
$ roma-adm 'stat node' 10001
.
stats.run_receive_a_vnode {}
routing.nodes.length 2
routing.nodes ["localhost_10001", "localhost_10002"]
routing.vnodes.length 512
routing.short_vnodes 0
routing.lost_vnodes 0
routing.version_of_nodes {}
END
```

# 参照URL
ROMA Status List : http://roma-kvs.org/learn/status.html
Gemfileの中身をソートするgem_sortを作りました

## リポジトリなど

- rubygems https://rubygems.org/gems/gem_sort
- github https://github.com/kozo002/gem_sort

## これは何か

Gemfileの中に今まではよくこんな感じに記述していました。

```ruby:Gemfile
gem 'rails', '4.2.5'

# HTML
gem 'slim-rails'

# CSS
gem 'bootstrap-sass'
gem 'compass-rails'
```

これだと分類がめんどくさいし、そもそもジャンルの解釈が人によってまちまちなのであんまり意味がありませんでした。
どうせならabc順になっていれば管理が楽ですよね。

```ruby:Gemfile
gem 'rails', '4.2.5'

gem 'compass-rails'
gem 'bootstrap-rails'
gem 'slim-rails'
```

だけどこれを人力でやるのは頑張り過ぎかと…

## というわけでrakeタスクにしました

```bash
$ bundle exec rake gem:sort
```

これ打つとこんなGemfileが・・・

```ruby:Gemfile
source 'https://rubygems.org'
ruby '2.2.3'
gem 'rails', '4.2.5'

# HTML
gem 'slim-rails'

# CSS
gem 'bootstrap-sass'
gem 'compass-rails'

group :development, :test do
  gem 'spring'
  gem 'rspec-rails'
  gem 'tapp'
  gem 'spring-commands-rspec'
end

group :production do
  gem 'unicorn'
end
```

こうなります！

```ruby:Gemfile
source 'https://rubygems.org'

ruby '2.2.3'
gem 'rails', '4.2.5'

gem 'compass-rails'
gem 'bootstrap-sass'
gem 'slim-rails'

group :development, :test do
  gem 'rspec-rails'
  gem 'spring'
  gem 'spring-commands-rspec'
  gem 'tapp'
end

group :production do
  gem 'unicorn'
end
```

## gemにしました

お手元のRailsのGemfileに以下を追加して

```ruby:Gemfile
gem 'gem_sort'
```

インストールして

```bash
$ bundle install
```

実行しましょう

```bash
$ bundle exec rake gem:sort
```

## 試してみたら

フィードバック貰えると嬉しいです。
twitter: https://twitter.com/kozo002
Android開発学習ノート　初日


## Androidの学習ノート

Androidプログラミングをやるときに気になったことをメモするノート

## 基本のアクティビティライフサイクル

// 呼び出すタイミングまとめ
OnCreate：アクティビティ生成時。初期化とか行う。
OnDestroy：アクティビティが破棄される時

OnStart:アクティビティが表示状態になる時
OnStop:アクティビティが非表示になる時
OnRestart:アクティビティがバックグラウンドからフォアグラウンドになる前の時。

OnResume:アクティビティがフォアグラウンドになる時。
OnPause：アクティビティがフォアグラウンドでなくなる時。ここでデータの保存とか状態の退避を行う。

## レイアウトから値を取得

    型名 変数 = (型名)findById(R.id.xxxx)

キャストを忘れずに

## インテント受け渡しと受け取り(アクティビティの遷移）

    Intent intent = new Intent(自アクティビティ、遷移先アクティビティ)
    startIntent(intent)

○値を渡す場合は

    intent.putExtra("KEY",値)

○値を受け取る場合は

    変数 = intent.getExtra("KEY")


## 暗黙的なインテント
明示的にアクティビティを指定せずに、Androidの他のアプリとかにインテントを送ることができる。
例：
メールを送信する。
（メールアプリケーションが複数あれば、選択のダイアログが出る）

    Intent intent = new Intent(INTENT.ACTION_SENDTO, "mailto:メールアドレス")

電話をかける。
（発信するアプリケーションが複数あれば、選択のダイアログが出る）


    Intent intent = new Intent(INTENT.ACTION_CALL, "tel:メールアドレス")

## クリックリスナーの登録
イベントハンドラーの登録
UI部品の挙動をトリガーにして、動作を決めるやつ。
ボタンクリック時の処理について。
色々方法があるので、随時追記します。

○とりあえず、IDEが自動補完で出してくれる方法

    [ボタンオブジェクト].setOnClickLisner(new OnClickListener(){
    @override
    public void onClick(View view){
       処理を書く
    }
        }
    )

## ボタンを押した時のイベント遷移
ボタンを押す
↓
OnTouchイベント
（リスナー：OnTouchListener)
（アクション：ACTION_DOWN)
↓
長押し
OnLongClickイベント
(リスナー：OnLongClickLisner)
↓
離す。
OnTouchイベント
（リスナー：OnTouchListener)
（アクション：ACTION_UP)
↓
最後に
OnClickイベント
（リスナー：OnClickListener）

※　OnLongClickイベントは戻り値がbooleanで、trueの場合はその後イベントを行わない。