OmniAICreator/Qiita-1.07M huggingface dataset:
OpenNI & NiTE with Kinect 360 & OS X El Capitan


### Requirements
- Kinect for XBox 360 (model #1414)
- OS X El Capitan
- [Homebrew](http://brew.sh/)
- JDK

### Installation

Download and install OpenNI2 and driver.

```shell-session

brew tap homebrew/science
brew tap totakke/openni2
brew install openni2
brew install openni2-freenectdriver
```

Download [NiTE-MacOSX-x64-2.2.tar.zip](https://bitbucket.org/kaorun55/openni-2.2/src/) and extract it somewhere. I personally put it in `/usr/local/Cellar/NiTE`.

```shell-session
unzip NiTE-MacOSX-x64-2.2.tar.zip
tar xzvf NiTE-MacOSX-x64-2.2.tar.bz2
mv NiTE-MacOSX-x64-2.2 /usr/local/Cellar/NiTE
```

Add the following to your dot file.

```shell-session

export OPENNI2_INCLUDE=/usr/local/include/ni2
export OPENNI2_REDIST=/usr/local/lib/ni2
export NITE2_INCLUDE=/usr/local/Cellar/NiTE/Include
export NITE2_REDIST64=/usr/local/Cellar/NiTE/Redist
export DYLD_FALLBACK_LIBRARY_PATH="$OPENNI2_REDIST:$NITE2_REDIST64:$DYLD_FALLBACK_LIBRARY_PATH"
```

### Test

Test samples in OpenNI directory.

```shell-session

cd `brew --prefix`/share/openni2/tools
./NiViewer
```

Test samples in NiTE directory.

```shell-session
cd `brew --prefix`/Cellar/NiTE/Samples/Bin
./UserViewer
```
Thunderbirdの設定



## 使えるアドオン

### Quicktext

複数のパターンの定型文を登録しておける機能です。
お客様からの問合わせの回答や、作業報告の作文を効率よくできます。




引用元：<a href="http://sh1machu.hatenablog.com/entry/2015/12/15/194832" target="_blank">俺の Thunderbird のアドオンを晒す（10選） - 最弱エンジニアの付箋紙</a>

### ショートカット


| ショートカット     |    機能 |
|:------------:|:------------:|
| ctrl + shift + o | 引用文として貼り付け |
Eclipse環境について、サーブレット/JSP設定


## Eclipseの設定・概要

- Eclipseを起動すると、1つの作業台が起動します。この作業台のことを「ワークベンチ」
- ワークベンチには、たくさんの機能があります。しかし、ある1つの作業をする際には、その一部の機能しか使いません。そのため、Eclipseでは必要な機能だけを選んで画面上に表示するようにしています。どの機能を表示するかを選んだもの、さらに選んだ機能をどのように配置するかを決めたものを、「パースペクティブ」


## Eclipse上のサーブレット環境設定
- プロジェクトウィンドウで新規→Web→動的Webプロジェクト
- Tomcat5以降では、GETで送られるアドレス部のURL文字列デコードに必ずISO8859-1が使われるため、Tomcatをインストールした「conf/server.xml」に以下を追加。

```
useBodyEncodingForURI="true" //を追加

```

-  カスタムタグとJSTLを使用する場合は（JARファイルをクラスパスに配置、JSPでtaglig宣言）をWebContentのWEB-INFのlibに下記を格納
    -  jstl-api-1.2.jar
    -  jstl-impl-1.2.jar
- JDBCを使用する場合は、をWebContentのWEB-INFのlibに下記を格納
    -ojdbc6.jar 


## JSPの文字コード

新規作成時に文字コードを変更する場合は、[設定]-[Web]-[JSPファイル]でUTF-8に変更。
サバティカらないゲーム開発改めVJ製作ブログ3日目

いやーサバティカらないとやはり時間がない。1日はプログラムして、次の日はブログ書いて、というような感じである。

というわけでまずクロスフェーダーから作る。2つの映像を徐々に切り替えることができれば原理的には無限にパフォーマンスが続けられる。
別に4チャンネルでも8チャンネルでも作れはするが、そんなにあっても使い切れないし、パク…参考にしているVDMXというVJソフトウェアでもLeftとRightの2チャンネルしかないので、まずは最低限動く形で作っていく。

2つの映像を用意するということで、Cameraを2つ用意する。それをそのまま画面に出力するわけにはいかないので、RenderTextureを使う。
RenderTextureを使えばCameraの映像をテクスチャとして扱えるのである。

実際に表示する時に二つのテクスチャを適宜ブレンドすることになる。
ちぃ知ってる、こういうのはシェーダーでやる。

幸いイメージエフェクト的なシェーダーはこんなやつを前に作ったことがあったので、ちゃっちゃっと作れた。
https://github.com/tnayuki/Unity-LGBTPride

シェーダーのコア部分はこんな感じ。

```
    return lerp(tex2D(_MainTex, i.uv), tex2D(_SubTex, i.uv), _Slider);
```

0〜1.0のプロパティを変更することで、徐々に映像を切り替えられる。

![9月-13-2016 18-51-00.gif](https://qiita-image-store.s3.amazonaws.com/0/38786/1b566a3f-14c8-93ac-8878-af2da6aefa56.gif)

スライダーと切り替わりの速さを調整(リニアでなく)したいところだが、どうせあとでMIDIコントローラーから制御できるようにするので、その時考えることにする。

ここから左右のチャンネルで流すエフェクトや、動かすオブジェクトを作っていこう。
Facebook Messengerのデスクトップ通知を出なくする方法


#Facebook Messengerのデスクトップ通知が嫌いだ

デフォルトだと会話の内容やプロフィール写真がデスクトップに出てきてしまうから

Facebook Messengerのデスクトップ通知が嫌いだ

たまたま上司や同僚と画面見てて気まずくなってしまうから

Facebook Messengerのデスクトップ通知が嫌いだ

というわけでメモφ(｡_｡*)ｶｷｶｷ.



#１Chrome画面一番右のボタンをクリック

<img width="1280" alt="スクリーンショット 2016-09-14 19.08.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/8a0a1897-dc40-c879-3b21-b6dcada21afc.png">

#２「設定」をクリック

<img width="1279" alt="スクリーンショット 2016-09-14 19.00.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/7f4fb757-9208-dae9-6f47-6b44ac85c78a.png">

#３「コンテンツの設定」を押す


<img width="1280" alt="スクリーンショット 2016-09-14 19.14.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/af476c87-5bef-cffb-9103-c4254f873cd0.png">



#５　この画面が出るので下にスクロール(command + F で検索窓を出して「通知」と検索してもいい）

<img width="1280" alt="スクリーンショット 2016-09-14 19.15.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/3b6b7a9a-2cfa-4de6-9b85-58693514a288.png">



#６ スクロールしていくと「通知」の表示があるので「例外の管理」を押す

<img width="1280" alt="スクリーンショット 2016-09-14 19.16.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/5b9c8e19-723e-f7f6-48cd-1c433f7878e7.png">




#７「facebook.com」を選択しURLが活性状態になったら右に「×」ボタンが出るのでクリックし削除する。

サンプルはtetatailでごめん。

<img width="537" alt="スクリーンショット 2016-09-14 19.01.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/8e7e21eb-7fc8-cb28-891a-c9528ddc1d9f.png">



#８デスクトップ通知が消える

（facebookのアプリ入れてるとこのようにプライバシー守られる形になる）

気まずくなるの防げる。めでたしめでたし。



<img width="333" alt="スクリーンショット 2016-09-14 19.22.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/65992c8e-7998-98ff-4af8-8cf10f869ed5.png">
Windows で OpenVPN クライアントがうまく接続できないときのあれこれ

Windows から OpenVPN を利用するとき、クライアントの設定は間違ってないのにサーバへ接続できずに困ったので備忘録。

## ファイアウォールの設定は適切か
ファイアウォールにブロックされてしまうと OpenVPN クライアントは接続を確立できない。例外アプリケーションとして許可する設定[^1]はもちろん、接続しているネットワークの種類に合わせて「プライベート」「パブリック」の許可をする。

[^1]: [Windowsファイアウォールの例外にアプリケーションを追加する方法](http://faq.buffalo.jp/app/answers/detail/a_id/792)

## OpenVPN クライアントは管理者権限で実行しているか
ログインユーザーが管理者である場合は特に問題はないが、そうでないユーザーでそのまま OpenVPN クライアントを実行すると

```
ERROR: Windows route add command failed [adaptive]: returned error code 1
```

こんなエラーが出る。

毎回 `右クリック` > `管理者として実行` してもいいが、多分忘れてしまうので「常に管理者として実行」するようにしておく[^2]と良さそう。

[^2]: [必ず管理者として実行するようにアプリケーションを構成する](https://technet.microsoft.com/ja-jp/windows/ff189336.aspx)
debianパッケージをビルドするときに使用するCPUコア数を指定する

dpkg-buildpackage/pbuilder/cowbuilderでビルドするときに -j オプションでコア数指定すればいい。何も考えたくない場合は -jauto と指定すればコア数取ってきてくれるよ（[という風にした](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=748012)ので使ってください

pbuilder/cowbuilderの場合は/etc/pbuilderrcに
>DEBBUILDOPT="-jauto"

でOK。
Debian上でUbuntu用にパッケージビルドするその２

pbuilder-dist使うのはどう？という指摘があったので

```
$ sudo apt install ubuntu-dev-tools ubuntu-archive-keyring
$ pbuilder-dist xenial create --mirror http://jp.archive.ubuntu.com/ubuntu
$ pbuilder-dist xenial build sl_3.03-17ubuntu1.dsc
```

という感じ。こっちのほうが楽かなー

## もうちょっとだけ楽に

ubuntu-dev-tools 使うなら ubuntu-archive-keyring 必須だろう、ということで[BTSしといた](http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=838254)
Rails / PostgreSQL の組み合わせで使ってる場合に、PostgreSQL のメモリ消費を劇的に減らす方法

# 結論

答えは、 http://railsguides.jp/configuring.html#postgresql%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B に書いてある。

`database.yml` に `prepared_statements: false` または `statement_limit: 100` (デフォルトが1000) を設定する。もちろん値は100でなくてもいい。

```database.yml
production:
  adapter: postgresql
  prepared_statements: false
```

または

```database.yml
production:
  adapter: postgresql
  statement_limit: 100
```

この値が大きいと、Rails側ではなく、データベース側に `PreparedStatement` のキャッシュがメモリに保存されるためデータベースのメモリをぐんぐん消費するのだ。

アプリの内容と相談し、 `PreparedStatement` キャッシュが少なくてよいなら減らすべき。
というかデフォルト `1000` は多すぎるような気がする。

このキャッシュは接続毎に効いてくるので App Server を複数台で冗長化してる場合などは劇的に効いてくる。というか、逆に言うとデフォルト設定だとApp Serverを増やすとあっという間にデータベースのメモリを消費してしまうことになる。

railsguide にシレっと載っている情報だが、案外ネットで見つかりにくい情報なので載せることにした。
特定のSlackチャンネルに参加しているユーザーのメールアドレス一覧を取得する

特定のプロジェクト参加者(チャンネルにjoinしている)を対象にメールアドレスをキーに外部システムへimport/exportをしたかった。
外部システムと共通なのはメールアドレスぐらいなのでSlack APIからサっと取得しようとしたら、意外とめんどうだったのでスクリプトを書いた。

```js
#!/usr/bin/env node

// https://github.com/slackhq/node-slack-sdk
const WebClient = require('@slack/client').WebClient;
const web = new WebClient(process.env.SLACK_API_TOKEN);
const SLACK_CHANNEL_ID = process.env.SLACK_CHANNEL_ID;

web.channels.info(SLACK_CHANNEL_ID)
      .then((channel) => {
        web.users.list().then((users) => {
          for (var m of users.members) {
            if (channel.channel.members.includes(m.id)) {
              console.log(m.profile.email); // HERE
            }
          }
        })
      });
```

`SLACK_CHANNEL_ID` はチャンネル名じゃなくてID文字列。
https://api.slack.com/methods/channels.list/test から探して……
[iOS][Swift]prepareForSegueをOverride出来ない……の対処法

iOS初心者です。iOS開発の触りしか出来ていないので詳しいことはわからないのですが、画面遷移のときにSegueってやつを使って値を次の画面（ViewController)にパスするときにドハマりした話です。今日Xcodeを8.0にアップデートしたのが原因かもしれません。**詳しい方は原因や正しい対処法などコメントしていただけると嬉しいです。**

# prepareForSegueがオーバーライドできなかった
iOS開発入門書籍の解説に従ってコーディングしていました。画面遷移に伴って別のViewControllerに値をパスするコードを記述する部分にさしかかります。どうも`prepareForSegue`というメソッドをオーバーライドして値をパスする処理を書くようです。

参考記事
[Swiftでセグエを利用した画面遷移 - Qiita](http://qiita.com/tajihiro/items/45c7adf2ef15df79bbf1)

そこで次のようなコードを記述します。（上の記事より引用）

```swift
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){
        var secondViewController:SecondViewController = segue.destinationViewController as SecondViewController
        secondViewController.param = self.paramText.text
    }
```

するとこのようなエラーが出てしまいました。
`Method does not override any method from its superclass`

原因はよくわからないのですが、スーパークラスにこんなメソッドはないとのこと。言われたとおりにやったんですが…なぜ…

# 応急処置
とりあえずインテリセンスを頼りに、似た名前のメソッドの定義を見ながら代わりになるそれっぽいメソッドを見つけました。あと`segue.destinationViewController`ってのも使えないっぽいのですが、代わりに`segue.destination`という`UIViewController`型のプロパティを見つけたのでこれを利用。

```swift
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        var secondViewController:SecondViewController = segue.destination as SecondViewController
        secondViewController.param = self.paramText.text
    }
```

書き換えると上手く機能しました。セフセフ。
MacのdateコマンドでISO8601とUNIX時間を相互変換する


UTCで。

```sh
$ date -u -jf %FT%TZ 2016-09-14T17:50:00Z +%s
1473875400

$ date -u -r 1473875400
2016年 9月14日 水曜日 17時50分00秒 UTC

$ date -u -r 1473875400 +%FT%TZ
2016-09-14T17:50:00Z
```

ローカルタイム（JST）で。

```sh
$ date -jf %FT%T%z 2016-09-14T17:50:00+0900 +%s
1473843000

$ date -r 1473843000
2016年 9月14日 水曜日 17時50分00秒 JST

$ date -r 1473843000 +%FT%T%z
2016-09-14T17:50:00+0900
```
JSON文字列をVimとjqでさくっと整形する


## はじめに

[JSON文字列を整形して表示する](http://qiita.com/844196/items/879db6528999ccf470b8)というエントリを見て、`quickrun`を使わなくてももっと手軽な方法があるのでは、と思ったのが発端。
試してみたらあっさりと成功したので共有したい。

## `quickrun`を使わずに整形する方法

### 1. `'equalprog'`と`={motion}`を使う

`={motion}`は整形をするためのコマンドだと思われがちだが、ヘルプを読めば分かるが外部プログラムでフィルタするためのコマンドである。
`{motion}`で指定した範囲を`'equalprog'`に指定したプログラムでフィルタし、`{motion}`で指定した範囲をプログラムの実行結果で置き換えてくれる。

グローバルに設定してしまうと少し困ることになるので、`setlocal`でバッファローカルに設定する。

```vim
:setl equalprog=jq\ \".\"
```

`jq`に渡す引数まで含めるためにエスケープが必要となる。
その後バッファ全体を整形したいのであれば`gg=G`、指定範囲だけ`jq`で整形したければビジュアルモードで整形したい範囲を選択し、`=`すると`jq`で整形される。

JSファイルやjsonファイルを編集中に有効としたい場合は `vimrc`にこう書くとよい。

```vim
au FileType javascript setl ep=jq\ \".\"
au FileType json setl ep=jq\ \".\"
```

#### 問題

`quickrun`と違い、`jq`に任意のオプションを渡すことが出来ない。
渡したければ都度`'equalprog'`の設定をする必要がある。

### 2. `!{motion}{filter}`を使う

こちらは設定すら不要である。
バッファ全体を整形したいのであれば`gg!G`、指定範囲だけ整形したければビジュアルモードで整形したい範囲を選択して`!`とすると、フォーカスがコマンドラインに移るので`jq "."`と入力してEnterすると`jq`で整形される。
都度`jq`コマンドを入力するのでコマンド一発とはならないがこちらであれば`jq`に任意の引数を渡すことも出来る。
Debian上でUbuntu用にパッケージビルドする

## ビルド環境を作る

Ubuntu Xenialに合わせてみる

```
$ sudo apt install ubuntu-archive-keyring
$ sudo pbuilder --create --basetgz /var/cache/pbuilder/xenial.tgz --distribution xenial --mirror http://jp.archive.ubuntu.com/ubuntu 
```
これだけ。xenialを他のバージョンに合わせればxenial以外も使えるよ。

## パッケージソースを取ってきて、対象ディストリビューションを合わせてみる

ここではDebianのパッケージソースを取ってきてそれをUbuntuに対してリビルド、という形。

```
$ apt-get source sl
$ cd sl-3.03
$ dch -D xenial
$ debuild -S -us -uc
```
dch -Dオプションで対象ディストリビューションを指定している。
これで、先程changelogで指定したバージョン、sl_3.03-17ubuntu1.dscができてることを確認してビルド。

## pbuilderでビルド

```
$ sudo pbuilder --build --basetgz /var/cache/pbuilder/xenial.tgz sl_3.03-17ubuntu1.dsc 
```

終わり。
XCODE8,iOS10にてview.layer周りの表示がされない場合がある

下記のようなコードを用いて、viewのlayerを制御している場合があると思います。

```objc
        // viewを角丸にする
        _view.layer.cornerRadius = _view.frame.size.width / 2.f;
        _view.layer.masksToBounds = YES;
        // 枠線色
        _view.layer.borderColor = [UIColor colorWithRed:230.f/255.f green:230.f/255.f blue:230.f/255.f alpha:1.f].CGColor;
        // 枠線太さ
        _view.layer.borderWidth = 3.f;
```

これまで偶然動いていただけなのか、XCODE8では表示されなくなる場合があるようです。
その場合、下記対応を入れれば表示されました。

- viewdidload等に処理を記述している場合、処理をviewDidLayoutSubviewsに記述する。
- もしくは下記のように、処理最初にlayoutIfNeededを呼ぶ。

```objc
        // xcode8対応
        [_view layoutIfNeeded];
        // viewを角丸にする
        _view.layer.cornerRadius = _view.frame.size.width / 2.f;
        _view.layer.masksToBounds = YES;
        // 枠線色
        _view.layer.borderColor = [UIColor colorWithRed:230.f/255.f green:230.f/255.f blue:230.f/255.f alpha:1.f].CGColor;
        // 枠線太さ
        _view.layer.borderWidth = 3.f;
```
#PostgreSQL Window関数で投稿数の累計を抽出

# <i class="fa fa-comment-o"/> 背景

- `日付` ごとの `その日の投稿数` と `その日までの投稿数` を抽出したいことから。

# <i class="fa fa-code"/> Window関数を用いたSQL

- 投稿された日: `created TIMESTAMP WITHOUT TIME ZONE` 

```sql
SELECT
    DATE(table.created) AS "日付",
    COUNT(*) AS "その日の投稿数",
    SUM(COUNT(*)) OVER(ORDER BY DATE(table.created) ASC) AS "その日までの投稿数"
FROM table
GROUP BY DATE(table.created)
```

# <i class="fa fa-file-text-o"/> 結果

|日付|その日の投稿数|その日までの投稿数|
|---|---|---|
|2016-09-01|1|1|
|2016-09-02|3|4|
|2016-09-03|2|6|
|2016-09-04|3|9|
|2016-09-05|3|12|

# <i class="fa fa-file-text-o"/> その他 Window関数を用いたSQL

http://qiita.com/nfnoface/items/72609615ede93ecea349
CentOS6にownCloudをインストールしてみた

## はじめに
CentOS6にowncloud9.0を入れてみました。
以下を参考にしました。とてもわかりやすく感謝です！

[ownCloud Server 7 を CentOS / RHEL 6 に yum インストールする手順](http://weblabo.oscasierra.net/owncloud7-centos6-1/)

## 概要

1. 必要なものをインストール。
2. owncloudがアクセスする為のmysqlのユーザを作成します。
3. ownCloudにアクセス

## 詳細
----
#### 1. 必要なものをインストール。

特に書くことないです。参考サイトに書いてある通りに入れていきます。

```
# cd /etc/yum.repos.d/
# wget http://download.opensuse.org/repositories/isv:ownCloud:community/CentOS_CentOS-6/isv:ownCloud:community.repo
# yum install owncloud mysql-server
# chkconfig httpd on
# chkconfig mysqld on
# service httpd start
# service mysqld start
```

----
#### 2. ownCloudがアクセスする為のmysqlのユーザを作成します。

こちらも特に書くことないです。参考サイトに書いてある通りに入れていきます。

```
# mysql -u root -p
mysql> CREATE DATABASE owncloud;
mysql> GRANT ALL ON owncloud.* to 'owncloud'@'localhost' IDENTIFIED BY 'owncloud';
```

----
#### 3. ownCloudにアクセス

http://サーバ名/ownCloud

ここで403エラーがでました。
/etc/httpd/conf.d/owncloud.conf
を見るとシンボリックリンク作れ的なことが書いてあったので実行。

```
# ln -s /etc/httpd/conf.d/owncloud-access.conf.avail /etc/httpd/conf.d/z-owncloud-access.conf
```

無事アクセスできました。

尚、ファイルアップロードサイズがPHP.iniで設定されているサイズになるので変更する場合はそちらの修正が必要です。

## あとがき
設定するだけなら簡単にできました。見た目もいいし良い感じがしました。
本格的に使うならセキュリティ考えなきゃな。。。
EspressoでSpinner内の特定の選択肢をクリックしたい


# tl;dr

[Espresso recipes](https://google.github.io/android-testing-support-library/docs/espresso/advanced/)読もう。

# 単純な場合

例えばSpinnerの選択肢の「hoge」をクリックしたい場合、セオリー通りに書くなら次のような感じです。

```java
onData(allOf(is(instanceOf(String.class)), is("hoge"))).perform(click());
```

# AmbiguousViewMatcherExceptionとの戦い

普通はこれで全く問題ないのですが、どうしても同じ画面内に「hoge」を表示している個所が複数あってAmbiguousViewMatcherExceptionになってしまう場合があって頭を抱えました。

Matcher&lt;String&gt;とMatcher&lt;View&gt;を同居させることはできないので、「あるViewの子View」みたいな条件を増やすことはできません。

Spinnerをクリックした時のポップアップのView Herarchyを調べてみると次のような感じです。

```
View Hierarchy
+>PopupDecorView
|
+->PopupBackgroundView
|
+-->DropDownListView
|
+--->AppCompatCheckedTextView
|
+--->AppCompatCheckedTextView
|
+--->AppCompatCheckedTextView
|
以下略
```

ずらっと並んだAppCompatCheckedTextViewの中に目的の選択肢がありますので、以下のようなコードで叩くようにしました。

```java
onView(allOf(withText("hoge"), withParent(withClassName(endsWith("ListView"))), withClassName(endsWith("TextView")))).perform(click());
```

すると、最初の方の選択肢だった場合は問題なくクリックできますが、選択肢がとても多いSpinnerだった場合は一定のインデックス（画面に完全に表示しきれていないもの）以後は以下のようなエラーになってしまいました。

```
Error performing 'single click' on view '(with text: is "hoge" and has parent matching: with class name: a string ending with "ListView" and with class name: a string ending with "TextView")'.
```

[ViewActions.click()](https://developer.android.com/reference/android/support/test/espresso/action/ViewActions.html#click())のドキュメントには「must be displayed on screen」とありますので、表示できていないViewで実行できないのは当然です。ここで単純にscrollTo()すればいいんじゃね？とやると「NoMatchingViewException: No views in hierarchy found matching」になります。PopupだからActivityのView Hierarchyにないからダメということでしょうか。

最早この時点で「画面に表示しきれないくらいのたくさんの選択肢をSpinnerに表示するんじゃない」と言われている気がします。とはいえ目の前に生きたプロダクトがありそいつに対してテストをしなくてはなりません。こういう時は困ったときの[Espresso recipes](https://google.github.io/android-testing-support-library/docs/espresso/advanced/)です。[Using inRoot to target non-default windows](https://google.github.io/android-testing-support-library/docs/espresso/advanced/#using-inroot-to-target-non-default-windows)というぴったりのものがありました。これを使って冒頭に書いたコードを直します。

```java
onData(allOf(is(instanceOf(String.class)), is("hoge")))
  .inRoot(withDecorView(not(is(activityTestRule.getActivity().getWindow().getDecorView()))))
  .perform(click());
```

今度は問題なくすべてのテストが完遂しました。Spinnerに全く同じ選択肢が複数あることはあり得ないはずなのでこれでよさそうです。そもそもNoMatchingViewExceptionを吐いたときに「you may need to use Espresso.onData to load it from one of the following AdapterViews:android.widget.ListPopupWindow$DropDownListView{...」みたいな警告が出るのでonViewを使うのは筋悪でしょう。

回り道をしましたが、最初からレシピを読んでおけばよかっただけの話でした。
touchmove時は発火しないカスタムイベント

###仕様
SPとタブレット時の話です。
touchstartやtouchendでイベントを定義していると、スクロール時にもイベントが走ってしまう。
これを予防して、タップの時のみイベントが走るようにしたい。

###カスタムイベントを作成
```js:js
//es6を一部使っているのでbabel通さないと動かないです
var compare_y = (evt) => {
    var touchObj,
        touchstartY,
        touchendY;
    document.addEventListener('touchstart', (e) => {
        touchObj = e.changedTouches[0] ;
        touchstartY = touchObj.pageY ;// Y座標
    });
    document.addEventListener('touchend', (e) => {
        touchObj = e.changedTouches[0] ;
        touchendY = touchObj.pageY ;// Y座標
        if(touchstartY == touchendY) {
            //touchstartのY座標とtouchendのY座標が同一だった場合、カスタムイベントを発火させる
            e.target.dispatchEvent(evt);
        }
    });
};
var touchDecision = () => {
    //uaはuseragent判定用のjsをreqireしてます
    if (!ua.Mobile && !ua.Tablet) return;
    //tapと言うカスタムイベントを作成
    var custom = new CustomEvent('tap');
    compare_y(custom);
};
```
これでタップの時だけに発火するカスタムイベントができました。

###使うとき
```js:js
var _touch = ('ontouchstart' in document) ? 'tap' : 'click'; //PC時はclick、SPとタブレットはtap

var func = function(){
    var $trigger = $('[data-trigger]');
    if(!$trigger.length) return;
    $trigger.on(_touch, function(){
        console.log('tap or click');
    });
};

$(function () {
    touchDecision();
    func();
});
```

###まとめ
もっといい方法があるとは思うんですが、とりあえず自分で考えた限りだとこうなリました。
MegaRAIDに接続した物理ディスクのSMARTを読もうとした

# MegaRAIDに接続したSATAディスクのSMARTを読みたいが…
DellのサーバーのH310などのRAIDカードで構築したディスクアレイの場合、そのままだとメンバディスクのSMARTを読みだすことができない。

このような場合、`smartctl`に`-d`オプションをつけてタイプを指定してあげるとよいらしいのでそのメモ。

# smartctlのオプションで対応可
私の場合、`smartctl -a -d sat+megaraid,0 /dev/sda`として読みだした。
はじめは`-d megaraid,0`などとしていたが、`MegaRAID SAT layer is reportedly buggy, use '-d sat+megaraid,N' to try anyhow`ということで、言うとおりにした。

SATとは、SCSI/ATA Translationで、SASカードにSATAディスクをつないだ場合に行われる変換（マッピング）らしい。https://en.wikipedia.org/wiki/SCSI_/_ATA_Translation

# TODO

`-d` に指定する内容はどうやって判断したらいいのか調べる
テクスチャを常にカメラに向ける（ビルボード）


テクスチャが常にカメラの視線ベクトルに対して垂直である状態をつくる

以下の記事がほとんど答え
[#1 [prog] three.jsでビルボード](http://blawat2015.no-ip.com/~mieki256/diary/201604271.html)
[クォータニオンとビルボード](https://wgld.org/d/webgl/w035.html)


## PlaneGeometry

デモ：https://mo49.github.io/qiita/20160908/billboard-PlaneGeometry.html

render()の中に以下のコードを書いて更新する

```javascript:カメラの向きに回転
for (let val of this.arr) {
  // val.quaternion.copy(this.camera.quaternion); // こちらでも動く
  val.rotation.setFromRotationMatrix(this.camera.matrix);
}
```

## Sprite

デモ：https://mo49.github.io/qiita/20160908/billboard-Sprite.html

```javascript
const mat = new THREE.SpriteMaterial({transparent:true});

const mesh = new THREE.Sprite(mat);
mesh.scale.set(width,height,1);
```
VirtualBox で、DHCPで割り当てたアドレスをコマンドラインから確認したい

# 概要

Virtualbox で起動したマシンに割り当てられた DHCP の IP アドレスを、コマンドラインから確認したい


# 結論

以下のコマンドで確認出来る

```
VBoxManage guestproperty enumerate 仮想マシン | grep IP
```

# 確認したIPとうまくつながらない時

host only adapter で DHCP を配っている時に、DHCP サーバーの配っているアドレスが
host only adapter に設定してある IP アドレスからアクセスできるかを確認する。

# 参考情報

[How to get IP address assigned to VM running in background?](http://superuser.com/questions/634195/how-to-get-ip-address-assigned-to-vm-running-in-background)
サーバ作業中にコマンドを間違えてえらいことになったのでサーバのホスト名ごとにプロンプトの色を変える

サーバの作業中に「このターミナルは履歴を使って…」「あっっっっ、間違えてファイル削除しちゃった！」とかしてえらいことになりました。

# 説明
ホスト名はユニークなものを付けるようにしているので、ホスト毎に別の色を付けるようにしました。


<img width="327" alt="Screen Shot 2016-09-14 at 5.13.37 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/47327/fb4c9cf5-a76c-91d4-167f-6a3c81936200.png">

<img width="229" alt="Screen Shot 2016-09-14 at 5.13.43 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/47327/6956dd2e-3fe3-8b4b-4277-2db61d9b9751.png">

上のホスト(Macのローカルのターミナル)とリモート(Ubuntuサーバ)では緑系と青系の色という風に感じでホスト毎に色が違っています。

きっとこれで間違えなくなるはず！

# やったこと

```zsh:~/.zshrc

function hashed_color () {
  hash=`echo $1 | cksum | cut -d' ' -f1`
  COLOR=$(( $hash % 256 ))
  echo $COLOR
}

HOSTNAME=`hostname`
host_color=`hashed_color $HOSTNAME`

PROMPT=$'
%F{$host_color}%n${PR_RST} @ %F{$host_color}%M${PR_RST} in %{$limegreen%}%~${PR_RST} $vcs_info_msg_0_$(virtualenv_info)
$ '
```

oh-my-zshのsteeefというテーマのプロンプトを元に色づけしました。
hostnameで取れる文字列を0〜256の間でハッシュ化し、プロンプトの色に紐付けています。

# その他
## 色の上限
0〜256で決めうちしています。もしかしたら黒色とかになって見にくいとかあるかもです。その場合にはバックグラウンドを指定する必要がありそうです。

## CRC
https://en.wikipedia.org/wiki/Cksum


# 参考
> zshプロンプトのカスタマイズ
> http://qiita.com/yamagen0915/items/77fb78d9c73369c784da

> 13 Prompt Expansion
> http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html

> zshでプロンプトをカラー表示する
> http://qiita.com/mollifier/items/40d57e1da1b325903659
Zabbix3.0.4→3.2.0へアップグレード

CentOS7で動かしているZabbix3.0.4を出たばかりのZabbix3.2.0へアップグレードしました。

# １．前準備
## エージェント／サーバを停止。
<pre>
systemctl stop zabbix-agent
systemctl stop zabbix-server
</pre>
## DBをバックアップ
<pre>
pg_dump -U zabbix zabbix > backup_zabbix.psql
</pre>
## 現在のパッケージを確認
<pre>
rpm -qa |grep zabbix
</pre>
```
zabbix-web-3.0.4-1.el7.noarch
zabbix-sender-3.0.4-1.el7.x86_64
zabbix-agent-3.0.4-1.el7.x86_64
zabbix-web-japanese-3.0.4-1.el7.noarch
zabbix-get-3.0.4-1.el7.x86_64
zabbix-server-mysql-3.0.4-1.el7.x86_64
zabbix-server-pgsql-3.0.4-1.el7.x86_64
zabbix-web-pgsql-3.0.4-1.el7.noarch
zabbix-release-3.0-1.el7.noarch
zabbix-java-gateway-3.0.4-1.el7.x86_64
zabbix-proxy-pgsql-3.0.4-1.el7.x86_64
zabbix-proxy-sqlite3-3.0.4-1.el7.x86_64
zabbix-proxy-mysql-3.0.4-1.el7.x86_64
```

# ２．アップグレード
zabbix-releaseパッケージもrepodataも用意されていないので、RPMを直接アップグレード。

## アップグレード
<pre>
rpm -Fvh http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-agent-3.2.0-1.el7.x86_64.rpm         \
         http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-get-3.2.0-1.el7.x86_64.rpm           \
         http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-java-gateway-3.2.0-1.el7.x86_64.rpm  \
         http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-proxy-mysql-3.2.0-1.el7.x86_64.rpm   \
         http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-proxy-pgsql-3.2.0-1.el7.x86_64.rpm   \
         http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-proxy-sqlite3-3.2.0-1.el7.x86_64.rpm \
         http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-sender-3.2.0-1.el7.x86_64.rpm        \
         http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-server-mysql-3.2.0-1.el7.x86_64.rpm  \
         http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-server-pgsql-3.2.0-1.el7.x86_64.rpm  \
         http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-web-3.2.0-1.el7.noarch.rpm           \
         http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-web-japanese-3.2.0-1.el7.noarch.rpm  \
         http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-web-mysql-3.2.0-1.el7.noarch.rpm     \
         http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-web-pgsql-3.2.0-1.el7.noarch.rpm
</pre>

# ３．zabbixエージェント設定変更
/etc/zabbix/zabbix_agentd.conf.rpmnewとしてインストールされるので3.0の設定ファイルに上書きしてから編集

```text:/etc/zabbix/zabbix_agentd.conf
Server=xxx.xxx.xxx.xxx
#Hostname=Zabbix server
HostnameItem=system.hostname
```
# ４．zabbixサーバー設定変更
/etc/zabbix/zabbix_server.conf.rpmnewとしてインストールされるので上書きしてから編集
※PostgreSQL用の設定

```text:/etc/zabbix/zabbix_server.conf
DBHost=
DBUser=zabbix
DBPassword=XXXXXXXX
# DBSocket=/tmp/mysql.sock
DBPort=5432
ListenIP=0.0.0.0
```

# ５．起動
<pre>
systemctl start zabbix-server
systemctl start zabbix-agent
</pre>

# ６．フロントエンド
DBの接続設定なども引き継がれましたが、なぜかChromeでは再ログインできず。
Firefoxでは問題無いんだが…
※Chromeのシークレットモードでは問題なくログインできたのでキャッシュ等の問題かな。

![zabbix_3.2.0.png](https://qiita-image-store.s3.amazonaws.com/0/63464/c31be2e8-9765-1745-40df-b4b859a90264.png)
【MSSQL】MSSQL Server 2008 R2を使うのに色々困ったこと

＊SQLServer 2008 R2のインストール、アプリからつなげるまでに困ったことまとめ。

## 最初のログインは
- 一番最初のログインはサーバーインストール時に設定したパスワードさえ覚えておけば良い
- あとは↓の画像のように必要な値を入力してログインできる
    - サーバー名：localhost, (local) 
    - ログイン：sa
    - パスワード：初期インストール時に設定

![MSSQLログイン.PNG](https://qiita-image-store.s3.amazonaws.com/0/77327/6a6e808b-fd9f-02c8-5b3b-c36195e3e247.png)

## 別のユーザーを作成するには
- 左ペインのログイン上で右クリックして、新しいログインを選択
![ユーザー作成1.PNG](https://qiita-image-store.s3.amazonaws.com/0/77327/2bcb0a8b-d743-daf7-7870-10ff3d2a7300.png)

- 全般ページでログイン名と認証方式、既定のデータベースを設定する
    - SQL Server認証でユーザーを作成できない場合はここで"パスワードポリシーを適用する"のチェックをはずすと上手くいく
![ユーザー作成2.PNG](https://qiita-image-store.s3.amazonaws.com/0/77327/44e5dbdd-abe5-3401-579c-e5251ca89075.png)

- 続いて、ユーザーマッピングで指定したDBのdb_owner設定をする
![ユーザー作成3.PNG](https://qiita-image-store.s3.amazonaws.com/0/77327/01a8d944-e35e-54a4-e33b-48cdd5cdef5d.png)

- OKして、左ペインのログイン直下を見ると新しいユーザーができている

## 別のユーザーでログインできない
- 認証方式の設定が正しくないのかもしれない
- 左ペインのlocalhost上で右クリックして、プロパティを選択する
![ユーザー作成4.PNG](https://qiita-image-store.s3.amazonaws.com/0/77327/8d615043-b6c9-fcbe-a33b-816480924512.png)

- セキュリティページでサーバー認証を"SQL Server認証モードとWindows認証モード"に設定する
![ユーザー作成5.PNG](https://qiita-image-store.s3.amazonaws.com/0/77327/6738a722-129c-d915-5063-434c4ca2c143.png)

## Webアプリからつなごうとすると変なエラー
- Failed to connect to undefined:1433???
- すべてのプログラムからたどって、SQL Server 構成マネージャーを開く
![1443.PNG](https://qiita-image-store.s3.amazonaws.com/0/77327/8242a9cf-a7af-23bd-b3d5-8408fbb9d90e.png)

- 左ペインのSQL Serverネットワークの構成＞MSSQLSERVERのプロトコルを選択
![1443_2.PNG](https://qiita-image-store.s3.amazonaws.com/0/77327/ed66355e-a6ed-f4ad-19e2-da32f39d7065.png)

- 右ペインに現れたTCP/IP上で右クリックして、プロパティを開く
- IPアドレスタブに移動し、IPAllのTCPポートに1433を入力する
![1433_3.PNG](https://qiita-image-store.s3.amazonaws.com/0/77327/0457e986-e07b-1459-4f57-665821a310d0.png)


＊また困ったことがあれば追記していきます
1:1の関連付けをするとRailsは優しいからこんなこともしてくれちゃうおかげで小1時間詰んだお話

モデルAとモデルBが1：1の関係性の時
@a = A.new　したやつ
@b = B.newしたやつ

@a に　@bを紐付けた後
@a2 に　@bを紐付けると

@aと@bの紐付けが自動的に解除されるらしい。。。。

1：1の制約を守るためにやってくれてるんだね(´・ω・｀)

ありがとう、rails
Active Model Serializerで深くネストした関連を含めたい

追記：バージョンは`0.10.2`

Active Model Serializerで再帰的に関連を含んだjsonを出したかったが、
デフォルト設定では、深さが1までしか関連を含んでくれないため、想定通りに出なかった。

#### serializers

```ruby
class HogeSerializer < ActiveModel::Serializer
  attributes :id, :name
  has_one :fuga
end
```

```ruby
class FugaSerializer < ActiveModel::Serializer
  attributes :id, :name
  has_one :piyo
end
```

```ruby
class PiyoSerializer < ActiveModel::Serializer
  attributes :id, :name
end
```

#### 欲しいjson

```json
{
    "hoge": {
        "id": 1,
        "name": "ほげ",
        "fuga": {
            "id": 1,
            "name": "ふが",
            "piyo": {
                "id": 1,
                "name": "ぴよ"
            }
        }
    }
}
```

#### 実際に出力されたjson

```json
{
    "hoge": {
        "id": 1,
        "name": "ほげ",
        "fuga": {
            "id": 1,
            "name": "ふが"
            # piyoがない！
        }
    }
}
```

解決するには、`ActiveModelSerializers.config.default_includes = '**'`のように設定してやると良い。
https://github.com/rails-api/active_model_serializers/pull/1426

ちなみにデフォルトは、`'*'`

'**'ってなんなん、、、

## 追記
全体に設定したくない場合は、controller側での`render`に`include`をつけてやればできる。

```ruby
class HogeController < ApplicationController
  def index
    @hoge = # 略
    render json: @hoge, include: ['fuga', 'fuga.piyo']
    #                or include: 'fuga,fuga.piyo'
  end
end
```

参考→ https://github.com/rails-api/active_model_serializers/blob/master/docs/general/adapters.md#included

上記のURLにも記述があるが、`*`の意味は以下のように定義されているらしい
- `*`は深さ1までの関連を含む
- `**`は深さすべて再帰的に関連を含む

なので、すべての関連を含めたいときは、以下のように書いてやると簡単に書ける

```ruby
class HogeController < ApplicationController
  def index
    @hoge = # 略
    render json: @hoge, include: '**'
  end
end
```

さらに、指定したモデル以下のすべての関連を出したいときは以下のようにも書ける

```ruby
class HogeController < ApplicationController
  def index
    @hoge = # 略
    render json: @hoge, include: 'fuga.**'
  end
end
```
FOSOAuthServerBundle利用時、期限切れトークンを削除するタイミングについて

FOSOAuthServerBundleを使用していると、
気づいたときには期限が切れたトークンがDBに溜まっています。

この溜まったトークンをどうするのか、
消せばいいんだけれどどのように消すのがスマートなのか、
どのタイミングで消せばいいのかわからなかったので調べてみました。

ここのページが多いに参考になりました。
https://github.com/FriendsOfSymfony/FOSOAuthServerBundle/issues/236

上記を意訳すると、
ログアウトしたタイミングではサーバのトークンを削除するのではなく、
クライアントのcookieに保存してあるトークンを破棄し、
サーバ側のトークンはcronを使って定期的に期限が切れたトークンを削除するのがよい、
とありました。

そして以下のコマンドを実行すれば期限切れのトークンを一括で削除してくれます。

```
$ php app/console fos:oauth-server:clean
Removed 72 items from Access token storage.
Removed 0 items from Refresh token storage.
Removed 0 items from Auth code storage.
```

ログアウトのAPI作成し忘れた！と気づいてログアウトについて調査しましたが、
FOSOAuthServerBundleを利用した場合のログアウトは上記のやり方がよさそうです。
つまり、アプリ側に任せてサーバ側はcronで定期的に掃除するだけです。
Railsで住所からGoogleMapを表示する。しかも5分で。


前提
------

 - 住所(addressとする)を持つモデルがすでにある(Userとする）
 - 住所を更新することができる
 - asset pipeline使わない


gemをいれる
------

```Gemfile
gem "gmaps4rails"
gem "geocoder"
```

```
bundle install
```

migration
------

緯度経度を保存するカラム追加

```
rails g migration AddLatitudeAndLongitudeToUsers latitude:float longitude:float

rails db:migrate
```

JS
-------

```
rails g gmaps4rails:copy_js
```

```header.haml

%script(src="//maps.google.com/maps/api/js?v=3.23")
%script(src="//cdn.rawgit.com/mahnunchik/markerclustererplus/master/dist/markerclusterer.min.js")
%script(src='//cdn.rawgit.com/printercu/google-maps-utility-library-v3-read-only/master/infobox/src/infobox_packed.js' type='text/javascript')
%script(src='/javascripts/gmaps_google.js')

```

Model
-------

`address` 部分は住所や駅名等のカラムを指定する。

```
geocoded_by :address
after_validation :geocode
```


View
-------

Mapが表示されるところ。サイズはご自由に。指定しないと何もでない。

```表示したいとこ.haml
%div(style="width: 100%;" )
  #map(style="height: 200px;" )
```

`google.maps.LatLng` の部分で緯度経度を渡している。

```
:javascript
  handler = Gmaps.build('Google');
  handler.buildMap({
    provider: {
      zoom: 12,
      center:    new google.maps.LatLng(#{@user.latitude}, #{@user.longitude}),
      mapTypeId: google.maps.MapTypeId.ROADMAP
    },
    internal: {id: 'map'}}, function(){
    handler.fitMapToBounds();
  });
```


はい！！ここまでで5分！！

やってみる
--------


![Screen Shot 2016-09-14 at 16.18.24.png](https://qiita-image-store.s3.amazonaws.com/0/10058/60ab66e1-cca7-9173-e5dd-d824aa16261d.png "Screen Shot 2016-09-14 at 16.18.24.png")

![Screen Shot 2016-09-14 at 16.18.39.png](https://qiita-image-store.s3.amazonaws.com/0/10058/6aef3b8e-2a49-6ecf-2991-660047e2740b.png "Screen Shot 2016-09-14 at 16.18.39.png")


でましたー。

まとめ
-------
住所や駅名を保存するタイミングでGeocodingを行い緯度経度を取得＆保存を勝手にやってくれる。とても便利。
deviseで認証しているRailsアプリケーションにcurlする

## やりたいこと

ローカルで開発中のRailsアプリケーションに対してcurlでユーザ認証して、ログインが必要なエンドポイントのAPIを叩きたい。

以下の条件のアプリケーションを前提にしています。

* 認証にdeviceを使っている
* session管理をcookie(Railsデフォルト)で行っている
* csrfトークンは考慮していないので、:point_down: のようにチェックを一時的にスキップさせた

```app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  skip_before_action :verify_authenticity_token, if: -> {request.format.json?}
end
```

## 方法

### ログイン

ログインが成功し、cookieにログイン情報が格納される

```
curl -H 'Content-Type: application/json' \
  -X POST http://localhost:3000/users/sign_in \
  -d '{"user":{"email":"your_email_address@example.com","password":"your_password"}}' \
  -c cookie
```

:point_down: なレスポンスが返る

```
<html><body>You are being <a href="http://localhost:3000/">redirected</a>.</body></html>
```

### ログインが必要なAPIにアクセス

`-b cookie` でcookieをつけてリクエストする、成功するはず:+1:

```
curl -H 'Content-Type: application/json' \
  -X GET 'http://localhost:3000/api/items' \
  -b cookie
```
胡侃 redux vs react




`redux` 是由 `reactjs `而来, 他们都是从` fb `哪里出来的产物. 而其实对于外人来学习这个东西我认为并不会有很多人能够一下子了解并且接受这样的一个解决方案. 因为往往一些所谓优秀的解决方案无非都是来自于一线的生产实践当中. 而解决了实际棘手的问题之后, 加之有心的人的提炼精华,才有了最后的这样的一个不管是思想,还是框架,或者类库的产物.

而为什么` fb` 哪里出现了` react` 呢, 为什么又接着出现了` redux`呢. 这些可能一时半会不会有外人能够说得清道得明. 当然我们可以只是把当前的` redux`作为当下一个非常人气的前端开发框架来学习, 不过每每总想着了解前世今生,做到从精神层面的了解和理解. 这才是一种学习. 或者说在真正了解并且理解`为什么`他们会`这样做`, 而我`为什么`没有`那样做`,或者我能够在接下来的工作之间`怎么样`,如何从学习他们`怎么样`的基础上让自己也明白`怎么做`, 这才是非技术层面上的学习, `铁打的想法和流水的技术(框架)`.
Docker compose 特点

- 单一宿主提供多隔离环境
- 预留空间给容器
- 只重建容器被修改部分
- 多环境间共享变量和部件

#安装 docker engine & compose

> 看文档自己装


安装完之后, 需要设置下 linux 的 group 东东,不然会每次都需要` sudo` 执行 docker 命令.
因为默认` docker` 常驻进程它是绑定要一个` Unix` 的` socket` 上来,来替代`TCP` 端口的. 而` Unix socket` 它是由` root` 来管理的. 所以一般情况下只有` root` 或者具有 root 权限` sudo` 的用户才开业操作. 为了能够避免这个, 通常就需要创建一个group, 我们开业选` docker` 作为 group 的名称, 然后呢,追加你自己到这个 group 中去.这样在启动 docker 进程的时候让这个 group 也有这个 socket 的读写权限, 那么就不需要在每次 sudo 额.

通常是这样的:

1. 登录
2. 创建` docker` 组 > sudo groupadd docker
3. 添加自己到这个组 > sudo usermod -aG docker your_name
4. 登出在登录
5. 验证


另外就是设置 docker 常驻进程在启动的时候就启动.

> sudo chkconfig docker on
ECS上のgo製プログラムのプロファイル覗き見る

SSHトンネリングに必要な情報を得るための手順が多くて忘れるのでメモ。
うっかり`sudo`忘れる。

## 前提

goのpprofについては

* http://blog.livedoor.jp/sonots/archives/39879160.html

とか

* http://qiita.com/ikawaha/items/e3b35f09fb49e9217924

とか参照。
当然profiler動いてなきゃ話にならんので注意。

## トンネリング

1. ECSのタスク選ぶ
2. instanceのIP見る
3. `ssh`で入って`sudo su -`
4. `docker ps`で、対象サービスのコンテナ探してIDを確認

    ```
    $ docker ps -f name=api-server --format="{{.ID}}"
    123a456b78
    ```

5. `docker inspect`で、対象コンテナIDからコンテナのIPアドレス取得

    ```
    $ docker inspect --format="{{ .NetworkSettings.IPAddress }}" 123a456b78
    172.17.0.1
    ```

6. `ssh`抜ける
7. localhostの適当なポートに、指定インスタンス経由でコンテナのプロファイラのポートをトンネリングさせる

    ```
    # ssh <instanceIP> -L <port>:<container IP>:<prof port>
    $ ssh 56.64.122.32 -L 9999:172.17.0.1:33680
    ```

## プロファイラ見る

```
go tool pprof localhost:9999/debug/pprof/profile
```
rex0220 レコードタイトル設定プラグイン

# レコードタイトル設定プラグイン(販売停止)
※[計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)で同等の処理を実現できます。

スマホで kintone アプリの一覧画面を見ると、レコード番号しか表示されないのでわかりにくいものです。
レコードタイトルを設定すると、項目の値が表示されますが、今度はレコード番号が無い。
ということで、レコード番号と文字列項目を連結して、レコードタイトル項目に自動設定するプラグインです。

- ＰＣ、スマホの新規レコード追加時・編集時、レコードタイトルを自動設定
- 既存レコードのレコードタイトル項目をプラグイン設定値で更新可能

※通し番号プラグインとは、１アプリ内で同時使用できません。

[rex0220 stores](https://rex0220.stores.jp/)で、販売中です。

下記のように、一覧にレコード番号と項目が表示されます。

![rec01.png](https://qiita-image-store.s3.amazonaws.com/0/100572/50ddcf5c-14ab-2447-a175-5d2b60c51b99.png)

# スマホの新規レコード追加

スマホで新規レコード追加を行っても、レコードタイトルが自動設定されます。

![rec02.png](https://qiita-image-store.s3.amazonaws.com/0/100572/ab729c1f-c901-6914-a5e4-8a4f9aa0a374.png)

# PCでの新規レコード追加

もちろん、PC でもレコードタイトルが自動設定されます。

![rec03.png](https://qiita-image-store.s3.amazonaws.com/0/100572/47d3f3d5-6689-55e0-f7b7-65428a94436e.png)


# レコードタイトル項目の設定

- フォーム設定で、レコードタイトルにする文字列項目を追加します。

![rec03a.png](https://qiita-image-store.s3.amazonaws.com/0/100572/f2686c80-fc5d-7a7b-5398-29a21dd5ba89.png)



- 「レコードのタイトル」を選択します。

![rec04.png](https://qiita-image-store.s3.amazonaws.com/0/100572/d3f0f85c-90c0-6097-4eeb-6fe34319438e.png)



- 追加したレコードタイトル項目を設定します。

![rec05.png](https://qiita-image-store.s3.amazonaws.com/0/100572/fd345846-31d5-4641-a4d4-d43d221798fd.png)


# プラグインの追加

![rec11.png](https://qiita-image-store.s3.amazonaws.com/0/100572/3f38579e-91e4-0b53-facf-9947671153c9.png)


# プラグインの設定

- プラグイン有効：　プラグインの有効／無効を指定。
- タイトル項目、区切り文字、表示項目1、表示項目2 を指定します。
- タイトル項目、表示項目1、表示項目2 は、クリックすると項目リストが表示されますので選択します。
- 設定値変更後、Enter キー、Tabキー、矢印キーで確定します。
- 入力が確定すると、上部のタイトル項目、フォーマット欄に反映されます。
- 既存レコードの変更が必要な場合は、「既存レコードを変更」をクリックします。
- 設定完了時、「保存する」をクリックします。

![rec12.png](https://qiita-image-store.s3.amazonaws.com/0/100572/d12477f6-3134-b45a-d053-1f24319d6b85.png)

# 既存レコードの変更

プラグインの設定内容で、既存のレコードタイトル項目の設定値を変更します。
全レコードを更新しますので、事前にデータのバックアップを取ってから実行してください。
フォーム変更を行った場合は、本番環境に反映後に既存レコードの変更を行ってください。

![rec13.png](https://qiita-image-store.s3.amazonaws.com/0/100572/25a72c96-3395-905f-25b6-3d9c027dfd09.png)

# 注意事項

- 既に、JavaScript によるカスタマイズを行っているアプリの場合、処理が競合して、エラーになる場合があります。その場合は、該当するアプリでプラグインの使用を中止してください。
- アプリ設定を変更した場合は、プラグインを再設定してください。
Raspberry Pi Jessieのvirtual desktop

# Raspberry Piのvirtual desktopを復活する方法
新しいRaspberry Piのカーネル Jessieから、virtual desktopが消えてしまいました。
virtual desktopとは、画面イメージを仮想で何枚も持つことが出来る機能で、たくさんのウインドを開く必要があるプログラミング開発では必須の機能でした。ちょうど、パッケージを見つけることができたので忘備録として記載しておきます。

## install方法
sudo apt-get install obconf

## 設定方法
obconfをインストールすると、「menu」 --> 「設定」 --> 「Openbox Configuration Manager」が追加されました。
これを開いて、「デスクトップ」タブを押し、デスクトップの数を適当な数字にします。個人的にはいつも3にしています。

これでデスクトップを拡張することはできたのですが、後はメニューバーに選択画面を表示させておきたいと思います。

メニューバーを右クリックして「パネルの設定」を押します。
「パネルアプレット」タブを選択して、「追加」ボタンを押します。
そこで、「デスクトップページャー」を選択してOKを押せば、メニューバーを押したら画面の切り替えもできるようになりました。
MySQL FROM DUAL

MySQL では下記のようなクエリが通る。

```
SELECT 1 as value;
-- value: 1 が返される
```

でも where 句をそのままつなげるとエラーになる。

```
SELECT 1 as value WHERE true;
-- You have an error in your SQL syntax; ~~ near 'WHERE true'
```

でも FROM DUAL を使えば where 句を書くことができる。

```
SELECT 1 as value FROM DUAL WHERE true;
-- value: 1 が返される
```

何に使うのだろうか。それは皆さんで考えて欲しい。

※私は仕事で偶然にも役にたった
Xcode8で以前のPluginを使う方法


Xcode8ではそれまで利用できたPluginが使えなくなります。
代わりにXcode Editor Extensionsを使うのですが、まだまだなので、揃うまでは以前のPluginを使いたいです。

# update_xcode_plugins

そこで[update_xcode_plugins](https://github.com/inket/update_xcode_plugins)を使います。

README.md通りにやれば良いだけですが、簡単に書いておきます。

## インストール

```
$ gem install update_xcode_plugins
```

試しにdry-run

```
$ update_xcode_plugins --dry-run
```

## 実行

以下を実行するとpluginがupdateされます。

```
$ update_xcode_plugins
```

いくつかのPluginはこれだけでは動作しないみたいです。

その場合は、以下のコマンドです。

```
$ update_xcode_plugins --unsign
```

インストールしているXcodeが表示されるので対象のXcodeで```Yes```します。

```Unsign xcodebuild too?: ``` と聞かれるので、NOにします。


かなり時間がかかりますが、終わると```Xcode-unsigned.app```が作成され、こちらを利用するとPluginが利用可能になります。

## Xcode再起動

その後、Xcodeを再起動すると、お馴染みの```Load Bundles```のアラートが出るので、Loadします。

以下のPluginが動作しました。

```
- Alcatraz (1.1.19)
- ClangFormat (1.0)
- RealmBrowser (1.0)
- RealmPlugin (1.0)
- Swimat (1.8.10)
- VVDocumenter-Xcode (1.0)
- XVim (1.01)
```
Three.jsで微調整・デバッグしたいとき


REVISION: '78'

## ヘルパーライブラリ

http://qiita.com/mo4_9/items/d8186b84a10c7bcced9a


## デバッグツール

[WebGLの開発やデバッグに便利なブラウザ拡張機能をつかってみよう](http://qiita.com/rootx/items/4f7401d1a6d22cb589c9)


## getObjectByName

オブジェクトに名前をつける

特定のオブジェクトに発生した問題を発見できる

```javascript
// 名前をつける
cube.name = "cube-" + scene.children.length;

// clickやraycastで当たったオブジェクトを表示してみるとか、
// 名前が分かっていれば直接getObjectByName()の引数に入れてみる
console.log( scene.getObjectByName(cube.name) );
```

idで見るのもあり。名前のほうがわかりやすけど。
http://stackoverflow.com/questions/18385564/how-the-elements-of-scene-children-in-threejs-can-be-accessed

## console.log

chromeの開発者ツールのConsoleなどを利用。例えば、meshのpositionやscaleを書き換えることでも変更を確認できる。

## その他

コードを実行時に何が変更できて、変更できないかは、こちらで確認
https://github.com/mrdoob/three.js/wiki/Updates


> 参考
[初めてのThree.js 第2版――WebGLのためのJavaScript 3Dライブラリ](https://www.oreilly.co.jp/books/9784873117706/)
CentOSのyumでどのパッケージがどんなアップデートされるか調べたコマンド

`yum`に`info`して`egrep`

下記はKUSANAGIでのアップデート情報を調べたコマンド例。

```bash
$ sudo yum info kusanagi kusanagi-hhvm kusanagi-nginx | egrep 'Name|Version'
```

```yaml
Name        : kusanagi
Version     : 7.8.2
Name        : kusanagi-hhvm
Version     : 3.13.1
Name        : kusanagi-nginx
Version     : 1.10.0
Name        : kusanagi
Version     : 7.8.3
Name        : kusanagi-hhvm
Version     : 3.14.5
Name        : kusanagi-nginx
Version     : 1.11.3
```
Android Studioでレイアウトxml編集中にPreviewを常に表示する

アップデートしたせいか、いつからかxml編集中にPreviewが閉じてしまう(Pinned Mode)ようになったので、編集中も常に表示する(Docked Mode)ようにするための覚え書き

## Previewを表示
![show_preview.png](https://qiita-image-store.s3.amazonaws.com/0/26883/805ec6e7-be85-37c5-50ad-cb34bd9306fc.png)

## Docked Modeにする
![docked_mode.png](https://qiita-image-store.s3.amazonaws.com/0/26883/ea70d4ad-db44-fb54-a6c7-b9c87ef34d49.png)

--- 
以上。
xml見ただけで微調整できる人には不要（？）
scpでポートを指定して、フォルダごとサーバーに送信

<h2>普通にファイルだけ送る場合</h2>

```bash
scp filename username@hostname:test/here/
```
サーバーのホームディレクトリからtest/here/直下に置いている。

<h2>普通にフォルダごと送る場合</h2>

```bash
scp -r directory/ username@hostname:test/here/
```

<h2>ポートを指定して、フォルダごと送る場合</h2>

```bash
scp -r -P port directory/ userame@hostname:test/here/
```
UIテスト自動化ツール

##今回調査した自動化ツールまとめ
- XCUITest
- Earl Grey
- appium
- KIF

##XCUITest
Xcode7から利用できるようになったデフォルトツール

XCTestを拡張し、さらにはAccessibilityの機構を使うことができる


###メリット
アプリケーションと同じ言語で書かれている(swift)

テストステップ毎にスクリーンショットを自動で撮影してログに残してくれる

シミュレータを操作してテストコードを生成することもできる(UI Recoding)

sleep/waitの処理を書かなくてもある程度はやってくれる(3回tryしてくる)

Xcode内に統合されているため導入が簡単

シュミレーターでのUIテストは結構はやい

###デメリット
レコーディングで作成したコードだけでは完璧なUIテストはできない

XCUIElementTypeではないUIオブジェクトは扱えない

https://developer.apple.com/reference/xctest/xcuielementtype?language=objc

長い通信状態が発生する場合ではsleep/wait処理を書かなくてはいけない

任意のタイミングでスクリーンショットが取れない

任意のタイミングでスクリーンショットを撮りたいのであればfastlane/snapshotで補完する方がいい

fastlane/snapshotではスクリーンショットを一覧するためのHTMLファイルも作成してくれる

`snapshot run`で実行が簡単である

http://qiita.com/tamaki/items/f5e9f9985a91fb6a0f06#3-snapshothelperswift%E3%81%AE%E8%BF%BD%E5%8A%A0



##Earl Grey
Google製のiOS自動テストフレームワーク
https://github.com/google/EarlGrey

###メリット
Cocoapodによるインストールで使えるので導入が簡単

Xcode内に統合できる

UI automationを簡単に書けるようにしているのでAccessinility Identifierによる認識ができる

GithubでのEarlGreyのドキュメントが結構充実している

テストはUIと対話する前のアニメーションや、ネットワーク接続などのイベントを自動的に待機しする。 

この際、特にスリープなどを書く必要がないため、テストコードはシンプルになる。

###デメリット
長い通信状態が発生する場合ではsleep/wait処理を書かなくてはいけない

任意のタイミングでスクリーンショットが取れない

accessibilityIDで要素を取得しているので内部コードを変更しなくてはいけない

Recording機能がないので最初から全て自分で書かなくてはならない

##Appium
オープンソースのテスト自動化フレームワーク
https://github.com/appium/appium

###メリット
お気に入りの言語(rubyやpythonなど)でテストがかける

iOSとAndroidでテストコードを共通化できる

シミュレータを操作してテストコードを生成するRecording機能が使える

Appium自体はHttpServerであり、iOSの場合はこのサーバーからInstrumentsを経由してクライアント(端末側)を操作しているので、テストするアプリに全く手を加えなくていい

http://developers.mobage.jp/blog/2014/7/25/appium

###デメリット
appiumの導入は他のUIテストツールも多少時間がかかる

http://qiita.com/tabbyz/items/36629fe2a3c82e3e4933

iOS開発言語であるswiftでテストコードが書けない

Recording機能でのテストコードの作成がかなり遅い

##KIF
Squareが開発しているiOSテスト自動化フレームワーク

https://github.com/kif-framework/KIF

###メリット
SwiftとObject-Cでテストコードが書ける

CocoaPodsによるインストールで使えるので導入が簡単である

開発者自身で操作の定義をすることもできる

http://qiita.com/teyamagu/items/c435f69b482eff12873c

###デメリット
accessibilityIDで要素を取得しているので内部コードを変更しなくてはいけない

Swiftでも書けるがSwiftの文献がかなり少ない


##参考文献
http://qiita.com/dreamagicjp/items/d48fc2be16b8e04937d4
http://qiita.com/IsaoTakahashi/items/f9c3ef367d7e0f60e2d6
http://www.slideshare.net/kenichitatsuhama/appium-ios-android-ui
CentOS7でphp5.6でphpMyAdmin


```shell-session
rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/7/x86_64/e/epel-release-7-8.noarch.rpm
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum install --enablerepo=remi --enablerepo=remi-php56 php php-opcache php-devel php-mbstring php-mcrypt php-mysqlnd php-phpunit-PHPUnit php-pecl-xdebug php-pecl-xhprof php-mysqli
systemctl restart httpd.service
```

```php:php.ini
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = "Asia/Tokyo"
```
[cocos2dx]runActionから他のNodeのActionを呼び出す


## サンプル
// NG

```cpp
Node* nodeA;
Action* actionA = Sequence::create(...);

Node* nodeB;
Action* actionB = Sequence::create(...,
  CallFunc::create[nodeA, actionA](){
    nodeA->runAction(actionA);
  }),
  nullptr);

nodeB->runAction(actionB);
```

// OK

```cpp
Node* nodeA;
Action* actionA = CallFunc::create([nodeA](){
  nodeA->runAction(Sequence::create(...));	
});

Node* nodeB;
Action* actionB = Sequence::create(..., actionA, nullptr);
nodeB->runAction(actionB);
```

## 解説
NGパターンでは、actionAがスコープを抜けたタイミングで、リリースされてしまうため、actionB内でいざ実行しようとした時には、存在が抹消されています。

## 別解
NGパターンのactionAを作ったタイミングで、
```actionA->retain();```
しておく方法もあるかと思いますが、releaseするタイミングが難しい気がしたので、未検証です。

（actionAが呼ばれてrunActionされた後であれば、確実に呼ばれるタイミングでreleaseしておけば大丈夫かも？）

いずれにせよ、メモリリークの危険を生まない方法で実装できるならそれに越したことがないと思います。まる。
C#という言語の勉強の方法

新人教育で講師をしていて、プログラムを書いた事のない方から、
「C#の勉強のしかたがわからない
　本に書いてある通りのコードは書けるけど、その先何をすればいいのかわからない」
と、質問を受けました。

完全な回答ではありませんが、
C#という言語を勉強する気構えのようなものを
以下のようにアドバイスしました。

---
コーディングアドバイス

C#も言語です
英語が喋れる人の経験をみると現地でネイティブの人と会話しています
英語ができない人はテキストや音声で英語の勉強だけしています

言い方を変えます
英語ができる人はアウトプットしています
英語ができない人はインプットのみしています

C#も言語です
 できるようになりたければ
 アウトプットしましょう
 アウトプットで会話しましょう
 どんなに嫌いでも、出来ないと思っていても
1万行コードを書くと普通にできる人になってます
ググったコードのコピペではなくて、自分で考えて書いたコードで1万行です

英語でも最初のうちは少ない語彙でやり過ごせます。慣れてくると細かい自分の思いを伝えたくて語彙が増えると思います。
C#も言語です。
まずはテキストに書いてあることをそのままコンピュータに伝えて下さい。
そして、自分のやりたい思いを伝えるために、メソッドやプロパティを調べて使って下さい。
コンピュータもあなたの思いに答えてくれます。
たまにヌルポヨっていわれますけどw
それだけ純粋なので正確に伝えてあげて下さい。
Bluemixでデータ分析「dashDB」：JDBCでdashDBに接続してみた。

JDBCでdashDBに接続。

##JDBC接続情報はどこで確認する？
dashDBのWEB UIから確認できます。
左ペインのConnectからConnectionInformationで進みます。

![スクリーンショット 2016-09-14 0.35.19.png](https://qiita-image-store.s3.amazonaws.com/0/119378/0c5d95c8-ad36-09a1-feb0-c52cf3a421f4.png)


## ドライバはどこから入手する？
ここです。
http://www-01.ibm.com/support/docview.wss?uid=swg21385217

IBM Data Server Driver for JDBC and SQLJ (JCC Driver)をダウンロードします。IBM IDでログインして、アンケートとかは適当に答えて、zipをダウンロード。
解凍すると、中にjarが入っています。
![スクリーンショット 2016-09-14 0.22.09.png](https://qiita-image-store.s3.amazonaws.com/0/119378/76c050b4-a199-e5cb-10cf-0c39e5c9f547.png)



##ソースコード例
手っ取り早くひとつのclassで。。あくまでご参考です。

以下のString型のurlの引き数のところに、
上記で確認したJDBCの情報をコピペすればOK。

```java
package dashJDBCtest;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class select {
	public static void main(String args[]) {

		// JDBC setting
		String url = "jdbc:db2://dashdb-entry-yp-dal09-09.services.dal.bluemix.net:50000/BLUDB:user=dash5805;password=xxxxxxxx";
		Connection con = null;
		Statement stmt;
		try {
			// create connection
			con = DriverManager.getConnection(url);
			stmt = con.createStatement();
			
			//select処理
			String sql = "select max(avg) from dash5805.ishigaki";
			ResultSet rs = stmt.executeQuery(sql);
			while (rs.next()) {
				// get the result
				String result = rs.getString(1);
				System.out.println("select結果:"+result);
			}

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				con.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}


```

（なぜDataSourceじゃなくてDriverManagerなのかは、特に理由無しです）

## ちなみに
SSL通信したいときも、urlのところだけ変えればOKのようです。

![スクリーンショット 2016-09-14 9.17.09.png](https://qiita-image-store.s3.amazonaws.com/0/119378/dd10a802-5c31-8805-24fd-cd34381efd7b.png)


## マニュアルはこちら
http://www.ibm.com/support/knowledgecenter/ja/SS6NHC/com.ibm.swg.im.dashdb.doc/connecting/connect_connecting_jdbc_applications.html
mikan.js : 機械学習なしで、日本語の単語の改行を処理するライブラリを書いた

今朝方、はてなのホットエントリに[Budou - 機械学習を用いた日本語改行問題へのソリューション](http://tushuhei.hatenadiary.jp/entry/2016/09/12/095125)という記事が上がっていました。
ざっくりとした説明をすると、「タイトル中の単語が途中で改行されるせいで読み見辛いのを、機械学習を使ってキーワードごとに分割することでなんとかした」という感じの内容です。

## Budouというソリューション
オリジナルのBudouは、GoogleクラウドAPIを用いて単語を分けるわけですが、これ毎回APIを叩かないといけないですし、叩き過ぎるとお金もかかってきます。
また、このライブラリはPythonで書かれていますので、RubyやPHP、Node.jsでは単純に導入という形で使うことはできません。GoogleクラウドAPIの設定も必要です。
分かち書きすることで改行をどうにかするというのは、とても良いアイディアですし、導入するだけで見た目も良く見えますので、上記の理由で導入を諦めてしまうのは惜しいです。惜しいですよね？

## そこで mikan.js ですよ
ようは分かち書きをして、単語とその次のワードをくっつけてあげればいいんです。
というわけで正規表現を用いた分かち書きによるバックエンド・フロントエンド両方で動くjsのライブラリを書きました。

[trkbt10/mikan.js: 機械学習を用いていない日本語改行問題へのソリューション](https://github.com/trkbt10/mikan.js)

## インストール

```bash
$ npm install --save mikanjs
```

## 使い方
nodeで用いる場合

```javascript
const mikan = require('mikanjs');
console.log(mikan('常に最新、最高のモバイル。Androidを開発した同じチームから。'));

/*
<span style="display:inline-block" role="presentation">常に</span>
<span style="display:inline-block" role="presentation">最新、</span>
<span style="display:inline-block" role="presentation">最高の</span>
<span style="display:inline-block" role="presentation">モバイル。</span>
<span style="display:inline-block" role="presentation">Androidを</span>
<span style="display:inline-block" role="presentation">開発した</span>
<span style="display:inline-block" role="presentation">同じ</span>
<span style="display:inline-block" role="presentation">チームから。</span>
*/
```
Webで用いる場合

```html
<div id="sample"></div>
<script src="mikan.js"></script>
<script>
  var sampleElement = document.getElementById('sample');
  sampleElement.innerHTML = Mikan('常に最新、最高のモバイル。Androidを開発した同じチームから。');
</script>
```

jQuery

```js
$('.hoge').html(Mikan('よりパーソナルに。よりパワフルに。 より楽しく。'));
```

React

```html
<div dangerouslySetInnerHTML={{__html : Mikan('常に最新、最高のモバイル。Androidを開発した同じチームから。')}} />
```

### オプション
第二引数に、 `{ className : 'mikan', style : 'display:inline-block' }`という感じの形式で渡してあげることで、クラス名やスタイルシートを指定することができます。

```javascript
const text = Mikan('私は好きにした。君たちも好きにしろ。', { className : 'wbr', style : '' });

console.log(text);
/*
<span role="presentation" class="wbr">私は</span>
<span role="presentation" class="wbr">好きにした。</span>
<span role="presentation" class="wbr">君たちも</span>
<span role="presentation" class="wbr">好きにしろ。</span>
*/
```