OmniAICreator/Qiita-1.07M huggingface dataset:
Node.js v7.6.0がリリースされたのでasync/awaitで遊んでみた

どうも今から数時間前にNode.jsの[v7.6.0がリリース](https://github.com/nodejs/node/commit/bebda6df68c71f233a2ee212b2569ae6e70b48a9)されていたようです。`brew update`したら流れてきたので気付きました。

v7.6.0における変更点はいくつかありますが、一番重要なのはV8のバージョンが5.5に引き上げられたことでしょう。
これは、**デフォルトで（`--harmony`フラグとか無しで）`async/await`構文が使えるようになった**ということを意味しています。

つまりどういうことかというと、↓のツイートを見てみてください。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">node.js v7.6.0がリリースされたのでasync/awaitで遊んでみた <a href="https://t.co/qlOprgb5Vs">pic.twitter.com/qlOprgb5Vs</a></p>&mdash; フリップフラッパーズを語り継いでいけ (@make_now_just) <a href="https://twitter.com/make_now_just/status/834399305985167363">2017年2月22日</a></blockquote>

画像が見難い人向けにテキストでも出しておきます。

```console
$ node
> process.version
'v7.6.0'
> (async () => 1)
[AsyncFunction]
> (async () => console.log(await Promise.resolve(1)))()
Promise { <pending> }
> 1

> .exit
```

`(async () => 1)`で`[AsyncFunction]`という得体の知れないものが返ってきていたり、`console.log(await Promise.resolve(1))`の部分で`Promise`が解決されて、`1`が出力されているのが分かると思います。すごい！

`async/await`構文というのは`Promise`を使いやすくするやつなのですが、詳細については、

  - [Promiseとasync/awaitでJavaScriptの非同期処理をシンプルに記述する](https://sbfl.net/blog/2016/07/13/simplifying-async-code-with-promise-and-async-await/ "Promiseとasync/awaitでJavaScriptの非同期処理をシンプルに記述する")

あたりを参考にしてみてください。

いやぁ、ついにサーバーサイドの開発で`async/await`が使える時代が来ましたね。個人的には、[koaのv2.0.0がいつリリースされるのか](https://github.com/koajs/koa/issues/533)楽しみなところです。
（koaは元々`async/await`がデフォルトで使えるようになったらv2.0.0をリリースすると言っていました。koa v2.0.0はジェネレーターをベースにしたものから`Promise`をベースにしたものへと大きく切り替わったものです。koa v2については[この辺](http://qiita.com/tohashi/items/49e810f961f26bd9ba3f "Koa v1からv2へのアップデート - Qiita")の記事を参考にしてみてください）

あぁ、楽しみだなぁ。

突発的に書いた短い記事ですが、最後まで目を通していただきありがとうございました。
ねこ一覧画面を開く方法 〜 Android7.0 Nougat/EasterEgg/AndroidNeko 〜

# Android7.0のねこあつめ的機能

![neko1.png](https://qiita-image-store.s3.amazonaws.com/0/106533/64b2bed0-07b8-9a4c-2b83-77d14edbc2cb.png)







# ご飯を置いておくとねこがいらっしゃいます

### 4つのご飯から選んでお皿に置いておくと
![neko2.png](https://qiita-image-store.s3.amazonaws.com/0/106533/b4fcf994-142e-f892-fd50-37562124cbdf.png)



#### ↓

### ときどきねこがご飯に釣られてやってきます

![neko3.png](https://qiita-image-store.s3.amazonaws.com/0/106533/fed6fd1f-eee4-b852-9456-3c587e19b32d.png)


# 現れたねこたちはこちらです

### PUSH通知をタップすることで
仲良くなったねこの一覧を見ることができます

![neko4.png](https://qiita-image-store.s3.amazonaws.com/0/106533/be38dc44-9c26-0c5a-626a-2d0273a9e05a.png)


# ねこ一覧画面はねこがご飯食べに来た時の通知をタップした時しか見れない・・・

### 集めたねこを眺めたい時、ねこたちの画面を見るには・・・

![neko4.png](https://qiita-image-store.s3.amazonaws.com/0/106533/be38dc44-9c26-0c5a-626a-2d0273a9e05a.png)

### ランダムでやってくるプッシュ通知からしか開けない作りになっているのです・・・

そこで！

# いつでもねこの一覧画面を開くことができるプログラムを書いてみました
```java
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent i = new Intent();
        i.setComponent(new ComponentName("com.android.egg", "com.android.egg.neko.NekoLand"));
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        try {
            startActivity(i);
            finish();
        } catch (ActivityNotFoundException e) {
            TextView sorryTextView = (TextView)findViewById(R.id.sorryTextView);
            sorryTextView.setText(R.string.no_neko_list);
        }
    }
}

```

### これでいつでもどこでも思う存分ねこを眺めることができます

# 今日はねこの日です

動物の命を大切に。
ねこ一覧画面開くのソースは
https://github.com/nagaoyuriko/androidneko
に置きました。
オフラインリアルタイムどう書くF02 の問題をRubyで解く

問題 : http://nabetani.sakura.ne.jp/hena/ordf02in2rec/
実装リンク集 : http://qiita.com/Nabetani/items/109c31c265be7fa1a36c

10x10しか対応していませんが、せっかく解いたのでアップします。

```ruby:hoge.rb
def calc(src)
  a, b, c = src.split('/').map { |s| s.scan(/\d+/) }.map do |d|
    (d[0]..d[2]).to_a.product((d[1]..d[3]).to_a)
  end
  (a & b).size + (b & c).size + (c & a).size - (a & b & c).size * 3
end

DATA.each do |d|
  n, src, exp, _link = d.split
  act = calc src
  puts %(#{n} #{exp} != #{act}) unless act.to_s == exp
end

__END__
0	5,1-7,9/3,2-8,6/0,5-9,5	15	リンク
1	0,0-9,9/0,0-9,9/0,0-9,9	0	リンク
2	0,0-9,9/0,0-0,9/1,0-9,9	100	リンク
3	2,5-7,6/0,5-7,7/2,0-8,6	0	リンク
4	1,9-4,9/4,9-7,9/0,3-7,4	1	リンク
5	6,1-6,9/5,0-7,4/5,1-7,2	6	リンク
6	4,0-9,8/5,1-6,8/0,2-9,7	28	リンク
7	2,8-8,9/7,9-8,9/8,3-8,9	2	リンク
8	3,3-9,4/0,1-8,4/1,2-8,9	12	リンク
9	2,1-8,3/0,1-3,7/8,3-8,4	7	リンク
10	5,4-6,9/0,0-6,0/5,3-9,8	10	リンク
11	1,1-9,7/1,1-3,8/3,8-7,9	22	リンク
12	2,4-6,7/3,2-7,8/1,0-9,4	24	リンク
13	0,2-1,5/8,1-8,3/1,8-6,8	0	リンク
14	5,2-9,5/9,1-9,2/8,0-8,6	5	リンク
15	5,0-6,4/2,1-6,4/3,8-3,9	8	リンク
16	0,4-6,9/4,1-6,9/7,6-9,7	18	リンク
17	0,0-5,5/0,1-2,8/5,3-9,4	17	リンク
18	0,2-5,6/5,6-8,7/0,1-2,6	16	リンク
19	7,2-8,4/1,0-6,8/1,3-7,6	26	リンク
20	4,3-9,3/0,0-6,5/0,0-4,8	31	リンク
21	3,4-4,6/2,2-4,8/2,0-8,4	11	リンク
22	1,2-6,5/0,5-4,7/2,8-2,9	4	リンク
23	4,1-7,5/2,1-9,9/1,7-2,9	23	リンク
24	1,6-5,6/0,3-5,7/0,2-2,6	13	リンク
25	1,3-3,4/1,4-3,4/9,2-9,9	3	リンク
26	6,3-7,6/2,2-2,3/1,3-9,8	9	リンク
27	2,2-9,7/1,8-9,8/2,2-8,9	49	リンク
28	1,2-6,9/7,6-9,9/4,3-9,9	33	リンク
29	6,0-7,5/0,4-3,8/1,4-5,8	15	リンク
30	2,0-9,7/0,5-3,8/5,1-7,7	27	リンク
31	1,2-8,7/3,1-4,3/2,3-5,8	20	リンク
32	1,0-7,7/0,1-5,4/0,0-2,3	19	リンク
33	2,0-3,7/1,1-3,7/5,3-5,9	14	リンク
34	7,2-9,8/1,0-6,8/0,2-9,9	63	リンク
35	1,1-5,3/0,3-8,7/2,3-8,7	32	リンク
36	3,4-6,6/1,0-9,1/4,0-9,9	21	リンク
37	0,0-4,7/0,5-5,9/0,2-4,5	25	リンク
38	1,1-9,9/2,2-7,4/2,4-7,7	30	リンク
39	3,2-9,9/2,0-6,6/0,5-8,9	36	リンク
40	0,1-8,8/0,5-9,8/2,3-2,4	38	リンク
41	0,0-8,6/4,3-9,9/7,1-9,9	29	リンク
42	0,0-8,8/2,4-9,8/0,1-9,2	53	リンク
```
【第4正規化】業務に必要ないとか言われてるけど簡単だから勉強しようよ【RDB】

正規化は第3以上ではこれが一番簡単でしたのでこの際勉強してみましょう。

**業務上、正規化は第3正規型までで十分である。**

誰が言い出したかしらないこの一文のせいで多数のエンジニアに学習されること無く埃にかぶっている第4正規化ですが、
ついにパンドラの箱を開ける時が来ました。

~~(えらそうなこと言ってますが私もそんな意識の低いエンジニアの一人でした)~~

# どんな時に第4正規化に反するレコードができるの？
一つの関連テーブルを使いまわして
複数の「N:Nのリレーション」を表現すると発生します。

関連テーブルとはN:Nのリレーションを表現するために用意されるテーブルのことです。

例えば2つのN:Nの関連があり

 - コースと参考図書
 - コースと講師

それを下記のような一つのテーブルで表現してしまったとします。

| コース | 参考図書         | 講師          | 
|-----|--------------|-------------| 
| AHA | Silberschatz | John D      | 
| AHA | Nederpelt    | John D      | 
| AHA | Silberschatz | William M   | 
| AHA | Nederpelt    | William M   | 
| AHA | Silberschatz | Christian G | 
| AHA | Nederpelt    | Christian G | 
| OSO | Silberschatz | John D      | 
| OSO | Silberschatz | William M   |

 - コースAHAの関連図書は{Silberschatz,Nederpelt}の2冊です
 - コースAHAの講師は{John D,William M,Christian G}の3人です。

※講師によって参考図書が変わるということは今回は起こりません。学生時代に高額な教材を買わされたことは一旦忘れてください。

この独立した2つのN:Nのリレーションを1つのテーブルで表現してしまったために、
直積集合(AHAの場合、(参考図書2冊)✕(講師3人)=(レコード6件))が現れています。これは明らかに冗長です。
このため、データの整合性を取るためにコースに参考図書を1冊増やすたびに講師の数だけレコードを作らないといけません。

また主キーが

 - コース
 - 参考図書
 - 講師

の3つの組にしかしようが無いので(この3組を指定しないと行を一つに特定できません)
どれかがnullのレコードをつくることができません。

講師が決まっていないコースの参考図書を一旦登録したり、参考図書の無いコースを登録することができなくなります。


# どうすれば第4正規型に正規化できますか？

**独立しているN:Nの関連を個別のテーブルに分解する**

この方法に尽きます

## コースと参考図書

| コース | 参考図書         | 
|-----|--------------| 
| AHA | Silberschatz | 
| AHA | Nederpelt    | 
| OSO | Silberschatz | 

## コースと講師

| コース | 講師          | 
|-----|-------------| 
| AHA | John D      | 
| AHA | William M   | 
| AHA | Christian G | 
| OSO | John D      | 
| OSO | William M   | 



以上で第4正規化はおしまいです。


# 第4正規型のちゃんとした定義

恐らく[Wikipedia](https://ja.wikipedia.org/wiki/関係の正規化#.E7.AC.AC4.E6.AD.A3.E8.A6.8F.E5.BD.A2)と同じ解説になってしまうと思うのでwikipediaを参照してください。

解説にwikipediaと同じテーブルを使っているので
ここまで読んだ人は0から読むより早く理解できると思います

# 参考
SQLアンチパターン(付録の正規化)
達人に学ぶDB設計 徹底指南書
[関係の正規化 - Wikipedia](https://ja.wikipedia.org/wiki/関係の正規化#.E7.AC.AC4.E6.AD.A3.E8.A6.8F.E5.BD.A2)
Circle CI で git の submodule を含めてテストをする

submodule も含めてテストしたい場合、Circle CI の設定ファイルに
submodule の初期化・更新の設定を追記する必要があります。

```yml:circle.yml
checkout:
  post:
    - git submodule init
    - git submodule update
```

## <i class='fa fa-book'></i> 関連資料
* [checkout - Configuring CircleCI](https://circleci.com/docs/configuration/#checkout)
* [penghou620/CircleCI submodule example](https://gist.github.com/penghou620/ee6b8ef70306b90a2711)
ImageにResourcesLoadしたSpriteをセット　メモ

いつも忘れるのでメモ

```
public Sprite[] textures;
textures = Resources.LoadAll<Sprite>("Chara");
```

参考URL：
http://nekosuko.jp/blog/?p=205#comment-27

参考URLより内容貼り付け

Sprite画像を読込む

```
Sprite image = Resources.Load<Sprite> ("Images/enemy/enemy000");
```

と、書くとimageに画像ファイルを読み込むことができます。Resourcesフォルダの中にある画像だけが対象となっているようで、ファイルの拡張子はいらないようです。
型をTexture2DにするとGUIやTextureで使える画像として読込むことができるようです。
もしかしたら同じ要領でいろんなファイルやプレファブも取得できるのかもしれません(まだ試していませんが)。

フォルダごとまとめて読込みたい場合
```
Sprite[] image = Resources.LoadAll<Sprite> ("Images/enemy/");
```

こうすればフォルダ内にある画像をまとめて配列に読み込めるようです。
あとは必要な画像を配列から検索して取り出して使えます。
画像のサムネイルを生成する [Node, GraphicsMagick]

# 今回作るサムネイルのサイズ

490x350とします。長辺が短辺の1.4倍です。うちのデジタル一眼で撮った写真サイズは5184x3456(長辺が短辺の1.5倍)なので、単純にリサイズするだけでなく、端の余分な部分をカットする必要があります。

# 内接リサイズ/外接リサイズ

元画像が横長かつ横の長さが縦の長さの1.4倍以上のときは外接リサイズすることとし、それ以外の場合は内接リサイズすることとします。

外接リサイズ、内接リサイズの違いは以下を参照

http://qiita.com/suin/items/8de26866a8ab6ca65ba4

# コード

nodejsのnpmモジュールである`gm`を使います。

~~~javascript
var gm = require('gm').subClass({imageMagick: true});
var args = process.argv;
gm(args[2])
  .resize(null, '350')
  .borderColor('black')
  .border('245', '245')
  .gravity('Center')
  .crop('490', '350')
  .write('./out.png', function (err) {
    if (!err) console.log(' hooray! ');
  });
~~~

# 結果

- 元画像

![org.jpg](https://qiita-image-store.s3.amazonaws.com/0/80357/a7a1e2c5-35de-1d5c-0591-d6d0f85b2542.jpeg)

↓

- サムネイル

![out.png](https://qiita-image-store.s3.amazonaws.com/0/80357/4c9fbe4d-ea01-58dd-2b00-9637e7f50d86.png)



- 元画像
![IMG_7489.jpg](https://qiita-image-store.s3.amazonaws.com/0/80357/07768b60-bc83-8c55-b66b-398166f5a157.jpeg)


↓


- サムネイル

![out.png](https://qiita-image-store.s3.amazonaws.com/0/80357/9115bb5a-273e-3da5-57b8-122dd4ad8735.png)
matplotlib: 時間軸グラフへのコメント挿入


時間軸グラフへのコメント挿入(`axis.text()`, `axis.annotate()`)は、対象軸では、時間で指定[^1]。

[^1]: 下の例だと、X軸が時間軸



```python:comment.py
import sys
import matplotlib as mpl
mpl.use('Agg')
import matplotlib.pyplot as plt
import matplotlib.dates as dates
from datetime import datetime as dt
import pandas as pd

fig, ax = plt.subplots()
ax.xaxis_date()
ax.set_xlim([dt(2017,1,1),dt(2017,1,14)])
ax.set_ylim([0,100])
ax.grid(True)
ax.text(dt(2017,1,3,12,0), 53, "Datetime")
ax.text(pd.Timestamp("2017-1-5"), 40, "Pandas")
ax.text(736340, 70, "Number") #1

plt.xticks(rotation=45)
fig.subplots_adjust( bottom=0.15, top=0.95,left=0.1, right=0.95)
plt.savefig("comment.png")
```

```shell-session:
$ python comment.py
```

`datetime` でも `pd.Timestamp` でも良さげ。

![comment.png](https://qiita-image-store.s3.amazonaws.com/0/64084/63f56866-7f39-1cf0-187d-292b6e8994c3.png "comment.png")



## 時間軸に用いる数値について

>Matplotlib provides sophisticated date plotting capabilities, standing on the shoulders of python datetime, the add-on modules pytz and dateutil. datetime objects are converted to floating point numbers which represent time in days since 0001-01-01 UTC, plus 1. For example, 0001-01-01, 06:00 is 1.25, not 0.25. The helper functions date2num(), num2date() and drange() are used to facilitate easy conversion to and from datetime and numeric ranges.

[引用元](http://matplotlib.org/api/dates_api.html#module-matplotlib.dates)

だ、そうで。

2016-12-31 00:00:00(UTC) を閏年ふくめ、ざっと計算させてみると、

```shell-session:
$ perl -le '$a += ($_ % 4 == 0 and $_ % 100 == 0 and $_ % 400 != 0 )? 365 : $_ % 4 == 0 ? 366 : 365 for 1 .. 2016  ; print $a'
736329
$ python -c 'import matplotlib.dates as md ; print(md.num2date(736329))'
2016-12-31 00:00:00+00:00 
```
となる。で、上の#1は、2017-01-11 00:00:00+00 を指定したのと同じ事。

時分秒に関しては、小数点以下に[^2]。
[^2]: 9:00:05 だったら、(9 * 60 * 60 + 5)/(24 * 60 * 60)
【参加レポ】TFUG #3

# TFUG #3
TFUG #3に参加しました。
2017/02/22　＠Google（六本木）
https://tfug-tokyo.connpass.com/

メモメモです。


##  Retty
講演者：RettyのCTO
Retty流『2200万ユーザを支える機械学習基盤』の作り方
http://qiita.com/taru0216/items/dda1f9f11397f811e98a

今日は機械学習基盤のDocker部分を話す。
### Rettyの紹介
Rettyトップページ
https://retty.me/

Recommend + Happy = Retty　（創業６年ちょい）
「食を通じて世界中の人々をHappyに」
「人から探せるグルメサービス」
月間利用者数２２００万人。

Rettyトップユーザーズ：ユーザからグルメな人を発掘してレコメンドに利用。
https://retty.me/top-users/

RettyはCGM(consumer generated media)。
利用者が作っていくメディア。


### Rettyで扱うデータ
1. 自然言語：口コミ３００万件
2. 人：行動、ソーシャルグラフ
3. 画像：料理１０００万枚
4. お店：全国８０万店舗（常にアップデートが必要）

DeepLearninig, Word2Vec, LDA, LSI・・・


### 機械学習基盤＠Docker
インフラ：GPU付き自作サーバを全自動ネットブート（Kubernetes + Docker + Tensorflow）
使い方：SSHでログイン
コーディング：PythonユーザはJupyter Notebook
機械学習エンジニアは自分の要件にあったGPUサーバを選んで使う。

DockerはKubernetesで構築管理、OS（Ubuntu）部分はjuju + MaaS。

配備しているCuda Docker、Anaconda Docker、SSH Docker・・・は全て別々に配備されるDockerイメージだが、Fromは同じ（コアDockerイメージを用意し、継承ビルドしている）。
シェルプロンプトにビルドバージョンが出るようにし、Dockerイメージバージョンを明示している。

新しいDockerイメージはKubernetesで全マシンに配布している。
Kubernetes構築はjuju + MaaSで実現している。

ノートPCにも同じ環境を用意した（Ubuntu Desktop）。


### DeepLearningの自然言語処理応用（文字単位CNN）

#### 課題
日本語では単語の切れ目がわからない。
すもももももももものうち　←　どこで切れている？
MeCabはあるが、辞書が必要→未知の単語は対応できない。
Rettyは口語表現（口コミ）→ギャル語とか。


#### 解決策：character-level CNN
文字列のベクトル化（Word2Vec）。しかしWord2Vecは分かち書きが必要。やっぱりMeCab？
文字単位CNN：文字毎にCNNを適用し、単語はNNで見つけさせる。
https://papers.nips.cc/paper/5782-character-level-convolutional-networks-for-text-classification.pdf
http://qiita.com/bokeneko/items/c0f0ce60a998304400c8


## カラフルボード株式会社
http://www.colorful-board.com/

### SENSY
http://sensy.jp/
パーソナルAI。感性を学習する人工知能。
弱いAI（特化型AI）。

#### 適用分野
toC: ファッション、chatbot、グルメ。
toB: toCサービスを応用して企業提供。API。コンサルティング。

#### 機械学習・深層学習事例
ファッション：ユーザのコーディネート
　　各画像の推定スコア（CNN、chainerを利用）
　　→商品企画の方向性、需要予測、MD計画の最適化
　　→今後はtensorflowによる分散学習が必要（速度がでない）
グルメ：お酒の推薦
chatbot：サポート業務のAI化
広告CVR予測：オートエンコーダーで予測回帰モデル
　　入力層１０００次元　→　中間層２００次元　→　出力層１０００次元に戻す。
　　シグモイド関数。

#### Tensorflowのデバッグ
https://www.tensorflow.org/versions/master/how_tos/debugger/


## GMOインターネット
https://www.gmo.jp/

### NNで広告配信ユーザの最適化
Akane：ユーザごとにより適切な広告を配信する。
多層パーセプトロンのNN。
ユーザのWeb行動履歴（とてもスパース）、データ加工（圧縮、Embedding）→機械学習。

Kerasを利用（書くのが簡単）。
https://keras.io/
JuliaでExtreme Learning Machineを書く

# 修正
<span style="color: red;">(2017/5/31) コメントの指摘を受け、行列積(ELM Step2)とタイポ(xとXの間違い)を修正しました。</span>

# 元記事

論文を読んでいたらELM！ELM！と何回も見たのでGoogle検索するとデンソーITラボラトリの技術ブログがヒットしました。

- [Denso IT Laboratory 技術ブログ Extreme Learning Machine](https://tech.d-itlab.co.jp/ml/229/)

実装が簡単と書いてあったので、書いて動作を確認してみました。Juliaは0.4.6、グラフはPyPlot、他には何も使ってないと思います。

```julia
using PyPlot

# 訓練データ
x = -10:0.1:10
N = length(x)
y = sinc(x)
X = [ones(N) x]
M = 2

# 活性化関数
sigmoid(x) = 1 ./ (1 .+ exp(-x))

# 隠れノード数
L = 64

# グラフを描く (訓練データ)
plot(x, y, "r--")
savefig("correct.png")

# ELM STEP1: ランダムに作成
a = rand(L, M)
b = rand(L)

# ELM STEP2: 隠れ層の出力行列Hを生成
H = zeros(N, L)
# for i=1:N, l=1:L
#    H[i, l] = sigmoid( a[l, :]'*x[i,:] + b[l] )[1]
# end
H = sigmoid.(X * a' .+ b')

# ELM STEP3: T=Hβの解を求める
β = pinv(H) * y

# 予測する
y_pred = zeros(N)
for i=1:N
    for l=1:L
        # y_pred[i] += β[l] * sigmoid( a[l, :]' * x[i, :] + b[l] )[1]
        y_pred[i] += β[l] * sigmoid( a[l, :]' * X[i, :] + b[l] )[1]
    end
end

# 予測と正解を重ねて描く
plot(x, y, "r--")
plot(x, y_pred, "b--")
savefig("compare_L=$L.png")

```

隠れ層のノード数Lを64で試すと次のようになりました。だいたい一致してますね（特にコメントがない）。

![compare_L=64.png](https://qiita-image-store.s3.amazonaws.com/0/7181/d208bf0f-b95e-683f-6b0a-90c5cc985e76.png)

Lの数を変えて試したものを2つ載せておきます。
1. $\mathrm{sinc}(x)$
2. $\sin(0.5x + \cos(\sin(x))$

![compare_sinc.png](https://qiita-image-store.s3.amazonaws.com/0/7181/2e380cf0-2fc0-8e77-2a0c-e7f484f0e8ed.png)

![compare_cos_sin.png](https://qiita-image-store.s3.amazonaws.com/0/7181/0876df20-66fd-a17f-44dc-eb9ad79ba527.png)
『Java言語で学ぶデザインパターン(マルチスレッド編)』まとめ(その２)

<img width="300" alt="javathread.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/165994/9d302410-0471-96c1-f097-d46649d17209.jpeg">

#マルチスレッドプログラムの評価基準

##安全性
**安全性**とは、オブジェクトを壊さないこと。壊れるとは、多くの場合は、オブジェクトのフィールドが予想外の値を取ることに相当する。例えば、銀行口座の預金残高がマイナスになったとすると、これは銀行口座を表すオブジェクトが壊れたことになる。複数のスレッドが利用しても安全性が保たれるクラスを**スレッドセーフ**なクラスと呼ぶ。

##生存性
**生存性**とは、必要な処理はひつか必ず行われること。安全性と生存性は相反する要求になる場合ある。その典型が**デッドロック**。これは複数のスレッドが、相手のロック解放を互いに待ってしまう状況。

##再利用性
**再利用性**とは、クラスを再利用できること。マルチスレッドプログラミングでは、スレッドの排他制御の仕組みや方針をうまくクラスの中に隠ぺいすれば、再利用性の高いプログラムになる。

##パフォーマンス
**パフォーマンス**とはあ、処理を高速・大量に行えること。**スループット**は、単位時間あたりの処理数。**応答性**は要求を出してから反応が返るまでの時間。応答性が高いことを**待ち時間(latency)**が短いと呼ぶこともある。**キャパシティ**は同時に処理できる数。

##評価基準のまとめ
安全性と生存性を守るのは必須。これを満たした上で、いかにして再利用性とパフォーマンスを上げるかが重要。


#Javaのスレッドの優先度

###Javaの優先度は実行処理系を特定しないと役に立たない

- 全てのJavaの実行処理系に共通して規定されていることはほとんどない。
- そのため実行処理系(JVMの実装、バージョン、OS)を特定しない限り優先度は役に立たない。
- ある実行処理系では、高い優先度を持つスレッドが低い優先度を持つスレッドよりも長いCPU時間を割り当てるかもしれないし、もっと高い優先度を持つスレッドが全てのCPU時間を使うかもしれない。
- スレッドのスケジューリングのアルゴリズムも規定されていない。

###優先度を表すクラスフィールド
- Thread.MIN_PRIORITY
- Thread.NORM_PRIORITY
- Thread.MAX_PRIORITY

###優先度を設定/取得するメソッド
Threadクラスのインスタンスメソッド
setPriorityで優先度を設定
getPriorityで優先度を取得する


---
関連
[『Java言語で学ぶデザインパターン(マルチスレッド編)』まとめ(その１)](http://qiita.com/yoshi-yoshi/items/83ecc4476904fa144577)
非公開GETAPIの是非を他社事例から考える

以前ネイティブアプリ用のRailsAPIを作成したときに感じた素朴な疑問があり、他社さんの事例から少し勉強させて頂きました。疑問というのはログイン不要で取得できるGETAPIについての下記のようなもの。

- 非公開APIをブラウザ直打ちでみれるのってどうなんだろう？
- アプリ以外からはAPIにアクセスさせないことってできるのだろうか？
- 認証が使えないけど、根本的な対策はあるのだろうか？

ちなみに僕が作っていたのがニュースアプリだったので今回はG社、U社、S社さんについて調べさせて頂きました。サービスの特定に繋がる部分は伏せ字にしてあるのでご了承下さい。

# 事前準備
[mitmproxy](http://qiita.com/hkurokawa/items/9034274cc1b9e1405c68)という自分のPCとネイティブアプリを同ネットワーク上に置くことでproxyサーバーのように経由することができる便利なツールがあったのでそれを利用してます。
ネイティブアプリ→mitmproxy実行中PC→外部サーバーという具合に接続してHttpRequestの解析を行います。
詳細設定は上記リンクからよろしくお願いします。

# 事例

## G社
テレビコマーシャルを頻繁に出していて有名なあのアプリです。

GETAPIは下記。
https://hoge/articles/2/18/article_22647051.json?updated_at=1487410380

![image](https://qiita-image-store.s3.amazonaws.com/0/56262/371d4859-d275-5825-959a-3a5ca1967535.png)

ブラウザで叩くことができました。
誰でも見れるデータについては秘匿性は特に重要視しないということでしょうか。

## U社
ビジネスマン向けのニュースアプリを出しているU社です、記事のクオリティが高くて好きです。

GETAPIは下記。
https://hoge/summaries/news?theme=technology
![image](https://qiita-image-store.s3.amazonaws.com/0/56262/96ad2edb-470a-5f8c-138a-61ef08a96508.png)

見れました。

## S社
３社の中だと１番大衆向け？なアプリのS社です、僕のまわりにも使っている人が沢山います。
しばらくrequestのログを眺めていたんですが、それらしいGETRequestが見つからなかったです。

ですが、よくよく眺めてみたらありました。
POST https://hoge/api/v2/refresh

なるほどGETじゃなくてPOSTでデータを取得してるんですね、たしかにこれはブラウザではデータの取得が行えない、下記のようなPOSTRequestをCurlで叩くとデータの取得が行えました。

```
curl -X POST 
-H "Accept: application/json" 
-H "User-Agent:　hoge" 
-H "Content-Type: application/x-www-form-urlencoded" 
-d "version: hoge" 
-d "timestamp: 1487399400948" 
-d "filters: twitter" 
-d "deviceToken: hoge" 
-d "countryCode=jp" -d "locale=ja_jp" 
-d "edition: ja_JP" 
-d "unselectedChannelIdentifiers: cr_ja_twitter,cr_ja_apps_ios_all" 
-d "language: ja" 
-d "since: 1487394760864" 
-d "timezone: Asia/Tokyo" 
-d "channelIdentifiers: cr_ja_entertainment,cr_ja_sports,cr_ja_column,cr_ja_humor,cr_ja_national,cr_ja_politics,cr_ja_economy,cr_ja_technology,cr_ja_international,cr_ja_vid
eo,cr_ja_food,cr_ja_extra_animal,cr_ja_column_family,cr_ja_extra_manga,cr_ja_column_career,cr_ja_column_living,cr_ja_entertainment_animation,cr_ja_column_love" 
-d "until: 1487399400947" 
https://hoge/api/v2/refresh
```

POSTRequestを送る以外にも送信データにUser-AgentやdeviceTokenなどをもたせ秘匿性をあげているようです。

# まとめ
非公開GETAPIの是非を考えてみました、３社ではありますが他社事例を調べたことで以下のような感想を抱きました。

## GETAPIのセキュリティ対策は難しい

queryでパラメータを持たせるくらいしか策がないなという印象です。それでも普通にブラウザから叩けちゃいますね。

## 必ずしもRESTである必要はない

RailsのようなRESTを強く意識したフレームワークを使っているとGETやPOSTの役割を過剰に意識しすぎます、凝り固まらずにその時々最適な方法を取りたいと思いました。

## GETとPOSTの違いはデータ送信量とその秘匿性

上の話に近いですが本来はGETとPOSTはデータを送信するという意味では役割は同じです、そしてデータ送信量やその秘匿性の意味合いではPOSTのほうがメリットは大きいと思います。GETはブラウザを介さないアプリであれば使わなくてもいいかなと思いました。

## 親切なエラー文言は良いヒントになるから本当は気をつけたほうがいい

これは解析側に回って初めて感じたことなんですが、不正なRequestがAPI側に送られるとBadRequestのような例外文言が返ってくるのですが、この文言が丁寧すぎると解析側に良いヒントを与えることになるなと思いました。開発者側にとってはありがたいんですけど。POSTでデータ取得をしていたS社さんは基本的にエラー文言はERRORとしか返ってこなく、考えて実装しているんだろうなと感動を覚えました。

以上非公開GETAPIについて考察してみました、
しっかり調べたつもりですがもしも解析対象のAPIが非公開でなく公開だったらすみません。
それでは！
マウスクリックでカメラを回転・リセット


ポジションは変わらずに、その場所を中心にカメラを回転させる

GameObjectの中にカメラを配置
以下のスクリプトでGameObject自体を回転させる

```c:CameraAxis.cs
using UnityEngine;
using System.Collections;

public class CameraAxis : MonoBehaviour
{
    public float fRotateSpeed = 10.0f;

    void Update()
    {
        // 左
        bool canRotateLeft = Input.GetMouseButton(0);
        // 右
        bool canRotateRight = Input.GetMouseButton(1);
        // 中
        bool canResetPos = Input.GetMouseButton(2);

        if (canRotateLeft)
        {
            // 移動量 
            float fValue = fRotateSpeed * Time.deltaTime;
            // 回転 
            transform.Rotate(0, -fValue, 0, Space.World);
        }
        if (canRotateRight)
        {
            float fValue = fRotateSpeed * Time.deltaTime;
            transform.Rotate(0, fValue, 0, Space.World);
        }
        if (canResetPos)
        {
            transform.localRotation = Quaternion.identity;
        }
    }
}
```

> 参考
[079 GameObjectを中心にカメラを回転させる](http://stepism.sakura.ne.jp/unity/wiki/doku.php?id=wiki:unity:tips:079)
[Unityでマウス入力を扱う](http://tasogare-games.hatenablog.jp/entry/20150607/1433680283)
[Unityメモ – Transformにリセット処理を追加してみる](https://ookumaneko.wordpress.com/2015/10/01/unity%E3%83%A1%E3%83%A2-transform%E3%81%AB%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E5%87%A6%E7%90%86%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B/)
Twitterリツイートに関するJSONについてまとめる

# 目的
　Twitterの**1つ1つのツイートはJSONで構成されて**おり、TwitterAPIへのアクセス時には、応答として返ってきたJSONをパースして内容を読みます。
　開発者がJSONの各フィールド(変数)の意味を理解しておかなければ、**「そのツイートがリツイートされたものなのか、普通のツイートなのか？」などを判定する際に、誤った状態として認識してしまう**ことに繋がります。

　本記事の目的は、**リツイートに関するフィールドについてまとめ、自分への備忘録を残すことおよび情報共有を行うこと**とします。

# 結論
　目的で述べた**「そのツイートがリツイートであるか？」を判定する**ためには、**"retweeted_status"のフィールドの有無**を調べれば良いです。

```js
if (tweet.retweeted_status) {
  console.log(tweet.text + "はリツイートです")
  console.log(tweet.retweeted_status.text + "が原文です")
} else {
  console.log(tweet.text + "はリツイートではありません")
}
```


　リツイートに関連するフィールドと説明をまとめたものを下表に示します。

|No. |フィールド |説明|
|:--|:--------|:--|
|1. |retweeted|**そのツイートがリツイートされたかどうか**を示す。<br>**リツイートであるかどうかではない**ことに注意。|
|2. |retweet_count|**そのツイートが何回リツイートされたか**を示す。|
|3. |retweeted_status|**そのツイートがリツイートである場合のみ存在するフィールド。**<br>よって**「そのツイートがリツイートであるかどうか」はこのフィールドの有無を判定すれば良い。**<br>中身はリツイート元のオリジナルのツイート。|
|4. |quoted_status|**そのツイートが引用リツイートである場合のみ存在するフィールド。**<br>中身は引用元のオリジナルのツイート。|
|5. |quoted_status_id<br>quoted_status_id_str|そのツイートが引用リツイートである場合のみ存在するフィールド。<br>引用元のオリジナルのツイートのIDを表す。(4と同じ)|

# 所見
* **「そのツイートがリツイートかどうかを調べる」**にあたって、以前使っていた[Twitter4J](http://twitter4j.org/ja/index.html)では、Statusインターフェースに["isRetweet()"](http://twitter4j.org/javadoc/twitter4j/Status.html#isRetweet--)メソッドがあり、をbooleanで返してくれるようになっていた。
* 今回Node.jsでTwitter APIを利用することとなり、使用モジュール（Twit.js）には上に該当するメソッドが無かった。どのフィールドだったっけ？　となった経緯がある。こうしてまとめられて良かった。

# 参考
*1. [Twitter Developer Documentation: "Tweets"](https://dev.twitter.com/overview/api/tweets)
2. [Twitter Developer Documentation: "POST statuses/retweet/:id"](https://dev.twitter.com/rest/reference/post/statuses/retweet/%3Aid)
3. [Twitter開発者ドキュメント 日本語訳: "オブジェクト内のEntities"](http://westplain.sakuraweb.com/translate/twitter/API-Overview/Entities-in-Objects.cgi)*
Crowi をローカルで動かす (Mac OS X 10.11)

Heroku などを使わず、最小限の設定で、ローカルで直接起動。

## 必要ソフトのインストール

- Node.js (4.x)
    - 今回は 4.8.0 を使用した
- MongoDB
    - Homebrew でインストールした

## Crowi のインストール

```
% git clone https://github.com/crowi/crowi.git
% cd crowi/
% npm install
```

## 起動

```
% PASSWORD_SEED=20170222crowitest MONGO_URI=mongodb://localhost/crowi node app.js
```

デフォルトのポートは 3000 番。`PASSWORD_SEED` は任意の文字列。画像アップロードを有効にするには、`FILE_UPLOAD=local` をつけて起動する (or デフォルトではアップロード先が AWS になっているので、管理画面で AWS を設定する)。

## 参考

- [GitHub - crowi/crowi: Crowi - Wiki](https://github.com/crowi/crowi)
- [Mac に MongoDBをインストール - Qiita](http://qiita.com/morizyun/items/b9f7d8f79803d80e9a21)
アセンブラをgdbで取り扱う

# アセンブラ(.s)に対して-gを付ける。

``` bash

$ cat foo.c

#include <stdio.h>
int main(void){
  printf("Hello!\n");
  return 0;
}

$ gcc -S foo.c 
$ gcc -g foo.s
$ ./a.out 
Hello!

```

あとはいつものようにgdbを起動。
gdbで"i r"でレジスタの値が見れるんだっけかな。
toto・BIGの件の擬似乱数関連のメモ

totoBIGで超低い確率の現象が起きた件に関連して調べたことの記録。

自分でtotoBIGのようなものを実装すと考える。ハードウェア乱数は持ってないし信頼性に関する情報も持ってないので、擬似乱数での実装を考える。

安全に擬似乱数を使うには、

・優れた擬似乱数生成アルゴリズムを
・シードに高品質な乱数で
・十分な量で初期化する

ことが必要。

調べた結果、

```ruby:toto_big.rb
p 14.times.map{rand(3)}
```

これだけでもかなり、安全な実装になる。



## 優れた擬似乱数アルゴリズム

http://www001.upp.so-net.ne.jp/isaku/rand.html

このサイトが素晴らしい。やはりメルセンヌツイスターが最強。RubyはMTなのでこの点は問題なし。

https://ja.wikipedia.org/wiki/メルセンヌ・ツイスタ
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/faq.html
https://github.com/ruby/ruby/blob/trunk/random.c

## シードにする乱数
最近のOSは/dev/randomのように乱数を提供する仕組みを持ってるのでこれを使う。

Linuxの乱数インターフェースについては下記が詳しい。
http://man7.org/linux/man-pages/man7/random.7.html

/dev/randomと/dev/urandomについての参考。
http://news.mynavi.jp/news/2014/03/11/037/

Rubyではこれらを使ってrand用にシードを与えてる。

https://bugs.ruby-lang.org/projects/ruby-trunk/repository/revisions/57384
https://github.com/ruby/ruby/blob/trunk/random.c

## 十分な量のシード
さっきの
http://man7.org/linux/man-pages/man7/random.7.html
によると、暗号的な用途では、256bit与えれば十分であるように読める。

Rubyの場合、random.cにDEFAULT_SEED_CNTが4と定義されてて、これは32bit*4の意味になる。よって128bitがシードとして与えられ、この部分に関しては十分であるかの判断がつきかねる。とはいえ2**128の状態を持ちうると考えると早々問題は起きにくそうではある。

ここが不満であれば以下のようにして、Random.raw_seed(もしくはurandom)を使ってより大きな数字をシードにできる。

```ruby:more_seeds.rb
seed = Random.raw_seed(256).unpack("H*") #trunkだとRandom.urandom(256)
srand(seed)
```

## シードを初回化するタイミングに関して

シードが高品質であれば、どんなタイミングで何回初期化しようとも問題はないはず。
低品質、もしくは乱数ではないようなシードは生成器を使いまわした方がマシ。

## その他
メルセンヌツイスターは
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/faq.html
にあるように、十分な出力からはその後の出力が予測できる。
適切に初期化しなおか、CSPRNG
https://ja.wikipedia.org/wiki/暗号論的擬似乱数生成器
の利用が必要。
WP-CLI で PHP Notice:  Undefined index: HTTP_HOST と出てしまう時の対処法


環境変数 `$_SERVER['HTTP_HOST']` を使用しているプラグインをインストールした時に WP-CLI コマンドを使用すると以下のように警告がでることがあります。

```
Notice: Undefined index: HTTP_HOST in ... on line ...
```

こういう時のベストプラクティスは以下のように `wp-config.php` に記述しなさいと WP-CLI のリードのダニエルさんに教えてもらいました。

```
if ( defined( 'WP_CLI' ) && WP_CLI && ! isset( $_SERVER['HTTP_HOST'] ) ) {
	$_SERVER['HTTP_HOST'] = 'example.com';
}
```

`example.com` は、実際のホスト名に置き換えてください。

ミソは `defined( 'WP_CLI' ) && WP_CLI` という値で条件分岐をいれることです。 

要は WP-CLI とかプラグインでこの値を適当に定義するといろいろ問題があるようなので、実際に想定される値を入れなさいと。そりゃそうですね。

たぶん他の環境変数も同様でしょう。
Deferredの状態保持？

#Deferredの状態保持

```javascript
//状態保持
// 高速でクリックされても、１秒ごとにしかappend()を実行しない
var prevState = new $.Deferred().resolve().promise();

function asyncFuncDef(){
  var deferred = new $.Deferred();
  setTimeout(function(){
    deferred.resolve();
  },1000);
  return deferred.promise();
}
$(document).on('click',function(){
  //最初はappend()が直ぐ実行される
  //asyncFuncDefの結果がprevStateに代入される（１秒立つまでpending）
  //もう一回クリックされたらasyncFuncDefの状態を見る
  //状態がresolveだとthen()が実行される
  //何回も素早くクリックされると、then()が押した分だけキューされる
  //resolveが帰ってきたらキューされたものが一個ずつ実行される
  prevState = prevState.then(function(){
    $('body').append('<p>hoge</p>');
    return asyncFuncDef();
  });
});
```

コメントは私が追記したものです。
Deferredの状態保持って紹介されてたけど、いまいち流れがつかめない。
素早くクリックされた場合は、代入が実行されずにthen()がキューされて、キューされたものがそれぞれresolve待ちになる。resolveに成ったらasyncFuncDef()の結果（１秒立つまでpendeing）が、prevSateに代入されて、次にキューされてるものがresolveを待つ。。。っていう流れであってるのかな？

動きは以下で確認してください！
<p data-height="290" data-theme-id="dark" data-slug-hash="PpYGZj" data-default-tab="js,result" data-user="sakamoto-ryouta" data-embed-version="2" data-pen-title="PpYGZj" data-preview="true" class="codepen">See the Pen <a href="http://codepen.io/sakamoto-ryouta/pen/PpYGZj/">PpYGZj</a> by 坂本龍太 (<a href="http://codepen.io/sakamoto-ryouta">@sakamoto-ryouta</a>) on <a href="http://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>



スパゲッティな文章ですね！
あってるか教えてくださいすごい人！！
Line Botの話

## 概要
最近友達とLINE Botを作ったのでその話をします
実際に作る過程を通してわかったLINE Botでできることできないこと

##作ったもの
リマインドBot「リマさん」
友達とのトークに入れとけば「明日の17時に新宿集合ね！」とかやるとリマインドを設定してくれる。
友達追加はココから🙏
[![https://gyazo.com/8390f3559c7632c926030518af9cb8cd](https://i.gyazo.com/8390f3559c7632c926030518af9cb8cd.png)](https://gyazo.com/8390f3559c7632c926030518af9cb8cd)

## PV動画も作ったよ
[Bot詳細はここ](https://rima-san.herokuapp.com/)
[Youtubeにあがってます](https://www.youtube.com/watch?v=4w7IwoGe7Lo)

## 開発する前に思ってたこと
SSL対応しないと動かないからマジデバック辛そう🙄

- 全然そんなことなかった🙆


ユーザーの入力方法が自然言語とボタンくらいしかない🤔

- まあなんとかなる


## SSL対応しないと動かないからマジデバック辛そう🙄
ローカル環境をhttpsとして外部に簡単に公開できるappがあったのでそれを使った

- [qiita ngrokを使用してローカル環境を外部に公開する](http://qiita.com/kitaro729/items/44214f9f81d3ebda58bd)

今回はサーバーサイドをRailsで作ったのでこんな感じのことをするだけでhttpsのlocal開発環境が整う


```bash:bash
$ brew install ngrok
$ ngrok http 3000
```


## ユーザーの入力方法が自然言語とボタンくらいしかない🤔
ImageMapを使えば変な入力インターフェイスとかは作れる

- 画像の赤の位置をタップしたらhogehogeみたいなことができるのでボタンの拡張版みたいなことはできる。
- シャレオツな画像ボタンは作れるけど、チェックボックスみたいなことはできなかった

[![https://gyazo.com/30c1014c32870dcee9487854897050b0](https://i.gyazo.com/30c1014c32870dcee9487854897050b0.png)](https://gyazo.com/30c1014c32870dcee9487854897050b0)


## 開発してみて困ったこと🤔

- 個人の特定ができない
- グループの人数が分からない
- アクセス元のIPが分からない
- ページを持たないの辛い

## 個人の特定ができない🤔
- Lineでは発言者個人を特定することができない
- 開発側からはAグループに所属しているhogeさんとBグループに所属しているhogeさんが同一人物だということが分からない
- 今回User毎に自分が関連しているすべてのグループのリマインドを一度に見れるようにしたかったが、個人が特定できなかったのでできなかった。

## グループの人数が分からない🤔

- LINEにはUser・Talk・Groupの3つのソースタイプが存在するのだが、Talk・Groupに何人所属しているのか分からない
- 期日までにグループ全員の投票がなければリマインドみたいなことをしようと思ったが、所属人数がわからないので結局出来なかった。

## アクセス元のIPが分からない🤔
- アクセス元のIPから大体の生活区域を予測して、リマインドするときに天気予報をするというのを実装したかったのだができなかった
- アクセスは全てwebhookで来るので位置情報は明示的に入力してもらわなければならなかった

## ページ持たないのマジ辛い🤔
- 対話形式で何かをしようと思ったときにサーバー側でシーン
管理みたいなことをしなければならないのが辛い

- シーン1
 	「お店探したい！」
  「場所はどんなお店をお探しですか？」
- シーン2
 	「おしゃれな店がいいなぁ」
  「このようなお店はいかがでしょう」
- シーン3
 	「もっと近い店がいい」
  「こちらのお見せはいかがでしょうか」
- シーン４
 	「やっぱりおしゃれじゃなくていいから近くて安いとこが良い」
  「こちらのお見せはいかがでしょうか」

普段だったらこういうシーン毎にフォームとかページとか分けられるけど、常に同じurlに文字列が送られてくるだけなので、いい感じにこれらのシーンを管理しなければならない。

## 感想🎉
- ドキュメントがとても充実していて、とっかかりやすい
- ページ持たないのはマジ辛い
- webも混ぜたらいい感じになった
- LineでできることはLine
- 複雑なことやりたければWeb
- Botだからwebを使ってはいけないということは無いと思う
- LINE的には嫌だろうけど()

## 最後に🙏

- 僕ができないと思ってるけど実はできることあったらごめんなさい
- 友達追加お願いします

[![https://gyazo.com/8390f3559c7632c926030518af9cb8cd](https://i.gyazo.com/8390f3559c7632c926030518af9cb8cd.png)](https://gyazo.com/8390f3559c7632c926030518af9cb8cd)
Googleスプレッドシートを用いて、Backlogへ課題を一括登録する場合に注意すべき点

# Backlogへ課題を一括登録することはできません

現在（2017年2月）のところ、課題をBacklogへ一括登録することができません。
課題を大量に登録しなければならない場合、どうすればよいのでしょう。
手作業で行うのは大変です。

調べてみますと、「Backlog への要望・問題の報告」に、Googleスプレッドシート経由で登録する提案が掲載されています。

http://feedback.backlog.jp/forums/140671-backlog-%E3%81%B8%E3%81%AE%E8%A6%81%E6%9C%9B-%E5%95%8F%E9%A1%8C%E3%81%AE%E5%A0%B1%E5%91%8A/suggestions/2519887-%E8%AA%B2%E9%A1%8C%E3%82%92%E4%B8%80%E6%8B%AC%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89
より引用

```
利用初期において課題を一括でアップロードできる、もしくは利用途中でも一括登録できる機能がほしい
```

```
以下をご利用頂くとGoogleドキュメント（スプレッドシート）を基に、Backlogへ課題を一括登録することができます。
[ backlog-template-issue-gas ]
https://github.com/ikikko/backlog-template-issue-gas/wiki
```

APIを用いる方法もあるそうですが、ノンプログラマーにとっては、このGoogleスプレッドシートを使うのが簡単そうです。

# Googleスプレッドシート経由での登録を試す

## ikikko/backlog-template-issue-gas
https://github.com/ikikko/backlog-template-issue-gas/wiki

こちらの解説ページに従って、データを作成します。
楽勝です。
検証用Backlogプロジェクトも用意されていますので、登録テストもできます。

# データ作成時に注意すべき点

少しだけ落とし穴もあります。

## 「プロジェクト設定」に登録されていない「カテゴリ」「発生バージョン/マイルストーン」をスプレッドシートに指定しても、無視されます。

サンプルとして作成したGoogleスプレッドシートです。
カテゴリ「買い物」、マイルストーン「ダイエット」を指定しています。
「買い物」、「ダイエット」は「プロジェクト設定」に登録していません。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/47173/b8531ca0-fa6f-7ebf-e2a3-e947789c1ab1.png)

Googleスプレッドシート経由での登録後、課題を開いてみますと、「カテゴリ」「発生バージョン/マイルストーン」が空となっています。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/47173/4b50c255-cb7c-46f8-f609-10208be01841.png)

このように、「プロジェクト設定」に登録されていない「カテゴリ」「発生バージョン/マイルストーン」をスプレッドシートに入力しても、課題には登録されず、無視されてしまいます。

## 解決方法

一括登録する前に、「プロジェクト設定」を開き、「カテゴリ」「発生バージョン/マイルストーン」を作っておく。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/47173/63e3e703-9b9f-4554-a02f-07b75ef28bfb.png)

おかげさまで一括登録ができまして、時短に成功しました。
プログラムを書かずとも、用意されているツールで自動化できるのです。

# Googleスプレッドシートの、もう一つの利点

課題を考える際に、スプレッドシートへ書き連ねることで、課題の整理もできました。
プロジェクト全体も見渡しやすくなります。

自動化できるところは自動化して、無駄な工数を減らしていきたいと思います。
バイナリファイルをBase64文字列に手っ取り早く変換するコード

Stack Overflow探してみてもWhileを使うような~~めんどくせー~~お行儀のいいコードばかり。
私みたいな不良C#erはお行儀よくできないので、以下の通りにしちゃいました。

```C#
var file = File.Open(@"D:\hoge\fuga.pfx", FileMode.Open);
var bytes = new BinaryReader(file).ReadBytes((int)file.Length);
Console.Write(Convert.ToBase64String(bytes));
```

※業務処理で使う場合はちゃんとUsing使ってくださいね！

2017/02/26 追記
コメント欄でもっと手っ取り早い方法をご教授いただきました。

```C#
var bytes = File.ReadAllBytes(@"D:\hoge\fuga.pfx");
Console.Write(Convert.ToBase64String(bytes));
```

ありがとうございます！
SQL Server 2016 圧縮

```SQL
exec sp_estimate_data_compression_savings 'dbo', 'test', NULL, NULL, 'ROW'  --行圧縮
exec sp_estimate_data_compression_savings 'dbo', 'test', NULL, NULL, 'PAGE' --ページ圧縮 
--TABLEの場合
ALTER TABLE [dbo].[test] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)
--INDEXの場合
ALTER INDEX [index_name] ON [dbo].[test] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)
```
lessからstylusへ変換（Bootstrap）

Bootstrap の variables を編集したくて、
less ファイルを普段つかっている stylus に変換しようとした記録です。
結果から言うと、「stylus に変換しないほうがよい」になります。。

## less → stylus の変換

[less2stylus](https://github.com/andreypopp/less2stylus)を利用

```tcl
$ npm install -g less2stylus
```

これで

```tcl
$ less2stylus styles.less > styles.styl
```
で less ファイルをうまいこと stylus ファイルに変換してくれます。
Bootstrap のすべての less ファイルを一括で処理したかったので

```tcl
$ mkdir stylus
$ for file in less/*.less; do less2stylus "$file" > "./stylus/$(basename "$file" .less).styl"; done;
```

で一括変換。


## stylus 実行でこける箇所を修正

less で深い参照をしているところは less2stylus でもうまく変換できないようだったので

```mixin.styl
  .shorthand
    shorthand()
  serif(size=baseFontSize, weight=normal, lineHeight=baseLineHeight)
    @extend .font > #family > .serif
    font-shorthand(size, weight, lineHeight)
  .serif
    serif()
  sans-serif(size=baseFontSize, weight=normal, lineHeight=baseLineHeight)
    @extend .font > #family > .sans-serif
    font-shorthand(size, weight, lineHeight)
  .sans-serif
    sans-serif()
  monospace(size=baseFontSize, weight=normal, lineHeight=baseLineHeight)
    @extend .font > #family > .monospace
    font-shorthand(size, weight, lineHeight)
```

を

```mixin.styl
  .shorthand
    shorthand()
  serif(size=baseFontSize, weight=normal, lineHeight=baseLineHeight)
    font-family serifFontFamily
    font-shorthand(size, weight, lineHeight)
  .serif
    serif()
  sans-serif(size=baseFontSize, weight=normal, lineHeight=baseLineHeight)
    font-family sansFontFamily
    font-shorthand(size, weight, lineHeight)
  .sans-serif
    sans-serif()
  monospace(size=baseFontSize, weight=normal, lineHeight=baseLineHeight)
    font-family monoFontFamily
    font-shorthand(size, weight, lineHeight)
```
に修正。

stylus の codehighlight がうまくいかないのですが、
下記のような子セレクタをつかって深い階層を見に行っているところでつまづきます。

```
@extend .font > #family > .monospace
```


そしてもう一箇所。

```navbar.styl
.navbar-static-top .container, .navbar-fixed-top .container, .navbar-fixed-bottom .container
  grid > .core > .span(gridColumns)
```
を下記に修正。

```navbar.styl
.navbar-static-top .container,
.navbar-fixed-top .container,
.navbar-fixed-bottom .container
  width: ((gridColumnWidth) * gridColumns) + (gridGutterWidth * (gridColumns - 1));
```


## まとめ

これで stylus から CSS を出力できるようになったのですが、
実際の bootstrap.css と差し替えて使うと細かい表示くずれが発生してしまいました。 

Bootstrap をつかうなら less のまま、か
stylus でフレームワークを使うなら 別のものを使うのが良さそうです。
残念！
LaravelでMysqlのcharsetをutf8mb4にしてエラーが出るときの対応方法

Laravel5.4からデフォルトの文字コードがutf8mb4になりました。
migrationでいきなり下記のようなエラーが出たりします。(MysqlのVersionや設定によるはず)

```
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified
   key was too long; max key length is 767 bytes
```

カラムの文字数制限を255文字から191文字に変更して対処する方法もありますが、191ってなんだよみたいな気持ちがどうしてもあるので別の解決方法が以下。

my.cnf

```
[mysqld]
innodb_large_prefix
innodb_file_format=BARRACUDA
innodb_file_per_table
```

config/database.php

```
...
'engine' => 'InnoDB ROW_FORMAT=DYNAMIC',
...
```


## 追記(2017/2/22 20:02)

はじめ

```
'engine' => 'InnoDB ROW_FORMAT=COMPRESSED',
```

と書きましたがversion 5.7.9以降のデフォルトがDYNAMICとのことなのでそれに合わせて修正しました。
※5.6ではmy.cnfでこの値をデフォルトに設定できないようなので注意。
(例えばlaravelのmigrationを使わず別のROW_FORMATで作成したテーブルが混在していた場合どうなるか等調べてません。)
or演算子だけでメンバをデフォルト文字列に設定するかを判断する

[openpyxlのソース](https://bitbucket.org/openpyxl/openpyxl/src/5961d9dc9e51d70824b40517d52103cb4fd7c673/openpyxl/workbook/child.py?at=default&fileviewer=file-view-default)を見ていたら、```or```演算子を文字列に使用する華麗なidiomがあったのでメモしておきます。

下記のコードの`self.title = title or self._default_title`の部分で、`__init__`の引数`title`が`None`だったり、空文字列だったりした場合は、クラス変数の`_default_title`の値`"Sheet"`がデフォルト文字列として`self.title`にセットされます。

```py:child.py
class _WorkbookChild(object):

    __title = ""
    _id = None
    _path = "{0}"
    __parent = None
    _default_title = "Sheet"

    def __init__(self, parent=None, title=None):
        self.__parent = parent
        self.title = title or self._default_title
        self.HeaderFooter = HeaderFooter()
```
追記) こちらの記事に詳しい説明がありました。
http://qiita.com/keisuke-nakata/items/e0598b2c13807f102469
GCEでファイアウォールによってSSH接続から締め出された話

# 結論と解決策

GCEのファイアウォールはサーバー側とプラットフォーム（GCP）側の2段階なので両方開けとかないと弾かれる。

1. サーバー（Linuxとか）の設定でポートを開ける
2. **GCPのコンソール（ブラウザでアクセスする）の「ネットワーキング」からポートを開ける**（此処には既に「default-allow-ssh」という22番ポートを開けている設定があるが、これを編集するなり、同じようにルールを追加する）

*寝付けないくらい焦ったし夢にも見たけど助かったので良かった！！！*

# ここからは下はおまけポエム

## 締め出された原因

Google Compute Engineでサイトを運営していたところ、攻撃を食らっているかもしれなかった（結局違ったけど）。
とりあえずセキュリティは高めておこうと、（サーバー側で）ファイアウォールを設定したりSSHのポート番号を変更したところ、SSH接続が出来なくなってしまった。

最初からローカルのPuTTY（gcloudで起動するやつ）とブラウザのコンソールの2つで接続できていたので、変更したりログアウトする前にどちらか片方を繋いだままにしておけば良かったのだが、うっかり。

## やった事（失敗策）

とはいえ、gcloudのコマンドはよくわからないが、ブラウザのGCPダッシュボードのコンソールは起動時にポート番号を指定する事ができる。

> ブラウザ ウィンドウでカスタムポートを開く
 
今回はポートを22から2222にしたとして説明すると、この時に出てくるウィンドウに2222と入力すれば接続できるはず…だった。

ところがどっこい、これは22（既に閉じてあるポート）で接続しようとした時と同じエラーメッセージだ。

> ポート 2222 に接続できません

ポート2222はちゃんとサーバー側で開けといたし、サーバーの設定上で開いている事は確認してある。

紆余曲折の上、冒頭の解決策というか、GCEの仕様に辿り着いた。

## その他

gcloudコマンドで接続する場合の設定方法がわからないので、[普通のPuTTYで普通に接続する](https://cloud.google.com/compute/docs/instances/connecting-to-instance)事になったけど、めんどくささはあまり変わらないので良しとする。

※この記事は個人ブログに掲載していた記事を再編して掲載したものです。
オフラインリアルタイムどう書くF02の問題


オフラインでリアルタイムに「どう書く」をやるイベント( https://yhpg.doorkeeper.jp/events/56829 )を行っています。

問題は「2つの矩形に含まれるマス目の数」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/ordf02in2rec/
です。

出題者の気分としては、問題を読み始めてから解けるまで30分あればなんとかなると思ってますが、ひとそれぞれで。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。

似たような問題をもっと解きたいという方は、https://nabetani.hatenadiary.com/entry/yhpg_list
に過去問リンク集がありますので、そちらをご覧になると良いと思います。
gradleでservlet containerを起動する


## build.gradleの設定
```
apply plugin: 'war'
apply plugin: 'org.akhikhl.gretty'

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
    compile 'javax.servlet:javax.servlet-api:3.0.1'
}

war {
    webXml = file('src/main/web.xml')
}

buildscript {
    repositories{jcenter()}
    dependencies {
        classpath 'org.akhikhl.gretty:gretty:+'
    }
}
```

## ポート番号の指定
```
gretty {
    httpPort = 8081
}
```

## コンテキストルートの指定
```
gretty {
    contextPath = '/contextRoot'
}
```

その他のパラメータは[ここ](http://akhikhl.github.io/gretty-doc/Gretty-configuration.html)を参照
MNISTにおける入力データの詳細

DeepLearningの基本的サンプルであるMNISTの入力データの詳細を調べてみる。
これを理解することで、自分で学習させたいデータを作成する際の参考となると思われる。

# 入力データの種類
MNISTでは以下の4種類のデータを入力データとして読み込んでいる。

| ファイル名 | 内容 |
|:--|:--|
| train-images-idx3-ubyte.gz | 学習用画像データ |
| train-labels-idx1-ubyte.gz | 学習用ラベルデータ |
| t10k-images-idx3-ubyte.gz | テスト用画像データ |
| t10k-labels-idx1-ubyte.gz | テスト用ラベルデータ |

これらのファイルはzipで圧縮されているため、実際に使用する際には内部的に解凍してから使用している。

学習用の画像枚数は60,000枚、テスト用の画像枚数は10,000枚となっている。
また、学習用データのうち5,000枚を検証用として使用している。（枚数は変更可能）
ラベルの識別数は10種類（0～9）である。

# 画像データ
画像データのフォーマットは以下のようになっている。
（例）train-images-idx3-ubyte.gz：学習用画像データ（28x28pixel、60,000枚）
![image1.png](https://qiita-image-store.s3.amazonaws.com/0/130771/5582f12c-a009-28df-41e6-17f8a5ce0823.png)

0x0000～0x0003：マジックナンバー（2051）　※これでMNISTの画像データかを判断している
0x0004～0x0007：画像枚数（60,000）
0x0008～0x000b：画像の高さ（28）
0x000c～0x000f：画像の幅（28）
0x0010～0x032f：1枚目の画像データ　※1pixelは1byte整数固定

画像データが60,000枚分続き、ファイルが終了する。

# ラベルデータ
ラベルデータのフォーマットは以下のようになっている。
（例）train-labels-idx1-ubyte.gz：学習用ラベルデータ（10分類、60,000枚）
![image2.png](https://qiita-image-store.s3.amazonaws.com/0/130771/53041175-d845-1dff-31aa-837a8e1a6a24.png)

0x0000～0x0003：マジックナンバー（2049）　※これでMNISTのラベルデータかを判断している
0x0004～0x0007：画像枚数（60,000）
0x0008～0xea67：各画像のラベルの値　※ラベルの値（0～9）は1byte整数固定

ラベルデータが60,000枚分続き、ファイルが終了する。
なお、各画像のラベルデータは、直接対応する分類番号が入っていることに注意すること。
各画像に対応する各識別値を指定したい場合は、0～9に対応したフラグ（0 or 1が10個）のような構造にする必要がある。
※もちろん、データだけでなく処理も修正が必要になる

# 参考
TensorFlowの場合、MNISTデータの読み込み処理は「tensorflow\contrib\learn\python\learn\datasets\mnist.py」にあるので、独自のデータを扱う際には、これを真似するのが理解しやすく良さそうだ。
Redashの再起動/user削除


今頃使い始めました、他愛も無い内容なのだけどメモ書きです

再起動：
sudo supervisorctl restart all

ユーザ削除：
1)sshでサーバにログイン
2)cd /opt/redash/current
3)sudo -u redash bin/run ./manage.py users delete <登録時メールアドレス>

メールアドレスは大文字小文字区別されるので注意。
ユーザの追加はGUIで行っています。
DynamoDBのputItemで追加と更新の実現方法

まずAWSのドキュメント→開発者ガイド→[DynamoDB での項目の操作](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/WorkingWithItems.html)を見てみましょう。
##PutItem
新しい項目を作成します。同じキーを持つ項目がテーブルにすでに存在する場合は、新しい項目に置き換えられます。テーブル名と書き込む項目を指定する必要があります。
##UpdateItem
項目が存在しない場合、このオペレーションは新しい項目を作成します。すでに存在する場合は、既存の項目の属性を変更します。テーブル名と変更する項目のキーを指定する必要があります。更新する属性ごとに、新しい値を指定する必要があります。
※UpdateItemの使い方は[DynamoDBのupdateItemのValidationException解消方法](http://qiita.com/mumuma/items/f8ac4ffc3f30d512a789)に参照できます。

##AWSマネジメントコンソールでDynamoDBのテーブル作成
<img width="850" alt="スクリーンショット 2017-02-21 18.20.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/87871/5928b60e-5a13-efe7-66ce-fd2f5822a6f1.png">

idはプライマリキーパーティションキーになっています。

* 下記のデータ(csv1)をputitemします。

```
id,name
10000,hello_one
10001,hello_two
10002,hello_three
10004,hello_four
```
* DynamoDBの結果

```
id,name
10000,hello_one
10001,hello_two
10002,hello_three
10004,hello_four
```

* 下記のデータ(csv2)をputitemします。

```
id,name
10000,hello_one_two
10001,hello_two_three
10002,hello_three
10004,hello_four
```

* DynamoDBの結果

```
id,name
10000,hello_one
10000,hello_one_two
10001,hello_two
10001,hello_two_three
10002,hello_three
10004,hello_four
```

##結果
id= 10000のものが新しい項目として作成されています。

##存在しているidの項目を更新する解決方法
###テーブル作成
AWSマネジメントコンソールからではなくて、AWS-CLIでコマンドで作成します。

```
aws dynamodb create-table --table-name test --attribute-definitions '[{"AttributeName": "id", "AttributeType": "S"}]' --key-schema '[{"AttributeName": "id", "KeyType": "HASH"}]' --provisioned-throughput '{"ReadCapacityUnits": 5, "WriteCapacityUnits": 5}'
```

idのプライマリキーのタイプはHASHを指定すればid存在したら更新します。

* もう一回csv1、csv2をputItemでDynamoDBに書き込む場合
* DynamoDBの結果

```
id,name
10000,hello_one_two
10001,hello_two_three
10002,hello_three
10004,hello_four
```

## まとめ
テーブル作成する時、プライマリキーのタイプをHASHかHASH+RANGEにしてすれば、putItemでDynamoDBの項目を追加と更新(=updateItem)が両方実現できます。
MacでOCamlを使ってみたときのメモ


# 環境

* Mac 10.10.3
* OCaml 4.02.2
* Emacs

# MacにOCamlをインストール

```
$ brew install ocaml
$ ocaml -version
```

# とりあえず動かしてみる

## Hello World

```
$ ocaml
        OCaml version 4.02.2

# let () = Printf.printf "Hello, world!\n";;
Hello, world!
# ^D
$ # Control + D で抜けることができる
```

## 日本語をPrintすると文字化けするので直す

```
$ ocaml
        OCaml version 4.02.2

# let () = Printf.printf "はろーわーるど\n";;
（なんか文字化けする）
```

以下のような `~/.ocamlinit` を用意したらなおる

```
$ cat ~/.ocamlinit
let printer ppf = Format.fprintf ppf "\"%s\"";;
#install_printer printer;;
```

## クラスを定義してみる

ここからはインタプリタじゃないやつでやる

```
$ cat script.ml
class slack =
  object (self)
  method print =  Printf.printf "slack class\n"
end;;

let slack = new slack;;
slack#print;;

$ ocaml script.ml
slack class
```

`.ml` が拡張子になる。 `ocaml <ファイル名>` でそのファイルのプログラムが実行される。

OCamlはオブジェクト指向 + 関数型言語なのでクラスが定義できる。
mecab,cabochaをインストール

centOS 7 にmecabとcabochaをインストールした時のコマンド
#    mecabのインストール
    
    wget -O mecab-0.996.tar.gz "https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7cENtOXlicTFaRUE"
    tar zxfv mecab-0.996.tar.gz
    cd mecab-0.996
    ./configure
    make
    make install
    
#    mecab-ipadicのインストール

    wget -O mecab-ipadic-2.7.0-20070801.tar.gz "https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7MWVlSDBCSXZMTXM"
    tar zxfv mecab-ipadic-2.7.0-20070801.tar.gz
    cd mecab-ipadic-2.7.0-20070801
    ./configure --with-charset=utf8
    make
    make install

#    CRF++のインストール

    wget 'https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7QVR6VXJ5dWExSTQ' -O CRF++-0.58.tar.gz
    tar zxvf CRF++-0.58.tar.gz
    cd CRF++-0.58
    ./configure
    make
    make install

#    cabochaのインストール

cabochaはwgetではうまくダウンロードできなかったので別のパソコンでダウンロードしたものをscpを使って送った。

    scp cabpcha-0.69.tar.bz2 ユーザ名@ホスト名:~/
    bzip2 -d cabocha-0.69.tar.bz2
    tar -xf cabocha-0.69.tar
    cd cabocha-0.69
    ./configure --with-mecab- config='which mecab-config' --with-charset=UTF8
    make
    make install
behat.ymlに環境変数を渡す


環境によってbehatでテストするURLが変わることがあるので、`base_url`は`behat.yml`に決め打ちしたくないということもあると思います。
そんな時のために、`BEHAT_PARAMS`という環境にJSON形式でデータを渡すことができます。

### JSONを用意
```tests/behat.json
{
   "extensions" : {
      "Behat\\MinkExtension" : {
         "base_url" : "http://vccw.dev/"
      }
   }
}
```
### 環境変数を設定
```.envrc
export BEHAT_PARAMS="`cat tests/behat.json`"
```

ダイレクトに値を指定しても良いのですが、ここにJSONを書くのがあまり好きでないので展開させてます。

### 環境変数で定義した内容は`behat.yml`から除外する

```behat.yml
default:
  suites:
    default:
      paths:
        - %paths.base%/features
      contexts:
        - FeatureContext
        - VCCW\Behat\Mink\WordPressExtension\Context\WordPressContext
        - Behat\MinkExtension\Context\MinkContext
  extensions:
    VCCW\Behat\Mink\WordPressExtension:
      roles:
        administrator:
          username: admin
          password: admin
    Behat\MinkExtension:
      #base_url: http://vccw.dev
      default_session: default
      sessions:
        default:
          selenium2:
            wd_host: http://127.0.0.1:4444/wd/hub
        goutte:
          goutte: ~

```
`behat.yml`側でも定義した場合、`behat.yml`の値が優先される様子なので要注意です。
リバースプロキシを間に挟むflaskアプリケーションのリダイレクトではまった

# 現象
SSLを導入したリバースプロキシ―（apache mod_proxy）
バックエンドのwsgiサーバー（apache mod_wsgi+flask）

リバースプロキシ―がhttpsでリクエストを受け、httpでバックエンドのwsgiサーバーにプロキシーする構成。

この時、flaskでリダイレクトするとクライアントブラウザでのリダイレクト先のurlがhttpになってしまった。

# リバースプロキシ―の設定

```
<VirtualHost *:443>

    ...

    ProxyPass / http://my.wsgi.server/
    ProxyPassReverse / http://my.wsgi.server/

    ...

</VirtualHost>
```

mod_proxyはドキュメントに従って設定しているはず。

# Location

```
curl -v http://my.wsgi.server/
```
するとLocationにhttp://付きの絶対パスが指定されていた。
どうやらこれが問題らしい。絶対パスを指定すると、ProxyPassReverseは正常に動作しない（スキームが書き換わらない）ようだ。

# flaskでは...
url_for(..., _scheme="https") を使用すれば、スキームをhttpsにできそう。
しかし、変更箇所が大きいのと、バックエンドのwsgiサーバー単独で動かなくなるので見送り。

# RFCでは？
RFC7321では相対パスが認められている模様。
https://triple-underscore.github.io/RFC7231-ja.html#section-7.1.2
Locationヘッダを書き換えることにする。

# wsgiサーバー側でLocationを書き換える
```
<VirtualHost *:80>

    ...

    Header edit Location ^http:// //

    ...

</VirtualHost>
```
```
curl -v http://my.wsgi.server/
```

Locationからスキームが消え、リバースプロキシー経由でのリダイレクトが正常に動作するようになった。
Unityでgifっぽい何かを表示 自分用メモ

#動かしたい画像を探してくる

今回はこのサイトの星を表示してみる
http://piposozai.blog76.fc2.com/blog-entry-435.html

1)ダウンロードしてきた画像をアセットに突っ込む
![スクリーンショット 2017-02-22 16.15.05.png](https://qiita-image-store.s3.amazonaws.com/0/126397/4a0d9749-b151-e479-2cea-a210a0f1ef5a.png)

2)Texture Type をSpriteに変更
  Sprite ModeをMultipleに変更
  Filter ModeをPointに変更
![スクリーンショット 2017-02-22 16.15.51.png](https://qiita-image-store.s3.amazonaws.com/0/126397/833897d8-351e-05ff-4c73-72737f6b7ad7.png)

3)Sprite Editorを押す
![スクリーンショット 2017-02-22 16.19.13.png](https://qiita-image-store.s3.amazonaws.com/0/126397/e3b3696f-a952-522f-9159-e316b763bf9f.png)

4)Sliceを押して
TypeをGrid By Cell Sizeに変更
一コマあたりのサイズをPixel Sizeに設定
Sliceボタンを押す
Windowを閉じてApply
![スクリーンショット 2017-02-22 16.20.29.png](https://qiita-image-store.s3.amazonaws.com/0/126397/1ac6246a-5439-d733-eb9b-a4691548f6cb.png)

5)アニメーションさせたいコマを複数選択してシーンにドラッグ
![スクリーンショット 2017-02-22 16.24.31.png](https://qiita-image-store.s3.amazonaws.com/0/126397/dc18cb16-513e-465f-59bc-1289b77f985e.png)

とりあえずNew Animation.animって名前で保存

![スクリーンショット 2017-02-22 16.28.03.png](https://qiita-image-store.s3.amazonaws.com/0/126397/2de7ee68-5349-b775-09a1-b49c23fbd1ef.png)

動いてるね！静止画だけど

おしまい
Rについての個人的メモ

触って気づいたことをメモしていっているので，間違いがありましたらコメントいただけますと大変助かります．


# データフレームの内部構造

* 構造1：ラベルとセル配列を持つコラム
 * セル配列は文字列の配列と数値の配列を両方受け付ける型付Union
* 構造2：コラムの配列


# Visual Studio CodeでRを実行する


### [Code Runner](https://marketplace.visualstudio.com/items?itemName=formulahendry.code-runner)を使う

### [Runner](https://marketplace.visualstudio.com/items?itemName=mattn.Runner)を使う

設定の"runner.languageMap"の欄に以下の内容のバッチファイルへのパスを当てる

```bat:batchfile
chcp 65001

@echo off

if "%~dpnx1" equ "" goto :eof

PATH\TO\Rscript.exe --no-save %~dpnx1
```

plotを別窓で開くということができないので，png（[例](http://symfoware.blog68.fc2.com/blog-entry-1499.html)）やpdf（[例](http://stackoverflow.com/questions/3301694/running-r-scripts-with-plots)）に落としてから使う工夫が必要か．どうせバッチ処理をするなら，バッチ側で出力先デバイスに画像を割り当てるコードを勝手に付加してから実行し，指定した画像のタイムスタンプが更新されてたらSTARTなど別プロセス起動コマンドで画像を出すといいかもしれない（[別の参考例](http://qiita.com/mm_sys/items/596327d9ccfd1b46c791)）．