OmniAICreator/Qiita-1.07M huggingface dataset:
1を数える(ハードウェアで)

チェックサムなどで何かと1を数えたいことが多いので。
多分どこかに似たようなコードが存在しているが。

#概要
`W = 2^N`ビット幅の数値`Bits`中のセットされているビットの数`Count`を数える関数を
`Counter(N)(Bits)`
とでもする。

##N=0のとき
当然`Counter(0) = Bits`である。


##N>0のとき
`Count`はBitsの上半分の`Count`とBitsの下半分の`Count`の和に等しい。
(別に半分である必要はないが、キリが良い)
すなわち、

```
Counter(N)(Bits) 
= Counter(N-1)(Bits[W-1:W/2]) + Counter(N-1)(Bits[W/2-1:0])
```

#Verilogで書いてみる
関数`Counter`をそのまま回路にすればいい。

```verilog
module BitCounter#(parameter N=4)
(
    input[(1<<N)-1:0] Bits,
    output[N:0] Count
    );

    if(N == 0) begin
        assign Count = Bits;
    end
    else begin
        localparam Width = 1<<N;
        localparam Half = 1<<(N-1);
        wire[Half-1:0] Hi = Bits[Width-1:Half];
        wire[N-1:0] CHi;
        BitCounter #(.N(N-1))counterH(.Bits(Hi),.Count(CHi));

        wire[Half-1:0] Lo = Bits[Half-1:0];
        wire[N-1:0] CLo;
        BitCounter #(.N(N-1))counterL(.Bits(Lo),.Count(CLo));

        assign Count = CHi + CLo;
    end
endmodule
```

#パクｒ...参考にしたプログラム
```
x  =   (x & 0x55555555) + (x >> 1 & 0x55555555);
x  =   (x & 0x33333333) + (x >> 2 & 0x33333333);
x  =   (x & 0x0f0f0f0f) + (x >> 4 & 0x0f0f0f0f);
x  =   (x & 0x00ff00ff) + (x >> 8 & 0x00ff00ff);
return (x & 0x0000ffff) + (x >>16 & 0x0000ffff);
```

[Hacker's Delight](http://www.amazon.co.jp/exec/obidos/ASIN/0201914654/nakamuraminor-22/ref=nosim)
WEBrick をサービスとして動かすスクリプトを書いた

# はじめに
WEBrick を Nginx の reverse proxy のバックエンドにしたくて、サービス化するためのスクリプトを書いた

## 動作環境

```
# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 6.7 (Santiago)
# ruby --version
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux]
# rails -v
Rails 4.2.3
# ls
redmine-3.1.0.tar.gz
```

# スクリプト
実際のスクリプトは、以下の Gist を確認して欲しい。
https://gist.github.com/takuyaohashi/c49117930473487dc020

## 使い方
```bash:
# set rails application path
APPLICATION_ROOT="/path/to/webrick/dir"

# add path to bundle
export PATH=/usr/local/bin/:$PATH

# set configuration
PORT="3000"
BINDING_IP="0.0.0.0"
ENVIRONMENT="production"
RAILS_RELATIVE_URL_ROOT="/hoge/hoge"
```

基本的に上記設定を個々の環境にあわせて変更してもらえれば、使用できるはず。
特に説明は不要かと思いますが、1点だけ注意。
RAILS_RELATIVE_URL_ROOT を使う時は、config.ru を下記のような修正が必要。

```diff:config.ru
4c4,14
< run WEBrickApp::Application
---
> if ENV['RAILS_RELATIVE_URL_ROOT']
>   map ENV['RAILS_RELATIVE_URL_ROOT'] do
>     run WEBrickApp::Application
>   end
> else
>   run WEBrickApp::Application
> end
```

(参考URL: http://chroju89.hatenablog.jp/entry/2015/01/05/222205)

# サービス化
以下のコマンドでサービス化を行う

```
# chkconfig --add webrick
# chkconfig webrick on
```

# おわりに
使用するユーザも多くないし、レスポンスもそんなに気にならないと思うから、WEBrick でサーバを立ててみた。
パフォーマンスが気になってきたら、Unicorn とか他の手段を考える。
YumでNginxセットアップ+PHP-FPM

忘備録
【OS】
今回はCentOS7.1_x86_64版を使用。詳細は以下を参照。
http://www.server-world.info/query?os=CentOS_7&p=install
事前準備
セットアップに必要なパッケージを事前に設定しておく必要がある。以下を全て設定する。
システム変更が発生するので管理者権限が必須。rootにsuしておく事。

【YUMパッケージ管理】
yum -y install yum-plugin-priorities
yum -y update
yum -y groupinstall "Base" "Development tools" "Japanese Support"

[EPELリポジトリ追加]
yum -y install epel-release
[Remiリポジトリ追加]
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
[RPMforgeリポジトリ追加]
yum -y install http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm

【SELinux無効化】
vi /etc/selinux/config
<pre>
SELINUX=enforcing 
SELINUX=disabled ←変更(起動時に無効にする)
</pre>

Nginx をEPELからインストールします。
yum --enablerepo=epel -y install nginx

Nginx の基本設定です。
vi /etc/nginx/nginx.conf
<pre>
38行目：サーバー名変更
server_name www.sample.com;
</pre>

Nginx起動
systemctl start nginx 
systemctl enable nginx 

任意のクライアントで Web ブラウザを起動し、デフォルトページにアクセスして動作確認してください。以下のようなページが表示されれば OK です。
![image](https://qiita-image-store.s3.amazonaws.com/0/55845/7f71ef2d-fba5-a62c-58f5-2b924457d8b9.png)

PHP および PHP-FPM をインストールします。
yum --enablerepo=remi-php56 -y install php php-mbstring php-pear php-fpm

PHP-FPM と Nginx の設定です。
vi /etc/php-fpm.d/www.conf
<pre>
23行目：変更
user = apache
　　　↓
user = nginx

25行目：変更
group = apache
　　　↓
group = nginx
</pre>

PHP-FPM起動
systemctl start php-fpm 
systemctl enable php-fpm

Nginxコンフィグレーション変更
vi /etc/nginx/nginx.conf
<pre>
server セクション内に追記
        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param  PATH_INFO $fastcgi_path_info;
            include        fastcgi_params;
        }
</pre>

Nginx再起動
systemctl restart nginx 

PHPInfo を作成して PHP の動作確認をしてください。以下のようなページが表示されれば OK です。
<pre>
echo "<?php phpinfo() ?>" > /usr/share/nginx/html/info.php
</pre>
![image](https://qiita-image-store.s3.amazonaws.com/0/55845/bb0b5c6e-c270-6a93-d017-8ceaf3a08056.png)
Heroku CLI 簡単リファレンス

# ログインする
`$ heroku login`

# アプリケーションを作る
`$ heroku apps:create <app name> # アプリケーションを作る`

# アプリケーションの名前を変える
`$ heroku rename <new app name> # 必要に応じて、--app <app name>を付ける`

# 既存のアプリケーションを登録する
`$ heroku git:remote -a <app name>`

# 状態を確認する
`$ heroku apps:info # アプリケーションの情報を見る`
`$ heroku ps # プロセスを見る`
`$ heroku logs # ログを見る`

# データベース等を追加する
`$ heroku addons:create <db type> # RedisのFreeプランなら'heroku-redis:hobby-dev'`

# アプリケーションにコマンドを使う
`$ heroku run <command>`

# Herokuの環境変数を設定する
`$ heroku config:set <EXAMPLE>=<example>` # 解除するには'config:unset'
`$ heroku config # 環境変数の一覧を表示する`

# デプロイする
`$ git push heroku master`

# メンテナンスモードにする
`$ heroku maintenance:on # offにするには、maintenance:off`

# プロセスを停止する
`$ heroku ps:stop <process name> # 指定したプロセスを停止する`

# 再起動する
`$ heroku restart <process name> # 指定したプロセスを再起動する`

# その他に抑えておきたいこと
- 無料プランでもAddonsの利用にはクレジットカードの登録がいる
c++ builder XE4, 10.2 Tokyo > TMemo > Ctrl+cの時に内容をクリップボードに送る

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/26)
```

Ctrl+Cの検知は以下を参考にした。
http://www.gesource.jp/weblog/?p=5112


TMemoのクリップボードへのコピーは以下を参考にした。
http://www.greatis.com/delphicb/tips/lib/clipboard-pastefromclip.html


```cpp
void __fastcall TForm1::Memo1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift)

{
	if (Key == 'C' && Shift.Contains(ssCtrl)) {
		Memo1->SelectAll();
		Memo1->CopyToClipboard();

		ShowMessage(L"Copied to clipboard");
	}
}
```
参照実態をcontentで使うTIP

```html
p:before {
	content: "◀︎";
}
```
というようなかんじで参照実態をcontentに入れるとする

#参照実態をcontentにそのままいれてみる

◀︎は参照実態では```&#9664;```と書く

```html
p:before {
	content: "&#9664;";
}
```
文字列がそのまま表示される・・・

#TIP

[16進数値文字参照 変換スクリプト | WebTecNote](http://tenderfeel.xsrv.jp/css/787/)の» 終わりギュメの横にあるテキストフィールドに**参照実態ではなく記号**を入れて変換。

```
\0025c0
```
これをCSSのcontentに入れる

```html
p:before {
	content: "\0025c0";
}
```
無事記号になりました。

デモ：http://jsdo.it/Ituki/hhF4
iOSのProvisioning Profile削除方法

Provisioning Profileを複数インストールしちゃって、古いものと新しいものの区別がつかなかったり、それで変なキャッシュが残ってビルドがおかしくなることがたまにある。

そんなときにprovisioning profileをPCからuninstallする方法のメモ

# 1. Xcode > Preferences > Accounts

自分のアカウントをクリックして、View Detailsを押す

![step1_account.png](https://qiita-image-store.s3.amazonaws.com/0/15000/2c526f03-0638-c9f2-0c2a-c6148c6b2512.png)

# 2. Provisioning Profiles 一覧から対象のファイルを選択

![step2_remove.png](https://qiita-image-store.s3.amazonaws.com/0/15000/bca5df21-3fd4-0d19-cfc2-19d9ccf17d28.png)

# 3. finder上で削除

![step3_finder.png](https://qiita-image-store.s3.amazonaws.com/0/15000/fe30af88-760a-9b9a-f049-bf8ba8557aa1.png)

以上です。

この方法の面倒なところは1つ1つ選択して削除していかなきゃな点。
Profileの名前から一括で選択して削除するいい方法しってたら教えて下さい・・・
Storyboardでビューのクラスを強制的に変更する。

#注意
このエントリの方法は”手術的”です。
プロジェクトに対して手術が失敗したり、後遺症が残る場合もあります。十分に注意してください。

#概要
Storyboardでビューをたくさん置いて、Autolayoutも全部設定したのに見返したら「あ、UIImageViewじゃなくてUIViewにしたい…」ってことありませんか？あります。

この場合、普通は一回ビューを削除してまたAutolayoutを付け直せばいいんですが複雑に配置されたAutolayoutを付け直すのは骨が折れますよね…。

そのような場合に配置したビューのクラスを強制的に変更する方法があります。

#手順
![スクリーンショット 2015-09-02 11.20.02.png](https://qiita-image-store.s3.amazonaws.com/0/24979/9b9dc812-a07e-ec25-46fe-6b814b29345c.png)

例としてシンプルな構成で試してみます。上記のbaseViewとかかれたUIImageViewをUIViewに変更してみましょう。

![スクリーンショット 2015-09-02 11.20.09.png](https://qiita-image-store.s3.amazonaws.com/0/24979/13248042-8638-e345-bede-b86aebe3aeec.png)

Storyboardから`Open With External Editor`を選択して普段使っているエディタでStoryboardを開きます。

![スクリーンショット 2015-09-02 11.20.43.png](https://qiita-image-store.s3.amazonaws.com/0/24979/d84583a4-7326-a7bd-f770-a71f97cd6923.png)

ビュー名で検索して、前後の雰囲気から変更したいビューかどうか確かめます。
構成はXMLのようになっているので、なんとなくわかるかと思います。

```xml

                            <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="UPw-m4-Aeg" userLabel="baseView">
                                <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
                            </imageView>
```

今回はimageViewの部分をviewに変えることでUIViewにします。

```xml
                            <view userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="UPw-m4-Aeg" userLabel="baseView">
                                <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
                            </view>
```

保存したらStoryboardに戻ると自動的にリロードされて、UIImageViewがUIViewになっていると思います。

![スクリーンショット 2015-09-02 11.21.23.png](https://qiita-image-store.s3.amazonaws.com/0/24979/26c9fd8f-64b7-7d28-fed9-2c4f7f63a56d.png)


#Storyboard XML
タグ名ですが、UIKitからプリフィクスを取った文字列になります。
UIViewならview、UISegmentedControlならsegmentedControlです。
最初が小文字なのを忘れずに

#ビューのサイズが決まっているビューを変更したらどうなるの？
例えば自由にサイズ指定したビューをUIProgressViewやUIStepperのように、縦のサイズが決まっているビューに変更するとどうなるのでしょうか？

![スクリーンショット 2015-09-02 11.40.23.png](https://qiita-image-store.s3.amazonaws.com/0/24979/691a61d3-f4f8-1e61-2d9c-2077718d67d0.png)

このようにStoryboard上では元のViewと同じサイズで表示されます。

![iOS Simulator Screen Shot 2015.09.02 11.40.21.png](https://qiita-image-store.s3.amazonaws.com/0/24979/ebe70447-4848-0bd3-9be2-e42b70d403d0.png)

しかし、実際のアプリ上では規定サイズになります。

このようにビューのサイズに矛盾が生じるような使い方は意図的でない場合以外は不具合の温厚になるのでやめましょう。

#名前が見当たらない
Storyboard上で名前を指定していない場合はデフォルト名（例えばABBannerViewならBanner View）が設定されますが、XML上にはその文字列はありません。
gulpfile.coffeeの設定メモ


まだまだ全然、理解ができていないgulpですが、
いろいろと試行錯誤し、つくった、gulpfile.coffeeのメモを書いておく。
単純に自分用メモなので解説とか無駄があるとか一切お構いなしです。
もうしわけ。
アドバイスなどがあったらすごく嬉しいです。


```gulpfile.coffee
gulp      = require 'gulp'
watchify  = require 'gulp-watchify'
plumber   = require 'gulp-plumber'
rename    = require 'gulp-rename'

compass   = require 'gulp-compass'
cssmin    = require 'gulp-cssmin'
pleeease  = require 'gulp-pleeease'
coffee    = require 'gulp-coffee'
uglify    = require 'gulp-uglify'
imagemin  = require 'gulp-imagemin'
changed   = require 'gulp-changed'
cache     = require 'gulp-cached'

# 各種パス
dir = "path.to"
path =
  sass   : dir + "asset/**/*.scss"
  cssimg : dir + "asset/img/"
  dst    : dir
  coffee : dir + "asset/**/*.coffee"
  dstJs  : dir + "common/js"
  image  : dir + "asset/**/*.+(jpg|jpeg|png|gif|svg)"

# SCSS -> CSS
gulp.task 'css', ->
  gulp
    .src "/Path.to/**/*.scss"
    .pipe cache('css')
    .pipe plumber()
    .pipe compass({
      config_file: 'config.rb'
      css: "/Path.to/files"
      sass: "/Path.to/asset/"
    })

# キャッシュして（cache('css')）
# エラーチェックして（plumber()）※チェックしてエラー出てもタスクを止めない
# コンパスドーン(compass({略}))
#
# 以前sassはruby-sassでやってたけども、それですると
# なぜか、更新したファイル以外も毎度確認されて、処理がおそかった
# なんかないかと試行錯誤したけっか、普通にcompassあるやないかということに気がついた

# coffee -> js
gulp.task 'coffee', ->
  gulp
    .src path.coffee
    .pipe plumber()
    .pipe coffee()
    .pipe rename({suffix: '.min'})
    .pipe uglify()
    .pipe gulp.dest(path.dstJs)

# エラーチェックして（plumber()）※チェックしてエラー出てもタスクを止めない
# リネームして（rename({suffix: '.min'})）
# 圧縮して（uglify()）
# 書き出し！（gulp.dest(path.dstJs)）
#
# まだまだ謎の多いcoffeescript ※自分だけ
# 普通にjQuery書いてた時にエラーが出なかったのに
# coffeescriptでかいたらスマホ・タブレットでエラーが・・・
# まだまだ謎だらけ・・・

# 画像圧縮
gulp.task 'imagemin', ->
  gulp
    .src path.image
    .pipe changed(path.dst)
    .pipe imagemin({optimizationLevel: 7})
    .pipe gulp.dest(path.dst)
#

# デフォルトタスク
gulp.task 'default', ->
  gulp
    .watch "/Path.to/asset/**/*.scss", ['css']
    .watch path.coffee, ['coffee']
    .watch path.image, ['imagemin']

```

実行するときは以下のコマンドを打つだけ

``` .rb
# 監視開始
gulp

# 別々に実行したかったら
gulp css # cssへのコンパイルのみ
gulp coffee # jsへのコンパイルのみ
gulp imagemin # 画像圧縮のみ
```

gulpfileをcoffeeファイルで触るときは

```
npm i -D coffee-script
```

ってしないとだめなのね。
前に行けた時はやった記憶がなかったのに^^;
古いガラケーのSSL対応状況とTwitter各ドメインの証明書


TwitterとガラケーのSSLについて改めていろいろ調べてみました。

## ガラケーのSSL対応状況

||TLS1.0|SHA-2|VeriSign|Baltimore|DigiCert|
|---|---|---|---|---|---|
|docomo iモードブラウザ1.0|x|x|o|o|x|
|docomo iモードブラウザ2.0|o|o|o|o|x|
|au|o|△※|o|o|x|
|Softbank|o|△※|o|o|x|
|Y!mobile|o|△※|o|o|x|

## TwitterのSSL証明書

|domain|署名アルゴリズム|ルート証明書|有効期限|
|---|---|---|---|
|twitter.com|SHA-2|VeriSign Class 3 Public Primary Certification Authority - G5|2016年5月10日|
|mobile.twitter.com|~~SHA-1~~<br>SHA-2|VeriSign Class 3 Public Primary Certification Authority - G5|~~2015年10月12日~~<br>2017年7月31日|
|api.twitter.com|~~SHA-1~~<br>SHA-2|~~VeriSign Class 3 Public Primary Certification Authority - G5~~<br>DigiCert High Assurance EV ROOT CA|~~2017年1月1日~~<br>2016年8月15日|
|pbs.twimg.com|~~SHA-1~~<br>SHA-2|~~DigiCert High Assurance EV ROOT CA<br>Baltimore CyberTrust Root<br>(クロスルート)~~<br>DigiCert SHA2 High Assurance Server CA|2016年5月18日|
|*.twimg.com|SHA-2|DigiCert SHA2 High Assurance Server CA|2016年5月18日|

※ SHA-2非対応機種の情報

- docomo https://www.nttdocomo.co.jp/info/notice/pages/150715_00.html
- au http://www.kddi.com/important-news/20150715/
- Softbank http://www.softbank.jp/mobile/info/personal/news/support/20150715a/
- Y!mobile http://www.ymobile.jp/info/2015/15071501.html

## わかったこと

TwitterモバイルサイトでやたらとSSL警告が出るのは*.twimg.comのルート証明書がガラケー対応でないため。

## 今後想定されること

- 2015年10月12日までにmobile.twitter.comの証明書が更新され、au/Softbank/Y!mobileの古い端末からTwitterモバイルサイトにアクセスできなくなる可能性
    - 2015年10月1日にmobile.twitter.comの証明書が更新され、SHA-2になったようです。
- 2017年1月1日までにapi.twitter.comの証明書が更新され、au/Softbank/Y!mobileの古い端末でoAuthが使えなくなる可能性
    - いつのまにか(おそらく2015年10月1日)api.twitter.comの証明書が更新され、SHA-2になったようです。
文字列を長さで分割


普通にsubstringを使った場合。これだとサロゲートペアに対応していないので、文字列に「𠮷」などが含まれる場合は文字数が少なくなったり文字化けするなどの不具合が発生する。

```java
public static List<String> splitByLength(String s, int length) {
    List<String> list = new ArrayList<>();
    while (s != null && s.length() != 0) {
        int endIndex = Math.min(length, s.length());
        list.add(s.substring(0, endIndex));
        s = s.substring(endIndex);
    }
    return list;
}
```

正規表現を使って分割する方法。こちらはサロゲートペア対応。 
情報提供:[macoshita](http://qiita.com/macoshita)

```java
public static List<String> splitByLength(String s, int length) {
    List<String> list = new ArrayList<>();
    if (!Strings.isNullOrEmpty(s)) {
        Matcher m = Pattern.compile("[\\s\\S]{1," + length + "}").matcher(s);
        while (m.find()) {
            list.add(m.group());
        }
    }
    return list;
}
```
2015-09-02 c++ builder > std::mapの使用 > dic_register()など の実装

```txt:動作確認
C++ Builder XE4
```

std::mapの使用をしてみた。

参考1: http://gimite.net/bcbqtree/qtreemain.cgi?mode=thread&thread=367
参考2: http://blog.livedoor.jp/dormolin/archives/51778178.html
参考3: http://d.hatena.ne.jp/kenta11626918/20110418/1303111915

## try1

```cpp
void __fastcall TForm1::Button2Click(TObject *Sender)
{
	std::map<String, String> *dic = new std::map<String, String>;

	dic->insert(std::pair<String,String>(L"0d", L"CR"));
	dic->insert(std::pair<String,String>(L"0a", L"LF"));

	std::map<String,String>::const_iterator it;
	String res;

	it = dic->find(L"0d");
	if (it->first == L"0d") {
		ShowMessage(it->second); // CR
	}

	it = dic->find(L"AA");
	if (it->first == L"AA") {
		ShowMessage(it->second); // not shown
	}

	delete dic;
}
```

findで見つかったかどうかの確認に->firstを使っているが、もっといい方法があるのかもしれない。

RadStudioで上記実装しているとおかしな入力補完が働くためSublime Textなど別エディタで実装したほうがよい。


##try2

```cpp
#include <map>
...
static std::map<String, String> *s_dic = NULL;
...
static const String kControlChars[][2] =
{
	{ L"0d", L"CR"},
	{L"0a", L"LF"}
};
static int s_ControlCharsCount = sizeof(kControlChars) / sizeof(kControlChars[0]);

static void dic_register()
{
	s_dic = new std::map<String, String>;
	for(int idx=0; idx < s_ControlCharsCount; idx++) {
		s_dic->insert(std::pair<String,String>(
			kControlChars[idx][0], kControlChars[idx][1]) );
	}
}
static void dic_unregister() { 
  if (s_dic != NULL) {
    delete s_dic; 
    s_dic = NULL;
  }
}
static bool dic_find(String key, String *dst)
{
	std::map<String,String>::const_iterator it;
	it = s_dic->find(key);
	if (it->first != key) {
		*dst = L"";
		return false;
	}
	*dst = it->second;
	return true;
}

void __fastcall TForm1::Button2Click(TObject *Sender)
{
	dic_register();

	String key, res;
	bool found;

	// case1
	key = L"0d";
	found = dic_find(key, &res);
	if (found) {
		ShowMessage(key + L"-->" + res);
	} else {
		ShowMessage(key + L" not found");
	}

	// case2
	key = L"aa";
	found = dic_find(key, &res);
	if (found) {
		ShowMessage(res);
	} else {
		ShowMessage(key + L" not found");
	}

	dic_unregister();
}
```
2015-09-02 c++ builder XE4 > TDictionaryを使おうとしてひっかかったこと > ilink32 エラー

```txt:動作確認
C++ Builder XE4
```

UnityでTDictionaryの存在を知り、それをC++ Builderでも使おうかと考えた。

XE4のヘルプを見ながら実装したところ、以下のエラーが出た。

```cpp
#include <System.Generics.Collections.hpp> // for TDictionary
...
void __fastcall TForm1::Button2Click(TObject *Sender)
{

	TDictionary__2<String, String> *dic = new TDictionary__2<String, String>(0);

	dic->Add(L"0d", L"CR");
	dic->Add(L"0a", L"LF");

}
```

```txt:エラー
  [ilink32 エラー] Error: 未解決の外部シンボル '__fastcall System::Generics::Collections::TDictionary__2<System::UnicodeString, System::UnicodeString>::TDictionary__2<System::UnicodeString, System::UnicodeString>(int)' が D:\TOOLS\XE4\XXXX_HMRZ1CSVVIEWER\WIN32\DEBUG\MAIN.OBJ から参照されています
  [ilink32 エラー] Error: 未解決の外部シンボル '__fastcall System::Generics::Collections::TDictionary__2<System::UnicodeString, System::UnicodeString>::Add(const System::UnicodeString, const System::UnicodeString)' が D:\TOOLS\XE4\XXXX_HMRZ1CSVVIEWER\WIN32\DEBUG\MAIN.OBJ から参照されています
  [ilink32 エラー] Error: リンクを実行できません
```

以下において、解決方法が掲示されている。
http://www.gesource.jp/weblog/?p=5949

一方で、
http://stackoverflow.com/questions/10611606/use-tdictionary-in-c-builder-xe2
> For C++ code, you should use an STL std::map instead:

というコメントもあるようだ。

mapを使うことにした。
c++ builder XE4, 10.2 Tokyo > 16進表記をchar型に変換する > int val = StrToInt(L"$" + src); ch = Char(val);

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/26)
```

16進数での表記(030など)をchar型に変換したい。
[ASCIIコード表](http://www9.plala.or.jp/sgwr-t/c_sub/ascii.html)

以下を参考にした。
[SO](http://stackoverflow.com/questions/1740320/how-to-show-hex-code-char)

実装してみたのが以下。

```cpp
static AnsiString getChar(String src)
{
	src = src.Trim(); // remove L" "
	char ch;

	if (src.Length() > 0) {
		int val = StrToInt(L"$" + src);
		ch = Char(val);
		return AnsiString(ch);
	} else {
		return L"";
	}
}

void __fastcall TForm1::Test_getChar()
{
	String rcvd;
	AnsiString ascii = L"";

	rcvd = L"30 ";
	ascii = ascii + getChar(rcvd);
	rcvd = L"35 ";
	ascii = ascii + getChar(rcvd);
	rcvd = L"65 ";
	ascii = ascii + getChar(rcvd);

	Memo1->Lines->Add(ascii); // "05e"が追加される

}
```

引っかかったのは`30 `のように文字列の最後に0x20が入った時、そのままStrToInt()で処理しようとしたらエラーが出たこと。
Trim()にて0x20を取り除くようにすれば動作するようになった。

上記は非表示文字(エスケープ文字? コントロール文字?)については未対応。

AnsiStringで処理しているのは"-"という文字に対応する16進数をUnicodeStringで処理した時に文字化けのようになったことから。このあたりは勉強不足。
EclipseにScala開発環境を追加する

Scala を全体に導入するという話になったのでローカルに開発環境を構築するためのメモ

# 前提

* Windows 7
* Eclipse 4.4 Luna (Pleiades を使用)

# インストール手順

「ヘルプ」＞「新規ソフトウェアのインストール」

から、以下↓のアップデートサイトを追加して、全部インストール、途中で出て来るセキュリティの警告もとりあえずOKする。インストール後、Eclipseの再起動を要求されるので再起動して完了。

`http://scala-ide.org/download/current.html`

## 本日時点 2015/9/2 でインストールされるもの

* Scala 2.11.7
* Sbt 0.13.6
* Scalariform 0.1.6
* Scala Refactoring 0.6.2
Android Marshmallow対応！Permissions事始め

Androidの新OS正式版もそろそろ発表されそうです。
既存アプリで対応が必須と思われるPermissionsについてまとめます。

参考：http://developer.android.com/preview/features/runtime-permissions.html

# AndroidにおけるPermissionとは
各機能へのアクセス権限のことです。
開発者が必要な権限をユーザーに提示し、ユーザーが許可することによってその権限を使うことができるようになります。


# MのPermissionモデルの概要

### ・～5.X.X
ユーザーはアプリのマニフェストでリストされているすべてのパーミッションを付与するように要求されます。
一度許可すると拒否することはできないです。

### ・6.0～
ユーザーは必要なときに必要なパーミッションを付与するように要求されます。
一度許可したあとでも拒否することが可能になります。


今までは、インストール時に全てのパーミッションが求められ、許可しない限りインストールを行うことができませんでした。
今後は、ユーザーが自由に許可/拒否できるようになります(全てのパーミッションがそうなるわけではありません)。


# ユーザー視点の処理の流れ

### 1. PlayStoreからアプリをインストールする
インストールの際、ユーザーはPROTECTION_NORMALレベルのPermissionの要求をされます。
Permissionにはレベルがあり、PROTECTION_NORMAL以外にもPROTECTION_DANGEROUSなどがあります。
PROTECTION_NORMALは危険性が少ないレベルとされており、android.permission.INTERNETなどが含まれます。

### 2. インストールが完了し、アプリを使い始める
アプリを使い始めます。

### 3. 使用する機能に応じてPermissinosを求められる
ユーザーはPermissionが必要な機能を使用しようとしたときに、Permissionを要求されます。
このときに要求されるのは、PROTECTION_NORMAL以外のPermissionです。
Permissionの要求に対して、ユーザーは許可しても許可しなくてもOKです。
ですが、許可しなかった場合はその機能を使うことはできません。
あとで許可/拒否を変更することも可能です。設定アプリから変更することができます。

# 開発者視点の処理の流れ (サンプルコードが[参考サイト](http://developer.android.com/preview/features/runtime-permissions.html)にあります)
### ・Permissionが許可されているか調べる
Permissionが必要な処理を行う場合、Permissionが許可されているか調べます。
この処理は一度Permissionが許可された後でも行う必要があります。
なぜならば、ユーザーはいつでも自由にPermissionの許可を変更することができるからです。
チェックは以下のメソッドを使って行います。

```
checkSelfPermission (String permission)
```

### ・Permissionを要求する
必要に応じて、Permissionをユーザーに要求します。
要求は以下のメソッドを使って行います。

```
requestPermissions (String[] permissions, int requestCode)
```

### ・要求に対する応答に応じた処理をする
ユーザーの応答に応じた処理をします。
許可した場合、拒否しなかった場合の処理を考える必要があります。
応答への処理は以下のコールバックメソッドを使って行います。

```
onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)

```

# 下位互換
|　|アプリのtargetSDK=M|アプリのtargetSDK=M以外|
|-------------|---------------|---------------|
|端末OSがM|新しいPermissionモデル|インストール時にすべてのPermissionが要求される<br>ただし、設定アプリから許可を取り消すことは可能|
|端末OSがM以外|インストール時にすべてのPermissionが要求される<br>(今までと同じ動き)|インストール時にすべてのPermissionが要求される<br>(今までと同じ動き)|

端末OSがM　かつ　targetSDK=M以外　の場合、
インストール時にすべてのPermissionが要求されます。ここは今までの動きと変わりません。
しかし、設定アプリから許可を取り消すことが可能になります。
設定アプリから許可を取り消したPermissionが必要な処理を行うと、エラー、もしくは空のデータが返ってきます。

# Best Practice
開発者が気をつけるべきことです。

### 1.必要なPermissionだけを要求する
必要なものだけを要求します。

### 2.要求するタイミング
たとえば10個のPermissionが必要だった場合、最初の起動時にすべてのPermissionを要求するほうがユーザーを「疲れさせない」かもしれません。
要求するタイミングは開発者が決めることができます。ユーザーを疲れさせない要求のタイミングを考えましょう。

### 3.必要な理由を説明する
たとえば、カメラアプリでカメラのPermissionを求められるのはユーザーにとって納得感があります。
しかし、電話帳へのアクセスを求められた場合はすんなりと納得するのは難しいと思われます。
そんなときは、なぜこのPermissionが必要なのかをユーザーに説明する必要があります。


「要求するタイミング」、の項で起動時にすべてのPermissionを求める方法もある、と説明しました。
それと同時に、納得感を得られないPermissionの要求をする場合は、なぜ必要なのかを説明したほうがよいです。
説明が必要なPermissionの要求は、起動時にほかのPermissionを要求するのと一緒に要求するのではなく、使うタイミングで要求したほうがよいです。

# まとめ
- ユーザーが自由にアプリのパーミッションを許可/拒否できるようになります
- ユーザーは、一度パーミッションを許可したあとでも拒否できるようになります
- 開発者のアプリへの対応が必要です
<video>に<map>や<area>は効きますか？いいえ、効きません。

## はじめに
`videoタグ`で表示されている動画に複数リンクを効かせたいということがありまして、
色々調べた結果、`mapタグ`や`areaタグ`というものがあることを知りました。(かなり昔からあるものなのね)
基本的な使い方はこちら → http://www.htmq.com/html5/area.shtml
仕様を見る限り、`<map>`や`<area>`は指定の`<img>`に対して効かせることはできるようですが、
素材という意味ではそこまで差のない`<video>`に効かせることはできるのか検証してみました。

## 試してみた
```html:video_multilink.html
<video src="sample.mp4" width="640" height="360" usemap="#video-multilink"></video>
<map name="video-multilink">
  <area shape="rect" coords="0,0,640,120" href="link1.html">
  <area shape="rect" coords="0,120,640,240" href="link2.html">
  <area shape="rect" coords="0,240,640,360" href="link3.html">
</map>
```
ダメでした。
videoタグはusemap属性持っていないようなので当たり前といえば当たり前。

## 対処法
`<video>`に`map`や`area`を効かせるのは無理だったので他の方法を考えます。
一番シンプルに思いつくのは、`<video>`の上に透明な画像を敷いてその画像に対して`<map>``<area>`を効かせることですね。
やってみましょう。

```html:video_multilink2.html
<video src="sample.mp4" width="640" height="360"></video>
<img src="/path/to/skeleton.gif" usemap="#video-multilink" style="position:absolute; left:0px;" width="640" height="360">
<map name="video-multilink">
  <area shape="rect" coords="0,0,640,120" href="link1.html">
  <area shape="rect" coords="0,120,640,240" href="link2.html">
  <area shape="rect" coords="0,240,640,360" href="link3.html">
</map>
```
効きました。


とはいえもう少し良い方法ないかなーと思っているのも事実なので、代案募集中です。
エンジニアな僕がアメリカ留学をして思ったこと(5か月目)

# 前書き
自分は文章は下手だし今回の内容は特につまらないので、この文章を読むより自分の今興味のあるワードでQiitaで調べてそのエントリを読むことをお勧めする。

昨年の夏あたりだろうか、ふとした切っ掛けで、「そうだ、休学して留学しよっかなー」と思い、4月からアメリカのカリフォルニア州立大学に来て早5か月。
僕の中で考えが変わったこと、考えるに至ったことを書き綴る。

# 学ぶとは何か?
日本にいるときから「学ぶ」ということはどういうことなのかということには常々考えさせられてきた。
僕自身プログラミングをしてきたポートフォリオにはキリは無いし、一応割と広いITの分野の普通の知識は理解したうえで、自分の専門分野的なものを持っているという普通の大学生の中では珍しい存在であるかもしれない。
そんな中で学ぶということについて考えさせられたことはアメリカに来てからというもの非常に多くなったものだ。

## Turner教授との出会い
自分の考えを語る上で、アメリカに来てからというものTurner教授との出会いを抜いて語ることはできないだろう。
Turner教授は僕がとっていたGame Developmentの授業の教授だった。そのGame Developmentの授業はUnityやらUnreal Engineなどといった現在イケイケなゲームエンジンを使うか、Phaser.jsやenchant.jsを使ってグループもしくは個人で開発しプレゼンをするというものだった。
僕はその当時から個人的に関わってたOSSプロジェクトの一つにjThreeがあり、ライブラリを使わず、WebGLネイティブを直接叩くライブラリの作成を授業の一環としてよいかオフィスにTurner教授を訪ねたのだった。

Turner教授は快く受け入れてくれた上、色々な話をした結果、毎週のようにオフィスアワーにずっと話し込むというようなスケジュールができ上ったのである。
その結果、様々な話をしたばかりか、Turner教授の秋学期に持つWebエンジニアリング関係の授業の教材作成の補佐を務めることにもなったし普通は院生がやるようなチューターとして雇われることにもなった。
jQueryベースの教材を新しくするべくReact.jsを用いた教材に書きなおしたのである。

## 自分ために「学ぶ」ということ
ある時、Turner教授は僕に将来何をしたいか尋ねた。
ベンチャー企業にコミットメントするか、大学教授になり研究したいということを伝えた。以前から思っていた事である。

**"You should just keep on keeping on"
(ただひたすら、今行っていることを続けなさい。)**

非常に単純な答えである。

自分が得意としているというか昔からただひたすらやってきた分野はコンピューターグラフィックス関係である。個人でやる分にはリソースが少ないし、会社で行うにもイケイケなゲームエンジンが今では主流だ。
Web屋と違って今すぐに人手がほしいなんて話も聞かない。

だが、自分はだれもが作れるようなサービスを作ることには興味がないし、最近ではサーバーサイドの知識等Web屋のような無難な知識も作りつつあるが、やはり中心はグラフィックス関係であり続けるのだと思う。
そんな中、jThreeを見ていると、自分の力が生きる部分なんてのは探せば見つかるし、なければ作ればいいのだとも感じる。興味を持てることをやってた方が生産性高いし、少なくともそれが冒険的なことならば技術力も身につく。

## 価値観なんてほとんど変わらない

アメリカ来て価値観変わったわーとか言ってるやつが良く居る。
僕からすれば全く変わらんし、むしろその価値観が強くなった気がする。住むところ変わったぐらいで価値観変わってたらどんだけ抽象化で来てない価値観なんだよって思ったりもする。

ただ、不思議なことにアメリカに来るとアメリカのことがよくわかるというより日本のことがよくわかるのである。
結局こちらにきても知れることなんて対して大きくはなくて、それよりもよく知っているはずの日本のことへ適用すれば分かる新しいことが大きいという感じである。

そして、最終的に行きつくのは、自分の進歩は常に自分のプログラミングの周りに存在しているということだ。留学してようとしてなかろうとすごく小さな差に今では感じる。


## 終わり

書いてたらさっさとソースコード書きたくなったのでここまで。
僕に3000文字の作文させるより3000コミットのレポジトリを提出させろよということに気が付いた。
諸事情によりライセンスを明らかにしたいので、この文章はCreativeCommons CC-BY-SAにより保護されるものとする。
![image](https://qiita-image-store.s3.amazonaws.com/0/41402/e0abd6a0-b713-8119-d2ce-60b3fc50d6dd.png)
非ascii文字を検出する

glslの中に非ascii文字が隠れててロードできない現象にハマって、非ascii文字を探すためのコマンドメモ。

```
grep -n '[^ -~]' Shaders/*.glsl
```

![スクリーンショット 2015-09-02 1.09.58.png](https://qiita-image-store.s3.amazonaws.com/0/14939/f14e6aea-d803-7469-6eae-5d8baaefb26b.png)

一行目は`BOM`が入ってて、8,9行目は`\t`だった。
Googleフォームに都道府県選択用のドロップダウンリストを加える

Googleドライブのフォーム機能は簡易なアンケートなどに良く使われますが、参加申し込みや会員登録などで住所を入力して欲しいことも多いと思います。

全部手入力でタイプして貰うのはあまりにも不親切なので、都道府県はリストから選択して貰えるようにしたいのですが、フォーム作成画面で47都道府県を追加していくのは手間がかかります。

そんなときは以下のGoogle Apps Scriptで一気に追加できます。

```
function addPrefListItem() {
  var form = FormApp.openById('1234567890ycrn10ve'); // フォームのIDを指定
  var item = form.addListItem();
  item.setTitle('住所１（都道府県）') // フォームの質問のタイトル
  .setChoices([
    item.createChoice('北海道'),
    item.createChoice('青森県'),
    item.createChoice('岩手県'),
    item.createChoice('宮城県'),
    item.createChoice('秋田県'),
    item.createChoice('山形県'),
    item.createChoice('福島県'),
    item.createChoice('茨城県'),
    item.createChoice('栃木県'),
    item.createChoice('群馬県'),
    item.createChoice('埼玉県'),
    item.createChoice('千葉県'),
    item.createChoice('東京都'),
    item.createChoice('神奈川県'),
    item.createChoice('新潟県'),
    item.createChoice('富山県'),
    item.createChoice('石川県'),
    item.createChoice('福井県'),
    item.createChoice('山梨県'),
    item.createChoice('長野県'),
    item.createChoice('岐阜県'),
    item.createChoice('静岡県'),
    item.createChoice('愛知県'),
    item.createChoice('三重県'),
    item.createChoice('滋賀県'),
    item.createChoice('京都府'),
    item.createChoice('大阪府'),
    item.createChoice('兵庫県'),
    item.createChoice('奈良県'),
    item.createChoice('和歌山県'),
    item.createChoice('鳥取県'),
    item.createChoice('島根県'),
    item.createChoice('岡山県'),
    item.createChoice('広島県'),
    item.createChoice('山口県'),
    item.createChoice('徳島県'),
    item.createChoice('香川県'),
    item.createChoice('愛媛県'),
    item.createChoice('高知県'),
    item.createChoice('福岡県'),
    item.createChoice('佐賀県'),
    item.createChoice('長崎県'),
    item.createChoice('熊本県'),
    item.createChoice('大分県'),
    item.createChoice('宮崎県'),
    item.createChoice('鹿児島県'),
    item.createChoice('沖縄県')
  ]);
}
```
これを一度実行すれば、以下のようなリストアイテムがフォームに追加されます。

![スクリーンショット 2015-09-02 6.56.46.png](https://qiita-image-store.s3.amazonaws.com/0/33915/5003fc60-5fa4-42ab-4e59-2d9957e22158.png)
技術英語 > requestor or requester > requester

Unityのソフト実装中に名前付けしようとして requestする機能としてrequestor なのか requester なのか悩んだ。

https://www.englishforums.com/English/RequesterOrRequestor/jcpz/post.htm

> I tried a couple dictionaries and couldn't find "requestor". 

と言っているが、

> However, Merriam-Websters shows both as having the same meaning. In other words, they are interchangeable. 

とのこと。

通常は requester を使えばいいが、requestorでも Merriam-Websters では完全な間違いではないということらしい。

<hr>
この terなのか torなのかははっきりした規則が自分ではわかっていなく、記憶があいまいになりやすい。

http://q.hatena.ne.jp/1150190914
> この使い分けも基本的には語源です。ロマンス系の動詞には -or がつく（actor, conductor, elevator など）のですが，本来なら -er がつくはずの単語にまで -or が使われること（bachelor, sailor など）もあります。

名詞の形が tion になるものは torになる、ということを書いているブログを昔見つけたが、自分のブックマークから検索しても見つけられなかった。
actionの場合はactorになる、という記載だったかと思う。一方で、sionになるものはtorにはならないと。
UbuntuにPython3.4をセットアップ

とりあえず、以下を実行。
sudo apt-get install python3.4

既にインストール済みと出た。。

次はpipをインストール。
sudo apt-get install python-pip

pipのバージョンをチェック。
pip -V
Vは大文字。
出力：pip 1.5.6 from /usr/lib/python2.7/dist-packages (python 2.7)

あれれ、2.7にpipがリンクされた。調べてみたが、python3.4でpipをインストールする方法が分からず。。また今度、試してみよう。
フェルマーの最終定理と互いに素

#はじめに
フライ曲線を考えるときや半安定を考えるときに，フェルマーの最終定理が成り立たないときの自然数 $a,b$ が互いに素であることが必要であった（[詳しくはここ](http://qiita.com/simanezumi1989/items/63e08a935613148ee9d7)）。今回はそのことを示す。

動画で解説もしています：[フェルマーの最終定理と互いに素](https://youtu.be/OJtGsEIjpsQ)
#フェルマーの最終定理
>自然数n≥3に対して

>```math
a^n+b^n=c^n \quad\quad\quad\quad(1)
```
を満たす自然数 $a,b,c$ は存在しない

#共通に割れる数をもたない
フェルマーの最終定理が成り立たないと仮定する。このとき，(1)を満たす自然数 $a,b,c$ について，共通に割れる数をもたないと仮定しても良い（簡単に言えば，最初から割られている状態として良いってこと）。以下これを示す。

※共通に割れる数をもたない例　4,6,5
※共通に割れる数をもつ例　4,6,8
#証明
(1)を満たす $a,b,c$ が共通に割れる数をもつとすると，

```math
{}^\exists p,{}^\exists m_1,{}^\exists m_2,{}^\exists m_3\in \mathbb{N}\quad s.t.\quad a=m_1p, b=m_2p, c=m_3p
```
であり，$m_1,m_2,m_3$ は共通に割れる数をもたないとできる。このとき

```math
(m_1p)^n+(m_2p)^n=(m_3p)^n\\
m_1^n+m_2^n=m_3^n
```
から $m_1,m_2,m_3$ は (1) をみたすので，$m_1,m_2,m_3$ を改めて $a,b,c$ と考えればよい。

#aとbは互いに素
上のことからフェルマーの最終定理が成り立たないとき $a$ と $b$ は互いに素となる。なぜなら，そうでないとすると (1) の形から， $a,b,c$ は共通に割れる数を持ち矛盾するからである。 同様の理由で $a,b,c$ はどの組み合わせも互いに素となる。

したがって，フライ曲線が楕円曲線になることも，半安定になることも示された。
#関連サイト
前の記事：[フライ曲線が半安定である説明](http://qiita.com/simanezumi1989/items/63e08a935613148ee9d7)
次の記事：[フライ曲線が楕円曲線である説明](http://qiita.com/simanezumi1989/items/aabf5cdfce872b622deb)
僕のブログ：[Hello Dream World](http://simanezumi1989.hatenablog.com)
Nutanix Community Meetup #4で発表してきた

#はじめに
またQiitaを単なるBlog的な使い方をしてしまいゴメンナサイという感じなのです。少し時間が空いてしまいましたが，Nutanix Community Meetup #4で「Nutanix Community Edition Multi Node 構成編解説」のお題で発表をしてきましたので，その裏話です。

#発表した資料
![NCM4_SlideTitle.png](https://qiita-image-store.s3.amazonaws.com/0/84474/b23f7a7a-8623-d169-470f-9f30c07e10db.png)
※絵はただの画像で動きません…どうもQiitaはSlideShareの埋め込みリンクは対応してないみたいです

## （スライドはこちら）Nutanix CE 入門 -Multi Node 構成編-
http://www.slideshare.net/detteiu/nutanix-ce-multi-node

#経緯
当初，発表を依頼されていましたが，Nutanix Community Meetup #4の開催日が丁度，仕事の〆切りの2日前と結構な修羅場の時期とぶつかってしまい，当日ギリギリまで参加ができるかわからなかったため，一度は辞退していました。

ただ，Apple Watchももらっちゃったしなーと，一応Qiitaに纏めてある内容をある程度切り貼りして資料だけ作成し，@smzkstsさま，@shmzaさまの両名に確認をしてもらい，その資料は次回以降のどこかで使うか，恐れ多くもNutanix Community Meetup運営の方にその資料を使って当日発表をしてもらう予定でしたが，なんとか業務の都合がつき参加登録をしたところ，どうせなら発表もどうですか？とのことで，結局自分で発表することにしました。

#発表資料作成の裏話
肝心の内容をどう纏めようかとウンウン唸って，出した結論が2つのテーマに基づいた資料を作成することでした。

資料の作成に当たって，お題がNutanix CEのマルチノードクラスターについて，とのことだったので，短絡的にマルチノードクラスターの構築手順をじゅんぐり紹介しようかなーと思いましたが，そうするとスライド2，3枚で終わってしまうほど簡単なのですぐに諦めました。

次にテーマとして思い浮かんだのが，Nutanixのマルチノードクラスターを実際に試した際に感じた，Nuitanixマルチノードのアドバンテージ，良いところについて，と言う切り口です。

その中で，Nutanixのアドバンテージが，具体的にどのようなシステムの挙動，振る舞いによって実現されているかについて，きっとインフラエンジニアなら気になるだろう（思い込み）と決めつけて，その辺についても少し触れることにしました。

Nutanixのアドバンテージとそれを実現するシステムの振る舞いを並列に並べて，発表の2大テーマとして構成する方向で書き始めましたが，ある程度スライドを作り始めたところで，2つを並列に並べた時の違和感が少しあり，スライドの構成に悩みましたが，最終的には，クラスターの構成作業における簡単さ，クラスター構成後のNutanixの耐障害性という部分にフォーカスして資料を作成することにしました。


#反省点
* やはりリハーサルもココロの準備もあまりないまま発表に臨んだため，後半グダグダになった感が否めず，反省の多い発表となりました。

* 自分でも正確に理解しきれていない部分があり，それを当日しゃべりで何とかするのはやはり難しいと言うか，やっちゃダメだなと言うことを改めて痛感した感じです。

* 「発表資料作成の裏話」でも書いたとおり構成に結構悩み，その結果スライドの位置の入れ替えをギリギリまでやっていました。これは文章を又は発表のストーリーを考える際の目次構成の練り込みが甘かったためです。一部，書きたいことの各論だけが先行してしまった部分があり，全体構成として見た時に同じレベルの見出しなのに，あっととこっちでレベル感が合わないと言った問題が当然のごとく出てしまいました。

* Nutanixの挙動や機能を説明する際に，うまいアナロジーでワンワードや1行で誰でもわかるような例えを作れるよう，もう少し考える時間を作ればよかったかなと。

* それから，うまいアナロジーを作れなかった反省点にも絡みますが，SIerに長くいたせいか，どうしても資料に文字を詰め込むクセがあり，伝えたいことに対するノイズも多く，もっと簡潔に纏められるよう精進が必要だと反省です。

* ただ，個人的にせっかく資料に残すなら，印象に残るキーワードや単語だけをスライドに残して当日の発表を見に来てくれた方達のみに分かるものではなく，発表を見ていない人にも分かる資料としたい思いもあり，今回のような資料となっています（言い訳）。

#最後に
発表をする機会をくださったNutanix Community Meetupの運営の方々にこの場を借りて御礼を申し上げると共に，当日発表を聞いて下さった参加者の方々に対して，つたないグダグダの発表のお詫びを伏して申し上げます。

#蛇足
あ，あとApple Watchありがとうございました（笑
![IMG_1149.JPG](https://qiita-image-store.s3.amazonaws.com/0/84474/3b8cdff1-a72a-4ce5-e12f-d807afee0139.jpeg)
ワンライナーでライフゲーム

ターミナルのカーソル位置を移動する方法を知って、ターミナルで動くものを書いてみたくなったのでライフゲームを書いてみました。

ライフゲームの詳細は [Wikipedia](https://ja.wikipedia.org/wiki/ライフゲーム) 参照。
この解説動画も分かりやすくて面白いです！ → [ライフゲームの世界１【複雑系】](http://www.nicovideo.jp/watch/sm19347846)


# コード

```shell-session:lifegame
ruby -e 'h,w=`stty size`.split.map &:to_i;trap 2,:exit;f=h.times.map{w.times.map{rand<0.5}};loop{print f.map{|r|r.map{|e|e ??*:" "}*""}*?\n+"\e[;H";f=h.times.map{|y|w.times.map{|x|n=(-1..1).inject(0){|s,i|s+(-1..1).count{|j| f[(y+i)%h][(x+j)%w]}};f[y][x]??a[n-4]:n==3}};sleep 0.05}'
```

少し見やすくするとこんな感じです。

```rb:lifegame.rb
h,w =`stty size`.split.map &:to_i #ターミナルの行数、列数を取得
trap 2,:exit; # Ctrl + Cしたら終了
f = h.times.map{w.times.map{rand<0.5}} #ターミナルと同じサイズの配列にランダムな真偽値を入れる
loop{
  print f.map{|r|r.map{|e|e ??*:" "}*""}*?\n+"\e[1;1H" #ターミナルに出力して1行目に戻る
  f=h.times.map{|y|
    w.times.map{|x|
      n=(-1..1).inject(0){|s,i|s+(-1..1).count{|j| f[(y+i)%h][(x+j)%w]}} #周囲3×3マスの生存セルの数 (自分を含む)
      f[y][x]??a[n-4]:n==3 #周囲のセルの数によって生死が決まる (生きてたら2つor3つで生存, 死んでたら3つで復活)
    }
  }
  sleep 0.05
}
```

終了はControl + Cです。
Macのターミナルで動作確認しましたが、他では動かないかもしれません。

[普通に書いたライフゲーム](https://gist.github.com/anonymous/894097cbb3ab324896ca) をできる限り短くしたものです。
普通に書いたほうはステータス行を作ってターン数や生存セル数を表示したりしてます。
(ちなみに間違えてgistに匿名で送信してしまったので編集も削除もできません。)

1セルずつ描画する方法もやってみましたが重かったので一気に描画することにしました。

# 追記

配列作成の処理を統一したりして少し縮まりました。

```shell-session:lifegame
ruby -e 'h,w,f=`stty size`.split.map &:to_i;loop{f=h.times.map{|y|w.times.map{|x|next rand<0.5 if !f;n=(a=-1..1).inject(0){|s,i|s+a.count{|j|f[(y+i)%h][(x+j)%w]}};f[y][x]??a[n-4]:n==3}};print f.map{|r|r.map{|e|e ??*:" "}*""}*?\n+"\e[;H";sleep 0.05}'
```

```rb:lifegame.rb
h,w,f=`stty size`.split.map &:to_i
loop{
  f=h.times.map{|y|
    w.times.map{|x|
      next rand<0.5 if !f
      n=(a=-1..1).inject(0){|s,i|s+a.count{|j|f[(y+i)%h][(x+j)%w]}}
      f[y][x]??a[n-4]:n==3
    }
  }
  print f.map{|r|r.map{|e|e ??*:" "}*""}*?\n+"\e[;H"
  sleep 0.05
}
```

# 任意の場所にカーソルを移動する方法
`\e[n;mH`の`n`と`m`の部分を書き換えて出力するとカーソルが移動します。
例えば、`\e[1;2H`で1行目の2列目(2文字目)に移動します。
その後の文字列でカーソル位置の文字列が書き換えられます。

数値は1から始まります。
数値が1未満だったり省略して`\e[;2H`のようになっている場合は1になります。

```rb:文字を書き換えてみるテスト.rb
puts "\e[2J" #画面消去
print "\e[;H" #画面左上に移動

puts "XXX"
puts "XOX ←3秒後に「O」を「X」に書き換えます。"
puts "XXX"

sleep 3

puts "\e[2;2HX" #「O」を「X」に書き換え
puts
```

エスケープシーケンスでもっとめんどくさいことをする場合は`curses`ライブラリを使います。

# 参考
[ANSI escape code - Wikipedia](https://en.wikipedia.org/wiki/ANSI_escape_code)
[ライフゲーム - Wikipedia](https://ja.wikipedia.org/wiki/ライフゲーム)
[curses による端末制御](http://www.kushiro-ct.ac.jp/yanagawa/ex/2-game/01.html)
[ターミナルでゆのっちが降る](http://qiita.com/QUANON/items/953ec4216b55081c885e)
Go言語の練習でTODOコマンドを作ってみた

Go言語をいろいろ調べていてなんとなく分かってきたので、練習にコマンドライン上で動くTODOアプリ作ってみた。

とりあえずなんとなく動くところまで作ったので、一旦やったことをまとめてみる。

#リポジトリ

https://github.com/chooyan/todo

#概要

```
$ todo -m add -t "TODOアプリをQiitaに投稿する" -d "201509021200"
```

とかってやると、2015/09/02 12:00までの予定として、TODOが登録される。
で

```
$ todo
0 	 2015/09/02 12:00 	 TODOアプリをQiitaに投稿する
```

こんな感じでtodoの一覧を確認できる。
そんなコマンドです。

データはJSON形式でtodo.jsonファイルに保存します。

#使ったパッケージ

* flag
    * コマンドライン引数のパース
* os
    * ファイル作成や削除など
* path
    * OSに依存しないパスの指定など
* encoding/json
    * JSONのシリアライズ／デシリアライズ
* bufio
    * ファイル入出力
* time
    * 時刻のフォーマット、パースなど
* fmt
    * おなじみ標準出力
* github.com/kardianos/osext
    * 実行ファイルが置かれているディレクトリを取得する
    * これによって保存ファイルの場所が実行時のディレクトリによって変わってしまわないようにする

#開発環境

ターミナル & vim

#TODO

* コーディング
    * テストコード書く
    * コメントつける
    * エラー処理書く
    * なぜかreader.goにWrite関数を書いてしまったので分ける
    * 変数名等が統一されていないので整理する
    * その他リファクタリング
* 機能
    * Deadlineでソートできるようにする
    * 時刻でフィルターできるようにする
    * 残り時間出せるようにする
    * TODOが完了したらdeleteじゃなくてdoneにして、後から見返せるようにする
* その他
    * readme.md書く

#所感

* よかったこと
    * godocはなかなかターミナル上でも読みやすい。ググるのと併用すると理解が早い。
    * この程度の規模ならvimだけでも快適に開発できる。
    * やっぱり１つのものを作ってみるといろいろと理解が進む。
* よくなかったこと
    * 何も考えずにファイル読み書きしようとすると、実行時のディレクトリによってプログラムが認識するカレントディレクトリが変わってしまってハマる。
    * リファクタリングで使わないパッケージが出ると99%の確率でgo buildするときにimport消し忘れで怒られてげんなりする
* その他
    * そういえばcommandパッケージの説明に、package.goという説明専用の.goファイル作   ったけど、これはアリなんだろうか。
    * ファイル入出力のテストコードどう書くのが良いかな。。。
    * timeパッケージのフォーマットの指定方法が独特すぎて一瞬何を言っているのか分からなかった。

以上。
詳しくは別途話題を絞って投稿します。
Content-Typeにtext/htmlを指定してscriptタグを返してみよう

## はじめに

PlayFrameworkを使って実験してみました。

Content-Typeがtext/htmlとなるレスポンスを返すことができるかどうかを試してみました。

Content-Typeがtext/htmlとなるレスポンスを返すことができれば、scriptタグを返すことができるはずですね。

## 準備

自分の記事ではありますが、結構便利です。

- [PlayFrameworkでCookieを試してみました](http://qiita.com/t-mochizuki/items/6498b040e8daefa5692c)

今回もこれを使います。

## Content-Typeを指定してみよう

こちらの記事を参考にしました。

- [ScalaResults](https://www.playframework.com/documentation/2.4.2/ScalaResults)

asメソッドでContent-Typeを指定します。

OK(...).as(HTML)のようにすると、Content-Typeがtext/htmlになるようです。

#### as(HTML)を指定しない場合

Content-Typeはtext/plainです。

![スクリーンショット 2015-09-01 23.52.38.png](https://qiita-image-store.s3.amazonaws.com/0/29884/d4ca8faa-a8cb-ff62-15e9-01943bbded58.png)

#### as(HTML)を指定した場合

Content-Typeがtext/htmlです。

![スクリーンショット 2015-09-01 23.53.10.png](https://qiita-image-store.s3.amazonaws.com/0/29884/796a7cd4-b07e-5d61-39af-20f84169fdad.png)

## iframeタグで試してみよう

iframeタグはインラインフレームと呼ばれ、現在のページに他のページを埋め込むことができるタグです。

```
HTML の <iframe> 要素 (またはHTML インラインフレーム要素) は、ブラウジングコンテキスト (browsing context) の入れ子を表現し、事実上現在のページに他の HTML ページを埋め込むことができます。
```

[iframe 要素 - HTML | MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Element/iframe)

まず、Webサーバを起動して、Content-Typeがtext/htmlとなるレスポンスを返すように準備しておきます。

次に、iframeでそのレスポンスを取得するページを用意します。

```index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title></title>
</head>
<body>
  <iframe src="http://localhost:9000/" frameborder="0"></iframe>
</body>
</html>
```

このファイルを開くと、Webサーバにリクエストを送信して、レスポンスを受信します。

![スクリーンショット 2015-09-02 0.14.39.png](https://qiita-image-store.s3.amazonaws.com/0/29884/9d484af3-62c3-3f82-ee5f-8e2a18334e77.png)

## scriptタグを返すことができるか

divタグをscriptタグに変えてみます。

```Tokyo.scala
package controllers

import play.api._
import play.api.mvc._

object Tokyo extends Controller {
  def index = Action {
    Ok(s"""<script>alert("('-')");</script>""").as(HTML)
  }
}
```

できました。

## まとめ

Content-Typeがtext/htmlとなるレスポンスを返すことができるかどうかを試してみました。

今回はasメソッドを使ってContent-Typeを指定しました。

また、scriptタグを返すこともできました。

ちょっと理解が深まりました。
技術情報をどこで発信すべきか

最近、技術情報をどこで発信すべきか考えている。

選択肢は次の3つ。

- 個人のブログ
- 会社のブログ
- Qiita


## Qiitaがいいのでは
正直、Qiitaを使った方が書く側も読む側も幸せになるんじゃないか。

### 書く側のメリット
- markdownでかけるし、UI使いやすい。
- ストックで承認欲求が満たされる
- 多くの人に読んでもらえる（ユーザーやタグのフォローができるため）
- なんとなく気軽に書ける（会社のブログに比べて）

### 読む側のメリット
- レイアウトが統一されてて読みやすい（個人や会社のブログだとレイアウトがばらばら）
- ユーザーやタグをフォローして、求める情報を継続的に得られる


## ただ、会社のブランディングを考えると悩ましい・・・
会社としてのブランディングを考えるとQiitaは弱い。Organizationあるけど全然目立たないし。
なので、会社のブログに書いたほうがいいのかなーという気がしてくるんだけど、それって発信者都合で読む側のメリットが考えられてない。


みなさんこのへんどういうふうに考えてるんでしょう？


もうちょっと、QiitaのOrganizationを強化してもらえないですかねえ。
csvファイルをgroovyでJSONに変換する

手元にあるcsvファイルをElasticsearchに[bulkAPI](https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html)で投入したかったので、JSONに変換するgroovyスクリプトを書きました。

意外にも新しい発見もあったのでメモ代わりに残しておきます。

## inputファイル
見出し行がついたCSVファイル(UTF-8)を想定。

```input.csv
event_date_time,name
2015/09/01 01:02:03,田中
2015/09/02 04:05:06,山田
```

## ソース
```Convert.groovy
import groovy.json.JsonBuilder
import groovy.json.StringEscapeUtils

new File("output.json").withWriter("UTF-8") { writer -> 
	new File("input.csv").eachLine("UTF-8", 0){ String line, int number ->
		if(number == 0) return
	
	    def data = line.split(",")
	    def json = new JsonBuilder()
	    json (
	        "index" : [
	                "_index": "index_name",
	                "_type" : "type_name",
	                "_id" : number
	        ],
	            "event_date_time" : data[0],
	            "name" : data[1]
	    )
	    writer.write(StringEscapeUtils.unescapeJavaScript(json.toString()) + "\n")
	}
}
```

## 勉強になったこと(1) firstLineの意味

```java.io.File#eachLine(String charset, int firstLine, Closure c)```のfirstLineですが、2と指定すると1行目を無視して2行目から読み込んでくれるのかと思っていました。

そのため、以下のようなコードを書き、なんで全部出力されるんだろうと？？な状態でした。

```
new File("input.csv").eachLine(2){ String line ->
   ・・・
}
```

よくよくドキュメントを読むと普通に書いてありました。
実はclosureに渡す行番号の初期値とのこと。

> Parameters:
firstLine - the line number value used for the first line (default is 1, set to 0 to start counting from 0)
closure - a closure (arg 1 is line, optional arg 2 is line number)

ファイル操作ではeachWithIndexがないのかと思っていたら、その機能相当のものがeachLineでできたんですね。知らなかった。


## 勉強になったこと(2) JsonBuilderで日本語出力する

```groovy.json.JsonBuilder#toString()``` では日本語はエスケープされた状態で出力されるようです。

エスケープされた文字を元に戻すためには、```groovy.json.StringEscapeUtils#unescapeJavaScript(String str)``` を使ってやればいいようです

***

簡単なスクリプトですがやはり自分で手を動かすと理解も深まります。
WebGLのヘルパー、taiyaki(たいやき)を作りました


素のWebGLだと、どうしても実装が大変だったので自前のヘルパーを作りました。

[dorayaki-kun/taiyaki](https://github.com/dorayaki-kun/taiyaki)


## 使い方

簡単に使い方を列挙していきます。

### 初期化

``` js
var taiyaki = require( 'taiyaki' );
var Context = taiyaki.RenderingContext;

var ctx = new Context( 'canvas' );

```

### シェーダの登録

``` js
var program = ctx.createProgram( [ 'vs', 'fs' ] );
ctx.useProgram( program );
```

### VBOやIBOの登録

``` js
ctx.bindVbos([
  { name: 'positions', value: positions, stride: 3 },
  { name: 'colors',    value: colors,    stride: 4 },
  { name: 'normals',   value: normals,   stride: 3 },
]);

ctx.bindIbo( index );
```

### ユニフォームの登録

``` js
ctx.bindUniforms( [
  { name: 'mvpMatrix',      type: 'matrix4fv', value: mvpMatrix },
  { name: 'invMatrix',      type: 'matrix4fv', value: invMatrix },
  { name: 'lightDirection', type: '3fv',       value: lightDirection },
  { name: 'eyePosition',    type: '3fv',       value: eyePosition },
  { name: 'centerPoint',    type: '3fv',       value: centerPosition },
  { name: 'ambientColor',   type: '4fv',       value: ambientColor },
]);
```

### その他細かいところ

``` js
ctx.clear( { r: 0.3, g: 0.3, b:0.3, a: 1 }, 1.0 );
ctx.viewport( { x: 0, y: 0, width: 512, height: 512 } );
```

## 工夫したところ

なるべく、情報をひとまとまりにできるようにしました。

また、WebGL特有の定数が表に出てこないよう工夫しました。

## 課題

いまのところ、画像テクスチャを作成する機能が未実装です。

※複数画像をテクスチャとして読み込む場合の処理が中々しっくりこず、てこずっています。

こういう実装にするといいよーなど、良いアイデアあればフィードバック頂けると嬉しいです。
omniauth-twitterでTwitterのアクセストークンを取得する

* `Rails 4.2.4`で動作確認
* アクセストークン取得するだけ
    * `device`使わない
    * modelも作らない
* Twitterのアプリケーション登録は適宜ぐぐって

# omniauth-twitterを入れる
```rb:Gemfile
gem 'omniauth-twitter'
```

```shell-session
$ bundle install
```

# API_KEYなどの設定
## アプリケーション登録する
適宜ぐぐる。

*callback url*は、開発時は`http://localhost:3000/auth/twitter/callback`で登録する

## 設定書く
```rb:config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :twitter, ENV['TWITTER_API_KEY'], ENV['TWITTER_API_SECRET']
end
```

ここまで書いてRailsサーバー立ち上げて`http://localhost:3000/auth/twitter`にアクセスするとTwitterのアプリ認証画面に飛ぶ

# Callback設定する
登録した*callback url*に対応するActionを実装する

```rb:config/routes.rb
get 'auth/twitter/callback', to: 'twitter_authentication#callback' 
```

```rb:app/controllers/twitter_authentication_controller.rb
class TwitterAuthenticationController < ApplicationController
  def callback
    omniauth = request.env['omniauth.auth']
    omniauth.credentials.token
    omniauth.credentials.secret
  end
end
```

その他のparameterは[Auth Hash Schema · intridea/omniauth Wiki](https://github.com/intridea/omniauth/wiki/Auth-Hash-Schema)を見る

終わり
DELL DRAC5(コンソールアプリケーション)でのSSLエラーの対処法


## 追記 (2016.2.9)
最近のアップデートにて、セキュリティ強化がされたようです。
Windows / MacOSX ともに共通の箇所を編集する必要があります。

```
# 環境
- Mac
ProductName:	Mac OS X
ProductVersion:	10.11.3
BuildVersion:	15D21

java version "1.8.0_73"

- Windows
Windows 7 Professional

java ビルド1.8.0_71-b15

# 編集項目
jdk.certpath.disabledAlgorithms=MD2, MD5, RSA keySize < 1024
jdk.tls.disabledAlgorithms=SSLv3, RC4, MD5withRSA, DH keySize < 768
```

上記をコメントアウト等で無効化することで利用可能になりました。
(追記終了)

## 経緯

少し古いDELL製のマシンを使う際、万が一sshが接続できなかった時のことを考えて、
DRAC（Dell Remote Access Controller）を設定している。

ただ、普段使用するPCは最新状態の中で、DRAC5のコンソールに接続できない事象が発生した。


![150901-0001.png](https://qiita-image-store.s3.amazonaws.com/0/23370/22c9b42d-52a4-b898-e603-5310c19502ff.png "SSL-ErrorMessage.png")

その解決策を探していたが、今回その対応手段が判明したので、メモとして残しておく。

## 解決法

注意： セキュリティの面で注意が必要な内容です。

```
# 当方環境
- Mac
ProductName:	Mac OS X
ProductVersion:	10.10.5
BuildVersion:	14F27

java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)

- Windows
Windows 7 Professional

java ビルド1.8.0_51-b16
```

今回の問題は利用しているJAVAが"SSLv3"を無効化したことに起因しているよう。

JAVAの"java.security"を編集し、SSLv3を有効化すれば操作ができるようになる。

1. Mac の場合

	`/Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/security` のディレクトリまで移動し、`java.security` ファイルを管理者権限で編集。

	```
	# Example:
	#   jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
	jdk.tls.disabledAlgorithms=SSLv3, RC4, DH keySize < 768
	```

	上記項目があるので、コメントアウト等でSSLv3を有効化して保存。
	再起動を実施すればコンソールに接続できるようになる。

2. Windows の場合

`C:\Program Files (x86)\Java\jre1.8.0_51\lib\security` のディレクトリまで移動し、`java.security` ファイルを管理者権限で編集。

```
# Example:
#   jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
jdk.tls.disabledAlgorithms=SSLv3, RC4, DH keySize < 768
```

上記項目があるので、コメントアウト等でSSLv3を有効化して保存。
保存後、若しくは再起動を実施すればコンソールに接続できるようになる。

## 参考リンク

Dell DRAC 5 - 'Error when reading from SSL socket Connection'
http://www.petenetlive.com/KB/Article/0001062.htm
WordPress 記事IDからカスタムフィールドテンプレートの内容リスト取得

備忘録

get_post_custom_keys()の
パラメータに記事IDを指定すれば、
特定の記事のカスタムフィールドの値のリストを取得できます。


```php:filename
get_post_custom_values($key, $post->ID);

//"page-mainImage"という名前だったら
get_post_custom_values("page-mainImage", $post->ID);
```
Heroku 上で動く Hubot をうまく休ませる


残念ながら、[Heroku の料金プラン変更](https://blog.heroku.com/archives/2015/5/7/new-dyno-types-public-beta#hobby-and-free-dynos) により、Free Plan のままでは Bot を動かし続けることができなくなりました。Sleep しないように、自分自身を起こし続ける hubot-heroku-keepalive(https://github.com/hubot-scripts/hubot-heroku-keepalive) も、早速今回の変更に対応したようなので、設定してみましょう。

### hubot-heroku-keepalive の設定

Free Plan に対応するため、2つの環境変数が追加になっています。

* HUBOT_HEROKU_WAKEUP_TIME
* HUBOT_HEROKU_SLEEP_TIME

この設定により、`HUBOT_HEROKU_WAKEUP_TIME` 〜 `HUBOT_HEROKU_SLEEP_TIME` の間だけ Keep Alive の仕組みが動作することになります。

また、30分何もしていないと Sleep してしまうので、`HUBOT_HEROKU_KEEPALIVE_INTERVAL` を 30分より短くする必要があります。デフォルトが 5分なので、特に問題はないでしょう。

しかし、これだけでは永続的に Hubot を動かすことはできません。hubot-heroku-keepalive には、Sleep した Dyno を起こす方法を持っていません。

今回は、Heroku の Add-on である [Process Scheduler](https://addons.heroku.com/process-scheduler) を利用します。

### Process Scheduler の設定

heroku コマンドでインストール 〜 設定画面を開くところまで行います。

```shell
$ heroku addons:create process-scheduler
Creating process-scheduler-hogehoge... done, (free)
Adding process-scheduler-hogehoge to your-app... done
Setting PROCESS_SCHEDULER_URL and restarting your-app... done, v43
Use `heroku addons:docs process-scheduler` to view documentation.

$ heroku addons:open process-scheduler
Opening process-scheduler (process-scheduler-hogehoge) for your-app... done
```

まず、Heroku の API Key を要求されるので、[Manage Account](https://dashboard.heroku.com/account) で API Key を取得しておきましょう。

注意ポイントは Time Zone の設定です。この設定と Heroku の Time Zone が一致している必要があります。日本時間の場合は、Add-on の設定は、(GMT + 9:00) Tokyo を指定し、Heroku は環境変数に、

* TZ=Asia/Tokyo

と設定しておきましょう。

後は、hubot-heroku-keepalive で設定した時間と Process Scheduler の時間に同じものを設定すれば完了です。