OmniAICreator/Qiita-1.07M huggingface dataset:
PythonからGSUtilを使ってS3のファイルをGCSにコピーする


Pythonを使ってs3からGoogle Cloud Storageにデータを移す際、以前下記の二つの方法を書きましたが、やはり`gsutil`を使うとs3から自分のサーバーを経由せずに直接Google Cloud Storageにコピーできるので便利です。

- [Python(boto)でAmazon S3にあるデータをGoogle Cloud Storageへコピーする](http://qiita.com/itkr/items/d990e87a2540332ee0e5)
- [Python(boto)からサービスアカウントとキーファイル(p12)を使ってGoogle Cloud Storageにアクセスする](http://qiita.com/itkr/items/40b847e59c6f64845411)

## gsutilの設定ファイル

[ドキュメント](https://cloud.google.com/storage/docs/gsutil/commands/config#additional-configuration-controllable-features)を参考に、GSUtilの実行時に読み込む設定ファイルを作っておきます。最低限[Credentials]や[GSUtil]は必要ですね。

```ini
[Credentials]
gs_service_key_file = /path.to/sample-KEYFILE.p12
gs_service_client_id = sample-service-account@developer.gserviceaccount.com
aws_access_key_id = AXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = sampleawssecretaccesskey1234

[Boto]
https_validate_certificates = True

[GSUtil]
content_language = ja
default_api_version = 2
default_project_id = sampleproject-994
```

## Pythonからコマンドを実行する

コマンドの実行には`os.system`、`commands`、`subprocess`がありますが`subprocess`を使うことが推奨されています。

### `os.system`と`commands`は非推奨

#### `os.system`

[^1]: http://docs.python.jp/2/library/os.html#os.system

>subprocess モジュールが、新しいプロセスを実行して結果を取得するための、より強力な機能を提供しています。この関数の代わりに、 subprocess モジュールを利用することが推奨されています。[^1]

#### `commands`

[^2]: http://docs.python.jp/2/library/commands.html

>バージョン 2.6 で撤廃: commands モジュールは Python 3.0 で削除されました。 代わりに subprocess モジュールを使ってください。[^2]

### `subprocess`を使う

```python
import os
import subprocess
import shlex

BOTO_PATH = '/path.to/boto.ini'

cmd = 'gsutil cp s3://bucket/name gs://bucket/name'

popen = subprocess.Popen(
    shlex.split(cmd),
    stdout=subprocess.PIPE,
    env={'BOTO_PATH': BOTO_PATH, 'PATH': os.getenv('PATH')})

output = popen.communicate()[0]

print output

```

ポイントはBOTO_PATHの指定です。通常`gsutil`はデフォルトではホームディレクトリの.botoという設定ファイルを見て実行しますが、`BOTO_PATH`や`BOTO_CONFIG`という環境変数を指定するとそこに指定されているファイルを見に行きます。

`subprocess.Popen`は`env`という引数に環境変数を指定できるのでdictのキーに'BOTO_PATH'を指定して、値に設定ファイルのパスを入れています。`env`を指定する場合は必要な環境変数を全て与えなければいけないため、'PATH'も指定しています。

[^3]: http://docs.python.jp/2/library/subprocess.html

>env を特定の値として与える場合、プログラムを実行するのに必要な変数全てを与えなければなりません。 Windows で side-by-side assembly を実行するためには、 env は正しい SystemRoot を 含まなければいけません 。[^3]
line monitor > 2台目RPi2のインストールと設定

line monitor
http://qiita.com/7of9/items/028556c5a819a6a8de96

<hr>

開発用とは別途、連続動作に使うRPi2を購入した。

## セットアップ

以下の手順でセットアップした。

1. NOOBSからraspbianインストール
2. git cloneで以下の４つをクローン (/home/pi/lineMonitor/以下)
  - python-151113-lineMonitor
  - python-151127-7segLed_IPadrDisplay
  - python-151205-shutdownButton
  - python-151212-logFolderCopier
3. /etc/rc.localに追記 (http://qiita.com/7of9/items/46ae6752db57205fd5e7)

以上で再起動するとラインモニターとして動き出した。

あとは、以下を用意して2台目完成。

1. 7セグメントLED基板
2. shutdownスイッチ基板
3. USBシリアルケーブル x 2
4. クロス接続用治具 (またはクロスケーブル)
5. 電源


NOOBSからのインストールに時間がかかる。１台目のmicroSDをコピーする方が楽だろう。

最新のOSを追いたい場合は、上記の手順を踏むことになる。

## 画像

二台そろった所。
実際にはこれにUSBシリアルケーブルが２本ずつつながる。

上は有線LAN接続。下はWi-Fi接続(2.4GHz)。

上の７セグLED基板は下の７セグLED基板より前の実装のため大きい。これにスイッチを足そうとしてストレートピンヘッダをハンダした後にテーブルから落として、ピンヘッダが折れた。仕方ないので、ブレッドボードに挿すジャンパーワイヤーをピンヘッダの代わりとした。

![qiita.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/4c0f8d79-8111-0b8c-0d41-bc60f06a7bf5.jpeg)
OSXでシステム音の出力スピーカーを変える

最近Bluetoothスピーカーを買ってｳﾊｳﾊなのですが、
音楽を再生しながら作業していて、突然「ﾌｫﾝ！」みたいな音が鳴ると急に萎えてしまいます。

iTunesなどのアプリから出力される音とシステム音の出力先を変えるには、システム環境設定の「サウンド」を選び、

![wholescreen.png](https://qiita-image-store.s3.amazonaws.com/0/103086/59794501-2b20-373d-607d-7d80a9caf58c.png)
「サウンドエフェクト」タブの「サウンドエフェクトの再生装置」を変更します。

ただ、ここで変わるのはシステム音だけなので、例えばLINEの通知音なんかはBluetoothスピーカーから出力されてしまいます。

アプリごとに設定を変えられないものか…
SublimeText3でRailsコーディングする時に、gemの中までコードジャンプする簡単な方法

# ひとことで言うと
gemをvenderの中にインストールする


# 手順
アプリケーション直下に「.bundle/config」ファイルを作成する

```
BUNDLE_PATH: vendor/bundle
BUNDLE_DISABLE_SHARED_GEMS: '1'
```

この設定でbundle installすると、app/vender/bundle/以下にgemファイルがinstallされる。

これでSublimeTextのGotoDefinitionで普通に潜ることが出来る。




# キーバインドの変更

デフォルトのキーバインドはやりにくいという場合は、以下の様な設定をkeymapに追加する。

```
  // 定義元へ
  { "keys": ["ctrl+["], "command": "goto_definition" },
  // 遷移元へ
  { "keys": ["ctrl+]"], "command": "jump_back" }
```
Visualforceページを開いた時にSalesforce標準のエラーページを表示する

Apexで用意されている例外の種類には、Visualforceページで使用可能なものがあります。

- NoDataFoundException
- NoAccessException

これらを利用して、Visualforceページを開いた時にSalesforce標準のエラーページを表示することができます。

<img width="320" src="https://qiita-image-store.s3.amazonaws.com/0/39902/20e1c981-4159-eed7-e68a-92e42cbda644.jpeg">

###手順
Visualforceページのコントローラクラスを作成し、コンストラクタ実行時に例外を発生させます。

```java:MyPageController.cls
public class MyPageController {
  public MyPageController() {
    throw new NoDataFoundException();  // "データがありません"エラーを表示
    //throw new NoAccessException();   // "アクセス権がありません"エラーを表示
  }
}
```

```xml:MyPage.page
<apex:page controller="MyPageController">
</apex:page>
```

####実行結果
*/apex/MyPage* へアクセスすると、Salesforce標準のエラー画面が表示されます。

・NoDataFoundException発生時
<img width="520" src="https://qiita-image-store.s3.amazonaws.com/0/39902/20e1c981-4159-eed7-e68a-92e42cbda644.jpeg">

・NoAccessException発生時
<img width="520" src="https://qiita-image-store.s3.amazonaws.com/0/39902/293684ba-ddf1-cbdc-1e43-9d39544f9fce.jpeg">


###補足
- 通常はApexエラーが発生すると通知メールが送信されますが、この場合は送信されません。
- 以下のコードのように、コンストラクタ実行時以外のタイミングで例外を発生させるとエラーが発生します（この場合はApexエラーの通知メールが送信されます）。

```java:MyPageController.cls
public class MyPageController {
  public void init(){
    throw new NoDataFoundException();
  }
}
```

```xml:MyPage.page
<apex:page controller="MyPageController" acition="{!init}">
</apex:page>
```

実行結果：
<img width="480" src="https://qiita-image-store.s3.amazonaws.com/0/39902/bc158f76-0b67-c56d-4472-594d0128470d.jpeg">

##参考リンク
- [Exception クラスおよび組み込み例外 - Force.com Apex コード開発者ガイド](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_classes_exception_methods.htm)
PHP Framework Over 5.6

フレームワークについて言えば、PHP7を機に5.6以上でまた節目を迎えるため乗り換えるとしたらどのような候補になるかざっと調べてみました。

中でもキーとなるポイントは以下の通りだと思います。

- [PSR-7](https://github.com/php-fig/http-message)のRequestInterface, ResponseInterface
- [container-interop](https://github.com/container-interop/container-interop)のContainerInterface
- コンポーネント毎のバージョニング
- composerの徹底活用

Zendframework3について
http://www.slideshare.net/blanchonvincent/zf3-introduction

上のスライド内の4つ目にベンチマーク結果があったのでこちらを参考にパフォーマンス順にピックアップしてみました。

## Phalcon2

- 2系からZephirで開発されている。ソースを追いかける場合注意
- php-extensionとして作られているため、レンタルサーバーには不向き
- 高パフォーマンス
- PSR-7やContainer-Interopは継承していないが、独自実装

## Slim3

- マイクロフレームワークの中でも非常にシンプル
- PSR-7やContainer-Interopを継承
- フレームワークにあってほしいSessionの実装が見当たらない
 
## kohana3

- HMVC
- Cascading Filesystemが特徴
- PSR-7は継承していないが、独自実装
- ContainerやDIなし
- Namespace使ってない

## Silex

- マイクロフレームワーク
- Symfony2のコンポーネントを使用
- PSR-7は継承していないが、独自実装
- Container-Interopは非継承。ContainerはPimple
- 1系はPimpleが1系、2系になってから3系なので注意

## Codeigniter3

- シンプルなMVC
- 前バージョンからの正統進化
- PSR-7やContainer-Interopは継承していない。
- Namespace使ってない

## Laravel5

- 人気もあり最有力候補
- PHP5.5.9以上必須
- Symfony2のコンポーネントを使用
- artisanコマンド
- PSR-7やContainer-Interopは継承していないが、独自実装
- ライブラリとしてコンポーネント毎に利用可能

## FuelPHP

- Codeigniterからの派生フレームワーク
- oilコマンド
- PSR-7やContainer-Interopは継承していない
会社のインターホン代わりを作る


会社の受付にピンポンやインターホンがないので、金属のドアをドンドン、ガチャ（オートロックなので空きませんが）となってしまい集中している時には特に驚きます。たまに音のでかい人も。。。
そんなわけで、社内にいるメンバーを呼び出す仕組みを検討してみました。


###今回のイメージはこんな感じ
![quad_caller.001.png](https://qiita-image-store.s3.amazonaws.com/0/46374/e262f003-1b43-00a3-9f19-ec04d2b7fe47.png "quad_caller.001.png")

###さっそくTwilioの設定
http://twilio.kddi-web.com/

Twillioのアカウントを作成後に、ダッシュボードの電話番号メニューから電話番号を取得しますが、
SMSを送る場合は日本の番号ではSMSを送れないので、USの番号などで取得して下さい。
![スクリーンショット_2015-12-17_18_02_42.png](https://qiita-image-store.s3.amazonaws.com/0/46374/8d59924e-f344-5562-3776-f846a7e39b77.png "スクリーンショット_2015-12-17_18_02_42.png")


###Twilio APIを使うためにAccount SIDとAuth Tokenを取得する。
![スクリーンショット_2015-12-17_18_37_08.png](https://qiita-image-store.s3.amazonaws.com/0/46374/bc7da0c0-e149-9e1f-e4dd-ff3d9a2c2e8d.png "スクリーンショット_2015-12-17_18_37_08.png")


###SMSを送信するために電話番号を登録する。
![スクリーンショット_2015-12-17_18_36_38.png](https://qiita-image-store.s3.amazonaws.com/0/46374/c526c4bc-af07-63d2-9f4d-3c8865a46b79.png "スクリーンショット_2015-12-17_18_36_38.png")


###Twilio APIライブラリーをダウンロードします。
https://jp.twilio.com/docs/libraries

今回はPHPで開発。
ローカルの開発環境はVagrantを利用して構築する。
[こちらを参照](http://qiita.com/segawa/items/e77985ed2c107505930e)

###正しく動作することを確認
https://jp.twilio.com/docs/php/install

```php:send-sms.php
<?php
 
require "/path/to/twilio-php/Services/Twilio.php";
 
// set your AccountSid and AuthToken from >www.twilio.com/user/account
$AccountSid = "ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
$AuthToken = "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY";
 
$client = new Services_Twilio($AccountSid, $AuthToken);
 
$message = $client->account->messages->create(array(
    "From" => "YYY-YYY-YYYY",
    "To" => "XXX-XXX-XXXX",
    "Body" => "Test message!",
));
 
// Display a confirmation message on the screen
echo "Sent message {$message->sid}";
```

AccountSid, AuthToken,FromにはTwilioの電話番号(国番号付),Toに送り先電話番号（登録済みの番号）を設定します。

こちらにアクセスし、SMSが受信できることを確認します。
http://localhost:8080/send-sms.php


今日は環境構築までを実施しました。
次は画面から任意の人へ連絡する部分を作ります。
IE9以上で背景画像とグラデーションを同じ要素に指定

グラデーションと背景画像を同じ要素に指定したい場合、IE10以上と他のモダンブラウザの指定方法は調べれば色々出てくるのですが、IE9も対応させる方法があまりなかったのでメモ代わりに。

やり方はIE9のグラデーションでよく見るfilterは使わずに、SVGを使います。

**サンプル**

```
/* IE9 */
background: url(images/dummy01.png) no-repeat top left, url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2JjZWFmZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmZmZmZmYiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);

/* Android4.1 - 4.3 */
background: url(images/dummy01.png) no-repeat top left, -webkit-linear-gradient(top,  #bceaff 0%,#ffffff 100%);

/* IE10+, FF16+, Chrome26+ */
background: url(images/dummy01.png) no-repeat top left, linear-gradient(to bottom,  #bceaff 0%,#ffffff 100%);

```

それぞれのブラウザに対応したソースを自分で書くのは大変ですが、下記サイトのように簡単に作成できるジェネレータがあるので、それを使えばSVGも含めて一括で生成してくれます。

http://www.colorzilla.com/gradient-editor/

サンプルの書き方だとIE8以下が対応できませんが、最近はIE8の対応はだいぶ無くなってきたので問題ないかと。

ちなみに、IE用のfilterでグラデーションをつけると何段階も色を変えるグラデーションは作れなかったり、border-radiusと一緒に使うと角丸が効かなかったりしましたが、SVGではどちらも反映されるのでIE9で苦労した方は是非一度試してみてください。
CentOS 6.xにPHP7をインストールしてみる。

PHP7が正式にリリースされたらしいので実験がてらCentOSにPHP7をインストールしてみようと思います。
今回の環境は、CentOS6.7でまだyumでphpのインストールはしていない状態です。

##　PHP7が取得できるrpmを入れて下準備
```
# rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm
```

## yumでPHP7をインストール！
```
# yum install php70w php70w-common php70w-devel php70w-intl php70w-mysql php70w-mbstring php70w-gd php70w-pear php70w-mcrypt
```

念のためインストールされたPHPのバージョン確認

```
# php -v
PHP 7.0.0 (cli) (built: Dec  2 2015 21:42:51) ( NTS )
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0, Coyright (c) 1998-2015 Zend Technologies
```

rpmさえ入れてあげればインストールはものすごく簡単でした。
試験投稿 > 依存性の逆転 > UML図


http://qiita.com/tukiyo3/items/840b52027be03d270b0a
と
http://qiita.com/ozwk/items/0b97bc2053e3e22b960e
を足してみるテスト。

## 依存しているケース

![](http://yuml.me/diagram/class/[note:具象クラスに依存しているので　扱いにくい。{bg:cornsilk}],[クラス]依存 -.->[具象クラス])

## 依存性を逆転させたケース

![](http://yuml.me/diagram/class/[クラス]依存 -.->[インターフェース], [インターフェース]<-.-依存[具象クラス],[note:インターフェースを 使って抽象化して、 依存性を逆転させた。{bg:cornsilk}])


参考　
http://yuml.me/diagram/scruffy/class/samples
シーケンシャルな日付を生成するスクリプト



Usage

```shell-session
Usage: seq_date [options]
    -s yyyy-mm-dd
    -e yyyy-mm-dd
```

script

```rb
#!/usr/bin/env ruby
# encoding: utf-8

require 'date'
require 'optparse'

start_date = nil
end_date = nil

opt = OptionParser.new

opt.on('-s yyyy-mm-dd') {|v| start_date = v }
opt.on('-e yyyy-mm-dd') {|v| end_date = v }
opt.parse!(ARGV)

if start_date.nil?
  sd = Time.now.to_date
else
  sd = Date.parse(start_date)
end

if end_date.nil?
  ed = Time.now.to_date
else
  ed = Date.parse(end_date)
end

d = sd
while d <= ed
  puts d.to_s
  d = d.next_day
end
```
Sketch3を始める前に読むべき記事6選


kotaziです。
- [kotazi.com](http://kotazi.com)

AdobeCreativeCloudを会社で利用しようとしたら断られてしまった。  
基本的なAdobeツールの使い方を理解している人間が最速でSketchを使いこなすために。

<hr>

## 基本説明・充実系

- [Sketch 3 Book for Beginner](https://leanpub.com/sketch3book/read)

まずはこれに目を通すこと。

- [アプリUI制作のチュートリアルで学ぶSketchの使い方|ASCII.jp](http://ascii.jp/elem/000/001/032/1032101/)

シンプルなチュートリアルで基本的な使い方を理解できる。


## ショートカット系

- [Sketch 3のページ・レイヤーを自在に操るショートカット|whiskers](http://whiskers.nukos.kitchen/2015/04/08/sketch-page-layer-shortcuts.html)

レイヤー操作のショートカット記事。細かい操作を物にするには必須。

- [Sketch 3を使いこなすためリンクやメモ|whiskers](http://whiskers.nukos.kitchen/2014/11/04/sketch-links.html)

ショートカット知れるし、こういう機能があるんだということも知れる良い記事。

## TIPS系

- [Sketchの使い方: 初心者がマスターしておきたいSketchでのデザイン作業がぐっと効率的になるチップス|coliss](http://coliss.com/articles/build-websites/operation/design/10-sketch-tricks-by-assentorp.html)

実践的でいい。

## おすすめプラグイン系

- [Sketchを更に便利にパワーアップするプラグインのまとめ|coliss](http://coliss.com/articles/build-websites/operation/design/best-plugins-for-sketch.html)
Magento2になって商品登録の際に可能になったことあれこれ

この記事は[Magento Advent Calendar 2015](http://www.adventar.org/calendars/931)の17日目です
前日は[「Magento2システムアーキテクチャの基礎」をざっくり翻訳しました](http://qiita.com/kzkiq2nd/items/10006cd10ed29b069eb7)になります。
今回、Seto Masakazu さんに変わりまして@OG3_Asaxが書きます。

#　はじめに
Magento1ですら生まれて初めて触り始めてから３日のど素人が、@kzkiq2ndさんの『[祝Magento2.0リリース。新世代の最強EC、Magento2をVagrantで早速動かしてみよう。](http://qiita.com/kzkiq2nd/items/0318780b8401f5fa8948)』の記事を元に、ローカル環境にMagento2を突っ込み、いろいろいじってみました。今回は商品登録にフォーカスを当てて(デフォルト状態で)M2になって可能になったことについてざっくり書いていきたいと思います。
技術系の記事が多い中、ふわっとしたチラシの裏的な記事になってしまいますがご容赦いただければと思います。

#商品ページに動画利用可に
商品登録の際に商品イメージとして動画を追加できるようになりました。

登録方法は商品登録の際にAddVideoで登録し

![スクリーンショット 2015-12-17 17.58.11.png](https://qiita-image-store.s3.amazonaws.com/0/106006/e307358b-dc7d-2b96-bc45-a5c6ee635b23.png)

urlやタイトルなどに必要な情報を入力しSaveボタンを押下で登録できます。

![スクリーンショット 2015-12-17 18.24.00.png](https://qiita-image-store.s3.amazonaws.com/0/106006/e36583d6-60d6-2a1d-3caf-09d195470541.png)



Vimeoの動画はデフォルトで対応されており
Youtube Api keyを取得すれば、Youtubeの動画も利用可能です。
商品のサブ画像としてはもちろん、商品のメイン画像にも利用できるので
ユーザーが商品画面を開いた瞬間に当該商品の広告の動画を流すといったことも可能になります。

![スクリーンショット 2015-12-17 18.11.40.png](https://qiita-image-store.s3.amazonaws.com/0/106006/d9f89ac3-a5fb-10c0-3513-2a776c8e40e4.png)

#電子商材も商品として登録可能に
商品登録の際に電子商材みたいなDownloadableな商品も登録可能になりました。

![スクリーンショット 2015-12-17 18.39.02.png](https://qiita-image-store.s3.amazonaws.com/0/106006/03b40ad3-e793-b60c-e656-728ee73f4c54.png)

これらの商品は購入後にダウンロード可能になります。
この商品独自の内容も細かく設定可能で

- 購入後にリンク解放orファイルダウンロードを個別設定可能
- 一つの商品に複数ファイルを登録し、個別に料金設定が可能
- ダウンロード回数をファイルごとに設定可能
- サンプル用ダウンロードを設定可能

といったことが可能です。

楽譜や電子書籍などの販売サイトなどが世の中には数多ありますが、これらのサイトをM2をつかって
比較的簡単に似たようなサイトを構築することが可能となっております。

#終わりに
 商品登録は管理画面が変わったこともあり、ぱっと見大きく仕組みが変わったような気がしましたが
 実際は設定項目として設定できることはM1とM2で変わっていないように思えます。 
 その代わりmagento2にデフォルトのままでできることや、商品の属性値の自動設定などをしてくれたりなど断然ユーザーフレンドリになったように感じます。
 今回はさらっと触っただけですが、今後Magento2をいじり倒して、使いこなせるようになりたいと思います。

#今回の記事を書くにあたっての構築環境
- OSX 10.10.4
- Vagrant 1.7.4
- VirtualBox 5.0.10
- ansible 1.9.4

Vagrant環境の構築は [VAM2 - Vagrant Ansible Magento 2](https://github.com/Magento-Japan/VAM2)を利用させていただきました。

次回は@katzueno さんになります。よろしくお願いします。
DOM上のIDの重複を検出する

HTML5においても、要素のIDの重複は許容されません。

大規模なHTMLファイルや動的なDOMを扱う際、IDが重複しているかどうかを調べるのは[Validator](https://validator.w3.org/)ではちょっとやりづらいです。

そこで、ID重複を検出する簡易なチェッカーを作ってみました。

本チェッカーは``document.getElementById``などでは取得できないID重複したDOM要素を、``document.querySelectorAll('[id]')``のように属性セレクタを用いて複数取得できるという発見を利用しました。
（ただし、IDに対する属性セレクタの仕様を確認していないため、本手法が有効でないブラウザーがあるかもしれません。）

以下がチェッカーです。

```js:pickup-duplicate.js
const idArr = []
const duplicateIdArr = []

document.querySelectorAll("[id]").forEach(elm => {
    const id = elm.getAttribute("id")
    if (idArr.includes(id)) {
      duplicateIdArr.push(id)
    } else {
      idArr.push(id)
    }
})

if (duplicateIdArr.length > 0) {
  console.log("IDの重複があります:", duplicateIdArr)
} else {
  console.log("IDの重複はありません。")
}
```

これを以下のHTMLファイルを開いた上で開発者ツールのコンソールで実行すれば

```html:no-duplicate.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>has only unique ids</title>
</head>
<body>
  <div id="aaa"></div>
  <div id="bbb"></div>
  <div id="ccc"></div>
  <p id="ddd"></p>
  <div id="eee"></div>
</body>
</html>
```

```
IDの重複はありません。
```

このように重複がないことが確認できます。

一方、以下のようなID重複のあるHTMLで実行すると

```html:duplicate.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>has duplicate ids</title>
</head>
<body>
  <div id="aaa"></div>
  <div id="bbb"></div>
  <div id="ccc"></div>
  <p id="aaa"></p>
  <div id="bbb"></div>
</body>
</html>
```

```
IDの重複があります: ["aaa", "bbb"]
```

と、重複したID名の一覧が表示されます。
HomebrewのGroongaのFormulaで将来的にやりたい事リスト

[Groonga Advent Calendar 2015](http://qiita.com/advent-calendar/2015/groonga)の17日目の記事です。

# はじめに

GroongaのFormulaはHomebrew本家に取り込まれており、

```bash
$ brew install groonga
```

でインストールする事ができます。
ただし、デフォルトのオプションではsuggestプラグインがビルドされず、lz4圧縮がサポートされていない状態でのGroongaがインストールされます。

## 将来的にやりたい事リスト

1. lz4をデフォルトで有効にする
2. suggestプラグインをデフォルトで有効にする
3. libstemmer-cに依存しているプラグインをビルド出来るようにする（デフォルト無効でもよい）

## それぞれどのようにしたら達成出来そうか

### lz4をデフォルトで有効にする

1から見ていきましょう。これは、

デフォルトのargsに含める: https://github.com/Homebrew/homebrew/blob/0ba8c8b4ba0f9d83d51d3645e160c03972f45626/Library/Formula/groonga.rb#L56

optionalを外す: https://github.com/Homebrew/homebrew/blob/0ba8c8b4ba0f9d83d51d3645e160c03972f45626/Library/Formula/groonga.rb#L29

で達成出来そうですね。

### suggestプラグインをデフォルトで有効にする

これも、

条件分岐をなくす: https://github.com/Homebrew/homebrew/blob/0ba8c8b4ba0f9d83d51d3645e160c03972f45626/Library/Formula/groonga.rb#L34-L37

zeromqを毎度enableにする: https://github.com/Homebrew/homebrew/blob/0ba8c8b4ba0f9d83d51d3645e160c03972f45626/Library/Formula/groonga.rb#L47-L52

とするとできそうですね。

### libstemmer-cに依存するプラグインをビルド出来るようにする。

これが一番難しいかもしれません。実はHomebrewにはlibstemmer_cのFormulaがありません。また、snowball-cのホームページが移設された関係上、以前はアクセス出来ていたtarballがダウンロード出来なくなってしまっています。そのため、新たにFormulaを作成する必要があります。ただし、完全に新規に作成と言うわけではなく、 https://github.com/cosmo0920/homebrew-tokenizers/blob/master/libstemmer.rb  というlibstemmerのCライブラリをインストールする以前書いたFormulaがあるので、これを参考にすると良いでしょう。

## おわりに

GroongaのHomebrewでのFormulaの課題の現状を解説しました。
本番環境はLinuxですが開発はOS X上で行う、という開発者さんも少なくないと思います。

現状CentOSとUbuntu, Debian, FedoraでのLinux向けのサポートはかなり活発に行われていますが、OS Xや挙げた以外のLinuxディストリビューションでのサポートはベストエフォートでの対応となっています。特にOS Xを使っているのであれば、まだまだ改善するべき点が多く残されています。

OS XでGroongaをお使いのユーザーさんはこれを機にHomebrewへの貢献に挑戦してみませんか？

それではOS Xでも良い全文検索を！
ObjCとSwiftでの相互利用マクロ・属性まとめ


１からフルSwiftでコードが書ければ良いですが、多くの人は大きなObjective-Cの遺産を抱えながらSwiftを書いていると思います。
今すぐにObjCをSwiftに書き換えることはできないけれど、ちょっとSwiftでだと使いづらい！とか、
SwiftでつくちゃったけどObjCでもうまいこと使いたい！という時に用意されたマクロや属性が用意されています。

# Swift用ObjCマクロ

## NS_SWIFT_NAME

### ファクトリメソッドの名前変更
このマクロを用いることで、Swift上でのファクトリメソッドの名前を変更できます。

```objc
+ (instancetype)objectWithName: (NSString *)name NS_SWIFT_NAME(init(name:));
```

とすることでファクトリメソッドをイニシャライザとして扱えます。

```swift
let obj = MyObjCObject(name: "name")
```

しかし、ObjCの宣言がinstancetypeでなければinitにはできません。その場合は別名のファクトリメソッドにできます。

```objc
+ (id)objectWithName: (NSString *)name NS_SWIFT_NAME(object(name:));
```

```swift
let = obj = MyObjCObject.object(name: "name")
```

### enumの名前変更

このマクロを利用するとenumの名前も変更できます。

```objc
typedef NS_ENUM(NSUInteger, MyEnum) {
    MyEnumYes NS_SWIFT_NAME(True),
    MyEnumNo NS_SWIFT_NAME(False)
};
```

```swift
MyEnum.True
MyEnum.False
```

## NS_SWIFT_UNAVAILABLE
定義の後にこのマクロをつけることで、Swiftでは利用できないことを宣言できます。

```objc
- (void)iHateSwift NS_SWIFT_UNAVAILABLE("Don't Use In Swift");
```

クラスの前につければクラスごと利用不可にできます。

```objc
NS_SWIFT_UNAVAILABLE("Don't use it")
@interface MyObjCOnlyObject: NSObject

@end
```

## NS_REFINED_FOR_SWIFT
Swiftで利用する際にメソッドの最初にアンダースコア２つ(__)付いたメソッドができます。
これはSwiftの利用を完全には制限しませんが、Swiftのextensionなどで、別名でSwiftの利用に即した
実装を行いたい場合に用います。

```objc
- (void)unrecommendMethodInSwift NS_REFINED_FOR_SWIFT;
```

```swift
MyObjCObject().__unrecommendMethodInSwift()
```


## NS_SWIFT_NOTHROW
ObjCでerror pointerを用いるメソッドの場合Swift上ではthrowsに変換されますが、これをさせないようにします。

```objc
- (BOOL)doWithError:(NSError **)error NS_SWIFT_NOTHROW;
```

```swift
var error: NSError?
MyObjCObject().doWithError(&error)
```

余談ですが、NSURL#checkPromisedItemIsReachableAndReturnErrorはベータの途中までthrowsにしていて、
WWDCで例として ~~どや顔で~~説明してたんですが、no throwになりましたね。

# SwiftからObjC

## @objc
@objc属性でObjCで利用できることを明示的に宣言できますが、その後に()でObjC上の名前を変更できます。

```swift
@objc(callMe)
func echo() {
    print(self.name)
}
```
```objc
[[MySwiftObject new] callMe];
```

## @nonobjc

@nonobjcでObjCで使える条件を満たしていても使えないようにできます。

```
@nonobjc
func cannotUseObjC() {
    echo()
}
```

## Swiftで実装しつつObjCでしか使えないようにする
Swiftで実装したものの、ObjCでも利用したいが、構造体などを使っていて利用できないといった場合があります。
その時ObjC用にバックポートを用意してあげたいですが、このバックポートをSwift上で使ってほしくない時にこの技が使えます。

```
@available(*, unavailable)
@objc func canUseOnlyObjC() {
    echo()
}
```

avaiableでSwiftでunavailableを宣言してSwift上で利用不可にしつつ、@objc属性でObjCでの利用を許可します。
これでSwiftで実装してるのにObjCでしか使えないものが定義できます。


# あとがき

ObjCの遺産を活用しながらSwiftを使いたいけど、ObjCはSwiftのことなんか考えてないことが多いと思います。
これらの相互利用の機能を利用して、少しでも快適なSwift/ObjCライフが送れたらいいですね！
Mac+mamp+php+websocketでチャット通信してみる

参考URL
[PHPのみでHTML5のWebSocketを体験する方法](http://d.hatena.ne.jp/susan-style/20140306/1394103655)
ここでダウンロードできるチャットサンプルを使って動作を確認。
ダウンロードファイル
http://www.sanwebe.com/downloads/50-websocket-example
[中身]
chat
├── ReadMe.md
├── index.php
└── server.php

以下の流れでいろいろ確認してみる
・MAMP環境で実行する
・チャットスクリプトがlocalマシンで動作すること確認。
・iphoneなど別のデバイスからアクセスして動作すること確認。
・ソースの中身を確認
　別記事参照：[チャット通信ソースを読み解いてみる]未公開

#MAMP環境
・DocumentRoot: /Applications/MAMP/htdocs/
・現在、MAC標準Apacheと被らないようにポートを8888に設定している
・ダウンロードスクリプト群はchatフォルダに格納
　　http://localhost:8888/chat/
　でアクセスができる状態

#チャットスクリプトを自分環境に合わせる
自分マシンだけで確認するのであれば、localhostのままで動きます。

1.index.php（クライアントファイル）43行目あたりにserver.php（サーバファイル）へのアクセスURLが書かれているので、自分パスにかえます。
　　*var wsUri = "ws://localhost:9000/chat/server.php";*
コマンドラインでserver.phpを実行させます。

```
$ php -q server.php
```
2.ブラウザでアクセスします。http://localhost:8888/chat/　
　　Connected!
　　127.0.0.1 connected
と出てくれば成功！
![スクリーンショット 2015-12-17 17.38.59.png](https://qiita-image-store.s3.amazonaws.com/0/39911/658f8f38-7f36-add8-d602-5b43cca3bec6.png)
２つのブラウザでやりとりをしてみると、リアルタイムにそれぞれ更新されていきます。
![スクリーンショット 2015-12-17 17.41.51.png](https://qiita-image-store.s3.amazonaws.com/0/39911/29d8464c-61b9-da22-d5f5-a41f9ec08898.png)

＜ちょっとメモ＞
URLにアクセスしたときに
![スクリーンショット 2015-12-17 17.25.22.png](https://qiita-image-store.s3.amazonaws.com/0/39911/f6466f75-cbdb-b8f5-51af-67e16a713d12.png)
　　Error Occurred - undefined
　　Connection Closed
と出ているならば、servar.phpが実行されていないせいです。


＜大きな間違いメモ＞
自分の環境ではポート8888を設定していたため、ポートまで指定してIPを書かなくてはいけないのかと思っていた。
サンプルでは9000ポートを使用している。
8888ポートを使用しながら9000ポートも設定するのにはどうしたらいいのか？って考えてしまっていた。
やってしまった間違い
>
```index.php（クライアントファイル）43行目のserverファイルへのアクセス間違い
var wsUri = "ws://localhost:8888/chat/server.php";
```
```server.php（サーバファイル）3行目の$port設定
$post = '8888';
```
これでserver.phpを実行すればすでにポートは使用されているエラーになります。
*$ php -q server.php*
*Warning: socket_bind(): unable to bind address [48]: Address already in use in /Applications/MAMP/htdocs/chat/server.php on line 13*

server.phpに設定するポートは現在使用されていないポートを設定する必要があります。
8888はブラウザ表示にすでに使用しているので使えません。
使用されていないポート:9000を設定し、コマンドラインで実行すると、server.phpが口を開けて待ってる状態になります。
そこで、index.php（クライアントファイル）のはその口に飛び込むようにすればいいだけです。
　　*var wsUri = "ws://localhost:9000/chat/server.php";*

#別のデバイスからアクセスしてみる
設定がlocalhostのままだとLOCALネットワークの状態でもアクセスできません。
自分のPCがIPなんなのかを調べます。
macはifconfigでわかります。

```index.php（クライアントファイル）43行目のlocalhostを変える
var wsUri = "ws://192.168.**.**:9000/chat/server.php";
```
```server.php（サーバファイル）2行目の$hostを変える
$host = '192.168.**.**';
$port = '9000';
```
ipを指定したら、自分のマシンでは
http://localhost:8888/chat/
でアクセスしても構いませんが、別デバイスではserver.phpが動作しているPCのIPでアクセスします。
http://192.168.**.**:8888/chat/
iphoneのIPが表示されて、*connected*　ってでてきてればチャット完成！！
![スクリーンショット 2015-12-17 18.13.52.png](https://qiita-image-store.s3.amazonaws.com/0/39911/f1f00d7e-1d17-3e86-59cc-e6fe4bfa166d.png)

サンプルコードを一切見ていないのでこんなにも簡単にできてしまいましたが、ソースコードを読み解いてみます！
別記事：[チャット通信ソースを読み解いてみる]未公開
arduinoとMilkcocoaで生体IoT事始め


Milkcocoa AdventCalendar 13日目を担当します、<a href='https://twitter.com/shanonim'>shanonim</a>です。
12/16に<a href="https://atnd.org/events/71990">JSオジサン</a>でLTした内容にちょっと補足して書いてみたいと思います。
LTしたスライドはこちらです。
https://speakerdeck.com/shanonim/heartbeat-sensor-on-node-dot-js

# きっかけ

何かおもしろいIoTネタないかなぁと思って探していたところ、とあるセンサーに出会いました。
https://www.switch-science.com/catalog/1135/
![1135_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/38442/7f6e266e-1e9c-c8fa-e94e-10fd44f8c9ce.jpeg)

アナログ出力で簡単に心拍データを取れるとのことで、そのデータを使って何かできないかと考えてみたのがきっかけです。

# 動かしてみた
github上にサンプルスケッチがあるので簡単に使えます。
https://github.com/WorldFamousElectronics/PulseSensor_Amped_Arduino

ただ、今回はarduinoを<a href="http://johnny-five.io/">johnny-five</a>上で動かしたかったので、結局サンプルスケッチ（C言語）をNode.jsで書き直しました。

取得できるデータはこんな感じです。
BPM＝心拍数なのですが、今は20~30くらい高めの数値が表示されてしまいます。（現在調整中。。）
<img width="498" alt="スクリーンショット 2015-12-15 19.24.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/6032b3ef-ecbd-f091-e75d-db26333d9ff0.png">

# 可視化してみた
数値は取れたけど変化がわかりにくいということで、データをMilkcocoaに送って<a href="https://freeboard.io/">freeboard</a>で可視化してみました。

・Milkcocoa管理画面の「データ可視化」を選択します
<img width="1027" alt="スクリーンショット 2015-12-17 16.56.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/549e453e-7c0a-3d47-972f-a9c56e81e353.png">

・freeboardの画面で「DATASOURCES」を選択して概要を入力します
<img width="945" alt="スクリーンショット 2015-12-17 16.58.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/52cad153-b168-55da-0017-9562afc7cfa0.png">

<img width="964" alt="スクリーンショット 2015-12-17 16.59.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/f89d4863-1c99-745a-bb51-ef3eb0b2ece9.png">

・「ADD PANE」を選択して、TYPE（グラフの種類）、TITLE、VALUE（Milkcocoaのデータ指定）を決定します
<img width="420" alt="スクリーンショット 2015-12-17 17.00.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/abfb8bd0-e56e-f759-9a7e-df349a626a3d.png">

<img width="940" alt="スクリーンショット 2015-12-17 17.00.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/1dfa3605-a1c3-d617-601f-fb19eccba78a.png">

・新しいデータがMilkcocoaに送信されるとリアルタイムにグラフが作成されます
<img width="306" alt="スクリーンショット 2015-12-11 20.47.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/29e402b7-a43c-45c0-4ed4-b6b695c0edff.png">

リアルタイムに更新されるオンライン心電図を作ることができました👏ﾊﾟﾁﾊﾟﾁ

# 活用してみた
データの活用例として、今回は「ねむみ感知」の仕組みを作ってみました。

- 眠くなると徐々に心拍数が下がってくる（らしい。）参考リンク：http://itpro.nikkeibp.co.jp/article/COLUMN/20060302/231616/
- 直近数十回の心拍数をサンプリングして平均心拍数を計算する
- 平均心拍数が一定の傾きで低下し続けている場合、眠い状態と判定する
- 起こす。（今回はslack通知）

※「slack通知程度じゃ起きないのでは？？？」とご指摘頂いたので、今後は天井からたらいを落とすなど、確実に起床できる方法を模索する予定です。

まだ仕組みが不完全なので、今後サンプリングの回数や傾きの値を調整して、正確にねむみの検知をできるようにしたいと思います。

# まとめ
IoTで使うセンサーって取り出した数値だけ見てもなかなか実感が湧かないので（特にアナログの場合）、データの可視化がめちゃくちゃ重要です。逆にデータが目に見えたら活用イメージが湧いてきた！とか結構あると思います。
その上で、<b>Milkcocoaは標準でデータを可視化できる機能がサポートされていて最高！！！</b>ということを今日は伝えたかったのでした。


それにしても生体データとインターネット繋げて色々やってみるってSF感あって超楽しいですね。。完全に攻殻機動隊とかHarmonyの世界です。
次は脳波IoTとかやりたいなぁと画策しておりますゆえ、良いセンサーとか事例があったらコメント頂けると嬉しいです。エル・プサイ・コングルゥ。
OpenJDK9のビルド

OpenJDK9をソースコードからビルドしてみたので、その手順をメモ。

# 環境

| |version|
|:--|:--|
|OS|Ubuntu 15.04 (kernel 3.19.0-39-generic) x86_64|
|jdk|9-internal (build 9-internal+0-2015-12-15-112158.vagrant.OpenJDK9)|

# OpenJDK9のビルド
OpenJDKの[jdk9リポジトリ](http://hg.openjdk.java.net/jdk9/jdk9)からmercurialでソースコードを取得し、ビルドする。
なおコードベースにはjavaファイルが含まれているため、そのビルド用にaptからOpenJDK8のバイナリをインストールしておく。

```text:OpenJDK9インストール
$ sudo apt-get update
$ sudo apt-get upgrade -y
$ sudo apt-get install build-essential -y
$ sudo apt-get install libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev -y
$ sudo apt-get install libasound2-dev libfreetype6-dev libcups2-dev -y
$ sudo apt-get install zip unzip mercurial -y
$ sudo apt-get install openjdk-8-jdk -y
$ unset JAVA_HOME
$ export LANG=C
$ export PATH="/usr/lib/jvm/java-8-openjdk-amd64/bin:${PATH}"
$ hg clone http://hg.openjdk.java.net/jdk9/jdk9 OpenJDK9
$ cd OpenJDK9/
OpenJDK9$ sh ./get_source.sh
OpenJDK9$ sh ./configure
OpenJDK9$ make all
```

ネットワーク状況とビルドマシンのスペックによるが、ソースコード取得とビルドには数十分という単位ではなく、数時間という単位で時間がかかるので注意。

## ビルド時に遭遇したエラー１
`sh ./get_source.sh`の最中に下記のようなメッセージが表示されていた場合、ソースコード取得に失敗している（ネットワーク環境が良くないと、転送途中でセッションがタイムアウトしてabortするるようだ）。
この場合、全てのリポジトリが正常に取得できるまで、`sh ./get_source.sh`を繰り返せば良い。

```
                  jdk:   abort: stream ended unexpectedly (got 9616 bytes, expected 12490)
WARNING: jdk exited abnormally (255)
```

## ビルド時に遭遇したエラー２
今回はVagrantで起動した仮想マシン上でビルドをしていたが、メモリ不足でビルド途中でコケた。Vagrantはデフォルトで480MB程度しかメモリを割り当てないので、2GBぐらいメモリを与えたほうが良い。

```
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 25473024 bytes for committing reserved memory.
```

# ビルド結果
ビルドに成功すると、`OpenJDK9/build/linux-x86_64-normal-server-release/images/`以下にjdkやjreのディレクトリが作成されている。生成されたjdkディレクトリをJAVA_HOMEに指定すれば、生成されたjavaやjavacを利用することができる。

```
$ export JAVA_HOME=/home/vagrant/OpenJDK9/build/linux-x86_64-normal-server-release/images/jdk
$ export PATH=$JAVA_HOME/bin:${PATH}
$ java -version
openjdk version "9-internal"
OpenJDK Runtime Environment (build 9-internal+0-2015-12-15-112158.vagrant.OpenJDK9)
OpenJDK 64-Bit Server VM (build 9-internal+0-2015-12-15-112158.vagrant.OpenJDK9, mixed mode)
```
プリンタでの印刷をコマンドから行なう方法見つけた!: メモ

結論からいうと、```lpr``` ```lprm```この２つのコマンド
これを使うと、コマンドラインからプリンターにデータを送って印刷する事ができる。

具体的には、このように使う。

```sh
lpr hoge.txt /etc/hosts.equiv
```
```sh
lpr hoge.pdf /etc/hosts.equiv
```

このようにすることで、txtファイルならば、ディストリビューションに沿ったデフォルト形式で出力される。
pdfファイルの場合は、自動的にそれを認識して、そのまんまを印刷してくれる。

また、/etc/hosts.equiv を指定すると、デフォルトになっているプリンタを指す。（らしい）

次に、lprmコマンドであるが、これは、lprなどで送ったデータの印刷キュー内の印刷ジョブを取り消す事ができる。
JDBCドライバサポートマトリクス

JDBCドライバのサポートマトリクス。
ドライバのダウンロードも可能。
[PostgreSQL JDBC Driver] https://jdbc.postgresql.org/download.html

以下、抜粋（2015/12/17時点）
> JDK 1.1 - JDBC 1. Note that with the 8.0 release JDBC 1 support has been removed, so look to update your JDK when you update your server.
JDK 1.2, 1.3 - JDBC 2.
JDK 1.3 + J2EE - JDBC 2 EE. This contains additional support for javax.sql classes.
JDK 1.4, 1.5 - JDBC 3. This contains support for SSL and javax.sql, but does not require J2EE as it has been added to the J2SE release.
JDK 1.6 - JDBC4. Support for JDBC4 methods is not complete, but the majority of methods are implemented.
JDK 1.7 - JDBC41. Support for JDBC4 methods is not complete, but the majority of methods are implemented.
JDK 1.8 - JDBC42. Support for JDBC4 methods is not complete, but the majority of methods are implemented.`code`


念の為、キャプチャ（2015/12/17時点）
![suport.png](https://qiita-image-store.s3.amazonaws.com/0/106019/fad5339a-235d-f6b9-acf9-c189ad848fc0.png)
GAE/J でアクセスログをダウンロードする

IaaS全盛でいまいちメジャーになりきれないGAE。
でもインフラレイヤーが完璧に隠蔽されているって、アプリよりなエンジニアからするととてもいいな〜と思っています。

で、アクセスログ。
Developer Consoleからも見れるっちゃ見れるんですが、いまいち使い勝手が良くない印象です。
手元にさえダウンロードできれば、どうにでも料理できるものを。

ということでダウンロードする方法を調べてみました。

```sh
cd appengineのSDKディレクトリ
sh ./appcfg.sh -n [何日前からのログをダウンロードするか] request_logs [アプリのwarディレクトリ] [ログの出力先]
```


例

```sh
cd ~/Downloads/eclipse/plugins/com.google.appengine.eclipse.sdkbundle_1.9.21/appengine-java-sdk-1.9.21/bin/
sh ./appcfg.sh -n 90 request_logs /Users/furu8ma/git/sampleprj/app1/war /Users/furu8ma/Desktop/hoge2.log
```

パスは絶対パスで書かないとエラーが出る印象。
参考になれば。
CodeIQ「マヨイドーロ問題」に参加しました

# 「マヨイドーロ問題」とは

タイトルの通りですが、[CodeIQ「マヨイドーロ問題」](https://codeiq.jp/q/2549)の解答期限が過ぎたということで、提出コードを公開してみたいと思います。この問題は「数学ガール」シリーズでおなじみ(?)の[結城浩先生](https://twitter.com/hyuki)による出題で、正解者のうち10名に最新刊[『数学ガールの秘密ノート／ベクトルの真実』](http://www.amazon.co.jp/%E6%95%B0%E5%AD%A6%E3%82%AC%E3%83%BC%E3%83%AB%E3%81%AE%E7%A7%98%E5%AF%86%E3%83%8E%E3%83%BC%E3%83%88-%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%AE%E7%9C%9F%E5%AE%9F-%E7%B5%90%E5%9F%8E-%E6%B5%A9/dp/4797382325)がプレゼントされるという企画でした。ものがもらえるかもしれないという期待と、先生の知名度および高邁なお人柄が影響してか、挑戦人数が700名を超えるというすごい事態になっていました。

さて実際の問題ですが、どうやら後日[CodeIQMagazine](https://codeiq.jp/magazine/)あたりで、解説記事とともに公開されるようなので、ここでは一応伏しておきます。公開後覚えていればリンクを張り付けておきます。まあ広大なネットの海を探せば見つかるとか見つからないとか……。

***
__2015/12/24追記:__
結城先生ご本人による解説記事が公開されていました。というと今さっき知ったみたいですが、実は前に知っていたものの、ここに追記するのを忘れていたという……。
https://codeiq.jp/magazine/2015/12/35521/
***

# 提出コード

以下はわたしが実際に提出し、無事合格となったソースコードです。使用言語はRuby。たぶん一発合格だったはずです。

```rb
N = gets.to_i

# インデックスが現在地と方向、要素が次の地点となる配列
# (a, b , c) = (0, 1, 2)
# (y, z) = (3, 4)
# (left, right) = (0, 1)
@table = [
    [3, 1],
    [0, 2],
    [1, 4]
]

# 現在地s、方向d、残り回数n : @memo[s][d][n] = f(s, d, n)
@memo = Array.new(5){Array.new(2){Array.new(N + 1)}}

# yにたどり着くルートの総数Pを返す
# s : 現在地(0, 1, 2, 3, 4)
# d : 方向(0, 1)
# n : 方向を変えることができる回数(0..Nを満たす整数)
def f(s, d, n)
    @memo[s][d][n] ||= case
        when s == 3 then 1 # yにたどり着いた
        when s == 4 then 0 # zにたどり着いた
        when n == 0 then f(@table[s][d], d, n) # 方向を変えられない場合はそのまま進む
        else f(@table[s][d], d, n) + f(@table[s][1 - d], (1 - d), n - 1) # そのまま進む + 方向を変えて進む
    end
end

# == main ==
# スタート地点 : 1 (b)
# 方向 : 1 (right)
# 方向を変えることができる回数 : N

p f(1, 1, N)
```

どうやらフィボナッチ数列や漸化式を利用することが求められていたようですが、これを書いている人は頭からっぽ系男子なためにまったく思いつきませんでした……。そこで再帰(正確にはメモ化再帰)で何とかしています。ただこれも場合によっては悪手で、N=2000程度だから無事合格だったものの、Nの値がもっと大きくなるとstack too deepあたりを起こして、にっちもさっちもいかなくなる可能性があります。動的計画法などを利用して、再帰からふつうのループに書き換えるべきでした。もっとも再帰を使うととてもソースコードがすっきりするので、見栄えは非常に良くなるのですが……。

それはともかくわたしの提出コードで行っていることは実に単純。「今どこにいるのか」「どちらを向いているのか」「あと何回方向転換できるのか」。もとめる道のりの総数Pはこの3つのファクターによって決まります。よってこれらを変数とする関数(returnはもちろんP)を作ってやり、動点の動き方に合わせて、関数を組み合わせてやるだけです。ただしそのまま組み合わせるだけだと、単純な再帰になってしまい、非常に効率が悪いというか、同じ計算を何度もしてしまいます。そこで1度計算した値を覚えておくことで、効率化を図っています。

# こんな記事よりも……

というわけで、わたしの方法論はさほどほめられたものではありません。とりあえず解けたというだけです。それよりももっとよいコードを参加者の皆さんが公開しており、ありがいことに出題者の結城先生自らそれをまとめてくださっています。そちらをご参考のほどに。

[結城浩の「マヨイドーロ問題」解答リンク集](http://togetter.com/li/913642)
dlib の顔認識を試す

## 概要

dlib と CLM-framework について解説している記事 "[Facial Landmark Detection](http://www.learnopencv.com/facial-landmark-detection/)" を参考にして dlib をコンパイルし、デモの webcam_face_pose_ex を動かします。

自分の環境で上手く行かなかった部分についてまとめます。

## 環境

OSX El Capitan (10.11.2) 

## 準備

### X11

[XQuartz](http://www.xquartz.org/) から XQuartz-2.7.8.dmg をインストールします。

dlib のコンパイル時に `fatal error: 'X11/Xlib.h' file not found` のエラーが出たので、シンボリックリンクを貼ります。

`ln -s /opt/X11/include/X11 /usr/local/include/X11`
http://stackoverflow.com/a/12089021/1567777

### dlib のコンパイル

```bash
git clone https://github.com/davisking/dlib.git
cd dlib/examples
mkdir build
cd build
cmake .. 
cmake --build . --config Release
```

10分くらいかかったので、CMakeLists.txt から必要ない add_example を消すと良いと思います。

```cmake:CMakeLists.txt
add_example(3d_point_cloud_ex)
...
add_example(xml_parser_ex)
```

ここまで消す

### モデルファイルの用意

http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2 をダウンロードして `examples/build/shape_predictor_68_face_landmarks.dat` に解凍します。

## 実行

```bash
./webcam_face_pose_ex
```

## 結果

![スクリーンショット 2015-12-17 18.06.54.png](https://qiita-image-store.s3.amazonaws.com/0/31477/742685ec-893d-27ae-9383-53b7f86e8ff6.png)

めっちゃスゴい。
SDL init failureでAndroid emulatorが起動しない時の対処法

Androidエミュレーターを起動しようとしたら、以下のようなエラーが出てハマった。

```sh
$ simulator -avd Nexus_5_API_23 -verbose
SDL init failure, reason is: X11 not available
```

ググっても全く情報が出てこないし、誰に聞いても解決しないしで完全に途方に暮れていた。

## 対処法

結論から言うと`SDL_VIDEODRIVER`の値を初期値にしたら解決した。

```sh
unset SDL_VIDEODRIVER
```

以前、`SDL`でゲームを作った時に、この値が`X11`になっていてハマっていたようだ。

ググっても記事がなかったから書いてみた。同じ問題に困ってた人がいれば役立てば幸いです。
ブロックチェーンとEnterprise API

[Enterprise APIs Advent Calendar 2015](http://qiita.com/advent-calendar/2015/entapihack) への投稿です。
12/5の @moongift さんの[記事](https://developer.ntt.com/ja/blog/8eed40b4-1fed-4783-aabb-691d4104aa1e)にも関連します。

##FinTech, FinTech, FinTech

日経新聞や各種メディアで毎日のように目に入るこのワード。[今月の日経ビジネス](http://business.nikkeibp.co.jp/nbs/nbo/base1/index.html?xadid=002)でも特集が組まれるなど、少々行き過ぎな程にFinTechというワードがマーケットの中を縦横無尽に泳いでいる印象があります。経済産業省では[FinTech研究会](http://www.meti.go.jp/committee/kenkyukai/sansei/fintech/001_haifu.html)が設置され、産業・金融・IT融合をテーマに各業界の有識者により議論が進められています。基本的に事業の融合が必要条件であり、銀行法など金融関連事業には法律による規制もあるため、「官・民・民」一体の推進が求められます。

ここ最近のUberによるタクシー業界への、Airbnbによるホテル業界へのいわゆる破壊的イノベーション事例の影響なのか、FinTechも銀行などの既存金融業にとって大きな脅威である、IT企業が金融業のビジネスを食いつぶす、というような主張の記事を目にする機会も少なくありません。
FinTechは広義には「ITと金融の融合」を示し、狭義には「新しい金融サービスを提供するスタートアップ」を表すなど、そもそも市場がまだ黎明期だと言え、破壊的イノベーションを起こすものなのか、という問いに対する明確な答えがあるとは思えません。個人的には既存金融業とスタートアップが共存していく事は大いにあり得ると思っています。

##FinTechとブロックチェーン

技術面でひときわ気になるにはブロックチェーンです。まさに今週に入り、[さくらインターネット](http://www.sakura.ad.jp/press/2015/1216_mijin_cloud_chain/)と[アイリッジ](http://v4.eir-parts.net/v4Contents/View.aspx?cat=tdnet&sid=1311853)が暗号通貨技術とブロックチェーン技術に基づいたソフトウェアとサービスを開発しているテックビューロとの提携と各社の施策を発表しています。米国ではNASDAQが[Chain](https://chain.com)と組み、未公開株式市場向けの分散型取引プラットフォームにブロックチェーン技術を使うための研究開発を開始した事を[発表](http://www.forbes.com/sites/laurashin/2015/06/24/nasdaq-selects-bitcoin-startup-chain-to-run-pilot-in-private-market-arm/)しています。

ブロックチェーンのメリットは特に金融業界だけに閉じたものではありません。ただ、金融業界は信用に足る第三者機関（銀行や証券会社など）が信頼性を一元的に担保する事で成り立ってきたビジネスモデルの影響で、中央集約型のシステムとなっており、分散管理技術を導入する事でイノベーションが起きる、そもそもの土壌があります。

ブロックチェーンに関しての基本情報は様々な記事で解説されているので割愛しますが（おすすめは[こちら](http://jp.techcrunch.com/2015/10/19/blockchain/))、特徴は大きく二つ。

1.  分散管理構成で、各ノードが連鎖的に紐付いているため、データ改ざんへの耐久性があり堅牢である
2.  全ての分散ノードがリプリケーションデータを持っているため永続性に優れる

いわゆる金融業界に代表されるリアルタイム性のあるトランザクションに対応可能な究極の分散技術というわけです。そもそもインターネット技術が世に出てきた後、TCP/IPの上に電子メールやEコマースなどの様々なアプリケーションが「乗っかる事」で様々なサービスが提供されたように、取引トランザクションデータの記録や信頼性検証の仕組みをブロックチェーンプラットフォームが担保する事で、そのブロックチェーンプラットフォーム上に様々なアプリケーションが提供される潜在性があります。現在のところBitcoin以外には大きく成功したアプリケーションはないようですが、プラットフォームとして提供し、APIを解放すれば、堅牢で永続性のあるまさにEnterprise（向け）APIとなるのではないでしょうか。

##ブロックチェーンAPIの事例

既に米国でAPI提供している１社の事例として[Blockcypher](http://www.blockcypher.com/index.html)があります。ブロックチェーン業界のAWSを標榜したAPIプロバイダーである事は、Blockchain Web Servicesというサービス名からも明白です。トランザクション処理を自動化したTransaction APIだけでなく、1セント以下の取引きを可能とする[Microtransaction API](http://dev.blockcypher.com/#microtransaction-api)を提供する事により、これまでの一極集中的なシステム構成では、システム投資額をユーザー全体で割り勘して負担するモデルで成り立たなかった小規模取引きを実現可能とするのが同社の提供価値。システム投資を基にしたビジネス設計など、ビジネスモデル全体を大きく変革するイノベーティブなEnterprise APIだと考えられます。
                          
Enterprise向けのAPIとは、ブロックチェーンAPIのように事業ドメインと事業ドメインを繋ぎ合わせるような時に最も存在価値が出るのかもしれません。
センサ使って何か計算するときはセンサを抽象化するといい

当たり前といえばそうなのだが。

#どういうとき？
センサの値を時々刻々と取得し、何か状態を推定するプログラムを組むとき。
例えば

- 歩数計
- GPSのフィルタ
- 音声信号をどうにかする

などなど

#なんで？
デバッグのたびに実機を動かすのは大変手間である。
例えばGPSのフィルタを作ろうと思ったらいちいち外に出て歩かねばならない。
こうなると気軽に推定ロジックを変えようという気が起きなくなる。

センサを抽象化することにより、簡単に模擬入力に差し替え可能になる。
すると実機を使わなくても出力を確認できる上に、
センサの値の発行間隔を自由に変更できるようになるので、待ち時間も短くなる。
こうなればロジック変更が気軽に行えるようになる上、完全に同じ入力を入力できるようになるので
「全く同じ入力に対して精度がこれだけ上がった」という確認ができるようになる。

#どうやって？
センサの値を直接取得するのではなく、インターフェースなり抽象クラスなりを通して取得する。
また、センサのログをファイルなどに出力できるようにし、取得したログ形式を入力として扱えるようにする。
時間を扱う場合はセンサのログは時間も記録するようにする。
AWS なんとなく最初にやってる作業

## はじめに
AWSでLinuxインスタンスを作る際にいつもはじめにやる作業をまとめてみました。

## 概要
1. 日本時間に変更する。
2. ホスト名変更
3. ユーザの追加
4. 追加したいDiskがある場合

## 詳細
----
#### 日本時間に変更する。

日本時間に変更します。時間変更後はcron等のサービスを再起動します。

```shell-session
cp /usr/share/zoneinfo/Japan /etc/localtime
```

※ 何が対象かわからない場合はインスタンス再起動でもいいかもです。

追記）
これだけではだめ場合があることを見つけたので追記します。以下も変更したほうが良いです。
[AmazonLinuxでのタイムゾーン設定](http://qiita.com/sudix/items/7f22165b9d934cf0a630)

```shell-session:/etc/sysconfig/clock
ZONE="Asia/Tokyo"
UTC=true
```

----
#### ホスト名変更

ホスト名称を変更します。以下のコマンドで書き換えれます。

```shell-session
hostname [ 指定したいホスト名 ]
```

再起動しても変更したい時は以下の内容も合わせて変更すると良いです。
/etc/sysconfig/network のHOSTNAMEを変更すれば変わります。
ない場合は追加してください。

```shell-session
cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=[ 指定したいホスト名 ]
NOZEROCONF=yes
NETWORKING_IPV6=no
IPV6INIT=no
IPV6_ROUTER=no
IPV6_AUTOCONF=no
IPV6FORWARDING=no
IPV6TO4INIT=no
IPV6_CONTROL_RADVD=no
```

----
#### ユーザの追加

ユーザの追加を行います。ec2-userでアクセスし続けるのはよくないので追加した方が良いです。

```shell-session
$ sudo su -
# useradd -s /bin/bash -d /home/admin admin
# passwd admin

# su - admin
$ ssh-keygen -t rsa
$ cp .ssh/id_rsa.pub .ssh/authorized_keys
$ chmod 600 .ssh/authorized_keys
```

作成後/home/admin/.ssh/id_rsaをダウンロードして 付けたい名前.pemに変えときます。
以下のようなコマンドでログインできるようになります。

```shell-session
ssh -i 付けたい名前.pem admin@インスタンス名
```

sudoもできるようにしたい方は記事書きました。もしよければそちらも参照ください。
[AWSで開発者ユーザ及び管理者ユーザを作成しsudoの設定をする](http://qiita.com/mogetarou/items/f7103173da8e79ea38f4)

----
#### 追加したいDiskがある場合

Diskは最初からマウントされていないのでマウントできるように変更します。またフォーマットもされていませんのでフォーマットも行います。

まず、デバイス名を確認します。

```shell-session
# fdisk -l

Disk /dev/xvda1: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


: Diskの情報が出てくる
:
:

```

基本的にはDisk /dev/xvda はRootパーテーションなので無視します。他のDiskが追加しているDisk なので、そのDiskを対象とします。
仮に/dev/xvdbが拡張されているパーテションとします。

```shell-session
fdisk /dev/xvdb

```

以下のような感じで作成していきます。
n ・・・ new
p ・・・ 基本拡張
領域番号・・・・1
最初のシリンダ・・・省略
終了のシリンダ・・・省略
w ・・・ 書き込み

Diskの拡張ができたので上記コマンド入力後対象の名前が表示されますのでその名前を対象にフォーマットします。
今はフォーマット形式はext4で問題ないかと思います。

```shell-session
mkfs -t ext4 /dev/xvdb1
```

フォーマットし終わったデバイスをマウントします。

```shell-session
mount -t ext4 /dev/xvdb1 マウントしたいフォルダ
```

これだけだと再起動した時マウントされないので「/etc/fstab」にも記述したほうが良いです。


## あとがき
基本的にはサーバを作成するときの作業と同じです。なお、centOSのサーバも似たような感じでできます。


## その他
参考
[AmazonLinuxでのタイムゾーン設定](http://qiita.com/sudix/items/7f22165b9d934cf0a630)

## 履歴
2016/02/12 内容が羅列に近かったので修正
2016/02/15 ユーザ追加部分にsudoについてのリンクを追加
2016/02/18 ローカルタイムの設定の情報を追加
ReactOSを使ってみた (0.3.17)

日本語入力は未対応です。(IMEが存在しない)

## 参考

* [非公式ReactOS日本語版パッケージ配布所](http://www42.tok2.com/home/reactos/)
* [ReactOS Community - ReactOS 0.4](http://community.reactos.org/index.php/features/reactos-0-4)

## download

* VirtualBox用を[download](http://www42.tok2.com/home/reactos/)しました。

> VirtualBox (1/2) 	100 MB (104,857,600 バイト) 
> VirtualBox (2/2) 	35.1 MB (36,810,368 バイト) 

ファイルを結合してから解凍

```bash:解凍
cat ReactOS-0.3.17-Japanese-REL-vbox.zip.001 ReactOS-0.3.17-Japanese-REL-vbox.zip.002 > a.zip
```

## 起動

* VirtualBox 5.0.10 で動作しました。

## ドライバ

* VirtualBox guest additionsをインストール。
* OS再起動後、画面のプロパティで表示色を修正。
* サウンドドライバはプログラム＞ダウンロードから入手できます。（再生は未確認）

## 動作確認したソフト

* IPMessenger (このために動かした)
.gitignoreに後から追加したリソースをリモート上から一括削除する

既にリモートリポジトリ上で管理されているリソースは、
後から.gitignoreに設定してもリモート上は残ったままとなる。

対象リソースが大量にある場合は以下のコマンドで一括削除できる。

```
git rm --cached `git ls-files -i --full-name --exclude-from=.gitignore`
```

その後、commit & pushすればOK。
Swift: スライダーの使い方


---
###手順イメージ 
- スライダーをStoryBoardに追加
- 初期値、最大値、現在地を記載

![Kobito.HUNfWC.png](https://qiita-image-store.s3.amazonaws.com/0/103163/ce9b9059-6db1-38b5-3dd6-0012a86ae3da.png "Kobito.HUNfWC.png")


- ViewControllerとリンク (Action / sender:UISlider)

---
###実装

```ViewController.swift

    @IBAction func multiSlider2(sender: UISlider) {

		print(sender.value)
         

    }
```

まとめるまでもなかったよ～な気もするけどねんのため。

###ではまた！
Visual StudioでOculusがやりたい(角度取得編)

そもそもなんでUnityでやらんといけんのじゃ！！
...というよくわからない激怒からVisual StudioでOculusを始めました.

レンダリングは時間がかかるので今回はVisual Studioの簡単な環境構築+角度取得コードを
(Oculusの導入方法はいろんなところにあるので割愛します)

#Visual Studioの環境構築
今回私はVisual Studio2013を使用.
Oculus SDKのSamplesの中からslnを起動して見ながらやるといいかも.

以下Visual Studioの設定
##追加のインクルードディレクトリ

```
 $(OVRSDKROOT)\LibOVR\Include
 $(OVRSDKROOT)\LibOVRKernel\Src
```

$(OVRSDKROOT)はOCULUSをインクルードしたところですがおそらく環境変数として登録されてるのではないかと.

##追加のライブラリディレクトリ

```
$(OVRSDKROOT)\LibOVR\Lib\Windows\Win32\Debug\VS2013
$(OVRSDKROOT)\LibOVRKernel\Lib\Windows\Win32\Debug\VS2013
```

VS2013のところは環境によって異なります.

##追加の入力ファイル

```
$(OVRSDKROOT)\LibOVRKernel\Lib\Windows\Win32\Debug\VS2013\LibOVRKernel.lib
$(OVRSDKROOT)\LibOVR\Lib\Windows\$(Platform)\$(Configuration)\VS2013\LibOVR.lib
```

ランタイムライブラリ
自分は/MTdにしています. 設定次第では動かないかも.

#プログラム
今回Oculusの姿勢を出力するコンソールプログラムを作りました.
簡単なものなのでここに載せます.

```cpp:HeadTrack.cpp
#include <stdio.h>
#include <tchar.h>



// TODO: プログラムに必要な追加ヘッダーをここで参照してください。
#include <Windows.h>
#include <opencv.hpp>
#include <highgui.hpp>
#include <iostream>
#include <fstream>
#include <string>

//oculus使用
#include <OVR_CAPI_0_8_0.h>
#include <Kernel/OVR_System.h>
#include "OVR_CAPI.h"
#include "OVR_CAPI_GL.h"

using namespace std;
using namespace OVR;


void Application()
{
	ovrResult result = ovr_Initialize(nullptr);

	if (OVR_FAILURE(result)){
		cout << "ovr_Initialize FAILURE" << endl;
		return;
	}
		//ovrHmd    hmd = nullptr;
		ovrSession session;
		ovrGraphicsLuid luid;
		result = ovr_Create(&session, &luid);

		if (result == ovrSuccess)
		{

			// Get more details about the HMD.
			ovrHmdDesc desc = ovr_GetHmdDesc(session);
			ovrSizei resolution = desc.Resolution;
			//get oculus tracking
			ovr_ConfigureTracking(session, ovrTrackingCap_Orientation |
				ovrTrackingCap_MagYawCorrection |
				ovrTrackingCap_Position, 0);
			while (1){

				// Do something with the HMD.
				// Query the HMD for the current tracking state.
				ovrTrackingState ts = ovr_GetTrackingState(session, ovr_GetTimeInSeconds(),NULL);
				if (ts.StatusFlags & (ovrStatus_OrientationTracked | ovrStatus_PositionTracked))
				{
					ovrPoseStatef pose = ts.HeadPose;
					
					cout << "X=  " << pose.ThePose.Orientation.x << endl;
					cout << "y=  " << pose.ThePose.Orientation.y << endl;
					cout << "z=  " << pose.ThePose.Orientation.z << endl;
					

					//ファイルに書き込み
					std::ofstream ofs("C:\\works\\KinectInteraction\\Debug\\HeadPosition.txt");
					ofs << pose.ThePose.Orientation.y << endl;
					ofs << pose.ThePose.Orientation.x << endl;
					ofs << pose.ThePose.Orientation.z << endl;
					Sleep(100);
				}

				if (cv::waitKey(10) != -1)
					break;

			}

			ovr_Destroy(session);
		}

		ovr_Shutdown();	
}

int _tmain(int argc, _TCHAR* argv[])
{

	Application();

	return 0;
}

```

OpenCV入ってるけど適宜変えてください 笑

#Help
たまにロール・ピッチ・ヨー角が反転してもとに戻りません.
サンプルプログラムの場合はすぐに戻るのに...
だれかわかる人がいたら教えてください！

#参考
[公式サイトのDeveloper Guide](http://static.oculus.com/documentation/pdfs/pcsdk/latest/dg.pdf)
[LibOVR Reference Manual](https://developer.oculus.com/doc/0.8.0.0-libovr/index.html)
CakePHP3 のFormHelperが生成するHTMLをカスタマイズしたい

#CakePHP3 のFormHelperが生成するHTMLをカスタマイズしたい

CakePHP3のFormHelperを使って以下の様にラジオボタンの生成を書くと、ラベルを自動生成します。

```php
<?= $this->Form->radio(.....
```
これは、これで便利に使える場面がありますが、スタイルシートを利用してradioタグの見た目を変えたい場合や、システム全体でラベル表示が要らない機能(大きなお世話)的な機能となります。
CakePHP2までは、「’legend’ => false」をオプションに入れとけばラベルの作成を抑止できたのですが、CakePHP3ではできません。
そこで、ラベルを作らなくするためにはどうするかというと、ラベルを作成しないテンプレートを準備して、デフォルトのテンプレートを置き換えてしまします。(デフォルトのテンプレートは、Cake\View\Helper\FormHelperクラスの$_defaultConfig[’templates’]に定義があります。)

### 1.テンプレートの準備
新しいテンプレートを、「config」ディレクトリに、app_form.phpファイル(ファイル名はたぶん適当で構わない)を作成します。

app_form.phpの中は、以下のように、適用したい差分を書いていく。
(内容については、上記で示した、標準テンプレートを参考にしてください。
[ここ](http://book.cakephp.org/3.0/en/views/helpers/form.html#customizing-the-templates-formhelper-uses)も参考になるかと思います。)

```php
<?php
return [
    'inputContainer' => '{{content}}',
    'label' => '',
    'input' => '<input type="{{type}}" name="{{name}}"{{attrs}} class="form-control">',
    'radioWrapper' => '{{input}}',
];
```

### 2. １.で作成したテンプレートの適用 
App\View\AppViewに、手順１で作成したテンプレートをinitializeメソッドで読み込ませます。

```php
class AppView extends View
{
   public function initialize()
    {
        $this->loadHelper('Form', [
            'templates' => 'app_form',
        ]);
    }
}

```

以上で、システム全体で、新しいテンプレートを使用してHTMLが生成されます。
Grafana の Annotations でイベント（ログ）を可視化

# 概要
Grafana 2.6.0 がリリースされたので最近追加された以下のダッシュボードを設定する

- Annotations + Table表示

※Annotation とは、イベント(ログ)をグラフ上へ表示する機能

#前提
環境は、以下の通り
- Grafana : 2.6.0-1
- Influxdb : 0.9.4.1-1

監視結果のメトリクスデータおよびアラート発生等のイベントログを Indluxdb に保存
グラフ自体の作成については割愛

#Influxdb へのイベントデータ登録
監視システムより、broker 経由で Influxdb にアラートのイベントデータを送信  
以下の内容を登録

- アラート種別（Critical, Warning）
- 障害情報（ホスト名、サービス名、ホストグループ名など）
- 障害内容（プラグインアウトプット）
- 障害通知情報（コンタクト名など）

#Annotations 設定
1. [Manage dashboard] より [Annotations] を選択して [New] をクリック
2. Datasource に Influxdb を選択
3. Influxdb Query に イベント内容が取得できるクエリを入力
4. 取得したクエリ結果から title, tags, text への紐づけを指定

![anno.png](https://qiita-image-store.s3.amazonaws.com/0/105824/804e226a-e283-c342-168c-28f12ca75603.png)

  
  
Annotations が表示されているかグラフを確認
![03.png](https://qiita-image-store.s3.amazonaws.com/0/105824/a1642701-d2f3-cdf0-b9bd-ed698bdaaa41.png)
黄色い線はWarningAlert, 赤い線はCriticalAlert



#Annotation Table 設定方法
[Add Panel] → [Table]クリック
![04.png](https://qiita-image-store.s3.amazonaws.com/0/105824/3060b885-f7f7-2cf0-292d-ae83e6ca2227.png)

[Option] より Data の [To Table Transform] で [Annotation] を選択するだけ
![05.png](https://qiita-image-store.s3.amazonaws.com/0/105824/8a84eb9a-b4a5-9596-e004-419536d59558.png)

以下のように Table にイベントログが表示される
![02.png](https://qiita-image-store.s3.amazonaws.com/0/105824/d815af56-2970-5336-ed80-7d0b8d8a086f.png)