OmniAICreator/Qiita-1.07M huggingface dataset:
Rustとコルーチンと非同期I/O

# 歴史

- 昔はスケジューラ実装にsegment stackを使っていた(libgreenを同梱)
- 1.0なる前にやめた
- libgreenをライブラリとして分離 (しかしメンテされず...)

---

## ライブラリ

libgreen以降に実装がいくつか

- context-rs/coroutine-rs
- libfringe

---

## context-rs/coroutine-rs

- どちらもzonyitooさんが書かれたもの
- Boost.{Context,Coroutine}の移植

---

## libfringe

- パフォーマンスがよいらしい
    - なんでかよくわからん、、XMMあたりも保存レジスタ指定入っとるし...
    - 分岐予測ミス回避のために `ret` でなく `jmp+pop` にしてるとかはあった
- primitiveなcontext-rs相当とGeneratorのようないいかんじのやつ

---

## libfringe (Cont.)

- Generatorの実装 (READMEのやつ)

```
extern crate fringe;

use fringe::{OsStack, Generator};

fn main() {
  let stack = OsStack::new(1 << 16).unwrap();
  let mut gen = Generator::new(stack, move |yielder, ()| {
    for i in 1..4 { yielder.suspend(i) }
  });

  println!("{:?}", gen.resume(())); // Some(1)
  println!("{:?}", gen.resume(())); // Some(2)
  println!("{:?}", gen.resume(())); // Some(3)
  println!("{:?}", gen.resume(())); // None
}
```

---

## コルーチン使いどころ

- よくあるのが非同期I/Oと合わせて使う
- オリジナルはRuss Coxのlibtask?
    - もっと前からありそう

---

## 非同期I/O

- high performaceなサーバを書くのに必須
- コルーチンでI/O待ちを減らしたい
    - EWOULDBLOCK/EAGAINでスレッドを切り替え

---

# Rustと非同期I/O

- mio(epoll/kqueueとかの薄い抽象化レイヤ)がデファクト
- 最近mioの上にtokio-rs/futuresなどなんかイケてるやつがのってる

---

#### mioco (mio + coroutine-rs)

- 一番star多いしたぶんなんかすごい, zmq-rsとかで使われてる

#### coio-rs (mio + coroutine-rs)

- 内部のスケジューラにChase-Lev's deque使ってる, flowggerというfluentd-likeなやつで使われてる

---

## miocoを例に

```rust
mioco::start(|| -> io::Result<()> {
        let listener = try!(TcpListener::bind(&addr));
        loop {
            let mut conn = try!(listener.accept());
            mioco::spawn(move || -> io::Result<()> {
                let mut buf = [0u8; 1024 * 16];
                loop {
                    let size = try!(conn.read(&mut buf));
                    if size == 0 {/* eof */ break; }
                    let _ = try!(conn.write_all(&mut buf[0..size]));
                }
                Ok(())
            });
        }
    }).unwrap().unwrap();
```

---

## mioco (Cont.)

- mioco::spawnで軽量スレッド生成からスケジューラ登録まで
- パッと見はブロックしそうだけどうまく動くらしい
- 複数OSスレッドの例もexampleにあった(各OSスレッドがacceptorを持つ形)
    - Rustなのでマルチスレッド拡張も容易？
    - スレッドごとにeventloopもつっぽい

---

## まとめ (まとまっていない)

- 非同期I/O+コルーチンなライブラリがぽつぽつ出てきた
- high performaceな鯖書くための部品が揃ってきた感ある
- 使っていきたみが高まっている
ChromeのcookieをPhantomJSにロードして使う

ChromeのCookie情報を Chrome Extension の [EditThisCookie](https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg?hl=ja) を使って抽出します。

```js
var cookies = ＜ここにエクスポートを貼り付け＞;

cookies.forEach(function(cookie) {
  phantom.addCookie({
    'name':     cookie.name,
    'value':    cookie.value,
    'domain':   cookie.domain,
    'path':     cookie.path,
    'httponly': cookie.httpOnly,
    'secure':   cookie.secure,
    'expires':  Math.floor(cookie.expirationDate * 1000)
  });
});

setTimeout(function() {
  phantom.exit();
}, 2000);
```

上記を `load_cookie.js` として保存する。

```
$ phantomjs --cookies-file=saved_cookie.txt load_cookie.js
```

として実行すると `saved_cookie.txt` に保存できるので、目的のテスト等においてこの cookie データを流用することができます。
Watson Visual Recognitionがすごすぎて俺の中で話題になっている件

# はじめに
WatsonのVisual Recognition(VR)は今までもいくつか投稿してきた。

- [Watson vs Google!? Visual RecognitionとTensorFlowでMNISTをやってみた](http://qiita.com/VegaSato/items/9b85859686ced827f862)
- [Visual RecognitionとTensorFlowをもっとちゃんと比べてみた](http://qiita.com/VegaSato/items/ca6145c665388368fd43)
- [WatsonのVisual RecognitionがV3になりGAされたので早速試してみた](http://qiita.com/VegaSato/items/d4a23abca8c47209cdfc)

で、半年ほど前に「コレをVRにかけたらどうなるんだろう？」と思って試してみたネタがあったので、今回はそれを紹介してみたい。

*<font color="red">(11/24追記)なお、VR V3だと結果スコアは違ったものとなった。V2とV3はそのまままるっと移行できるわけではなさそうだ。そのあたりのまとめはこちらを見てほしい。</font>
[Visual Recognition V3利用時の考慮事項～フライドチキンと犬の再評価からわかったこと～](http://qiita.com/VegaSato/items/863b614cd5ab88cf2d44)*

# 完全に一致！
[こちら](https://curazy.com/archives/130813)は、今年の3月頃にネットを騒がしたツイッターの投稿のまとめ。
元ネタはこちら。[@teenybiscuit](https://twitter.com/teenybiscuit)

そして思った。
**これは見分けつかねーわ。**

<img src="https://qiita-image-store.s3.amazonaws.com/0/102519/441a0c1a-db64-f541-c648-e08e4b8a7bf8.jpeg" width=400>

人間でもちょっと迷うこの写真、Watsonくんには見分けられるのだろうか？？

# 画像集め
VRを試すにはまず画像を集めないといけない。というか、画像解析系はどれもトレーニング用の画像が必要だ。今回はGoogle先生の力を借りて画像を集めるのだが、簡単に集めるツールとして[こういうもの](http://kurima.sakura.ne.jp/download_main.html#ImageSpider)を使ってみた。
[ImageSpider](http://kurima.sakura.ne.jp/download_main.html#ImageSpider)というアプリで、キーワードでGoogle画像検索を行い、まとめてダウンロードしてくれる、というスグレモノ。
これで「Fried Chicken」「Labradoodle」をダウンロードした結果、集まった画像はこんな感じ。
<img src="https://qiita-image-store.s3.amazonaws.com/0/102519/e06d5fec-f3f9-3c75-1009-76674f1acbc1.png" width=600>

*<font color="red">※一度集めた画像から目検で「これはあきらかに違いすぎる」というのは削除しています。また、転送サイズの制限があるためファイルサイズが大きい画像は削除あるいはサイズ縮小を行っています。</font>*

フライドチキンはまだわかるけど、ラブラドゥードルはこれでいいのか？という気がするけど、あえてそういう画像のまま試してみる。

# テスト(評価)
テストは例のツイッター画像を、それぞれ1つずつに切り取ってテストする。
VRは画像をzipにして一気にテストが可能なので、切り取った画像をチキンと犬に分けてtest_chichen.zip、test_labradoodle.zipにする。
以下の16枚がテスト用の画像だ。
<img src="https://qiita-image-store.s3.amazonaws.com/0/102519/b135ecfa-6e4c-24a3-428f-3446e6b50172.png" width=600>

# 気になる結果は･･･？
これらについてVRで判定した結果がコレだ。数字はVRによる確信度を表している。
<font color="red">(※11/22追記：それぞれの正解に対する確信度を0～1の数字で表しています。つまりほとんど正解しているということです。)</font>
<img src="https://qiita-image-store.s3.amazonaws.com/0/102519/16eea444-6561-c311-80b4-aaec156572a7.png" width=600>
**すげー！VRさん、マジパねぇっス！！**

ここまで判別できるとは思っていなかったけど、これはすごい！


# おわりに
試してみて思ったのは、**VRすごい。画像認識面白い。なんか色々ひらめくわwww** ってな感じ。大して準備しなくても、APIを叩けば簡単に画像認識ができてしまうところが、日曜プログラマーにはGood。
TensorFlowなどの機械学習ライブラリーは、画像を読み込んで行列にして･･･というのを自分で頑張ってコーディングしないといけない。その分きめ細やかな制御ができるのはメリットだけど、結局のところ「細かな制御」と「簡単に使える」というのはトレードオフ。どっちが自分に(実案件であれば実現したい機能に)合っているかで選ぶのがよさそう。

これからしばらくはVRとか画像認識が(自分の中で)ホットな話題になると確信。
MacOS Sierra＋USキーボードでEmacsユーザー向けキーマップ設定

Mac(MacOS Sierra以降) USキーボードのEmacsユーザ向けのキーマップ設定です。

あくまでも個人的に使いやすいと思う設定ですが、自分の備忘と参考までにメモしておきます。

# 前提

* Mac OS X Sierra
* USキーボード
* Emacs使い
* [Alfred](https://www.alfredapp.com)も使う
* [iTerm2](https://www.iterm2.com)も使う

# キーマップ

|機能|設定後のキーマップ|デフォルトのキーマップ|
|----|----|----|
|英数⇄かな切り替え|~~`option + space`~~ ``control(caps lock) + ` ``|`control + space`|
|Spotlight|`command + space`|`command + space`|
|Alfred|~~`shift + command + space`~~ `option + space`|`option + space`|
|Emacsのset mark|`control(caps lock) + space`|なし(英数⇄かな切り替えと重複)|

* [2016/11/29]Emacsを使う場合、`control` から小指を話さないほうが効率がいいので、英数⇄かな切り替え も `control`との併押下で切り替えられるように変更しました。

# 設定

## 英数⇄かな切り替え

デフォルトでは `control + space` ですが、Emacsのset matk用に空けるために ~~`option + space`~~ ``control + ` `` に変更します。


* システム環境設定 → キーボード → ショートカット → 入力ソース で **前の入力ソースの選択** を ~~`option + space`~~ ``control + ` `` に変更。

## Spotlight

デフォルトの `command + space` のままです。

## Alfred

デフォルトの `option + space` のままです。

~~デフォルトでは `option + space` ですが、英数⇄かな切り替えに割り当てるために `command + shift + space` に変更します。~~

* ~~Alfred → Preferences → General で **Alfred Hotkey** を `shift + command + space` に変更。~~

## Emacsのset mark

上記で 英数⇄かな切り替え を別のキーマップに変更したので、`control + space` で使えるようになります。
が、controlだと小指が痛くなるので、`caps lock` も `control` に割り当てます。

* システム環境設定 → キーボード → 修飾キー で **Caps Lockキー** を `Control` に変更。

[2016/11/29]`caps lock` を `control` に割り当てるだけなら、Mac OSの設定だけで済むので Karabiner-Elements は不要です。
~~なお、2016年11月時点ではキーマップ変更ツール [Karabiner](https://pqrs.org/osx/karabiner/) がSierraに対応していないため、[Karabiner-Elements](https://github.com/tekezo/Karabiner-Elements)を使います。~~

* ~~[Karabiner-Elements](https://github.com/tekezo/Karabiner-Elements)をインストールします。~~

* ~~アプリケーションに **Karabiner-Elements** が追加されているので起動し、Simple Modification から __caps lock → left_control__ を追加します。~~

## iTerm2でのmetaキー

iTerm2 のターミナル上でEmacsを使う場合、metaキーがescになっていて使いにくいので、`option` をmetaキーとして使えるようにします。

* iTerm2 → Preferences → Profiles → Keys で、**Left option key act as** を __+Esc__ に変更。



以上です。
Github ２段階認証して、pushできない問題解決


２段階認証して、pushできなくなった場合の解決策
$ git remote set-url origin git@github.com:xxxxx/xxxx.git
$ git push

今後、アクセストークンを取得してからのpushに変更予定。
(参考)
http://qiita.com/hayashier/items/ff0f2a62acd28ea1d0f4
ディレクトリの中身の有無によって条件分岐をしたい


ディレクトリが空ディレクトリかどうかによって条件分岐を行いたいということがよくあると思います。たとえば「対象のディレクトリがファイルやディレクトリを有しているとき、その中身をすべて削除する」という処理は次のように書くことができます。

```bash
directory=/hoge/hoge
if [ -n "$(ls $directory)" ]; then
    rm -r $directory
fi
```

`-n`は引数が空文字以外ならtrueを、それ以外ならfalseを返します。対象のディレクトリが空のとき`ls`は何も返さず、したがってそれを文字列化した`"$(ls $directory)"`が空文字となるため、`[ -z $(ls $directory) ]`がtrueとなり`if`の本体が実行されるというわけです。

ちなみに`-z`は`-n`の逆、つまり引数が空文字ならtrueを、それ以外ならfalseを返します。次の例ではディレクトリが空かどうかをみて、空ならばそのディレクトリ直下にcsvファイルを配置するという処理を行っています。

```bash
directory =/foo/foo
if [ -z "$(ls $directory)" ]; then
    touch directory/foo.csv
fi
```
閲覧中のWebサイトで使われている技術を確認できるChrome拡張「Wappalyzer」のご紹介

## はじめに
エンジニアたるもの、よそで使われている技術は気になると思います。今回は、そんな時に役立つChrome Extensionの「Wappalyzer」をご紹介します。

## 概要

Wappalyzerは、ブラウザに現在閲覧しているWebサイト内で使われているテクノロジーを覗き見する機能を追加できる拡張スクリプトです。

Chrome Extensionとして配布されているほか、FirefoxのAdd-onとしても配布されているので、どちらでもお好みのブラウザで利用が可能です。

Chromeのかたは[こちらのリンク](https://chrome.google.com/webstore/detail/wappalyzer/gppongmhjkpfnbhagpmjfkannfbllamg?hl=ja)より、Firefoxのかたは[こちらのリンク](https://addons.mozilla.org/ja/firefox/addon/wappalyzer/)よりダウンロードが可能です。

## 使ってみる

導入方法をご紹介しましたので、早速実際に使ってみましょう。
今回はWappalyzerを導入したGoogle Chromeにて、Qiitaの執筆画面を見てみます。

![スクリーンショット 2016-11-20 18.37.42.png](https://qiita-image-store.s3.amazonaws.com/0/75633/d19a9a50-d03e-86df-2cec-bd7eee8b0b59.png)

まずはじめに、対象とするページを開いたら、拡張機能バーの中の、Ruby on Railsのアイコンが出現していますので、これをクリックしてみます。

<img width="828" alt="スクリーンショット 2016-11-20 18.58.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/75633/9be1b2ea-ff41-d084-59a6-e204dfb5f62d.png">

するとWappalyzerが立ち上がり、Ruby on Railsをはじめとした、Qiita内で使われているテクノロジー群がずらっとならびます。
また、これをスクロールするとまだ続きがあり、jQuery, Underscore.jsなどが利用されていました。

つまりは、現状のQiitaがReactとBackbone.jsとjQueryとUnderscore.jsが悪魔合体している状態であることがわかりました。

その他にも、ユーザーのデータ取得にMixpanelを使っているところなどが特徴的でしょうか。GAだけのサービスも多い中、貴重ですね。

更に、これだけでなく、テクノロジーの名前をクリックすることで、より詳細なWappalyzerの解析に飛ぶことが可能です。

試しに、Reactの解析に飛んでみます。

![スクリーンショット 2016-11-20 18.44.30.png](https://qiita-image-store.s3.amazonaws.com/0/75633/d005def7-915b-9b44-322e-50e33adf4d5d.png)
https://wappalyzer.com/applications/react?pk_campaign=chrome&pk_kwd=popup

このようなページに飛びました。グラフを拡大して表示してみます。

<img width="703" alt="スクリーンショット 2016-11-20 18.45.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/75633/03683a0d-5c76-7d7b-9ec2-ced95c530b29.png">
これはReactが実際に使われているWebサイトの上位10位までのドメインとそのヒット数を表しています。これによって、そのテクノロジーを利用している王手がわかりますので、企業のOrganizationを探す指標などにもなりますし、そのテクノロジーがどの程度のスケールのサイズでも機能するかもざっとはかることが可能です。

Reactの場合は、開発元だけあってFacebookやその傘下であるInstagramでも当然使われているのがわかります。

## 利用するメリット

ここまでWappalyzerの機能面をざっとご紹介いたしましたが、導入しておく一番のメリットは、閲覧しているだけで周辺の技術とサービスの規模感との兼ね合いを掴むことができる点や、普段出会うこともない技術に出会える点ではないかなと思っています。

それこそMixpanelの場合、国内向けのサービスであるQiitaが利用されているサイトランキングに掲載されているということもあり、国内・国外ともにまだまだマイナーなサービスですが、Wappalyzerを少し見るだけで使われていることがひと目で分かるようになります。

Wappalyzerは、そういった普段は出会うことのない技術を知るきっかけを作るのにぴったりなツールです。
Mecabで自分のツイートを形態素解析し頻出一般名詞を一覧化する

# はじめに

[[アカデメイア]自然言語処理勉強会 #1](https://academeia-dev.connpass.com/event/42935/)に参加させていただきました。
こちらの勉強会では、
- 自然言語処理の基礎
- ビジネスにおける活用例
- 実習
を学習、実施しました。

実習では個人的に、自分がツイートしているワードにはどのようなものが多いかを見てみました。


# 自分のツイートのダウンロード

ツイッターの[ユーザー情報](https://twitter.com/settings/account)から全ツイート履歴の申請が行えます。
私の場合は申請から数分でダウンロードリンクが送られてきました。

# Mecabのインストール

下記を参考にインストールを行いました。
[MeCab: Yet Another Part-of-Speech and Morphological Analyzer](http://taku910.github.io/mecab/)

Macだと文字化けしてしまうようなので、下記も参考にしました。
UTF-8の設定が必要なようです。
[MacにMecabをインストールする (2013.3)](http://qiita.com/betahikaru/items/8d2867fb39624e1fa48a)


# 無駄な列の削除

ダウンロードしたツイートデータのうち、投稿内容列のみ残し、他は削除しました。(投稿日時等)


# mecabで形態素分解する

terminalで下記のコマンドを実行し、各投稿を形態素で分解しました。
`-E ""`はツイートごとのEOSをなくすオプション、
`-F "%m,%H\n"`は出力形式の設定を行うオプションです。

```
mecab tweets.csv -o mecab_tweets.txt　-E "" -F "%m,%H\n"
```

オプションについては下記を参考にしました。

[MeCabのコマンドライン引数一覧とその実行例](http://www.mwsoft.jp/programming/munou/mecab_command.html)

下記のように、ツイートを分解したものが取得できます。

```
今日,名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
の,助詞,連体化,*,*,*,*,の,ノ,ノ
エンジニア,名詞,一般,*,*,*,*,エンジニア,エンジニア,エンジニア
飲み,動詞,自立,*,*,五段・マ行,連用形,飲む,ノミ,ノミ
会,名詞,接尾,一般,*,*,*,会,カイ,カイ
```

# Pythonで集計する

下記のように、形態素解析したもののうち一般名詞のみ抽出した上で集計しました。
雑すぎてゴメンなさい。

``` sample.py
import pandas as pd

col_names = ['c{0:02d}'.format(i) for i in range(8)]

# ツイートデータの読み込み
tweet = pd.read_csv('mecab_tweets_only.txt',names=col_names)

# 一般名詞のみ抽出
tweet_meishi_ippan = tweet[tweet.c01 == '名詞'][tweet.c02 == '一般']

# c07には単語の原形が入っている（名詞については、辞書登録されているもののみ単語が入る？）
tweet_meishi_ippan_sort = tweet_meishi_ippan.groupby('c07')[['c07']].count().sort('c07',ascending=False)

```

# 集計結果

下記のような結果となりました。
（初めのアスタリスクはゴミです。）

```
tweet_meishi_ippan_sort

	c07
c07	
*	37147
人	807
自分	439
月	256
ゲーム	166
会社	163
(以下略)

```

# ビジュアライズ

勉強会ではワードとそのカウント数でビジュアライズできるスクリプトを配布いただきました。
それを用いてビジュアライズしたものがこちら。
<img width="1136" alt="スクリーンショット 2016-11-20 16.49.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/82763/e7541194-bfa1-ba49-4d28-3e8d6c60bc12.png">

ゲーム、漫画、映画など、自分の興味のあるワードが表現されていたので良かったです。


ありがとうございました。
さらにテキストエディタを探してみた。

###●WindowsMobile
さらにテキストエディタを探してみた。
DarkNote インストールしてみた。背景色は20種類。好きな色はない。濃い。
Note Pro Studio8。インストールしてみた。背景は2種類。正方形のメモ。小さい。メモの背景は18種類。悪くはないが小さいのが難点。タイル風にクリップして整理する。
Notes Book 手書きらしい。
NoteLedge - Note & Multimedia
インストールしてみた。GPS連動。手書きメモ。デザインは悪くはない。動作に先立って選択することが多すぎる。最初にFilenameをつけるとか。これはない。
sticky note pro
Smart Note 手書きっぽい雰囲気
Easy Note 黄色い紙風
Sticky Notes 付箋紙風。正方形。画面に無駄が多すぎる。
Memento 背景は6色。cloudにUploadできる。いまいち。
はじめに(UnlimitedHand)

# Introduction
次回からしばらくの間、UnlimitedHandについての技術情報などを書いていこうと思います。
本記事は、経緯など適当なことをつらつら書くだけですので、調べ物をしに来た人は以降の記事から探してください。

# Background
去る11月18日から20日にかけて、UnlimitedHandのハッカソンが開催されました。
https://unlimitedhand.connpass.com/event/41670/

そちらでポストVR準大賞をいただき、賞品としてトロフィーとUnlimitedHand本体を頂きました。
![Cxs2tYXUoAAGrQ3.jpg](https://qiita-image-store.s3.amazonaws.com/0/150289/bb74f027-dd51-5755-80af-97b51fa2ff70.jpeg)


そんなわけで、このような素敵なイベントを開催していただいたH2Lさまやチームメンバーのみんな、すべての関係者に感謝の気持ちを込めて
技術発信という形で陰から支えていこうとなりました。

# Outline
UnlimitedHandについては、現在developer向けが発売された段階で、技術情報も全然ないので
わりと初歩的な内容から入ろうかなと思います。
記事の最初にversion情報とか書こうと思いますが、未来の互換性についてはお察しください。
大体はすでにUnlimitedHandを持っている人向けで、これから買うか迷っている人向けに役立つ情報は載せられないと思います。
あとは未来の私のやる気が続くまで。
Android でアプリから URL を強制的にブラウザで開く

# 通常の方法

アプリから URL をブラウザで開く場合、基本的には以下の様なインテントを投げ、システムに解決してもらう。

```java
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
```

ただしこの方法では*強制的に* URL をブラウザで開くことはできない。特にアプリ自身がそのURLを受け取れる場合、再びアプリに戻ってきてしまったり、ブラウザの選択画面に再びアプリが出てきてしまう。そのためアプリで表示しているページをブラウザで開く機能や、アプリではサポートしていないページをウェブにフォールバックさせるためには以下のような工夫が必要となる。

# デフォルトブラウザで開く

デフォルトのアプリは ```PackageManager.resolveActivity``` で取得できる。"https://" に対するデフォルトのアプリを取得することで、デフォルトアプリのパッケージ名を得ることができる。

```java
// "https://" をハンドルするデフォルトアプリを取得する
Intent browser = new Intent(Intent.ACTION_VIEW, Uri.parse("https://"));
ResolveInfo defaultResInfo = 
    getPackageManager().resolveActivity(browser, PackageManager.MATCH_DEFAULT_ONLY);
if (defaultResInfo != null) {
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
    intent.setPackage(defaultResInfo.activityInfo.packageName);
    try {
        startActivity(intent);
        return;
    } catch (ActivityNotFoundException e) {
        // resolveActivity はデフフォルトアプリが設定されていない場合、
        // activity resolver などが含まれる ResolveInfo を返しうる。
    }
}
```

# ブラウザを選ばせる

ユーザーがデフォルトブラウザを設定していない場合はアプリを選ばせる必要がある。ここではアプリからブラウザへ遷移することを想定しているので、アプリ自体は選択画面から消したい。```PackageManager.queryIntentActivities```を使ってアプリ一覧を取得し、それぞれのアプリを開くインテントを```Intent.EXTRA_INITIAL_INTENTS```に渡して、明示的に開くアプリを指定することで、アプリが選択画面に現れることを回避できる。

```java
// url をハンドルできるパッケージを取得する
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
List<ResolveInfo> resInfos = getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
List<Intent> intents = new ArrayList<>();
for (ResolveInfo resInfo : resInfos) {
    Intent targeted = new Intent(intent);
    String packageName = resInfo.activityInfo.packageName;
    // 自分のアプリを選択から外す。
    if (getPackageName().equals(packageName)) {
        continue;
    }
    targeted.setPackage(packageName);
    intents.add(targeted);
}
// アプリリストは明示的に EXTRA_INITIAL_INTENTS で指定しているので、
// createChooser には空の Intent を渡す。
Intent chooser = Intent.createChooser(new Intent(), "ブラウザで開く");
chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intents.toArray(new Parcelable[0]));
startActivity(chooser);
```

# 環境
Android 7.0 がインストールされた Nexus 5x 上でのみ確認。

参考：
http://stackoverflow.com/questions/8626421/get-preferred-default-app-on-android
http://stackoverflow.com/questions/35501671/force-to-open-link-in-browser-for-fallback
http://meta.stackexchange.com/questions/259635/what-android-intent-does-se-apps-open-in-browser-use?rq=1
機械学習の分類

# なぜ機械学習
最近Pythonを勉強し始めましたが、それはとあることがきっかけで機械学習を勉強したいと思うようになったからです。
Pythonには機械学習やデータ解析に有用なライブラリがたくさんあると聞いてPythonを始めました。
Pythonプログラミングで勉強したことは別記事にまとめていっているので、ここにはその機械学習についての勉強内容をメモしていこうかと思います。
#機械学習
## 機械学習とは
人間は様々な観点から物事を判断し、学習する能力がある。
機械学習とは、簡単に言うとその能力を機械にも与えて学習させることを指す。
人間は少ないデータから判断を行うことが得意だが、機械は膨大なデータから判断することが得意である。
人間はデータが多くなると判断までに時間がかかるが、機械は処理が速い。
どのように学習するかは人間が与えてやる必要があり、その学習アルゴリズムにはいくつもの種類がある。
## 3つの分類
機械学習の種類は次の3種類に大別される。
- 教師あり学習
- 教師なし学習
- 強化学習
### 教師あり学習
まずたくさんの入出力データがあり（教師データと呼ぶ）、そのデータから入出力特性（規則性のようなもの）を機械が見つけ出し、未知の入力から出力を予想する。
規則性を見つけ出すアルゴリズムは何種類かあり、問題によって適したアルゴリズムが変わるよう。
理論をしっかり理解すれば適したアルゴリズムの選定が容易になるのかもしれないが、最初のうちに理論をすべて理解しようとすると挫折する可能性が高いらしい。
最初のうちはいくつかのアルゴリズムを試してみて、正解に近い出力が得られるアルゴリズムを採用すると良いそう。
### 教師なし学習
大量のデータがあり、そのデータの中になんらかの特徴を機械が見つけ出し、必要な意味のあるデータを取り出す。
代表的な教師なし学習にクラスタリングと次元削減がある。
クラスタリングは、大量の入力データから何らかの特徴を見つけ出し、意味のあるグループに分け、必要に応じてデータを取り出しやすくしようとするもの。
次元削減は、大量のデータ（画像データなど）から特徴を見つけ出し（特徴抽出）、その特徴を残したままデータの次元数を減らそうとするもので、教師あり学習の前処理として使用されることが多い。
教師あり学習の際の入力データの次元数を減らすことによってノイズとサイズが削減され、処理を効率化することができる。
### 強化学習
「周囲環境」を入力として「行動」を出力し、その行動によって得られる「報酬」をもとに行動を改善していくシステムを開発すること。
ゲームをプレイするたびに上達していく人工知能が開発されたりしている。
今回僕が必要だと思われる機械学習の種類はこの「強化学習」なので、これを中心に勉強していけたらなぁと思います。
Wordpressでプラグインを使わずにパンくずリストを構造化マークアップする

パンくずリストを作成する場合、構造化マークアップとして、data-vocabulary.orgを利用していましたが、その際にitemtypeとして指定してた http://data-vocabulary.org/Breadcrumb が404エラーとなっていたので、書き換えを行いました。

wordpressでパンくずリストの出力を行う場合は、以下のような関数で対応出来るかと思います。

```functions.php
function data_bread_crumbs(){
	$html = "";
	$html .= '<ul class="breadcrumb" itemscope itemtype="https://schema.org/BreadcrumbList">';
	if(!is_front_page()){
		$html .= '<li class="home" itemprop="itemListElement" itemscope  itemtype="https://schema.org/ListItem">';
		$html .= '<a href="'.get_bloginfo('url').'" itemprop="item">';
		$html .= '<span class="title" itemprop="name">HOME</span>';
		$html .= '<meta itemprop="position" content="1">';
	  $html .= '</a> &gt; </li>';
	}
	$postcat = get_the_category();
	$catid = $postcat[0]->cat_ID;
	$html .= '<li itemscope itemprop="itemListElement" itemscope  itemtype="https://schema.org/ListItem">';
	if(!is_category()){
		$html .= '<a href="'.get_category_link($catid).'" itemprop="item" title="'.get_cat_name($catid).'">';
	}
	$html .= '<span class="title" itemprop="name">'.get_cat_name($catid).'</span>';
	if(!is_category()){
  	$html .= '</a> &gt; ';
	}
	$html .= '<meta itemprop="position" content="2">';
	$html .= '</li>';
	if(!is_category()){
		$html .= '<li class="title" itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem"><span itemprop="name">'.get_the_title().'</span>';
		$html .= '<meta itemprop="position" content="3"></li>';
	}
	$html .= '</ul>';
	echo $html;
}

```

でfunctions.phpに登録して、

```
if(function_exists('data_bread_crumbs')){
	data_bread_crumbs();
}

```
のような感じで呼び出します。
タクソノミーとか検索とかのページがある場合は別途記述が必要です。

httpsとしてますけど、httpでもどっちでも構わないらしいです。
https://www.suzukikenichi.com/blog/which-to-use-http-or-https-when-you-mark-up-schema-org/

設定したら、一応各階層URLをGoogleの構造化チェックツールで確認した方が良いです。
https://search.google.com/structured-data/testing-tool/u/0/?hl=ja

構造化マークアップは以下の記事を参考にしました。
http://qiita.com/ryotanatsume/items/91d16968a4677443a6e7
Android StudioでJava Libraryなモジュールからリソースを含んだ実行可能なJarを生成するまで


#状況
- Andtoid StudioでJavaアプリを実行したかったので、Java Libraryのモジュールを作った。
- Java Libraryはリソースが必要である。
- getResource()するとnullになる場合がある。

#Run Configurations
（そもそもこれが思っていたのと間違っていたのですごいハマった）

結論から言うと、JavaアプリなのでNew ConfigurationでApplicationを選ぶと思っているとダメ。
`apply plugin: 'application'`を追加してrunタスクを実行すると良い。

##ハマりポイント
ConfigurationのApplicationでMakeから実行していると、`getClass().getResource()`かなんかでURLを取ろうとするとnullになる場合がある。

nullになる条件は.imlのorderEntryに自モジュールの.jarが追加されていない場合。
`build.gradle`を変更した時の **Sync Now** をすると.imlに.jarが追加される。
ただし、事前に`gradle build`などでjarを生成済みである場合に限る。
（*正直よくわからん）

.jarからリソースのURLが取れている場合には、`URL=jar:file:hogehoge`となる。
`gralde run`で実行した場合には`URL=file:hogehoge`となる。

なお、IntelliJでは`gradle run`ではなく、ConfigurationのApplicationから実行しても`URL=file:hogehoge`で取得できるので、Android Studioとは挙動が違う。
（多分Android StudioではJava Libraryということなので、ApplocationのMakeの挙動が違うのだと思う）

###run
`new Configuration`でGradleを選んでTasksにrunを指定するが、そのプロジェクトに複数の`apply plugin: 'application'`のモジュールがある場合にはrunを実行すると何故か別モジュールも一緒に起動する。

なので、Tasksには`:モジュール名:run`としておく。

##実行可能Jar
適当にググったら出る

	task executableJar(type: Jar, dependsOn: jar) {
	    manifest {
	        attributes 'Main-Class': mainClassName
	    }
	
	    from "$buildDir/classes/main"
	    from "$buildDir/resources/main"
	    from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
	}



#めでたし
【PostgreSQL】【小技】大量データ作成

◆大量データを簡単に作る

要は、連番を簡単に作成できる関数「generate_series」というものを
select句に入れているだけです:meat_on_bone:。

[例テーブル定義]
postgres=# \d tbl_newtbl
         Table "public.tbl_newtbl"
 Column |         Type          | Modifiers
--------+-----------------------+-----------
 one    | integer               |
 two    | character varying(10) |

[例SQL]
psql -c "insert into tbl_newtbl select generate_series(1,100000),'xxxxxx';"
C#でIEnumerableを実装からのファイルを列挙してデータソースを作る（不足などがあれば指摘お願いします）

```csharp
using System;
using System.Collections.Generic;
using System.Linq;

namespace Question1
{
    class Program
    {
        static void Main(string[] args)
        {//IEnumerableを実装する
            int[] scores = new int[] { 0,-1, -2 };
            IEnumerable<int> scoreQuery =//変数の値の範囲を指定
                    from score in scores
                    where score > -2
                    select score;

            foreach (int checkpoint in scoreQuery)
            {//scoreQueryを列挙
                Console.WriteLine("checkpoint" + checkpoint);//変数と文字列の連結表示処理
                
            }
                Console.ReadKey();
        }
        public class hogehoge : Program//継承させてProgramクラスの動作を再利用
        {
            static void Sub()
            {
                Console.WriteLine("hogehoge");
                Console.ReadKey();
            }
        }
    }
}
```
政府統計を jupyter で、CSV化

# 政府統計を、jupyter　でCSV化してみました。

 この記事の想定読者は、jupyter を普段使いしていて、かつ政府統計に興味を持っている人です。

* 対象のデータは、法務省の出入国です。
* [一覧のページ](http://www.e-stat.go.jp/SG1/estat/GL08020102.do?_toGL08020102_&tclassID=000001008249&cycleCode=1)から、最新情報のページを見つけて、CSVデータをとってきて使いやすい形に処理します。
* jupyter のスクリプトは、[github](https://github.com/zanjibar/data4nihon/blob/master/estat/immigration.ipynb)においてあります。とってきて適当に改造してください。

詳しい解説などは今後
初めてのAnsible（8章：ロール:プレイブックのスケールアップ）


[「初めてのAnsible」](https://www.oreilly.co.jp/books/9784873117652/)を読み進めながらのメモ

前掲
[初めてのAnsible（1章：イントロダクション）](http://qiita.com/c0tt0n-candy/items/512049586f5a1f1279f3)
[初めてのAnsible（2章：Playbook:始めてみよう）](http://qiita.com/c0tt0n-candy/items/36b4eb2717447071ad21)
[初めてのAnsible（3章：インベントリ:サーバーの記述）](http://qiita.com/c0tt0n-candy/items/1b109c53d8709717a1bb)
[初めてのAnsible（4章：変数とファクト）](http://qiita.com/c0tt0n-candy/items/7144d49636a30433365c)
[初めてのAnsible（7章：複雑なPlaybook）](http://qiita.com/c0tt0n-candy/items/9e9ea1f745bd904e4a5e)

# ロール

* Ansibleでplaybookを複数のファイルに分割するための仕組み
* playbookをシンプルに記述し、再利用しやすくできる！
* 1つ以上のホストに割り当てるもの
	* 例：データベースサーバとして動作するホストに`database`というロールを割り当てる

## ロールに関連づけられるファイル群

| パス | 説明 |
| --- | --- |
| roles/role_name/tasks/main.yml | タスク群 |
| roles/role_name/files | ホストにアップロードされるファイル群 |
| roles/role_name/templates | Jinja2のテンプレートファイル群 |
| roles/role_name/handlers/main.yml | ハンドラ群 |
| roles/role_name/vars/main.yml | オーバーライドすべきでない変数群 |
| roles/role_name/defaults/main.yml | オーバーライドできる変数群 |
| roles/role_name/meta/main.yml | ロールに関する依存対象の情報 |


### ロールを探す場所

* playbookが置かれているディレクトリの`roles`ディレクトリ
* システム全体にわたるロールは `/etc/ansible/roles`

## playbook中でのロールの割り当て

playbook中で`roles`セクションを置き、ロールのリストを指定すればよい

```
- name: role example
  hosts: webservers
  pre_tasks:
    - shell: echo 'hello'
  roles:
    - { role: example_role, app_port: "{{ app_default_port }}" }
  tasks:
    - shell: echo 'still busy'
  post_tasks:
    - shell: echo 'goodbye'
```

上記の例では、ホスト`webservers`に対してロール`example_role`を割り当てている

また、ロール呼び出しの際に`{{ }}`で変数を渡すことも可能

この変数が `vars/main.yml` や `defaults/main.yml`　ですでに定義されていた場合には渡された変数でオーバーライドされる

#### `pre_tasks` / `post_tasks`

ロールの呼び出し前後に何らかのタスクを実行したい場合に利用

## 依存ロール

* あるロールの依存する1つ以上のロールを指定できる
* 指定された依存対象のロールがまず実行されることを保証

`roles/role_name/meta/main.yml` で以下のように指定

```依存ロールとしてntpを指定した例
dependencies
  - { role: ntp, ntp_server=ntp.ubuntu.com }
```

## [Ansible Galaxy](http://docs.ansible.com/ansible/galaxy.html)

* 世界の誰かが書いてくれたロールを再利用可能に
	* [Ansible Galaxy | Browse Roles](https://galaxy.ansible.com/list#/roles?page=1&page_size=10)から探してもってこれる

コマンドラインで一発。

```
$ ansible-galaxy install role_name
```

* デフォルトでは`/etc/ansible/roles`にインストールされる
* インストール先を指定する場合には `-p path/to/roles` オブションを利用すればよい
NimでMySQL接続 (あんま怖くないNim③)

#NimでC/C++のライブラリを呼び出す。
スクリプト言語風の簡易な文法ながら、C/C++等にコンパイルされ、Cに近しい実行速度が出せるNim。
まだ、バージョン1.0前でドキュメント量をまだまだ少ないため、実案件で使うことは当面ないだろうが、C系との近しさは、余計な物がなん分、C系のライブラリの学習用途には使えそう。

Nimの情報はまだまだ少ないので、MySQL(Mariadb)をNimから呼び出してみたメモ書きをさらしておく。

#バッケージマネージャツールnimbleを活用。

外部パッケージを活用して、一定程度以上に複雑なプログラムを書く場合には，適切なパッケージ管理が必要。nimには、パッケージの導入からコードのビルドまでを行えるパッケージマネージャnimbleが標準で付属している。

- nimbleについては以下のブログを参考。
http://unreallife.hatenablog.com/entry/2016/02/07/135149
 - 同じ方がnim専用のブログ[nim帳](http://nim-memo.hatenablog.com/)を立ち上げているので、nimが気になる方は要watch。

##　mimleでdbライブラリを導入
- パッケージ情報を最新に更新
> nimble refresh

- mysqlに関するパッケージ情報を調べる
> nimble search mysql

- パッケージdbを導入
> nimble install db

これで、RDB接続用パッケージdbが導入される。

## nimble initでディレクトリ構造を決定

nimble initコマンドで生成されるパッケージ名.nimbleファイルにより、ディレクトリ構造を定める

```パッケージ名.nimble
# Package

version       = "0.1.0"
author        = "Anonymous"
description   = "test"
license       = "MIT"

# Dependencies

requires "nim >= 0.15.2"

# ここにディレクトリ構造を追記  
srcDir = "src"
binDir = "bin"
bin = @["main"]

```

私もnim初心者なので、委細はnimble initで自ら調べていきたいが
./srcにソースコードを書き、ビルド後のファイルは./binに置かれることは分かるだろう。

#MySQLに接続

ローカルのMySqlに接続するには、以下のようなコードを書く(この例ではデーブル生成のみ)。

```main.nim
import db_mysql

let theDb = open("localhost", "user", "passwd", "mydb")

theDb.exec(
  sql(
    "create table myTestTbl (" &
    " Id    INT(11)     NOT NULL AUTO_INCREMENT PRIMARY KEY, " &
    " Name  VARCHAR(50) NOT NULL, " &
    " i     INT(11), " &
    " f     DECIMAL(18,10))"
  )
)　　　　　　　　

theDb.close()
```

要するに、open ->  exec(sql文) -> closeという一連の流れでデータベースを操作するわけだ。
ビルドはnimble buildで行い、実行は./bin/main.exeとなる。

...が、このまま実行してしまうと、libmysql.dllがないよ、と怒られてしまう(windows環境の場合)。実行に際しては、例えば、windowsでのC言語実行の基本にもどって、libmysql.dllをmain.exeと同じディレクトリに配置する必要がある。

無事実行できた際のディレクトリ構造は以下のようになる。

![nimmm.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/f8fb12ef-5722-e9b8-b224-2dc4c2af9030.png)

コンパイル後に生成される./nimcacheディレクトリを開いてみる。

![ca.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/f946c93b-8a9b-bcfb-0101-a72f79d4f0eb.png)

確かに、nimがCにコンパイルされていることが分かる。

# C系言語の資産を活かそう。

C系言語は、４０年以上の歴史を持ち、さまざまな実用プログラムを生み出してきた。C系言語のソースコードにコンパイルされるnimは、まさしく、その巨人の肩に直接に乗っている形だ。

nimでC系言語の良さをお手軽に再認識したいと思う今日このごろ。
【Memo】MTタグでMTAppjQueryのJSONTableに孫オブジェクトがある場合の取得方法

以下のようなJSONデータを`mt:loop`タグを使って出力するのですが、itemsの子オブジェクトは簡単に取得できるが孫はどうやって取る？？という素朴な疑問にぶち当たったのでメモとして残しておきます。

MTAppjQueryのJSONTable実装で得た知見になります。

* MTAppjQueryバージョン：v1.9.0


```json
{
  "items": [
    {
      "number": "01",
      "imagePath": {
        "id": "1",
        "url" "/hoge/images/dummy.jpg"
      },
      "description": "テキストテキスト"
    },
    {
      "number": "02",
      "imagePath": {
        "id": "2",
        "url" "/hoge/images/dummy.jpg"
      },
      "description": "テキストテキスト"
    },
    {
      "number": "03",
      "imagePath": {
        "id": "3",
        "url" "/hoge/images/dummy.jpg"
      },
      "description": "テキストテキスト"
    }
  ]
}
```

## やりたいこと

* imagePathのurlを取得し出力させたい
* カスタムフィールド名：entry_gallery（textarea）

## 実装方法

* 子オブジェクトに対してjson_decodeを定義して、孫のキーを取得して変数に格納
* 孫のキーの変数をHTML部分で出力させる


```html
<mt:entry_gallery json_decode="1" setvar="json">  // カスタムフィールドをjson_decodeを定義（MTAppjQueryのモディファイア：配列・ハッシュ変数に変換）し変数に格納
<mt:Var name="json" key="items" setvar="items">  // itemsのキーを変数itemsに格納
<mt:SetVar name="items_index" value="0">  // items_indexに初期値を格納

// ループ処理
<mt:Loop name="items">
<mt:Var name="items" index="$items_index" setvar="item">
<mt:Var name="item" key="imagePath" setvar="ImagePathHash">  // itemのimagePathを変数に格納
<mt:If name="ImagePathHash">
  <mt:Var name="ImagePathHash" json_decode="1" setvar="jsonImagePath">  // imagePathに対してjson_decodeを定義し変数に格納
  <mt:Var name="jsonImagePath" key="url" setvar="ImagePath_url">  // キーのurlを取得し変数格納
</mt:If>

// メインのHTMLループ部分
<mt:If name="__first__">
<ul>
</mt:If>
  <li>
    <img src="<mt:Var name="ImagePath_url" />" alt="<mt:Var name="item" key="description">"/>
  </li>
<mt:If name="__last__">
</ul>
</mt:If>


<mt:SetVar name="items_index" op="++">  // items_indexの値をインクリメント
</mt:Loop>
```
Cスタイルのfor文をSwift3で書き換えるときにハマるパターン

Swift3より前に書いたCスタイルのfor文
`for 初期設定; 実行条件; インクリメント`
をSwift3以降で
`for i in 範囲`
に変換するときにハマるパターンがあります。

入れ物がいくつかある。
左からいくつかは丸が入っている。
![Base.png](https://qiita-image-store.s3.amazonaws.com/0/46631/93e4a32f-905f-34e0-711c-af45a80fe945.png)
残りの入れ物に三角を入れる処理を行いたい。
![Umed.png](https://qiita-image-store.s3.amazonaws.com/0/46631/5478ef9c-86ed-61f7-20a3-d90512efabd0.png)
丸が入っている最終の入れ物のindexをcurrentPosとし、
最後の入れ物のindexをendPosとする。
![Umed With String.png](https://qiita-image-store.s3.amazonaws.com/0/46631/f835bc4c-38e2-81a4-e60b-3189adccb87a.png)
三角を入れる処理のfor文は、Cスタイルの書き方では

```
for var i = currentPos + 1; i<=endPos; i += 1 {
	//ポジションiに三角を入れる処理
} 
```
と書ける。
この書き方を範囲指定の書き方に置き換えると

```
for i in (currentPos + 1)...endPos {
	//ポジションiに三角を入れる処理
}
```
となる。

ところが次のように**初めから全ての入れ物に丸が入っていた場合、上の範囲指定の書き方ではうまくいかない。**
![Full.png](https://qiita-image-store.s3.amazonaws.com/0/46631/ed463f5a-d680-fd14-c4fa-ad940334edb0.png)
この場合、範囲 `(currentPos + 1)...endPos` は `5...4` となって実行時エラーになる。範囲の指定は...方式でも..<方式でも、右より左の方が大きいと実行時エラーで落ちる。

Cスタイルの書き方では初期設定と実行条件を与えれば、**あとは自動でうまくやってくれます**が、Swiftでは範囲の生成がうまく出来ないと**実行時エラーになってしまう**ので注意。

対策は
`stride(from: , through: , by: )`
を使うことです。throughの値よりもfromの値の方が大きい場合でも、何も実行せずに次の命令に移るだけなのでCスタイルで書くのと同じノリでいけます。
例に上げたやり方だと初期値は1大きいだけなので
`(currentPos + 1)..<(endPos + 1)`
でも対応できます。

また、dropFirst()を使う方法もあります。

```
for i in (0...endPos).dropFirst(currentPos + 1) {
}
```
で可能です。(コメントで指摘してもらったやり方)

Cスタイルのfor文を**ナウい形**に書き換える際は、注意しておきたい。
Rayを飛ばして当たったオブジェクトの情報を得る方法

```csharp
void RayTest()
    {
        //Rayの作成　　　　　　　↓Rayを飛ばす原点　　　↓Rayを飛ばす方向
        Ray ray = new Ray (transform.position, new Vector3 (0, -1, 0));

        //Rayが当たったオブジェクトの情報を入れる箱
        RaycastHit hit;

        //Rayの飛ばせる距離
        int distance = 10;

        //Rayの可視化    ↓Rayの原点　　　　↓Rayの方向　　　　　　　　　↓Rayの色
        Debug.DrawLine (ray.origin, ray.direction * distance, Color.red);

        //もしRayにオブジェクトが衝突したら
        //                  ↓Ray  ↓Rayが当たったオブジェクト ↓距離
        if (Physics.Raycast(ray,out hit,distance))
        {
              //Rayが当たったオブジェクトのtagがPlayerだったら
                if (hit.collider.tag == "Player")
                Debug.Log ("RayがPlayerに当たった");
        }
    }
```
Aurelia のルーティングを pushState に切り替える

Aurelia で pushState に切り替えるには、設定を変えるだけ
- `config.options.pushState = true;`
- `config.options.hashChange = false;`

# 設定を変えるだけとは

Aurelia のルーティングはデフォルトだと `#~` を使ったタイプです。
例) `http://localhost:9000/#/users`

`#~` を使ったタイプだと都合が悪い場合や、SEOを考慮する必要があるときは pushState が有効です。これにより自然な URL によるクライアントサイドルーティングができます。
例) `http://localhost:9000/users`

Aurelia のルーティングを pushState に切り替えるには `config.options.pushState = true;` と書けばOKです。

```js:src/app.js
export class App {
  configureRouter(config, router) {
    config.title = 'Aurelia';
    config.options.pushState = true;  // これで pushState に切り替わる
    config.map([
      { route: ['', 'welcome'], name: 'welcome',      moduleId: './welcome',      nav: true, title: 'Welcome' },
      { route: 'users',         name: 'users',        moduleId: './users',        nav: true, title: 'Github Users' },
      { route: 'child-router',  name: 'child-router', moduleId: './child-router', nav: true, title: 'Child Router' }
    ]);

    this.router = router;
  }
}
```

> ※ [<i class="fa fa-github"></i> aurelia/skeleton-navigation ... src/app.js](https://github.com/aurelia/skeleton-navigation/blob/master/skeleton-esnext-webpack/src/app.js) を改変

## 初回アクセス時に `#~` が自動的に pushState URL に変換される

どういうことかと言いますと、`config.pushState = true` とした Web アプリに 
`http://localhost:9000/#hoge` のようにアクセスすると
`http://localhost:9000/hoge` にリダイレクトされてしまいます。この挙動はアプリ起動時だけのもので、例えばアプリ内のリンクに `#hoge` が付いていたとしても無視されます。

この挙動を抑止するには、さらに `config.options.hashChange = false` を追加します。

```js:src/app.js
export class App {
  configureRouter(config, router) {
    config.title = 'Aurelia';
    config.options.pushState = true;  // これで pushState に切り替わる
    config.options.hashChange = false; // これで謎挙動を抑止
    config.map([
      { route: ['', 'welcome'], name: 'welcome',      moduleId: './welcome',      nav: true, title: 'Welcome' },
      { route: 'users',         name: 'users',        moduleId: './users',        nav: true, title: 'Github Users' },
      { route: 'child-router',  name: 'child-router', moduleId: './child-router', nav: true, title: 'Child Router' }
    ]);

    this.router = router;
  }
}
```

## プログラムから画面遷移するには

`aurelia-router` モジュールの `Router` を inject することで、 ViewModel から画面遷移することができます。

```js:src/welcome.js
import {computedFrom, inject} from 'aurelia-framework';
import {Router} from 'aurelia-router'

@inject(Router)  // Router を注入
export class Welcome {
  /* 省略 */

  constructor(router) {
    this.router = router;  // 注入された Router をプロパティにとっておく
  }

  /* 省略 */

  goToUsers() {
    // 例えばボタンクリックなどを trigger に
    this.router.navigate('/users'); // 遷移する
  }
}
```

> ※ [<i class="fa fa-github">aurelia/skeleton-navigation ... src/welcome.js](https://github.com/aurelia/skeleton-navigation/blob/master/skeleton-esnext-webpack/src/welcome.js) を改変
【Android】端末の時刻を日本標準時に変換する

#環境
 - Android Studio 2.2.2
 - Java 1.8.0
 - Android 2.3.3

以下のクラスを作成しておく

```TimeUtil.java
public abstract class TimeUtil {
    /**
     * Date型で基底となる年数.
     */
    private static final int DATE_BASE_YEAH = 1900;

    /**
     * 端末の時刻を日本標準時に変換し、時刻文字列を返却.
     *
     * @return 日本標準時に変換した時刻文字列
     */
    public static String getCurrentJstString() {
        //指定のタイムゾーンでカレンダー作成
        //日本標準時以外に変換したい場合は、"Asia/Tokyo"の部分を変更する
        TimeZone timezone = TimeZone.getTimeZone("Asia/Tokyo");
        Calendar calendar = Calendar.getInstance(timezone);

        //カレンダーの値を元に、Date作成
        Date date = new Date(
                calendar.get(Calendar.YEAR) - DATE_BASE_YEAH,
                calendar.get(Calendar.MONTH),
                calendar.get(Calendar.DAY_OF_MONTH),
                calendar.get(Calendar.HOUR_OF_DAY),
                calendar.get(Calendar.MINUTE),
                calendar.get(Calendar.SECOND)
        );

        //タイムゾーンのオフセット部分取得
        String offSet = timezone.getDisplayName(false, TimeZone.SHORT);
        String regex = "[\\-\\+]\\d{2}:\\d{2}";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(offSet);
        if (matcher.find()) {
            offSet = matcher.group();
        } else {
            offSet = offSet.substring("GMT".length(), offSet.length());
        }

        //Dateを指定フォーマットの文字列に変換し、返却
        SimpleDateFormat simpleDateFormat =
                new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'" + offSet + "'");
        return simpleDateFormat.format(date);
    }
}
```

使用は以下のように
``` TimeUtil.getCurrentJstString() ```
swift3で追加したviewのフリックイベントを拾ってみた

swiftがバージョン3になり、各シンタックスがバージョン2からかなり変更があったので
各シンタックスの確認がてら動かしてみました。

# 追加したsubViewのフリックイベントの拾い方
viewに対するユーザーイベントはバージョン2同様でGestureRecognizer系を
使用すればイベントを拾える模様

今回はフリックイベントを拾いたいので、以下を使用しました。
・UIPanGestureRecognizer
(iOSの世界ではフリックはPanとい名称らしい)

以下がソースになります。

```ViewController.swift

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // create gesturView(subView)
        let gesturView:UIView = UIView(frame: self.view.bounds)
        gesturView.backgroundColor = UIColor.black
        
        // create GesturRecognizer(pan = flick)
        let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(panGesture(sender:)))
        
        // add GesturRecognizer to subview
        gesturView.addGestureRecognizer(panGestureRecognizer)
        
        self.view.addSubview(gesturView)
    }
    
    func panGesture(sender:UIPanGestureRecognizer) {
        switch (sender.state) {
        case .began:
            print("pan start")
            break
        case .ended:
            print("pan end")
            let translation = sender.translation(in: sender.view)
            print(translation)
            break
        default:
            break
        }
    }

```

# subViewとGesturRecognizerの生成
//create gesturView(subView)
の部分でsuperViewに追加するsubViewを生成してます。

// create GesturRecognizer(pan = flick)
の部分で生成したsubViewに追加するUIPanGestureRecognizerを生成しています。
ここのselectorに渡しているfunctionがフリックイベント発生時に
発火するfuncitonとなります。
ここではpanGestureが発火するように渡しています。
(シンタックス微妙に変更になったようです。selector -> #selector)

// add GesturRecognizer to subview
の部分でsubViewにGesturRecognizer(Pan)を追加してます。
その後subViewをsuperViewであるself.viewに追加しています。

# UIPanGestureRecognizerのイベント振り分け
イベント発火時にselector functionに渡されたUIPanGestureRecognizerは
stateというプロパティを持っているので、そのstateをハンドリングすることで、
処理が分けられます。各stateは以下

[UIGestureRecognizer](https://developer.apple.com/reference/uikit/uigesturerecognizer)

今回はフリック開始時、終了時にprintだけするものですが、
フリック中等のイベントも拾えるので、色々と処理分けすると面白いものが実装できそうです。

swift3になって様々なシンタックスが変更になっているが、
やはりまだまだ書籍等でも整理しきれていないので、ドンドン触って差分を吸収していくのが大事なんでしょうね。

以上です。
Golang + anaconda + AppleScriptでNowPlayingツイート


GoのTwitter APIライブラリのanacondaを利用して、iTunesで再生中の曲名を取得してツイートできるようにしてみました。
曲名の取得にはAppleScriptを利用しました。
Goでやる意味もあんまりなかったのですが、Goで何か書きたかっただけです。

## anacondaのインストール
`go get github.com/ChimeraCoder/anaconda`
でインストールできます。
詳しくはこちら https://github.com/ChimeraCoder/anaconda

## iTunesで再生中の曲名を取得する
```getTrack.scpt
tell application "iTunes"
	set trackName to name of current track
	set trackArtist to artist of current track
	return trackName & " - " & trackArtist
end tell
```
参考元からの丸パクリです。
AppleScriptを利用しています。
ここでは曲名とアーティスト名のみですが、アルバム名などその他の情報も取得可能です。
AppleMusicの場合は取得できないみたいですが、マイミュージックに追加されていると大丈夫のようです。
私の場合は大丈夫でした。

## ツイートする
```nowPlaying.go
package main

import (
	"fmt"
	"github.com/ChimeraCoder/anaconda"
	"log"
	"os/exec"
)

func getTrackInfo() string {
	info, err := exec.Command("osascript", "getTrack.scpt").Output()
	if err != nil {
		log.Fatal(err)
	}
	return string(info)
}

func main() {
	anaconda.SetConsumerKey("consumerKey")
	anaconda.SetConsumerSecret("consumerSecret")
	api := anaconda.NewTwitterApi("accessToken", "accessTokenSecret")

	tweet := fmt.Sprintf("NowPlaying: %s", getTrackInfo())
	api.PostTweet(tweet, nil)
}
```
```exec.Command("osascript", "getTrack.scpt").Output()```で上記のAppleScriptを実行し、
曲名を取得しています。

そして、```tweet := fmt.Sprintf("NowPlaying: %s", getTrackInfo())```でツイート内容を整形し、
```api.PostTweet(tweet, nil)```でツイートしています。
consumerKeyなどは各個人の値を入れてください。

## ターミナルからコマンドで実行
詳しく書いてあるところがあると思うので方法は割愛しますが、
```${GOPATH}/src```以下にソースファイルを置いて```go install```とすると```${GOPATH}/bin```以下に実行ファイルができ、```${GOPATH}/bin```にパスが通っていればコマンドで実行することができます。
私はnowでツイートできるようにしてみました。

## 本当は...
本当は、Goのプログラムを実行させておいて曲が変わったら自動的にツイート、みたいなことがしたかったのですが、
曲が変わったことを感知するまたは曲が変わったのをトリガーとして何かさせる方法がよく分からなかったのでとりあえずここまでにしています。
何かいい方法があればまた改良します。

## 参考元
[iTunesで聴いている曲をSlackに通知するアプリをswiftで書いた](http://qiita.com/ayasuda/items/3773858e5e93ba94da48)
[情弱だがGoで画像付きツイートしたい](http://qiita.com/stenpel/items/01f6ef20c4691564faa5)

非常に役に立ちました。ありがとうございます。
ElCapitanにCocoaPodsをインストールする

CocoaPodsは、なんとなくずっと避けていたのですが、Firebase入れようとしたらCocoaPodsを入れる必要があるようなので、ようやく重い腰を上げてセットアップすることにしました。

通常は

```
sudo gem install cocoapods
```

でいいのですが、ElCapitanにCocoaPodsをインストールするには、こうすると良いです。

```
sudo gem install -n /usr/local/bin cocoapods
```

そのあと、

```
pod setup
```

をすれば完了です。
Dockerでアプリケーションサーバー(nginxとphp-fpm)

#はじめに
centos7コンテナー上で、
アプリケーションサーバー(nginx→PHP-FPM)みたいなところを目指す。

#環境
Dockerはインストール済みということで。
foderaでやってます

cat /etc/redhat-release
->Fedora release 24 (Twenty Four)

#アプリケーションサーバー
##Dockerfile

```
FROM centos:7
RUN yum -y update && \
#git(特にいらんけど。。)
yum install -y git && \
#epel
yum -y install epel-release && \

#remi
yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm  && \


#phpもろもろ
yum -y install --enablerepo=remi-php70 php && \
yum -y install --enablerepo=remi-php70 php-devel php-pear && \
yum -y install --enablerepo=remi-php70 php-mysqlnd php-mbstring && \
yum -y install --enablerepo=remi-php70 php-fpm && \

#nginxリポジトリ追加
rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm && \
#nginxインストール
yum install nginx -y 

EXPOSE 80
CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
```

##buil&run

```
docker build -t php_app ./
docker run --privileged -d -p 8000:80 --name testphp php_app /sbin/init
```

##コンフィグ周りの変更
とりあえずシェル起動

```
docker exec -it testphp /bin/bash
```

###php.ini

```
vi /etc/php.ini
date.timezone = "Asia/Tokyo"←タイムゾーンの設定※行頭のコメントアウト;を外して、"Asia/Tokyo"と記述
mbstring.language = Japanese←デフォルト言語の設定※行頭のコメントアウト;を外す
```

###nginx用にphp-fpmのユーザー周りの設定を変更する。
(デフォルトがapacheになっているので。)

```
vi /etc/php-fpm.d/www.conf
# 22行目あたり
userとgroupをapacheからnginxに変更

# 37行目あたり
listen = /var/run/php-fpm/php-fpm.sock

# 48行目あたり
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
```


###phpファイル作成

```
cd /usr/share/nginx/html
vi index.php

#ファイルの中身はこんな感じ。ま、wqで保存。
<?php
phpinfo();

```

##nginxのコンフィグ変更

```
vi /etc/nginx/conf.d/default.conf
```
default.confの中身を変更

```

    # 30行目あたり
    location ~ \.php$ {
        #root   /usr/share/nginx/html;
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
```

###権限変える
```
chown -R nginx:nginx /usr/share/nginx/html
find /usr/share/nginx/html -type d -exec chmod 770 {} \;
find /usr/share/nginx/html -type f -exec chmod 660 {} \;
```


###自動起動にして再起動

```
systemctl enable php-fpm.service
systemctl enable nginx.service
#抜けて再起動後、ちょっとまつ
exit
docker restart testphp
```

###一応シェル起動して、プロセス確認(nginxとphp-fpmが起動してたらok)

```
docker exec -it testphp /bin/bash
ps aux | grep -e nginx -e php-fpm
```


###ブラウザで確認
http://localhost:8000/index.php
ok

###curlで確認(新しく覚えた技)
あんま使い方わからんけど。。
```
curl localhost/index.php | head
```

###おまけ
nginxのエラーログをみる

```
tail -n 1000 -f /var/log/nginx/error.log
```

#次回
phalcon3いれてみる
#ゆくゆくは
WEBサーバー(nginx:FastCGI) → APPサーバー(PHP-FPM)
docker-composeも試す

#参考
[CentOS7.1でnginxを用いたウェブサーバの構築]
(http://qiita.com/ksugawara61/items/0fcf3f72cc905bb6d654)
Caffeをインストールしてサンプルを動かすまで

画像認識に定評のあるライブラリ・Caffeを使ってみたくなり、
インストールしてサンプル（mnist）を動かすまでの手順をまとめてみました。

セットアップ環境は以下の通りです。

* OS: Ubuntu 16.04.1 LTS
* GPUドライバ: NVIDIA 367.57 

# １．外部ライブラリのインストール

必要なライブラリの一式をインストールします。

```bash:~
$ sudo apt-get install libatlas-base-dev libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler git
```

# ２．Caffeのダウンロード

gitからCaffeのソースをダウンロードします。

```bash:~
$ git clone https://github.com/BVLC/caffe.git
$ cd caffe
```

# ３．設定ファイルの編集

まずはコンパイル用のmakeファイルを作成します。

```bash:caffe/
$ cp Makefile.config.example Makefile.config
```

このままコンパイルするといくつかのエラーが発生したので、
それを回避するために設定ファイルをいくつか書き換えます。

## ３．１．hdf5まわり

"can't find hdf5.h"などと言われた場合は、
まずlibhdf5-devをapt-getしたか確認しましょう。

インストールされているのにエラーを吐く場合は、
Makefile.configのINCLUDE_DIRSを修正します。

```bash:caffe/Makefile.config
#INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/
```

## ３．２．cudaまわり

次に、"/usr/local/cuda/bin/nvcc: not found"と言われた場合は、
Makefile.configのCUDA_DIRを修正します。

```bash:caffe/Makefile.config
#CUDA_DIR := /usr/local/cuda
CUDA_DIR := /usr
```

## ３．３．memcpyまわり

memcpyまわりでエラーを吐いた場合には、caffe/MakefileのNVCCFLAGSを以下のように修正します。（Makefile.configではないです。紛らわしい）

```bash:caffe/Makefile
#NVCCFLAGS += -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
```

## ３．４．lhdf5まわり

"/usr/bin/ld: -hdf5_hl が見つかりません"と言われたときは、
/usr/lib/x86_64-linux-gnuの中にシンボリックリンクを貼ります。

```bash:/usr/lib/x86_64-linux-gnu
$ cd /usr/lib/x86_64-linux-gnu
$ sudo ln -s libhdf5_serial.so.10.1.0 libhdf5.so
$ sudo ln -s libhdf5_serial_hl.so.10.0.2 libhdf5_hl.so
```

# ４．コンパイル

ここまで来れば、必要な設定は大体終わったはずです。
コンパイルして、テストをしてみましょう。

```bash:caffe
$ make
$ make runtest
```

runtestの結果がPASSEDとなれば、Caffeのインストールが完了です。

![passed.png](https://qiita-image-store.s3.amazonaws.com/0/127680/ea69b039-d35a-4d0f-febb-e2f7173b8d7a.png)

# ５．サンプルのテスト

caffeはデフォルトで学習用のスクリプト一式が入っています。

なので、あとはスクリプトを順々に叩くだけでサンプルが動かせます。

まずはmnistのデータをダウンロードし、変換しましょう。

```bash:caffe/
$ data/mnist/get_mnist.sh
$ examples/mnist/create_mnist.sh
```

学習用データが手に入ったので、モデルを学習させます。

```bash:caffe/
$ examples/mnist/train_lenet.sh
```

最後に、学習済みモデルを利用して、mnistのテストを実行します。

```bash:caffe/
$ ./build/tools/caffe test -model ./examples/mnist/let_train_test.prototxt -weights ./examples/mnist/lenet_iter_10000.caffemodel
```

ここまでで一通りCaffeを動かすことが出来ました。

# 参考文献

* [【Caffe】はじめてCaffeをmakeするまでOn Ubuntu16.04](http://yusuke-ujitoko.hatenablog.com/entry/2016/06/19/203443)
* 初めてのディープラーニング，武井宏将 著
●リソースから文字列(長め)を読み込みたい～Windowsのリソースの指定

###(1)デスクトップアプリケーション(WPF, Form)
プロジェクト-プロパティの設定に種類と内容を記述する。
コードからの呼び出しは、
var string01 = Properties.Resources.ResourceName;
.を打つとインテリセンスで補完してくれるので、リソースファイルに書いた、と憶えておけば、悩み少なし。
というかもともとテキストファイルをリソースにドラッグすれば、そのままリソースとして扱える。

###(2)UWP
そもそもリソースファイルが別立て。自分で作る必要がある。
Resources.reswというXMLファイルを作る。GUIで設定可能なところは、まあおなじ。
var loader = new Windows.ApplicationModel.Resources.ResourceLoader();
var string01 = loader.GetString("Text1");
インテリセンスの補完なし。憶えておいた名前を記述する。これは考えるところがいっぱいあって工夫できそう。
サンプルで試しに小説1冊分(400字詰め原稿用紙約750枚)を入れたとところ、VisualStudio2015が極端に重くなって制御不能になった…。
ファイルを削除して、2ページ分に減らしたらうまくいった。
Docker ToolboxからDocker for Macに乗り換える

Docker ToolboxからDocker for Macに乗り換えるときにそれぞれの違いや共存するとどうなるかを調べたのでメモ。

結論としてはDocker ToolboxをアンインストールしたあとにDocker for Macをインストールしました。

##公式ドキュメント

https://docs.docker.com/docker-for-mac/docker-toolbox/
それぞれのツールでDockerを動かす仕組みが説明されています。
[Get started with Docker for Mac](https://docs.docker.com/docker-for-mac/)にもまず上記ドキュメントで書かれていることを理解するように書かれています。

##共存させるときの使い方

###Docker　Toolboxを使いたいとき
```bash
docker-machine start
eval $(docker-machine env default)
```
を実行したあとに`docker`コマンドを実行する。

###Docker for Macを使いたいとき
全てのDOCKER環境変数がセットされていないことを確認して`docker`コマンドを実行する。

##共存させるときの注意点
https://docs.docker.com/docker-for-mac/docker-toolbox/#checking-component-versions
ここに書かれているようにDocker for MacでインストールしたDocker ClientとDocker ToolboxでインストールしたDocker Serverのバージョンが異なることがあるようです。

いまのところその差分を気にする手間を取るほどDocker Toolboxを使いたいわけでもないので先にDocker ToolboxをアンインストールしてからDocker for Macをインストールすることにしました。
**Docker Machineで作成済みのコンテナやイメージを残したい場合は先にDocker for Macをインストールしてください。Docker for Macにコピーするオプションがあります。**

## Docker Toolboxのアンインストール
アンインストールの方法はこちらを参考にしました。
http://qiita.com/minamijoyo/items/ec5b35382797ac08e067
実際に実行したのは

```bash
git clone https://github.com/docker/toolbox.git
cd toolbox/osx
sudo bash ./uninstall.sh
```

これだけです。

https://docs.docker.com/toolbox/toolbox_install_mac/#how-to-uninstall-toolbox
こちらにも手順がありますが、先述のシェルスクリプトのほうが手順が多いです。どちらが好ましいかちゃんと調べていませんがシェルスクリプトのほうが楽そうだったのといらないものを残したくなかったのでシェルスクリプトを選びました。

先にDocker for Macをインストールして、Docker Toolboxをアンインストールしたい場合はこちら
http://qiita.com/ttskch/items/3f0143385cb5299957a6#_reference-809d238b996034bfb862

## Docker for Macのインストール
https://docs.docker.com/docker-for-mac/
こちらの手順に書いてあるとおりにやればいいのでかんたんです。

![スクリーンショット 2016-11-20 17.28.34.png](https://qiita-image-store.s3.amazonaws.com/0/20045/d97ff772-9c92-5566-327e-7b7528ddf188.png)
かわいい


以上です。

まだDockerに関して理解できていない部分も多いのでそもそも間違った認識をしていることもあるかもしれません。その際はコメントや編集リクエストをいただけるととても助かります。
[VS2015][Git]Gitのユーザー名、メール設定を変更する

Visual Studio 2015でGitの設定をする方法まとめ

初期設定だと `username <username@username-PC>` みたいになってしまっていたので、変更方法のメモになります。

## 1. 「表示」 => 「チームエクスプローラー」 を選択
![1.png](https://qiita-image-store.s3.amazonaws.com/0/37721/9b87abc0-3e18-9851-b1e7-c30edcaf9286.png)

## 2. 画面右に表示されたチームエクスプローラーから、「設定」を選択
![2.png](https://qiita-image-store.s3.amazonaws.com/0/37721/65c56180-ecea-29d0-0528-579e1e9b0763.png)

## 3. Git画面で、リポジトリの設定を選択
![3.png](https://qiita-image-store.s3.amazonaws.com/0/37721/212bd413-500c-30d6-8756-4d731b222c9a.png)

## 4. 「グローバルユーザ名および電子メールの設定をオーバーライドします。」にチェックを入れる
![4.png](https://qiita-image-store.s3.amazonaws.com/0/37721/aaf2322c-3363-c2df-23e6-57b462c62d0d.png)

メールの設定は、デフォルトではマイクロソフトのアカウントに紐付いた設定になっているはずです。
変更の必要があれば、3の画面から、グローバル設定を選んで変更して下さい。

# 参考
[Customize Git settings in Visual Studio | Microsoft Application Lifecycle Management](https://blogs.msdn.microsoft.com/visualstudioalm/2013/02/26/customize-git-settings-in-visual-studio/)