OmniAICreator/Qiita-1.07M huggingface dataset:
"Unity"+"leap motion" [練習五つ]: VRGUI Project

<h2>VRGUI Project： 「指のvelocity(速力）ゲット！」</h2>
<h3>Goal: 空間に浮かぶGUIを作る</h3><ul>
<li>Step 1: UnityでLeap Motionを使ってGesture Motion認識ができる。</font></li>
<li><font color=red>Step 2: uGUIでメニューを作って空間に浮かべる</font> </li>
<li>Step 3:メニュー選択。任意のGameObjectからRaycastを飛ばしてメニューを選択できる。選択状態で色を変える。できたら音も。</li>
<li>Step 4:メニューで選択した項目を実行。メニューに任意のアクションを割り当てられるように実行する。</li>
</ul>

<hr/>
unityでrigid bodyがあったら、そのオブジェクトの速力をゲットができる！

それで、手のパートの中で一つにrigid bodyを使って、このパートを速力をゲット！

次はコード
<hr/>
<img width="1012" alt="スクリーンショット 2015-11-18 16.13.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/99307/6a6b9694-6bf3-d0e5-e6a0-a6d786d2e819.png">

1) public Transform palmというオブジェクトを作る
2) palmで rigidbodyを追加
3) .velocity.y を使ってy-directionの速力をゲットができる！

<br/>

<hr/>
<img width="495" alt="スクリーンショット 2015-11-18 16.13.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/99307/cc477c66-9027-79e9-fe4d-769db7a23a39.png">

*<font color="red">注意</font>：palmをaddすることを忘れない！
<br/>

<hr/>

ここまでしたことを使って、二つ指でbuttonをActive!
-finger position
-finger velocity
-gesture setActive

<font color="red">ユーチューブ : https://youtu.be/9L-JL8yJLc0
Macでコマンド完了をいい感じに知らせる

重いバッチ処理とか回してるときに他の作業してて回してたの忘れがちなので音で知らせたい。

音を鳴らすパターンは以下がいろいろ載っててよい。
[bash - コマンドが終了したら音を鳴らしたい - スタック・オーバーフロー](http://ja.stackoverflow.com/questions/230/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%8C%E7%B5%82%E4%BA%86%E3%81%97%E3%81%9F%E3%82%89%E9%9F%B3%E3%82%92%E9%B3%B4%E3%82%89%E3%81%97%E3%81%9F%E3%81%84)

その中のを組み合わせて（個人的に）いい感じにしたのが以下

```zsh:~/.zshrc
finish () {
	if [ $? -eq 0 ]; then
	   afplay /System/Library/Components/CoreAudio.component/Contents/SharedSupport/SystemSounds/system/burn\ complete.aif
	else
	   afplay /System/Library/Components/CoreAudio.component/Contents/SharedSupport/SystemSounds/system/Volume\ Mount.aif
	fi
}
```

* exitステータスで音を切り替え
* Macにデフォで入ってるシステムサウンドのうち成功っぽいやつと失敗っぽいやつを指定

以下のようにしてコマンドのあとにfinishつけて使う。

```bash
$ ruby heavy_process.rb; finish
```
vccwインストール後にphpMyAdminをインストールする


ローカル環境にphpMyAdminある方が何かと便利だったので、vccwインストール後にphpMyAdminも追加した時のメモ。
phpMyAdminのバージョンにこだわりはなかったので、yumでインストールした。

##手順
vagrant を起動して、sshでログインする

```bash
vagrant up
vagrant ssh
```
---
yumでphpMyAdminをインストール。（suのパスワードはvagrantになっているはず）

```bash
$ su
$ yum -y install --enablerepo=epel install -y phpMyAdmin php-mysql php-mcrypt
```
---
ログイン画面が開けない場合には、phpMyAdmin.confの中の `Deny From All` をすべてコメントアウトして、httpd再起動。（ローカルだしこれでOKかと）

```bash
$ vi /etc/httpd/conf.d/phpMyAdmin.conf
$ service httpd restart
```
---
ここまで来たら、
http://192.168.33.10/phpmyadmin
上記URLでローカルのphpMyAdminのログイン画面が表示されるはず。
（vccwのデフォルトでは、ユーザー名:root / パスワード:wordpress になっている）

もし、ログイン画面は表示されるものの、ログイン出来ない場合には、sessionディレクトリのパーミッションが原因の可能性があるので、`/etc/php.ini` の中で `session.save_path` に指定されているディレクトリを確認し、パーミッションを変更する。

```bash
$ view /etc/php.ini
$ chmod 777 /var/lib/php/session
$ service httpd restart
```


## 問題
この状態で一応使えるようにはなるものの、phpMyAdminログイン後の画面で
> 「設定ファイルに、暗号化 (blowfish_secret) 用の非公開パスフレーズの設定を必要とするようになりました。」

> 「phpMyAdmin 環境保管領域が完全に設定されていないため、いくつかの拡張機能が無効になっています。理由についてはこちらをご覧ください。
代わりにデータベースの操作タブを使って設定することもできます。」

というメッセージが表示されてしまう。

Google先生に聞いても、config.inc.php の `blowfish_secret` に何か文字を設定すればOKと言われるが、初期設定の段階ですでにランダムな文字が入ってて空じゃなかったし・・・
この警告メッセージはまだ解決出来ていない。

念のため記述すると、yumでインストールすると、`config.inc.php` は下記のパスになっていた。 `/usr/share/phpMyAdmin/config.inc.php` ではないので注意。

```bash
$ vi /etc/phpMyAdmin/config.inc.php
```


## 参考URL
- [phpMyAdminで正しいユーザー名とパスワードを入力したのにログイン出来ない事象の解決法](http://keikenchi.com/phpmyadmin-can-not-login)
- [phpMyAdminで「設定ファイルに、暗号化 (blowfish_secret) 用の非公開パスフレーズの設定を必要とするようになりました」が出る時の対処法](http://techmemo.biz/web-cheat-sheet/phpmyadmin-blowfish-secret/)
今が平成何年かがわかるシェルコマンド

今が平成何年かわからないor自信がないとき，いちいち調べるのが面倒なんでサクッと作成しました．

```bash:
alias hyear='echo 平成$(expr $(date +%Y) - 1988)年'
```

2015年中にこのコマンドを実行すると平成27年とアウトプットします．
viのマークを便利に使う


# TL;DR
viのもっとも便利な機能はhjklによるホームポジションに手を置いたままのカーソル移動ですが(俺調べ)
次に手放せない要因になっているのは、マークと名前付きバッファです。
操作方法については色々ネットに情報が出ていますが、具体的な使用ケースについてはあまり情報が無いように感じたので個人的に便利だと思っている使い方を共有してみます。

今回はまずマークについて


# しおりとしてのマーク

コマンドは色々ありますが、私が使うのは以下だけです。

```vi
m[a-zA-Z] 	カーソル位置をマークする
'[a-zA-Z] 	指定のマークの行頭に移動する
:marks          マーク一覧。なにをマークしたのか忘れた時に使う。
```

個人的にはしおりみたいなものだと思っています。しおりを挟んだ箇所にいつでも一発で戻れるという。
~~よくある~~とーってもスコープが長い関数の中を追っている時に、とりあえず追っている変数の宣言箇所に
maと素早くaでマークして、そこに飛びたくなったら、現在地をmmとmでマーク(m連打でマークできるのがポイント)
'aで宣言部に戻り'mでまた元の場所に戻るとかよくやります。
変数の名前を連想する名前でマークすると結構な数を覚えていられるのでおすすめです。
たとえば、isActive... てな場所であればmiでiとマークするとか。


# 範囲指定としてのマーク

ビジュアルモードが使えればほとんどいらないんですが、そこは気分で使い分け。ビジュアルモードはvim用なので、素のviを触る時に便利です。そんなことはほぼないけれど..。今でもhp-uxのviはposixなのかな？


範囲指定してヤンク(コピー)なら、コピーを開始したい位置に移動してすかさずmm。コピー終了したい位置に移動してy'm
範囲指定してデリートしたいなら、同様の操作を行いd'm
範囲指定して置換したいなら、検索開始位置でma,検索終了位置でmbして:'a,'bs/[検索]/[置換]/





ぜひお試しあれ。
TDD / testing / 考察 > タイマー処理のデバッグ > 10分, 20分, 60分に判断

##背景

10分, 20分, 60分で何かを判断する処理をデバッグしたい。
しかしながら、正直に上記の時間を待ってデバッグしていたら効率が悪い。

##手法(思いつき)

### 手法1 (判断時刻の変更)

判断時間をデバッグ時だけ変更する。
{10分, 20分, 60分} を {30秒, 30秒, 30秒}で処理。

利点 > 時刻をカウントアップする処理は触らない

考慮 > 10分00秒にxxx, 20分00秒にxxxという、(秒==0)の処理をデバッグとはならない
考慮 > {1分, 1分, 1分}でデバッグすれば、(秒==0)の処理のデバッグとなるが、待ちが長くなる。

### 手法2 (加速試験)

時刻を保持する機能に加速機能を追加する。
例として、現実の時刻で1秒進んだ時にさらに(10-1)秒進ませる、など。

利点 > 判断時間の相対的な距離を維持
利点 > インターバルの秒数を10などの60の約数とすれば、(秒==0)時の判断するデバッグとなる

考慮 > 時刻インスタンスが必要
考慮 > 時刻インスタンスからの時刻が現実の日時とずれる

### 手法3 (インターバルの変更)

手法1に近い。

以下の情報を持つ。

- 開始日時
- インターバル間隔 (例: 1分)
- 経過回数 (10, 20, 60)

利点 > インターバル間隔の値１つをデバッグ時に書き換えるだけ (例: 3秒)
利点 > 経過回数に基づき、時間的相対距離を保持

考慮 > (秒==0)のような判断は別途考慮が必要
Groongaの管理ツールで表示するカラムの選択をほんのり便利にした


今月末の11/29(いい肉の日)は全文検索エンジンの[Groonga Meatup 2015](https://groonga.doorkeeper.jp/events/31482)が開催されますね。発表者とタイムテーブルも決まって、使ってみてどうよかったかという話がいろいろ聞けそうです。
この記事を書いている11/18時点ではまだ参加申し込みに空きがあるようです。

[Groonga Meatupのイベントページ](https://groonga.doorkeeper.jp/events/31482)から申しこめるようですよ。

さて、本題。

# カラム選択をちょっと便利に

[Groongaの細かいことを知らなくても使えるWebブラウザー上で動く管理ツール](http://qiita.com/groonga/items/1a4bf4e69a3bfb8a0663)というのがあります。

これ、ちょっと前まではたくさんカラムが定義されていると、そのうちのいくつかだけカラムを表示したいときにチェックをはずすのが面倒臭かったのでPRを投げてとりこんでもらいました。

![toggle-columns.png](https://qiita-image-store.s3.amazonaws.com/0/13564/ec0f6d8f-5dfd-3ca4-39fa-2732a25ac884.png)

上の画像の赤線で囲んであるやつが、追加した部分です。

これでたくさん定義されたカラムもぽちぽちクリックするだけで怖くない。
Selenium Webdriverの自分用Tipsまとめ　1

Selenium IDEから、Selenium WebDriver(Ruby)環境構築メモ。
覚えている限り。

# 動機
Windows端末上でSelenium IDE使ってWebページテストしていたけれど、ページ遷移が面倒だし、自分でKickするのは面倒くさいなあ。
→世の中にはSelenium Webdriverというものがあるらしいぞ。
→おまけに、サーバ内でモニターなくても試験できるヘッドレス環境というのもあるらしいぞ。
→さらに、Jenkinsという、タスクをKickするのに便利なモノもあるらしいぞ。

→JenkinsとSelenium Webdriverを組み合わせて、おまけにHeadlessでサーバ内でブラウザ立ち上げてテストしてしまえば、割と楽にできるのでは？

という安易な考えでスタート。


# 環境

VMでUbuntuを用意。 14.04使ってます。

```bash
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.1 LTS"
```

# 構築手順
## Linuxサーバ
上記のとおりUbuntuをさくっとVM上に構築。
## Ruby実行環境
rbenv+ruby環境構築。

こちらの記事をまるまるパクリました。
http://qiita.com/ringo/items/4351c6aee70ed6f346c8

## rspec環境構築
Selenium IDEでフォーマットするとき、rspecが一番上に来てた、という安易な理由でrspec導入。
rspec調べてみると、結果判定できたり、出力できたり、と色々素敵。

```bash
$ gem install rspec
$ rspec -v
3.3.2
```
たぶんこれでrubyとrspecが入った気がする。たぶん。

## 必要なgemの導入（selenium-webdriver,webdriver-user-agent,headless)
Selenium Webdriverを利用するために、いくつかgemを追加で入れる。

1.selenium-webdriver
 →何がなくても必要
2.webdriver-user-agent
 →テスト対象のサイトはPCだけじゃなくてスマホ、ガラケーも対応してるので、useragent指定できる必要あり。

```bash
$ gem install selenium-webdriver
$ gem install webdriver-user-agent
```

## ブラウザのインストール
UbuntuでWebページ開くために、ブラウザをインストールする。
Firefoxは
```bash
$ sudo apt-get install firefox
```
でサクっと入りました。
時系列的にはあとでわかったことだけれど、日本語フォント入れないと
Imagemagickでスクショ取ったとき、日本語が□□□　みたいになって悲しくなったので、
日本語フォントもここで導入。

と、ここで何をどうして入れたのか忘却・・・。

```
$ sudo apt-get install fonts-takao-pgothic
$ sudo apt-get install fonts-takao-mincho
$ sudo apt-get install fonts-takao-gothic
$ sudo apt-get install fonts-takao
```
あたりを入れたような入れてないような・・・。
思い出したら書きます。

## Xvfbのインストール
Ubuntu上でヘッドレス環境を実現するために、うそんこのPC画面をつくってくれるらしい。
とてもステキ。

```
$ sudo apt-get install xvfb
```
で、Xvfbの起動方法はいろいろやり方あるみたいですが、ここではこのようにテストを実行する前にXvfb上でfirefoxを動かしてます。

```
$Xvfb :1 -screen 0 1024x768x24 &
```

ここで指定した:1がウィンドウの番号で、次にFirefoxを起動するときに使う、みたいな。
試しにfirefoxを立ち上げてみると、こんな感じですかね。

```
$export DISPLAY=:1
$firefox  &
```

参考。
http://tobyho.com/2015/01/09/headless-browser-testing-xvfb/

と、初めてのポストはこんなもんで。
あとは、
Selenium-IDEからSelenium-Webdriverのコードを作るTips
Jenkinsからのテストコード実施
スクリーンショット撮るためのImagemagik導入
などなど書ければ。
Rails: ActiveAdmin で has_many なフォーム ( nested resouces ) を作るための最小構成

前提 : 必要なマイグレーションは実行されていることとする。

## 親モデル

has_many と一緒に accepts_nested_attributes_for を指定すること。

```rb:app/models/book.rb
class Book < ActiveRecord::Base
  has_many :images
  accepts_nested_attributes_for :images
end
```

## 子モデル

モデルを作るだけで良い。

```rb:app/models/image.rb
class Image < ActiveRecord::Base
end
```

## リソース

***ポイント*** : permit_params に attributes を指定すること。

```rb:app/admin/book.rb
ActiveAdmin.register Book do

  permit_params :title, images_attributes: [:kind]

  form do |f|
    f.inputs do
      f.input :title
    end

    f.inputs do
      f.has_many :images do |t|
        t.input :kind
      end
    end

    f.actions
  end
end
```

# 環境

- ActiveAdmin 1.0.0.pre1
- Rails 4.0.13
- ruby 2.0.0

# 参考

- [ActiveAdmin の has_many の Form で NestedAttributes の画像 ( Paperclip ) リソースを更新する](http://qiita.com/yutackall/items/24da34d81902a139897f_)



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
JSONを整形するnodeワンライナー

改行のないぐちゃっとしたJSONファイルや、エスケープだらけのJSONファイルは読むときに困りますよね。たとえばこんな感じのfoobar.jsonファイル。

```:foobar.json
[{"country":"Australia","countryCode":"AU","name":"Australia","parentid":1,"placeType":{"code":12,"name":"Country"},"url":"http://where.yahooapis.com/v1/place/23424748","woeid":23424748}]
```

これをnodeを使ってワンライナーで整形して表示する方法を紹介します。
foobar.jsonがあるディレクトリに移動して、

```:console
$ node -e 'console.log(require("./foobar.json"))'
```

とすると、以下のとおり簡易ですが整形した結果を表示できます。
（ファイル名の前に`./`を書き忘れると動きませんので注意してください）。

```
[ { country: 'Australia',
    countryCode: 'AU',
    name: 'Australia',
    parentid: 1,
    placeType: { code: 12, name: 'Country' },
    url: 'http://where.yahooapis.com/v1/place/23424748',
    woeid: 23424748 } ]
```
Qiitaのshell-sessionについて

`shell-session`は，シェルコマンドの履歴を**アウトプットも含めてそのまま**掲載したいときに便利

ただし，注意しないと全部灰色で表示されてしまいわけがわからなくなってしまいます．

```shell-session:失敗例
mkdir /tmp/foo

cd /tmp/foo

uptime
15:38  up 2 days,  7:16, 2 users, load averages: 1.99 1.83 1.72

```

```shell-session:成功例
uraura@rosemary$ mkdir /tmp/foo

uraura@rosemary$ cd /tmp/foo

uraura@rosemary$ uptime
15:38  up 2 days,  7:16, 2 users, load averages: 1.99 1.83 1.72
```

いろんなパターンを試してみる
注：ユーザ名=uraura, ホスト名=rosemary

```shell-session
# OK
uraura@rosemary$ uptime
15:38  up 2 days,  7:16, 2 users, load averages: 1.99 1.83 1.72

# OK
uraura@rosemary# uptime
15:38  up 2 days,  7:16, 2 users, load averages: 1.99 1.83 1.72

# OK
uraura@rosemary$ ~/tmp uptime
15:38  up 2 days,  7:16, 2 users, load averages: 1.99 1.83 1.72

# NG
rosemary ~/tmp uptime
15:38  up 2 days,  7:16, 2 users, load averages: 1.99 1.83 1.72

# NG
~/tmp uptime
15:38  up 2 days,  7:16, 2 users, load averages: 1.99 1.83 1.72

# NG
uraura@rosemary uptime
15:38  up 2 days,  7:16, 2 users, load averages: 1.99 1.83 1.72

# NG
uraura$ uptime
15:38  up 2 days,  7:16, 2 users, load averages: 1.99 1.83 1.72

# NG
uptime
15:38  up 2 days,  7:16, 2 users, load averages: 1.99 1.83 1.72
```

まとめると．．．

`ユーザ名@ホスト名 パス$` みたいなプロンプトにしてないと使えないってことですね〜
VisualStudioで.scss形式のファイルを使用してブラウザ間で異なるスタイルシートの違いを吸収して保守性をあげる

#1.環境の準備
VisualStudioでツール→拡張機能と更新プログラムから"Web Compiler(Created by Mad Kristensen)"をインストールすると.scss形式のファイルを利用可能になります。（他にもLESS,Stylus,JSX形式などが利用可能になります。）


#2.複数のブラウザで書き方が異なるCSSの定義をする
WEBサイトプロジェクトを作成し、Common.scssファイルを作成します。

```css:Common.scss

@mixin prop_calc($prop,$value){
    #{$prop}:-webkit-calc(#{$value});
    #{$prop}:-moz-calc(#{$value});
    #{$prop}:calc(#{$value});
}
@mixin word_break($value) {
    -ms-word-break: #{$value};
    word-break: #{$value};
}
@mixin opacity($value) {
    filter: alpha(opacity=$value);
    -moz-opacity: $value * 0.01;
    opacity: $value * 0.01;
}
@mixin box(){
    display: box; /* 標準 */
    display: -moz-box; /* Firefox */
    display: -webkit-box; /* Webkit系 */
    display: -ms-flexbox; /* IE */
}
@mixin box_flex(){
    -webkit-box-flex: 1; /* Safari,Google Chrome用 */
    -moz-box-flex: 1; /* Firefox用 */
    box-flex: 1;
}

```
これらの定義を利用するコードとして

```css:Common.scss

.box {
    @include box();
}
.transparent-panel {
    @include opacity(60);
}
.menu-popup-panel{
    position:fixed;
    @include prop_calc("height", "100vh - 150px");
    min-height:200px;
}

```
という感じでスタイルを定義します。

Common.scssファイルを右クリック→Web Compiler→Compile fileでコンパイルが実行でき以下の3つのファイルが作成されます。
・Common.css
・Common.css.map
・Common.min.css

Common.cssを見てみると

```css:Common.css

.box {
    display: box; /* 標準 */
    display: -moz-box; /* Firefox */
    display: -webkit-box; /* Webkit系 */
    display: -ms-flexbox; /* IE */
}
.transparent-panel {
    filter: alpha(opacity=60);
    -moz-opacity: 0.6;
    opacity: 0.6;
}
.menu-popup-panel{
    position:fixed;
    height:-webkit-calc(100vh - 150px);
    height:-moz-calc(100vh - 150px);
    height:calc(100vh - 150px);
    min-height:200px;
}

```

という感じに展開されます。
複数ブラウザの違いを吸収でき保守性が高まるので困っている人はぜひ.scss形式のファイルを使ってみましょう。
awscliで指定したインスタンスにセカンダリIPを付与する方法


## 前提条件

- awscliがインストールされていること
- jqコマンドがインストールされていること

## インスタンス名からENIを調べる

```bash
aws ec2 describe-instances --filter "Name=tag:Name,Values=インスタンスのName" | jq -r '.Reservations[].Instances[].NetworkInterfaces[].NetworkInterfaceId'
```

## ENIにセカンダリIPを付与する

```bash
aws ec2 assign-private-ip-addresses --network-interface インターフェイスID --private-ip-addresses IPアドレス
```

## コマンド一発でセカンダリIPを付与する

```bash
aws ec2 assign-private-ip-addresses --network-interface $(aws ec2 describe-instances --filter "Name=tag:Name,Values=インスタンスのName" | jq -r '.Reservations[].Instances[].NetworkInterfaces[].NetworkInterfaceId') --private-ip-addresses IPアドレス
```

## セカンダリIPの割り当てを解除する

```bash
aws ec2 unassign-private-ip-addresses --network-interface インターフェイスID --private-ip-addresses IPアドレス
```
PL/SQLからSSTPを発射する方法

#はじめに
Sakura Script Transfer Protocolな方のSSTPです。
これはblogの残骸から移植した投稿です。

PL/SQLからSSTP飛ばせるのか気になって試しに実装してみたら
すんなり行っちゃったときのコード。誰得。

#こんなかんじで

```PL/SQL
CREATE OR REPLACE FUNCTION TEST_SSTP_NOTIFY
RETURN VARCHAR2
IS
 conn UTL_TCP.CONNECTION;
 x PLS_INTEGER;
 scripts VARCHAR2(4000);
 
BEGIN
 -- 毒電波送信準備
 conn := utl_tcp.open_connection(
 remote_host => 'localhost',
 remote_port => 9821,
 charset => 'JA16SJIS');
 
-- 毒電波本体
 scripts := '\h\s[0]SCOTTさんは星になりました。';
 scripts := scripts || '\u\_w[1500]……おい。';
 scripts := scripts || '\h\n\_w[1500]…はい？';
 scripts := scripts || '\u\n\_w[1500]…せつないな。';
 scripts := scripts || '\e';

 -- 電波ゆんゆん
 x := utl_tcp.write_line(conn, 'NOTIFY SSTP/1.1');
 x := utl_tcp.write_line(conn, 'Sender: 毒電波 from PL/SQL');
 x := utl_tcp.write_line(conn, 'Event: onSendMessage');
 x := utl_tcp.write_line(conn, 'Script: ' || scripts);
 x := utl_tcp.write_line(conn, 'Charset: Shift_JIS');
 x := utl_tcp.write_line(conn);
 
-- 例外？なにそれおいしいの？
 BEGIN
 LOOP
 dbms_output.put_line(utl_tcp.get_line(conn, TRUE));
 -- 本来ならばここで色々しないといけない
 END LOOP;
 EXCEPTION
 WHEN utl_tcp.end_of_input THEN
 NULL; -- end of input
 END;
 
utl_tcp.close_connection(conn);
 
RETURN 'OK';
EXCEPTION
 WHEN OTHERS THEN
 RETURN 'あなたの意に反してこのエラーが見えているでしょうか？';
END;
```
これを
ご家庭の
Oracleインスタンスに食わせた上で、sqlplusなりで

```
SELECT TEST_SSTP_NOTIFY FROM DUAL;
```
って発行したら毒電波が飛ぶはず。

もし懐かしのApache風のエラーメッセージが出るなら「ACL設定」でググればいいかも。

以下、実行時のSS。
![hoge.png](https://qiita-image-store.s3.amazonaws.com/0/90264/55260977-9b44-9306-bc93-f05c0c165de2.png)


[追記 2015.11]
今風だと、PL/SQLからslackに投稿とかのほうがウケがいい気もするネタだと思った。

えんいー。
JSON::ParserError: 399: unexpected token at　って出たけど・・・

サンプルとしてもらった少し大きめのJSONファイル。
rake taskからファイルの中身を読み込もうと思ったら・・・

```rb
      @json_data = open('tmp/sansan/api_sansan_result.json') do |io|
        JSON.load(io)
      end
```

```
$ rake sansan:import
rake aborted!
JSON::ParserError: 399: unexpected token at '{
            "building": null,
            "city": "新宿区",
```

どこかにエラーがあるらしい・・・

探すのめんどいって思っていたらいい記事がありました
[気軽にjsonのsyntax checkを行う](http://qiita.com/polidog/items/a5110973631620ede201)
ありがとうございます！

自分ので特に何もいじってないVM環境（CentOS）内でpythonって動くのかなぁと思いつつ試してみたところ

```
$ cat tmp/sansan/api_sansan_result.json | python -mjson.tool
Invalid control character at: line 6 column 49 (char 144)
```

こんな感じでエラー個所を教えてくれました。
１つずつエラーをつぶしていって無事解決！
iOSでのsubmit, buttonのデザインをリセットするCSS

iPhoneなどでinput要素のボタンにCSSが効かない時の対処方法です。
まず以下のCSSでスタイルをリセットしてから装飾すると反映されます。

### 参考画像こちら
![hoge.jpg](https://qiita-image-store.s3.amazonaws.com/0/96220/7224e333-8b42-e095-e065-edf596b9d8bd.jpeg)

<br>
<br>

## CSS
```CSS
/* iOSでのデフォルトスタイルをリセット */
input[type="submit"],
input[type="button"] {
  border-radius: 0;
  -webkit-box-sizing: content-box;
  -webkit-appearance: button;
  appearance: button;
  border: none;
  box-sizing: border-box;
  cursor: pointer;
}
input[type="submit"]::-webkit-search-decoration,
input[type="button"]::-webkit-search-decoration {
  display: none;
}
input[type="submit"]::focus,
input[type="button"]::focus {
  outline-offset: -2px;
}

```

## SCSS
````scss
/* iOSでのデフォルトスタイルをリセット */
input[type="submit"],
input[type="button"] {
  border-radius: 0;
  -webkit-box-sizing: content-box;
  -webkit-appearance: button;
  appearance: button;
  border: none;
  box-sizing: border-box;
    &::-webkit-search-decoration {
      display: none;
    }
    &::focus {
      outline-offset: -2px;
    }
}
````
MacでElasticsearch(1.5.x) + Kuromojiをインストール


# Elasticsearch(1.5.x)のインストール
0. [ここ](https://www.elastic.co/downloads/past-releases/elasticsearch-1-5-2)からtarなどをダウンロード
0. 好きな場所に圧縮ファイルを移動
	
	``` 
	$ mv elasticsearch-1.5.2.tar.gz  
	$ tar xvf elasticsearch-1.5.2.tar.gz
	```
0. 実行

	``` 
	$ ./elasticsearch-1.5.2/bin/elasticsearch 
	```

# Kuromojiプラグインのインストール

0. プラグインのインストール　
	- Elasticsearch 1.5.xに対応しているKuromojiプラグインのversionは2.5.0

	```
	$ ./elasticsearch-1.5.2/bin/plugin -install elasticsearch/elasticsearch-analysis-kuromoji/2.5.0
	```
0. 設定ファイルの編集
	0. elasticsearch.ymlを編集

		```
		$ vi ./elasticsearch-1.5.2/config/elasticsearch.yml
		```
	0. 以下を追加
	
		```
		index.analysis.analyzer.default.type: custom
		index.analysis.analyzer.default.tokenizer: kuromoji_tokenizer
		```
0. 動作確認

```
$ curl -XPUT http://0.0.0.0:9200/dummy/test/1 -d '{"tag": "Elasticsearch", "text": "foo"}'
{"_index":"dummy","_type":"test","_id":"1","_version":1,"created":true}
```


# 参考
http://25niko.tumblr.com/post/68139909161/elasticsearch-%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%ABmac
Compassを使ってSassを綺麗に書く方法（具体的なコード付き・railsでの使用方法も記載）


## 前提
Sass自体はCSSをより美しくかけることで有名なので、皆さん使っていることだと思います。そして、それをより無駄なくかくことができる方法にCompassを使った書き方があります。今回は、Compassを使用したSassの書き方をまとめようと思います。

## 流れ
- Sass振り返り
- Compassとは
- RailsにおけるCompassの導入方法
- Compassのmodule

## Sass振り返り

### Sassとは
- CSSのメタ言語
- 拡張子は、.scssと.sassがある。

### CSSとSassのコードの違い

```index.css
.hoge {
  font-size: 10px;
  color: white;
}
```

```index.sass
.hoge
  font-size: 10px
  color: white
```
CSSやSCSSでは、```{ }```を使用することが必須でしたが、Sassを使うことで、この```{ }```を外し、インデントの深さで表現します。ここだけみると、Slimの書き方とよく似ていますよね。

### RailsでSassを使用するには?

```
gem 'sass-rails'
```
Gemfileに上記のようなgemを追加して、```bundle install```をしてください。その後、Sassを利用することができるようになります！まだ、使用していない方は、ぜひ導入してみてください。

### Sassでできること
- 変数
- mixin
- extend

### 変数
```sass
$main_color: #fff

h1 
  background-color: $main_color
```

###  mixin
引数を渡すことで、返り値をcssに当てる方法。
```@mixin 命名（引数）```で定義し、
使うときは```@include mixinの名前（引数）```で呼び出してあげる。

```sass
@mixin border($color: #555)
  border-bottom: 1px solid $color


h1 
  @include border(#777)
```

### extend
一度定義したスタイルの継承。

```sass
.hoge 
  margin-bottom: 10px
  color: #fff
  
.fuga
  @extend .hoge
```
### mixinとextendの違い
#### mixin
- 何度も使用するものは定義して使用する
- 引数が使える
- 呼び出すときは、@include mixin名;
 
#### extend
- 一度どこかで定義したものを継承して使う。
- 呼び出すときは@extend セレクタ名;

## Compassとは
- Sassをもとに開発されたフレームワーク
- 再利用可能なコードが豊富
- スプライトが簡単に作れる

## RailsにおけるCompassの導入方法
```
gem 'compass-rails'
```
Gemfileに上記のgemを追加して```bundle install```するだけ！

## Compassのmodule
- CSS3
- Typography
- Utilities
- Layout
- Reset

上記の5つが大きな分類として含まれています。そして、それぞれの中に複数のmoduleが含まれているので、これらのmoduleの中身を確認して、自分でmixinを作るのではなく、Compassの恩恵を受けましょう。
###  CSS3
```sass
.hoge 
  @include border-radius
```

```css
.hoge {
  -webkit-border-radius: 5px;
  -moz-border-radius: 5px;
  -ms-border-radius: 5px;
  -o-border-radius: 5px;
  border-radius: 5px;
}
```
これはcss3モジュールの中の1つで、角丸をつくるためのものです。
sassで@includeしてくるだけで、簡単に角丸をつくることができます。
このほかのmoduleは以下のURLにまとまっているので、興味ある方はご確認ください。
参照: http://linkerdesign.github.io/journal/2011/07/compasscss3.html

### Typography
```sass
.hoge 
   @include link-colors(white,white,white,white,white)
```

```css
.hoge {
  color: white;
}
.hoge:visited {
  color: white;
}
.hoge:hover {
  color: white;
}
.hoge:active {
  color: white;
}
```
テキストカラーや行間などのテキスト系mixinが含まれています。
ほかにどんなmixinがあるのか気になる方は以下のURLをご確認ください。
参照: http://www.webdesignleaves.com/wp/htmlcss/675/

### Utilities
```sass
.hoge 
  @include clearfix
```

```css
.hoge {
   overflow: hidden;
  *zoom: 1;
}
```
clearfixなどのmixinが含まれています。
ほかにどんなmixinがあるのか気になる方は以下のURLをご確認ください。
参照: http://www.webdesignleaves.com/wp/htmlcss/675/


### Layout
グリッド線やレイアウトなどのレイアウト用のmixinが含まれています。

### Reset
リセットcssのmodule

### Compass moduleの使い方

```sass
@import 'compass/css3'
@import 'compass/typography'
@import 'compass/utilites'
@import 'compass/layout'
@import 'compass/reset'
```
このように@importで呼び出すことができます。
AngularJsでよく使うAPI

angular.module()などはAngularで実装する際、必ずと言っていいほど使用すると思いますが、そのほかのAngularのAPIで便利だなと思った関数あったので、書いてみました。

## angular.copy

オブジェクトまたは配列をディープコピーします。
AngularJsでは同じ変数を参照してしまうと、双方向データバインディングの影響で、意図していない場所の値が変更されてしまう可能性があるので、その際によく使いました。

```
$scope.user = 'user1';
var user1.name = angular.copy($scope.user);
```

## angular.forEach
いわゆるforEachしてくれます。obj内の各項目に対し、それぞれiterator関数を実行してくれる。iteratorの関数は、iterator(value, key)として実行され、valueにはオブジェクトのプロパティの値または配列の要素が入り、 keyにはオブジェクトのプロパティのキーまたは配列のインデックス番号が入ります。

```
var lists={ item1:'name1', item2:'name2', item3:'name3' };

angular.forEach(lists, function(val, key) {
// ~~
});
```

## angular.merge
任意の複数オブジェクトを一つのオブジェクトにマージしてくれます。
配列でも使用できるようです。

```
var obj1={ item1:'name1', item2:'name2' };
var obj2={ item3:'name3', item4:'name4' };

var mergeObj = angular.merge(obj1, obj2);

```

## angular.isDefinedなどis〜
対象が定義されているか否かを調べてくれます。定義されていればtrueが返ります。他にもisDateとかisArrayとかあり、条件分岐で複雑な処理を書かなくて良いので便利です。

```
var val = 'key';
angular.isDefined(val); // true
```



他にも便利なAPIが多数用意されているようなので、underscore.jsなど使用する前に一度目的のapiがないかどうか調べてみても良いかもですね。
[jQuery]input要素にdisabledを設定・解除する方法

地味に探しても見つかりづらいので備忘録的に。

けっこう、下のようにattrを使うようなのを見ますが間違いです。
昔は出来たみたいですが、これでは上手く動作しません。

## ダメな例
・設定
attr('disabled ','disabled');
・解除
attr('disabled ',false);
とか
attr('disabled ','');


## 正解例

### 設定
```jQuery:
$("#hoge").prop('disabled', true);
```


### 解除

```jQuery:
$("#hoge").prop('disabled', false);
```

## まとめ

これで上手くいくハズです。
Excelでよく使うちょっとマイナーなショートカットキー

普通のビジネスマンが避けて通れないOfficeのソフト達。
毎日のように触るからこそ、ショートカットキーを覚えておくと作業がぱっぱとできるようになります。

基礎編(何も言いません)
Ctrl＋C,V,X,A,S,Z,B,U,I
(左から、コピー、ペースト、切り取り、すべてを選択、上書き保存、元に戻る、太字、斜体、アンダーライン)

応用編(本題はココから！)

- Ctrl＋1:プロパティの表示
- Ctrl+Space、Shift+Space:列の選択、行の選択
- Ctrl＋Shift++、Ctrl＋-:行列の追加、削除
- Alt→D→F→F:フィルタの設定
- Alt→E→S:形式を選択して貼り付けのプロパティ
- Ctrl＋カーソルキー:最後のデータまで移動
- Shift＋カーソルキー:複数セルの選択
- Shift+Alt+→,←:アウトライングループ化、解除
- Ctrl＋H,F:検索と置換
- Ctrl＋Alt+=:Sumの挿入

例えば、行列の削除をマウスでやる場合は

1. マウスに手を伸ばす
2. 行列のどこかクリック
3. 右クリックメニュー開く
4. 削除クリック

となりますが、キーボードショートカットの場合、

1. Shift+スペースを押す
2. Shift+-を押す

の2ステップで終えることができます。

ショートカットキーはよく使う機能に絞って覚えていくのが良いと思います。
【Rails】ajax通信 -> 処理 -> redirect_toのやり方(remote: true/controller)



# シチュエーション
## View

page_a.html.erb

```erb
<%= link_to "エイジャックス", ajax_method_hoge_path, remote: true %> 
```

## Controller

```ruby

class HogeControlller
  def page_a
  end

  def ajax_method
    # do something
    redirect_to fuga_hoge_path
  end
end
```

↑こういう事したい。でも出来ない。こういう状況有りますよね。

※ちなみにこういう処理をしたい時に同時に悩むのが、link_toにparamsを持たせる方法ですが、以下を参考にして下さい。
[【Rails】link_toにparamsを持たせる方法](http://qiita.com/geshi/items/449ba1f29f2f10bad4be)

しかし、remote: trueとoptionを指定しているので非同期通信になってしまい、View側で特定のページに遷移することはありません。

そこで、以下の方法で簡単に解決できます。



# 解決策

## 概要
- Viewディレクトリは全くいじりません。
- AjaxHelperというモジュールを作ります。
- HogeControllerを少しいじります。


## View

```
なにもいじらない。
hoge/ajax_method.js ファイルも作らなくて良い。
```


## Module

app/controllers/concerns/ajax_helper.rb


```ruby
module AjaxHelper
  def ajax_redirect_to(redirect_uri)
    { js: "window.location.replace('#{redirect_uri}');" }
  end
end
```


## Controller

```ruby

class HogeControlller
  # 先ほど作ったModuleをincludeします。
  include AjaxHelper 

  def page_a
  end

  def ajax_method
    # do something
    # ↓これは使いません。
    # redirect_to fuga_hoge_path
    
    # 以下追加
    respond_to do |format|
      format.js { render ajax_redirect_to(fuga_hoge_path) }
    end
  end
end
```


これでいけます。
【Rails】link_toにparamsをもたせる方法



# View

```erb
<%= link_to "リンクです。", kobito_path, user_id: @user.id, user_name: @user.name %>
```

# Controller

```ruby
class QiitasController
  def kobito
    params[:user_id] #-> 3 
    params[:user_name] #-> "太郎"
  end
end
```

いくつでもparams持たせることが出来ます。
CentOS7.1でDockerをoverlayfsで設定するAnsible Playbook

# CentOS7.1でDockerをoverlayfsで設定するAnsible Playbook

## 背景

普段はUbuntuでstorage driverをaufsにしてDockerをいじってるんですが、周囲には「UbuntuよりもCentOSで使いたいな」という人もいるので、以下の記事を参考に高速らしいoverlayfsを使った設定のAnsible Playbookを作ってみました。

* [DockerでOverlayFSを使用する](http://qiita.com/HommaHomma/items/f039c856b6d6c8c6629b)

## 設定内容

* CentOS 7.1のインストール直後に設定することを想定
* SELinuxは無効化
* firewalldは無効化
* ntpdで時刻同期の設定
* Dockerのstorage driverをoverlayfsに設定

## Ansible Playbook

※冪等性は微妙です。。。
※本来ならcopyモジュールを使うべきところで強引にshellモジュール+echoとかで書いてます
※Ansible実行後、サーバを再起動してください


```yaml:playbook.yml
---
- hosts: all
  remote_user: root
  tasks:
  - name: yum update
    command: yum -y update
  - name: disable selinux 1
    selinux: >
      state=disabled
  - name: disable selinux 2
    shell: if [ "`/usr/sbin/getenforce`" != "Disabled" ]; then /usr/sbin/setenforce 0; fi
  - name: disable firewalld
    service: >
      name=firewalld
      state=stopped
      enabled=no
  - name: install ntp
    yum: >
      name=ntp
      state=present
  - name: modify /etc/ntp.conf 1
    lineinfile: >
      dest=/etc/ntp.conf
      state=absent
      regexp="^server"
  - name: modify /etc/ntp.conf 2
    lineinfile: >
      dest=/etc/ntp.conf
      state=present
      regexp="^pool ntp.nict.jp iburst$"
      line="pool ntp.nict.jp iburst"
  - name: enable ntpd
    service: >
      name=ntpd
      enabled=yes
  - name: start ntpd
    service: >
      name=ntpd
      state=started
  - name: put /etc/yum.repos.d/docker.repo
    shell: echo -e "[dockerrepo]\nname=Docker Repository\nbaseurl=https://yum.dockerproject.org/repo/main/centos/7\nenabled=1\ngpgcheck=1\ngpgkey=https://yum.dockerproject.org/gpg" >/etc/yum.repos.d/docker.repo
  - name: install docker-engine
    yum: >
      name=docker-engine
      state=present
  - name: mkdir /etc/systemd/system/docker.service.d
    file: >
      path=/etc/systemd/system/docker.service.d
      state=directory
      mode=0755
  - name: put /etc/systemd/system/docker.service.d/storage.conf
    shell: echo -e "[Service]\nExecStart=\nExecStart=/usr/bin/docker daemon -H fd:// --storage-driver=overlay" >/etc/systemd/system/docker.service.d/storage.conf
  - name: systemctl daemon-reload
    shell: systemctl daemon-reload
  - name: enable docker
    service: >
      name=docker
      enabled=yes
  - name: start docker
    service: >
      name=docker
      state=started
```

## 追記
### 2015/11/18

overlayfsだとdocker build時にyum installでエラーになることがあるみたいです。

- [CoreOSのoverlayfsでyumエラー](http://qiita.com/skame/items/f1c755d66256b750b3e8)
Shift+Spaceで行全体選択できない現象を引き起こさない方法(ATOK編)

http://qiita.com/shibahead/items/439229de2fb100ed1a9d

この記事への追記！

IMEとGoogle日本語入力を使っている方は上記リンクへ。

ATOKでは以下のやり方でできます。

なお、検証はATOK2015のみです。過去バージョンではやり方が違うかもしれません。

1.ATOKの環境設定
2.「入力・変換」タブの、入力補助の項目へ
3.一番下の「スペースキーで入力する空白文字」のShift+スペースのドロップダウンボックスを「常に半角」に変更

これで、問題解決しました。
Swiftで型クラス

Swiftでは既存の型をProtocolに適合させることができるので、型クラスが使えます

Monoid型クラスを作って、SequenceTypeにsumメソッドを追加してみます。

```swift
protocol Monoid {
  static var zero: Self { get }
  func append(other: Self) -> Self
}

extension SequenceType where Generator.Element: Monoid {
  func sum() -> Generator.Element {
    return self.reduce(Generator.Element.zero, combine: { $0.append($1) })
  }
}
```

```swift
[1, 2, 3].sum()  // => コンパイルエラー
```

じゃあInt, StringのMonoidインスタンスを定義します

```swift
extension Int: Monoid {
  static var zero: Int {
    get { return 0 }
  }

  func append(other: Int) -> Int {
    return self + other
  }
}

extension String: Monoid {
  static var zero: String {
    get { return "" }
  }

  func append(other: String) -> String {
    return self + other
  }
}
```

```swift
[1, 2, 3].sum()  // => 6
["1", "2", "3"].sum()  // => "123"
[1.0, 2.0, 3.0].sum()  // => コンパイルエラー
```

いい感じです。
Xcodeが使いづらいのを除けばSwiftけっこういい言語っぽい
Mac でも cocos2d::ui::EditBox を setContentSize でリサイズできるようにする


`cocos2d::ui::EditBoxImplCommon::setContentSize()` を参考にしながら
以下の様に修正するといい感じにリサイズされるっぽい。


```objc:ui/UIEditBox/UIEditBoxImpl-mac.mm
void EditBoxImplMac::setContentSize(const Size& size)
{
    _contentSize = size;
    
    auto director = cocos2d::Director::getInstance();
    auto glview = director->getOpenGLView();
    
    NSSize nsSize;
    nsSize.width  = size.width * glview->getScaleX();
    nsSize.height = size.height * glview->getScaleY();
    [_sysEdit.textField setFrameSize:nsSize];
    [_sysEdit.secureTextField setFrameSize:nsSize];
}
```

他の環境も同じ様に修正することで対応できると考えられる。
おいCookie食わねぇか

#こんなことありませんか
何かしらの認証の必要なwebサイトにあるリンク先を
WebBrowserクラスを使って色々やってからWebClientを使って
ダウンロードしたいときにクッキーを食わせる方法。


#こんなかんじでできます

```vbnet 
    Private Sub hoge()
        Dim wc As New WebClient
        Dim eLinks As HtmlElementCollection = wb1.Document.GetElementsByTagName("a")

        For i As Integer = 0 To eLinks.Count - 1
            '必要なら適当に弾く条件を作る

            'とりあえずtempに保存
            Dim saveTo As String = String.Format("{0}\{1}", My.Computer.FileSystem.SpecialDirectories.Temp, eLinks(i).InnerText)

            'おいCookie食わねぇか
            wc.Headers.Add("Cookie", wb1.Document.Cookie)
            wc.DownloadFile(eLinks(i).GetAttribute("href"), saveTo)
        Next i

        wc.Dispose()
    End Sub

```
Windows8.1 > 動作が重い > Microsoft Windows Search Indexerがメモリを1GB消費

2015年11月中旬のWindows Updateを適用してから、動作が重いPCが出てきた。


タスクマネージャを見ると「Microsoft Windows Serach Indexer」というプロセスがメモリを1GB消費している。

http://d.hatena.ne.jp/mar74_2nd/20130305#1362414767
を参考に上記プロセスを停止して対応したところ、動作が軽快になった。
haproxy ユーザーの作成

凄まじく小ネタですが。。

MariaDB 10.1 で(MySQL 5.7 でも同じはず。。)
haproxy用のチェックユーザーを作るときのお話。

せっかちな人のために先に結論：

```
CREATE USER haproxy;
grant usage on *.* to 'haproxy'@'%';
```
とすれば解決。

【理由】
5.7から grant 時にユーザーをデフォルトで自動的に作らなくなりました。

>MySQL :: MySQL 5.7 Reference Manual :: 5.1.7 Server SQL Modes
http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_auto_create_user

なので、先にcreate user しましょう。
というお話でした。

じゃないと、以下のエラーが出てしまいます。

```
MariaDB [mysql]> grant usage on *.* to 'haproxy'@'%';
ERROR 1133 (28000): Can't find any matching row in the user table
```
古い技術：ゼロ知識対話証明

たまには古い話を。そして学問は、役に立つと言われていたものが何の役にも立たなかったりその逆があったりして研究の価値は後代にならないとわからないものですよねという教訓も。

「知っているという事実」を内容は告げずに証明する
--
いかがわしい話ですが「情報商材」ってありますね。大儲けできるお得な情報、○○万円っての。インチキでないか心配だから買う前に内容を知りたいけど、売る側は買ってもらう前に内容を知られるわけにはいかない。内容を伝えることなく、知識が正しいことだけを証明できないか、なんて課題は情報商材みたいなインチキ商売に限らずいたるところにあります。

代表的なのがパスワード認証です。パスワードは相手に教えずに、正しいパスワードを知っているということだけを証明できないか。これをやろうという手法が**ゼロ知識証明(ZKP: Zero-Knowledge Proof)**です。実際に実現された方式では証明者と質問者が複数回のやりとりをするので**ゼロ知識対話証明（ZKIP:Zero-Knowledge Interactive Proof)**とも呼ばれます。

問題の正解を知っていること
--
ZKIPが対象とするのは、ある種の問題の正解を知っていることの証明です。
どういう問題かというと

- 作問は容易で、作問者には正解がわかる
- 正解を知っていれば答合わせも容易
- 力任せに解くのは計算量が爆発するため事実上不可能

なもの。なるほど、問題を公開情報、正解を秘密のパスワードのように扱う枠組みです。

そういう問題の中で

- 別の形の問題への変形が容易で、正解を知っていれば変形した問題の正解もわかる
- 変形した問題と元の問題を見比べても変形規則は容易にはわからない
- 変形した問題の正解がわかっても変形規則を知らないことには元の問題の正解はわからない

まで満たすとZKIPが可能になります。

2択を迫る
--
質問者は証明者にこう聞きます
「問題をランダムに変形して、変形した問題を教えてくれ」
そして変形後の問題を見て、**次のどちらか**を質問するのです

- 「変形規則を教えてくれ」
- 「変形した問題の正解を教えてくれ」

両方聞いてはいけません。両方教えてもらったら元の正解がわかってしまいます。
証明者はどちらを聞かれてももちろん答えられますし、質問者は

- 「ああ、たしかにこの変形規則でこう変形されるね」
- 「ああ、たしかにこれは変形した問題の正解だね」

と検証できます。
もし証明者が本当は正解を知らないとしたらどうでしょう。

- ランダムな問題をその場ででっち上げて教えたのなら「変形した問題の正解」は答えられます。しかし変形規則を答えられません。
- 変形規則を作って元の問題を変形したのなら変形規則は答えられますが、「変形した問題の正解」は答えられません。

正解を知らない証明者は、質問者を騙そうとしたら2択にヤマを張る必要があるのです。1/2で失敗してしまう証明ならば、10回やれば千分の一、40回やれば一兆分の一の成功率になり、これは強力な証明となるわけです。

そんな都合の良い問題あるの？
--
そんな都合の良い問題、あるんです。**NP完全問題**がすべてそうです。中でもよく例に示されるのがハミルトン閉路問題。点がたくさんとそれらを結ぶ線がたくさんあるから、その中からループになっているところを見つけなさいという問題。条件に合っていることを確認してみてください。

で、どうしてこれが古い技術なの？
--
実際これがあるCATVのセットトップボックスで認証に使われていたという話は聞いたことがあるのですが、今となってはまったく耳にしなくなりました。明確に役に立ちそうな目的があって研究された技術なのに使われていないんですね。

だってそうなりますよ、パスワードを平文で流したくないだけならチャレンジ文字列加えてハッシュ化するという手順で十分なんですもの…。いや、それどころかSSLで安全な通信路を確立して平文送信、こちらが本命ですか。サーバ側がパスワードを平文で保持しなくてよくなるので。
pyenv-virtualenvを使ったpypy環境構築(MacOSX)

### pyenv
https://github.com/yyuu/pyenv
pythonのバージョン切り替えができるモジュール
インストールはHomebrewで。
Ports派は https://github.com/yyuu/pyenv-installer を見てがんばる。

### virtualenv
独立したpython環境を作成できるモジュール。有名なので略。
今回はvirtualenvwrapperは使わない。

### pyenv-virtualenv
https://github.com/yyuu/pyenv-virtualenv
インストールはREADMEにある通りgithubから。
インストール後は.bash_profileに

```
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
```
の追加がおすすめされているので追加しておこう。

## 環境構築手順

### pypyのインストール
バージョン指定が必要なので
```$ pyenv install --list | grep pypy```
で利用可能一覧を取得して好きなのを選び、
```$ pyenv install pypy-2.6.1```
これだけ。(今回はなんとなく2.6.1)

### 環境作成
pyenv-virtualenvを使用して環境を作成する。
```$ pyenv virtualenv pypy-2.6.1 pypy-env```
「pypy-env」が環境名に当たるので好きな名前で。

### 環境に入る
```$ pyenv activate pypy-env```
virtualenvwrapperの時のようにworkonではないので注意。
微妙に長いので短い単語でエイリアスを設定しておいた方が便利。

### 環境から出る
```$ pyenv deactivate```
一旦deactivateにするとその環境にdeactivateマークが付くらしく、
再度入るには
```$ pyenv activate --force pypy-env```
とする必要がある。手動の出入りはあまり想定されていないようだが、
運用によるので、activateのエイリアスに初めから--forceを付けておくのも手だろう。

## おまけ
### virtualenvwrapperとどっちがいいのか
pyenvでインストールしたpythonから環境を作成するならpyenv-virtualenvを使った方が楽。(python本体のパスを気にしなくていいので)

特にpypyは各ライブラリをインストールするのにpypy-develを入れる必要があるが、
pyenv-virtualenvから作成した場合はpypy-develを内蔵してくれるようなので非常に楽。
(ちなみにpypy-develはCコンパイラが合わないとインストール時エラーになったりして地味につらい。)

ただ使った感じのお手軽感はvirtualenvwrapperの方が上なのであまりpyenvで複数pythonバージョンを使い分けとかしないならvirtualenvwrapperでよさそう。
DRBD環境におけるcron設定共通化


heartbeatで切替しているDRBD構成のサーバで、
cron設定についても共通化したいという要望について調査と対応。

cronの実体は/var/spool/cron以下のファイルなので
まず、これをDRBDの対象ディレクトリ内部に含む形にして
シンボリックリンク化する。

DRBDの対象ディレクトリを/dataとした際に、
/var/spool/cronを/data/cron_spoolのシンボリックリンクとした。

```
mkdir -p /data/cron_spool
cp /var/spool/cron/* /data/cron_spool/
chmod 700 /data/cron_spool/
mv /var/spool/cron /var/spool/cron.bk
ln -s /data/cron_spool /var/spool/cron
```

http://dice-k-0.blogspot.jp/2011/06/heartbeat-cron.html

こちらを参考にしつつ、heartbeatから呼び出すスクリプトについて修正した。

```lang:/etc/ha.d/haresources
#!/bin/bash
# get functions
. /etc/init.d/functions
# See how we were called.
case "$1" in
  start)
    rm -rf /var/spool/cron
    ln -s /data/cron_spool /var/spool/cron

    for textfile in $( ls /var/spool/cron ); do
        logger -s -t "${textfile}" "setting up root crontab" 
        /usr/bin/crontab -u ${textfile} /var/spool/cron/${textfile}
    done

    echo
  ;;
  stop)
    logger -s "change crontab dir" 
    rm -rf /var/spool/cron
    ln -s /var/spool/cron.bk /var/spool/cron

    for textfile in $( ls /var/spool/cron ); do
        logger -s -t "${textfile}" "setting up ${textfile} crontab" 
        /usr/bin/crontab -u ${textfile} /var/spool/cron/${textfile}
    done
    echo
  ;;
  status)
    for textfile in $( ls /var/spool/cron ); do
            echo "$0 status: " 
            echo "crontab -u ${textfile} -l:" 
            crontab -u root -l
    done
    ;;
  *)
    echo "Usage $0 (start|stop|status)" 
    ;;
esac
exit 0

```
変更ポイントは、
1. シンボリックリンクの張り替え
2. root以外のユーザcronへの対応
となる。

非アクティブ時にわざわざcron.bkにシンボリックリンクを張り替えているが、
これは非アクティブ時にも実行して欲しいcronがあること(時刻合わせとかね)
また、/var/spool/cronの実体が存在しない状態で、シンボリックリンクだけが
残っている場合に、crondが起動しないことがあることが理由。
Instagram Platform Update 2015/11/18


本日[Instagram Developers](http://developers.instagram.com/)に投稿されたエントリーでInstagram Platformに関して新しい発表がありました。

http://developers.instagram.com/post/133424514006/instagram-platform-update


備忘録として、簡単にまとめます。

##まとめ

### Simplified platform policy

[platform policy](https://instagram.com/about/legal/terms/api/)をシンプルに

### New review process

review processが新しくしたので、既存アプリに対してもreviewが入る

### Sandbox Mode

申請が通る前にInstgram APIを試すことができるSandbox Modeが登場

### More control for the community

出力されるコンテンツが誰の投稿なのか不明瞭になりうるという理由で、API endpoints2つ(`/users/self/feed` と `/media/popular `)がdeprecatedに

##おわりに

Instagram Platformは依然整っていない部分も多いですが、Instagramの急激な成長に対応するためにまだまだ変更が起こりそうです。
開発者は引き続き[Instagram Developers](http://developers.instagram.com/)をウォッチしていきましょう。

Instagramの開発規約に関しては、以前会社のエンジニアブログでもまとめたのでそちらもご覧ください。
[Instagram開発者に送る、注意すべきAPI規約/ブランド規約まとめ](http://tech.aainc.co.jp/archives/9950)
switch文でオプショナル型をキャストしつつunwrap

swift2.1で試してみたらできた。

```swift
let array: [Any?] = [1, "hoge", nil, UIViewController()]

for value in array {
    switch value {
    case let int as Int: print("Int: \(int)")
    case let string as String: print("String: \(string)")
    case nil: print("nil")
    case let vc as UIViewController: print("UIViewController: \(vc)")
    default: break;
    }
}
```

case let [unwrap後の変数名] as [型名]

switch文の中に`case nil`も書けるためか、`if let`の時と違って`as?`ではないみたい。

### 結果

```
Int: 1
String: hoge
nil
UIViewController: <UIViewController: 0x7fa190c2be10>
```
ES6のプロミスでライブラリを使わずにコールバックを同期処理で書く

## ES6 Promisesの基本的な3つの仕様
ES6のプロミスで定義されているAPIは大きく分けて以下の3つ

### Constructor
* コンストラクタ関数であるPromiseからインスタンスとなるPromiseオブジェクトを作成して利用する

```js

var promise = new Promise(function(resolve, reject) {
  // 非同期の処理
  // 処理が完了したらresolve,rejectを呼ぶ
  // 成功時はresolve
  resolve('success');
  // 失敗時はreject
  reject('error');
});
```

### Instance Method
newによって生成されたPromiseオブジェクトにはpromiseの値をresolve(成功)、reject(失敗)した時に呼ばれるコールバック関数を登録するための`promise.then()`というインスタンスメソッドがある

<strong>thenはresolve,rejectした時に呼ばれるコールバック関数を登録するためのインスタンスメソッド</strong>

Promiseではthenが頻繁に出てくるのでここを覚えておくのは重要。
インスタンスメソッドなので、promiseオブジェクトから以下のように実行できる。

```js
promise.then(成功時の関数, 失敗時の関数)
```

先ほどのコンストラクタと組み合わせるとこんな感じになります。

```js
// コンストラクタ
var promise = new Promise(function(resolve, reject){
  // 何かしらの非同期処理
  var result = getResult();
  
  // 成功時
  if (result === 'success') {
    resolve('success');
  } else {
    // 失敗時
    reject('error');
  } 
});

promise
.then(function(success) {
  // resolve(成功時)の処理
  console.log(success);
}, function(error) {
  // reject(失敗時)の処理
  console.log(error);
});
```

引数にいちいちfunctionを書くのが面倒！という場合は別メソッドに分割して呼び出せばいいと思います。

ただし上記の書き方だと第一引数の成功時の関数内で例外エラー(読み込み先のファイルが存在しない)などが発生した場合、第二引数の失敗時の関数ではハンドリングできません。

そのため例外エラーをハンドリングする場合は、`promise.catch`を利用します。

```js
// コンストラクタ
var promise = new Promise(function(resolve, reject){
  // 何かしらの非同期処理
  var result = getResult();
  
  // 成功時
  if (result === 'success') {
    resolve('success');
  } else {
    // 失敗時
    reject('error');
  } 
});

promise
.then(function(success) {
  // resolve(成功時)の処理
  console.log(success);
  // 例外発生
  throw new Error('wwwww');
}, function(error) {
  // reject(失敗時)の処理
  console.log(error);
})
// 例外をハンドリング
.catch(function(error) {
  console.error(error);
});
```

throwで例外にした場合、オブジェクトはRejectになり引数に渡した結果が`error`に渡されてきます。
rejectの関数内でも例外をハンドリングできるので、例外処理は.catchに書くようにしましょう。

また非同期処理をもっと連続で行いたい場合は、.thenをさらに下に追加すればよいです。
その時はpromiseオブジェクトが必要になるので、returnでpromiseオブジェクトを返すようにします。

```js
// コンストラクタ
var promise = new Promise(function(resolve, reject){
  // 何かしらの非同期処理
  var result = getResult();
  
  // 成功時
  if (result === 'success') {
    resolve('success');
  } else {
    // 失敗時
    reject('error');
  } 
});

promise
.then(function(success) {
  // resolve(成功時)の処理
  console.log(success);
  return new Promise(xxx, yyy);
}, function(error) {
  // reject(失敗時)の処理
  console.log(error);
  return new Promise(xxx, yyy);
})
.then(function(success) {
  // resolve(成功時)の処理
  console.log(success);
}, function(error) {
  // reject(失敗時)の処理
  console.log(error);
})
// 例外をハンドリング
.catch(function(error) {
  console.error(error);
});
```

従来のコールバックよりもシンプルに書けてよいですね。

### Static Method
3つめがstaticメソッドです。

これはPromise.all() や Promise.resolve() などが該当し、Promiseを扱う上での補助メソッドが中心となっています。all()の扱い方についてはまた今度まとめたいと思います。

ようするに複数の非同期処理を並列に実行し、全て完了したら次の処理を行いたい時に使う処理ですね。
個人的に気になっているのが、DeferredとPromiseの違いですがこちらもまとめて追記したいと思います。

## 参考記事
JavaScript Promiseの本
http://azu.github.io/promises-book/
【appium】spec形式のテストコードで判定部分に使うオレオレ定番

# 1. はじめに
Sep 2015頃よりappiumでモバイルデバイステスト自動化にトライしてますが、
appiumでandroidを操作するのはいいけどテスト結果の判定どうするの?
という場合によく使っているコードをサンプルとして投稿します。
Rubyで書いています。

# 2. 実行環境
以下の通りです。

|items|version|notes|
|---|---|---|
|macOSX|10.10.5|テスト実行端末|
|Android|4.4, 4.2|テスト対象端末OS|
|ruby|2.2.3p173|テストコード言語|
|appium|1.4.13|appiumのver.|
|node.js|v4.1.1|nodeのver.|

# 3. コードのサンプル

```ruby:画面要素をテキスト取得して、一致するか判定
check = find_element(:id, "android/id:xxxx").text
expect(check).to eq ("合ってる?")
```

上記は、画面内の要素をテキストとしてcheckに代入し
"合ってる?"と照合するサンプルコードです。
not equalにしたいこともあるかと思いますので、以下も紹介します。


```ruby:画面要素をテキスト取得して、コレジャナイ判定したい
check = find_element(:id, "android/id:xxxx").text
expect(check).not_to eq ("コレ")
```

画面要素をテキスト取得してcheckに"コレジャナイ"が代入された時に、
trueになるサンプルコードです。

ついでに、画面要素取得に判定用の値を含んでいればtrue
としたいこともあるかと思いますので、以下も紹介します。

```ruby:画面要素をテキスト取得して、"appium"文字列を含んでいるか判定したい
check = find_element(:id, "android/id:xxxx").text
expect(check).to include ("appium")
```

画面要素をテキスト取得してcheckに代入し、
代入テキストに"appium"が含まれていればtrueになります。
画面遷移テストで、要素取得したときに
当初完全一致しか判定できなくてtry & errorしました。

# 4. その他
appiumを2ヶ月くらいいじってみているところですが、
モバイルデバイス実機上で行えるテスト自動化はappiumで結構実現できると思います。

Windows上でappiumを動かす手順だとか、
Rubyで書くためのサンプルコード(部品的な)だとか、今後投稿したいと思います。
ibus - Pinyin 繁<->简ショートカットキー切り替え

##確認環境
CentOS6.7 Gnome

##インストール
$sudo yum groupinstall "Chinese Support"

##ショートカット
![ibus.jpg](https://qiita-image-store.s3.amazonaws.com/0/71525/ad17caf5-cefa-14b4-ab4a-76785bef45ce.jpeg)

On/Offや言語の切り替えは設定に出ています。

##繁體字・简体字の切り替えショートカットキー

ctrl + alt + f

で切り替わりました。

マウスで【拼】をクリックして変更は可能ですが面倒です。
windowsで搜狗输入を使っているので、同じように押してみたら
うまく切り替わりました。
どこかに説明あるのかもしれません。

そういえば、[搜狗输入法 for linux](http://pinyin.sogou.com/linux)もありますね。
後日試してみよう。
Macの全置換で　sed: RE error: illegal byte sequence　が出たら

```
$ export LANG=C
```

を流せば解決。


## 全置換のメモ


```
ファイルの文字列を置換（Mac用）
sed -i '' "s/ihoge/piyo/g” *.php
```


```
findとxargsを組み合わせると
find ./ -name *.php | xargs sed -i '' "s/hoge/piyo/g"
```
ブラウザ上でevalしたJavaScriptのデバッグ(Chrome限定)

# 前提

ブラウザ上のAltJS(CoffeeScript等でJavaScriptにコンパイル)やJavaScriptをevalで実行するような環境においては、eval対象のJavaScriptをDeveloperToolsにてデバッグ(主にステップ実行など)することができないと思っていました。

でも、たまにeval対象のJavaScriptでエラーが発生した時などに、DeveloperToolsにevalしたJavaScriptのソースが表示され、エラーが発生した行にフォーカスがあたっていることがあり、エラーを起こさないとデバッグできないのかと諦めていました。

# 解決方法

evalするスクリプト内で、console.logでログ出力することにより、Chrome内でevalされたスクリプトにアクセスできるようになります。

```js
// サンプルコード(Chrome上のDeveloperToolsのコンソールで実行できます)
// (1)関数を返却するスクリプト
var script = '(function(){\n' +
         'console.log("vmstart");\n' + 
         'return function() { \n' + 
         '  for(i = 0;i < 10;i++){\n' +
         '    console.log(i);\n' +
         '  }\n' +
         '}})()';

var f = eval(script); // (2)evalし、関数を取得

f();  // (3)関数を実行
```

(１)evalするJavaScriptの先頭に、どんな文字列でも良いので、console.logで文字列を出力します。
上記のコードで(2)を実行すると、DeveloperTools上には、このような表示になります。

![eval-result.png](https://qiita-image-store.s3.amazonaws.com/0/58872/c11ade64-54e0-64b0-f963-0643e59ee956.png)

コンソールに出力されたvmstart の右側に表示されているVM7139:2をクリックすると、evalしたスクリプトのソースが表示され、ブレークポイントも設定できるようになります。

![eval-script.png](https://qiita-image-store.s3.amazonaws.com/0/58872/2cbecca6-30e5-92f1-1084-d12d29fc10f5.png)

(3)を実行した時に、ブレークポイントで止まっている様子

![eval-debug.png](https://qiita-image-store.s3.amazonaws.com/0/58872/f65bc44a-084e-6218-683f-b32a62e64a34.png)

# 注意

evalするごとに、最初に表示されるログ(vmstart)の右側の値(VM????)の値が変更されるので、ブレークポイントはリセットされてしまうようです。
Amazon ECS Agent手動アップデート

# 追記
2015.12.22
マネジメントコンソールからやりたい場合
ECS>クラスタ>インスタンス 画面に遷移すると
update-agentボタンがあります。そこ押してください。

2016.08.25
ENV変わってたので更新した！

----

Amazon ECSでtask投入したらエラーが出てめっさハマったんだけど、
どうやらamazon-ecs-agentのバージョンが古いから出た見たい。

エラー画面キャプチャしてなかったけど、エラーの文言は以下の通り
`Reasons : ATTRIBUTE`


とりあえずアップデートしたら動いたので、手順をメモφ(..)
なお、現環境の最新版は1.12.1

```
# バージョン確認
curl -s 127.0.0.1:51678/v1/metadata | python -mjson.tool

# 任意のECS_CLUSTER名を入れる
ECS_CLUSTER=ur-cluster-name

# 入れ替え
docker pull amazon/amazon-ecs-agent:latest
docker stop ecs-agent
docker rm ecs-agent
docker run --name ecs-agent \
--restart on-failure:10 -d \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /var/log/ecs:/log \
-v /var/lib/ecs/data:/data \
-v /var/lib/docker:/var/lib/docker \
-p 127.0.0.1:51678:51678 \
-e ECS_LOGFILE=/log/ecs-agent.log \
-e ECS_DATADIR=/data/ \
-e ECS_CLUSTER=$ECS_CLUSTER \
-e ECS_UPDATES_ENABLED=true \
-e ECS_AVAILABLE_LOGGING_DRIVERS=[\"json-file\",\"syslog\",\"awslogs\"] \
-e ECS_AGENT_CONFIG_FILE_PATH=/etc/ecs/ecs.config.json \
-e ECS_UPDATE_DOWNLOAD_DIR=/var/cache/ecs \
amazon/amazon-ecs-agent:latest

# バージョン確認
curl -s 127.0.0.1:51678/v1/metadata | python -mjson.tool
{
    "Cluster": "as-jenkins",
    "ContainerInstanceArn": "arn:aws:ecs:ap-northeast-1:1234567890:container-instance/1234567890-2f2b-40ba-9b7e-c44d0kin4awa",
    "Version": "Amazon ECS Agent - v1.12.1 (d5e8c51)"
}
```
Drupal Advent Calendar 2015 を作成しました♪

Drupal Advent Calendar 2015 を作ったよ！

とうとう11/19にD8がリリースされました！
コミュニティとして、もっともっとDupalを盛り上げていくために、Drupal Advent Calnedar を作ってみました。

Drupalに関することなら、ゆる〜いことでも、がっつり！重たいことでも何でもＯＫ！

我こそはって思うコミュニティメンバーは、誰でもご参加ください。

http://qiita.com/advent-calendar/2015/drupal
Groonga Advent Calendar 2015

[Groonga Advent Calendar 2015](http://qiita.com/advent-calendar/2015/groonga)を作成しました。

>
カラムストア機能付き全文検索エンジン[Groonga](http://groonga.org/ja/)と、[Groonga族](http://groonga.org/ja/related-projects.html)（MySQLのストレージエンジン[Mroonga](http://mroonga.org/ja/)、今年登場したPostgreSQLの拡張機能[PGroonga](http://pgroonga.github.io/ja/)、Rubyからライブラリとして使える[Rroonga](http://ranguba.org/ja/#about-rroonga)など）の情報を共有するためのAdvent Calendarです。11月29日（日）に行われる[Groonga Meatup 2015](https://groonga.doorkeeper.jp/events/31482)の感想などでもOKなので、お気軽にご参加くださいませ。
>
[Groonga Advent Calendar 2015 - Qiita](http://qiita.com/advent-calendar/2015/groonga)

みなさまのご参加をお待ちしてします！

## 過去のGroonga Advent Calendar

* [Groonga Advent Calendar 2014 - Qiita](http://qiita.com/advent-calendar/2014/groonga)
* [全文検索エンジンGroonga Advent Calendar 2013 - Qiita](http://qiita.com/advent-calendar/2013/groonga)
myThings用にセットアップしたIDCF Cloudをウェブブラウザ上で動作確認する

# 概要

myThings用にIDCF Cloudをセットアップする方法はIDCF Cloudのウェブサイトにある「[myThingsをはじめよう](http://www.idcf.jp/cloud/iot/detail01.html#post01)」で詳しく紹介されています。セットアップ後の動作確認はターミナルを使用してコマンドラインから行うことも可能ですが、サーバサイドになじみのない人々を対象にしたワークショップなどでは、できるだけウェブブラウザ上で動作確認をしたい、ということもあるかと思います。そうした場合を想定した簡単なサンプルを作成し、jsdo.itで公開しました。

なお、WebSocketでのIDCF Cloudへのアクセスに関してはmasatoさんの記事「[myThingsをはじめよう - Part9: konashiをmyThingsのトリガーとアクションに使う](http://qiita.com/masato/items/f340fc174e78d41eeac1)」を参考にしています。

# 準備

1. 「[サーバーの準備：「IDCF」チャンネルでオープンソースのIoTをはじめよう](http://www.idcf.jp/cloud/iot/detail01.html#post01)」の説明に従って[3. デバイスの登録](http://www.idcf.jp/cloud/iot/detail01.html#post01-03)までを終える
2. [myThingsアプリと接続：myThingsから「IDCF」チャンネルを使う](http://www.idcf.jp/cloud/iot/detail01.html#post03)の説明に従い、[3. 「IDCF」チャンネルを認証する](http://www.idcf.jp/cloud/iot/detail01.html#post03-03)までを終える
3. myThingsアプリ上で「IDCFチャンネル」をトリガーに使用した組み合わせと、アクションに使用した組み合わせの2つをテスト用に作成する

こちらは「IDCFチャンネル」のtrigger-1をトリガーにし、アクションに「プッシュ通知」チャンネルのプッシュ通知を設定した組み合わせです。アクションは、プッシュ通知チャンネルに限らずTwitterやメール、Slackなど自分で確認しやすいものを設定するとよいでしょう。

<img width="375" alt="IMG_0148.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/92577/70d9ee59-cdc5-2e22-257a-2292a7debe3b.png">

こちらは「天気・災害」チャンネルの今日の天気予報をトリガーにし、アクションに「IDCFチャンネル」のaction-1を設定した組み合わせです。トリガーは、天気・災害チャンネルに限らずヤフオクやRSS、Google Calendarなど自分でなじみがあるものを設定すると良いでしょう。

<img width="375" alt="IMG_0160.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/92577/3d41649d-1366-c1c8-a3bc-5128b48d916f.png">

以上で準備は完了です。

# 使い方
1. [Real-Time Web Test](http://websocketstest.com/)のウェブサイトをブラウザ上で開き、自分の環境（ウェブブラウザおよび通信）でどのポートでWebSocketが利用可能か確認する
2. 80番が使用不可能で443番を使用する場合には、ウェブブラウザでICDF Cloud上にセットアップしたサーバのアドレス（例：[https://210.123.45.678](https://210.123.45.678)）にHTTPSでアクセスし、ウェブブラウザ上でアクセスを許可する
3. jsdo.it上のサンプル「[IDCF Channel Test](http://jsdo.it/kotobuki/4uV6)」を開き、サーバのIPアドレス、ポート番号、登録したデバイスのうちtrigger-1とaction-1のtokenおよびuuidを入力する
4. Connectボタンを押す
5. ここで無事にサーバに接続されればTriggerボタンが有効になる（ならない場合には入力内容に間違いがないか再度確認してください）
6. Triggerボタンを押し、しばらくたってmyThingsアプリ上で反応があることを確認する（すぐに確認したい場合には「手動実行」ボタンを押して即時実行する）
7. 作成したサンプルのうち、2番目を開いて｢手動実行｣ボタンを押して実行し、received messageのテキストボックスに受信したメッセージの内容が表示されることを確認する

![スクリーンショット 2015-11-18 10.42.26.png](https://qiita-image-store.s3.amazonaws.com/0/92577/ea8c243d-db5d-d50c-8ce4-dc399a28a365.png)

以上が問題なく動作すれば、ICDF Cloud上でmyThings用サーバのセットアップが無事に完了しています。