OmniAICreator/Qiita-1.07M huggingface dataset:
MNEMONIC

忘備録

##MNEMONICとは

秘密鍵を
####「人間にも覚えやすいパスフレーズにする」
ということ

Bitcore公式HPを見たら日本語のパスフレーズ化も出来るらしく今回はいじってみた。


####インストール
>npm install bitcore-mnemonic --save

ターミナルからnodeコマンド
>~~$node


----------------------------------------------------------------------------



Mnemonic生成
> var Mnemonic = require('bitcore-mnemonic');
> var code = new Mnemonic(Mnemonic.Words.JAPANESE);

これでcodeと入力すると以下のようなパスフレーズが出てきた。
>\<Mnemonic: きぼう　そうび　しかい　そんちょう　けなみ　がいへき　おじさん　いくじ　こゆう　せたい　しのぶ　げきは\>


一応フレーズを確認
> var valid = Mnemonic.isValid(code.toString());

validと入力とtrueが返ってきた。

Mnemonicパスフレーズがら秘密鍵を確認してみる。
> code.toHDPrivateKey()

以下が返り値
>\<HDPrivateKey: xprv9s21ZrQH143K2Lu3hNH66X6D2SD7URc8MuCwawDAWvMznPamRHi14RWuMzJ8vwLGeiN4yiNLt5BTUboS2MtZSfLUGDH74P3kRPLUeXjtqAq\>

そしたらそれを変数に

> var privateKey = code.toHDPrivateKey()

アドレスはどんなものか

> privateKey.publicKey.toAddress()

返り値
>\<Address: 17NbrPqZuViRwyR3WUNGdVPDrp4VAVLyFh, type: pubkeyhash, network: livenet>
\> 


#■参考

http://qiita.com/you21979@github/items/20391033f74cfa0a16d1
https://bitcore.io/api/mnemonic
PayPal決済画面の[ショッピングサイトに戻る]ボタンに表示するテキストを変更する方法を教えてください。

ウェブ ペイメント スタンダードを使用し、復帰ページが設定されている場合、PayPal会員以外の顧客は、[ショッピングサイトに戻る]リンクをクリックして復帰ページに移動する必要があります。

このリンクの初期設定のテキストは「ショッピングサイトに戻る」ですが、場合によっては、クリックすることでお客さまのECサイトに戻ることを顧客に知らせる最善の方法とは限りません。

ただし、ボタンのテキストを、お客さまの希望するテキスト(60文字までの英数字)に変更できる変数があります。この変数はcbtです。以下に例を示します。

上記の例では、復帰ボタンには、[ショッピングサイトに戻る]というテキストリンクではなく、[ダウンロードに進む]というテキストが表示されます。このコード行を、ECサイトで使用している暗号化されていないPayPalボタンの要素の開始タグと終了タグの間に追加する必要があります。

"cbt"パラメータの詳細は下記のページで"cbt"を検索してご参考ください。
https://developer.paypal.com/docs/classic/paypal-payments-standard/integration-guide/Appx_websitestandard_htmlvariables/

アカウント内でボタンを作成する場合も、この変数を追加できます。PayPalアカウントからボタンを作成する場合は、以下の手順で cbt変数を追加します。
 
PayPalボタンへのcbt変数の追加:
1.	https://www.paypal.com/でご自分のPayPalアカウントにログインします。
2.	[ツール]をクリックします。
-旧バージョンのUIのユーザー: [マイアカウント] > [個人設定] > [販売ツール] > [PayPalボタン]
-新バージョンのUIのユーザー: [マイアカウント] > [プロフィール設定] > [販売ツール] > [PayPalボタン]
3.	[新しいボタンの作成]をクリックするか、一覧から既存のボタンを選択して、[ボタンの編集]を選択します。
4.	ステップ1および2で、ご自分のボタンに適したオプションを入力し、選択します。
注:ステップ2で、コードレベルでボタンをさらにカスタマイズする予定がある場合は、[PayPalにボタンを保存する]オプションの選択を解除し、ボタンのHTMLソースを表示・編集できるようにします
5.	[ステップ 3: 高度な機能をカスタマイズする(オプション)]をクリックします。
6.	[高度な変数]の下の[高度な変数を追加する]をチェックします。
7.	入力フィールドにcbt =と入力し、表示する値を設定します。
8.	[ボタンを作成]をクリックします。

注: cbt変数は、復帰URL(ステップ3で「支払い完了時」 に参照される)の変数がステップ3で設定され、[Auto Return URL within Website Preferences(ウェブサイトの設定内の自動復帰URL)]が使用されていない場合に限り、有効です。

 

上記の手順を完了すると、買い手が支払いを完了した際に、次のステップ、製品のダウンロード、サイト内の領収書ページへの移動などを促すボタンが作成されます。以下はその画面例です。
![484.png](https://qiita-image-store.s3.amazonaws.com/0/124793/c4867d3b-3469-8ec0-4cf7-ec0ee21fa810.png)


<br />

PayPalではテクニカルサポートの部署がありますので、何かPayPal実装関連の質問や技術的な質問がありましたら、下記URLで記事を検索してみてください。
https://jp.paypal-techsupport.com/
上記URLの一番下の「お問い合わせ」リンクをクリックしてまたは下記URLをアクセスして質問を送信してください。
https://jp.paypal-techsupport.com/app/ask
素人の言語処理100本ノック:11


[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/)の挑戦記録です。環境はUbuntu 16.04 LTS ＋ Python 3.5.2 \:\: Anaconda 4.1.1 (64-bit)です。過去のノックの一覧は[こちら](http://qiita.com/segavvy/items/fb50ba8097d59475f760)からどうぞ。

## 第2章: UNIXコマンドの基礎
>hightemp.txtは，日本の最高気温の記録を「都道府県」「地点」「℃」「日」のタブ区切り形式で格納したファイルである．以下の処理を行うプログラムを作成し，hightemp.txtを入力ファイルとして実行せよ．さらに，同様の処理をUNIXコマンドでも実行し，プログラムの実行結果を確認せよ．

###11.タブをスペースに置換
>タブ1文字につきスペース1文字に置換せよ．確認にはsedコマンド，trコマンド，もしくはexpandコマンドを用いよ．


出来上がったコード：

```python:main.py
# coding: utf-8

fname = 'hightemp.txt'
with open(fname) as data_file:
	for line in data_file:
		print(line.replace('\t', ' '), end='')
```

実行結果：

```console:端末
高知県 江川崎 41 2013-08-12
埼玉県 熊谷 40.9 2007-08-16
岐阜県 多治見 40.9 2007-08-16
山形県 山形 40.8 1933-07-25
山梨県 甲府 40.7 2013-08-10
和歌山県 かつらぎ 40.6 1994-08-08
静岡県 天竜 40.6 1994-08-04
山梨県 勝沼 40.5 2013-08-10
埼玉県 越谷 40.4 2007-08-16
群馬県 館林 40.3 2007-08-16
群馬県 上里見 40.3 1998-07-04
愛知県 愛西 40.3 1994-08-05
千葉県 牛久 40.2 2004-07-20
静岡県 佐久間 40.2 2001-07-24
愛媛県 宇和島 40.2 1927-07-22
山形県 酒田 40.1 1978-08-03
岐阜県 美濃 40 2007-08-16
群馬県 前橋 40 2001-07-24
千葉県 茂原 39.9 2013-08-11
埼玉県 鳩山 39.9 1997-07-05
大阪府 豊中 39.9 1994-08-08
山梨県 大月 39.9 1990-07-19
山形県 鶴岡 39.9 1978-08-03
愛知県 名古屋 39.9 1942-08-02
```

UNIXコマンドの確認は、シェルスクリプトで行いました。

```bash:test.sh
#!/bin/sh

# sedのsコマンド： s/検索パターン/置換文字列/g（すべて置換）
sed 's/\t/ /g' hightemp.txt
```

*（2018/02/10追記）*
gimoさんにアドバイスいただきましたので、`tr`コマンドと`expand`コマンドの回答も追加します。

```bash:test2.sh
#!/bin/sh

# trコマンド 
tr '\t' ' ' < hightemp.txt
```

```bash:test3.sh
#!/bin/sh

# expandコマンド
expand --tabs=1 hightemp.txt
```

実行結果：

```console:端末
高知県 江川崎 41 2013-08-12
埼玉県 熊谷 40.9 2007-08-16
岐阜県 多治見 40.9 2007-08-16
山形県 山形 40.8 1933-07-25
山梨県 甲府 40.7 2013-08-10
和歌山県 かつらぎ 40.6 1994-08-08
静岡県 天竜 40.6 1994-08-04
山梨県 勝沼 40.5 2013-08-10
埼玉県 越谷 40.4 2007-08-16
群馬県 館林 40.3 2007-08-16
群馬県 上里見 40.3 1998-07-04
愛知県 愛西 40.3 1994-08-05
千葉県 牛久 40.2 2004-07-20
静岡県 佐久間 40.2 2001-07-24
愛媛県 宇和島 40.2 1927-07-22
山形県 酒田 40.1 1978-08-03
岐阜県 美濃 40 2007-08-16
群馬県 前橋 40 2001-07-24
千葉県 茂原 39.9 2013-08-11
埼玉県 鳩山 39.9 1997-07-05
大阪府 豊中 39.9 1994-08-08
山梨県 大月 39.9 1990-07-19
山形県 鶴岡 39.9 1978-08-03
愛知県 名古屋 39.9 1942-08-02
```

無事、同じ結果になりました。

###ストリームの処理

今回の対象ファイルは小さいので、一気に読んで置換しても良いのかも知れません。ただ、確認に使うコマンドの筆頭に`sed`があげられているので、出題の意図としてはストリーム処理を学んで欲しいのではないかと考えました。そのため、少しずつ読む形で実装しています。

###`sed`コマンド

`sed`コマンドはなかなか複雑で、`man sed`ではさっぱり分からなかったのですが、[wikipediaの解説：sed (コンピュータ)](https://ja.wikipedia.org/wiki/Sed_(コンピュータ))で概要が把握できました。
今回使った`sed`コマンドは検索パターンを正規表現で指定するのですが、タブを示す`¥t`はたまたま正規表現でもそのままなので、正規表現を知らなくても置換できました。正規表現はこのノックの第3章のテーマなので、そこで学んでいきます。


###`tr`コマンド

*（2018/02/10追記）*
`tr`コマンドは2つの文字を指定すれば置換してくれます。対象データは標準入力から与える必要があるので、`<`でリダイレクトしています。詳細は`man`でご確認ください。

###`expand`コマンド

*（2018/02/10追記）*
`expand`コマンドは、タブを空白に変換するものです。既定ではタブの幅を8文字として空白に変換してしまうので、`tabs`オプションでタブの幅を1文字にしています。詳細は`man`でご確認ください。

 
12本目のノックは以上です。誤りなどありましたら、ご指摘いただけますと幸いです。
ID & IT Manegement Conference 2016


雑なメモ。

## クラウド？オンプレ？ID管理

対象は企業。エンタープライズ。

ボトムアップ的な視点での対応方法
今あるシステムの延長線上の話

INTEC

企業内は企業内のID管理製品があるからそれ使う
クラウドはクラウドでIDaaSがあるからそれ使う
そっからそれぞれをつなげる

ムリして合わせようとすると本来やりたいことから遠のく

企業内IDの要件
コンプライアンス

## OPTiM StoreにおけるSCIM & OIDC活用事例

ユースケースの話

License Management
管理者が何かしらインタラクション必要

OpenID ConnectとSCIMのエンタープライズ利用・実装のガイドラインを参考に実装

ユースケースをどう解決するかという視点で言えばSAMLでも同じ。

SCIMとOpenID ConnectのIDをどうマッピングするか
これがEIWGで規定

Dynamic Client Registration

## オープンソースで実現する認証基盤とID管理

Samba4をADの代わりに使ったという事例

オープンソースによるID管理
OpenAM

Stateless Sessions
セッション情報をクライアント側に持たせる
情報をサーバーで持たないことで分散できる。シンクしなくてもいい。

UMA Authorization Server
認可の時にユーザーが管理できる

OpenAMはOpenID Certified通ってる
正式に通ってるのは13から

OSSTechの製品版だとちゃんと色々セキュリティアップデート対応されてる
構築が大変
パートナー支援してる

Unicorn ID Manager
ID管理、連携するための製品
GEM_HOME を指定した時は、PATH も通しておく

# やること
GEM_HOME を指定した時は、PATHも通しておく

~/.bash_profile
```
export PATH="$HOME/.rbenv/bin:$GEM_HOME/bin:$PATH"
```

# 起きた症状

## bundle コマンドがないと言われる
```
$ bundle list
-bash: bundle: command not found
```

## ruby -v と rails の ruby が違うバージョンになる
```
$ ruby -v
ruby 2.3.1p112
```

ちゃんと最新版のrubyなのだが、rails が起動しない。

```
$ rails

    Rails 5 requires Ruby 2.2.2 or newer.

    You're running
      ruby 2.0.0p648 

    Please upgrade to Ruby 2.2.2 or newer to continue.
```
CakePHP3でDebugKitを非表示にする方法

↓CakePHP3での開発においてデバッグに役立つDebugKit
![DebugKit.jpg](https://qiita-image-store.s3.amazonaws.com/0/79512/3c5c87e6-8544-1f42-f385-afbc1c9a3e2f.jpeg)


ですが、本番環境でWebアプリを運用する際にはこの表示を消しておくべきでしょう。
config/bootstrap.php 内の下記の部分を修正することで消えます。

```ruby:
/*
 * Only try to load DebugKit in development mode
 * Debug Kit should not be installed on a production system
 */
if (Configure::read('debug')) {
    Plugin::load('DebugKit', ['bootstrap' => true]);
}
```

↓下記のように修正する。

```ruby:
/*
 * Only try to load DebugKit in development mode
 * Debug Kit should not be installed on a production system
 */
if (Configure::read('debug')) {
    /*本番環境ではfalseにしておく*/
    Plugin::load('DebugKit', ['bootstrap' => false]);
}
```
これで、画面上からDebugKitのアイコンが消えます。
R > データ操作 > ある横軸範囲のデータだけ関数の値に置き換える実装

```txt:動作環境
RStudio 0.99.903 on Windows 7 pro
R version 3.3.1
```

R機能マップ http://qiita.com/7of9/items/0f911bcb95d3a8bbd703

サンプルデータのうち、ある横軸範囲のデータだけ関数の値に置き換えてみる。

```R
> y<-1:30
> f<-function(x) x**2
> y[5:10]<-f(5:10)
> plot(y)
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/45231c6d-7c9a-d11d-6485-ee463de86cce.png)
macでzshでzsh compinit: insecure directoriesの警告が出る問題


macOSをsierraにしてzshを入れ直したらこんな警告がでるようになってしまった

```
zsh compinit: insecure directories, run compaudit for list.
Ignore insecure directories and continue [y] or abort compinit [n]?
```
「ディレクトリが安全でないから，compauditで確認してね」みたいな感じらしい
実行してみると以下のように

```
% compaudit
There are insecure directories:
/usr/local/share/zsh/site-functions
/usr/local/share/zsh
```
なるほど，この２つのディレクトリが安全でないらしい

```
% cd /usr/local/share/zsh
% ls -la
total 0
drwxrwxr-x    6 ayihis  admin    204  9 21 18:28 ./
drwxrwxr-x   14 ayihis  admin    476  9 22 15:29 ../
drwxr-xr-x  982 ayihis  admin  33388  9 21 18:28 functions/
drwxr-xr-x  110 ayihis  admin   3740  9 21 18:28 help/
drwxr-xr-x    3 ayihis  admin    102  9 21 18:28 scripts/
drwxrwxr-x    6 ayihis  admin    204  9 22 15:29 site-functions/
```
とりあえず，site-functionの方の権限を変更してみる

```
% chmod 755 site-functions/     
```
これでターミナルを開き直してみる

```
zsh compinit: insecure directories, run compaudit for list.
Ignore insecure directories and continue [y] or abort compinit [n]? y
%
% compaudit
There are insecure directories:
/usr/local/share/zsh
```
お，減ってるね！
ということで，

```
% chmod 755 /usr/local/share/zsh
```
これで警告消えました．
めでたしめでたし！たぶん！

# 参考

[zsh のセットアップ](http://y-naito.ddo.jp/index.php?id=1095250777)
[How to fix “zsh compinit: insecure directories”?](http://askubuntu.com/questions/802014/how-to-fix-zsh-compinit-insecure-directories/802015)
[[zsh] compinitのセキュリティオプション](http://d.hatena.ne.jp/ywatase/20071103)
Atomのキーボードショートカットメモ

# Atomのショートカットを覚えたい
個人的に覚えたいAtomのショートカットのメモです。
Atomを使いながら随時追加予定。

## Atomメニュー
| 動作 | キー |
|:-:|:-:|
|環境設定|ctrl-comma|
|コマンドパレット|ctrl-shift-p|
|ツリービュー|ctrl-\|

## 編集
| 動作 | キー |
|:-:|:-:|
|行移動   | ctrl-up  |

## 移動
| 動作 | キー |
|:-:|:-:|
|  行移動 |ctrl-G   |

## Packages
### atom-beautify
| 動作  | キー |
|:-:|:-:|
|コード整形|ctrl-alt-b|
### goto-definition
| 動作  | キー |
|:-:|:-:|
|定義元へジャンプ|ctrl-alt-enter|

# 番外編
##コマンドライン
| 動作 | キー |
|:-:|:-:|
|フォルダを開く|atom ./|
R > データ操作 > ノイズの付加 > jitter()

```txt:動作環境
RStudio 0.99.903 on Windows 7 pro
R version 3.3.1
```

R機能マップ http://qiita.com/7of9/items/0f911bcb95d3a8bbd703

サンプルデータを作っているとノイズを足したくなる。

jitter()というのがあるようだ。

参考 https://stat.ethz.ch/R-manual/R-devel/library/base/html/jitter.html

やってみた。

```R
> x<-1:10
> y<-jitter(x, factor=10)
> plot(y)
```

直線データにノイズが足された。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/9626fb8e-e128-ce07-f4c4-1b6f6e4cd2a2.png)

ノイズ付加したデータをlsfit()で見てみた。

```R
> z<-lsfit(1:10,y)
> z
$coefficients
  Intercept           X 
0.006796537 1.038853321 

$residuals
 [1] -1.49509932  0.48895678 -0.42771788  0.04735133
 [5]  1.10582436  1.39600966  0.75062550 -0.98962267
 [9]  0.86836521 -1.74469297

$intercept
[1] TRUE

$qr
$qt
 [1] -18.0897771   9.4358539  -0.1731444   0.3756662
 [5]   1.5078805   1.8718072   1.3001643  -0.3663425
 [9]   1.5653867  -0.9739301

$qr
       Intercept            X
 [1,] -3.1622777 -17.39252713
 [2,]  0.3162278   9.08295106
 [3,]  0.3162278   0.15621147
 [4,]  0.3162278   0.04611510
 [5,]  0.3162278  -0.06398128
 [6,]  0.3162278  -0.17407766
 [7,]  0.3162278  -0.28417403
 [8,]  0.3162278  -0.39427041
 [9,]  0.3162278  -0.50436679
[10,]  0.3162278  -0.61446316

$qraux
[1] 1.316228 1.266308

$rank
[1] 2

$pivot
[1] 1 2

$tol
[1] 1e-07

attr(,"class")
[1] "qr"
```
お風呂掃除をハックする


祝日である今日、子供たちを近所に住んでいる妻の実家に預け、夫婦で思い思いの場所を掃除することにした（自然発生）。

僕は前々からやってみたかった（悲願）、お風呂ピカピカ構想に着手することにした。
かれこれ、今のお風呂ユニットを入れてから8年。これが失敗したら、お風呂のユニット毎かえてやろう。

## 用意するもの
- 重曹
- クエン酸
- キッチンハイター
- お酢
- 片栗粉
- サランラップ
- 愛用のバスクロス

cf. 愛用のバスクロスとは？
毎年、1−2枚は購入している[バスクロス](http://amzn.to/2d3bS1c)で、こいつと水だけで毎日洗っているので大抵の汚れは問題ない。
<br/>
![81gheqy6TbL._SL1500_.jpg](https://qiita-image-store.s3.amazonaws.com/0/4107/5f78741c-3d87-1c86-0689-efda93cbd6bd.jpeg "81gheqy6TbL._SL1500_.jpg")


ただし、今回は午前中の1時間ほどしか使いたくないので、次の週末も含めて工程を数回に分けることにした。

## 攻略 初日

### 排水溝
重曹をふりまき、お酢をたらしシュワシュワさせる。
いまいちコツがつかめず、お酢がドボドボと排水溝に流れていった。
重曹もシュワシュワしてるけど、この酸性の存在は役に立ってんのかな。

### 浴槽
酸性からのアルカリ性で撃退がかっこいいと思い、重曹で全体を洗った後よく洗い流してからアルカリ性でトドメを刺すことにした。
酸性とかアルカリ性とか勉強しないと分からんな。

重曹が残りわずかだったのでダーッと水にいれて溶かしてゴシゴシ、その後、クエン酸も同様にゴシゴシ。

いつもより、ピカピカしている気がする。
物足りないので、今夜はお風呂の湯を捨てずに、重曹をぶっこんで色んなものを漬け置きしてみよう。

と思ったら重曹を使い切ってしまったので、冷蔵庫にあった重曹を奪取した。今夜が楽しみ。

### 鏡
水垢があんましないので、浸けるパターンではなく、クエン酸を水で溶かしで磨いてみた。
もともと、キレイなので違いが分からん。

### 蛇口
最近、顔が映らなくなってきたので、クエン酸を水で溶かしゴシゴシした。
顔が映るようになったので満足した。

### 天井
あまった、クエン酸の水で天井もまんべんなくゴシゴシ。

## 感想
次回は、ゴムパッキンとかをハイター＆片栗粉でペタペタしてやっつけたい。
[WIP]Angular 2 Learning path


自分用のメモです。

指針
http://pc-11106.local:50009/Dash/dsbyaozg/angular.io/docs/js/latest/guide/index.html

## 適当に動かしてみる

5 MIN QUICKSTART
http://pc-11106.local:50009/Dash/dsbyaozg/angular.io/docs/js/latest/quickstart.html

## Angularの全体をつかむ

ARCHITECTURE OVERVIEW
https://angular.io/docs/ts/latest/guide/architecture.html

イマココ
Unity x HTC Vive で The Lab のようなワープを簡単に実装する

Unity x HTC Vive で The Lab みたいに簡単にワープできないかと、色々と模索していたら意外に簡単にできたので忘却録の意味も込めて記事にする。

流れは以下の通り。以下の流れの前に PC で Vive が動作している & [Unity の VR 設定](http://monopocket.net/blog/vr/unity-vr-setting/)ができていることを前提に記述する。完成したサンプルは [https://github.com/tanabee/ViveTeleporter](https://github.com/tanabee/ViveTeleporter) にて入手。

1. SteamVR Plugin を Unity にインポート
2. Hierarchy パネルに CameraRig を配置
3. Main Camera を Deactivate or 削除
4. Laser Pointer と Teleporter を Controller に Add Component

詳細は元記事にて：[Unity x HTC Vive で The Lab のようなワープを簡単に実装する](http://monopocket.net/blog/vr/unity-vive-teleport/)
Unity で VR 端末に対応する

Unity で Oculus や HTC Vive 用のアプリケーションを作成するためには VR 端末に対応する簡単な設定をする必要がある。

Player Settings > Other Settings > Virtual Reality Supported を ON にすれば良いのだが一応スクショも貼って順に説明する。

![Unity のメニューから File > Build Settings を選択](http://res.cloudinary.com/djgriccu9/image/upload/v1474468299/unity-build-settings_b03icm.png)
Unity のメニューから File > Build Settings を選択

![Player Settings を選択](http://res.cloudinary.com/djgriccu9/image/upload/v1474468299/player-settings_sup1cy.png)
Player Settings を選択

![Unity の Inspector が開くので Other Settings を展開](http://res.cloudinary.com/djgriccu9/image/upload/v1474468300/player-settings-inspector_qugvme.png)
Unity の Inspector が開くので Other Settings を展開

![Virtual Reality Supported を ON にする](http://res.cloudinary.com/djgriccu9/image/upload/v1474468300/virtual-reality-supported_qrdjy4.png)
Virtual Reality Supported を ON にする

以上。

元記事：[Unity で VR 端末に対応する](http://monopocket.net/blog/vr/unity-vr-setting/)
R > 関数定義 + plot() > 直線 / ロジスティック曲線

```txt:動作環境
RStudio 0.99.903 on Windows 7 pro
R version 3.3.1
```

R機能マップ http://qiita.com/7of9/items/0f911bcb95d3a8bbd703

参考 http://cse.naro.affrc.go.jp/takezawa/r-tips/r/31.html

関数を作ってそれをplotしてみる。

```R
> f<-function(x) 2*x
> y<-f(1:10)
> plot(y)
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/ef03db75-dded-0c2c-754c-b93168e726c2.png)

ロジスティック曲線が自分が欲しいサンプルデータの形に似ている。
http://www.weblio.jp/content/%E3%83%AD%E3%82%B8%E3%82%B9%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E6%9B%B2%E7%B7%9A

```R
> f<-function(x,a,b,c) a/(1+b*exp(-c*x))
> y<-f(1:100,0.0109069, 0.6005591, 0.1)
> plot(y)
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/5d04aaab-5f08-40b3-0f1f-2ab73a71d637.png)
Grenning > TDDは、急流のなかにひょっこり顔を出した岩を踏み台として、一歩一歩着実に川を渡るようなものだ。

@ テスト駆動開発による組み込みプログラミング by James Grenning
3.9 まとめ

> TDDは、急流のなかにひょっこり顔を出した岩を踏み台として、一歩一歩着実に川を渡るようなものだ。

その反対の方法として以下が紹介されている。

> 一気に川を渡ろうと、助走をつけてジャンプするようなものだ。


以下は、一気に川を渡る方法を繰り返している時の悲哀。

- 最初の頃
  - 「xxさん、すごいですね」(少し尊敬)
  - 失敗の確率高い
- 慣れてきた頃
  - 「xxさん、チーッす」 (あまり見ていない)
  - 失敗の確率高い
- 失敗の確率が高いので、時々失敗した時
  - 「xxさん、どうしたのですか?」（何で失敗しているのですか、という意味)

失敗しにくい方法が選択肢にあれば、そちらを選ぶのが吉かと。
RSpecでGeneratorのテストを書く

`rspec-rails`は、単体ではGeneratorのspecをサポートしていません。そこで、`ammeter`というGemを使用して、Generatorのテストを書くことが出来ます。この`ammeter`は、RSpec自身の内部でGeneratorのテストのために使用されています。
[ammeter](https://github.com/alexrothenberg/ammeter)
[RSpec内部のGeneratorテスト](https://github.com/rspec/rspec-rails/blob/master/spec/generators/rspec/scaffold/scaffold_generator_spec.rb)

# セットアップ
```ruby:Gemfile
group :test do
  gem 'rspec-rails'
  gem 'ammeter'
end
```

```spec/spec_helper.rb
require 'rspec/rails'
require 'ammeter/init'
```

# テスト
例として、以下のようにinitializerとlocaleファイルを生成するintall generatorを自作のGem (my_gem) に実装したとします。

```lib/generators/my_gem/install_generator.rb
require 'rails/generators/base'
require 'securerandom'

module MyGem
  module Generators #:nodoc:
    class InstallGenerator < Rails::Generators::Base
      source_root File.expand_path("../../templates", __FILE__)
      desc "Creates a MyGem initializer and copy locale files to your application."

      # Copies initializer file in application directory
      def copy_initializer
        template "my_gem.rb", "config/initializers/my_gem.rb"
      end

      # Copies locale files in application directory
      def copy_locale
        template "locales/en.yml", "config/locales/my_gem.en.yml"
      end

      # Shows readme to console
      def show_readme
        readme "README" if behavior == :invoke
      end
    end
  end
end
```

このGeneratorに対して、RSpecで以下のようにテストを書くことが出来ます。

```spec/generators/install_generator_spec.rb
require 'generators/my_gem/install_generator'

describe MyGem::Generators::InstallGenerator, type: :generator do

  # Generatorによって生成されるファイルの一時的な置場所を指定します
  destination File.expand_path("../../../tmp", __FILE__)
  before { prepare_destination }

  # 実行時に期待するメソッドが呼び出されているかをテストします
  it 'runs both the initializer and locale tasks' do
    gen = generator
    expect(gen).to receive :copy_initializer
    expect(gen).to receive :copy_locale
    expect(gen).to receive(:readme).and_return(true)
    gen.invoke_all
  end

  describe 'the generated files' do
    # 各ファイルが期待されたとおりに生成されているかをテストします
    before do
      # beforeブロックの中でGeneratorを起動します
      run_generator
    end

    # 生成されたinitializerをテストします
    describe 'the initializer' do
      # 生成された場所とファイル名をテストします
      subject { file('config/initializers/my_gem.rb') }
      it { is_expected.to exist }
      # ファイルの中身をテストします
      # 正規表現の中身は、テンプレートに合わせて変更して下さい
      it { is_expected.to contain(/MyGem.configure do |config|/) }
    end

    # 生成されたlocaleファイルをテストします
    describe 'the locale file' do
      # 生成された場所とファイル名をテストします
      subject { file('config/locales/my_gem.en.yml') }
      it { is_expected.to exist }
      # 正規表現の中身は、テンプレートに合わせて変更して下さい
      it { is_expected.to contain(/en:\n/) }
    end
  end
end
```

テスト内容はコメントの通りです。
Generatorの実装によってテストの内容は変更します。Generatorがオプション引数を取る場合には、contextブロックを定義して、`run_generator`に以下のようにオプションを渡すと便利です。

```spec/generators/install_generator_spec.rb
  context 'with a locale option as jp' do
    before do
      # オプションを渡してGeneratorを起動します
      run_generator %w(--locale jp)
    end

    # 同様にテストを記述します

  end
```
Unity - Visual Studio Codeの環境設定ではまったこと

#目的

UnityでVisual Studio Codeのコード補完効かせてコーディング出来るようにする
既にこういう記事あふれてるけど、C# Extensionsと競合するとエラー出ないのが分からず多少はまったので次回構築用にメモ

#Dependencies

 * Mac OSX El Capitan 10.11.4
 * Unity 5.4.0f3
 * Visual Studio Code v1.5.2 (1.5.2) https://code.visualstudio.com/Download
 * Mono 4.6.0.245

##公式
UnityもMonoもバージョンの移り変わりが早いので、下記で詳しいやり方が書いてあるのでそこを参照した方が確実です(英語)
https://code.visualstudio.com/Docs/runtimes/unity

ここの内容を斜め読みしながら自分がやったことのメモ

#諸々必要なものをインストール

###mono最新

brew install monoでインストールできる

自分の環境の場合

```
curl: (7) Failed to connect to storage.bos.xamarin.com port 80: Operation timed out
Error: Failed to download resource "mono--monolite"
Download failed: http://storage.bos.xamarin.com/mono-dist-4.0.0-release/c1/c1b37f29b1a439acf7ef42a384550ab1dca5295a/monolite-117-latest.tar.gz
```

とエラーが出たので下記から最新をインストール
http://www.mono-project.com/download/
本当はOmniSharpのバージョンによって最新でなくても問題ないです

###UnityのVisual Studio Codeプラグイン
https://github.com/dotBunny/VSCode.git
をダウンロードしてAssets/Plugins/Editor/に配置

Unity > Preferences から``Enable Integration``にチェック
その他はお好みで

###Visual Studio Codeを開いて各プラグインをダウンロード

Visual Studio Code上で
``Ctrl-Shift-P (Windows, Linux) or Cmd-Shift-P (OSX)``
出てきたウィンドウで下記をそれぞれインストール

```
ext install omnisharp
ext install unity-snippets
ext install unity-tools
ext install unity-debug
```

###はまったとこ

OmniSharpだけ入ってMonoのバージョンが合わないとProject開いた時ログでOmnisharpエラーになる
自分の環境だとC# Extensionsが入っていてそれと競合したらしく、全部入れてからVSCode起動しても補完されずOmnisharpも起動してたので、注意

C# Extensionsは、
``ext install csharp``
で入れられるやつ(不要)
公式によると、プロジェクト開く際に

```
Project-csharp.sln
Project.sln
```

と出てきたやつの-csharpついてる方選ぶとアンインストールしなくてもいける？らしい
出てこなかったので試してません

##UnityのプロジェクトをVisual Studio Codeで開く
Unityでプロジェクトを開き、

```
Open C# Project In Code. 
```

でVisual Studio Codeを開く
問題なければIと打つとInputとか出てくるので補完を確認


以上
Travis CI から複数ファイルを GitHub Releases にアップロードする

## Travis CI から GitHub Releases にアップロードする

Go などのコンパイラ言語で書いたソフトウェアを配布する場所として、最近は GitHub Releases を使うことが多いと思います。単純に Git tag と紐付けてファイルをアップロードする場所ですが、手作業でやるのも面倒なので CI と連携させるのが便利です。

Travis CI には [Deployment](https://docs.travis-ci.com/user/deployment) の機能があります。その名の通り、アプリケーションのテスト/ビルド後に、外部の指定した場所へ成果物をデプロイする機能です。デプロイするトリガーとして「特定のブランチ」「git tag がプッシュされた場合のみ」「Go 1.7 ビルドのみ」のような条件が指定できます。

Deployment は、標準で GitHub Releases のインテグレーションを備えています ([GitHub Releases Uploading - Travis CI](https://docs.travis-ci.com/user/deployment/releases/))。GitHub Access Token だけ与えればあとはよしなにアップロードしてくれる便利君ですが、複数ファイルアップロードしたいときに難がありました。

## `file` にアップロード対象のファイルを列挙する

公式ドキュメントで紹介されている方法です。以下は [ec2c](https://github.com/dtan4/ec2c) のバイナリパッケージを12個アップロードする例です。

https://docs.travis-ci.com/user/deployment/releases/#Uploading-Multiple-Files

```yaml:.travis.yml
deploy:
  provider: releases
  skip_cleanup: true
  api_key: $GITHUB_TOKEN
  file: 
    - dist/ec2c-0.1.0-darwin-386.tar.gz
    - dist/ec2c-0.1.0-darwin-386.zip
    - dist/ec2c-0.1.0-darwin-amd64.tar.gz
    - dist/ec2c-0.1.0-darwin-amd64.zip
    - dist/ec2c-0.1.0-linux-386.tar.gz
    - dist/ec2c-0.1.0-linux-386.zip
    - dist/ec2c-0.1.0-linux-amd64.tar.gz
    - dist/ec2c-0.1.0-linux-amd64.zip
    - dist/ec2c-0.1.0-windows-386.tar.gz
    - dist/ec2c-0.1.0-windows-386.zip
    - dist/ec2c-0.1.0-windows-amd64.tar.gz
    - dist/ec2c-0.1.0-windows-amd64.zip
  on:
    tags: true
    go: '1.7'
```

この書き方だと、対象プラットフォームを増やしたときや（バージョン番号含めるなら）バージョンアップのときに毎回 `.travis.yml` を修正する手間が発生して面倒です。対処法として、バージョン番号を含めなかったり [Script deployment](https://docs.travis-ci.com/user/deployment/script/) と [ghr](https://github.com/tcnksm/ghr) を組み合わせてディレクトリ内一括アップロードという方法がありました。

## `file_glob: true` でパターンマッチが使える

実は、`file_glob: true` というフィールドを付け加えることで `file` の値にワイルドカードを用いたパターンを指定することが可能となります。

以下は `dist` ディレクトリ内の tarball と zip archive をすべてアップロードする例です。前のに比べ、えらくシンプルになりました。

```yaml:.travis.yml
deploy:
  provider: releases
  skip_cleanup: true
  api_key: $GITHUB_TOKEN
  file_glob: true
  file: 'dist/*.{tar.gz,zip}'
  on:
    tags: true
    go: '1.7'
```

これだと対象プラットフォームが増えてもバージョンが変わっても安心ですね。

`file_glob` については 2016/09/22 現在公式ドキュメントに書かれていない隠し機能となっていますが、Travis CI Deployment で使っている [dpl](https://github.com/travis-ci/dpl) gem の README にはその存在が記されています。

https://github.com/travis-ci/dpl/tree/db81ca9678428dfb7f3bcc3872d485df35b27d46#github-releases

ソースコードを見ると、`file_glob: true` の時は `file` の値を `Dir.glob` の引数へ渡すようになっています。というわけで、`file` に書くパターンは `Dir.glob` で展開できる形であればよいのです。複雑なパターンを書くときは irb, pry で挙動を確認しましょう。

https://github.com/travis-ci/dpl/blob/db81ca9678428dfb7f3bcc3872d485df35b27d46/lib/dpl/provider/releases.rb#L47-L53

```ruby:lib/dpl/provider/releases.rb
        if options[:file_glob]
          Array(options[:file]).map do |glob|
            Dir.glob(glob)
          end.flatten
        else
          Array(options[:file])
        end
```

## おわりに

`file_glob: true` で必要十分のことができるようになったので。外部ツールに頼らなくて良くなりました。めでたし
c++ builder XE4, 10.2 Tokyo > case文最後のbreakではブレークできない

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/28)
```

Winソフトを実装していて気づいた点。

case文最後のbreakでブレークポイントを設定しても無効になる。

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
static int swithBreakTest(int idx)
{
	switch(idx) {
	case 0:
		OutputDebugString(L"0");
		break;
	case 1:
		OutputDebugString(L"1");
		break;
	case 2:
		OutputDebugString(L"2");
		break;
	}
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
	swithBreakTest(/*idx=*/0);
	swithBreakTest(/*idx=*/1);
	swithBreakTest(/*idx=*/2);
}
//---------------------------------------------------------------------------
```

以下の画像にて緑色のブレークポイントは無効の意味となる。
実際に実行したところ、緑の部分では停止しなかった。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/3992fa0d-b85b-ae27-a890-827685ca85be.png)

MSP430などでは`_bis_SR_register(LPM3_bits + GIE);`の次の行がブレークポイントが取れなかった ([コメント](http://qiita.com/isyk/items/e1eacce4ea0b76fad440#comment-8f2f0938f4fa704f9526) )。
コンパイラの最適化が関係していたと教えていただいたことがあるが、XE4でも同じようなことが起きているのだろうか。
GitのEditorをVSCodeに変更する


普段からVSCodeを使っている分にはGitの操作がVSCode上からできるので、複数行のコミットメッセージを書くことは難しくありません。

もちろんそれがCLIからでも`$ git commit -m "Message"`でコミットメッセージは書けますし、複数行にわたったメッセージも書けますが、どうしても横着して適当に書いてしまいがちです。
-mオプションをカットして`$ git commit`としてやればエディタが起動しますが、デフォルトのnanoはお世辞にも使いづらいのでvimなりemacsなりに変更している方も多いかと思います。

# VSCodeでコミットメッセージを書く

ここで本題。vimやらemacsではなく、起動するエディタをVSCodeにしてみましょう。普段emacs、vimではなくVSCodeを使っているならばCLIからのコミットメッセージでもVSCodeを使いたくなるかもしれません。

`$ git commit`でVSCodeが起動するようにするためのコマンドは非常にかんたんです。

```Bash:
$ git config --global core.editor 'code --wait'
```

`--wait`の部分がキモです。

## オマケ: Atomの場合

Atom上からGitを操作する Git-Plus https://atom.io/packages/git-plus


CLIからAtomを起動してコミットメッセージを書く
> http://blog.atom.io/2014/03/13/git-integration.html

> ```Bash:
$ git config --global core.editor "atom --wait"
```
【macOS 10.12 Sierra】Apple Watchでパスワード自動解除する

##macOS 10.12の新機能
Siriが使えるようになったり、デスクトップをiCloudで同期してくれたり、滅多に使わないファイルをiCloudに退避してくれたりと細かな機能の追加がありますが、いずれも使わない人は使わない感じですね。
iCloud絡みの機能は、ストレージの無料枠を使ってしまうのが勿体無いし...。
ちなみに、Sierraにアップデートすると新機能を使うかどうか確認してくれるので、いつの間にかiCloudの無料枠が...!?ってことはありません。新機能を使うと、どれくらいのファイルサイズになるかも表示されます。

##AppleWatchのユーザだけの便利機能
AppleWatchを持ってる人には、これだけでSierraにアップデートしたくなる機能があります。
「Macがスリープなどでロックされていても、ユーザがパスコード解除されたAppleWatchを使用していれば、自動的にパスワードが解除される」というものです。

##設定方法
システム環境設定から「セキュリティとプライバシー」を選択します。
一般タブにある「Apple WatchでこのMacのロックを解除できるようにする」にチェックをします。
![スクリーンショット 2016-09-22 14.09.53.png](https://qiita-image-store.s3.amazonaws.com/0/70476/94169ccd-3ba9-7f8b-8755-250852093ea4.png)

この機能は、Apple IDの2ファクタ認証（いわゆる２段階認証）が有効になっていないと使用できません。有効にするように促されるので、設定しましょう。

##使用感
Macを開いたときなど、いつもならパスワード入力が求められるタイミングでAppleWatchが「ブルッ」ときます。
その速さは、パスワード入力画面が表示されることなく「ブルッ」た時には、デスクトップが表示されているレベルなので、Sierraを使ってる感をMacを使うたびに感じられます。

##デメリット
今後はもしかしたら、2ファクタ認証が面倒に感じられるかもしれません。
まだ、経験はしてませんが、IDとパスワード以外に、6桁の番号を入力することになるようです。
cloud9で正規表現が使えない場合

## あらまし

3年ぶりくらいに、C++で正規表現を使用したくなってCloud9で環境用意して試してみたらエラーを投げられた。

### テスト方法

[Is this C++11 regex error me or the compiler?](http://stackoverflow.com/questions/8060025/is-this-c11-regex-error-me-or-the-compiler)

```cpp:test.cpp
#include <iostream>
#include <regex>
using namespace std;

int main()
{
    regex r1("S");
    printf("S works.\n");
    regex r2(".");
    printf(". works.\n");
    regex r3(".+");
    printf(".+ works.\n");
    regex r4("[0-9]");//<-ここで「what():  regex_error」とか怒られる
    printf("[0-9] works.\n");
    return 0;
}
```

どうやら、g++が4.8とかだとこうなるらしい。

### 修正方法

[Ubuntu 14.04 に GCC 4.9 をインストールする](http://qiita.com/aKenjiKato/items/e9011e02feb131c4526e)

```shell-session
# PPAの追加
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
# パッケージのインストール
sudo apt-get update
sudo apt-get install g++-4.9
# update-alternatives の導入
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 10
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 20

sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 10
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.9 20

sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 10
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.9 20

sudo rm /usr/bin/cpp
sudo update-alternatives --install /usr/bin/cpp cpp /usr/bin/cpp-4.8 10
sudo update-alternatives --install /usr/bin/cpp cpp /usr/bin/cpp-4.9 20

sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc 30
sudo update-alternatives --set cc /usr/bin/gcc

sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++ 30
sudo update-alternatives --set c++ /usr/bin/g++
```
詳しい所までは調べていないが、とりあえずこれで通るようになった。

### 感想

3年前に手元のMacで動いてたソースが動かないとか、意外とバージョンアップがのんびりしているものなんだな。
機械学習論文読みメモ_4

[The Power of Depth for Feedforward Neural Networks](https://arxiv.org/pdf/1512.03965v4.pdf), arXiv
NNの層数を増やす事は、層の幅を増やす事に比べて指数的により表現力が増大する事を示した。
この事は基本的にすべての活性化関数に対して言う事が出来る。
この事の証明は、従来のブール関数に基づく手法に比べて過程が少なく、異なった手法を用いている。

[NEURAL PROGRAMMER-INTERPRETERS](https://arxiv.org/pdf/1511.06279v4.pdf), ICLR 2016
プログラムを学習し表現および理解できる組み合わせ可能なモデル構造を開発した。
コアモジュールはプログラムを表現するLSTMベースの学習可能なモジュールであり、入力として前回実行されたプログラム情報と環境情報の特徴表現を使う。
これにより次に実行するプログラム、プログラム終了判定フラグを出力する。
またプログラムの表現モデルに関するkey valueを記憶する構造を含んでおり、プログラム再利用も可能にした。

[Deep Successor Reinforcement Learning](https://arxiv.org/pdf/1606.02396.pdf), arXiv
successor representation(SR)に基づくdeep RL手法を提案する。
SRはある状態におけるvalue functionを、状態に対する利得予測関数とsuccessor mapと呼ばれる現在の状態から見て将来ある状態にどれくらいの頻度で遷移するかの期待値関数の２因子へ分解する。
value functionはこれらに関する内積で示される。
Deep SRを学習する事で終盤の急激な利得変化を感度良く学習でき、またsubgoalのようなbottleneck状態を抽出しやすくなる。

[Improved Techniques for Training GANs](https://arxiv.org/pdf/1606.03498v1.pdf), arXiv
GANの学習は非凸かつ連続で高次元なゲームのナッシュ均衡を求める事を要求する。
従来手法はコスト関数の最小化を行うが、これにもとづいてナッシュ均衡を探そうとすると収束しない。
本論では、非収束問題に関するヒューリスティックを利用し、このゲームの収束を推進するいくつかの技術を提案する。
この手法のりようで半教師あり学習と、サンプル生成双方の性能を改善可能である。

[What Learning Systems do Intelligent Agents Need? Complementary Learning Systems Theory Updated](http://www.cell.com/trends/cognitive-sciences/pdf/S1364-6613(16)30043-2.pdf), Trends in Cognitive Sciences 2016
哺乳類の新皮質と海馬の働きに基づくと、知的なエージェントは２つの学習システムを保持していなければならない。
１つ目は、徐々に構造的な知識表現を獲得するシステムである。
２つ目は、個々の経験の詳細について即座に学習するシステムである。
海馬記憶の再生により目的に基づいた経験の重み付けが行われる。
また海馬の繰り返し活性化により知識の一般化をサポートし、新皮質における学習が既知の構造の近いほど高速化される。
このような構造はDQNにおけるexperience replayと関係がある。
また最近の外部メモリを利用したNN構造とも関係が深い
rainloopをubuntu16.04LTS+php7で利用する

自宅サーバで rainloop を ubuntu 12.04LTS な環境で運用していましたが、先日 16.04LTS へバージョンアップした際に動作しなくなりましたので、復旧までの記録です。

#原因
16.04 へバージョンアップする際に php7 を選択し、rainloop の動作に必要な php パッケージがインストールされていませんでした。

#解決方法
以下の記事にある通り、php7 の該当するパッケージをインストールします。
http://linoxide.com/ubuntu-how-to/install-rainloop-webmail-ubuntu-16-04/

各自環境は異なるかと思いますので、適時読み替えてください。
なお、自分の rainloop 環境は apache2+php7 で MySQL や nginx などは用いていないので、以下のような作業となります。

```
root@ubuntu:/var# apt-get install python-software-properties
root@ubuntu:/var# apt install software-properties-common
root@ubuntu:/var# add-apt-repository ppa:ondrej/php
root@ubuntu:/var# apt-get update
root@ubuntu:/var# apt-get install -y php7.0
root@ubuntu:/var# add-apt-repository ppa:ondrej/apache2
root@ubuntu:/var# apt-get install libapache2-mod-php7.0 php7.0-curl php7.0-json
```

インストールが終了したら、以下のように必要な php のモジュールがインストールされていることを確認します。
以下は MySQL を用いていない環境での例なので、ご自身の環境に合わせた内容でご確認ください。

```
root@ubuntu:/var# php -m | egrep -i 'mcrypt|iconv|imap|openssl|pdo|SPL'
iconv
imap
mcrypt
openssl
PDO
SPL
root@ciel:/var#
```

以上
RailsからShift-JISとUTF-8でCSV出力する

#Shift-JISへの文字コード変換
`CSV.generate`を使用してCSVを生成します。例として、`encording`リクエストパラメータに`sjis`が指定された場合にはShift-JISに変換したCSVファイルを出力し、デフォルトではそのままUTF-8で生成したCSVファイルを出力することとします。

```app/models/my_model.rb
require 'csv'

# Convert to CSV
def self.to_csv
  CSV.generate do |csv|
    csv << csv_headers
    all.each do |my_model|
      csv << my_model.csv_column_values
    end
  end
end

# Select headers
# Write as you like
def self.csv_headers
  [
    "タイトル",
    "ユーザ名",
    "作成日時",
    "更新日時"
  ]
end

# Select values
# Write as you like
def csv_column_values
  [
    title,
    username,
    created_at.strftime("%-Y/%-m/%-d %H:%M"),
    updated_at.strftime("%-Y/%-m/%-d %H:%M")
  ]
end
```

```app/controllers/my_model_controller.rb
# Convert special characters to sjis
def sjis_safe(str)
  [
    ["301C", "FF5E"], # wave-dash
    ["2212", "FF0D"], # full-width minus
    ["00A2", "FFE0"], # cent as currency
    ["00A3", "FFE1"], # lb(pound) as currency
    ["00AC", "FFE2"], # not in boolean algebra
    ["2014", "2015"], # hyphen
    ["2016", "2225"], # double vertical lines
  ].inject(str) do |s, (before, after)|
    s.gsub(
      before.to_i(16).chr('UTF-8'),
      after.to_i(16).chr('UTF-8'))
  end
end

# GET /my_models/csv
def csv
  csv_data = MyModel.all.to_csv
  if params[:encording] == 'sjis'
    csv_data = sjis_safe(csv_data).encode(Encoding::SJIS, invalid: :replace, undef: :replace)
  end
  respond_to do |format|
    format.csv {
      send_data csv_data,
      filename: "my_models_#{Date.today.strftime("%Y%m%d")}.csv",
      type: :csv
    }
  end
end
```

#BOM付きUTF-8の出力
ExcelでCSVファイルを開くことが目的であれば、文字コードはUTF-8のままでBOMをつければ開くことが出来ます。`CSV.generate`の引数にBOMの文字列を渡すだけで済むので、よりシンプルになります。

```app/models/my_model.rb
require 'csv'

# Convert to CSV with UTF-8 BOM
def self.to_csv
  bom = %w(EF BB BF).map { |e| e.hex.chr }.join
  CSV.generate(bom) do |csv|
    csv << csv_headers
    all.each do |my_model|
      csv << my_model.csv_column_values
    end
  end
end
```
【macOX 10.12 Sierra】起動ディスクを作成するには

###必要なもの
インターネットに接続でき、HDD空き容量が十分なMac
8GB以上のUSBディスク（その他メディアでも可能かもしれませんが、未確認）

###インストーラをダウンロード
MacのApp Storeアプリから「[macOS Sierra](https://itunes.apple.com/jp/app/macos-sierra/id1127487414?mt=12)」をダウンロードします。
ダウンロードボタンを押すと、アプリケーションフォルダにインストーラがダウンロードされますがサイズは4.77GBもあるので、回線によっては数時間かかるかもしれません。

###インストーラーを中止
ダウンロードが完了すると、自動的にインストーラが起動します。
![スクリーンショット 2016-09-21 17.07.10.png](https://qiita-image-store.s3.amazonaws.com/0/70476/0becd6ff-e5e8-6180-e924-35b15cb7dd32.png)

メニューボタンから、終了してください。
![スクリーンショット 2016-09-21 17.08.24.png](https://qiita-image-store.s3.amazonaws.com/0/70476/99debd00-757b-8e70-00f9-00a392f9907f.png)


###USBディスクを初期化
Macのアプリケーションであるディスクユーティリティを使って、準備したUSBディスクを初期化します。
USBドライブを選択したら「消去タブ」を選択します。
フォーマットするディスクに任意の名前を入力します。
フォーマット形式は、「Mac OS拡張（ジャーナリング）」を選択します。
![スクリーンショット 2016-09-22 13.49.48.png](https://qiita-image-store.s3.amazonaws.com/0/70476/bfa61fc6-43e7-0618-456d-e956f217b52d.png)

ここでは、ディスクの名前を「Recovery Disk」としました。

###ターミナルでディスク作成
ターミナルを起動します。
以下のコマンドを入力します。
長いのでコピー&ペーストが確実でしょう。

```ruby:ターミナルコマンド
sudo /Applications/Install\ macOS\ Sierra.app/Contents/Resources/createinstallmedia --volume /Volumes/Recovery\ Disk --applicationpath /Applications/Install\ macOS\ Sierra.app
```

ターミナルコマンドで、ディスクの名前を指定する箇所があります。
`.../Recovery\ Disk/...`の部分です。
フォーマット時に任意で指定したディスク名に空白（スペース）がある場合は、その直前に「\（バックスラッシュ）」を記述します。

###起動ディスク完成
ターミナルコマンドが正しく実行されると、Macユーザアカウントのパスワードが求められるので、入力します。
ディスク作成にかかる時間は、環境によって左右されます。（およそ30 ~ 60minくらい？）


###インストーラーを削除
ダウンロードしたインストーラーは、アプリケーションフォルダに残っています。
起動ディスクからmacOS10.12にアップデートすると、USBインターフェースのタイプによっては時間がかかるのでアプリケーションフォルダから上書きアップデートしてもいいかもしれません。
上書きアップデートしないなら、Macのディスク容量が勿体無いので削除しておきましょう。
SVGのアニメーション手段とその選び方

## SVGアニメーションの手段

HTMLに組み込んだSVGをアニメーションさせる方法は以下の3つ。

* CSS
* JavaScript
* HTML - SVG element

結論から言うとCSSかJavaScriptのどっちかを使うべき。
**CSSでアニメーションできる範囲ならCSS、それ以上したいならJS。**ブラウザ対応は考慮してない。

## CSS

**CSSからSVGの各プロパティの値を変更する。さわれる属性は限られているがシンプルに実装しやすい。**

制御範囲はSVGのプレゼンテーション属性と呼ばれる属性に限られる。(プレゼンテーション属性一覧: https://www.w3.org/TR/SVG/propidx.html)
正直一覧を見てもピンとこないので以下に例を示す。

### できることの例

* :art:SVGの線や塗りのRGBAを変更する
* :pencil2:線の幅やスタイル(破線とか点線とか)を変える
  * シェイプが筆跡に沿って徐々に現れる的な(https://css-tricks.com/svg-line-animation-works/)
  * ![image](https://cdn.css-tricks.com/wp-content/uploads/2014/02/animate-stroke-full.gif)


### できないことの例

* :black_nib:SVGを構成するパスの制御点の座標を制御
  * 下図のように、点を引っ張って形を変える的な
  * ![image](https://qiita-image-store.s3.amazonaws.com/0/40921/eaeea076-b5dc-5e8d-bc00-85014eac7656.png)


## JavaScript

**SVGを構成するDOM要素をJSで書き換えるのでやりたい放題できる。**
ライブラリもたくさんある。

* [Snap.svg](http://snapsvg.io/)
* [Svg.js](http://svgjs.com/)
* [Greensock](https://greensock.com/)
  * 商用はライセンス料がかかるので注意。

モーフィングみたいなピンポイントな表現のためのライブラリとかもある。

* [SVG-Morpheus](https://alexk111.github.io/SVG-Morpheus/)
* [react-svg-morph](https://github.com/gorangajic/react-svg-morph)
* [Greensock (のmorphingPlugin)](http://greensock.com/morphSVG)

## HTML - SVG element (非推奨) :no_good: 

SVG要素の一つであるanimateタグを使う。
SMIL(Synchronized Multimedia Integration Language)というらしい。
**今後ブラウザがサポートしていくかどうか決定していないので非推奨。**

リファレンス: https://developer.mozilla.org/ja/docs/Web/SVG/Element/animate
サンプルコード: http://codepen.io/chriscoyier/pen/DpFfE

## 備考: SVGかCanvasか

**でかいアニメーションならSVG、パーツが多いならCanvas。**

SVGは描画要素の表示面積が大きくても座標データから画像を生成できるので軽い。
CanvasはDOMツリーを形成しないのでアニメーションの構成要素が増えても軽い。

## 参考記事

* [SVG MANIAX - CSS Nite After dark7](http://www.slideshare.net/ssuser99dc16/svg-maniaxcss-nite-after-dark7-svgmatsuda)
  * SVGの基礎
* [SVGアニメーションの現状](http://postd.cc/the-state-of-svg-animation/)
  * SVGアニメーション
BigQueryで1つのSELECTでJOINとUNION ALLを組み合わすなと言われたときの対処方法

BigQueryで1つのSELECTでJOIN(INなどのsemi-join含む)とUNION ALLを組み合わすと以下のようなエラーが発生します。

>JOIN (including semi-join) and UNION ALL (comma, date range) may not be combined in a single SELECT statement. Either move the UNION ALL to an inner query or the JOIN to an outer query.

## 結論から言うと

素直に対応するとエラーに書いてあるようにUNION ALLをINNER JOINやOUTER JOINに置き換えれば良いのですが面倒です。
ここでエラーに注目してみると1つのSELECTでやっていることで怒られているので、そのままサブクエリで書けば対応できました。

文章で書くと良くわからないと思うので以下に例を書いておきます。

## エラーが発生するクエリ

例えば、2016/9/13に初めてセッションが発生ユーザーで１週間以内に新規登録したユーザーはどのくらいいるのかみたいとします。そうすると以下のようなクエリになるかと思います。
※新規登録はイベントカテゴリがSignUp、イベントアクションがRegisteredとします。

```
SELECT
  fullVisitorId
FROM
  (TABLE_DATE_RANGE([project:xxxxxx.ga_sessions_], TIMESTAMP('20160913'), TIMESTAMP('20160919')))
WHERE
  hits.eventInfo.eventCategory='SignUp'
  AND hits.eventInfo.eventAction='Registered'
  AND fullVisitorId IN (
  SELECT
    fullVisitorId
  FROM
    [project:xxxxxx.ga_sessions_20160913]
  WHERE
    visitNumber=1
  GROUP BY
    fullVisitorId )
```

DATERANGE（UNION ALL）で9/13~9/20に新規登録したユーザーをとってきて、9/13に初回セッションが発生したユーザーをfullVisitorIdでIN（simi-join)しています。

UNION ALL とJOIN(semi-join含む)を組み合わせているため、さきほどのエラーが発生します。

>JOIN (including semi-join) and UNION ALL (comma, date range) may not be combined in a single SELECT statement. Either move the UNION ALL to an inner query or the JOIN to an outer query.

## UNION ALLをJOINに置き換える
エラーで言われているように素直にUNION ALL（DATE_RANGE）をJOINに書き直してみます。

```
SELECT
  a.fullVisitorId AS fullVisitorId
FROM (
  SELECT
    fullVisitorId
  FROM
    (TABLE_DATE_RANGE([project:xxxxxx.ga_sessions_], TIMESTAMP('20160913'), TIMESTAMP('20160920')))
  WHERE
    hits.eventInfo.eventCategory='SignUp'
    AND hits.eventInfo.eventAction='Registered'
  GROUP BY
    fullVisitorId ) AS a
INNER JOIN (
  SELECT
    fullVisitorId
  FROM
    [project:xxxxxx.ga_sessions_20160913]
  WHERE
    visitNumber=1
  GROUP BY
    fullVisitorId ) AS b
ON
  a.fullVisitorId = b.fullVisitorId
```

これでエラーは発生しなくなったのですが、もう少し複雑なクエリになってくると面倒です。

### UNION ALLをサブクエリで書く
1つのSELECTでやっていることで怒られているので、そのままサブクエリで書けば対応できます。
個人的にはこれで対応しています。

```
SELECT
  fullVisitorId
FROM (
  SELECT
    fullVisitorId
  FROM
    (TABLE_DATE_RANGE([project:xxxxxx.ga_sessions_], TIMESTAMP('20160913'), TIMESTAMP('20160920')))
  WHERE
    hits.eventInfo.eventCategory='SignUp'
    AND hits.eventInfo.eventAction='Registered'
  GROUP BY
    fullVisitorId )
WHERE
  fullVisitorId IN (
  SELECT
    fullVisitorId
  FROM
    [project:xxxxxx.ga_sessions_20160913]
  WHERE
    visitNumber=1
  GROUP BY
    fullVisitorId )
```

※どなたかもっと良い方法知っていたら教えてください。
IAMで請求情報は表示できるが請求先は表示できないようにする

# IAMユーザーにも請求情報の表示を許可する

[請求の情報およびツールへのアクセス許可 - AWS 請求情報とコスト管理](https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/grantaccess.html) を参考にルートアカウント認証情報でログインして[アカウント](https://console.aws.amazon.com/billing/home#/account)の"IAM User Access to Billing Information"を有効にします。


# 支払先情報を隠す

IAMユーザーで請求情報を見られるようにした場合、AdministratorAccessポリシーが適用されていると支払先情報までアクセスできてしまいます。
請求金額などは見せたいが支払先情報の表示や変更を許可したくない場合はインラインポリシーで個別にブロックします。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1474516683000",
            "Effect": "Deny",
            "Action": [
                "aws-portal:ModifyAccount",
                "aws-portal:ModifyBilling",
                "aws-portal:ModifyPaymentMethods",
                "aws-portal:ViewAccount",
                "aws-portal:ViewBudget",
                "aws-portal:ViewPaymentMethods"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

AdministratorAccessポリシーだったらポリシールールをIAMユーザーが自分で変更できちゃうよね。というツッコミは無しでお願いします。
それは別途ポリシーでブロックしてください。

# 参考

- [請求の情報およびツールへのアクセス許可 - AWS 請求情報とコスト管理](https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/grantaccess.html)  
- [Billing and Cost Management の権限リファレンス - AWS 請求情報とコスト管理](https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/billing-permissions-ref.html)
vscode javaにはまる

#やりたいこと
単にvscodeでjavaをデバックしたいんだがなんだか動かない

#やったこと
https://k--kato.github.io/vscode-java/#/
に従ってjavacとjavadebugをインストールしてmavenも動かしたんだが
なんだか動かない。

git clone https://github.com/k--kato/vscode-javadebug

も動かないなあ・・
なんでだろ？
このソースはmacなのかなあ？windowsだとだめなのかしらん？

起動を待つのが短いのかしらん？
困った、困った
macOS Catalina (Mojave, High Sierra, Sierra)で日本語入力時に常にスペースを半角に

# コメント(R2/10/6)
Hotな案件なので上に書いています．

Big Surはむり？
`/System/Library/Input Methods/JapaneseIM.app/Contents/PlugIns/JapaneseIM.appex/`が
`/System/Library/Input Methods/JapaneseIM-xxx.app/Contents/PlugIns/JapaneseIM-xxx.appex/`に変更
`JapaneseIM-xxx`は`JapaneseIM-KanaTyping`と`JapaneseIM-RomajiTyping`の2つ．
そしてその中に，そもそも`KeySetting_Default.plist`がない．

あったわ
> /System/Library/PrivateFrameworks/CoreJapaneseEngine.framework/Versions/A/Resources/KeySetting_Default.plist

ただ，これを変更して，目的を達成できるかはわかりません．今後検証します．

新しい認証を無効にした状態でマウントし，変更を加えたら新しいスナップショットを作成する．再起動すると新しいスナップショットから起動され，変更が反映されるが，その時認証が無効になっているとのこと．再度認証を有効にすることはできるのでしょうか？
あと，私の乏しい知識では「新しいスナップショットを作成してそれから起動」がいまいちよくわかっていません．これまでの環境は古いスナップショットとということ？どこかにゴミとして残ったままになるということ？


↓ほんぺ
# Catalinaでの方法

システム環境設定で「Windows風のキー操作」を有効にしている場合は，KeySetting_Default.plistを`KeySetting_Windows.plist`に読み替えてください．

## SIPを外す
`⌘R`を押しながら起動して、ユーティリティからターミナルを起動して、SIPを外します。

```
$ csrutil disable
$ reboot
```

## 再マウント

再度ログインして、
まずシステムをいじれるようにボリュームをマウントします．
[参考 stackexchenge](https://apple.stackexchange.com/questions/371908/how-to-make-root-volume-writeable-again-in-catalina)

```
% sudo mount -uw /
```

## 編集
一応バックアップします．

```
$ cd /System/Library/Input\ Methods/JapaneseIM.app/Contents/PlugIns/JapaneseIM.appex/Contents/Resources/
$ tar czf ~/JapaneseIM_KeySetting.tar.gz KeySetting_*.plist
```

画像のように編集します．

```
$ sudo nano KeySetting_Default.plist
```
編集前の状態なら、Shift+スペースで半角スペースが打てます。
(画像はSierra)
<img width="500" alt="写真.png" src="https://qiita-image-store.s3.amazonaws.com/0/83914/789463d0-1f26-6a66-f706-17551b22bc71.png">

`<string>contextual_space</string>`などと書かれているので，その1行を消して3行書いてください．

```
<string>direct_input</string>
<key>character</key>
<string> </string>
```

打ち終わったら`⌃x`を押して`y`を押して`Enter`で保存できます。

## 後始末
保存したら、

```
$ sudo killall -HUP JapaneseIM
```
を実行することで、もう半角スペースが打てるようになります(Shift+スペースで全角が打てます)。

ちゃんとSIPは戻しておきましょう。
一度電源を消します．`⌘R`を押しながら起動して、ユーティリティからターミナルを起動して、

```
$ csrutil enable
$ reboot
```

# Mojave, High Sierraでの方法

基本的にはCatalinaでの方法と同じです．
ただ，「システムをいじれるようにマウントする」部分が必要ありません．

#Sierraでのやり方
Sierraは`KeySetting_Default.plist`には最初から

```
<string>direct_input</string>
<key>character</key>
<string> </string>
```
のように書かれているので，スペースを直接書き換えるだけで大丈夫です．(上の画像)
それ以外はMojave, High Sierraと同じです．「システムをいじれるようにマウントする」部分も必要ありません．

# El Capitanでの方法
`KeySetting_Default.plist`は
`/System/Library/Input Methods/JapaneseIM.app/Contents/Resources`にありますので，Sierraと同じように変更してください．
Yosemite から Sierra に update した後、制作環境でエラーが出たので対処。

# Yosemite から Sierra に update した後、制作環境でエラーが出たので対処。

Sierra に update したら compass が使えなくなっていたので、その対処をメモしておきます。
El Capitan の対処と同じで良いらしい。

[HomebrewはEl Capitanへアップグレードする前に入れておく](http://qiita.com/riocampos/items/525ec4b35744ad586c5a)
>SIP/rootless の管理範囲内である /System, /bin, /sbin, /usr だとユーザは （ sudo したとしても）作業することが出来ないようです。

## 環境

MacBook Pro (Retina, Late 2013)
Homebrew と nodebrew を使っています。


## compass が使えない。

### 1 Rubyのパスが通っていない

```
Warning: Running "compass:dist" (compass) task
    Warning: You need to have Ruby and Compass installed and in your system PATH for this task to work. More info: https://github.com/gruntjs/grunt-contrib-compass Use --force to continue.
```

**rbenvをインストール**

```:code
% brew install rbenv ruby-build
```

**.zshrc ファイルに環境変数追記**

```:code
[[ -d ~/.rbenv  ]] && \
  export PATH=${HOME}/.rbenv/bin:${PATH} && \
  eval "$(rbenv init -)"
```

**rubyのインストール**

```:code
% rbenv install 2.2.2
% rbenv global 2.2.2
% ruby -v
```

ruby は rbenv で管理するのが良いらしい。

参考にさせていただきました。

[rbenv で ruby の環境を整える](http://qiita.com/ringo/items/4351c6aee70ed6f346c8)

>rbenvを使用している場合、rbenvを使っているならば `/.rbenv/' 以下にインストールされるため、問題なく進むようです。



### ~~2 gem が /usr/bin/に入らない~~

```:code
% sudo gem install sass
```

~~/usr/bin/に入れない~~

```
ERROR: While executing gem ... (Errno::EPERM)
Operation not permitted - /usr/bin/sass
```

~~**install場所の変更**~~

```:code
% sudo gem install -n /usr/local/bin sass
```

~~参考にさせていただきました。~~

[~~OS X 10.11 (El Capitan) でSASSがインストールできない場合の対処法~~](http://qiita.com/zact1/items/13a2cfe982559b799d45)


### 3 zsh で bundle が使えない

```:code
% bundle -v                                                                                                                                                              
```

zshで使えない

```
zsh: command not found: bundle
```

**gem の インストール先を確認**

```:code
% gem environment 
```

**出力されたリストのパスをコピー（EXECUTABLE DIRECTORY のとこ）**

```
- EXECUTABLE DIRECTORY: /Users/{NAME}/.rbenv/versions/2.2.2/bin
```

**~/.zshrc の環境変数を設定する。**

```:code
export PATH=$PATH:/.rbenv/versions/2.2.2/bin
```

**環境変数を反映**

```:code
% source ~/.zshrc  
```

**bunder インストール**

```:code
% gem install bundler
% bundler -v                                                                                                                                                             
Bundler version 1.13.1
% rbenv rehash
```

これで、compass がインストールできるようになりました。


#### こちらも参考にさせていただきました。

[OS X 10.11 El Capitanにアップデートするさいの注意点まとめ。](http://applech2.com/archives/46427630.html)

>　El Capitanへのアップデートで最も懸念されている問題が新たに登場するシステム保護機能（SIP: System Integrity Protection）通称”Rootless“で、これは「特定のディレクトリやアプリにカーネルレベルでロックをかけ、管理者レベル(root)でもアクセスを制限し、マルウェアなどの感染を防ぐ」というもので、　この制限は”rootless.conf“で設定されており、プリインストールされたアプリケーションおよび以下のディレクトリにはrootユーザーでもアクセスできなくなります。
/System
/bin
/usr
/sbin
BOX API 使ってみた

# BOX API利用してみる

OAuthの勉強も兼ねて BOX APIを使ってみる。API利用までのステップは以下の通り

1. ローカルウェブサーバの準備
2. Boxのアカウント登録とアプリケーション登録
3. ユーザーから許可を取得
4. 許可コードからアクセスコード取得
5. アクセスコードを使ってAPI利用


## 1. ローカルウェブサーバの準備

OAuthでは、ユーザからの許可（ブラウザ上で）をもらったあとの許可コードをURLのパラメータに付けて送りつける（リダイレクトする）。このためのURL(ウェブサーバ）を準備。
localhostでOKなので適当なウェブサーバを用意（Python,Ruby , NodeJSなんかで適当に）


## 2. Boxのアカウント登録とアプリケーション登録

- Boxアカウントの登録。下記サイトでアカウントを作成

https://app.box.com/

- 続いてアプリケーションの登録。下記サイトへアクセス。ログインIDは上のステップで作ったもの。

https://developer.box.com/

ログインしたあとに"Create a Box Application"を選んでアプリケーションを定義する。ここでclient_idとclient_secretなるものを取得する。
また、許可コードを取得するためのURLとして、ローカルウェブサーバを指定する。

## 3.ユーザーから許可を取得

ブラウザをつかって下記のURLへアクセスする。

https://account.box.com/api/oauth2/authorize?response_type=code&client_id=XXX&redirect_uri=YYY

XXX  ... 前のステップで取得した client_id
YYY  ... ローカルウェブサーバのURL

許可をもとめる画面が表示される。許可ボタンをおすと 指定したURLへ飛んで行く
（ローカルウェブサーバ）URLへ飛ぶ時にパラメータ(code) がくっついてくる。このcodeの値が許可コードとなる。ということでローカルウェブサーバは、このcodeを画面に表示するなりファイルへ出力するなりする必要がある。

許可コードの有効期間は30秒と短いようです。


## 4. 許可コードからアクセスコード取得
前のステップで取得した許可コードをつかってアクセスコードを取得。
curlだとこんな感じ

curl https://api.box.com/oauth2/token \
-d 'grant_type=authorization_code' \
-d 'code=ZZZ' \
-d 'client_id=XXX' \
-d  'client_secret=WWW' \
-X POST

ZZZ ... ステップ3で取得した許可コード
XXX ... ステップ2で取得したclient_id
WWW ... ステップ2で取得したclient_id


応答としてこんなのが返ってくればOK.


{"access_token":"XXXXXXXXXX","expires_in":3894,"restricted_to":[],"refresh_token":"YYYYYYYYYY","token_type":"bearer"}



## 5. アクセスコードを使ってAPI利用

ステップ4で取得したaccess_tokenの値をAPIに設定して、APIを利用。
ユーザ情報を取得するAPIの場合にはこんなかんじ。

curl "https://api.box.com/2.0/users/me" -H "Authorization: Bearer XXXXXXXXXX"


access_tokenの有効期限は1時間ということなので、1時間経過するまえにrefresh_tokenをつかって アクセスコードをリフレッシュする。


curl https://api.box.com/oauth2/token \
 -d 'grant_type=refresh_token' \
 -d 'refresh_token=YYYYYYYYYY' \
 -d 'client_id=XXX' \
 -d 'client_secret=WWW' \
 -X POST


## 疑問

このやり方だとclient_secretの値を、クライアントプログラムに持たせる必要がありますね。クライアントプログラムをユーザに配っちゃうと、client_secretがバレバレになります。。。。
よいのかな？