OmniAICreator/Qiita-1.07M huggingface dataset:
TensorFlowで競艇予想

##動機
あるイベントでTensorFlowを触る機会があり、そのとき機械学習で競艇の予想ができないかという話が出て、面白そうなのでやってみました。

## 環境
Ubuntu 16.04 + python 2.7.12 + TensorFlow 0.7.1

##1.条件設定
競艇では6つのボートが順位を競います。舟券を購入する人は選手の戦歴などから、ゴール時点での着順を予想します。
今回は、ゴール時点での1着、2着を着順を含め予想する「ニ連単」の予想に挑戦します。

##2.過去レースデータベース作成
過去のレース結果は、下記のサイトでテキストファイルで提供されています。
http://www1.mbrace.or.jp/od2/K/pindex.html
2014年～現在（2016/11）までの結果を一括で取得し、Python+SQLite3でデータベース化しました。

##3.入力特徴量作成
訓練を行う際に入力する特徴量を計算しました。使用する特徴量は以下の通りとしました。
- レース会場
- 進入固定か否か
- 選手の進入分布
- 選手の枠別着順分布
- 選手のスタートタイミング分布
- 選手の決まり手分布
選手の特徴量については、過去1か月半を対象として作成しました。なお、戦歴が極端に少ない選手が出場しているレースは、予想対象から外しています。選手が使用するボート・モーターも予想の参考にする方がいるようですが、今回は対象外としました。

ネットワークの実装は以下の記事を参考に行いました。
[機械学習（TensorFlow）+ ロト6] http://qiita.com/yai/items/a128727ffdd334a4bc57

##4.訓練
訓練は2014年1月～2016年3月の97200レースを対象として行い、ステップ数は300としました。
結果として、訓練データにおける的中率は20％程度になりました。やはり競艇の予想は難しいようです。

##5.シミュレーション
2016年5月～2016年10月の6か月間のレースを対象としてテストを行いました。各レースにおいて、出力ラベル（＝予想結果）の値が一番高くなったものを、100円ずつ買ったとしてシミュレーションを行います。
なお作成したプログラムの都合上、選手のファウル・落艇などでゴールしたのが5艇以下のレースはテストケースから除いてあります。また、舟券購入に伴うオッズの低下等も想定していません。よって、以降に示す的中率等の結果は実際よりも若干高く出ている可能性があることに注意してください。

##6.シミュレーション(1) 全レース予想
期間内の全ての予想対象レースで試してみます。

| 期間 | 予想レース数 | 的中レース数 | 的中率 | 収支(円) |
|:-:|:-:|:-:|:-:|:-:|
| 2016/5 | 4178  | 856  | 0.204  | **-63,010**  |
| 2016/6  | 3589  |  723 |  0.201 |  **-54,460**|
| 2016/7  | 3940  | 752  | 0.190  | **-75,450**  |
| 2016/8  | 4336  | 816  | 0.188  | **-61,120**  |
| 2016/9  | 3598  | 672  | 0.186  | **-64,610**  |
| 2016/10 | 3750  | 688  | 0.183  | **-74,940**  |
| 計 | 23391  | 4507  |   |  **-393,590** |

散々な結果です。的中率が低い上、オッズが低いレースしか的中していないので、収支が大幅なマイナスとなっています。

##7.シミュレーション(2) レースを選んで予想
出力ラベルが一定のしきい値（今回は0.45）を上回るレースのみを対象として試してみます。
自信があるレースだけに絞る感じです。

| 期間 | 予想レース数 | 的中レース数 | 的中率 | 収支(円) |
|:-:|:-:|:-:|:-:|:-:|
| 2016/5 | 55  | 28  | 0.509  | +190  |
| 2016/6  | 53  | 24  | 0.452  | +1,050  |
| 2016/7  | 63  | 29  | 0.460  | +790  |
| 2016/8  | 47  | 24  | 0.510  | +530  |
| 2016/9  | 30  | 13  | 0.433  | **-170**  |
| 2016/10 | 30  | 14  | 0.466  | +450  |
| 計 | 278  | 132  |   | +2,840  |

的中率は4割以上になり、収支も6か月中5か月で微妙ですがプラスとなっています。
やはりオッズが低いレースしか的中していないようですが、的中率の高さでカバーしている感じです。
競艇の平均回収率が75％であることを踏まえれば、そこそこの結果と言えそうです。

##まとめ
競艇は人対人のレースであるため、イレギュラーな要素が多く、機械学習で着順結果そのものを予想することは難しいようです。そもそも筆者が機械学習や競艇に対して素人であるということも一つの原因ですが..
大量のレースから選手間に圧倒的な力量差がある、いわゆる「固いレース」を抽出する用途には使えるかもしれません。
なお前にも述べましたが、今回行ったシミュレーションは現実と異なる条件下で行ったもので、実際のレースでうまくいくかどうかは分かりませんので、あしからず。
draw.ioをオフラインで使う

そんな使い方をしなければならない雑魚共に捧ぐ

## オフライン環境でdraw.ioを動かすのに必要なもの

* クローンした draw.io のリポジトリ
* webサーバ

## リポジトリをクローン
オンライン環境で draw.io のリポジトリをクローンしておく

```
git clone https://github.com/jgraph/draw.io.git
``` 

## webサーバで晒す
そこらに転がっていた適当なオフラインのサーバではすでに httpd が動いていた
クローンした draw.io ディレクトリをまるごとその `/opt` 下に置いたとする

適当なポートを開いて適当にVirtualHostを切る
名前はまだない

```httpd.conf
...

Listen 10080
...

NameVirtualHost *:10080
...

<VirtualHost *:10080>
DocumentRoot /opt/draw.io/war
</VirtualHost>
```

## 使う
オフラインで使うときは google drive との連携だとかいった良い機能は使えない
そしてデフォルトだと https
俺はオフラインで使いたい
証明書などなない

オフラインオプションを付け https を無効化して繋げばいい
http://<適当なサーバ>:10080/index.html?offline=1&https=0



以上、よろしくお願いいたします
qpdfview + Canon IP2700で印刷がかすれた場合の解決法

#文字がかすれる!?
明日提出しなきゃいけないレポートがまともに印刷できないよ!
仕方ない!lprでの印刷のやり方調べなきゃ!


#原因
| 場所 |設定  |
|:-:|:-:|
| ドライバ  |黒インクのみを使う   |
| qpdfview  |カラー印刷を行う

この2つの設定がかぶったときに文字がかすれる

#結論
- qpdfviewは悪くない
- マニュアルはちゃんと読もう
- 原因がわからなかったらlprで印刷した方早い
Packerやってみる

# それ何？
Packerは1つのコンフィグファイルから複数のプラットフォーム上に常に同一のマシンイメージを作るためのツールです。

# 複数のプラットフォームって何のこと？
Packerがマシンイメージを作成できるプラットフォームは以下の通りです。

- Amazon EC2
- CloudStack
- DigitalOcean
- Docker
- Google Compute Engine
- OpenStack
- Parallels
- EQMU
- VirtualBox
- VMWare

# 何ができるの？
指定のプラットフォーム上に既存のツールを使って **プロビジョニング済みの** マシンイメージを作ることができます。

# 既存のツールって何？
- Ansible
- Cheff
- Puppet
などです。

# やってみよう
お試しで、inline shellで適当にプロビジョニングしたAMIを作ってみます。

## テンプレートを作る
Packerでいいことをするには、プラットフォームの設定とプロビジョニングの設定を含むテンプレートファイルを作る必要があります。


```json:sample.json
{
  "builders": [
    {
      "type": "amazon-ebs",
      "access_key": "{{user `aws_access_key`}}",
      "secret_key": "{{user `aws_secret_key`}}",
      "region": "us-east-1",
      "source_ami": "ami-b73b63a0",
      "instance_type": "t2.micro",
      "ssh_username": "ec2-user",
      "ami_name": "ami-b73b63a0 base packed ami {{timestamp}}"
    }
  ],
  "provisioners": [
    {
      "type": "shell",
      "inline": [
        "sudo yum -y update",
        "sudo yum -y install nginx",
        "echo 'hello world.' > ~/packer.txt"
      ]
    }
  ]
}
```

## packerで実行する

前述のjsonファイルを packer で実行してみます。

```
packer build sample.json
```

しばらくまっていると作成に成功したようです。

```
==> Builds finished. The artifacts of successful builds are:
--> amazon-ebs: AMIs were created:

us-east-1: ami-821a1695
```

EC2のインスタンスを確認すると、AMI作成に使ったインスタンスは行儀良く削除（terminate）されていました。

![スクリーンショット 2016-12-13 20.01.36.png](https://qiita-image-store.s3.amazonaws.com/0/147387/d8f067e2-05fc-3490-6b8d-1c2e9d27f15e.png)

更にAMIの中を確認したら、ありました。

![スクリーンショット 2016-12-13 20.02.12.png](https://qiita-image-store.s3.amazonaws.com/0/147387/6e910cf5-5683-cfe4-3f1f-42373705cf8a.png)

hello worldのファイルも確認できました。

# 最後に
実務で使う場合はansibleでprovisioningしてcapistranoでアプリケーションをdeployした後イメージ化したいですね。
確認してないですが、多分できるんだろう。出来るといいな。
データの大掃除


[DATUM STUDIO Advent Calendar 2016](http://qiita.com/advent-calendar/2016/datumstudio)　13日目の記事です。


年末、大掃除をしたら、新年、気持ちよく迎えられる。

分析も同じです。

データ、お掃除して綺麗にしたら、分析、気持ちよくとりかかれる。

そこで、コマンドでのデータのお掃除（基礎的なもの）方法を紹介します。

1. どんなデータなんだろう？(ls,head)
2. 文字コードが違っていて見れない...(nkf)
3. 不必要な文字が入っている...(grep)
4. この行だけ必要なのに...(sed)
5. この列いらない...(cut)
6. データが大きすぎて他の分析ツールで読み込めないのだが！(split)

##1.どんなデータなんだろう？
データをもらった時に、まずすることは、データの確認です。
お掃除の前に、まず確認です。

###データのつくりを理解する
まずはlsコマンドでデータのつくりを確認しましょう。

`$ ls -l data.csv`

結果

```
-rw-r--r-- 1 daifuku_mochi2 mochi 105 12 03 23:30 data.csv
```

|   |ファイル種別|アクセス権限| リンク数 | 所有者 | 所有グループ | ファイルサイズ（バイト数） | 最終更新日時  | ファイル名  |
|:--|--------:|--------:|-------:|----:|----------:|-------------------:|------------:|:--------:|
|出力|    -    |rw-r--r--|   1    | daifuku_mochi2 |    mochi  |        105         | 12 03 23:30 | data.csv |
|説明|`-`はファイルを表す|所有者は読み取り(read のr)書き込み（write のw）が可能。所有グループに属する人と、その他の人は読み取りのみ可能。| 通常のファイルの場合は1 | ファイル所有者 | グループ名 | 105バイトですね。 | 眠くなる時間ですね | 今回使用していくデータ名 |

ここで、データのサイズや、そもそも自分は書換える権限があるのか？等の確認ができます。

###データの中身を確認しよう！
headコマンドで少しデータの中身を見てみましょう。

`$ head data.csv　　　　　　　　　　#head ファイル名`

結果

```
01,1,??
02,2,??
03,3,aaa
04,4,??
05,5,??
06,6,??
07,7,??a
08,8,??
09,9,??
10,10,a??
```
データの一部を確認できました。

##2.文字コードが違っていて見れない...
データは確認できましたが、文字化けしていて確認できませんでした。
そんな時はnkfコマンドで文字コードを確認しましょう。

###まずは文字コードの確認

`$nkf --guess sample.txt #nkf --guess ファイル名`

結果

```
Shift_JIS (LF)
```

###文字コードを変更しよう
Shift_JIS をUTF-8に変換します。

`$nkf -w --overwrite sample.txt　#nkf -変更したい文字コードを表す記号(Shift_JISなら"s",UTF-8なら"w"など) --ファイルを上書きするならoverwrite ファイル名`

ここで、もう一度文字コードを確認してみると、

結果

```
UTF-8 (LF)
```

ちゃんと変更されていました！！
中を見てみましょう。

```
01,1,も
02,2,ち
03,3,aaa
04,4,も
05,5,ち
06,6,も
07,7,もa
08,8,も
09,9,ち
10,10,aち
```

これで中を見ることができました。

##3.不必要な文字が入っている...
なんでところどころに"a"がはいっているんだ...意味がわからない...
そんな時ありますよね。
不必要な文字がついている行をgrepコマンドで削除することにします。

`$ grep -v "a" data.csv 　　　#grep -v "不必要な文字" ファイル名 `

結果

```
01,1,も
02,2,ち
04,4,も
05,5,ち
06,6,も
08,8,も
09,9,ち
```

grepは、検索パターンに一致した行を表示するコマンドです。
-v オプションを使用した場合、逆にパターンに一致しなかった行のみを表示します。

##4.この行だけ必要なのに...
sedコマンドで必要な行を抽出します。

`$sed -n '1,2p' data.csv 　　#sed -n '抽出したい行の開始行,抽出したい行の終了行' ファイル名`

結果

```
01,1,も
02,2,ち
```
※$sed -e '3,9d' でも同じ結果が得られます。（指定行の削除）

##5.この列いらない...
cutコマンドで削除しましょう。

`$cat data.csv | cut -d "," -f 2-3 　#cat ファイル名 | cut -d "ファイルの区切り文字" 表示させたい列`

結果

```
1,も
2,ち
3,aaa
4,も
5,ち
6,も
7,もa
8,も
9,ち
10,aち
```
※区切り文字がtabの場合は、"-d"オプションは不要。

###6.データが大きすぎて他の分析ツールで読み込めないのだが！
これくらいの大きさのファイルなら読み込めるのに...!
という時、splitコマンドが役立ちます。指定のバイト数で区切ることができます。

`$split -b 50 data.csv　　#split -b 一つのファイルあたりのバイト数 ファイル名`

結果(ls -lで見ます)

```
-rw-r--r--@ 1 daifuku_mochi2 mochi 105 12 03 23:30 data.csv
-rw-r--r-- 1 daifuku_mochi2 mochi 50 12 12 23:27 xaa
-rw-r--r-- 1 daifuku_mochi2 mochi 50 12 12 23:27 xab
-rw-r--r-- 1 daifuku_mochi2 mochi 5 12 12 23:27 xac
```
3つのファイルが出力されました。
105バイトあったdata.csvは、50バイト,50バイト,5バイトと分割されていることがわかります。


###まとめ
大きなデータでファイルが開けないので手作業が難しい、
手作業は煩わしい、ミスをしてしまうことが不安だ
というような時、コマンドでの処理はとても便利です。
ここで紹介したコマンドは、上記以外にもたくさんの便利なオプションがあります。
`man`コマンド を詳しく知りたいコマンドと一緒に打ってみてください。
コマンドお掃除で、よいお年を！
milkcocoa-toolを使ってMilkcocoaのデータをCSVでエクスポートする

そういえば、社内で頼んだら部谷さんが一瞬で作った[milkcocoa-tool](https://github.com/milk-cocoa/milkcocoa-tool)というツールがあります。今回はこちらのご紹介です。

## インストール

npmでサクッとグローバルインストール！

```bash
sudo npm i milkcocoa-tool -g
```

## CSVでエクスポート

以下のコマンドでエクスポートします。

```bash
milkcocoa-tool export-csv --app_id <あなたのApp ID> --host <あなたのApp ID>.mlkcca.com --ds <あなたのデータストア名＞ --apikey ＜あなたのAPI Key> --apisecret <あなたのAPIシークレット>
```

**こちら修正完了したようです！**

~~すると...~~

~~```permission denied```~~

~~ありゃ、現在API Keyが効かないようです（以下のissueで対応中です）~~

~~[--apikey xxx --apisecret xxxオプションが効かない？ · Issue #1 · milk-cocoa/milkcocoa-tool · GitHub](https://github.com/milk-cocoa/milkcocoa-tool/issues/1)~~

## 「認証済みクライアント以外を接続不可にする」を無効にしてみる（危ないので非推奨）

**修正後API Key使えるようになったのでそちらでやりましょうー**

~~とりあえず動作確認のためにアプリの認証設定の「認証済みクライアント以外を接続不可にする」を無効にしてみました。~~

![image](https://qiita-image-store.s3.amazonaws.com/0/21109/ad398cfa-6a44-0dcc-f6a1-c3619fffec62.png)

API Keyとかいらないので以下のコマンドを実行。

```bash
milkcocoa-tool export-csv --app_id <あなたのApp ID> --host <あなたのApp ID>.mlkcca.com --ds <あなたのデータストア名＞
```

## エクスポート完了

以下のようなファイルがエクスポートされました！（デフォルトではコマンドを実行した場所に`output.csv`という名前でエクスポートされますがファイル名やパスを指定するには`--output`オプションを使います）

![image](https://qiita-image-store.s3.amazonaws.com/0/21109/0f54afcd-2eeb-cdc3-72d7-41a256edfe54.png)

## まとめ

ご覧のようにプロパティを良い感じで列に変換してくれるので楽ですね！これは色々と使い道がありそうです。
php static変数の継承の注意

phpでクラスの継承を利用しているとき、親クラスのstatic変数が子クラスでどう扱われるかというポイントで嵌ったので公開する。
理屈がわかってしまえば当たり前の動きなのだが、インスタンス変数の感覚でいたため痛い目にあってしまった。

継承関係にある次のクラスを作成する。

```php:
class A{
    public static $a = 'a';
}

class B extends A{
    public static function init(){
        self::$a = 'b';
    }
}

class C extends A{
    public static function init(){
        self::$a = 'c';
    }
}
```

ここで次の処理はさすがに自明な結果を返す。

```php:
echo A::$a . "\n"; // > a
echo B::$a . "\n"; // > a
echo C::$a . "\n"; // > a
```

ここで次の魔法をかける。

```php
B::init();
```

するとさきほどの結果は次のように変化する。

```php
echo A::$a . "\n"; // > b
echo B::$a . "\n"; // > b
echo C::$a . "\n"; // > b
```

つまり、自身のstaticプロパティを書き換えたつもりでも、親も兄弟もすべて書き換えてしまったかのような結果となる。
上のように明確な定義をしていれば、まあなんでもない挙動だが、もともと親になかったstaticプロパティが
ある日突然親に追加された瞬間、地獄を見る。

ちなみに、class Bでstatic変数を再定義しておけば、上記のような現象は回避される。

```php:
class B extends A{
    public static $a = 'a';
    public static function init(){
        self::$a = 'b';
    }
}
```


```php
B::init();
echo A::$a . "\n"; // > a
echo B::$a . "\n"; // > b
echo C::$a . "\n"; // > a
```
switch文

switch文は読み込んだ数値によって表示する分を分岐させる。

```java:filename.java
import jva.util.Scanner;

class Abc {
    publlic static void(String[] args) {
        Scanner stdin = new Scanner(System.in);

        System.out.print("整数 : ");
        int n = stdIn.nextInt();

        switch (n) {
            case 0 : System.out.print("abc"); 
                     break;
            case 1 : System.out.print("def"); 
                     break;
            case 2 : System.out.print("ghi"); 
                     break;
            case 3 :
            case 4 : System.out.print("jkl");
                     break;
            default : System.out.print("123");
                      break;
        }
        System.out.println();
    }
}
```
例の場合「int n」の値によって表示される文が分かれる。
また、nの値が3か4になった場合は同じ文字が表示される。
「default」はnがcaseに指定した値以外の場合に表示される。

各caseの文末にある「break文」を実行するとswitch文が終了する。
break文によって終了した後はswitch文の後ろにある文が実行される。
Unity5.5で作成したシーンが5.4で使えなかった話

自分はUnity 5.4.3f1を使っていて、同じチームのあるメンバーは5.5.0f3(アプデしちゃったらしい)を使っているが、相手の作成したシーンを統合したところ、色々なエラーが出てしまった。
こんな症状が出たってことを書いていく。

#環境
・自分のOS：macOS Sierra 10.12.1
・自分のUnity：5.4.3f1
・相手のOS：Windows 10
・相手のUnity：5.5.0f3

#症状
・該当シーンに移ると、GameタブにNo cameras renderingと表示され、何もオブジェクトが映らない。

<img width="500" alt="スクリーンショット 2016-12-13 20.03.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/136855/1d60fb63-c3da-421b-83fc-1dc44ce877fe.png">

・ヒエラルキーにオブジェクトがあるはずなのに、名前が表示されない(上図参照)
・スクリプトがアタッチされているはずなのに、されていない(上図参照)
・なぜか全てのオブジェクトにTransformとRectTransformの両方が存在する(上図参照)
・以下のエラーがたくさん出る(主にTransform云々のエラー)

```
Object GameObject (named '') has multiple entries of the same Object component. Removing it!
UnityEditor.DockArea:OnGUI()
```

```
Component Object could not be loaded when loading game object. Cleaning up!
UnityEditor.DockArea:OnGUI()
```

```
Transform component could not be found on game object. Adding one!
UnityEditor.DockArea:OnGUI()
```

```
GameObject has multiple Transform components! Merged into single one.
UnityEditor.DockArea:OnGUI()
```

```
CheckConsistency: GameObject does not reference component RectTransform. Fixing.
UnityEditor.DockArea:OnGUI()
```

```
CheckConsistency: GameObject does not reference component MonoBehaviour. Fixing.
UnityEditor.DockArea:OnGUI()
```

#解決法
ググっても原因不明で、特に解決法が見当たらなかった。

というわけで、相手のUnityのバージョン(5.5.0f3)と合わせることにしたところ、エラーが一切出なくなり、あっさり解決してしまった。
開発時はバージョン揃えなきゃダメということがよく分かった。
オライリー本「ゼロから作るDeep Learning」の環境準備をapt-getで(Debian 8)

## インストール

書籍ではAnacondaの利用が推奨されていますが、apt-getで手抜き。

```
$ sudo apt-get install python3 python3-numpy python3-matplotlib
```

## "python"ではなく"python3"で実行

Debian 8(jessie)では、"python"はPython 2.x系を指すようになっています。
"python3"でPython 3.x系が起動します。

```
$ python3
Python 3.4.2 (default, Oct  8 2014, 10:45:20)
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> x = np.array([0, 1])
>>> w = np.array([0.5, 0.5])
>>> np.sum(w*x)
0.5
```

### おまけ: CUI環境でmatplotlibを使う場合

標準だとグラフを描画しようとして「画面あらへんやんか」と怒られる。

```
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> x = np.arange(0, 6, 0.1)
>>> y = np.sin(x)
>>> plt.plot(x,y)
(省略)
_tkinter.TclError: no display name and no $DISPLAY environment variable
```

[サーバ上でmatplotlibでplotした結果をファイル出力する | mwSoft](http://www.mwsoft.jp/programming/numpy/plot_cui.html) を参考に、ファイルに落とすようにすれば大丈夫。

```
>>> import numpy as np
>>> import matplotlib
>>> matplotlib.use('Agg')
>>>
>>> import matplotlib.pyplot as plt
>>> x = np.arange(0, 6, 0.1)
>>> y = np.sin(x)
>>> plt.plot(x,y)
[<matplotlib.lines.Line2D object at 0x7fcb0656ada0>]
>>> plt.savefig('sinwave.png')
```

sinwave.png (無駄にでかい)
![sinwave.png](https://qiita-image-store.s3.amazonaws.com/0/152552/9791aea8-0fb6-af80-a62c-21efa6ca3ffb.png)

※サンプルコードの元ネタ: [GitHub: oreilly-japan/deep-learning-from-scratch](https://github.com/oreilly-japan/deep-learning-from-scratch)
[SpringBoot]CORS対応で他サイトからのアクセスを許可

#現象
`@RestController`を使ったWebAPIを作成していて、localhostで動作確認するためにjQueryでgetなりpostなりを実行するhtmlファイルを作ってローカル(fileプロトコル）で開いて実行すると、`403 Method Not Allowed`。
GETもPOSTも許可しているはずなのに？と開発者ツールから通信の詳細を見ると、**OPTIONS**メソッドでアクセスしている。
ブラウザによっては何の問題もなく正常に動作しますが、FireFoxやChromeではダメでした。

##原因
なんとなくセキュリティ関係の制限ぽい臭いがします。
というわけでよくよく調べるとやはりモダンブラウザでは別のサイトにアクセスしようとすると、アクセス許可の確認をするようになっているようです。
これはサイトをまたいだアクセス、Cross-Origin Resource Sharing (CORS)と言うそうで。

[HTTP アクセス制御 (CORS) - Mozilla Developer Network](https://developer.mozilla.org/ja/docs/Web/HTTP/HTTP_access_control)

原因がわかれば対策が調べられる、ということでSpring Bootの場合はどうすればいいかを調べました。


#結論
メソッドなりクラスなりに`@CrossOrigin`アノテーションをつける。

[Enabling Cross Origin Requests for a RESTful Web Service - Spring Guide](https://spring.io/guides/gs/rest-service-cors/)

`@RequestMapping`（もちろん`@GetMapping`や`@PostMapping`も）をつけているメソッドに`@CrossOrigin`をつけるだけですね。

``` :こんな感じ
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/")
public class Hoge {

	@CrossOrigin
	@RequestMapping(value="/corstest", produces = "application/json; charset=utf-8", method={RequestMethod.POST,RequestMethod.GET})
	public String hoge() {
		return "OK!";
	}
}
```

上の例のように省略してしまうことも可能ですが、公式ガイドにあるようにアクセス許可する呼び出し元（Origin）を指定すればより安全ですね。


単にCORSと言ってもいろいろとあるようで、こちらの記事も参考になります。
[CORSまとめ - Qiita](http://qiita.com/tomoyukilabs/items/81698edd5812ff6acb34)
Google Cloud PubSubとAWS Kinesis Streamの仕様比較　早見表

2016.12.13時点

|  | Cloud PubSub | Kinesis Stream |
|:-:|:-:|:-:|
|レコードサイズ   | 10MB  | 最大サイズ1MB迄のレコードを登録  |
|信頼性・冗長性   | いくつかのリージョンに跨ってレプリケーションされる。SLA99.95%  | レコードは3重冗長化  |
| 保存期間  | 7日  | 24時間(保管期間は最大7日迄延長可能)  |
| 性能・スケーラビリティ  | Default 10,000 メッセージ/秒<br>リクエストし上限をあげると 1,000,000 メッセージ/秒<br>（Spotify の検証 2,000,000 メッセージ/秒)  | シャードの増減により性能調整が可能（1シャード性能、1秒あたり1000PUT、または1MB/秒） |
|転送セマンティクス|「at least once」|「at least once」|
|暗号化|メッセージの暗号化される|？|
|メッセージ転送の順序|保証されてない|保証。シーケンス番号。|
|subscriber|pull, push|pull|
|料金|17.5 億オペレーション以上 $0.05/million operations <br>各 API 呼び出しが 1 回のオペレーション.64kB|シャード時間 (取得 1 MB/秒、送信 2 MB/秒) $0.015<br>PUT ペイロードユニット、1,000,000 ユニットごと $0.014<br>拡張データ保持期限 (最大 7 日間)、シャード時間ごと	$0.020|

間違ってるところがあれば指摘ください。
enebularの標準INFOMOTION Type（CombinationChart）の使い方

enebularのINFOMOTION Typeはプラグイン化されていて独自に拡張も可能ですが、まずは標準のINFOMOTION Typeの使い方を見ていきます。CombinationChartは棒グラフと折れ線グラフの複合グラフです。

## 初歩デモ準備

[enebular Advent Calendar 2016](http://qiita.com/advent-calendar/2016/enebular)初日の@satton_maroyakaのエントリ、[enebularをつかいはじめる](http://deferloader.blog.uhuru.co.jp/?p=6433)にある[スライド](http://www.slideshare.net/SatoruIshikawa1/enebular-infomotion)を見て準備すると以下のようになります。

![image](https://qiita-image-store.s3.amazonaws.com/0/21109/445a645f-6c80-b36f-510d-3a7b8a095a0e.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/21109/a2aa2068-245e-9e05-cfc6-b457cc0f28aa.png)

今回は標準INFOMOTION TypeのCombinationChart用にランダム発生データを少し変更します。Functionノードを開いて以下のように変更します。

```js
msg.payload = {
    id : "value" + Math.floor(Math.random() * 5),
    value : Math.floor(Math.random() * 100),
    value1 : Math.floor(Math.random() * 100)
};
return msg;
```

## CombinationChart

INFOMOTIONのCreate Graphで以下のような設定でCombinationChartを作成します。`valueBar`と`valueLine`にそれぞれ棒グラフに表示する値と折れ線グラフに表示する値を指定します。

![image](https://qiita-image-store.s3.amazonaws.com/0/21109/a5f1c3ab-70a7-23de-9f78-975f2e02044a.png)

これをLiveモードで開くと以下のようになります。

![infomotion.gif](https://qiita-image-store.s3.amazonaws.com/0/21109/bf7c9a48-965a-d639-bde4-7dde21fb76da.gif)
Paper Plane xUI(PPx)の今までの設定やツール & おわりに

# 設定やツール

[GitHubにて公開しています](https://github.com/wordijp/ppx-tools)

# おわりに

色々ノウハウが溜まっていたのでいつか公開したいなとは思っていたんですが、独自性が強い事もありここ数年ためらっていました、しかし来年で20周年を迎える事もあり思い切ってAdvent Calendarとして公開してみる事にしました。
結果、自分の設定の棚卸をできたのと、記事を書いてるうちに新しい設定を思い付いたりして、書いてみて良かったなと感じています。
全部を埋められたら良かったんですが、僕はプログラマなんでマウスなんかの設定には手を出してないです、ネタ不足ですね、幅広く触れば埋めれたんだろうと思います、良ければ誰か続いてくれたら嬉しいな、とだけ。

ちなみに閲覧数ですが、一日目がこの時点(2016/12/13 19:47)で162viewsです、なんの宣伝もしてませんし、エンジニアは大抵LinuxやMacで環境作ってます、WindowsでPPx使いはレアキャラの部類ですが、もうちょっと欲しいなとは思います。

![views.png](https://qiita-image-store.s3.amazonaws.com/0/51728/95ee9351-7789-3f80-62dc-661a66fa13c6.png)

ただ、自由なカスタマイズは本当魅力的なので、これを機にPPxデビューしてみては如何でしょうか！

作者様のサイト:[TORO's Library](http://toro.d.dooo.jp/index.html)
数学カフェ展示を見て感じたこと

株式会社Preferred Networks(PFN)の大野（@delta2323_）です。

私は仕事で機械学習・深層学習の研究開発を行っており、例えば深層学習フレームワークの[Chainer](http://chainer.org)の開発に携わっています。大学では数学を専攻しており、微分幾何学、特に共形幾何学を勉強していました。
今回はそのような立場から、サイエンスアゴラで数学カフェの皆様が行った展示について、実際に展示を見に行った立場から感想を書きました。また、それに関連する（かもしれない）機械学習に現れる高次元データとその扱いに関する雑談を書かせていただこうと思います。

#経緯

今回のサイエンスアゴラでの出展は、数学カフェの「圏論2」の会（と、その数日前に行われた有志の予習会）で数学カフェの中の人に聞いたのがきっかけで知りました。私自身、幾何学を勉強している中で高次元の曲面をどうにかして絵で書いて直感的に定理などを理解しようとして苦労した経験があったので、高次元の曲面をどのように表現するのかに興味を持ちました。企画・開発などにも参加できれば良かったのですが、都合があわずご協力することができなかったため、せめてもの貢献と思い参加者として見に行かせてもらいました。

余談ですが、大学で一緒に授業を受けていたmiurrorさんがメインの一人として開発しているという事を後で知り、世間の狭さを感じました。

# 当日の展示について

当日実際に拝見して、非常に考えて展示が作られていると感じました（非常に上から目線な言い方で申し訳ありません）。

高次元を曲面を可視化する方法なので、4次元を低次元（2次元・3次元）に射影するのかなというところまでは予想していたのですが4次元方向に微妙にずらした2つのオブジェクトを用意し、視差を用いた「立体視」を行うというところまでは想像がつきませんでした。展示員の方が「4次元の視差を認識する人が現れないか」と話していましたが、残念ながら自分は4次元が浮かび上がることはできませんでした（笑）。

最初は全くどういう動きをするか想像がつかないのですが、コントローラーで操作していると、だんだんどう動かせばどう変形するかがなんとなく想像できるように面白かったです。時々「表」と「裏」が裏返るように見える動きをしたのは個人的には興味深かったです。

今回VRで利用されていたオキュラスリフトは13歳未満の人に使用することはできないので、13歳未満の人には代わりとなる展示物がタブレットで用意されていました。今回のような展示に興味を持つ小学生の人は多いだろうと思いますし、実際サイエンスアゴラには小学生以下の人がたくさん来ていましたので、このような配慮がされていたのは素晴らしいと思いました。

ポスターでは、今回の展示の技術的解説や数学者が高次元データを扱う手法の例としてモース理論の解説などがなされていました。特に驚いた点は、大げさな言い方かもしれませんが、今回の展示を「理論解析」していた点です。今回の立体視にはカメラ画像の解析などでも使われている射影変換が使われています。通常のカメラでは3次元の物体を2次元に射影するのに対し、今回の物体は次元を1つ増やして、4次元を3次元に写す「4次元カメラ」が必要になります。その「4次元カメラ」に必要な（内部・外部）パラメータの数などが考察されていました。

1点残念だったのが、自分がかけていた眼鏡が大きすぎてオキュラスリフトに入らず、眼鏡を外さなければならなかった点です。もっとも、これは展示というよりはヘッドマウントディスプレイ一般の問題なので、展示内容の問題というわけではありません。画面が少しぼやけてしまい、VRを100%で体験できなかったのが惜しかったです。もっと小さい眼鏡を用意してくればよかったです。


# 機械学習での高次元データ

ここからは少し展示内容から外れて、機械学習での高次元データについての雑談を書いていこうと思います。機械学習はデータの中から傾向や法則性を見つけ出し、それら活用して機械に何か賢いことをさせようという技術分野の1つです。

機械学習でデータを扱う際に問題になることの一つとして、データの高次元性があります。例えば画像の分析を考えた場合、画像認識でよく使われている[ImageNet](http://image-net.org/about-stats)というデータセットは、RGB画像が約1400万枚からなるデータセットです。画像の一部（例えば224x224など）をクロッピングして、ニューラルネットなどのモデルに与えることが多く、モデルへの入力次元は数千から数万次元になるのは珍しくありません。

データの分布をどのように分布しているかを解析することは機械学習の興味の1つである、様々な方法でデータの傾向を捉える手法が開発されています。その中の1つがデータを適切な低次元空間に射影するというものです。低次元に射影するのは、可視化が目的な場合もありますし、データに含まれる「ノイズ」を取り除くのが目的な場合もあります（後者の場合、射影する空間は必ずしも2, 3次元とは限りません）。

例えば可視化が目的ならば、主成分分析（PCA）やt-SNEなどの手法が知られています。また、深層学習で利用されるニューラルネットワークの一つにオートエンコーダーと呼ばれるものがあり、それを利用して入力を低次元に落とす方法もあります。

このような低次元射影を行う根拠として、多様体仮説と呼ばれる作業仮説があります。データは高次元の空間内の1点として捉えられるので、データの分布を知るアプローチとして、データ乗っている曲面の性質を調べる方法が考えられます。このようなデータの乗る曲面はデータ多様体などと呼ばれます。多様体と言っていますが、数学での厳密な意味での多様体というよりは、高次元の超曲面くらいの意味で使っているように思います。

自然画像のようなデータセットの場合、データ多様体の次元はそれが埋め込まれている空間の次元に比べてかなり小さいだろうというのが多様体仮説です。前述の主成分積やオートエンコーダーによる低次元射影は、データ多様体をうまく近似する超平面や超曲面を見つけ出すことに相当します。

今は数万次元もの空間を人間は「見る」ことが出来ないので、多様体作業仮説として利用することが多いと思います。今回のサイエンスアゴラの展示は4次元の立体の可視化にフォーカスしましたが、今後手法が開発され、データ多様体を人間が認識する手法が開発されたら面白いと思いました。

# まとめ

今回は、お客として参加した立場から、数学カフェのサイエンスアゴラでの出展物の紹介とその感想をまとめさせていただきました。また、筆者の携わっている機械学習の分野で、データの高次元性に関連する話題をご紹介しました。自分は数学を専攻し、現在は機械学習に携わっている人間ですが、そのようなバックグラウンドを持つ自分にとって、今回の展示は非常に興味深いものでした。
10秒で出来る 画像に簡単モザイク処理

やっと冬っぽくなりましたがみなさんご機嫌いかがですか？
書き手不足のため無理矢理回ってきた非エンジニアmuratakemaです。

技術ネタ縛りって聞きましたがエンジニアではないし、みなさん毎日技術ネタを読むのに疲れてきたころだと思うので、今日は軽い感じで行こうと思います。

さて皆さん！
プレゼンするときKeynoteやPowerPointでスライドを作成すると思いますが、中身やトークはもちろん重要なのでおいといて、同じくらい重要なのが画像！

イメージしやすい画像があると聴衆のレム睡眠率はぐぐっと下がるんで、画像探しの旅に出て数時間彷徨うとかよくあると思います。

とはいえ、画像を使う際には最近話題の引用問題とかの著作権問題だけでなく、自分で撮影した画像でも注意が必要です

え？買った素材しか使った事無いんだけど、とか
秘書に探させてるんで分からないんだけどそんな困るの？　
とか思った人は、今日は眼を休めましょう！明日の投稿を楽しみにしていて下さい！


と言う訳で、誰でも知ってるって噂の自分で撮影した画像にモザイクを掛ける機能をご紹介

#10秒で出来る 画像に簡単モザイク処理

繰り返しになりますが自分で撮影した画像だからって油断してはいけません
・画像に移りこんでしまった人の顔
・プレゼンで使用する目的じゃなく撮影した人物入りの画像
・ビジネス上 写り込んだら困る商品名やロゴ（競合商品とか看板とかね）
とかとか

まあ知り合いなら許可を得たらよいですが
わざわざ確認取るのも面倒だったり、、、
現代科学では説明できないものが写ってたり、、、
そんな時にはWindowsのペイントを使って簡単にモザイク処理しましょう

　
**ではMy画像の中から本日のモデル
鋭利な刃物でやられた感じが美しい高知の人気キャラクター カツオ人間**
![カツオ人間0.jpg](https://qiita-image-store.s3.amazonaws.com/0/151745/8f4e7214-6c1c-c782-4986-5929a33f5a1b.jpeg)
唇とくりくりっとした目がかわいいですよね
考えた人もすごいですがOKだした人もすごいです



こんなかわいい画像を前にして「おまえなあ、さすがにこの切り口は無いだろ・・・」って、嫌な上司あたりから言われた時には心の中でちってつぶやいてペイントを開きましょう


　

１．選択をクリックして、モザイク処理したい範囲を選択します
![カツオ人間2.jpg](https://qiita-image-store.s3.amazonaws.com/0/151745/39016b12-7ad5-dbea-127f-d08637282952.jpeg)




　

２．選択範囲の右下の白いポチのところにドラッグして左上まで持って行きます
![カツオ人間3.jpg](https://qiita-image-store.s3.amazonaws.com/0/151745/7b4feb7b-37f9-42ad-0a3d-22301529996a.jpeg)





　
３．いったんマウスボタンを離して、逆の手順で縮小した画像の右下をドラッグして白ベタの右下まで持って来たらおしまい
![カツオ人間4.jpg](https://qiita-image-store.s3.amazonaws.com/0/151745/7ceba0f7-1603-b67a-7006-b22ec80204e0.jpeg)





ほら　簡単にモザイク処理が終了（ここまで9.7秒）

これで嫌な上司も納得の画像ができあがり！！
※モザイクを掛けた方がグロくなる場合があるので注意が必要です


#最後に
みなさん如何でしょうか？

「うん、知ってる知ってる」
そんな声が各所から聞こえてきそうですが、基本の復習は重要ですからね！
明日からはエンジニアの素晴らしい投稿が再開です！
おったのしみに！！！
IntelliJ Ideaでhtmlデバッグを行うときに出るポップアップを非表示にする

以下の文言のポップアップを非表示にする方法です。

Page 'http://~~~' requested without authorization, you can copy URL and open it in browser to trust it.

![スクリーンショット 2016-12-13 19.27.11.png](https://qiita-image-store.s3.amazonaws.com/0/88331/c5439143-c692-14ac-4408-c4736b97dc24.png)

OKを押して、完了です。

これでウザいポップアップに悩まされなくて済みます。

参考：[Page requested without authorization](https://intellij-support.jetbrains.com/hc/en-us/community/posts/207120569-Page-requested-without-authorization)
1分でざっくり掴むのスクラムメモ

# 役割
プロダクトオーナーと、開発チームと、スクラムマスターがある
### プロダクトオーナー
 - 開発チームの作業とプロダクトの価値の最大化に責任を持つ
 - プロダクトバックログの管理に責任を持つ
 - プロダクトバックログの見える化し、チームの次の作業を示す
 - 開発チームはプロダクトオーナー以外から作業依頼を受けてはいけない
 - おおよそのリリース計画を立てる

### 開発チーム
 - リリース判断可能な完成したプロダクトを開発する

### スクラムマスター
 - メンバーが成果を上げるために支援を奉仕をするリーダー
 - 開発チームの進捗を妨げるものを排除する

# 会議
スプリントプランニングと、デイリースクラムと、スプリントレビューと、スプリントレトロスペクティブがある

### スプリントプランニング
- 今回のスプリントの目標(スプリントゴール)を設定
   - プロダクトオーナーは何を欲しいのか
   - 開発チームはどれくらいでできそうか 
- タスク(スプリントバックログ)の洗い出し
   - 開発チームはそれをどうやって実現するか

### デイリースクラム(朝会)
 - 昨日何やった共有
 - 今日何やる共有
 - なんか詰まってる共有
  
### スプリントレビュー
 - プロダクトオーナーが成果物をレビュー
 
### スプリントレトロスペクティブ
 - 次のスプリントでの改善点を話し合う

# 参考
- http://www.scrumguides.org/docs/scrumguide/v1/Scrum-Guide-JA.pdf
- https://www.amazon.co.jp/SCRUM-BOOT-CAMP-BOOK-%E8%A5%BF%E6%9D%91/dp/4798129712
[C++/CLI] DataGridViewとXML読み込み、保存

DataGridViewとその情報のXML読み込み保存が
手順がややこしいけどすぐ実装できるのでメモ

#1.画面作成
DataGridViewを追加
DataSetを追加
	DataSetは、型指定の無いデータセット

![clip00.jpg](https://qiita-image-store.s3.amazonaws.com/0/77041/c9b5981a-349b-0f6c-4068-9085e9ac8c9c.jpeg)

![clip01.jpg](https://qiita-image-store.s3.amazonaws.com/0/77041/672996eb-c3bb-e7e7-4943-a618e8256b0e.jpeg)

#2.データ形式設定
##DataSetにテーブルを追加。
	プロパティ→Tables（コレクション）を編集
		追加でTable1を追加

	Table1のカラム追加
		編集したい情報を追加していく
		Column1
			ColumnName = check
			DataType = System.Boolean
		Column2
			ColumnName = name
			DataType = System.String
		Column3
			ColumnName = test

![無題.jpg](https://qiita-image-store.s3.amazonaws.com/0/77041/903eb146-ef52-5ef0-7021-0f9b17d70968.jpeg)


##DataGridView1とDataSet1の関連付け
	DataGridView1のプロパティ
	DataSource = dataSet1
	DataMember = Table1
![clip02.jpg](https://qiita-image-store.s3.amazonaws.com/0/77041/2a06c533-c9c3-8a2a-2628-429bdff34646.jpeg)



#3.XML読み書き
##XML保存
	dataSet1->WriteXml("test.xml");
	
##XML読み込み
	dataSet1->Clear();	//	ReadXMLは追記なので一旦消す
	dataSet1->ReadXml("test.xml");

##要素取得
	auto tbl = dataSet1->Tables["Table1"];
	for(int i = 0; i < tbl->Rows->Count; ++i)
	{
		auto item = tbl->Rows[i];
		MessageBox::Show(
			item->ItemArray[0]->ToString() + "/" +
			item->ItemArray[1]->ToString() + "/" +
			item->ItemArray[2]->ToString() );
	}

![clip03.jpg](https://qiita-image-store.s3.amazonaws.com/0/77041/c8f563cc-45bd-adca-3ab0-968df7117db6.jpeg)

#その他
##サンプルソース
https://github.com/mamesiva64/DataGridViewTest
AVRマイコンとV-USBで作るUSBデバイス

# はじめに

「AVRマイコンとV-USBで作るUSBデバイス」を書いたのでここにリンクを張っておきます。

- [AVRマイコンとV-USBで作るUSBデバイス](https://sites.google.com/site/vusbprojects/)

## 概要

V-USBとはAVRマイコンの任意のデジタルポート二つを使ってD+,D-の差動信号を発生させ、擬似的にAVRマイコンをLow-speed USBデバイスにするというものです。

V-USBのソースの中身を見るとアセンブラでポートをパタパタさせているようです。

arduinoでもV-USBを使ってUSBデバイスを作れると思いますよ。

arduinoにV-USBファームを書き込むには、USB経由ではなくSPI書き込み機でプログラムを書き込む必要があります。一応、arduinoにもプログラム書き込み用SPIピンが6本引き出されています。

## 動作例

Windows XPからサーボモーターを動かしてみました。(約10年前か。。）
[Servo Control by ATmega168, V-USB, and libusb-win32](https://youtu.be/NLM8vs8GXHU)
<iframe width="560" height="315" src="https://www.youtube.com/embed/NLM8vs8GXHU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## リンク

元のサイト
https://www.obdev.at/products/vusb/index.html

---
2021-04-12　19:55
tweepyでツイッターのキーワード検索して、結果をエクセルに書き込む

tweepyでツイッターをキーワード検索して、結果をエクセルに書き込む処理を作ったのでメモしておく。

以下を参考。
http://statsbeginner.hatenablog.com/entry/2015/10/21/131717
http://kasoutuuka.org/twitter-tweepy
http://qiita.com/Kamo3167/items/b13531938a68234f19bf
http://kivantium.hateblo.jp/entry/2015/01/03/000225


## ソース
```
# -*- coding:utf-8 -*-

import tweepy
import datetime
import xlsxwriter

#keyの取得
CONSUMER_KEY = '****************'
CONSUMER_SECRET = '****************'
#OAuthHandlerクラスのインスタンスを作成
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
ACCESS_TOKEN = '****************'
ACCESS_SECRET = '****************'
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)

# OAuth認証
api = tweepy.API(auth)

wb = xlsxwriter.Workbook('tweet.xlsx')
ws = wb.add_worksheet("teet")

# エクセルヘッダの作成
format = wb.add_format()
format.set_num_format('yy/mm/dd')
ws.write(0, 0, "name")
ws.write(0, 1, "user name")
ws.write(0, 2, "tweet")
ws.write(0, 3, "create date")

i = 1
# twitter内を検索し、結果をエクセルに書き込む
for status in api.search(q='"アイカツ"', lang='ja', result_type='recent',count=100):
    ws.write(i, 0, status.user.name)
    ws.write(i, 1, status.user.screen_name)
    ws.write(i, 2, status.text)
    ws.write(i, 3, status.created_at+ datetime.timedelta(hours=9),format)
    i = i + 1
wb.close()
```

## 結果
こんな感じで名前とユーザ名とツイートと投稿日をエクセルに書き込む。
![image](https://qiita-image-store.s3.amazonaws.com/0/150939/029b6228-0188-1d35-65f2-1724ac8b98a5.png)


## tweepyでコーディングする前にやっておくこと

- ツイッターアカウントを作成する（当然）
- [Twitter Application Management](https://apps.twitter.com/)でアプリケーションを登録する

Twitter Application Managementで登録するんだけど、Websiteが必須だけどそんなもの使わないので、適当なURL入れておけばOK。

![image](https://qiita-image-store.s3.amazonaws.com/0/150939/14f09ffe-165e-f9f3-a02b-1951c109c988.png)

登録するときの注意点としてはツイッターアカウントに**電話番号が必要**という点。
でもって電話番号を登録するときに、電話番号とSMSに送信された6ケタの番号を入力するんだが、そこで電話番号も6ケタの認証番号もあってるのに登録できなかった。

原因は電話番号の頭の0をつけているから。090-XXXX-YYYYなら90XXXXYYYYでなければならない。
http://qiita.com/tk1024/items/644ead20793a6e869b83

アプリケーションを登録できたら以下をメモしておく

- Consumer Key (API Key)
- Consumer Secret (API Secret)
- Access Token
- Access Token Secret

## tweepyでコーディング

コーディングと言っても上記でメモしたkey情報でOAuth認証するくらいなので、検索のところだけ。

`api.search(q='"アイカツ"', lang='ja', result_type='recent',count=100):`
この処理はツイッターで「アイカツ」をキーワード検索して、抽出は日本の地域に絞る。最新のツイート100件を取得するというもの。

tweepyの仕様上、取得ツイート数の上限は100なので、101とかやっても100しか取得できない。

細かい設定については以下を参照。
https://syncer.jp/twitter-api-matome/get/search/tweets


## 雑感
取得ツイート数の上限が100なので、これを使って分析は難しいかなという印象。
実装自体は簡単だし、ツイートの取得のほかにツイート自体もできるので自動ツイートとかそういうのに使えたらいいのかなー。
[Qiitaのバグ] ブラウザの戻るで右上の通知が更新されない


# 再現方法
## 1. 右上の通知が未読の状態で、通知一覧を確認して、すべてを既読にします
![スクリーンショット 2016-12-12 20.55.45.png](https://qiita-image-store.s3.amazonaws.com/0/74551/ea3522b4-8e75-cb3b-fc37-43075e02f186.png "スクリーンショット 2016-12-12 20.55.45.png")

↓

![スクリーンショット 2016-12-12 20.55.58.png](https://qiita-image-store.s3.amazonaws.com/0/74551/b242c87a-ed23-6535-7dec-584f9685e6d5.png "スクリーンショット 2016-12-12 20.55.58.png")

↓

![スクリーンショット 2016-12-12 20.56.08.png](https://qiita-image-store.s3.amazonaws.com/0/74551/5d2e26ef-ce5c-1cdb-a6f4-f9913846f31e.png "スクリーンショット 2016-12-12 20.56.08.png")

## 2. 適当な記事のリンクをクリックします

## 3. ブラウザの戻るボタンで前のページに戻ります
![スクリーンショット 2016-12-12 20.56.30.png](https://qiita-image-store.s3.amazonaws.com/0/74551/4e6db413-237a-6d08-2d96-01241aedf9d8.png "スクリーンショット 2016-12-12 20.56.30.png")

通知が未読に戻ってる！！！！

新たにLIKEされたのかと思って喜んで開くと、このバグだった時には悲しくなります。
Cognos 8 BIのマニュアルリンク

最近問い合わせを受けたので、取りあえず。

Cognos 8.4や8.4.1のマニュアルのリンクですが、現役時代に使われていたKnowleadgeCenterのリンクは切れてしまっているようです。

こちらのリンクからアクセスし、目次の表示を選択して頂ければ、大部分のCognos BI 8.4.1のドキュメントは参照できるようです。
困っている方がいるかもと思い、小さな話ですが共有まで。
http://www.ibm.com/support/knowledgecenter/ja/SSEP7J_8.4.0/com.ibm.swg.im.cognos.c8bi.doc/welcome.html


![image](https://qiita-image-store.s3.amazonaws.com/0/147246/4a67f835-1dbb-5921-2725-f84452b43f42.png)
Cognos TM1で監査ログに出力されない変更を監査するTips

Cognos TM1に監査ログの機能があり、ユーザーのログインやCubeなどのオブジェクトの変更操作をログできると思いますが、監査ログにログされるものもあればログされないものもあります。
そんな時に、あきらめずにログできるものもあるというTipsです。

監査ログに出力できるものとして、以下のようなエントリーの変更や、セキュリティーの変更などもログをされます。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/a00540a7-eb4c-9703-4886-9c7e10951ff1.png)

しかしながら、例えば「機能の割当」などのセキュリティー変更がログされるかというと、
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/d4d7a661-4b39-f43e-1cc3-bde60814edc0.png)

とりあえず、あるグループに対する「Consolidation TypeIn Spreading」の権限を「拒否」にしてみます、
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/e7ddc8ea-1db3-fff3-d73c-aabd50d3b4a1.png)

監査ログを表示してみると、以下のように「機能の割当」の変更はログされていません。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/50eab249-6c85-38ef-16d0-e4404aa77365.png)

こんな時にあきらめずに、トランザクションログである、tm1sYYYYMMDDhhmmss.logを見てみましょう。
以下の太線の箇所のように、先ほどの操作がコントロールキューブへの変更としてログされているものがあります。

\#LOG_FORMAT=1
\#LOGID=A
**"","20161213093318","20161213093318","Admin","S","","DENY","}Capabilities","Consolidation TypeIn Spreading","EXECUTE","10110",""**
\#"","20161213093455","CubeSerialized: }Capabilities: by *"
\#"","20161213093455","CubeSerialized: }CubeProperties: by *"
\#"","20161213093455","CubeSerialized: }DimensionProperties: by *"
\#"","20161213093455","CubeSerialized: }ElementAttributes_}Cultures: by *"
\#"","20161213093455","CubeSerialized: }StatsByChore: by *"
\#"","20161213093455","CubeSerialized: }StatsByClient: by *"
\#"","20161213093455","CubeSerialized: }StatsByCube: by *"
\#"","20161213093455","CubeSerialized: }StatsByCubeByClient: by *"
\#"","20161213093455","CubeSerialized: }StatsByProcess: by *"
\#"","20161213093455","CubeSerialized: }StatsForServer: by *"


というTipsでした。



Node.jsでhttps通信をするときに中間証明書を指定する方法

この記事は諸事情により、[このリンク先](https://sublimer.hatenablog.com/entry/2016/12/13/000000)に移行しました。
This article has moved to [this link](https://sublimer.hatenablog.com/entry/2016/12/13/000000) due to various reasons.
何も知らない人のための神経細胞

この講座も第3弾になりましたので，いよいよAIの中身に入っていきましょう．
なおこの講座では，以前から予告してある通り，機械学習，その中でもニューラルネットワークを取り上げますので悪しからず．

#今だから求められるAI
そもそもなぜAIが最近急激に流行るようになったのか？
最も大きな理由は，この情報社会の発達にあります．

技術や計算機（コンピュータ）の能力が向上したことにより，私たちは**大量の情報（ビッグデータ）**を簡単に生産できるようになりました．
（ex. 昔は天気を観測するとき，せいぜい温度計と湿度計と気圧計程度でしたが，今なら高度な観測システムが構築されていますし，人工衛星からの画像も利用できます．）

またさらに，インターネットが普及し，ビッグデータは簡単に共有されるようになりました．

こうしたデータは今まで人の手で解析されてきましたが，そのリソースには限界があることに加え，人の常識を超える解析がなかなかできないという欠点があります（人の常識とは，今までの知識に基づいた因果関係などです）．

だからこそ，コンピュータを使わないとできない解析が求められているーーそれが，AIが持て囃される最大の要因です．

実際，AIの心臓である機械学習の研究は1980年代にすでに行われていました．
ところがほとんど表に出なかった．当時は早すぎたのです．
コンピュータを思う存分利用する土台が揃い，新しいコンピュータの姿を求められたとき，突然当たったスポットライトーーそれがAI，機械学習なのです．

#機械学習
AIを支えている大きな技術に**「機械学習(Machine Leaning)」**があります．
ヒトと同じような高い学習能力をコンピュータで実現する技術です．

これを用いると，私たちヒトが経験を積み重ねていきながら世の中のルールを学習していくのと同じように，コンピュータは与えられたデータから規則を見つけていくことができます．
この機械学習こそ，音声，言語，画像といった様々なデータを「知識」として蓄え，「知恵」を弾き出す人工知能の心臓となるのです．

また機械学習のうち，ヒトの神経細胞の仕組みにヒントを得て造られた**「ニューラルネットワーク（Neural Network）」**を利用し，深く深く学習していくことを**「深層学習（Deep Learning）」**と言います．

#ヒトの脳の仕組み
「ニューラル」とは，「神経の」という意味です．
というわけでまず，ヒトの脳がどのような仕組みで動いているかをご説明しましょう．

脳は**神経細胞**の集まりです．
神経細胞はこのような形をしています（超デフォルメ済）
![image4.JPG](https://qiita-image-store.s3.amazonaws.com/0/125896/127b7fae-e0f2-4170-0b47-d8a6f0356bc5.jpeg)

この**細胞体**に何らかの刺激が加わる（**興奮する**）と，**電気信号**が**軸索**を伝わり，**軸索末端**に到達します．
![image3.JPG](https://qiita-image-store.s3.amazonaws.com/0/125896/be84d972-85b9-a3ce-d6d7-2d953e6cde06.jpeg)

軸索末端は他の細胞の**樹状突起**と繋がっていて，信号を次の細胞につないでいきます．
この連結部分を**シナプス**と言います．
このようにして，神経細胞同士が繋がり合い，ネットワークを形成しています．これが脳の正体です．
![image1.JPG](https://qiita-image-store.s3.amazonaws.com/0/125896/adae6dde-8712-3e69-99d6-20295a88ecf1.jpeg)
神経細胞の興奮は，シナプスにおいて，**軸索末端→樹状突起方向のみ**伝搬していきます．

軸索末端と樹状突起はべったりとくっついているのではなく，ごくごくわずかな隙間（**シナプス間隙**）が開いています．
軸索末端に信号が到達すると，末端の先から**神経伝達物質**が分泌され，樹状突起にある**受容体**に向かいます．
そして神経伝達物質が受容体に**結合**したとき，細胞体に刺激が伝わっていくのです．
逆方向に伝達することはありません．

第一のミソは，この**信号は一方向にしか伝わらない**という点です．
神経細胞は相互にやり取りしているのではなく，**情報の発信先と受信先が分かれている**のです．

第二のミソは，**閾値**の存在です．
![image2.JPG](https://qiita-image-store.s3.amazonaws.com/0/125896/f214c0dd-215a-ab4b-5919-6d6b7e8bbe8e.jpeg)

神経細胞は，**興奮している，興奮していないの二つの状態しかありません**．
なんとなく興奮しているとか，ちょっと興奮しているとか，めちゃめちゃ興奮しているとか，そういうのは**ありません**．
神経細胞はそれぞれ**閾値**を持っており，**刺激の量が閾値を超えたときだけ**興奮するようになっています．


#ニューラルネットワークの仕組み
それでは，機械で脳を実現する「ニューラルネットワーク」について見ていきましょう．
ニューラルネットワークにおける神経細胞はこちらです．
![図1.jpeg](https://qiita-image-store.s3.amazonaws.com/0/125896/6567e609-9e49-75cc-940c-ea13ac000fd3.jpeg)
これを**パーセプトロン**と言います．
神経細胞と同じように，
- 入力と出力先がそれぞれ存在する
- 閾値を超えたときだけ興奮する（興奮時に1，非興奮時に0を出力する）．
性質を持っています．

これがつながると・・・
![図2.png](https://qiita-image-store.s3.amazonaws.com/0/125896/2c425698-76a9-58f1-8bed-641996aeb59b.png)
パーセプトロンが層状に並んでいます．この一つ一つを**「層（Layer）」**と言います．

人間の神経細胞は軸索を一本しか持ちませんが，パーセプトロンは次の層の（大抵）全部のパーセプトロンと繋がっています．
これによって複雑な関数を表現することができます．

次回の講座では，このパーセプトロンをどのように実現するかを紹介したいと思います．
【UIScrollView】Autolayoutで横スクロール【Xcode8.x】

## 1.作業領域の拡大
まずは作業しやすいように枠の縦を伸ばします。simulated sizeを「freeform」にして、widthを設定。今回はiPhone6sの枠を下地に使ってます。 
<img width="1628" alt="0.png" src="https://qiita-image-store.s3.amazonaws.com/0/151314/64d41325-fea0-ff14-c4a0-fb91830367bd.png">

## 2.ScrollViewの設定
今回は`pin`で上・左右を画面いっぱい、`height`を300で設定しています。
<img width="1638" alt="0_5.png" src="https://qiita-image-store.s3.amazonaws.com/0/151314/6535593f-273d-8f85-693c-deed1947d2aa.png">

## 3.コンテンツビューの設定
ScrollViewの上にUIView（以降コンテンツビュー）を配置します。制約は`pin`でScrollView内で上下左右いっぱいになるように、そして**スクロール方向に固定値を与えます**。今回はwidthに700を設定しています。heightは300を固定で設定しても良いですが、レスポンシブに備えて、ScrollViewと`Equal Height`を設定します(図②)。
<img width="1634" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/151314/baba8a21-8622-ac59-0c9d-18a1eb81fd0c.png">
分かりやすいように背景を黄色にしています。

## 4.コンテンツビューに部品を配置
制約エラーがなくなったところで、コンテンツビューに部品を配置していきます。今回はラベルをひとつだけ置いています。「← →」
<img width="1629" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/151314/a34822e4-e140-efc4-f241-d1db8fa4a5dc.png">

## 5.確認
![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/151314/88aeb432-34c8-14c3-62e0-34c81854c7d0.gif)

###### [縦スクロールはこちら](http://qiita.com/fromage-blanc/items/d480f2a45f0f60474531)
Laravelでgeometry型を扱う場合のマイグレーション、ミューテータ、アクセサについて

Laravelでgeometry型を扱う場合のマイグレーション、ミューテータ、アクセサのサンプルコードを紹介したいと思います。
参考にしたのは以下のページです。
[GEO Spatial MySQL in Laravel 5](https://www.codetutorial.io/geo-spatial-mysql-laravel-5/)

上記ページでは、位置情報をpoint型で登録する場合です。
point型ではなく、geometry型で運用したい場合に、上記ページのサンプルコードをどう変更すればよいかを紹介したいと思います。
##マイグレーション
以下のサンプルコードのSchma::create()の後に実行しているDB::statement()がポイントです。

```Item.php
public function up()
{
	Schema::create('items', function($table)
	{
		$table->increments('id');
		$table->string('title');
		$table->timestamps();
	});
	DB::statement('alter table items add location geometry' );
}
```

Laravel標準のSchema Builderには、point型やgeometry型のカラムを定義する術がないので、上記のように、一度テーブルをcreateした後にalter table文でgeometry型のカラムを追加します。geometry型に関わらず、Schema Builderに用意されていない型のカラムを用意したい場合はこの方法で追加できます。
参考までにLaravelのSchema Builderのページを。
[Schema Builder - Laravel - The PHP Framework For Web Artisans](https://laravel.com/docs/4.2/schema)

##アクセサとミューテータ
説明は後述しますがまずはサンプルコードです。

```Item.php
class Item extends Model
{
	protected $geofields = array('location');

	public function setLocationAttribute(array $value)
	{
		$this->attributes['location'] = DB::raw("(GeomFromText('POINT(" . $value['lat'] . " " . $value['lng'] . ")'))");
    }

    public function getLocationAttribute(string $value)
    {
		$value = substr($value, strlen('POINT('), strlen($value) - (strlen('POINT(') + 1));
		$value = explode(" ", $value);
		$ret = [];
 		$ret['lat'] = $value[0];
		$ret['lng'] = $value[1];
		return $ret;
    }
 
    public function newQuery($excludeDeleted = true)
    {
		$raw='';
		foreach($this->geofields as $column){
			$raw .= ' astext('.$column.') as '.$column.' ';
		}
 
        return parent::newQuery($excludeDeleted)->addSelect('*',DB::raw($raw));
	}
}
```

上記はあくまで実装例ですが、上記のようなミューテータ(setLocationAttribute())を実装すると、利用側からは、緯度と経度の配列を渡す事でgeometry型のカラムに正しい値を登録出来ます。
上記コードの場合だと、以下のような感じで設定すればOKです。
`item->location = ['lat' => 34.6835522,'lng' => 135.4976581];`
ミューテータで、上記で設定された文字列を、MySQLのPOINT関数とGeomFromText関数でgeometry型のカラムに登録します。

取得の際は、もう一手間必要でして、まずはnewQuery()というメソッドで、位置情報を登録しているカラム名と同名で、MySQLのastext関数を使って取得できるように仕込んでおきます。
このようにすると、ミューテータに渡した文字列が取得できるようになります。いや、正確には、GeomFromText関数に設定した引数なので、"POINT(緯度 経度)"の形ですね。
ですので、アクセサ(getLocationAttribute())では、この文字列から「POINT(」と「)」をsubstrで取り除いた文字列を元に、配列を生成して返却しています。

というわけで今回は以上です。
batsでパイプを使うときの注意点

# 概要

```
run wget http://localhost -O - | grep Hoge
```

Hogeが返ってきているのだが、エラーになっているのでどうしてなのか調べた。

# 結論

```
run bash -c "wget http://localhost -O - | grep Hoge"
```

run が１つのコマンドななので、run まで実行した結果が grep にわたるということのようだ

# 参考

以下を読むと色々わかる。

* [Pipe does not work in the test · Issue #10 · sstephenson/bats](https://github.com/sstephenson/bats/issues/10)
Powershellコマンド集

ずっとPowerShellを知らずにコマンドプロンプトを使ってWindows機器の調査などしてきたが、Powershellを知ってから一気に調査の幅が広がった。Linuxを経験してきた僕に取っては（コマンドプロンプトに比べて）PowerShellの方がずっと直観的にできるので、ずっと良い。

コマンドプロンプトのコマンド集は下記参照。
[Windows コマンドプロンプトの調査で良く使うコマンドまとめ](http://qiita.com/ShotaKameyama/items/9c71c264b7281e25ad83)

## 基本関連

### ディレクトリ移動(cd又はドライブ指定)

```
cd ディレクトリ
```

```
C:
```
Cドライブへ

```
D:
```
Dドライブへ

### 現在フォルダの把握（pwd)

```
pwd
```

### ファイル一覧取得(ls)

```
ls
```

### コマンド一覧取得(get-command)

```
get-command
```

### ファイルを開く(cat)

```
cat test.txt
```

### ヘルプ(help)

```
help get-command
```


## ネットワーク関連

### ピング(ping)

```
ping google.com
```

### tracert

```
tracert google.com
```

### IPアドレス情報取得(ifconfig)

```
ifconfig /all
```

### グループポリシーアップデート(gpupdate)

```
gpupdate /force
```

## 対象デバイス関連

###　ユーザー名取得

`[System.Security.Principal.WindowsIdentity]::GetCurrent().Name`

参照元: [PowerShellで現在のユーザやグループなどのID情報を取得する方法](http://yomon.hatenablog.com/entry/2014/11/15/234529)


### ホスト名取得(hostname)

```
hostname
```

### MACアドレス取得(getmac)

```
getmac
```

システム情報一覧(systeminfo)

```
systeminfo
```
ただし、表示に時間がかかる。

### OS/BIOS取得(syteminfo)

```
systeminfo | findstr /C:"OS Name"
```

### WindowsUpdate表示

```
control /name Microsoft.WindowsUpdate
```

### アプリ管理（追加、削除）表示

```
appwiz.cpl
```

### 現在日時(date)

```
date
```

## Wi-Fiの設定関連

### 基本コマンド(netsh)

```
netsh wlan
```

様々なコマンドがあるので、詳細なコマンドは別途

### あるプロファイルの設定を見る

```
netsh wlan show profile name="guest-WiFi"
```

### あるプロファイルの設定のためのプロパティ情報一覧を取得

```
netsh wlan set profileparameter
```

### 例）プロファイルのキャッシュ設定をオフにする

```
netsh wlan set profileparameter name=guest-WiFi cacheUserData=no
```

### プロファイルの設定をエクスポートする

```
netsh wlan export profile name=guest-WiFi folder="C:¥"
```

### プロファイルの設定をインポートする

```
netsh plan add profile filename="C:¥Wi-Fi-guest-WiFi.xml"
```

コマンドは随時更新予定
Unitテストでメンバー変数の内容をチェックする


# メンバー変数の内容を確認する
org.mockito.internal.util.reflection.Whiteboxを使用する
コード例:
以下の例では、pオブジェクトのメンバー変数：passwordの値が、"hogehoge"であることを確認している。

```
assertThat((String)Whitebox.getInternalState(p, "password"), is("hogehoge"));
```

__Mockito 2.xではWhiteboxは、廃止された。__
__Reflectionを使用したほうが良いかも__

```
Field f = Hoge.class.getDeclaredField("password");
f.setAccessible(true);
assertThat((String)f.get(p), is("hogehoge"));
```
備忘録_環境変数_自分用メモ


コピペでどうにか生きてきたけど自分用に知識の整理

環境変数とは「シェル環境を設定するための変数」

## 環境変数を表示

```
$ printenv [変数名]
```

変数を指定せずに実行すると環境変数の一覧を表示する

## 環境変数の設定

環境変数を設定する際には`export`コマンドを使用

```
$ export [変数名]
```

```
// 変数の定義と設定を同時に指定
$ export [変数名]=[文字列]

// 上記サンプル
$ export TESTENV="test"
```

## 環境変数をクリアする

```
$ unset [変数名]
```

## 環境変数PATH

環境変数PATHにはコマンドの保存先を指定

### コマンドのパスを通す

自作でコマンドを作成した場合に「コマンド名」だけで実行したい場合などはパスを通す必要がある。
環境変数`$PATH`に対象のコマンドが入っているディレクトリを追加する

以下サンプルプロセス
※~/bin のディレクトリに自作コマンドが入っているという前提

```
// 環境変数PATHにディレクトリを追加
$ PATH=~/bin:$PATH

// exportを使用して環境変数に指定
$ export $PATH
```

注) 環境変数にディレクトリを追加する際に下記のようにすると元の内容が上書きされカオスになる

```
// 上書きされる...
$ PATH=~/bin
```

***必ず「:$PATH」をつけるように!!!***

####補足

$PATHに複数のディレクトリが格納されている場合は、最初のディレクトリが優先される。
同じ名前のコマンドがある場合などにこれを理解していないとうまく設定されない。

```サンプル
// ~/binが先頭に格納され最優先になる
$ PATH=~/bin:$PATH

// ~/binが最後に格納され優先順位が下がる
$ PATH=$PATH:~/bin
```

## 設定ファイルに追記(.zshrcや.zsh_profileなど)

`export`してもシェルをログアウトしてしまうと設定が消えてしまう。
毎回`export`をするというの現実的ではないので「設定ファイルに追記(.zshrcや.zsh_profileなど)」する


##環境設定ファイルの動作を確認する

環境変数はログインしなおすことで確認できます。
しかし、設定が失敗していた場合ログインさえできなくなるので通常は下記のコマンドを使用する

```
// 基本形
$ source [ファイルのパス]

// ~/.zshrc(zshの設定ファイル)を読み込ませる
$ soure ~/.zshrc
```
Xcode8.2でのアプリ審査について

2016/12/13現在、下記stackoverflowにあるようにリジェクト喰らいます。

Invalid Binary after Xcode 8.2 Update
http://stackoverflow.com/questions/41113750/invalid-binary-after-xcode-8-2-update

※コメントで笑えます

※2016/12/21 Xcode 8.2.1 がでました。
試してはいませんが、もしかしたらバイナリーも申請通るようになってるのでしょうか？
http://ameblo.jp/plus2222/entry-12230267868.html

 イケるかどうか知りたいです！

※2017/01/05 Xcode 8.2 (8C38) でも申請が通るようになってるみたいです!
[gulp] とにかくこれがあればイケる。チーム内で使いまわす汎用的なgulpのプラグイン。


とりあえずこれさえあれば、何も考えずに作業開始ができるものまとめ。

## 汎用的でチーム内で使いまわす汎用的なgulpプラグイン

| プラグイン名 | 機能 | npmサイトリンク |
|:----|:------|:-------|
| coffee-script | gulpfileをcoffeeで書くためのもの <br> (gulp v3.8からデフォルトでcoffeeに対応した？らしい。けどバージョンの差分吸収のために入れる) | https://www.npmjs.com/package/coffee-script |
| browser-sync | ブラウザのオートリロード | https://www.npmjs.com/package/browser-sync |
|run-seqence|gulpタスクの順番を決める。 <br> gulpはデフォルトで並行処理なので、jsの結合なんかでひつようになってくる。|https://www.npmjs.com/package/run-sequence|
| gulp-load-plugins |  package.jsonにある"gulp-"で始まるプラグインを一括ロード。gulpfileの記述が少なくて済む | https://www.npmjs.com/package/gulp-load-plugins |
|gulp-watch|これがないと始まらない。ファイル監視|https://www.npmjs.com/package/gulp-watch|
| gulp-plumber | gulp wacthでエラーになってもgulpを走らせ続ける | https://www.npmjs.com/package/gulp-plumber |
|gulp-postcss| ブラウザのシェアやcssの対応状況でプレフィックスとかの書き出すｃssを調整する。 |https://www.npmjs.com/package/gulp-postcss|
|autoprefixer|上記のgulp-postcssの拡張プラグイン。プレフィックスの調整。|https://www.npmjs.com/package/autoprefixer|
| gulp-sass | sass。ruby-sassじゃなくてnode-sass | https://www.npmjs.com/package/gulp-sass|
|gulp-coffee|coffeescriptのコンパイル|https://www.npmjs.com/package/gulp-coffee|
|gulp-uglify|jsの圧縮| https://www.npmjs.com/package/gulp-uglify |
|gulp-concat| jsの結合。最近のjsは機能やページごとに分けるほうが良いとか言われてるけど、だいたい結合しちゃう | https://www.npmjs.com/package/gulp-concat |

rubyは使わない方向性です。
エラーとかlinter系はエディタ側で吸収するほうがスキです。


---
## 個人的に使いたいプラグインのためにrequire-dir
slimとかtypescriptとかphpとか使うときがあるけれど、共通のgulpfile.coffeeに記述があるとややこしいので、最終的には[require-dir](https://www.npmjs.com/package/require-dir)を使って、自分用gulp設定とわけたい。
require-dirはconfigfileをプラグインごとに作成して自分用にカスタマイズできるいいかんじのツールですが、気をつけないとgulp-load-pluginsとバッティングします。かなしいね。


### 個人的gulpではやらないこと
* 文法チェック ← エディタでlinterをつかう。
* 画像の軽量化 ← 結合はさせても軽量化はphotoshopとかで行う。
* バージョン管理に干渉 ← こわい。
teeコマンドでloggerと標準出力両方に出力する


```
$ echo "hoge" | tee >(logger -t test)
```

参考: [shell - How can I use tee and logger -t "some tag:"? - Unix & Linux Stack Exchange](http://unix.stackexchange.com/questions/82581/how-can-i-use-tee-and-logger-t-some-tag)
sorcery の external モジュールで facebook の OAuth 認証においてメールアドレスが取得できない場合の対応

# 概要

sorcery https://github.com/Sorcery/sorcery は Rails アプリケーションに認証ロジック機能を付加するgemです。

通常のID/パスワード認証に加え、OAuth 認証も可能です。

# 問題

facebook の外部プロバイダに :facebook を加えることで facebook での認証が可能ですが、この際にマニュアル通りに以下のscopeを加えても email を取得することができません。

```config/initializers/sorcery.rb
config.facebook.access_permissions = %w(email)
```

# 原因と解決法


```config/initializers/sorcery.rb
config.facebook.access_permissions = %w(email)
config.facebook.user_info_path = 'me?fields=email,id,name'
```

最近のバージョンのAPIでは fields パラメータを用いて取得する情報を明示的に指定する必要があるため、ユーザー情報取得部分を変更することで、メールアドレスの取得ができます。


# 参考

[2015年7月9日以降にFacebook認証でメールアドレスが取れない問題とその対策](http://paiza.hatenablog.com/entry/2015/07/22/2015%E5%B9%B47%E6%9C%889%E6%97%A5%E4%BB%A5%E9%99%8D%E3%81%ABFacebook%E8%AA%8D%E8%A8%BC%E3%81%A7%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%8C%E5%8F%96%E3%82%8C%E3%81%AA%E3%81%84)

[該当のIssue : Facebook Graph API now requires field spec for /me requests #703](https://github.com/NoamB/sorcery/issues/703)
Doorkeeper gem でOauth認証できるアプリケーションを作った後の事

# DoorkeeperでOauth認証を作ろう

deviseでもoauthはあるんですが、某人曰く「アレはダメだ」とのこと。
特にAPI経由でoauth認証させよう！とかってことであればdoorkeeperを導入するのは良かった。

## インストールや使い方

あ、割愛ですー。
(gem install doorkeeperとかやれば良いよ)

http://localhost:3000/oauth/applications
こんな感じのURLでoauth認証用のアプリケーションが出来上がるザンス。

## doorkeeperの導入後のoauth認証の試し方

ここが大変だったんでメモ。
まぁまず以下のURLが見つからなくて苦心したってのが本音でして、基本ここを見ればいいってだけなんですけどね。

参考：[doorkeeper-gem API endpoint descriptions and examples](https://github.com/doorkeeper-gem/doorkeeper/wiki/API-endpoint-descriptions-and-examples)

### 僕が実際にやったコマンド

具体的な値は、嘘っぱちになっております。

```
curl -F response_type=code \
-F grant_type=authorization_code \
-F client_id=9b36d8c0db59eff5038aea7a417d73e69aea75b41aac771816d2ef1b3109cc2f \
-F client_secret=d6ea27703957b69939b8104ed4524595e210cd2e79af587744a7eb6e58f5b3d2 \
-F code=456b683f8c1e5ccde47bdfac47ee3ec96e0f1bec2546734b92980dcb806df207 \
-F redirect_uri=urn:ietf:wg:oauth:2.0:oob \
-F resource_owner_id=1 \
-X POST http://localhost:3000/oauth/token
```

Postする時に上記のような書き方をしましょうということです。

それぞれのパラメータに何入れるのかですが、
先のdoorkeeperで作ったアプリ、
http://localhost:3000/oauth/applications/1 などのURLで見ることが出来る各項目を入れていきます。

・**grant_type**
合言葉的な感じ。これ固定で。

```
-F grant_type=authorization_code
```

・**client_id**
doorkeeperで作ったアプリの「**アプリケーションID**」を入力。

・**client_secret**
同様の画面の「**シークレット**」を入力。

・**code**
同様の画面から「認証」という緑色のボタンを押した後に出てくるコードを入力。

・**redirect_uri**
同様の画面の「**コールバックURL**」を入力。
ローカルだと「urn:ietf:wg:oauth:2.0:oob」みたいな謎のコード。
本番だとちゃんとしたURLになるはずですが。

・**resource_owner_id**
これはオフィシャルのexamplesだとusernameとなってて、メールアドレスを入れてる。
なので自身のデータ構造に合わせてで。
tokenと紐付けるユニークコードで特定できればいいだけです。

## 上記のcurlをうつとどうなるの？
「access_token」がもらえます。

```
{"access_token":"51ebde838061a87f4b2ea318386387f6d265a7328b3edfacb4b7deee7c3bfa73","token_type":"bearer","created_at":1481614521
```
こんな感じね。


これで、access_tokenを使ってごにょごにょやってください。