OmniAICreator/Qiita-1.07M huggingface dataset:
git fetch を理解する

git fetch
git fetchの理解からgit mergeとpullの役割

gitを使い始めるとcommit, push, pullなどはある程度理解出来るようになってきたのですすが

fetchって新しい言葉が出てきます。

あまり馴染みにくいのは、開発現場で慣れてくると使われてくるのですが
pullがfetchとmergeの両方を組み合わせたコマンドだからなんですね。

「pull」 = 「fetch」 + 「merge origin/master」

##fetchとは
gitの場合、リポジトリはリモートとローカルの２ヶ所あります。
fetchとはリモートリポジトリから最新情報をローカルリポジトリに持ってくるコマンドです。

fetchをしても、pullのようにファイルが更新されるわけではありません。
あくまでもローカルリポジトリが更新されるだけです。

もっと詳しくいうと、例えばmasterブランチを使っているのであれば、
origin/masterが更新されるということです。


## 関連記事

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集
SQL*Plusを拡張するrlwap導入手順 (Red Hat系Linux）

#rlwapでできることの例
* 矢印キーでのコマンド履歴
* バックスペースで戻る
* TABでの補完

#前提
* yumのepelリポジトリがある
    * http://fedoraproject.org/wiki/EPEL#How_can_I_use_these_extra_packages.3F からバージョン合わせたrpmをダウンロードしてインストール

#手順
１．rlwapインストール

```
# yum install rlwrap
```
２．rlwrap-extensionsインストール（補完用の辞書）

* http://www.linuxification.at/rlwrap_ext.html.en からバージョン合わせたファイルをダウンロード
* /usr/share/rlwrap/completions/に解凍

```
# cd /usr/share/rlwrap/completions/
# tar xzvf rlwrap-extensions-V12-0.05.tar.gz
```
３．sql+の修正

* R_HOMEのパスを修正する

```
# vi sql+
```
> R_HOME=${RLWRAP_HOME:=/usr/local/share/rlwrap/completions}　を 
> R_HOME=${RLWRAP_HOME:=/usr/share/rlwrap/completions} に変更

４．sql+にパスを通す。もしくはパスの通った場所(/usr/local/bin等）にコピー。

```
# cp -p sql+ /usr/local/bin
```
> ※Grid Infrastructureを使用している場合はasm+もコピーすれば、asmcmdの代わりに使用できる

５．通常のSQL*Plusのパラメーター(sql+ user/passowrd@tns等)で使用できる他、sql+とだけ入力すると「/ as sysdba」の代わりになる。

```
$ export ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_1
$ export ORACLE_SID=orcl
$ sql+
SQL> show user
ユーザーは"SYS"です。
```
AWS Lambdaからkintoneアプリケーションのレコードを更新してみる

AWS Lambdaからkintoneのアプリケーションレコードを更新してみたのでその備忘録。

# 前提
1. AWS Lambda Pythonを使います。
2. LambdaはVPC内には配置しません。
3. kitoneのアプリケーションにはデフォルトで用意されている「備品在庫管理」を利用します。

# kintone側の設定

![スクリーンショット 2017-05-28 17.05.06.png](https://qiita-image-store.s3.amazonaws.com/0/102769/6d364beb-eb4b-f19d-f650-802dd99d78ab.png)

手動で登録したこのレコード（ボールペン）をAWS Lambdaから変更したいと思います。

基本的にはこちらのサイトを参考にさせてもらいました。とてもわかりやすかったです。バージョンの違いなのか若干書き方が異なるところがあったりしましたが、なんとかなりました。

http://www.yamamanx.com/kintone-python-query-check/

# Lambdaの実装
以下のような実装になります。一応メソッドによって処理を変更できるような作りにはしてはみましたが、実運用で使うならきちんと設計したほうが良いですね。

```
def kintone_operator(event, context):
    KINTONE_URL = "https://{kintone_domain}/k/v1/record.json"
    url = KINTONE_URL.format(
        kintone_domain=os.environ['KINTONE_DOMAIN'],
        kintone_app=os.environ['KINTONE_APP']
    )
    headers_key = os.environ['KINTONE_HEADERS_KEY']
    api_key = os.environ['KINTONE_API_KEY']
    basic_headers_key = os.environ['KINTONE_BASIC_HEADERS_KEY']
    basic_headers_value =os.environ['KINTONE_BASIC_HEADERS_VALUE']
    
    headers = {headers_key: api_key}
    headers["Content-Type"] = "application/json"
    if basic_headers_value != '':
        headers[basic_headers_key] = basic_headers_value

    if event['api'] == 'PUT':
        result = put_record(headers, url, event['data'])
    else:
        result = 'NO KEY'

    return result

def put_record(headers, url, data):
    response_record = requests.put(url, json=data, headers=headers)
    record_data = json.loads(response_record.text)
    
    return record_data
    
```
全て大文字の変数は環境変数としてLambdaで定義しました。API Keyなどを公開しなくて済むので非常に楽です。


実行時には以下のようなデータを送付しました。

```
{
  "api": "PUT",
  "data": {
      "app": 498,
      "id": 1,
      "record": {
          "文字列__1行_": {
              "value": "シャープペンシル"
          }
      }
  }
}

```

で、実行してみたところ、無事更新されたようです。

![スクリーンショット 2017-06-06 19.45.48.png](https://qiita-image-store.s3.amazonaws.com/0/102769/781270fd-a450-a143-2e0a-bccb9efe813c.png)

# まとめ
いろいろなサイトをベースにさせてもらい、更新機能を作ってみました。うまくAPI Gatewayやら他の機能やらと連携できれば、kintoneとAWSでどんどんとできることが増えてきますね。
Docker削除コマンドメモ



自分用メモ
1.13.0以上




## 停止したコンテナを全て削除

```
docker container prune
```

## 未使用のボリュームを全て削除

```
docker volume prune
```

## 未使用なイメージを削除

```
docker image prune
```

## 上記全てを実行。コンテナ、ボリューム、イメージの順

```
docker system prune
```


## ディスク使用量を出す

```
docker system df
```


## ネットワーク削除

```
docker network prune
```

## 条件別削除

例

```
docker rmi $(docker images | grep "^<none>" | awk '{print $3}')
```



## Tips

削除できない場合は、 -f で強制削除


## 参考

* [Dockerの不要なコンテナ・イメージを一括削除する方法](https://suin.io/537)
* [How to remove unused Docker containers and images](https://gist.github.com/ngpestelos/4fc2e31e19f86b9cf10b)
Windowsマシンで配列の異なるキーボードを併用する

会社支給のマシンはMacBook ProとToshiba dynabookがあるのですが、内蔵キーボードはどちらもJIS配列になってます。
プログラミングをするにはUS配列のHappy Hacking Keyboard(以降、HHK)を使いたい。

MacBookのほうはHHKのドライバいれて接続するだけで望みどおりの挙動になったのですが、dynabookは内蔵とHHKともにJIS配列のままでした。

## レジストリを変更

ググって先人の知恵借りました。次の3ステップで希望通りの動作します。

1. regeditで以下のキーを開く。
`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\i8042prt\Parameters`
1. レイアウトに関する設定値(下記表参照)を変更する。
1. OSを再起動する。


名前|データ(変更前)|データ(変更後)
---|---|---
LayerDriver JPN | kbd106.dll | kbd101.dll
OverideKeyboardIdentifier | PCAT_106KEY | PCAT_101KEY

## 参考

http://d.hatena.ne.jp/neil_sk/20120615/1339783445
C++ で関数の戻り値が constexpr かどうかを判定する

[ブログ記事](http://d.hatena.ne.jp/osyo-manga/20120216/1329353134)からの転載です。

そんな感じの constexpr 関数を書いてみました。
まさに誰得。

## [ソース]
```cpp
#include <type_traits>

template<typename T>
constexpr bool
true_(T){
    return true;
}

template<typename T, typename ...Args, bool = true_(T{}(Args{}...))>
constexpr bool
is_constexpr_impl(bool&&){
    return true;
}

template<typename T, typename ...Args>
constexpr bool
is_constexpr_impl(bool const&&){
    return false;
}

template<typename T, typename ...Args>
constexpr bool
is_constexpr(Args&&...){
    return is_constexpr_impl<T, typename std::decay<Args>::type...>(0);
}


template<
    typename FuncType,
    typename std::add_pointer<FuncType>::type Func,
    typename ...Args,
    bool = true_(Func(Args{}...))
>
constexpr bool
is_constexpr_impl(bool&&){
    return true;
}

template<
    typename FuncType,
    typename std::add_pointer<FuncType>::type Func,
    typename ...Args
>
constexpr bool
is_constexpr_impl(bool const&&){
    return false;
}


template<
    typename FuncType,
    typename std::add_pointer<FuncType>::type Func,
    typename ...Args
>
constexpr bool
is_constexpr(Args...){
    return is_constexpr_impl<FuncType, Func, Args...>(0);
}


struct X{
    constexpr int
    operator ()() const{
        return 0;
    }

    bool
    operator ()(int) const{
        return 0;
    }

    constexpr float
    operator ()(float, float) const{
        return 0;
    }
};

constexpr int
plus(int a, int b){
    return a + b;
}

float
minus(float a, float b){
    return a - b;
}

#include <cmath>


int
main(){
    // 関数オブジェクトの場合は、型をテンプレート引数に、引数型を関数引数に渡して評価
    static_assert( is_constexpr<X>(), "");
    static_assert(!is_constexpr<X>(0), "");
    static_assert( is_constexpr<X>(0.0f, 0.0f), "");

    // 関数の場合は、第一引数に関数型、第二引数に関数ポインタを渡す
    static_assert( is_constexpr<decltype(plus), &plus>(0, 0), "");
    static_assert(!is_constexpr<decltype(minus), &minus>(0.0f, 0.0f), "");

    
    // コンパイラ依存になりそうな関数とか
    static_assert(is_constexpr<decltype(sin), &sin>(0.0), "");
    static_assert(is_constexpr<decltype(cos), &cos>(0.0), "");
    static_assert(is_constexpr<decltype(tan), &tan>(0.0), "");

    return 0;
}
```

デフォルトテンプレート引数で関数を評価して、それで SFINAE しています。
とりあえず、gcc 4.7 では動いていますね。
コンパイラに依存しそうな constexpr 関数（math とか get とか forward とか）を切り替える場合に使える…かな？
あと引数型にデフォルトコンストラクタがない場合は動きません。
にょろーん。


## [コンパイラ]
* g++ (GCC) 4.7.0 20111210 (experimental)
Railsやってて忘れたとき見返す用のメモ

#概要
その名の通り、Rails書いてる時に
つい忘れがちなポイントを見返すための自分用メモです。

自分がRails超初学者なので、
初学者の方はストックしておくといいことがあるかもしれないしないかもしれない。

なにか新しい発見があり次第追記していく形です。

現在Railsチュートリアル勉強中...

## RailsチュートリアルでのTips
### サーバーが立ち上がらない！

```$ rails server```
もしくは
```$ rails s```
で立ち上げてないですか？

Cloud9上でサーバーを立てる場合は上記にオプションをつけてあげる必要があります。
このオプションをつい忘れがちなので注意しましょう。
(学んだはずなのになあ・・・)

正しくは、

```
$ Rails server -b $IP -p $PORT
```
で問題なく立ち上がるはずです。

これで立ち上がらない時はサーバーがエラーを起こしている可能性があるので
(僕はまだ未経験ですが)、その場合は

```
$ sudo ps aux
```
を実行するといま走っているプロセスの一覧を取得することが出来るので、
なんかこれserverっぽいと思う怪しげなプロセス(だいたいrailsとかserverとかhttpとか8080とか何かしらついてると思います)を見つけて、

```
$ kill -9 (プロセス番号)
```
を実行してやると該当プロセスを削除できます。
プロセス番号は該当プロセスと紐付けされている（だいたい左にある）数字です。
間違ったプロセスを削除して大変なことになっても責任は取れませんので、何卒本当に怪しげなものを射抜いてくださるよう・・・。

>追記
motty93さんよりコメントでお教え頂いたので追記します。
コメントありがとうございました！
上述した
```$ sudo ps aux```
の代わりに、
```$ ps ax | grep rails```
もしくは
```$ sudo ps ax | grep rails```
とすると、実行中のコマンド一覧からrailsが含まれているものだけを返してくれます。
これなら誤ったプロセスをキルしてしまうことも比較的少なそうです！
HHKB US配列（60キー）でかな入力をするときのmacOS 日本語入力とGoogle 日本語入力のキーマッピング

Happy Hacking Keyboard (HHKB) US配列（60キー）でかな入力をするときのmacOS 日本語入力とGoogle 日本語入力のキーマッピングを作りました。
下辺がGoogle 日本語入力、右辺がGoogle 日本語入力でShift押したとき、左辺がmacOS 日本語入力、上辺がmacOS 日本語入力でShift押したときです。
記入されていないところは通常通りです。
リンクは[こちら](http://www.keyboard-layout-editor.com/##@@=Esc&=!%0A1&=%2F@%0A2&=%23%0A3&=$%0A4&=%25%0A5&=%5E%0A6&=%2F&%0A7&=*%0A8&_a:7%3B&=&=&_a:4%3B&=%0A%0A%0A%0A%0A%0A%E3%81%BB%0A%E3%83%BC%0A%0A%0A%E3%81%BB&=%0A%0A%0A%0A%0A%0A%E3%82%9C%0A%E3%82%91%0A%E3%80%8C%0A%0A%E3%81%B8&=%0A%0A%0A%0A%0A%0A%E3%81%B8%0A%E3%80%8D%0A%0A%0A%E3%82%80&=%0A%0A%0A%0A%0A%0A%EF%BD%80%0A%0A%E3%80%9C%0A%0A%E3%82%8D%3B&@_w:1.5%3B&=Tab&=Q&=W&=E&=R&=T&=Y&=U&=I&_a:7%3B&=&=&_a:4%3B&=%0A%0A%0A%0A%0A%0A%E3%82%9B%0A%0A%E3%80%8D%0A%0A%E3%82%9B&=%0A%0A%0A%0A%0A%0A%E3%82%80%0A%E3%80%8C%0A%E3%83%BC%0A%0A%E3%82%9C&_w:1.5%3B&=Delete%3B&@_w:1.75%3B&=Control&=A&=S&=D&=F&=G&=H&=J&=K&_a:7%3B&=&=&_a:4%3B&=%0A%0A%0A%0A%0A%0A%E3%81%91%0A%E3%83%B6%0A%E3%82%8D%0A%0A%E3%81%91&_w:2.25%3B&=Enter%3B&@_w:2.25%3B&=Shift&=Z&=X&=C&=V&=B&=N&=M&_a:7%3B&=&=&=&_a:4&w:1.75%3B&=Shift&=Fn%3B&@_x:1.5%3B&=Opt&_w:1.5%3B&=Command&_a:7&w:6%3B&=&_a:4&w:1.5%3B&=Command&=Opt)です。改造などもご自由にどうぞ。
<img width="275" alt="スクリーンショット 2017-06-07 8.11.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/68213/d817d6cc-c0f3-f59b-b736-3fce12d511c6.png">

# 参考
[MacのUS配列でかな入力](http://yogoma.hatenablog.com/entry/2015/02/23/063854)
初心者の正規表現

# はじめに
この記事は正規表現全く分からない....という方をメインとしています。
"厳密にはそうじゃないんだけどなぁ"というのが有るかもしれませんが、正規表現の導入の部分なので多目に見ていただきたいと思います。

#正規表現 とは
wikipediaを見ると
>
>正規表現（せいきひょうげん、英: regular expression）とは、文字列の集合を一つの文字列で表現する方法の一つである。 正則表現（せいそくひょうげん）とも呼ばれ、形式言語理論の分野では比較的こちらの訳語の方が使われる。 まれに正規式と呼ばれることもある。
>[正規表現](https://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE)

と、書かれていますがよくわからないと思います。

簡単に言うと
効率よく検索出来る言語のようなものです。


## 正規表現で使用する特殊文字

```

.  \  ^   $   [   ]  (  )   *   +   ?   |   

```

正規表現を利用するためにこれらの__メタ文字__というものを使用します。


## [ . ]なにか1文字
何らかの文字1文字だけ表現するときに " __.__ " を使います。

```

これは . です。

```

これは__本__です。
これは__車__です。


```

これは ... です。

```

これは__コップ__です。
これは__マウス__です。

## [ * ]直前の文字を0文字以上繰り返す
直前の文字を0文字以上繰り返すときに" * "を使います。
0文字以上なので直前の文字がなくてもいいのです。

```

あれはコー * ヒーですか？

```

あれは__コヒー__ですか？
あれは__コーヒー__ですか？
あれは__コーーーーーーーヒー__ですか？

※ワイルドカードの意味とは異なりますので間違いないようにしてください



## [ + ]直前の文字を1文字以上繰り返し
直前の文字を1文字以上繰り返すときに" + "を使います。
1文字以上なので直前の文字が必ず必要です。

```

メー + ルがきてますか？

```
__メール__がきてますか？
__メーーーーール__がきてますか？

※ " + "は1文字以上の繰り返しなので__メルー__とはならないので注意してください


## [ ? ]直前の文字が0文字か1文字か
直前の文字を0文字か1文字だけ繰り返すときに" ? "を使います。

```

windows ? PC持ってる?

```

__window__PC持ってる？
__windows__PC持ってる？




## [ [] ]中に書いてある文字のどれか
いずれかの文字に当てはめたいときに使います。

```

今日は[傘鞄靴]を持ってきてください。

```
今日は__傘__を持ってきてください。
今日は__鞄__を持ってきてください。
今日は__靴__を持ってきてください。

※[]に書かれているものだけなので、
`今日は__服__を持ってきてください。`は当てはまりません。


## [ () ]複数文字単位でまとめる
今まで一文字単位での処理しかしていませんでした。
なので複数文字を処理したいときは()を使ってまとめることが出来ます。

```

(かわいい)猫が欲しい

```

と、()の内部を1文字のようにまとめることが出来ます。

```

(かわいい) * 猫が欲しい

```

とすると
直前の文字、()が0文字以上繰り返しなので

猫が欲しい
__かわいい__猫が欲しい
__かわいいかわいい__猫が欲しい

ということになります。




## [ . ][ * ]組み合わせて1
何らかの文字1文字だけ表現するときの[ . ]と
直前の文字を0文字以上繰り返すときの[ * ]を掛けあわせて使います。

```

携帯、持 ...* 

```

携帯、持__って__
携帯、持__つの？？？？？？__

※[ . ]が3つなので、何かしらの文字が3文字。
ですが、[ * ]が直前の文字を0文字以上ということなので__2文字以上__の文字ということになります。
よって
`携帯、持つ` はダメです。

## [ () ][ ? ]組み合わせ2
複数の文字をまとめる()と
直前の文字を0文字か1文字繰り返す?を使います

```

この(コーヒー) + 豆を焙煎しておいて

```

この豆を焙煎しておいて
この__コーヒー__豆を焙煎しておいて

直前の__コーヒー__を0文字か1文字だけ繰り返すので
`このコーヒーコーヒー豆を焙煎しておいて`では間違いになります。





# 参考
[サルにもわかる正規表現入門](http://www.mnet.ne.jp/~nakama/)
公開用apkでマップを表示する方法

# 公開用のapkでマップを表示する方法を記載します。
7.0用署名付きapk作成のためにV2(Full APK Signature)が登場したことで今までと若干変わったようです。
自分はそのために２週間ほどドハマリしておりました。。。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137470/c7f546d7-7a40-25ac-71d7-4bfc3928d297.png)

#１．アプリケーションの署名ファイルを作成する
署名付きビルドを実行して、自アプリケーションのKeyStoreファイル(.jks)を作成します。このときSignature Versionsにて「V2(Full APK Signature)」を選択すると後々登場するフィンガープリントに設定するSHA1の値が違ってくるようです！
今回の投稿では「V2(Full APK Signature)」を選択したバージョンで説明をしております。

#２．apkをGoogole Playにアップする
署名付きビルドを実施後、作成されたapkをGoogle Playへアップします。
アップした時に「アプリの署名」を確認する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137470/6007a78e-a4cc-7bca-d84c-a2d2db2d8d44.png)

アプリの署名を確認する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137470/1a3332fa-923d-d4ec-702c-85a131049fca.png)


ここで、後々に登場するAPIの設定時に登場するSHA1フィンガープリントですが、keytoolで取得した値ではなくて、Google Playの画面で確認できる「アプリへの証明書」から取得する値を使用すること！

ここでドハマリしました、巷ではAPI取得時のフィンガープリントはKeytoolで取得したものを設定することとなっていましたが、自分の所ではまったくもって駄目でした。公開apkをインストールした時のエラーログをみると求められるフィンガープリントの値が違うらしいことに気づけました。。

#３．APIの取得
Google APIs でGoogle Map用のAPIを取得する。
Android Studio のgoogle_maps_api.xmlのリリース用ファイルに記載されているURLからAPI取得のページにいけます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137470/ef8500d5-f99b-46b7-14f4-4fb954187e2f.png)

google_maps_api.xmlはデバック用、リリース用で別れているので注意すること。
Android Studioの標準設定ではgoogle_maps_api.xml(debug)しか表示されておりません。ちなみに、上記URLはリリース用のファイルにて取得できます。

#４．APIキーの認証
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137470/d0e56e89-0fe0-19c6-21c3-8e22d327a9cf.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137470/58349fbd-a53f-e398-41ad-74e44fcf1552.png)


キーの制限でAndroidを設定。

次にパッケージ名とSHA1証明書のフィンガープリントを設定します。
パッケージ名はAndroid StudioのManifestに記載されているpackage=com.java.xxx.xxxx.xxx.みたいな所ですので、それをコピって下さい。

そして、フィンガープリントですが、これは上記２で記載した値を設定して下さい。Google Playで確認したアプリ署名です。

#４．APIの有効化
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137470/f2ebe43c-8ea9-4288-254d-5ae680ee30eb.png)

自分が使いたいAPIの種類を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137470/fc5a718a-645f-8a44-c4f7-2de77434ab0a.png)
今回はGoogle Maps Android APIを選択です。

これで、公開apkでも問題なくGoogle APIが使えるようになっているはずです。
皆さんのご健闘を祈ります！
MVP（MVVM）とクリーンアーキテクチャに関する理解

# 概要

クリーンアーキテクチャのキモはUseCasesが依存関係の頂点にいることだと思うし原典でもそう書かれている。
Qiita他の記事でそこをないがしろにしていきなり登場人物を複数用意して実装の話をしていたり
そもそも実装サンプル読んだらそうなってない（依存方向が間違ってる）のもあったりして、もやもやした。

またクリーンアーキテクチャとMVPは両立できるのだが、まるで排他的な別物かのように書かれている記事があったりするのも気になった。


# MVPとクリーンアーキテクチャ

Robert Martinによる原典を見ると、クリーンアーキテクチャで大事なのは依存ルールとある。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/48695/e742cb54-2cc9-a5e3-adf7-5a8ac3cdee2e.png)

ユースケース・エンティティを内側に、壊れやすい外界を外側に置いて、内側にのみ依存させるのがキモであり、それ以外はどこにどういった実装を施すかは詳細には書かれてないし、状況によりけりでレイヤーも増えるともある。

MVPでいうMは、この図でいうUseCases、Entities、Gatewaysにあてはまると思う

また、図の右下が境界のまたぎ方。

> 右下の図は、どのように円の境界をまたがるのかの例だ。

とあるように、これも「例」でありパターンの一つでしかない。
依存関係を壊さなければどうやっても問題ないのであろう。

デリゲートパターンを採用しているMVPのPresenterは、このまんまの処理の流れを作っていると思う。
（図の例だとUsecaseだけど、MVPの場合、Viewの入力→Presenter(input用のInterface)→Modelで色々処理→Presenter→(output用のInterfaceから)Viewに出力、という流れ。）
クリーンアーキテクチャでこれをUseCasesとのやり取りでも行う

# 結論

つまりクリーンアーキテクチャは、

- Mを分解した
- 依存関係を整理し、最上位をUseCases+Entitiesにした。

というだけなので、MVPにクリーンアーキテクチャを適応することもできる

MVVMは、クリーンアーキテクチャの図でいう右下の境界のまたぎ方をデータバインディングにしただけなので、これももちろん両立できる。

# 参考

- https://martinfowler.com/eaaDev/uiArchs.html

- Robert Martin　The Clean Architecture（日本語訳）
http://blog.tai2.net/the_clean_architecture.html
Electronをいじってみる2

[Electronをいじってみる1](http://qiita.com/maron8676/items/c74d6db0a2452822e365)でパッケージングをしたときに、
htmlとメニューバーが表示されない問題があったのだが、html表示については解決した。

どうやらパスの設定の仕方が間違っていたようで、
とりあえずソースの一部を

```修正前.
app.on('ready', () => {
    let win = new BrowserWindow({ width: 800, height: 600 })
    // load a local HTML file
    win.loadURL(`file:///index.html`)
    console.log(app.getAppPath())
})
```

```修正後.
app.on('ready', () => {
    let win = new BrowserWindow({ width: 800, height: 600 })
    // load a local HTML file
    win.loadURL(`file://${__dirname}/index.html`)
    console.log(app.getAppPath())
})
```

相対パスを解決するときに、開発中はtsファイル（jsファイル）の場所（？）から探しているが、
パッケージングした後だとexeファイルの場所（？）から探すので見つからないみたい。
ちなみにパッケージングした後にexeと同じディレクトリにhtmlを自分で置くと表示されていた。

パッケージングした後でメニューバーが表示されないことについてはまだ不明。
そもそもメニューバー表示するコードを書いていないのに
表示されている開発版がおかしいのかもしれないのだが。
Swiftでクラス名や関数名等をログ出力する

## 概要
リテラル等を利用して、デバッグ時にクラス名や関数名等をログ出力する方法をまとめます。
(Swift3)

## NSStringFromClassを利用する

#### プロジェクト名
```swift
// 出力例： SampleProject
print(NSStringFromClass(type(of:self)).components(separatedBy: ".")[0])
```

#### クラス名    
```swift
// 出力例： ViewController
print(NSStringFromClass(type(of:self)).components(separatedBy: ".")[1])

// こんな書き方もあります
print(String(describing: self))
```        

## リテラル表現を利用する

#### ファイルパス
```swift
// 出力例： /Users/[username]/Desktop/Sample/Sample/ViewController.swift
print(#file)
```

#### 関数名        
```swift
// 出力例： viewDidLoad()
print(#function)
```
        
#### ファイル内の行番号
```swift
// 出力例：　34
print(#line)
```
        
#### ファイル内の列番号
```swift
// 出力例： 15
print(#column)
```

参考：[The Swift Programming Language (Swift 4) / Literal Expression](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Expressions.html)
GLXコンテキスト生成の落とし穴

GLX関連は普通にひとつだけコンテキストを作る場合にはどうということはないけれど、「ルート窓のコンテキストを作る」と「マルチスレッドとかで複数のコンテキストを作る」の両方に対応する時だけは注意する必要がある。

**ルート窓のコンテキストは最初に作る**

これが鉄則。なぜならルートのコンテキストには親コンテキストを指定できないからだ。仮に指定するとBadMatchかsegfaultで落ちることになる。なので必然的にルート窓のコンテキストが必要なら最初に作らなければならない。

「当てはまらないように修正したら落ちずに動作した」という情報から導き出されただけの情報なので怪しいけど、glXCreateContextのmanページには「drawableがNULLの時にctxがNULLでないとBadMatchエラーになる」とは書いてあるのでその関係だろうと思ってる。
reftexエラー reftex-using-biblatex-p: Stack overflow in regexp matcher について

reftex を使おうとしたときに, Stack overflow in regexp matcher とエラーが出る場合は reftex-parse.el の問題のようで, 新しいemacs では修正されている. 最新の reftex-parse.el を使えばよい. 日本語でこの問題について言及されたページが見当たらなかったので、備忘録もかねてメモしておく. おそらく, このページはいずれ用済みになるはず. 

# 設定の仕方

 1. [github](https://github.com/DamienCassou/RefTeX/blob/master/lisp/reftex-parse.el) から最新の reftex-parse.el をダウンロードする. 画面右側にある RAW を選んでから, 出てくるテキストファイルを保存すればよい. 
 2. ダウンロードした reftex-parse.el を lisp が読めるところにおく. 個人用の lisp 置き場に置けばよい. 
 3. (任意)バイトコンパイルをする. M-x byte-comple-file でコンパイルすればよい. それほど早くなるわけではなさそう. 

# 注意

debian Jessie の TeX システムではこのバグは直っていない(と思われる). また, 該当する reftex-parse.el が存在せずにコンパイル済の reftex-parse.elc のみしかない場合がある(自分の場合がそれだった). reftex-parse.el を個人用の lisp 置き場に入れておけばそちらを優先的に使用するので問題はおきない. システム全体で修正する場合には, 古い reftex-parse.elc を削除して, 新しい reftex-parse.el を入れればいいはず.
バグ・クイズ

バグが取れた。

クイズを１問。

# クイズ

地面に当たり判定を付けました。

![20170606a3.gif](https://qiita-image-store.s3.amazonaws.com/0/159417/9ce5b1dd-aff2-8713-a3f9-dfd032ef1a3f.gif)

ところが　このプレイヤーくんは　地面の中に引っかかりました。
何が起こったのでしょうか？

答えは　１０個のヒントのあと。

## ヒント１

地形は、マップタイルになっている。

## ヒント２

当たり判定は、地面の緑色の部分に設定した。

## ヒント３

プレイヤーくんはゲーム開始直後、前方に移動しようとした。

## ヒント４

地面の黄色いところに当たり判定は付いていない。

## ヒント５

背景の山にも　もちろん当たり判定は付いていない。

## ヒント６

地面の底のマップタイルにも　当たり判定は付いていない。

## ヒント７

紺色の何もないところにも　当たり判定は設定していない。

## ヒント８

ゲームが始まるとき、タイルが敷き詰められる。

## ヒント９

何もないところのタイルには　画像を設定しない。

## ヒント１０

地面の緑色以外の画像が設定されたタイルは、当たり判定（ボックスコライダー）をオフ（enable=false）にした。

# 答え
![20170607a6.gif](https://qiita-image-store.s3.amazonaws.com/0/159417/0eaf81f9-acc3-7404-1df2-bf4aff682365.gif)


・
・
・
・
・
画像が設定されていないタイルは、当たり判定（ボックスコライダー）が初期値のまま　オン（enable=true）になっている。

ゲーム開始直後、空間に当たって跳ね返り　地面の中に　落ちた。
git pull --rebaseをpushする前にやろうという話。

## これはなに？
いままでは気にしていなかったけど、git pull --rebase はpushする前にした方がいいよと言われた。
でもよくわからなかったので調べたのでそのまとめ。

## `git pull`って？
> `git fetch` + `git merge`のこと。

つまり、リモートの更新をローカルに持ってくるコマンドのショートカット版。 
たとえば、`topic branch` で`git pull origin master` をすると、topic branchにmasterをmergeすることになる。

## じゃあ`git pull --rebase` は？
> `git fetch` + `git rebase`のこと。

たとえば、`topic branch` で`git pull --rebase origin [main branch]` をすると、topic branchに[main branch]をbaseにしてrebaseすることになる。

```
[topic-branch] $ git pull --rebase [main branch]
```

違いがわかりにくいって？**わからなくていいや。とりあえず`git pull --rebase` を使ってからpushしよう。** 気になる人は、[分かりやすいサイトがあるから見るといいよ。](http://kray.jp/blog/git-pull-rebase/)ちなみにこれを理解するのに8時間くらいかかりました。業務時間ずっと考えてたことになりますね。

# 図にすると?

checkoutした直後は下記の状態になる。

```
develop        o-o-o
              /
master o-o-o-o
```

これがしばらく進むとmasterでの開発が進んで下記の状態になる。

```
develop        o-o-o
              /
master o-o-o-o-o-o
```

- このままpushするとconflictが起きやすい。そこで下記のようにしたい。

```
develop             o-o-o
                   /
master  o-o-o-o-o-o
```

この時使うといいのが`git pull --rebase`なのだ。よくわからなければとりあえずこれをすると良い。ちなみにこの状態がfast fowardと呼ばれる状態で、branchとして綺麗だし、差分が少ないのでconflictが起きづらいので非常に`良い`。

## conflictは普通に起こるんですよね。ほんと。
main branchとtopic branchで同じファイルを変更していた場合は、conflictが起こる。というか直してって言われる。

基本的に、branchをきれいな状態にするという思想でいいと思う。これがgit pull だと下記の状態になるのでちょっときたない。

```
develop        o-o-o
              /   /
master o-o-o-o-o-o
```

## 参考になる。
http://kray.jp/blog/git-pull-rebase/
Railsでajaxを真面目に書いたときに調べたjs, jquery, coffeescript 関連をまとめておく(適宜更新予定)

# jqueryの小技

## object 系
### objectのkeyの長さをチェックする

```coffeescript
test = {aaa: 10, bbb: 20}
Object.keys(test).length
```
これでとりあえず、チェックできる

### objectのキーを削除

```coffeescript
test = {aaa: 10}
delete test['aaa']
```

## ajax 
### ajaxで処理する'#'のLinkで、Topページに飛んでしまうのを防ぐ

`e.preventDefault()`を入れて解決
https://stackoverflow.com/questions/3252730/how-to-prevent-a-click-on-a-link-from-jumping-to-top-of-page-in-jquery

### ajax の処理

```coffeescript
$.ajax
  #(送信するOptions)
.done (data) ->
  #(成功したときの処理)
.fail (data) ->
  #(失敗したときの処理)
.complete (data) ->
  #(成功しても失敗しても必ず行う処理)
```



## data系

### dataを消すときは、removeData()

```
$(element).data('id', 'test-id') #dataを格納
$(element).removeData('id')
```

### dataの中でBooleanをTrue/Falseを切り替える

```coffeescript
$('#element').data('checked', !$('#element').data('checked'))
```


```coffeescript
$('.test-button')if $('test-button').data('clickable')
```
とかくとだめ。→ `data: { clickable: 'true' }`と直す。変数の場合は、`bool_var.to_s`でオッケー。

### jqueryでボタンにイベントをつけたが、buttonの中のiconをクリックしたときにうまくいかない

`$(e.currentTarget)`を使うことで解決

## button

### buttonをdisable/enableする

```coffeescript
$(button).prop 'disabled', true
$(button).prop 'disabled', false
```

## bootstrap

bootstrap3でdropdownのsubmenuが削除された(https://github.com/twbs/bootstrap/pull/6342)

## HTML

### tabindexとは

`tabindex=-1`とは、removes the element from the default navigation flow.


https://stackoverflow.com/questions/32911355/whats-the-tabindex-1-in-bootstrap-for


## selectを解除する

```
$("option:selected").prop("selected", false)
```
or

```
$("option:selected").removeAttr("selected");
```


## Event系

### inputでエンターした時にtriggerする

```coffeescript
$(element).on 'keypress', (e) ->
  if e.which == 13
    doSomething()
```

### クリックするたびにClassをつけたり外したりする

```coffeescript
$('.btn-class').on 'click', (e) =>
  $(e.currentTarget).toggleClass('glyphicon-unchecked')
  $(e.currentTarget).find('span').toggleClass('glyphicon-check')
```

`$(e.currentTarget)`: to get a handle to the element that would have been `this`. this is not same as `$(e.target)`. `$(e.targert)`はクリックされたものになるので、ButtonだったりIconだったりしてしまう。しかし、`$(this)`は常に `button`を示す。（問題は、fat arrowの中での`$(this)`だったが…）

Use event.currentTarget which is always the object listening for the event; event.target is the actual target that received the event

https://stackoverflow.com/questions/24540478/coffeescript-this-is-always-replaced-by-this-in-fat-arrow-callback

https://stackoverflow.com/questions/22962386/click-event-on-button-is-sending-an-icon-as-the-target

### inputに入力されたときにEventを発生させる

`.on`のあとに 'change keyup paste'をつければよい

```coffeescript

$('#filter-input').on 'change keyup paste', -> someFunc()
```

## その他

### embeded rubyのhaml(html)内でdataにBooleanを渡すときは、stringにする。
```haml
%button.test-button{ data: { clickable: true }, disabled: true }
```

### dropdownを複数btn-groupに入れるときは、２重にする
https://www.w3schools.com/bootstrap/bootstrap_button_groups.asp
RailsのRoutesの理解し始め。(railstutorial2週終わったくらい)

## これは何？
これはRailsTutorialを終えたくらいの人が、Routesについてやっと理解し始めたのを記念して書いているよ。

## これまでの理解
正直に言おう。RailsTutorialは2周したけれど、ほぼ「こなす」ことに始終してしまった。
これまでの理解はこうだ。

**なんだかよくわからないけど、こういうふうに書けばここのページを見に行くのか。** → それ以外のことがらが多くて忘れる。
更に、とりあえずこのURL叩けばそこを見に行くという認識。

## 今回の理解
Routesに関して、RESTメソッドと関連付けて理解した。

### config/routes.rbって？
RESTメソッドとURLの組み合わせから、Controllerのメソッドを呼び出し、ControllerはViewを呼び出す。

RESTとURLの組み合わせはこちら(参考 :https://railsguides.jp/routing.html)

|HTTP動詞|パス|コントローラ#アクション|目的|
|---|---|---|---|
|GET|/photos|photos#index|すべての写真の一覧を表示|
|GET|/photos/new|photos#new|写真を1つ作成するためのHTMLフォームを返す|
|POST|/photos|photos#create|写真を1つ作成する|
|GET|/photos/:id|photos#show|特定の写真を表示する|
|GET|/photos/:id/edit|photos#edit|写真編集用のHTMLフォームを1つ返す|
|PATCH/PUT|/photos/:id|photos#update|特定の写真を更新する|
|DELETE|/photos/:id|photos#destroy|特定の写真を削除する|

## 念のため
一応RailsのDocsを見る癖をつけよう。
https://railsguides.jp/routing.html
bitcoindをdockerで環境構築する

この記事では、Mac OS Sierra 10.12.4を使っています。

ビットコインのclient/APIであるbitcoindをdockerで環境構築した時の情報をまとめました。
##1.docker hubからbitcoindのdockerfileを取得

今回はbitcoindで検索して最もpullの多い、kylemanna/bitcoindを使わせてもらいました。
https://hub.docker.com/r/kylemanna/bitcoind/

設定ファイルを変えたかったため、docker pullはせずに[githubのリポジトリ](https://github.com/kylemanna/docker-bitcoind)からgit cloneしました。

```shell-session
git clone https://github.com/kylemanna/docker-bitcoind
```

##2.bitcoindの実行オプション修正（任意）
cloneが完了したら、binフォルダにあるbtc_initを修正して、``txindex=1``を書き込みます。
txindexはダウンロードするbitcoinにインデックスを振るかどうかのオプションです。
インデックスがなければ、transactionの取得が使えませんので、設定しておきます。
※ダウンロード後にreindexでインデックスを振ることもできます

```shell:btc_init
cat <<EOF > $HOME/.bitcoin/bitcoin.conf
disablewallet=${DISABLEWALLET:-1}
printtoconsole=${PRINTTOCONSOLE:-1}
rpcuser=${RPCUSER:-bitcoinrpc}
rpcpassword=${RPCPASSWORD:-```dd if=/dev/urandom bs=33 count=1 2>/dev/null | base64```}
txindex=1 
``` 

bitcoin.confの作成をしているところにtxindex=1を追加します。
bitcoindはbitcoin.confの設定を見て動きます。

##3.dockerのイメージをビルド
dockerfileのある場所で、imageをビルド。

```shell-session
docker build -t bitcoin .
```

##4.ビルドしたイメージのコンテナを作成
bitcoindは**全ブロックデータをダウンロードしようとします。
2017/6/6現在、約470000ブロックが存在しており、全てダウンロードすると40GB以上は容量を食ってしまいます。**
そのため、-vオプションで、ホスト上のどこかにボリュームをマウントしておくことをお勧めします。私は、bitcoin-dataというフォルダを$HOME配下に作り実行しました。

```shell-session
docker run -v $HOME/bitcoin-data:/bitcoin --name=bitcoind-node -d \
     -p 8333:8333 \
     -p 127.0.0.1:8332:8332 \
     bitcoin
```

docker psでコンテナができていることを確認します。

```shell-session
docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                               NAMES
3f57b8b4ea28        bitcoin             "docker-entrypoint..."   27 minutes ago      Up 27 minutes       127.0.0.1:8332->8332/tcp, 0.0.0.0:8333->8333/tcp, 18332-18333/tcp   bitcoind-node
```

docker logsでビットコインのダウンロードも進んでいることを確認します。

```shell-session
docker logs --tail 100 bitcoind-node
2017-06-06 14:58:31 UpdateTip: new best=00000000003c40a610d51694b09cad43067fd097ac31d856a2e1b3920f4eaf6d height=76981 version=0x00000001 log2_work=53.6344 tx=108889 date='2010-08-29 02:57:51' progress=0.000480 cache=18.6MiB(86410tx)
2017-06-06 14:58:31 UpdateTip: new best=0000000000633aea8e81a332774908abcf638051b6fabaa9836c09351458b507 height=76982 version=0x00000001 log2_work=53.634676 tx=108890 date='2010-08-29 03:00:54' progress=0.000480 cache=18.6MiB(86411tx)
```

##5.bitcoin-cliの動作確認
bashでコンテナの中に入って、bitcoin-cliのコマンドを叩いて返ってきたらOK！
あとはダウンロード完了を待ちます。（途中でダウンロードをやめたい場合は、`bitcoin-cli　setnetworkactive false`で中止できます。

bashでコンテナに入る

```shell-session
docker exec -i -t bitcoind-node bash
```

bitcoin-cliのコマンドを叩いて動作確認

```shell-session
bitcoin-cli getbestblockhash
000000000000021f8cc6b31d78e4ecc462c10925f15ea7e2b8fa16e8132d9712
```

[bitcoin-cliのコマンド一覧wiki](https://en.bitcoin.it/wiki/Original_Bitcoin_client/API_calls_list)
※コマンドはよく更新されるのでhelpを叩いて確認するのが確実です。
Tips : [Bash] 配列の羅列データからfastaを出力する


　以下のような配列を羅列したデータからfastaを出力したいとします。

```txt:seq.txt
ATCGGCTGC
AGGCCGGGTTT
TTCGAGCTAAAA

```

 　python などでスクリプトを書いても良いですが、この程度であればbash でワンライナー処理として書けます。
　以下のコマンドをbash に叩けばfasta ファイルを出力できます。


```bash:配列の羅列からfastaを出力する。
cat seq.txt | while read line; do echo -e '>'$line"\n"$line >> seq.fa ; done
```

```txt:seq.fa
>ATCGGCTGC
ATCGGCTGC
>AGGCCGGGTTT
AGGCCGGGTTT
>TTCGAGCTAAAA
TTCGAGCTAAAA
```

 　処理内容を簡単に解説します。

　１．```cat <filename>```でファイルを読み込んで標準出力へ表示します。

　２．```| while read line; do <command>; done```によって出力を1行ずつ読み込んで<command>の処理を行います。

　　　このとき読み込まれる1行は変数```$line```に格納されます。

　３．```echo <text>```を使って標準出力へ表示します。

　　　ここで注意するポイントを列挙します。

　　　・```echo```が変数を解釈してくれるように```$line```の$を忘れないようにしてください。
　　　・```-e```オプションで```\n```のようなエスケープシーケンスを認識させるようにします。
　　　・>のような特別な処理をさす記号はシングルクォーテーション''で囲み、文字列として認識させます。

　４．３の処理によって標準出力されたテキストをリダイレクト```>```でseq.faファイルへ保存します。
　　　しかし```>```だけだと常に新しいファイルとして書き込みが行われるため前の書き込みが消去されてしまいます。
　　　```>>```を使うといわゆる追加書き込みモードで書き込めるためこちらを使います。

　以上です。
　少し丁寧すぎる説明だったかもしれませんが、今回の説明がお役に立てれば幸いです。ありがとうございました。
[WordPress]管理画面のターム一覧でカラム追加

投稿一覧でのカラム追加と若干異なる

```php:functions.php
add_filter("manage_edit-{taxonomy}_columns", function ($columns) {
	$columns['sample'] = 'サンプル';
	return $columns;
});

add_filter('manage_{taxonomy}_custom_column', function($out, $column_name, $term_id) {
	if ( $column_name == 'sample' ) {
		$out = $term_id;
	}
	return $out;
}, 10, 3);
```

manage_{taxonomy}_custom_column  の引数が3つっていうのに注意
GoogleAppScriptを使用して一定時間毎にFirebaseにレコードを追加する

#環境
FirebasAppライブラリ　Ver24

#概要
GoogleAppScriptを使用すると時間をトリガーにして、何らかの処理を実行することができます
この仕組みを使用して一定時間毎にFirebaseにレコードを追加するテストをしてみました

#Firebaseコンソールの設定
https://console.firebase.google.com/

##プロジェクトの作成
・「プロジェクトの追加」を押し、プロジェクトを作成する
　・プロジェクト名と国を設定（例：TestGAS, 日本）
　・testgas-afa72となった

##データベースのシークレットの確認
・左側メニューの「Overview」の隣の歯車アイコンを押し、プロジェクトの選択を押す
・上部メニューの「サービスアカウント」を押す
・「データベースのシークレット」を押す
・「シークレット」と書かれている下の●●●●●を選択し、表示を押す

#GoogleAppScriptの作成
・以下にアクセスし「StartScripting」を押す
　https://www.google.com/script/start/
　エディタ画面になり、作成できるようになる
　「myFunction」という空の関数が表示される
・実行ボタンを押し、プロジェクトの保存、プロジェクト名の入力をする（例:TestFirebase）
　GoogleDriveに保存される
　実行されるが空関数なので何にもならない

#GoogleAppScriptを開く
・エディタ画面で「ファイル」>「開く」を押すと保存先のGoogleDriveが開く
・作成したプロジェクトを選択し、上部右側の●が縦に３つ並んだボタンを押し、「アプリで開く」>「GoogleAppScript」を押す

#FirebaseAppライブラリの追加
https://sites.google.com/site/scriptsexamples/new-connectors-to-google-services/firebase

・エディタ画面で「リソース」>「ライブラリ」を押す
・「ライブラリの追加」に「MYeP8ZEEt1ylVDxS7uyg9plDOcoke7-2l」を入力し、「追加」を押す
・「FirebaseApp」と表示されるので「バージョン」を選択する（例:24)

#プログラム
このプログラムでは10分毎にレコードを２つ追加しています

~~~javascript
function setTrigger()
{
  //十分毎に処理を実行
  var executeFuncName = "createDatas";
  deleteTriggers( executeFuncName );
  ScriptApp.newTrigger( executeFuncName ).timeBased().everyMinutes( 10 ).create();
}

function deleteTriggers( executeFuncName )
{
  //登録されているトリガーを削除
  var triggers = ScriptApp.getProjectTriggers();
  for( var i = 0; i < triggers.length; i++ )
  {
    if ( triggers[ i ].getHandlerFunction() == executeFuncName )
      ScriptApp.deleteTrigger( triggers[ i ] );
  }
}

function createDatas()
{
  var nowDate = new Date();
  var formattedNowDate = Utilities.formatDate( nowDate, "Asia/Tokyo", "yyyyMMddHHmmss");
  Logger.log( formattedNowDate );
   
  var firebaseUrl = "https://testgas-afa72.firebaseio.com/";
  var secret = "P1155P0zGvA8NMFVVEM25hcHdXNvZWELGTsa8SBx";
  var firebase = FirebaseApp.getDatabaseByUrl( firebaseUrl, secret );
  
  var userDatas = [];
  for( var i = 0; i < 2; i++ )
  {
    var id = randomId( 8 );
    userDatas.push( 
    {
      id:id,
      score:100+i,
      date:formattedNowDate
    });
  }
  for( var i = 0; i < userDatas.length; i++ )
  {
    var id = userDatas[ i ].id;
    firebase.setData( "users/" + id, userDatas[ i ] );
  }
}

function randomId( length )
{
  //適当にランダムで返す
  var chars = "abcdefghijklmnopqrstuvwxyz0123456789";
  var charLength = chars.length;
  var str = "";
  for( var i = 0; i < length; i++ )
    str += chars[ Math.floor( Math.random() * charLength ) ];
  return str;
}
~~~
Unityでタイルマップを敷き詰めたときにできる隙間や線のちらつきを解消しようぜ

![20170607a5.gif](https://qiita-image-store.s3.amazonaws.com/0/159417/6ebcc4ac-0b86-6880-5279-dfa1483fb5de.gif)
これぐらいなら　ＯＫ画質だろう。

何がダメだったかというと、
![20170602e2.gif](https://qiita-image-store.s3.amazonaws.com/0/159417/87478a94-8000-b64d-5c97-3e12999b007d.gif)
タイルのつなぎ目に、縦線が見えていた。

参考にした記事

「20150613
【Unity8】ユニティちゃんを歩かせる！Animator Controller, rigidbody2D.velocity【横スクロールユニティちゃん2】」ひよこのたまご
http://hiyotama.hatenablog.com/entry/2015/06/13/090000

「SpriteRenderer、とりあえずの隣接ドット対策」Unity / VRゲーム開発日記＠長崎
http://icoc-dev.hatenablog.com/entry/2014/09/29/111645

解消に効果的だったのは２点。

- スプライトの [Advanced]-[Filter Mode]を[Point(No Filter)] にする。拡大縮小でのぼかしがオフになる
- タイルは周囲1ピクセル余分に長く描いておき、ゲームでは1ピクセル小さく切り抜いて使う。タイルの隙間に線が出なくなる

また、使いどころがありそうなもの。

- [Edit]-[Project Settings...]-[Quality] で Level を Fastest にする。アンチエイリアスをオフにして　滑らかになったドットをギザギザにするのが目的



# ぼかしをオフにする

![20170604n1b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/3269c83b-8c3e-9eed-f717-78e9b50178d6.png)

ギザギザなドット絵にしたいときは、これ。
タイルの隙間の線とは関係ない。


# １ピクセル余分に長く描いておいて、１ピクセル縮めて使う

![20170607h1b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/ced4a504-c2f1-3a2a-e45c-76a882171b43.png)

タイルの隙間の線を消すなら、これ。

スプライト・エディターにも　ちょうど Offset、padding という項目があり、タイルの隙間のちらつきの防止に　ちょうど使える。

offset は 左上のタイルの、左上角からの隙間、
padding は タイル間の隙間。

# 画質を Fastest にする

![20170604n2b.png](https://qiita-image-store.s3.amazonaws.com/0/159417/e322100e-50d1-788a-1f6e-6982c49e9ab5.png)

スクロール速度が欲しいときはこれ。

もともと、どちらかというと　画質より　スクロール速度が欲しいときなどに使う。
TextViewにVector drawableを使う

# AndroidとVector

Androidでは2年ぐらい前からVector形式を扱えるようになりました。
[InstantApp](https://developer.android.com/topic/instant-apps/index.html)が登場していることから分かる通り、現在のモバイルアプリにおいてアプリの容量削減は必須となっています。

# drawable (left|top|right|bottom)

突然ですがこのようなレイアウトをどのようにしますか？

<img width="139" alt="スクリーンショット 2017-06-07 0.27.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/22527/b099dca8-0bcb-be30-6768-7e7f5af9aeef.png">

簡単に考えるならLinearLayoutでorientationをhorizontalにして、ImageViewとTextViewを並べる方法がありますが、
Androidにはdrawable(left|top|right|bottom)というTextViewにdrawableを簡単にセット出来るAPIがあります。

TextViewには前述のVector形式のファイルもセットすることが出来ます。
ただし、Lollipopより下のOSバージョンで使う場合はselectorで囲ってStateListを作る必要があります。

```xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_android_black_24dp" />
</selector>
```

2017年現在で min sdk versionを21に出来る商用アプリはまだ少ないと思いますので、
TextViewにVector Drawableを使いたい場合はdrawableの二重管理になってしまいます。

私が担当しているサービスでもアイコンは全てVector Drawableのため二重管理を避けるために
[CompoundIconTextView](https://github.com/AAkira/CompoundIconTextView)というライブラリを作りました。

中身はとてもシンプルでresourceファイルからBitmapを作成してDrawable形式に変換しています。

```Java

private Drawable resource2VectorDrawable(@DrawableRes final int resourceId, @ColorInt final int iconColor,
                                             final int iconWidth, final int iconHeight) {
        final Context context = getContext();
        final Drawable drawable = AppCompatResources.getDrawable(context, resourceId);

        if (drawable == null) {
            throw new Resources.NotFoundException("Resource not found : %s." + resourceId);
        }

        // See if we need to 'fix' the drawableLeft
        fixDrawable(drawable);
        // Set color
        DrawableCompat.setTint(drawable, iconColor);
        DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_IN);
        // Resize Bitmap
        return new BitmapDrawable(context.getResources(),
                Bitmap.createScaledBitmap(drawable2Bitmap(drawable, iconWidth, iconHeight), iconWidth, iconHeight, true));
    }

  private static Bitmap drawable2Bitmap(final Drawable drawable, final int iconWidth, final int iconHeight) {
        final Bitmap bitmap = Bitmap.createBitmap(iconWidth, iconHeight, Bitmap.Config.ARGB_8888);
        final Canvas canvas = new Canvas(bitmap);
        drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
        drawable.draw(canvas);
        return bitmap;
    }
```

TextViewのdrawableではiconの縦横サイズを自由に決める事が出来ませんが、自由に変更出来るようになっています。
アイコンの色も自由に変えられるようになっているので、使い勝手は良いと思います。
4系以下でvectorの色を変えたい場合はgradleに以下の記述が必要なのでお気をつけ下さい。

```groovy
android {
  defaultConfig {
    vectorDrawables.useSupportLibrary = true
  }
}
```

CompoundIconTextView : https://github.com/AAkira/CompoundIconTextView

*こういうのはsupport libraryで対応して欲しいですね (´ω`)*
laravelで400番台以外のエラーを500ページで表示

# 自己紹介
- Qiita初投稿です。
- php歴は約7年
- laravel歴は3ヶ月

# 前提
- errorsフォルダに500に該当する画面を用意している（例：500.blade.php）
- 400番台以外のエラーは500ページを表示したい方

# 経緯
- 予期せぬエラーは500ページとしてまとめたかった。

# カスタマイズ
## app\Exceptions\Handler.phpを修正

これは他でも紹介されている通り、Handler.phpのrenderを修正します。

```php:Handler.php
public function render($request, Exception $exception)
    {
        // 403,404などのHTTPエラー以外はerrors/500画面表示
        if (!$this->isHttpException($exception)) {
            return response()->view("errors.500");
        }
        
        return parent::render($request, $exception);
    }
```

と、これで完成かと思ったら、
これも他でも紹介されているように
バリデーションエラーになった時にも500ページが。。。
バリデーションエラーまでも500ページにはしたくない。

## app\Exceptions\Handler.phpを再修正

調べた結果、ValidationExceptionとなっていたものの、
namespaceで「\Illuminate\Validation\ValidationException」
となってました。

なので、下記のように修正しました。


```php:Handler.php
public function render($request, Exception $exception)
    {
        // 403,404などのHTTPエラー, バリデーションエラー以外はerrors/500ページ表示
        if (!$this->isHttpException($exception)
            &&
            !$exception instanceof \Illuminate\Validation\ValidationException
            ) {
            return response()->view("errors.500");
        }
        
        return parent::render($request, $exception);    
    }
```

# 最後に
バリデーションエラーが500ページとなったので、どこかでコケたのかと思いましたが、
わかってみれば、なんてこともないことでした。

他にもこんなやり方があるよ、
そのやり方はよくないよ
などあれば、ぜひ教えて頂けると助かります。
APEX5.1 Tips 静的コンテンツでCSSファイルを使う方法

静的コンテンツでCSSファイルを用いる方法を記載します。

①クラス名(以下の場合test)をつけたCSSファイル(test-styles.css)を用意します。アンダーライン等の装飾系は<B>display:inline-block;</B>を付けます。

```
.test h2 {
  display:inline-block;
  border-bottom: double 5px #0000ff;
}

.test h3 {
  display:inline-block;
  background: #ffa500;
  padding: 0.5em;
}

.test h4 {
  display:inline-block;
  color: #ff00ff;
  border: solid 3px #ff00ff;
  padding: 0.5em;
  border-radius: 0.5em;
}

.test h5 {
  font-size: 16px;
  line-height: 24px;
  font-weight: bold;
  color: #404040;
  margin: 0 0 8px 0;
}
```

②作成したCSSファイルをアップロードしますので、共有コンポーネントの静的アプリケーション・ファイルをクリックします。
![tip2-1.gif](https://qiita-image-store.s3.amazonaws.com/0/165520/815f7b9c-9cb7-7f8f-44d5-6104b69d934c.gif)

③次の画面でファイルをアップロードをクリックし、CSSファイルをアップロードします。
④アップロード後、参照先（<B>#APP_IMAGES#test-styles.css</B>）をメモしておきます。
![tip2-2.gif](https://qiita-image-store.s3.amazonaws.com/0/165520/02845fa6-dd13-34ff-0855-6698bb3c79ef.gif)
⑤静的コンテンツのページ・デザイナの左ペインの最上位を選択し、CSSのファイルURLに④でメモしたアップロード先を入力します。
![tip2-3.gif](https://qiita-image-store.s3.amazonaws.com/0/165520/3850acaf-4595-1389-ea5b-f1d45aac4628.gif)

⑥静的コンテンツのテキストに以下を記載します。装飾系は文末に改行を入れて下さい。

```
<h2>h2これはテストです</h2><BR>
<h3>h3これはテストです</h3><BR>
<h4>h4これはテストです</h4><BR>
<h5>h5これはテストです</h5>
```

⑦CSSクラスにクラス名（test）を入力します。
![tip2-4.gif](https://qiita-image-store.s3.amazonaws.com/0/165520/6ca4f70c-c8a6-f6bc-b928-c22a1da7118f.gif)

⑧CSSが有効化されていることを確認します。上のリージョンがCSS未指定で下のリージョンがCSSが有効化されているテキストになります。
![tip2-5.gif](https://qiita-image-store.s3.amazonaws.com/0/165520/0393937a-ec40-a99b-5ad7-9b77482c9368.gif)
後から追加した要素にもイベントを設定させる

以前jQueryで後から追加した要素でもイベントを発火させるために```.live()```という機能を使用していましたが、1.7で非推奨になり```.on()```で代用できるということで```.live()```同様の使い方で使用していましたが、今まで使用方法を間違って覚えていました。

# 旧 live

```js
$(selector).live("click", function () {
    // 処理
});
```

# 勘違い on

```js
$(selector).on("click", function () {
    // 処理
});
```
これだとselectorにイベントは設定できるが後から追加された要素ではselectorが一致していてもイベントが発火しない。


# 正解 on

```js
$(document).on("click", selector, function () {
    // 処理
});
```

追記:documentだと全ての要素をクリックされたときに評価されるらしいので、可能てあればリフレッシュされない要素のなかで範囲を狭めた方がよさそうです。
[javascript] page.jsでリンクが効かなくなってしまう問題の解決方法

## 現象

page.jsでルーティングをすると、
`<a href="/hoge">~~~</a>`のようなリンクが効かなくなっていた。
（コールバックは実行されて、その後ページロードがされない）

```javascript
page('/top', () => {
  console.log("top");
});

page('/hoge', () => {
  console.log("hoge");
});

page();
```

## 解決方法

デフォルトでclickイベントを補足して
ページロードを止めてしまうので以下の記述を補足する必要がある。

```js
page({
  click: false
});
```
javascriptでファイル名の配列を拡張子順に並べ替える

昇順

```js
const sortFiles = (list) => { //list = ["src/index.text", "src/index.html"]
  list.sort(function(a,b){
    var aExtension = a.split('.')[1]
    var bExtension = b.split('.')[1]
    if( aExtension > bExtension ) return 1;
    if( aExtension < bExtension ) return -1;
    return 0;
  });
```
結果：["src/index.html", "src/index.text"]

降順にするには`1`と`-1`を逆にする。


###追記
（@yama-ts さんより）上の方法だと`index.min.css`のような場合うまく行かないので、最後のピリオドを見るようにする。

```js

const sortFiles = (list) => { //list = ["src/index.text", "src/index.html"]
  list.sort(function(a,b){
    const reg = /\.[^\.]+$/;
    const aExtension = a.match(reg);
    const bExtension = b.match(reg);
    if( aExtension > bExtension ) return 1;
    if( aExtension < bExtension ) return -1;
    return 0;
  });
};
```
React + Material-UI Memo

```
環境：
- React
- Material-UI
- JavaScript
```

### DOM
JavaScriptの仕様
HTMLをJavaScriptでも使えるようにする
-> 1つのオブジェクトにする

### null判定
nullの場合、false判定

### オブジェクト(JavaScriptのタグ)を書きたい！
=> `{{}}`
-> {}: JavaScript書きますよ
-> {}: オブジェクト書きますよ

### Material-UI: PropertiesのType
node ≒ element
-> {}が使える(コンポーネントをそのまま渡せる)

### おまけ：　HTML
ブロック要素：自動改行
->とりあえずこれ使っとけ `<div>`

インライン要素：改行されない
-> とりあえずこれ使っとけ `<span>`
Chrome59 通常時とヘッドレスモードの動作の比較

2017/06/05頃にChrome59がリリースされたようです。
このバージョンからヘッドレスモード対応との事で、待ち遠しくしていた方々も多いのではと思います。
ただし最新版のドライバーChromeDriver2.29ではChrome58までしか対応していないため、もうしばらく待つ必要があります。とはいえ、ある程度は動かせるので、準備をしておくことは可能です。

#ヘッドレスモードでの動作方法
通常時（非ヘッドレスモード）はChrome59+ChromeDriver2.29の組み合わせで問題なく動作するようです。

```java
System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");

WebDriver driver = new ChromeDriver();
driver.get("http://qiita.com/");

File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(scrFile, new File("/path/to/screenshot.png"));

driver.quit();
```

そして「[ヘッドレス Chrome ことはじめ](https://developers.google.com/web/updates/2017/04/headless-chrome?hl=ja)」などを参考にしてChromeのパラメータを追加します。

```java
System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");

// Chromeのパラメータ「--headless --disable-gpu」指定
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless", "--disable-gpu");

// WebDriver driver = new ChromeDriver();
WebDriver driver = new ChromeDriver(options);
driver.get("http://qiita.com/");

File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(scrFile, new File("/path/to/screenshot.png"));

driver.quit();
```

こんな感じにすれば、ディスプレイのない環境でもスクリーンショットが撮れます。

#現時点での動作比較
私のLinux環境だけなのかもしれませんが、よく理解できない動作の違いがちらほら見られます。
安定するまでは注意して使用したほうが良さそうです。

## プロキシ設定が動作しない
OS設定と異なるプロキシを使用する場合、Chromeではパラメータ

```
-–proxy-server="http=xxx.xxx.xxx.xxx:8080;https=xxx.xxx.xxx.xxx:8080"
--proxy-bypass-list="local-test-server"
```

のように指定すればいいはずなのですが、ヘッドレスモード時にこれを付けると

```java:
WebDriver driver = new ChromeDriver(options);
```

あたりで止まってしまいます。

##証明書に問題のあるサイトにアクセスできない
URLの左側に赤い三角が出るサイトにアクセスしようとすると

```java:
driver.get(url);
```

で止まります。Chromeのパラメータ`--ignore-certificate-errors`というのを付けてみても変化なし。

##ウインドウの切り替え処理が動作しない
複数ウインドウが絡むサイトの場合、

```java:
driver.switchTo().window(windowId);
```

のようにして切り替えるのですが、数分待っても切り替わりません。
OSXでCMakeを導入してコマンドラインから扱えるようにする

## はじめに

OSXでCMake使おうとしたら入ってなくて困った！というときのCMake導入手順

## CMakeの導入

### mac portsでインストール

`sudo port install cmake`

あるいはguiのCMakeを導入したい場合は

`sudo port install cmake +gui`

### インストーラを落としてきてインストール

[ココ](https://cmake.org/download/) からOSX用のインストーラを落としてきます．

導入後CMakeを起動して，メニューの"Tools" > "How to Install for Command Line Use" を選択．

以下のA,B,CのどれかでコマンドラインからCMake利用できるように設定します

#### A. 環境変数を追加する
`PATH="/Applications/CMake.app/Contents/bin":$PATH`

#### B. /usr/local/bin にシンボリックリンクをはる
`sudo "/Applications/CMake.app/Contents/bin/cmake-gui" --install`

#### C. 指定したパスにシンボリックリンクをはる
`sudo "/Applications/CMake.app/Contents/bin/cmake-gui" --install=/path/to/bin`
chererio-httpcliを使いつつ、文字コードをshift_jisでファイルを保存する



### 開発環境

+ node.js 7.3.0
+ cheerio-httpcli 0.6.11
+ iconv-lite 0.4.17


chererio-httpcliを使うと簡単にスクレイピング出来てしかもjQueryの書き方が出来るので楽なのですが、読み込んだファイルの中身を問答無用にUTF-8に変換してしまいます。（本来はありがたい機能です）
しかし、htmlをダウンロードする場合、そのhtmlのcharsetがUTF-8以外の場合、ダウンロードしたファイルをブラウザで確認すれば文字化けしてしまいます。よってファイル書き込み時は工夫が必要です。

```

var client = require('cheerio-httpcli');
var fs = require('fs');
var iconv = require('iconv-lite');
var savepath = ""; //適当なパス
var url = ""; //utf-8以外を指定しているhtml

client.fetch(url, {}, function(err, $, res){

	//略

 fs.writeFileSync(savepath, iconv.encode($.html(), 'shift_jis'));
       
}

```

以上で可能でした。試してませんが、shift_jis以外でもいける・・・かも
RailsアプリケーションにSentryを導入する

railsアプリケーションにSentryを導入する。

# Sentry とは
https://sentry.io/welcome/
エラーログ収集に使うツールである。slack通知などもできるので便利。

# Railsアプリケーションに導入
基本的にはドキュメントのとおり。
https://docs.sentry.io/clients/ruby/integrations/rails/

## installation
ruby用のSentryクライアントとして、 `raven-ruby` gemを使う。

```rb
gem "sentry-raven"
bundle install
```

## Configuration
`config/initializers` 配下などに`raven.rb`など適当な名前で作成する。

```rb
Raven.configure do |config|
  config.dsn = 'https://<key>:<secret>@sentry.io/<project>'
end
```

`'https://<key>:<secret>@sentry.io/<project>'` はSentryの任意のプロジェクトに接続するためのAPIキーである。
このAPIキーはRailsアプリケーションの場合、[dotenv](https://github.com/bkeepers/dotenv)などで環境変数として設定するのが良いだろう。

### Parameters Filtering
パスワード等の情報をフィルタリングしている（このような設定をしている↓）場合
http://qiita.com/kakkunpakkun/items/4639bc653924e2dc8dbe

```rb
Raven.configure do |config|
  config.sanitize_fields = Rails.application.config.filter_parameters.map(&:to_s)
end
```
とすることでその内容をSentryに送らないようにできる。

### environment
環境によってSentryを使用するか選択する場合、以下のように設定する。
(例)test, production環境で動かす場合

```rb
Raven.configure do |config|
  config.environments = %w[test production]
end
```

開発環境で確認したい場合、`config.environments = 'development'` を追加する。

## Test
### rubyでテスト
単純にrubyコードでテストしたい場合、以下のようなコードを実行する。

```rb
Raven.capture { 1 / 0 } 
```

### rake taskでテスト

```rb
bundle exec rake raven:test["https://<key>:<secret>@sentry.io/<project>"]
```

でSentryと接続テストを行うことができる。

### アプリケーション上でテスト
Railsアプリケーションでは上の設定のみで、`Raven.capture` を呼ばなくてもSentryにエラーログを収集できる。試しにアプリケーションコード内で`1/0`のような例外を発生させれば良い。

またエラーハンドリングしたい場合は、` Raven.capture_exception(e)` メソッドを使用する。

## 気をつける点
### エラーキャッチから除外されているものがある
`sentry-raven`では以下のエラーはキャッチしないようにデフォルトで設定している。

https://github.com/getsentry/raven-ruby/blob/a80cf01488b5dc7f3930975274c4d109816dd258/lib/raven/configuration.rb#L152-L161

```rb
    IGNORE_DEFAULT = [
      'AbstractController::ActionNotFound',
      'ActionController::InvalidAuthenticityToken',
      'ActionController::RoutingError',
      'ActionController::UnknownAction',
      'ActiveRecord::RecordNotFound',
      'CGI::Session::CookieStore::TamperedWithCookie',
      'Mongoid::Errors::DocumentNotFound',
      'Sinatra::NotFound'
    ].freeze
```

### 開発環境で動かない
自動でエラーキャッチできるはずが動かない場合、

```rb
gem 'better_errors'
gem 'binding_of_caller'
```

のようなgemがデバッグ用に使われるのでそこで処理が止まってしまい、ravenがcallされないことがあるかもしれない。

###  `config.consider_all_requests_local = true` にしている
詳細なデバッグ情報をHTTPレスポンスとして出力するかどうかのフラグで、development環境ではデフォルトでtrueになっている。
これが邪魔をする可能性があるので一時的にfalseにし、テストをすると良い。
【勉強会用メモ】ヒアラブルデバイス

# はじめに
今回はヒアラブルデバイスについて触れようと思う。

ウェアラブルデバイス、あるいはウェアラブル端末というものは耳にすることも少なくない。身に付けるデバイス・端末のことで、腕時計型やリストバンド型が有名だが、ヒアラブルデバイスは、耳にはめるイヤホン型のウェアラブルデバイス。

2017年5月23日、NECがヒアラブルデバイスの実証実験用プロトタイプを開発したという発表があった。そこで発表された新機能とともに、ヒアラブルデバイスでどのようなことができるのかをまとめてみる。

# 機能・特長
#### 利用者の状態の記録
歩数や移動距離、心拍数の計測など、活動量計の機能。腕時計型やリストバンド型ウェアラブルデバイスでよく知られている機能だが、ヒアラブルデバイスは頭部(外耳道)という揺れやノイズの少ない位置から安定して情報が得られるという特長がある。

#### 位置情報の取得
地磁気センサを搭載しており、地下やビルの中のようにGPS信号の届きにくい屋内でもユーザの位置を推定可能。

#### 個人認証
外耳道の構造が個人で異なることを利用した認証方法。イヤホンから出した音の反響音をもとに個人を識別する。

#### 音声アシスタント
専用のスマートフォンアプリと連携して、ニュースやSNSなどの読み上げを行う。マイクを使うことでSNSの返信も可能。

# 気になることまとめ
今後、ヒアラブルデバイスがどのような形で自分の仕事にかかわってくるかを考えてみる。
- 端末利用時のセキュリティ強化
- チームメンバーの行動把握

# 参考
耳を使った「ヒアラブルデバイス」で広がる、新たなコンピューティングの可能性
https://wisdom.nec.com/ja/events/2016121401/index.html

NEC、ヒアラブルデバイスのプロトタイプを開発
http://jpn.nec.com/press/201705/20170523_01.html

ヒアラブルデバイス | IoT
http://iot-jp.com/iotsummary/iottech/%E3%83%92%E3%82%A2%E3%83%A9%E3%83%96%E3%83%AB%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9/.html