OmniAICreator/Qiita-1.07M huggingface dataset:
Altseed 製ゲームに修正パッチを当てる

# Altseed はいいぞ

この記事は [AmusementCreators AdventCalendar 2016](http://www.adventar.org/calendars/1597) 通称ACACの2日目の記事です。
言いたいことは「Altseed はいいぞ」。たぶんしばらく引っ張ります。

今回はチュートリアルではあまり扱わないような、でも実際ゲームを作るうえで気になるところを少し説明していこうと思います。

## Altseed とは

AmusementCreators の OB をはじめとする強い人たちが作っているゲームエンジンです。オブジェクト指向に適した設計になっていて、ゲームを作るうえで毎度おなじみな処理が大抵用意されているので大変便利に使わせていただいております。C#だけでなくC++やJava(いまのところβ版)で同じエンジンで開発することができるというところもウリの一つです。どんなことができるのかは[公式サイト](http://altseed.github.io/)を見てもらえるといいかと思います。

## FilePackageとは

Altseed 製ゲームに限らず、ゲームソフトにはそこで用いる画像や音声などのリソースを同封します。リソースは、ネタバレやそのほか良からぬことに用いられぬよう、容易には抽出できないよう工夫することが多いと思います。
*Altseed にはこのようなリソースを暗号化し1つのパッケージファイルに格納するツールが付いてきます。*
[公式のドキュメントはコチラ](http://altseed.github.io/Doc/Reference/Tool/FilePackageGenerator.html)

```diff:パッケージからリソースを読み込んで表示するサンプル
namespace PackageSample
{
    class Program
    {
        static void Main(string[] args)
        {
            asd.Engine.Initialize("タイトル", 640, 480, new asd.EngineOption());

            //パスワードを指定する場合
+            asd.Engine.File.AddRootPackageWithPassword("パッケージファイルのパス", "パスワード");
            //パスワードを指定しない場合
+            asd.Engine.File.AddRootPackage("パッケージファイルのパス");

            var obj = new asd.TextureObject2D
            {
                Position = new asd.Vector2DF(100.0f, 100.0f),
                Texture = asd.Engine.Graphics.CreateTexture2D("テクスチャのパス"),
            };
            asd.Engine.AddObject2D(obj);

            while (asd.Engine.DoEvents())
            {
                asd.Engine.Update();
            }

            asd.Engine.Terminate();
        }
    }
}
```

このツールを使って作成したファイルを使うには + を付した行の**どちらか1行を書き足すだけでOK**です。
実際にリソースを読み込んだり表示（再生）したりする部分に変更は必要ありません。


## 修正パッチとは

ゲームソフトに限らずソフトウェアがリリースされた後になって、修正や改良をしたい点が出てくると思います（無いに越したことはないですが）。ユーザも手もとにあるコピーに対してその修正や改良を適用するために配布するものが修正パッチです。ゲームソフトの場合は、プログラムだけでなくリソースの追加や置き換えを伴なうことがあり、かといって上記のようなパッケージファイルを丸ごと置き換えようとすると、今度は配布するパッチのサイズが大きくなってしまいます。

## パッケージは複数追加できる

`AddRootPackage(やAddRootPackageWithPassword)`ではなにも1つのパッケージしか追加できないわけではありません。リソースを修正や追加することを見越してあらかじめ複数のパッケージを読み込んでおくことができます。

```diff:パッケージからリソースを複数読み込むサンプル
(省略)
            //もとから同封するパッケージ
            asd.Engine.File.AddRootPackage("パッケージファイル1のパス");
            //あとから追加するパッケージ
            asd.Engine.File.AddRootPackage("パッケージファイル2のパス");
(省略)

```

無いなら無いで無視されるだけなので、パッケージファイル2を最初から読み込もうとすることに特に問題はありません。
またリソースを*修正*する場合、パッケージ以下の相対パスが一致していてもあとから追加したパッケージに含まれているほうが優先されるので安心です。

## おわりに
Altseed に関する情報を少しでも豊富にしようと思い書かせていただきました。
Altseed を使ってみようという方の一助となれば幸いです。

以上、AmusementCreators Advent Calender 2016 2日目　wisteria の記事でした。
[*Raspberry Pi*] Raspberry Pi 3 Model Bを買ったのでセットアップメモ

# はじめに
何やらバタバタ過ごしている内に月日が経っていて、
ラズパイ3も買ってないままになってましたが、やっと買ったのでセットアップしたメモ。

# 手順
## OSのダウンロード
[公式ダウンロードページ](https://www.raspberrypi.org/downloads/raspbian/)からRaspbianの最新をダウンロードする。（現時点の最新2016-11-25版）
ファイルサイズは１.5GBくらいなのにダウンロードに３時間くらいかかった。
ダウンロードできたらZIPファイルを解凍、解凍後ファイルサイズ4.37GB、昔に比べたらでかい気がする。

* RASPBIAN JESSIE WITH PIXEL　（GUI使いたいならこっち）
* RASPBIAN JESSIE LITE　（最小構成、デスクトップ関連のパッケージ無し）

## OSのインストール
[Mac用インストールガイド](https://www.raspberrypi.org/documentation/installation/installing-images/mac.md)もちら見しつつ、多分前と一緒でいけるだろうと過去の自分の投稿[[*Raspberry Pi*] ラズパイをとりあえず手っ取り早く触れるようにする手順](http://qiita.com/cigalecigales/items/02e18188048a22b70934)を参考に以下を実施。

```bash
$ df -h
Filesystem      Size   Used  Avail Capacity iused      ifree %iused  Mounted on
...省略
/dev/disk8s1    29Gi  2.3Mi   29Gi     1%       0          0  100%   /Volumes/NO NAME
```

```bash
$ sudo diskutil unmount /dev/disk8s1
Volume NO NAME on disk8s1 unmounted
```

```bash
$ cd ~/Downloads/
$ sudo dd bs=1m if=2016-11-25-raspbian-jessie.img of=/dev/rdisk8
4169+0 records in
4169+0 records out
4371513344 bytes transferred in 211.188357 secs (20699594 bytes/sec)
```

## モニタなど接続して起動
電源が`5V／2.5A`推奨になっているらしい。
手持ちに`5.1V／2.1A`か`5V／2.4A`しかないのでとりあえず`5V／2.4A`の方を使用。

接続したのは以下。

* モニタ１９インチ（ケーブルはこれ　→　[PLANEX HDMI-DVI変換ケーブル 1.0m PL-HDDV01](https://www.amazon.co.jp/gp/product/B000T6VZU4/ref=oh_aui_search_detailpage?ie=UTF8&psc=1))
* USBマウス
* キーボード

無事起動！
![2016-12-02-123014_1440x900_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/48912/bebd1003-ac7d-5847-70df-8e1ac19c5954.png)


## Wifi設定
前はWifiドングルとか必要だったけど、Pi3ではオンボードで搭載済みらしい。
起動後に右上のWifiのマークから設定すればインターネットに繋がる。

# おわりに
なんだかデスクトップの見た目がキレイになっていて、サクサク動くし、我が家の半年に1回くらい起動させるWindows Vistaより断然快適。
インターネットするだけならこれでええやんって感じです。
【pandas】四分位数を求めて外れ値を検出する

外れ値の検出で四分位数を利用したいことがあったのでメモ

## seriesの四分位数を取得する

```py3
Q1 = series.quantile(.25)
Q3 = series.quantile(.75)
```

もしくは

```py3
Q1 = series.describe()['25%']
Q3 = series.describe()['75%']
```

## 四分位数を用いた外れ値の検出
```py3
# A列で値が外れているデータのみ抽出
IQR = Q3 - Q1
threshold = Q3 + 1.5 * IQR

df_outlier = df[df['A'].apply(lambda x:x > threshold)]
```
逆に収まっているデータが欲しければdf[~df...]みたいに論理否定を取ったり
不等号の向きを変えたりすれば良さげ。


## まとめ
こんなことしなくても一発で外れ値出せるやつとかありそうですが...

統計初心者がpandasを使ってデータをいじくりまわしております。
何かいい方法あったら教えていただけるとうれしいです。

## 参考
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.quantile.html

四分位数についてはこの資料を参考に
http://www.contents-station.net/gacco/Data_Analysis_Innovation/Week03/3-4.pdf
スクレイピングでQiitaの「いいね」一覧を取得する

#はじめに
まず初めに書いて置きますが、僕は文章を書くのは得意ではないので読みにくかったらもうしわけありません。
さて、私は、いいねをストック代わりに使っていたので、いいねの一覧を見ることができないと知って、非常に、憤っております。twitterやQiitaでも、多くの方々が悩んでいるようです。[^1]  [^2]
というわけで、pythonでスクレイピングして、いいね一覧を取得します。

#導入
python3をインストールしたら、pipコマンドでrequests、BeautifulSoup4,progressbar2
をインストールしてください
#コード
記事一覧を取得して、`results.json`ファイルに保存します。

```py3
# -*- coding:utf-8 -*-
from bs4 import BeautifulSoup
import requests
from time import sleep
import json
from progressbar import ProgressBar

# Qiitaにlogin
payload = {
    'utf8': '✓',
    'identity': 'lovemuffim114',  # ユーザー名
    'password': 'tkhr2783'  # パスワード
}

# authenticity_tokenの取得
s = requests.Session()
r = s.get('https://qiita.com')
soup = BeautifulSoup(r.text, "html.parser")
auth_token = soup.find(attrs={'name': 'authenticity_token'}).get('value')
payload['authenticity_token'] = auth_token

# ログイン
s.post('https://qiita.com/login', data=payload)

# 結果を保存するための辞書
results = dict()

searchId = 1000000
param = {"before": searchId, "type": "id"}
# 記事数を取得
maxId = s.get("http://qiita.com/api/public", params=param).json()[0]["id"]
bar = ProgressBar(min_value=0, max_value=maxId)  # 最大値をセット

try:  # 読み込む記事がなくなるとエラー
    while True:
        param = {"before": searchId, "type": "id"}
        # 記事リスト取得
        j = s.get("http://qiita.com/api/public", params=param).json()

        # resultsに「いいね」かつストックしていない記事を追加します。
        # "url"以外に、"uuid"も指定できます。
        results.update({i["title"]: i["url"] for i in j if i["liked"] and not i["stocked"]})
        
        searchId = j[-1]["id"]
        bar.update(maxId - searchId)  # プログレスバー更新
        sleep(1)  # sleep(1秒)小数点が使えます。
finally:
    print(results)

    # results.jsonに保存
    with open("results.json", "a") as f:
        json.dump(results, f, ensure_ascii=False, indent=4, separators=(',', ': '))

```
以上です。結果は、

```json
{
    "【narou4j】Javaで小説家になろうの小説取得ライブラリをつくった": "863aa22a29db16463e52",
    "ViewHolderを使わないでListViewを高速化する": "28f8be64d39b20e69552",
    "【narou4j】なろうAPIのJavaラッパーライブラリをつくった": "6c050593f45174056005",
    "水耕栽培セットを自作してみた。": "5d60c14d560ecf518a4e",
    "RxJava + Flux (+ Kotlin)によるAndroidアプリ設計": "cbf304891daec87ba5b7",
    "RxJavaでEventBusを作った": "a4ece37834446c9a39c8"
}
```
のように保存されます。Qiitaへのログインについては、[Pythonでのウェブサイトへのログイン](http://qiita.com/morinokami/items/46b76b365f030be83418)を使用させてもらいました。

#注釈
[^1]: [【注意！】Qiitaの「いいね」ボタンを押しただけだと記事はストックされませんよ！【extension書きました！】](http://qiita.com/gimupop/items/be53044143a9a3e90a4b)
[^2]: [「qiita いいね　一覧　 -！ -突破」のtwitter検索結果](https://twitter.com/search?f=tweets&vertical=default&q=qiita%20%E3%81%84%E3%81%84%E3%81%AD%E3%80%80%E4%B8%80%E8%A6%A7%E3%80%80%20-%EF%BC%81%20-%E7%AA%81%E7%A0%B4&src=typd)
(WIP) Skip Graphs

論文はこちら．

- __Skip Graphs__
    - [PDF (SODA 2003)](http://www.cs.yale.edu/homes/aspnes/papers/skip-graphs-soda03.pdf)
    - [PPT (SODA 2013)](http://www.cs.yale.edu/homes/aspnes/papers/skip-graphs-soda03.ppt)
    - [PDF (arXiv)](https://arxiv.org/pdf/cs/0306043v1.pdf)
    - [PDF (ACM Journal)](http://www.cs.yale.edu/homes/aspnes/papers/skip-graphs-journal.pdf)

## Skip Graphs

Skip graph は，skip list にもとづく分散データ構造である．
Chord などの DHT とは異なり，範囲探索などの複雑なクエリをサポートする．


### 形式的な定義
文字の有限集合をアルファベットといい，$\Sigma$ で記す．$w_0, w_1, w_2, \ldots \in \Sigma$ とすると，$\Sigma$ 上の語は $w = w_0 w_1 w_2 \ldots$ と書ける．語 $w$ の長さを $|w|$ と表記する．特に，$|w| = 0$ となる語 $w$ を $\varepsilon$ と書く．$|w| < \infty$ となる $w$ 全体からなる集合を $\Sigma^*$ とし，$|w| = \infty$ となる $w$ 全体からなる集合を $\Sigma^\omega$ とする．

要素 $x$ はいくつかの双方向連結リスト $S_w$ に属する．どの要素がどのリストに属するかはメンバシップベクタ $m(x) \in \Sigma^\omega$ によって決まる．双方向連結リスト $S_w$ は，$w$ が $m(x)$ の接頭語となるような要素 $x$ が昇順で並んだリストである．$S_\varepsilon$ はすべての要素 $x$ が昇順で並んだリストとなる．Skip graph は，双方向連結リストの族 $\mathfrak{S} = \left\\{ S_w \right\\}$ である．
【ジョーク】LinuxというよりMixxxでDJやってみようと張り切ってDJコントローラーを買ったけど対応していなかった時の資料

問題あったら運営に報告してください。

# 背景

曲がりなりにもUbuntuでDJをしているため、もっと高みを目指そうと思ってNumark Mixtrack Proから[Numark NV](http://numark.jp/nv/)にグレードアップしてみた。
（DJ始めたきっかけはこの記事: [第238回　夏休み特別企画・MixxxでDJになろう！：Ubuntu Weekly Recipe｜gihyo.jp … 技術評論社](http://gihyo.jp/admin/serial/01/ubuntu-recipe/0238)）

しかし、予想していたとおり、プラグアンドプレイという事にはならず、調べてみるとどうやらコントローラーのボタンの割当や挙動はXMLやJavaScriptで行えるらしい。

ということで頑張ってみようとしてる。

# DJコントローラーの大半はMIDIコントローラーである。
つまりMIDI信号でやり取りしてる。MixxxもこのMIDI信号を受信してソフトで色々と挙動や振る舞いを行っており、ちゃんと調べて買えば「68,000円も出したのに使えねえじゃねえか！」ということにはならない。
参考資料：[hardware_compatibility [Mixxx Wiki]](http://mixxx.org/wiki/doku.php/hardware_compatibility)

「え、じゃあなんでMIDIコントローラーなのに使えないコントローラーが出てくるの？」
という話だが、そこは大人の事情という名のメーカーの都合があると思われる。

# MixxxはXMLでボタン割り当てし、JavaScriptで挙動が書ける
しかし68,000円も出したコントローラーを文鎮にしておくのは流石にもったいなすぎると筆者は思う。なので以下の記事を見て挑戦する。

* [MIDI controller mapping file format](http://mixxx.org/wiki/doku.php/midi_controller_mapping_file_format)
* [MIDI crash course](http://mixxx.org/wiki/doku.php/midi_crash_course)
* [Controller scripting with JavaScript](http://mixxx.org/wiki/doku.php/midi_scripting)

しかし英語のWikiを斜め読みし、他のソースコードを斜め読み＆改造した程度ではやはり理解できなかった。

# 理解できない→翻訳するか
ということで、自分が一番必要そうなところを翻訳したわけです。これが言いたかっただけ。
* [jp:midi_crash_course [Mixxx Wiki]](http://mixxx.org/wiki/doku.php/jp:midi_crash_course)
* [jp:midi_scripting [Mixxx Wiki]](http://mixxx.org/wiki/doku.php/jp:midi_scripting)

# 2016/12/02追記: 君もDJデビューしてみないか？

下書きに転がっていたのでせっかくなので公開してみる。:v:

## 2016年のクリスマスは土日ですね。:santa:
せっかくなのでDJコントローラーをちょっと購入して、部屋の中でワンマンディスコしてもいいでしょうし、せっかくなので友人宅のパーティを盛り上げてもいいのではないでしょうか。

大丈夫、まだクリスマスまで2週間以上あるんだから、コントローラーが対応してなかったとしても、プログラミングする時間はある。
IOPSメモ

# IOPSとは

* ディスクが1秒当たりに処理できるI/Oアクセスの数
* 書き込み（追加・更新・削除）性能はIOPSの影響をうけやすい
* 読み込み性能はキャッシュに乗る前の初回アクセスが影響を受けやすい
* データ転送を一度にまとめて行う場合は影響を受けにくい
* データ転送を細かく分割して行う場合は影響を受けやすい

## 数値感覚

* 100IOPSの場合、小さなデータをデータベースに対して一秒間にトランザクションを100回コミットできる
* 10000件のデータを一回のトランザクションで行った場合には影響を受けにくい（IOPSが大きくても恩恵を受けられない可能性が高い）

## プログラマの感覚

* IOPSの数値が高いほど楽できる
* IOPSの数値が低いほど一定数量、処理をまとめて読み書きする必要がある（ゲームなどでは複数アセットを１ファイルにまとめるとか）
* IOPSの数値が高いときに低いときと同じようにまとめて処理すると性能がでない場合がある

# HDD

|回転数(RPM)|IOPS|
|:----|:---|
|7200|75-100|
|10000|125-150|
|15000|175-210|

* 回転数によって決まる

# SSD

* デスクトップ向け現行製品は50000IOPS以上でる
* 容量やコンロトーラの性能によって増える
* サーバー向けは1000万IOPSとかでる

# AWS

## HDD

* 最大500IOPS

## SSD(gp2)

|容量|IOPS|
|:----|:---|
|1GB|100|
|100GB|300|
|214GB|642|
|250GB|750|
|500GB|1500|
|750GB|2250|
|1000GB|3000|
|3334GB|10000|

* 最小100 IOPS (33.33 GiB 以下) 
* 最大10,000 IOPS (3,334 GiB 以上)
* 3000IOPSにバーストできる時間は30分から２時間まで

## プロビジョンドSSD(io1)

* 1000〜20000IOPS

# RAID

* RAIDを組むことによってIOPSを増やせる
* RAIDのレベルによって台数あたりのIOPSの増加倍率は変わる

|LEVEL|増加倍率|コメント|
|:----|:----|:----|
|0|X倍|増やした台数分増加|
|10|0.5倍|増やした台数の半分増加|
|5|0.2-0.5倍|増やした台数の半分以下増加|
|6|0.1-0.4|ほとんど増えない|
|1|1/X倍|まったく増えない|

* zfsのraidzはiopsほとんど増えないらしい

# 資料

* https://en.wikipedia.org/wiki/IOPS
* http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/EBSVolumeTypes.html
* https://aws.amazon.com/jp/ebs/details/
* http://www.thecloudcalculator.com/calculators/disk-raid-and-iops.html
* http://ftp-admin.blogspot.jp/2011/11/raid-z.html

# その他

* 十分なiopsを確保してプログラムの負荷をかけてもiopsがキャップしない場合は処理の並列度が足りていない
* データベースなどでは一つのトランザクションにまとめる、バルクインサートなど。
* データベースのコネクションプールを行っていてトランザクション数を制限している場合など。
Androidアプリ開発でよく使うけど忘れがちなTips

**この記事は今後も適宜更新していきます。**
Androidアプリ開発をしていて良く使うけど、忘れがちなTipsをまとめます。
「え～と、なんかのアプリに実装したよな・・どこだったっけ？」なんて、開発済アプリのコードを探し回るのはもうやめにしたいです。

## ボタン関連
### ボタン連打防止
ボタンに限りませんが、クリック操作の連打防止方法です。
いくつか方法がありそうですが、以下の処理が良いのではないかと思います。
以下のコード例は、ボタンを押した直後にボタンを無効化、1000ミリ秒後に有効化しています。
有効化は非同期に実行されるので、ボタン処理が待たされることはありません。

```Java
import android.os.Handler;

final Button button = (Button)findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        button.setEnabled(false);
        new Handler().postDelayed(new Runnable() {
            public void run() {
                button.setEnabled(true);
            }
        }, 1000L);
        // ここにボタンの処理を書く
    }
});
```

### コードでボタンを押す
ボタンに限りませんが、コードでクリック操作を実行します。

```Java
Button button = (Button)findViewById(R.id.button1);
button.performClick();  //←これがポイント
```

## オプションメニュー関連
### Fragmentでオプションメニューを使う
Fragment#onCreateViewで`setHasOptionsMenu(true)`を呼びます。いわゆる「おまじない」のようなものですね。

```Java
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    setHasOptionsMenu(true);　// ←これがないと表示されない！！
}
```

### メニュー項目を動的に表示・非表示にする
はやり、onPrepareOptionsMenu で処理するのが基本だと思います。
以下のコード例では、メニュー項目の削除とリセットを、条件によって表示・非表示するものです。

```Java
public void onPrepareOptionsMenu(Menu menu) {
    //削除
    super.onPrepareOptionsMenu(menu);
    MenuItem deleteItem = menu.findItem(R.id.action_delete);
    deleteItem.setVisible(index == 1);
    //リセット
    MenuItem resetItem = menu.findItem(R.id.action_reset_condition);
    resetItem.setVisible(index == 0);
}
```

表示・非表示の条件に変化があった場合、以下のメソッドを呼ぶと onPrepareOptionsMenu が呼び出されるため、結果としてオプションメニューが動的に変化します。

```Java
invalidateOptionsMenu();

Fragmentからは

getActivity().invalidateOptionsMenu();
```

## リストビュー関連
### リストビューの更新
ListViewの内容を更新したい場合は、以下がポイントです。

```Java
private ListAdapter mListAdapter;

//これがポイント。ListViewが再描画される。
mListAdapter.notifyDataSetChanged();

private class ListAdapter extends BaseAdapter {
    // 色々な処理
}
```

## レイアウト関連
### `gravity`と`layout_gravity`の違い
下記のサイトを参照してください。
[「初心者の初心者のためのAndroidアプリ開発！」gravityとlayout_gravity](http://kenkenppa.seesaa.net/article/256638800.html)
Mathematicaのコミュニティ一覧（日本語・英語）

# はじめに

Mathematicaは日本での認知度がまだまだ低く、情報共有もなかなかしづらいのが現状です。

一応、どのようなコミュニティ（あるいは質問サイト）があるかを調べたので、リストアップします。


# 日本語のコミュニティ

<i class="fa fa-globe"></i> [Qiita](http://qiita.com/tags/mathematica)（ <i class="fa fa-tags"></i> `Mathematica` ）

<i class="fa fa-user"></i> 32人 （タグのフォロワー）
<i class="fa fa-comments"></i> 10投稿 （2016年）

[昨年のアドベントカレンダー](http://qiita.com/advent-calendar/2015/mathematica) が功を奏し、投稿が充実してきてます。

----


<i class="fa fa-globe"></i> [mixi](http://mixi.jp/view_community.pl?id=46499)（<i class="fa fa-users"></i> Mathematica）

<i class="fa fa-user"></i> 641人
<i class="fa fa-comments"></i> 0投稿 （2016年）

mixiなんで、言わずもがな過疎っています。

----

<i class="fa fa-facebook-official"></i> [Facebook](https://www.facebook.com/groups/282326008773764)（ログイン必要）（<i class="fa fa-users"></i> Mathematicaを使った数学勉強会）

<i class="fa fa-user"></i> 7人
<i class="fa fa-comments"></i> 9投稿 （2016年）

今年の6月に開かれたイベントの公開グループです。
第2回の開催が期待されます。

----

<i class="fa fa-globe"></i> [日本数式処理学会Mathematica分科会](http://mathusers.jp/)

<i class="fa fa-user"></i> ?人 （タグのフォロワー）
<i class="fa fa-comments"></i> ?投稿 （2016年）

コミュニティとして一番しっかりしていて大きそうなのですが、 [メーリングリスト](http://mathusers.jp/?page_id=16) にはここ数年おそらく誰も投稿してません。（もしかしたら僕が登録をミスってるのかもしれません。）

# 英語のコミュニティ

<i class="fa fa-globe"></i> [Wolfram Community: Connect with Other Mathematica and Wolfram technologies Users](http://community.wolfram.com/)

<i class="fa fa-user"></i> [13408人](http://community.wolfram.com/people)
<i class="fa fa-comments"></i> 2000スレッド以上 （2016年）

なんといっても公式が一番いいでしょう。

僕も2回ほど回答しています。
英語は苦手なのでインターネットで外国人とやり取りしたことなんてほとんどないですが、

[Convert floating point representation to any scientific notation & back](http://community.wolfram.com/groups/-/m/t/274061)
という質問でIEEE 754の浮動小数点について丁寧に説明したら

> Thanks Yuki, exactly what I was looking for. Highly appreciated.
> 
> Cheers

とお褒めいただきました。

----

<i class="fa fa-stack-overflow"></i> [Stack Overflow](http://stackoverflow.com/questions/tagged/wolfram-mathematica)（ <i class="fa fa-tags"></i> `wolfram-mathematica` ）

<i class="fa fa-user"></i> ?人
<i class="fa fa-comments"></i> [458スレッド](http://stackoverflow.com/search?q=%5Bwolfram-mathematica%5D+created%3A2016) （2016年）

ちなみに [日本語のスタックオーバーフロー](http://ja.stackoverflow.com/) にはMathematicaに関する質問は1件も見当たりませんでした。

----

<i class="fa fa-globe"></i> Mathematica-Users （閉鎖）

公式の [Wiki-webMathematicaでMathematica Webコミュニティー結成](http://www.wolfram.com/mathematica/customer-stories/building-a-mathematica-web-community-with-wiki-webmathematica.ja.html) という記事で紹介されていましたが、サイトは閉鎖されていました。

~~http://www.mathematica-users.org/~~


# まとめ

英語が読み書きできるのであれば、公式のコミュニティが一番。
日本語は、うーん…。

# 宣伝

~~結論、日本語のコミュニティがほぼ皆無！ということで、MathematicaユーザーのSlackグループを作りました！
私宛に何らかの方法でメールアドレスを教えていただければ、招待いたします。
（もし既にMathematicaの日本語Slackグループが存在していたら、そちらに乗り換えますので、コメントください。）~~

最近はMathematicaカフェというコミュニティ（Googleグループ）で活発に議論しています！
2022年現在、月一ペースでオフライン／オンライン会合が行われています。
ご興味がある方はご連絡ください。
IDCFチャンネルへの接続にチャレンジ

[myThings Advent Calendar 2016](http://qiita.com/advent-calendar/2016/mythings)二日目の記事です。

# 構成
- GR-PEACH
- IDCFチャンネル
- [HelloMQTT](https://developer.mbed.org/teams/mqtt/code/HelloMQTT/)

# 結果
IDCFチャンネルに接続できず。
サンプルプログラムの接続先には問題なく接続できたが、IDCFチャンネルに接続するように書き換えると以下の部分で接続エラーに。
- MQTTEthernet#connect
- MQTT::Client#connect
- MQTT::Client#subscribe

mosquitto_subでの連携はできており、またごく稀に接続できることがあるので、おそらくGR-PEACH(mbed)側の問題。

# やったこと
1. [HelloMQTT](https://developer.mbed.org/teams/mqtt/code/HelloMQTT/)をコンパイラにインポート
2. インポートしたプログラムのライブラリを全てアップデート
    - mbedのみ個別に選択してアップデートしないと以下のコンパイルエラーが解消しなかった。
    - Error: Cannot open source input file "device.h": No such file or directory in "extras/mbed_6213f644d804/platform.h", Line: 21, Col: 21
3. C１２８３２を削除
    - ライブラリをアップデートしても以下のコンパイルエラーが発生する。LCD未搭載で不要なので削除
    - Error: "NORMAL" has already been declared in the current scope in "C12832/C12832.h", Line: 44, Col: 
4. main.cpp の修正
    - 31行目を次のように修正
```#define USE_LCD 0``` 
5. コンパイルしてGR-PEACHで実行
    - サンプルコードが動作することを確認する
    - [Mac の screen コマンドでシリアル通信](http://qiita.com/hideyuki/items/9258f33180d98ad0cb1e)
6. IDCFチャンネルに接続するように修正して実行

```cpp:main.cpp
char* topic = "action-1 の uuid"; // 70行目

char* hostname = "仮想マシンのIPアドレス"; // 76行目

data.username.cstring = "action-1 の uuid"; // 96行目
data.password.cstring = "action-1 の token"; // 97行目

```

# その他
その他のライブラリに差し替えてのチャレンジもしたい
railsのrenderとredirect_toの違い

よく分かってない人を3人程見かけたため、改めて初心者向けにrailsのrenderとredirect_toの違いをまとめてみます。

# そもそもMVCのどの部分？
Controller(の特定のAction)が特定のViewを呼びだす部分です。
(部分テンプレートを使用したい場合、View内でrenderを使用することもありますが、今回は割愛します。)

# renderとは
Action内で、呼び出すViewを指定するメソッド。そのAction内で@〜〜(インスタンス変数)として格納されたものは、Viewからrubyの構文で呼び出せます。
呼び出すViewの形式は、RHTML形式です。(RHTML形式は、普通のfoo.htmlや、hogehoge.html.erb等のruby構文が実行できる形式のHTMLのこと)

# redirect_toとは
HTTPリクエストをサーバーに送り、ユーザーはそこから返ってくるHTMLが表示される。

### HTTPリクエストとは
- URL(http://〜〜)
- HTTPメソッド(GETとかPOSTとか)
- その他クッキーとか、ユーザーが送りたいデータとか

を含みますが、
railsのredirect_toでは、HTTPメソッドはGETに固定されています。
また、自サーバーにredirect_toした場合は、routeを通り、routeに指定されたアクションを実行します。
ので、redirect_toが記載されているActionのインスタンス変数はView側から使えません。

# renderもredirect_toも指定しない場合
よくありますよね。

``` ruby:controllers/△△.rb
class △△Controller < ApplicationController
  def index
  end
end
```

とかの、何もAction内に記載しない場合。
これは
`render 'index(アクション名)'`
を省略しているのと同じ効果を持ちます。
よって、indexアクションから、views/△△/index.html.erb
が呼ばれます。(もちろん、存在しなければmissing templete errorが返ります)

# 気をつけなければならないこと
- 1つのActionからは1つのViewしか返せない。

→ そのため、renderやredirect_toを2つ連続して書けません。(よく見るエラーですよね)

``` ruby:controllers/△△.rb
class △△Controller < ApplicationController
  def show
    ~~
    if ~~
      ~~
      render "index"
    end
    render "show"
  end
end
```

これはエラーになります。if文の評価式がtrueの場合、`render "index"`を通り、そのまま`render "show"`も通ってしまいますね。double render error(でしたっけ？)のエラーが返ってきます。

先ほど書いた通り、`render "show"`を記載しない場合でも、`render "show"`が省略された形とみなされますので、同じくエラーになります。

``` ruby:controllers/△△.rb
class △△Controller < ApplicationController
  def show
    ~~
    if ~~
      ~~
      render "index"
    end
  end
end
```

これの対策には、色々ありますが、ある条件下でindex.htmlを表示させたいならば、`render "index"`の後にreturnを入れるのが良いでしょう。

``` ruby:controllers/△△.rb
class △△Controller < ApplicationController
  def show
    ~~
    if ~~
      ~~
      render "index"
      return
    end
    render "show"
  end
end
```

# renderの色々な書き方
ajaxを使おうとすると、良くrenderにはお世話になりますよね。[RailsGuide](http://railsguides.jp/layouts_and_rendering.html)で色々な書き方がありましたので、ご紹介します。
> 実のところ、たとえばBooksControllerクラスのupdateアクション内で、本の更新に失敗したらeditテンプレートを出力したいとすると、以下のどのレンダリング呼び出しを行っても最終的には必ずviews/booksディレクトリのedit.html.erbを使用して出力が行われます。

`render :edit`
`render action: :edit`
`render "edit"`
`render "edit.html.erb"`
`render action: "edit"`
`render action: "edit.html.erb"`
`render "books/edit"`
`render "books/edit.html.erb"`
`render template: "books/edit"`
`render template: "books/edit.html.erb"`
`render "/path/to/rails/app/views/books/edit"`
`render "/path/to/rails/app/views/books/edit.html.erb"`
`render file: "/path/to/rails/app/views/books/edit"`
`render file: "/path/to/rails/app/views/books/edit.html.erb"`

たまに使うのは、`render "/path/to/rails/app/views/books/edit.html.erb"`とかですかね。これを使うときは設計が悪い可能性がありますが。。。
Laravelでenv()に.envの内容が反映しないとき

`php artisan config:clear`

<dl class="quote">
<dd><blockquote cite="https://laracasts.com/discuss/channels/general-discussion/env-not-reading-variables-sometimes" title=".env Not Reading Variables Sometimes"><p>I had trouble with <code>config:cache</code>, when it is run, the app (Laravel 5.2) doesn't read files from the <code>.env</code>-file.  I ran <code>config:clear</code>, and everything works again.</p></blockquote></dd>
<dt class="cite"><i>via:<a href="https://laracasts.com/discuss/channels/general-discussion/env-not-reading-variables-sometimes">.env Not Reading Variables Sometimes</a></i></dt>
</dl>
【FileMaker】意外と敷居が高いらしい - スクリプトトリガ - OnObjectKeystroke

はい、今日は、[AdventCalendar 2016 FileMaker Tips](https://qiita.com/advent-calendar/2016/filemaker-tips/) 12/02の記事です。

今日は、スクリプトトリガの[OnObjectKeystroke](https://www.filemaker.com/help/14/fmp/ja/html/script_trigg.36.3.html#432265)です。

まずは、どういう動きか、↓でどうぞ。
https://youtu.be/VZ2l_e6yx4U

キーボードからの入力があったら、その入力情報をスクリプトで処理できます。
スクリプトで処理するときは、取得関数の[Get(トリガーキー入力)](https://www.filemaker.com/help/14/fmp/ja/html/func_ref1.32.159.html#97588)という関数で入力した情報を取得できます。

![スクリーンショット 2016-12-02 20.32.22.png](https://qiita-image-store.s3.amazonaws.com/0/60538/9c15384f-cafd-f0f4-305a-f4d4b42be72c.png)

入力し終わった時にスクリプトが実行されるので、入力したデータによって何かしら処理をしたい場合に使えます。
例えば、入力した文字列によって、更新するフィールドを分けて設定できたり、次に移動するフィールドを分岐したり、郵便番号や電話番号のように自動でハイフンを入れたり、などなど、、、

システムを利用しているユーザ個別に対応したい時に便利に使えるスクリプトトリガ、OnObjectKeystrokeをご紹介しいました！
本日（12/2）リリースされたv0.39.0について

前日に@janus_welさんが過去のバージョンについて書いていただきました。
そして今日v0.39.0がリリースされたようなので、そちらに言及しようと思います。
（流れに乗ってしまい恐縮です。）

17時現在、githubのReleasesには反映されてません。
公式サイトと、githubのTagsには反映済みです。

まだあまりドキュメントが整備されてないのか、WikiとReleasesに記載されている情報が統一されていません。

# RCとの変更点

まだリリースノートにも反映されてませんが、githubを見る限り、こちらのコミット以外は、RC版と同様です。

androidでの`position`のバグです
https://github.com/facebook/react-native/commit/4cd4b4b92207d0d77ef73374a6ba111103a7156d

issueはこちら
https://github.com/facebook/react-native/issues/11096

# Breaking changes

## `ReactShadowNode`を`CSSNode`を拡張しない代わりに保持するように変更
  https://github.com/facebook/react-native/commit/0df65bb7d4fcb935b3dea589f3cb7b73a5d52483
`ReactShadowNode`は`CSSNodeDEPRECATED`を継承しなくなりました。
依存するコードは変更する必要があります。


## `require('image!...')`部分を修正
https://github.com/facebook/react-native/commit/22141468aba2dc90946c753420a8091b67e7073c


## [Android]cssレイアウトがCベースの実装に変更
https://github.com/facebook/react-native/commit/d63ba47b59e3261403800c1f741d979a089efb48
layoutの`flex: 1`を必要以上に記載する必要がなくなりました。
挙動もWebの挙動に近くなり、実行も高速化されます。


## [Android]`TextInput padding` で小数点以下のピクセルが消えていたのを修正
https://github.com/facebook/react-native/commit/aa85408f568ae9776fef99dcae317def0a07139a


## [Android] androidテストツールの`Monkey`を利用している際にデバッグメニューを無効化する
https://github.com/facebook/react-native/commit/9a8b5d9f4f860f16d0845d537f80bfd2f515ee93


重要な変更は以上です。
細かい修正点は以下を参照してください。
上述の通り差分があります。

+ Releases
https://github.com/facebook/react-native/releases

+ Wiki
https://github.com/facebook/react-native/wiki/Breaking-Changes#039


# 全体的な印象

やはりバグの修正はAndroidが多いです。 
とくに表示系のバグですね。
逆にiosは少なくなってきました。

iosは機能拡張が進んできた印象です。
Androidのバグが駆逐されてきて嬉しいです。
TwitterとFavstarを行き来するBookmarklet

#はじめに
お気に入りのTwitterアカウントで見逃してしまった人気の過去画像を辿るのが面倒だとおもっていたところ、Favstarがあるじゃないかと思いつきました。ただ、相互のサービスを切り替えがやや面倒なので、切り替えできるBookmarkletを作成しました。

#ブラウザへの登録方法
まず、適当なページ（例えばヤフーなど）のブックマークをつくります（お気に入りに入れます）。そしてそのブックマークを編集します。URLの欄（ヤフーなら" http://www.yahoo.co.jp "と入っているところ）を下記のコードで置き換えると、Bookmarkletになります。ブックマークのタイトルも「ツイファボ行き来」など、自分でわかりやすいものにした方がいいでしょう。

#使い方（挙動）
Bookmarkletを使用すると、下記のようにページが移動します。
- Twitterでツイートが表示されている場合、Favstarのツイート画面になります。
- Favstarでツイートが表示されている場合、Twitterのツイート画面になります。
- Twitterで特定ユーザのタイムラインが表示されている場合、Favstarのユーザ画面になります。
- Favstarで特定ユーザのタイムラインが表示されている場合、Twitterのユーザ画面になります。
- それ以外だとErrorがアラート表示されます。

#コード

```
javascript:if((location.href.search(/favstar.fm/)!=-1)&&(location.href.search(/status/)!=-1)){u=location.href.split('/');location.href='http://twitter.com/'+u[4]+'/status/'+u[6];}else if((location.href.search(/twitter.com/)!=-1)&&(location.href.search(/status/)!=-1)){u=location.href.split('/');location.href='http://favstar.fm/users/'+u[3]+'/status/'+u[5];}else{try{u=location.href.match(/^https?:\/\/.*twitter\.com\/([0-9A-Za-z_]+)(\/[0-9A-Za-z_\/]*)?/)[1];location.href="http://favstar.fm/users/"+u;}catch(e){try{u=location.href.match(/^http?:\/\/.*favstar\.fm\/users\/([0-9A-Za-z_]+)(\/[0-9A-Za-z_\/]*)?/)[1];location.href="http://twitter.com/"+u;}catch(e){alert("Error!")}};}
```

#動作確認
WindowsのChromeのみ確認しております。
Android  MEMO OnActivityResult

EditTextの入力をソフトウェアキーボード使わずにインプット用のActivityでやった時にハマったこと。

レイアウト的にソフトウェアキーボードだと入力しにくかったのでEditTextのソフトウェアキーボード入力をDisableにし

'@OnClick(R.id.hogeEditText)'でEditTextをタップした時に入力用Activityを立ち上げ入力する方法にすることになった。

そこでハマったのは入力用Activityで入力したものを生成元のActivityでOnActivityResultで値を取得し

EditTextに入れようとしたところ、OnActivityResultが呼ばれなかった。

他の箇所でstartActivityForResultを使っている箇所があったので比較してみたり、引数を変えてみたり、他のサイトを調べみたりした。

結果、リクエストコードが重複していたがために呼ばれないことが発覚した。

プロジェクトの中を検索してみたところ確かに重複していた。。。
HAPTIC DESIGN CAMP


## HAPTIC()

体験デザインの"次"へ
UX/CX, UI, Space, Fab

Haptic Designer(= 触業)を作る

### Virtual Realityに足りないもの
- 質感
- 実感
- 情感
身体的体験を拡張・共有・する

誰でも使える技術を作る
Techtile Tool Kit
触覚を使ったものづくり

### 触業　＝　Haptic Designer
触感をデザインする
実感・質感・情感をデザイン
触覚として体験すると記憶として定着する


触れるアート
レーザーカッターを使って触感をデザイン
触感のスタンプ

### Pseudo-haptic
擬似触覚

https://www.youtube.com/watch?v=Wak6ptsnALA
気持ち良さそうなものを並べる

CGは基準値がないから共感覚を持ちにくい！
触らせるように動かすことで、脳をだます
触っているというより自動で動かされている感じ

映像とハプティックスの融合
VRなどとの親和性高そう

### Naked
現実空間の中に映像を拡張しよう


### 
反省点
駒を置くときに気持ち悪い
・無限プチプチ
アフォーダンス、出っ張っているものは潰したくなる
・5秒スタジアム
VR
触感を変えるために使う



### クロストーク
・映像設計と触覚設計の共通点
・映画空間（マテリアルが感じられないと世界への没入感がなくなる）
・ハマルとは？
→やめられなくなる、クセになる（限りなく本能的なこと？）
欲望を動かす
気持ち良さの設計が重要→気持ち悪さの設計は？
シチュエーションに合わせた気持ち良さ悪さの度合い設定が大切？

見えないものやこだわり
記号的なもの

文字・情報・言葉に対しての身体感覚
社会とのつながりも触覚（政治など）→肌感覚？（腑に落ちる、しっくり来る）
肉体的なものではない記号的なものも触覚

主観
触覚を軸に話すと、本能→ズレがなくなる
人間と言うものを捉えられる
あらゆるものの触感をよくすればいいものではない→大事なのはズレがないこと、つまり違和感がないこと？考えさせない

共有しやすいコンテキストが失われているのではないか？
→細分化されすぎている
コンテクストを共有しているものは体感だけで繋げやすい

あらゆるものを身体感覚に落とす。身体的に理解しようとする
単純に一つのものでは触覚は作り出せない。
複数のものが関わった時のコントラストの生み出しかた

#### 何から手をつけるか？
自分感じたものを言語化する
触感を学習させる。触感言語？（悲しみは痛いとか？）

気持ち良いものを作る前にまずは面白いものを作る
本物のプチプチは一万個に一個がハート型
100回目なのにワンとかビヨーンとかぷーとかっていう→違和感、予想外
面白いものには全て感覚がともなう


#### コミュニケーションを作るとハマルを作るの違い
似てるようで違う
自分の体を身体的に理解する

不確定性は重要→同じことしか起こらないと慣れが生じて刺激値が減ってしまう
裏切られることで、コミュニケーションが生じる
本能的に不確定性に対して脳的に報酬が出てくる

より直感で扱える

#### 触覚におけるデザインメソッド
佐藤雅彦はハマるというものを映像的にメソッド化している
泣き止み動画、赤ちゃんを泣き止ませる
ハマる　ニアリーイコール　没入感


五感面白い！
大切なのはリアルではなく、世界観の中におけるルールによる統一感
うまく嘘をつく
誇張したりデフォルメする演出も大切
文化的な背景も大切になる




・指をポキポキ鳴らす：無限指ポキポキ
・FLOWERSと嗅覚の親和性
・ZIG SIMに合わせたスマホ用デバイス
・心臓のスキャンニングと連動
・シェーダーに使えそう
・テレイグジスタンス
・噛む、グミとか
・見た目と感触のズレ、先入観の裏切り、脳をだます
・触覚の組み合わせ
・音の触感
・食育に使う
・アナログ感
SSHの基本

サーバにログインする時にはよくSSHが利用される。
しかし、SSHは単なるセキュアなシェルを実行するプロトコルで終わらない
Linuxコマンドの内部などでも多数利用されている。

今回はアドベントカレンダー1日目ということで、サーバログインのベースである
SSHの総合的なまとめを行っていきたいと思う

※間違えた知識を紹介している可能性があるので、間違えている箇所は指摘していただけると助かります。

# SSHとは
セキュアシェルの略で、安全にネットワーク上のリモートコンピュータと通信を行うプロトコルである。

SSHよりも古いプロトコルでTelnetというプロトコルも存在する。
Telnetの歴史は古く、Unixの登場当初からTelnetプロトコルを利用した通信は存在していた。

しかし、現在Telnetを利用したリモート通信はほとんど行われていない。なぜなら、通信が暗号されていないからである。
SSHは認証部分も含めて全ての通信を暗号化してくれるので非常にセキュアである。

# 認証方法
現在、よく利用されているSSHの認証方法は主に3〜4パターンほどに分けられる(~~正確にどれだけの認証方法をSSHプロトコルがサポートしているかは調べていない~~)

### パスワード認証
SSH-Serverをインストールしてデフォルトで起動すると使われる認証である。
一般的によく利用される認証方法だが、ブルートフォースなどに弱くセキュリティリスクがあるのでLocalNet内のみでの利用に留めた方が吉。

### 公開鍵認証
SSHでは最も使われている認証ではないかと思う。パブリックキーをサーバー側に置き、クライアント側にはプライベートキーを置く。
プライベートが漏れなければ安全な認証であると言える。

### ワンタイムパスワード認証
文字の通り、１回のみ認証に有効なパスワードを発行してそれを用いて認証する方式である。
Google Authenticatorなどを利用したワンタイムパスワードの認証方法がネット上などにも記載されている。

外部のツールを使うのと、設定が複雑になる上に公開鍵に比べてセキュリティてきな点も問題が出てくる。
スマホで発行されたパスワードを確認する場合は、クライアントとスマホ両方のセキュリティリスクを考えなければいけなくなるからである。

### CAによって証明されたpkiの証明書で認証
pkiの証明書を利用する方法はHTTPSプロトコル上で暗号化通信をする時に用いられるSSL証明書と原理は同じである。

公開鍵を認証過程で利用しているため、公開鍵認証とセキュリティレベルは同程度であると思われる。
多くのユーザを管理する場合などに用いられるらしい・・・・

# SSHが実際に利用されているプロトコル
SSHが内部的に利用されている例として、SCPやSFTPなどのプロトコルがある。
これらのプロトコルはSSH上の安全な通信経路を利用して通信を行うことを前提にしている。

# SFTPとSSHの設定を利用した応用
近年、クラウドストレージが登場してクラウド上にデータを保管する人も増えてきているのではないか？と思われる。しかし、現在のクラウドストレージサービスはそのほとんどがパスワード認証である。

そこで、SFTPをうまく利用すると擬似クラウドストレージの公開鍵認証版が作成できる。SSHの設定であらかじめログインできないユーザを作成する。

そのユーザを公開鍵認証でSFTP接続できるようにすれば、ファイルのみにアクセスできるユーザが公開鍵認証のみで接続できるセキュアなクラウドストレージを作成できるのである。

# SSHを利用した時の鍵の管理
ここまで、SSHの内容を見てきたが実際にSSHでよく利用されている公開鍵認証の秘密鍵の管理方法を考えたい。秘密鍵は~/.sshのヂィレクトリ下に置かれることが多いが、これだけでは簡単に鍵が盗まれてしまう可能性がある。

一般的に機密性の高いデータを扱うサーバの秘密鍵はTPMなどの物理的なハードウェアに依存したところに保存するらしい！
ここら辺は知識が浅いので、また別の機会に・・・

# 最後にSSHの危険性
SSHでは、公開鍵を利用すれば安全という妄想にとらわれがちである。しかし、ログイン先のサーバ情報は~/.ssh/known_hosts内に記載されている情報のみである。

通常VPNなどの高信頼な拠点間通信を行う際は双方向認証を行うのが鉄則になっている。しかし、SSHの公開鍵認証を利用した認証では一方的なクライアント認証しかしていないので、実際にサーバが存在することを証明できていない。
ドメインとIPアドレスをセットで偽装された場合には簡単に秘密鍵が盗まれてしまう。
SSHでも双方向認証できる仕組みがあった気もするが覚えてないので、思い出した時に記載することにする。pki使うんだっけ？

# まとめ
+ 現在リモート通信ではSSHがよく利用されている
+ SSHには様々な認証方式があり、利用パターンに応じて選択できる
+ SSHはその性質上他のプロトコルの通信の土台になることがある
+ 鍵の管理方法について
+ SSHが公開鍵認証のみでは危険な可能性について

# 参考
+ https://www.conoha.jp/guide/openssh.php
+ http://muramasa64.fprog.org/diary/?date=20140912
+ http://www.rtpro.yamaha.co.jp/RT/docs/scp/
+ https://ja.wikipedia.org/wiki/Telnet
+ https://ja.wikipedia.org/wiki/Secure_Shell
やたらとMacの容量を圧迫していた要因をやっと本腰入れて探し出した話

### もうすぐ大掃除の季節ですね！

１年半の間、開発にDTPに写真加工にと大活躍してくれていたMBAの容量がついに悲鳴を上げ始めました。

![スクリーンショット 2016-12-02 19.19.07.png](https://qiita-image-store.s3.amazonaws.com/0/141990/586d20a3-abf2-85bb-bda4-832d2664cb58.png)

~~ゴミ箱整理消去し忘れて25GB食ってたり大量のinddが巣食う黒歴史フォルダを発見したり~~Finderから色々整理してみても、なかなか空かない……

### あれ、システムでかすぎない？

![スクリーンショット 2016-12-02 19.23.19.png](https://qiita-image-store.s3.amazonaws.com/0/141990/3f430bc9-4653-a287-be69-193c48de1e4e.png)

ちょっと調べてみましょう。

### コマンド

```
> sudo du -sh /*  //結構時間のかかるコマンドです。

 19G	/Applications
 75G	/Library
  0B	/Network
7.2G	/System
 87G	/Users
4.0K	/Volumes
2.5M	/bin
  0B	/cores
4.5K	/dev
4.0K	/etc
1.0K	/home
1.0K	/net
456M	/opt
8.2G	/private
1.0M	/sbin
4.0K	/tmp
1.6G	/usr
4.0K	/var
```

Libraryが大変なことになってますね。

```
> sudo du -sh /Library/*

 72G	/Library/Application Support
133M	/Library/Audio
452M	/Library/Caches
  0B	/Library/ColorPickers
2.5M	/Library/ColorSync
  0B	/Library/Components
  0B	/Library/Compositions
  0B	/Library/Contextual Menu Items
1.7M	/Library/CoreMediaIO
...
```

Application Support...
なんとかなりそうな気がしてきました。

```
> sudo du -sh /Library/Application\ Support/*

443M	/Library/Application Support/Adobe
  0B	/Library/Application Support/AdobeAdobe PCD
  0B	/Library/Application Support/AdobeSLCache
4.0K	/Library/Application Support/App Store
...
 69G	/Library/Application Support/Symantec
...
```

### **69G	/Library/Application Support/Symantec**

はい。
買った当初余ってたライセンスで入れたノートンの生き残りでした。

launchpadから削除してしまったので、ちゃんと消えてなかったんですね……
アンインストーラー必要なアプリはしっかり確認しないといけませんね！（今更）


Before
![スクリーンショット 2016-12-02 19.19.07.png](https://qiita-image-store.s3.amazonaws.com/0/141990/b63ad8de-0665-867c-764e-57501b7c48a6.png)

After
![スクリーンショット 2016-12-02 19.59.35.png](https://qiita-image-store.s3.amazonaws.com/0/141990/42d2ce9a-2bc5-3d77-76f6-5555961416a8.png)

だいぶすっきりしました！
ただの確認不足ではあるんですが、SSD移行過渡期にウイルス対策でこの容量はどうなんよ……とか思ってしまいますね。Sophosは30MBもないし……。
あと、Libraryの分類がシステムになってしまうのもちょっと混乱を生んでしまうかもなぁ……。

容量確認はちゃんとやろうねというお話でした。
文字数に応じて textarea を自動的にリサイズする #JavaScript #HTML5

## TL;DR

雑な感じだが、これで出来る。
文字数が減ったときの対応は、入れていないのであしからず。

```html
<textarea id="area"></textarea>
```

```js
document.getElementById('area').addEventListener('input', function(event) {
  event.target.offsetHeight < event.target.scrollHeight ? event.target.style.height = event.target.scrollHeight+'px' : nil;
});
```

## 追記

同僚からあまりにも雑すぎるｗと意見を頂いたので、簡単な解説をば。

1. 対象のテキストエリアに `input` でのイベントを仕込みます。
2. `offset` の高さと、 `scroll` の高さを比較します。
3. `scroll` の高さの方が高い場合は、対象のテキストエリアの高さを `scroll` の高さにします。

以上です。
Vanilla JS で書いてますが、お好きなライブラリ使えばもっと簡単になると思います。

### 文字が減ったときもちゃんとリサイズしたい！

[入力内容の量に応じたtextareaの自動サイズ変更 - Qiita](http://qiita.com/YoshiyukiKato/items/507b8022e6df5e996a59)
こちらの記事で対応されているようです。
グラフィックデザイナー上がりが思うモノづくりの『心遣い』

グラフィックデザイナーとして広告業界に身を置き、時代の流れとともにWebのデザインを担当するようになり早十余年。

Quadに入ってコーディングもやるようになりました。
最初は苦しい事も多かったですが、自分のアイデアやデザインを最終アウトプットまで詰められるのはイイですね。

Qiitaを利用する方の多くはプログラムなどに造詣の深い方が多いと思うので、そちら方面で私が書けるような事はないでしょう。

という事で、今回は『デザインだけする人』と『コーディングだけする人』のやり取りがちょっとスムーズに回るかもしれない『心遣い』について書こうと思います。


##綺麗なのに汚いデザインデータ
他人のデザインをコーディングする側になった時思いました。
『見た目は綺麗だけどファイル構造が汚い』or『困った』デザインデータが多い!

* レイヤーの順序がカオス
* レイヤー名が『レイヤー1』『レイヤー1のコピー』『レイヤー1のコピーのコピー』
* 画面全体にブレンドモードやトーンカーブで色調補正をかけている
* レイアウトデータ内でサムネイルをマスクしていて書き出しづらい
* レスポンシブなのにスマホデザインがない
* 不要なレイヤーがめっちゃ残ってる

上記に挙げたような事が複合的に絡み合ってるデータは、本当に困ると思います。
コーディングする以前の下ごしらえに労力を割かれてしまうのでかわいそうです。

##少しの心遣いで上手く回る

前職でコーディング担当者がヘロヘロになっているのを横目で見て、どんなファイルが嬉しいかを聞いて以降、私はできるだけ以下のようなファイル造りを心がけています。

* レイヤーの順序は見た目の左上から順に、レイヤーフォルダはきちんと作る
* レイヤー名、レイヤーフォルダ名はそれが何かわかるように明確に付ける(できれば全部)
* レイアウトデータではブレンドモードは使用しない
* 配置する要素は別に作って配置する
* 書き出せる画像は書き出しておく(レスポンシブレイアウトならサイズも算出しておく)
* 不要なレイヤーは捨てておく

デザイン中はそんな事やっていられないと思いますので、クライアントチェック中にでもやっておきましょう。

グラフィックデザイナーだった人なら、入稿データを作る感覚で丁寧に作りましょう!
そうすれば最終的なクオリティアップにつながります!(多分!)

##お互いに歩み寄った新たなツールの選択を
Photoshop、FireworksとAdobe製品一強の時代が長く続きましたが、最近は[Sketch](https://www.sketchapp.com/)や[Affinity Designer](https://affinity.serif.com/ja-jp/designer/)など安価で便利なデザインツールもちらほらと出て来ました。



これらのツールはデザインする際にも便利で使いやすい機能が多いですが、コーディングする側にも多くのメリットがあると思います。特にSketchはプラグインが多く、自分好みの機能をどんどん入れられます。

使い慣れたツールを使い続けるのも良いですが、双方にメリットがある新しいツールをどんどん取り入れる姿勢も大切だと思います。


##エンジニアもデザインに関わっていいですよ

両方の立場を経験して思う事は、
デザインパートはプロジェクト前半に『できるだけ早く』と急かされる傾向がある『短距離走』で、
コーディングやプログラムパートは比較的後半に『延々と続く』『長距離走』であるという事です。

ピークを迎えるタイミングが違うせいか、デザイナーとエンジニアがコミュニケーションをとる事が少ないような気がします。

『短距離走』でデザインしなければいけないような時に作ったデザインは矛盾点が多く存在していたりするので、後々エンジニアを困らせてしまったりもします。
そういった状況を招かないためにも、エンジニアの方々もデザインパートに参加してもいいと思います。
攻撃は最大の防御です!

作成途中のデザインを見に来てもらったり、技術的な視点でアイデアを出してくれたり。
デザイナーとしてはそんな些細な事も、新しい発想に繋がったりと結構嬉しいものです。
(タイミングによってはピリピリしてるかもしれませんけど…)


##最後に

これからデザイナーとエンジニアの境界はどんどん曖昧になると思います。
自分の強みや得意な事を見定めつつ、もっと対応できる範疇を広げていければいいですね。

さらに自分とは異なる立場の方が上手く立ち回れるように、各々がちょっとした心遣いを持っていけば、良いチームが出来るのではないでしょうか。

Advent Calendarはこういう事を書いてもいいのでしょうかね?
違ったらすみません。
Graph DBとはなにか

# TL;DR
つながり方に注目するためのDB。

# 数多のDBの中での位置づけ
## SQL

|分類   |データモデル/種別|実装例|
|:-----|:---------------|:-----|
|RDB   |Relational Model|MySQL|

## NoSQL

|種別|実装例|
|:---------------|:-----|
|Column          |HBase|
|Document        |MongoDB|
|Key-value       |Redis|
|**Graph**       |**Neo4j**|
|Multi-model     |Couchbase|

参考：
「Database」https://en.wikipedia.org/wiki/Database#Models
「NoSQL」https://en.wikipedia.org/wiki/NoSQL#Types_and_examples_of_NoSQL_databases

# なぜGraphが必要なのか
## RDBは大規模データに向かない

* テーブル間結合が遅い
* レコード数が増えると、検索に掛かる時間と難易度が増大する
  * メモリ枯渇の危険性
  * ディスクのスワップ枯渇の危険性
  * ディスクI/Oの限界
  * テーブルを上手く正規化しないとロック地獄になる
  * etc...

参考：
「集計はRDBばかりに頑張らせるのをやめると幸せになれる。」　http://qiita.com/taruhachi/items/496d217ed2338239f0d2

## Graph DBの長所と短所
### 長所
* ACID特性が担保されている
* オブジェクト間の関連づけを簡単に表現できる
* 検索が局所的なのでスケールしやすい

### 短所
* 全体から検索するのは苦手

参考：
「GraphDB徹底入門」http://www.slideshare.net/doryokujin/graphdbgraphdb
「The ACID Consistency Model」https://neo4j.com/blog/acid-vs-base-consistency-models-explained/

## Graph DBの使いどころ
* 最短経路探索
* グラフの一部を抜き出す

# Graph DBの成り立ち

## Property Graph model
* ノード
  * プロパティを持つ
* リレーション(エッジ)
  * プロパティを持つ
  * 関係の向きを持つ
* プロパティ
  * key-value型のデータ

参考：
「RDBとグラフDBは使いよう」http://lab.adn-mobasia.net/?p=3817

## Query Language

Neo4jの場合はCypherを使っている。
[Linux][Git][diff] diffコマンドで省略表示しないようにする（diffを追加してかつ全行を表示）

diffを表示したいけど、デフォルトのように省略せずに全ての行について表示してほしい場合のTips

省略表示というのは以下のように差分の前後３行しか表示していないことを差しています。

```diff:省略表示の例
$ git diff A.txt B.txt
diff --git a/A.txt b/B.txt
index 190423f..c564768 100644
--- a/A.txt
+++ b/B.txt
@@ -62,7 +62,6 @@
 62
 63
 64
-65
 66
 67
 68
@@ -96,5 +95,4 @@
 96
 97
 98
-99
 100
```

`git diff` では以下のように `-U` オプションを付ければよいです。

```bash:git_diffの場合
$ git diff -U10000 A.txt B.txt
```

```diff:Uオプションで指定した例
diff --git a/A.txt b/B.txt
index 190423f..c564768 100644
--- a/A.txt
+++ b/B.txt
@@ -1,100 +1,98 @@
 1
 2
 3
 4
 5
 6
 7
 8
<中略>
98
99
```

`-U<任意の数字>` は、各差分の単位の表示行数を何行にするかを指定することができます。
そのため、十分な行数を指定すれば全ての行を表示することができます。

また `diff` コマンドでも同様です。

```bash:diffコマンドの場合
$ diff -U10000 A.txt B.txt
```

# 参考
[shell - Svn diff to output all lines from files - Stack Overflow](http://stackoverflow.com/questions/7983669/svn-diff-to-output-all-lines-from-files)
dockerでmysqlサーバを起動して、ホストサーバから接続する

# 環境

- Vagrant上のUbuntu14.04

# 手順

```sh
# dockerでmysql(5.5)を起動
sudo docker run -p 3306:3306 --name mysqld -e MYSQL_ROOT_PASSWORD=hoge -d library/mysql:5.5

# mysqlに接続
mysql -u root -h localhost -P 3306 --protocol=tcp -p
# または、mysql -u root -h 127.0.0.1 -P 3306 -p
```

# ハマリどころ

- mysqlに接続する時に、`protocol=tcp`を指定するか、ホストをIPで指定する必要がある
- railsからmysqlに接続する場合は、database.ymlに以下のように記述する(database.ymlではprotocolは指定できないようだ)

```database.yml

development:
  adapter: mysql2
  encoding: utf8
  reconnect: true
  database: mysql_app_development
  pool: 5
  username: root
  password: hoge
  host: 127.0.0.1
```

# 補足

## Vagrantfileの`config.vm.provision "docker"`を使う場合

Vagrantfileに以下のように記述します。

```rb
# Vagrantfile:

Vagrant.configure(2) do |config|
  config.vm.box_url = "https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box"

  config.vm.box = "ubuntu-1404"

  config.vm.provision "docker" do |d|
    d.run "db",
      image: "library/mysql:5.5",
      args: "-p 3306:3306 -v /var/host_lib/mysql:/var/lib/mysql --name mysqld -e MYSQL_ROOT_PASSWORD=password -d"
  end
end
```

# 参考

- https://www.ruby-forum.com/topic/149649
- http://bufferings.hatenablog.com/entry/2015/01/28/000833
ディレクトリを作るだけでローカル環境を立てる方法

#概要

##やりたいこと

ローカルマシンで`/var/www/html`あたりに「hoge」というディレクトリを作ると「`http://hoge.local/`」的なURLでアクセスできるようにしたい。

※Apache使い向け

##どのような方法を使うか

普通にローカル環境を作るとしたら、

1. Apacheにバーチャルホストの設定を追加
2. hostsファイルにドメインを追加

という感じの作業をすると思われる。

この設定作業をいちいちしたくない。

1に関しては、VirtualDocumentRootを使えば簡単で、
`http://*.local/`が`/var/www/html/*`を指すようにワイルドカード指定できる。

問題は2で、hostsファイルには以下のようなワイルドカードでの指定はできない。

```bash:hostsファイル
127.0.0.1 *.local
```

なので、今回はhostsファイルを使わずにループバックドメインというものを使って実装する。

世の中で使われているドメイン名は、「google.comならgoogleのサーバーのIPアドレス」といったように、アクセス先のサーバーのIPアドレスが指定されている。
しかし中には、127.0.0.1（=ローカルを意味する）を指定しているドメイン名が存在しており、これがループバックドメインと呼ばれる。

有名なものに「lvh.me」というドメインがあるので、今回はこれを使う。
（lvhはLocal Virtual Hostの略かな？）

#実装

##Apacheの設定

ApacheのVirtualDocumentRootを使い、`http://*.lvh.me/`が`/var/www/html/*`を指すように設定する。

バーチャルホストの設定ファイルに以下を追記する。
（ファイルの場所は環境によって異なるので省略）

```apache:vhosts.conf
<VirtualHost *:80>
    ServerName lvh.me
    ServerAlias *.lvh.me
    VirtualDocumentRoot "/var/www/html/%1"
</VirtualHost>
```

※VirtualDocumentRootはmod_vhost_aliasというApacheモジュールを使うので、もし無効になっている場合は有効にしておく。

Apacheを再起動する。

##確認
`/var/www/html`にhogeディレクトリを作成し、中に`index.html`とかを適当に追加する。

ブラウザで`http://hoge.lvh.me/`へアクセスしてindex.htmlの中身が表示されることを確認する。
AWS IoTのブラウザレイアウトが変更されて設定に詰まった話

こんにちは、おうちハックadvent calendarの２日目を書かせていただきます。

今回はAWSIoTの設定を行う際に、ブラウザレイアウトの変更によって設定方法が変わった部分を解説します。
本当は設定をサクッと終わらせてもっと具体的な実装を投稿しようとしていたのですが、初めてAWSIoTを使うのとレイアウトの変更で他のQiita記事の導入方法を再現できず、本日のテーマとなりました。。。



#管理画面

まず始めに管理画面から見ていきましょう。以下の図が最新の管理画面となっています。

![スクリーンショット 2016-12-02 18.16.08.png](https://qiita-image-store.s3.amazonaws.com/0/134764/e4e515e2-4db4-0a80-572e-13046e232b09.png)

以前ははじめの管理画面からすぐにThingの作成を行えたようですが、今は左のメニューのRegistoryからThing項目を選択することで作成画面を表示することが出来ます。

セキュリティやルール等の項目もハンバーガーメニューの項目ごとに分けられているので分かりやすくなっている気がします。

#Thingの作成
Thingは以下のような流れで作成できます。

まず名前を入力。
![スクリーンショット 2016-12-02 18.50.30.png](https://qiita-image-store.s3.amazonaws.com/0/134764/02160ea3-3b3f-19b5-03f2-c5ccfd1ae8ed.png)

コネクションキットのダウンロードを行い次へ
![スクリーンショット 2016-12-02 18.51.28.png](https://qiita-image-store.s3.amazonaws.com/0/134764/7338e312-6c51-dc48-c479-2488a5f8a0b1.png)

ダウンロードしたファイルの中にstart.shが入っているので、動作させたいIoT機器に実行させることでコネクションの確認が出来るとのことです。
![スクリーンショット 2016-12-02 18.55.37.png](https://qiita-image-store.s3.amazonaws.com/0/134764/82c424ed-f26e-1b60-7fe5-56a540f642a0.png)


#Thingの詳細

Thingを作成すると以前は右のバーに詳細情報が記載されていましたが、今はThingを選択することで詳細を見ることが出来ます。

![image](https://qiita-image-store.s3.amazonaws.com/0/134764/86e60cc3-beff-8fcc-9f05-804d4bdc2bb0.png)

![スクリーンショット 2016-12-02 18.33.14.png](https://qiita-image-store.s3.amazonaws.com/0/134764/b74d4508-3a5e-4379-e35d-9f9e8072a2ce.png)

注意するところは、MQTT Cliantの設定が以前は上のメニューバーから行えたのがThingのActivityの箇所に移動していることです。これを探すのにかなり時間がかかりました、、、

#詰まった点
自分はラズパイに証明書等を送り動作させようとしたのですが、他のQiita記事にもあるようにNodeのバージョンのアップデートにまず手を焼いてしまいました。

やっとnodeとnpmを導入し動作させようとしたのですが、MQTTエンドポイントやTopic等の表記が以前のブラウザ表記と異なっていたことで、疎通させることが出来ませんでした。この点は実行できた際に再度記事にアップしようと思っています。
エンジニアになるために学生の頃にやっておくと良い４つのこと

社会人５年目エンジニアが、大学時代にやっておいてよかった（やっておくとよかった）と思うことをつらつらと書きます。

# 得意な（好きな）プログラミングの分野を見つける
そも、プログラミングが得意（好き）と一言に言っても千差万別だったりします。
アルゴリズムを解くのが得意だったり、
Webアプリやスマホアプリなどのユーザ体験を提供するのが得意だったり、
あるいはサーバ側の設計や性能を突き詰めるのが得意だったり。
自分にとってなにが一番得意か、を知ることでその長所を伸ばすことができます。

とはいうものの、なかなか自分の得意分野はわからないもの。
なので、大学時代にしかできない、自分の得意分野を見極める簡単？な方法をば。

## ３日間、引きこもってプログラミング
３日間ただひたすらにプログラミングします。朝起きたらPCをつけてプログラミング、腹が減ったら軽食食べてプログラミング。眠くなるギリギリまでプログラミング。
この生活を３日ほどやって、ストレスを感じなければ向いている可能性が高いです。
反対にすぐ別のことに気が散ったり（テレビを見たり、ゲームをしたり、スマホをいじったり）、苦痛に感じるのであれば、向いてない可能性が高いです。

# 作ったものを一般公開し、利用してもらう
自分の得意分野が見つかったら、それを公開し、利用してもらいましょう。
簡単なのはスマホアプリを公開することです。
特にAndroidアプリなら３千円程度あればGooglePlayに公開できるのでオススメです。
サーバー系ならHerokuやAWSなどを使って公開して一般ユーザに使ってもらいましょう。

で、なぜこれが重要なのか。
それは「**ユーザに価値を提供する**」という一連の体験ができるからです。この体験は非常に強力で、大学の座学では絶対に経験できません。
この体験から得られるものは多岐にわたります。

- そもそもユーザが何を必要としているか
- ユーザが使いやすいと感じるものはなにか
- ユーザからは自分の提供する価値がどう見られるのか
- 保守性の重要性
- 広告の重要性

ミソは一般ユーザに使ってもらうところにあります。
大半の人はアプリを作っても自分だけしか使わない、あるいは身内だけなど、クローズドな範囲で止まってしまいます。
しかし実際の会社では見ず知らずの人に価値を届ける場合が大半です。これはクローズドな環境では通用しない様々な問題を生みます。
それらを学生のうちに経験しておくことで、ビジネスの観点も持ち合わせて提供する価値を考えることができるようになります。

また、一般に公開しておくことで転職する際のネタにもなります。サービスを提供した時の苦労話や、工夫したこと、使った技術など、話すことには困りません。さらに一般に公開していることで公平性もあります（提供した価値が身内びいきな見解でないということ）。

なので、最も自由な時間が多い学生の時代にそれらをやっておくことをオススメします。

# 英語を聞けるように、しゃべれるようにする
「書けるように」や「読めるように」も重要ですが、最悪Google先生に頼れます。
しかし「聞く」と「しゃべる」だけは自力でやるしかありません。

で、もし可能なら海外留学をオススメします。
単純に聞く、しゃべる、だけでなく、海外の文化に触れることができるからです。
日本にいると知らず知らずに考え方がガラパゴス化し、グローバルではありえないけど、日本ではまかり通る、みたいなシーンが多々あります（労働条件なんてのが最たる例です）。
加えて留学することで、海外とのコネを作ることもできる、海外に就職することへの抵抗が減る、就活に有利、といったメリットが付随してきます。

ちなみにこれは、自分が学生の頃にやっておけばよかった、と後悔してることの一つです。

# 異性の多いサークルに入る
ふざけているように見えますが至って真面目です。理由は２つあります。


## 結婚する気があるなら学生時代に相手を見つける
**注意：この章だけは多分に想像が混じってますので、事実と異なる場合があります!!**

まず、前提として会社の開発部門で素敵な出会いがあるなんてのは７,８割近くが幻想です。
残りの２割はベンチャー企業で、かつ若いメンバーが多く、各部署の風通しがよいならワンチャンあるかもしれません、多分。

そしてたとえ残り２割を引けたとしても、あくまで仕事の付き合いから恋愛まで持っていくのは大変でしょう。破局したら居辛さ半端ないですからね。

で、会社で結婚相手がいないとなると合コンや街コンや婚活で相手を探すことになります。例外はあるにせよ、数回の飲み会で相手のことを深く知るには相当なコミュ力が試されるのではないでしょうか。
その点、サークルは３、４年間ほぼ毎日顔をあわせることになります。それだけあれば幽霊部員でない限りは相手の良いところも悪いところもわかってくるはずです。その上で一緒にいたいと思える相手を探せるのですから、社会人とは雲泥の差です。

もちろん、社内恋愛で結婚した人もいれば、街コンで付き合ってゴールした人も知っているので、人それぞれだとは思います。

## 異性とのコミュ力を身につける
当たり前といえば当たり前ですが、どんな部署にせよ多少は異性とのコミュニケーションが必要になります。さらにリーダー格となれば部下として異性の人を持つことも多いでしょう。
その時、小学生みたいな異性との接し方だと訴えられる可能性すらあります（特に男性の場合）。

ので、異性との接し方はそれまでに学んでおくことが吉でしょう。（経験則）

# さいごに
エンジニアは他の職（をあまりしらないので声を大にしては言えませんが）と比べて会社の選択肢が多いと思います。極端な話、Web系とJavaさえ書ければ就職先は多くあるでしょう。
しかし、そのなかで居心地のいいと思える職場はなかなか出会えるものではありません。
というより、転職前提なところもあります。
そのとき、学生のうちに自分の方向性を知り、選択肢を広げ、技術力を磨いておくことは将来大きな武器になります。
卒論や修論を出し終えたあとでも遅くはないと思います。ぜひ、トライしてみてください。
Apache httpclient の CloseableHttpClient で HTTPS なサイトへ BASIC 認証付きリクエスト

日本語情報がぱっと見無かったので、自分用メモも兼ねて。
エラー処理とかが雑なのは適宜補完していただければ。

```java:sample.java
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class Main {
    public static void main(String[] args){
        // パラメータ
        String host = "ホスト名";
        String path = "パス";
        String username = "ユーザ名";
        String password = "パスワード";

        // 認証情報の設定
        HttpHost httpHost = new HttpHost(host,443,"https");
        CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(new AuthScope(httpHost.getHostName(),httpHost.getPort()),
                new UsernamePasswordCredentials(username, password));

        // CloseableHttpClient のインスタンス作成 作成時に認証情報を追加する。
        closeableHttpClient = HttpClients.custom().setDefaultCredentialsProvider(credentialsProvider).build();

        try {
            // GET する URL を指定
            HttpGet httpGet = new HttpGet("https://" + host + path);
            // リクエストを実行してレスポンスを取得
            CloseableHttpResponse closeableHttpResponse = closeableHttpClient.execute(httpGet);

            // レスポンスのBODYを取得
            HttpEntity httpEntity = closeableHttpResponse.getEntity();
            System.out.println(EntityUtils.toString(httpEntity));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
```

「HTTPS なサイトへ」と書きましたが、HTTP の時と殆ど処理内容は変わりないです。scheme を変えるくらい。
stackoverflow の回答とか見ると SSLConnectionSocketFactory 作ったりしてますけど、無くても動くんですよねぇ…、謎。
WiFiモジュール ESP-WROOM-02 を使用してTwitterに投稿する。

# はじめに
今回は、WROOMを使用してTwitterに投稿することを目的としているので、センサー類の使用はしないです。
また、WROOMの接続方法などは[こちら](http://qiita.com/ikesato/items/92f4cb143e7aeb5e0f9b)の記事を参考にしたので省かせてもらいます。

# 使用モジュール
- [ESP-WROOM-02](https://www.switch-science.com/catalog/2346/)

<img src="https://docid81hrs3j1.cloudfront.net/contents/large/ESP-WROOM-02-1_500.jpg" width="20%">

- 自分たちが使いたい各々のセンサー類。

# ざっくりとした流れ
1. 自分がWROOM経由でツイートしたいツイッターアカウントを作成する。
2. トークンを作成する。
	- [StewGate U](http://stewgate-u.appspot.com/)
3. プログラムの記述
4. WROOMへの書き込み。
5. ツイート。

## ツイッターのトークンの取得
トークンとは自分の作成したTwitterアカウントと紐づけるためのパスワード的な解釈でいいと思う。

[StewGate U](http://stewgate-u.appspot.com/)
このサービスを使用すると簡単にトークンの取得ができるので今回はこれを使用してトークンの作成をした。


## プログラム
```.cpp
#include <ESP8266WiFi.h>

/* 無線LANルータのIDおよびパスワード
*
*  "*****************************" の中にはそれぞれの環境にあった設定を入れてください。
*
*/
const char* ssid = "*****************************";
const char* password = "*****************************";

const char* host = "stewgate-u.appspot.com";
const char* token = "*****************************";   // 作成したtwitterのトークン

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
}

void loop() {
  String message = "ツイートしたい文字列";
  boolean can_tweet = tweetMsg(message);

  Serial.print("already tweet?");
  Serial.println(can_tweet);

  delay(60000*15);
}


bool tweetMsg(String msg) {
  WiFiClient client;
  const int httpPort = 80;
  if(!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return false;
  }

  client.println("POST /api/post/ HTTP/1.0");

  client.print("Host: ");
  client.println(host);

  // メッセージ以外の長さ（トークン含む）にメッセージ長を加算
  int msgLength = 40;
  msgLength += msg.length();
  client.print("Content-length:");
  client.println(msgLength);
  client.println("");

  client.print("_t=");
  client.print(token);
  client.print("&msg=");
  client.println(msg);

  delay(10);

  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }

  return true;
}
```

## WROOMへの書き込み
WROOMのボードがまだ入っていない人は、[こちら](http://4009.jp/post/2016-04-25-esp-wroom-02/)を参考にするといいかと思います。

ツイートしたい文字列を入れて書き込むので、まずツイートしたい内容を記述。

ボードに`ESP8266`を指定して、`Upload Speed`を`115200`に指定する。
`マイコンボードに書き込む`を押して書き込み！
多少時間かかるので、気長に待ちましょう。。。

## ツイート完了！！！
<img src="https://qiita-image-store.s3.amazonaws.com/0/111944/632d4a60-0032-d6cd-1e9c-e62313705f8d.png" width="50%">

こんな感じでちゃんとツイートされていればオッケーです！

気をつけておきたいことは

- Twitterの仕様上で、同じ内容のツイートはできなくなっているので、再度ツイートするときにはツイート内容を変更しないといけません。
- 連投しすぎると一時的にツイートできなくなります。


# 参考資料
http://qiita.com/ikesato/items/92f4cb143e7aeb5e0f9b
http://ameblo.jp/empsgs/entry-12112893584.html
http://4009.jp/post/2016-04-25-esp-wroom-02/