OmniAICreator/Qiita-1.07M huggingface dataset:
[Go]重み付き乱択アルゴリズムを整数だけで完結させる

ある要素集合から要素を重みを付けてランダムに選出することを「重み付き乱択アルゴリズム」という[らしい](https://qiita.com/catatsuy/items/8bad8aff8ac2a1def118)のですが、今回はそれを浮動小数点数を使わずに整数のみで実装しようと思います。
ソースコードは本記事の末尾にまとめて記載しています。

まずは重みの定義ですが、1以上の正整数からなる配列で定義しておきます。

```go
weights := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
```

もし0や負整数が含まれていた場合はうまく動作しないので必ず正整数だけで定義しておきましょう。
また、配列が空（＝重みが1つも定義されていない）の場合も同様にうまく動作しません。
実際に使う場合は独自のエラーハンドリングを記載しておいた方が良いですね。

重みを定義した後は、どこからどこまでが「$i$番目の重みが属するセクション」かを決めるために境界値を定義していきます。
これはただ単に重みの累積和をとるだけでいいですね。
"セクション"と言うからには最初の境界値が0である点に注意が必要です。

```go
boundaries := make([]int, len(weights)+1)
for i := 1; i < len(boundaries); i++ {
	boundaries[i] = boundaries[i-1] + weights[i-1]
}
```

そしてここからがメインの重み付き乱択アルゴリズムの説明になります。

乱数の生成は`math/rand`パッケージの`rand.Intn`を使います。
これは引数に`int`型の正整数`n`を与えることで`[0,n-1]`の正整数を返す関数です。
ただし、のちほどの重み位置の探索との兼ね合いで乱数を`+1`しておきます。
つまり乱数の生成区間を`[1,n]`にします。

```go
x := rand.Intn(boundaryLast) + 1
```

次に、生成した乱数が境界値で区切ったセクションの何番目か、つまり何番目の重みかを求めていきます。
境界値が単調増加列になっているため二分探索を用いて求められます。
「二分探索のアルゴリズムとか実装するのめんど！」と思うかもしれませんが、わざわざそれを実装する必要はなくて、`sort`パッケージの`sort.SearchInts`を用いればいいです。

```go
idx := sort.SearchInts(boundaries, x)
```

最後に、$i$番目の境界値を$b_i$として、生成した乱数を二分探索した結果その乱数が区間$[b_{i},b_{i+1}]$に含まれる場合、セクション位置としては$i$番目ですが二分探索の結果は$i+1$が返るので、その結果に`-1`しておきます。

最終的なソースコードは以下の通りです。

```go
package main

import (
	"fmt"
	"math/rand"
	"sort"
	"time"
)

const N = 1000000

func main() {
	rand.Seed(time.Now().UnixNano())

	weights := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}

	boundaries := make([]int, len(weights)+1)
	for i := 1; i < len(boundaries); i++ {
		boundaries[i] = boundaries[i-1] + weights[i-1]
	}

	boundaryLast := boundaries[len(boundaries)-1]
	counter := make([]int, len(weights))
	for i := 0; i < N; i++ {
		x := rand.Intn(boundaryLast) + 1
		idx := sort.SearchInts(boundaries, x) - 1
		counter[idx]++
	}

	fmt.Println("|weight|expected|actual|")
	fmt.Println("|:-:|:-:|:-:|")
	for i := 0; i < len(weights); i++ {
		fmt.Printf(
			"|%d|%f|%f|\n",
			weights[i],
			float64(weights[i])/float64(boundaryLast),
			float64(counter[i])/float64(N),
		)
	}
}
```

100万回選出した結果、重みごとの選出率の期待値（expected）と実際値（actual）はかね近いことが分かります。
実行するごとにactualは異なります。

|weight|expected|actual|
|:-:|:-:|:-:|
|1|0.022222|0.022258|
|2|0.044444|0.044653|
|3|0.066667|0.066533|
|4|0.088889|0.088676|
|5|0.111111|0.110854|
|6|0.133333|0.132967|
|7|0.155556|0.156268|
|8|0.177778|0.177938|
|9|0.200000|0.199853|

上記ソースコードの注意点として、重みの大きさによっては境界値が`int`で収まらない場合があるので、オーバーフローに気をつける必要があります。その時は`uint64`など別の型で対処しましょう。
npmのinstallがどうしてもうまく行かない人

# npmのインストールがどうしてもうまく行かない時
環境は、vagrantでdebian(stretch)

nodejsはインストール出来るけどnpmはパッケージに存在してないしでインストールできなかった...
色々調べたけどなかなか載っていなかった...

そして、見つけた。
原因は、nodejsのバージョンなのかもしれない。
とりあえず、解決策

```
$ curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
$ sudo apt-get install -y nodejs
```

これでnpmも一緒にインストールされる。
終わり。
vagrant ifconfigのインストールとPATHの初期設定

# vagrant ifconfigのインストール
最初にvagrant upした時

~~~a:terminal
$ vagrant up
$ vagrant ssh

vagrant $ ifconfig
-bash: ifconfig: command not found
~~~

ifconfigが入ってない。
ifconfigは/sbin/ifconfigに入っているはず
とりあえず/sbinにパスを通す。

まず、編集するためにvimをインストール

~~~a:terminal
vagrant $ sudo apt install vim -y
~~~

そしてPATHに/sbinを追加
ついでに/usr/sbinと/usr/local/sbinも入れておこう。

~~~a:terminal
vagrant $ sudo vim .bashrc
~~~

~~~a:~/.bashrc
#一番下に
PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin
~~~

まだできない。
そもそものifconfigも入ってなかった。
ifconfigはnet-toolsのパッケージをインストールすれば使えるらしい。

~~~a:terminal
vagrant $ sudo apt install net-tools

vagrant $ ifconfig
~~~
これで使える。
Minicondaで環境立ち上げ for Windows

2017/11/03 MinicondaでWindowsにscipy, OpenCVをインストールして、pythonの画像処理、機械学習の環境を立ち上げたので、手順をメモ代わりに書きました。

仮想環境を幾つか、切り替えて使いたいため、Anacondaだと容量が大きくなるので、Minicondaを使用してみました。
あと、勉強もかねて、自分でどのパッケージを使っているのか把握したかったからです。
MinicondaはAnacondaとの違いは、condaとconda関連のライブラリしか入っていないらしいので、pythonで使うライブラリは自分で、入れる必要があります。

Jupyterなども入っていないので、自分でインストールします。


__手順__

1. Minicondaインストール
1. 仮想環境作成(conda)
1. パッケージインストール
 - jupyter
 - OpenCV
 - matplotlib
 - scipy

## 実行環境
Windows 10 Home(64bit)
Miniconda (64bit) 2017/11/02


## 準備
まずMinicondaをインストール。
Windows 64bit版 Python3.6を公式サイトからダウンロード。

Minicondaのパスを通す。
環境変数PathにC:\Users\xxx\Anaconda3\Scriptsを追加。
(もしかしたら、必要ないかも・・・)

condaコマンドが使えるようになるので、これで必要なパッケージを追加していきます。
自分でパッケージを管理するMinicondaは、installとlistコマンドは、よく使います。

```
> conda install パッケージ名 ### パッケージのインストール
> conda list  ### インストールしたパッケージリストの表示
```

ちなみに、condaはコンパイル済のバイナリをインストールするのに対し、pipはソースをダウンロードしてローカルでコンパイルが行われます。一般的に、pipの方がバージョンが新しい傾向にあるようです。
condaもpipも共存ができるので、必要に応じて使い分けることになります。
自分はとりあえず、condaを使って、無かったり、もっと新しいバージョンが欲しいときにpipを使ったりしてます。

## 仮想環境作成
デフォルトのpythonのバージョンが3.6だと、対応したOpenCVのパッケージが無いので、python 3.5の仮想環境を作って、インストールを進めます。

仮想環境の作成。-nの後ろは環境名なので、判りやすいように名前を付けてください。

```
> conda create -n py35a python=3.5

```

新しく作成した、現在の仮想環境として選択します。

```
> conda info -e # 仮想環境の確認
> conda activate py35a # 仮想環境の切り替え
```


## Jupyterの設定

minicondaの場合、Jupyterも入っていないので、自分で入れます。

```
(py35a) > conda install jupyter jupyter_console qtconsole notebook sphinx sphinxcontrib nbconvert
```


次に、Jupyterの設定ファイルを作成。
こちらは共通の設定なので、仮想環境にActivateしていても、していなくても、大丈夫です。

```
> jupyter notebook --generate-config
```
minicondaをインストールした場所に.jupyter/jupyter_notebook_config.pyが生成されます。
ホームディレクトリなどイロイロ設定を変更できます。
詳しくは書きませんが、中身に目を通すと良いかもしれません。

### カーネル追加
Jupyterで選択できるように、pythonカーネルを追加します。
ここら辺はチョット怪しいので、別途調べたほうが良いかも・・・
Jupyter：[Kernel]->[Change Kernel]->[py35]

```
(py35a) > ipython kernel install --user --name=py35a --display-name=py35a
```

(http://qiita.com/supersaiakujin/items/50def6f33b79f9a61b18)


### ホームディレクトリの設定
jupyter立ち上げたときのカレントディレクトリになります。、
```
c.NotebookApp.notebook_dir = 'D:\Sukina\basyo' # 好きなフォルダのパスを記述する
```

## OpenCVのインストール

```
(py35a) > conda install -c menpo opencv
```

以下のサイトから、OpenCVパッケージのファイル名を見ると必要な条件がわかります。Windows 64bit, python 3.5など。

https://anaconda.org/menpo/opencv3/files


## その他、必要と思われるパッケージのインストール
```
(py35a) > conda install scipy
(py35a) > conda install matplotlib
```

後は、自分が必要なパッケージを必要に応じて、追加していきます。
ちなみにnumpyは、OpenCVと一緒にインストールされています。
Appiumでuiautomator2を利用する

# 公式サイト

- [Appium](http://appium.io/)
- [appium/appium\-uiautomator2\-driver](https://github.com/appium/appium-uiautomator2-driver)
- [appium/appium\-uiautomator2\-server](https://github.com/appium/appium-uiautomator2-server)

# サンプルコード

`capabilities`で`automationName`に`uiautomator2`を指定する。

```ruby:sample.rb
require "appium_lib"

SERVER_URL = "http://127.0.0.1:4723/wd/hub"
APP_PATH = "#{Dir.pwd}/xxx.apk"

capabilities =
    {
      app:  APP_PATH,
      platformName: 'Android',
      deviceName: 'Android Device',
      automationName: 'uiautomator2' # automationName に uiautomator2 を指定
    }

driver = Selenium::WebDriver.for(:remote, :desired_capabilities => capabilities, :url => SERVER_URL)

driver.find_element(:id, "xxx:id/button").click
puts driver.find_element(:id, "xxx:id/textView").text

driver.quit
```

> 参考サイト：
> [How Server module works · appium/appium\-uiautomator2\-server Wiki](https://github.com/appium/appium-uiautomator2-server/wiki/How-Server-module-works)

# 備忘録

## 問題点
Macにインストールされていた`appium-uiautomator2-server`のバージョンとAppiumが利用しようとしている`appium-uiautomator2-server`のバージョンが一致してなかったため、サンプルコード実行時にエラーが発生した。

```shell-session
$ ruby sample.rb 
/Users/xxx/.rbenv/versions/2.2.4/lib/ruby/gems/2.2.0/gems/selenium-webdriver-3.7.0/lib/selenium/webdriver/remote/response.rb:69:in `assert_ok': An unknown server-side error occurred while processing the command. Original error: The file at path /usr/local/lib/node_modules/appium/node_modules/appium-uiautomator2-driver/uiautomator2/appium-uiautomator2-server-v0.1.8.apk does not exist or is not accessible (Selenium::WebDriver::Error::UnknownError)
```

## 解決方法

`appium-uiautomator2-server`のReleasesページからAppiumが利用しようとしているバージョンの`appium-uiautomator2-server`をダウンロードして、`/usr/local/lib/node_modules/appium/node_modules/appium-uiautomator2-driver/uiautomator2/`に配置した。

[Releases · appium/appium\-uiautomator2\-server](https://github.com/appium/appium-uiautomator2-server/releases)
Shopifyのテーマをローカルで編集してプレビュー/反映するためにやったこと

Shopifyのテーマをローカルで編集するためにしたことをこの記事にまとめます。
# 環境
- macOS Sierra

# Theme Kitをインストールする
curlでダウンロードしてきてPythonで実行していますが、Pythonのバージョンは2.7系である必要があるようです。
（３系だと失敗しました。）

```
$ curl -s https://raw.githubusercontent.com/Shopify/themekit/master/scripts/install | sudo python
```

インストールされたか確認するために、バージョンを出力してみます。バージョンが出力されればインストール成功です。

```
$ theme version
ThemeKit 0.7.5 darwin/amd64
```

# Private Appを作り、Apiのパスワードを取得する
まず、管理画面のAppsから`Manage private apps`をクリックし`Private apps`へ移動します。
<img width="993" alt="img1.png" src="https://qiita-image-store.s3.amazonaws.com/0/123970/a8d82837-5e2f-b104-9251-0cc22d8f1d52.png">

`Create a new private app`ボタンを押します。
<img width="993" alt="img2.png" src="https://qiita-image-store.s3.amazonaws.com/0/123970/2c3dfe25-58db-5dd8-c6ce-fd077492fad4.png">

`Create private app`へ移動したら、Private app nameに任意の名前をつけてください。
また、`Admin API`の`Theme templates and theme assets `を`Read and Write`に変更して下さい
![img3.png](https://qiita-image-store.s3.amazonaws.com/0/123970/96254a40-6e25-8820-54ac-6cf882ed84fa.png)

一番下の`Save`ボタンをクリックし、Appの作成を完了してください。
正常にAppが完了したら、Apiのパスワードが表示されます*。そのパスワードは後で使用します。*

# Theme IDを取得する
管理画面から編集するテーマのActionからEdit codeをクリックします。
遷移先のURLの後ろの数字がTheme IDとなります。
例えばURLが`https://myshop.myshopify.com/admin/themes/123456789`であればTheme IDは`123456789`です。
![img4.png](https://qiita-image-store.s3.amazonaws.com/0/123970/b2e8b600-dd77-7d67-0ca5-26cdd580d569.png)

# 作業ディレクトリを作成し、テーマを編集する
任意のディレクトリを作成し、そのディレクトリに移動した後、`theme configure`コマンドでShopifyのテーマを編集するための設定をします。
`your-store.myshopify.com`は自分のShopifyのStoreのURLを貼って下さい。

```
$ theme configure --password=[ApiのPassword] --store=[your-store.myshopify.com] --themeid=[Theme ID]
```
これを実行すると`config.yml`が生成されます。
以下のコマンドでテーマをダウンロードすることができます。

```
$ theme download
```

## テーマをアップロードする
編集したテーマを手動でShopifyにアップロードするには以下のコマンドを実行します。

```
$ theme upload
```

## テーマをプレビューする
テーマをプレビューするには、以下のコマンドでブラウザが開きプレビューされます。

```
$ theme open
```

## テーマをリアルタイムで反映させる
以下のコマンドを実行させておくことで、テーマをローカルで編集しセーブするたびにShopifyにリアルタイムで反映させることができます。
`Ctrl+C`で終了できます。

```
$ theme watch
```

# 参考
https://www.shopify.com/partners/blog/95401862-3-simple-steps-for-setting-up-a-local-shopify-theme-development-environment
vagrant boxで簡単構築

# vagrant簡単構築
boxというのは、仮装環境のimageファイルみたいなものである。
boxをurlで指定してvagrantで立ち上げる形になる。

まずboxが置いてある場所
[Vagrantbox.es](http://www.vagrantbox.es/ "vagrantboxes")
↑ここから欲しいboxのurlをコピー

~~~a:terminal
$ vagrant box add {title} {url}
$ vagrant init {title}
$ vagrant up
~~~
{title}って場所は、自分で自由に決めます。

ちなみにvagrantを一度したことあれば
boxリストからinitできるので
ディレクトリだけ作って新しい環境を構築します。

~~~a:terminal
$ vagrant box list
debian/stretch64 (virtualbox, 9.2.0)
~~~
この場合は、[debian/stretch64]がボックス名ですので

~~~a:terminal
$ vagrant init debian/stretch64
$ vagrant up
~~~

これで環境構築できます。
WordPress wpタグをさらに関数設定して自分好みに出力する

wpタグをさらに関数設定して自分好みに出力する設定をfunctions.phpに記述していきます。


##現在のページが持っているタームリストの情報（タームID,ターム名前,タームスラッグ）を取得する

```ruby:functions.php
/*
 * 機　能：現在のページが持っているターム情報（タームID,ターム名前,タームスラッグ）を取得する
 * 使用できるテンプレート：single.php
 * @param：int($id)
 * @param：string($tax)
*/
function getCurrentCategorys($id,$tax){
	$categorys =  get_the_terms($id, $tax);
    foreach($categorys as $i => $category) {
        yield [
            'term_id' => $category->term_id,
            'name' => $category->name,
            'slug' => $category->slug,
            'totalCount' => $i +1,
       ];
	}
}
```
###出力方法

```ruby:shingle.php
$itr = getCurrentCategorys($post ->ID,'タクソノミー名');
foreach($itr as $index => $category) {
    echo $category['term_id'];
    echo $category['name'];
    echo $category['slug'];
    echo '合計数:'.$category['totalCount'];
}
;
```

##現在のページが持っているタームリストを表示（echo）する

```ruby:functions.php
/*
 * 機　能：現在のページが持っているターム情報を全て表示（echo）する
 * 使用できるテンプレート：single.php,front-page.php
 * @param：int($id)
 * @param：string($tax)
*/
function echoCurrentNewsTerms($id,$tax){
	// ↓ タームの情報を取得する
	$tarms =  get_the_terms($id, $tax);
	$termsNum = count($tarms);
	//var_dump($tarms);
	//var_dump($tarms[0]);
	for($i=0;$i<$termsNum;$i++){
	echo '<a href="/news/cat/'.$tarms[$i] -> slug.'/">'.$tarms[$i] -> name.'</a>';
	}
}
```

###出力方法

```ruby:shingle.php
<?php echoCurrentNewsTerms($post ->ID,'タクソノミー名');?>
```
C++でC#の??演算子風なものを作ってみた

#追記

11/26日　左辺がfalseだとしても右辺が評価されてしまう問題があったので遅延評価されるように変更

# C#の??演算子(null 合体演算子)

`??`演算子は、左側がnullでない場合は左側を返し、nullである場合には右側を返す2項演算子です

```csharp
    class Program
    {
        static void Main(string[] args)
        {
            int? a=null;
            a=a??5;

            Console.WriteLine(a); //5
        }
    }

```

# C++でも似たようなものを作ってみる

nullptrかのチェックにしても良かったが、`std::optional`とかとも統一するためにboolでのチェックとし、falseだった場合にした

```cpp:FalseIf.hpp
#include<functional>


constexpr struct FalseIf
{
	template<class T>
	struct Generator
	{
		std::function<T()> generator;
	};
	template<class T>
	auto operator()(T&& generator)const->Generator<decltype(generator())>
	{
		return Generator<decltype(generator())>{generator};
	};
	template<class T, class U>
	friend auto operator |(T&& l, const Generator<U>& r)
		->decltype(l ? std::forward<T>(l) : r.generator())
	{
		return l ? std::forward<T>(l) : r.generator();
	}

}false_if;

```

右辺の評価を遅らせるためにfunctionで受け取るように変更

使い方

```cpp:main.cpp
int main()
{
	//生ポインタ
	int* a = nullptr;
	a = a | false_if([] {return new int(5); });

	//スマートポインタ
	std::unique_ptr<int> b;
	b = std::move(b) | false_if([] {return std::make_unique<int>(5); });

	//optional
	std::optional<int> c;
	c = c | false_if([] {return 5; });


	std::cout << *a << *b << *c << std::endl;
	return 0;
}
```

# 結論

普通にifなり3項演算子でいい気がする
[Python]明日の日付を取得する

#はじめに
[研究室内からしか見れないスケジュールをslackに毎朝9時に通知する](https://qiita.com/3000manJPY/items/6063b1214581937c075e)
上記の記事にあるようにスケジュールのリマインダーを作ったのですが，仕様変更を行うにあたって翌日の日付を取得したくなりました．
最初は「月末や年末，閏年の処理が面倒だな...」と思いながら条件式を書いていたのですが，簡単に取得できる方法があったのでメモ．


#取得方法
timedeltaを使って1日加算してあげるだけで取得できます．
簡単．

```py3:tomorrow.py
import datetime

def main():
  #　今日の日付
  print('今日の日付')
  print('年: {0}'.format(datetime.datetime.now().year))
  print('月: {0}'.format(datetime.datetime.now().month))
  print('日: {0}'.format(datetime.datetime.now().day))

  # 明日の日付
  print('明日の日付')
  print('年: {0}'.format((datetime.datetime.now() + datetime.timedelta(days = 1)).year))
  print('月: {0}'.format((datetime.datetime.now() + datetime.timedelta(days = 1)).month))
  print('日: {0}'.format((datetime.datetime.now() + datetime.timedelta(days = 1)).day))


if __name__ == '__main__':
  main()
```


#実行結果
```bash:result
$ python tomorrow.py
今日の日付
年: 2017
月: 11
日: 24
明日の日付
年: 2017
月: 11
日: 25
```


#参考文献
[How do I get tomorrow's date in Python?](https://stackoverflow.com/questions/13528287/how-do-i-get-tomorrows-date-in-python)
新Python生活五日目(振返り)【PyQ/8章】

分からない単語等が色々出てきますが、
ある程度目に見えた進捗がないと自分のモチベーションが保てないので、
理解度100%ではないですが今日も進んで行きます。

#モジュール
使い慣れない単語です。
初心者な自分は、こーいった単語の理解だけでも結構苦しむポイントです。。

意味：
まとまりを持った機能部品・機能単位。

そいつ単体でも機能として成立しているけど、
普通は単体では動かさずに合体させて動かすよーetc･･･らしい。

PyQ的には**「呼び出すだけで便利に使える処理を集めたもの」**だそうです。

#オブジェクト
色んなサイトで説明を読んでもあまりピンと来ない。でも必須の考え方らしい。。

##datetime：日時を扱うモジュール

```py3
from datetime import datetime #datetimeモジュールのdatetimeオブジェクトを呼び出すよ
now = datetime.now() #現在日時のdatetimeオブジェクトを変数nowに代入
print(now)
```

```text:出力結果
2017-11-23 20:09:33.XXXXXX #年月日、時間、マイクロミリ秒までを表示
```

###モジュールだけ呼び出す

```py3
import datetime #datetimeモジュールを呼び出す
print(datetime.date.today()) #今日の日付だけ表示させる
```
```text:出力結果
2017-11-23
```
###モジュールの中の**特定のオブジェクト**だけを呼び出す

- date : 年月日
- time : 時分秒、マイクロミリ秒
- datetime : 日付、時刻
- timedelta : 日付、時刻の間隔

```py3
from datetime import date #datetimeモジュールのdateオブジェクトを呼び出す
print(date.today())
```
```text:出力結果
2017-11-23
```
#日時を表示

```py3
from datetime import datetime

now = datetime.now()
print(str(now.year) + '年')
print(str(now.month) + '月')
print(str(now.day) + '日')
print(str(now.hour) + '時')
print(str(now.minute) + '分')
print(str(now.secind) + '秒')
```
```text:出力結果
2017年
11月
23日
20時
9分
33秒
```

#日時の作成
指定日時

```py3
from datetime import datetime

a_datetime = datetime(2017, 7, 20, 15, 45, 30) #時間を指定しないと00:00:00となる
print(a_datetime)
```
```text:出力結果
2017-07-20 15:45:30
```
#日時を文字列に変換
```py3
from datetime import datetime

a_day = datetime(2017, 7, 20, 15, 45, 30)
b_day = a_day.strftime('%Y-%m-%d %H:%M:%S')
print(b_day)
```
```text:出力結果
2017-07-20 15:45:30
```
strftime：引数として**指定したいフォーマット**を入力して日付型から文字列へ変換する。

　%Y：西暦（4桁）の10進表記
　%m：0埋めした10進数で表記
　%d：0埋めした10進数で表記した日にち
　%H：0埋めした10進数で表記した時(24h表記）
　%M：0埋めした10進数で表記した分
　%S：0埋めした10進数で表記した秒

#文字列を日時に変換
```py3
from datetime import datetime

c_day = '2017年2月1日'
s_day = datetime.strptime(c_day, '%Y年%m月%d日')
print(s_day)
```
```text:出力結果
2017-02-01 00:00:00
```
strptime：一つ目の引数には**変換したい文字列**、二つ目の引数には**フォーマットを表す文字列**を
　　　　　指定して文字列から日付型へ変換する。

#日付の計算
例えば11月23日の8日後とか、15日前とかの値を利用したいなって時に
先に出てきて良く分かっていないヤツ･･･
**datetimeモジュールのtimedeltaオブジェクト**ってのを使用するみたいです

```py3
from datetime import detetime
from datetime import timedelta #このよく分からないヤツも含めて2つ使うのね。

ano_hi = datetime(2017, 11, 23) #基準となる日
before_15days = ano_hi - timedelta(days=15) #15日前っていつかなー
after_8days = ano_hi + timedelta(days=8) #8日後っていつかなー

print(before_15days.strftime('%Y-%m-%d'))
print(after_8days.strftime('%Y-%m-%d'))
```
```text:出力結果
2017-11-8
2017-12-1
```
GoでAPIMockサーバー作ってみた話

## はじめに

新卒専用 Advent Calendar 2017 16日目の記事です。

今年大学を卒業しエンジニアとしてIT企業に就職しました。
よろしくお願いします。

## 何したの

GoでAPIサーバー作成に取り組んでみた話です。

先日、開発環境用のMockサーバーを作る機会が降ってきました。
せっかくなので未経験の言語でやってみようとGoで組んでみました。

固定値を返せばいい要件だったので、そんなにかっちり組む必要はなかったのですが、
ちょうどフロントエンドのモバイルアプリ開発でclean architectureを導入していたこともあり、勢いでやっていくことにしました。

## 仕様

* requestを受け取ったら固定値を返す。
* queryParameterを受け取ったらそれに応じて絞り込みくらいはしたい。
* ちょっと外部APIからデータを引いてくるところもある。
* ソースを弄らなくてもレスポンスを変えられる。
* **いつでもぶっ壊せる**

## clean architectureについて

大量の学習コストとファイル数を犠牲に、無限の拡張性を手に入れることができる設計です。
今回は、後で裏側にDB繋げたくなりそうだったので導入に踏み切りました。
詳細は以下の記事を参照してください。

(The Clean Architecture)
https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html

## 結果

**挫折しました。**
EntityとModelのtranslate, またrepositoryのIF提供あたりの理解があやふやでした……。
また、api以外のアクセスがあった場合、吸収しきれていません。

とりあえず完成したゆるふわ設計を書きます。
ソース本体は業務の都合上公開できないので……別途書きたいです。

```
- main.go
- go/
  - infra/
    - generator/
      - res/
        - リスト系のdummyData.json
      - 固定値を返すgenerator
    - api/
    - repository/
      - repositoryの実装
  - domain/
    - repository(IF)/
    - model/
    - usecase/
  - handler/
    - controller
    - api/
      - request/
      - apiClient.go
      - httpHeaderValidator.go
    - validator/
  - routers.go
```



## 構成詳細

大きく見ると３層です。

### handler

clientから受け取ったリクエストを処理してusecaseに渡します。
validationはここで済ませておき、usecaseには安全な構造体が渡るようにします。

* controller
  * handlerの花形です。
  * handlerでの処理を司ります。
* api
  * httpアクセスを受けた場合のパッケージです。
  * httpヘッダーのバリデーションのみ内部で片付けます。
* request
  * apiのrequestのentityです。そのままですね。
* validator
  * apiのrequestをvalidationします。

### domain

ビジネスロジックを提供します。

* repository
  * infra層からデータを受け取ります。
  * このあたりで設計が崩れている気がする……。
  * データの絞り込みもここでやっつけます。
* model
  * domain内で処理するオブジェクトの構造体を定義します。
* usecase
  * ビジネスロジックを書きます。
  * 必要なデータに応じてrepositoryを呼びます。

### infra

usecaseに返却するdataを生成します。
今回はほぼほぼ固定値を返すだけなので、entityはサボってます。

* generator
  * 固定値を生成します。
  * 履歴等、大量かつ本アプリを使ったテスト時に変更が求められそうなものはjsonにしてres/内に切り出しています。
* api
  * 一部外部のAPIからデータを引っ張ってきているので、それはここで処理します。

## 感想

Go自体に継承がないとか色々戸惑うことはありましたが、馴染みやすくとても可愛い言語でした。
また、設計だけでなく、loggingなどフレームワークが隠蔽していたところも意識するようになりました。今後ともいじっていきたいです。


## TODO

* repositoryをちゃんとIFでメソッドを提供する。
* exceptionを別でパッケージ切って定義する。
  * apiのvalidation周りのエラーハンドリングがグダグダになっているので、ちゃんと整理したいです。

## 参考

https://qiita.com/koutalou/items/07a4f9cf51a2d13e4cdc
https://www.slideshare.net/kenjitanaka58/5-66290992
https://thenewstack.io/make-a-restful-json-api-go/

## Appendix

### library

* net/http
* gorilla/mux
* encoding/json
* log
* go-playground/validator.v9
VSCode + Typescript でデバッグを有効にする

タイプスクリプトで作っているプロジェクトで、VSCode でデバッグを有効にしてみたかったので、やってみた。

# SourceMap

tsconfigに SourceMap の定義を有効にする。これにより `*.js.map` ファイルができて、ブレークポイントが設置できるようになる。

_tsconfig.json_

```json
{
    "compilerOptions": {
        "target": "es6",
        "module": "commonjs",
        "sourceMap": true
    }
}

```

# Launch.json

VSCode のDebug から下記のようにして新しいデバッグの定義を作る。
<img width="352" alt="01.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/6cc0a664-b958-61c8-3866-e608b71e58e3.png">
Node-Mocha を選択してテンプレを作る。

`launch.json` ができるので次のようにしてみる。

```json
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node",
            "request": "launch",
            "name": "Mocha Tests(k8s tasks)",
            "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha",
            "preLaunchTask": "Typescipt compile",
            "args": [
                "-u",
                "tdd",
                "--timeout",
                "999999",
                "--colors",
                "${workspaceFolder}/Tests/L*.js"
            ],
            "internalConsoleOptions": "openOnSessionStart"
        },
        {
            "type": "node",
            "request": "launch",
            "name": "Launch Program",
            "program": "${file}"
        }
    ]
}
```
ポイントを説明する

|名前|意味|
|:------------|:--------------------|
| type | デバッガーのタイプ。node はビルドイン|
| request | ランチの設定。launch か attach |
| name | タスクの名前 |
| program | 実行するプログラム |
| preLaunchTask| デバッグの前に実行するタスク。`task.json` で定義されたもの|
| args | プログラムの引数 |
| internalConsoleOptions | デバッグコンソールのオプション |

* [debugging ](https://code.visualstudio.com/docs/editor/debugging)

ほとんどは、Node-Mocha のテンプレートのままで大丈夫だが、できれば、typescript のコンパイルがかかるようにしたかったので、preLaunchTask を設定している。preLaunchTask は

# Custom Task を作成する

* [Custom Tasks](https://code.visualstudio.com/docs/editor/tasks)

で説明されているタスクを作る。`Ctrl+Shift+P` でConfigureTaskを選んで、てきとうにタスクを選んでみる。すると、.vscode/task.json ができる。
それを次のようにする。先ほどのデバッグのぺーじにずばりがあったので、ちょっとだけ改造した。この名前と、さっきの、`preLaunchTask` を同じにする。

```json
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Typescipt compile",
            "type": "shell",
            "command": "tsc -p ."
        }
    ]
}

```

# デバッグ

これでデバッグ環境構築完了。いい感じね。

<img width="1364" alt="03.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/9f8ef64b-8131-cd48-99ae-60a916c21c6f.png">
【ARKit入門】　まずやること


#ARKit入門


##ARKitを使う際にまずやること

###1.カメラの使用許可

![カメラ使用.png](https://qiita-image-store.s3.amazonaws.com/0/138735/a2f3a2b9-a557-4eb7-fc06-ad6b507104ad.png)
カメラの使用するためにinfo.plistを設定しましょう！


###2.ストーリーボードにARSCNView追加
![スクリーンショット 2017-10-30 1.56.34（2）.png](https://qiita-image-store.s3.amazonaws.com/0/138735/cc976619-b3ed-e614-1055-498c4ec3c409.png)

このビューがある部分が検出対象！

###3.平面検出

```ViewController.swift
//検出用configを作成
let configuration = ARWorldTrackingConfiguration()

//showWorldOrigin：初期位置に座標表示　showFeaturePoints：検出できたとこにpointが表示
self.mainSceneView.debugOptions = [ARSCNDebugOptions.showWorldOrigin, 
ARSCNDebugOptions.showFeaturePoints]

//検出対象に平面を設定
self.configuration.planeDetection = .horizontal

//検出開始！
self.mainSceneView.session.run(configuration)

```

以上でARKitを使用する準備が整いました！次回から実際にオブジェクト配置とか、とか
→ 12/20 新しい記事投稿しました！
[【ARKit入門】平面にアイテムを配置する](https://qiita.com/yyokii/items/ff5b69f7e2c7b93a68ce)
Blockchain EXE #6 の超概要レビュー

どうも、Blockchain初学者です。
先日、Blockchainコミュニティ「Blockchain EXE」のイベント、「Blockchain EXE #6 ブロックチェーンプラットフォームの最新動向と開発コミュニティ」に参加しました。
わからないことだらけでしたが、イベントで聞いたことのメモを残しておこうと思います。
キーワードの羅列みたいな感じになるかもしれませんが、ここでのキーワードを参考に、今後詳しい記事を書いていきたいと思います。

## オープニング：ブロックチェーンプラットフォームの進化（石井敦氏｜クーガー）
代表的な3つのブロックチェーンプラットフォームの簡単な紹介、課題とニーズ、そして次世代ブロックチェーン関連技術の紹介。
### Bitcoin
・パブリック型
　→ 取引の承認を行うのは全てのノードやマイナー。ノードやマイナーには誰でもなれる。
・２種類のユーザがいる
　→ エンドユーザとマイナー
### Ethereum
・パブリック型、プライベート型
　→ パブリック型メインだが、どちらにも対応を目指している
・通貨以外の汎用用途も見据えたブロックチェーン
・Enterprise Ethereum
　→ 企業向けブロックチェーン
### Hyperledger Fabric
・プライベート型、コンソーシアム型
・主導開発元は米ＩＢＭ
・日本企業が積極的に導入
### 共通的な課題とニーズ
・スピード
　→ トランザクションの処理スピード、リアルタイム化
・スケール
　→ データ規模、ユーザ規模の拡大とスピードの両立
・データの保存と機密性
　→ On-Chain、Off-Chain、ポリシーやセキュリティ
### 次世代ブロックチェーン関連技術
・IOTA
・BigchainDB

## Lightning Network入門（光田貴氏｜Coincheck）
[スライドはこちら](https://www.slideshare.net/blockchainexe/exe6-lightning-network)
### Lightning Network
送金が一瞬。ただし「決済完了性」を少し犠牲にする。
性能の限界の克服を目指す。

### 性能の限界を克服する２つのアプローチ
ブロックサイズを拡大する（ビッグブロック）
ブロックに記録するデータ量を節約する（スモールブロック）→ Lightning Networkはこちらの思想

### Payment Channel
Lightning Networkの送金の基礎技術
チャンネルを２者間で開設、チャンネルを閉じるまでトランザクションをネットワークに流さない
課題はプライバシーとルーティング

## Hyperledger Fabric活用によるデータ流通ネットワーク（今井悟史氏｜富士通研究所）
[スライドはこちら](https://www.slideshare.net/blockchainexe/exe-6hyperledger-fabric)
・処理とデータが分離
・Virtual Private digital eXchange（VPX）
　→ スマートコントラクトを分散環境におけるネットワークアクセス制御とP2P通信制御に応用
・ユースケースの紹介
　→ IoTデータ取引、セキュアファイル共有、APIによるデータ流通

## Development Tools & Technologies in Ethereum（西村祥一氏｜Comps ITL & Pte. Ltd. CEO）
[スライドはこちら](https://www.slideshare.net/blockchainexe/development-tools-technologies-in-ethereum)
### サービスの提供に必要な（もしくは用意するとよい）ツールや技術の紹介
Geth/Parity/Testrpc/Browser-solidity（IDE）/Etherscan.io/Web3.js/Metamask/MyEtherWallet/ENS/IPFS/Swarm/Oraclize/ERC20（規格）/HD Wallet（BIP32）/Zeppelin/Tachyon Wallet（開発中）

## 登壇者によるディスカッション
### ブロックチェーンの課題は？
ブロックサイズ、ノード数　→　スケール
トランザクションの処理速度　→　スピード
KYC（Know Your Customer）
バージョンアップ　→　大幅なバージョンアップがあると追随が大変
On/Off-Chain　→　スケールやスピードの課題を解決するには全てOn-Chainは厳しいのでは


う〜む、勉強することがいっぱいだ。。。
プログラム超初心者メモ　変数名

変数名について

まず、結論・・・
とりあえずは、柔軟に使う。ルールはルールと割り切って使いながら考える。
熟練者目線ではおそらく間違っていると思うが、とりあえず自分が楽しく学ぶために・・・。

　●必要に応じてプリフィックス、その後にアンダースコア（視認性重視）
　●大文字からの変数名、以後単語毎に先頭を大文字
　●ナンバリングの前などにアンダースコア（視認性重視、やはりフォントを選んでも、
　 0とoO、１とlIijJ、などは連続すると読みにくい。）
　●ナンバリングは基本0スタート。
　●ローカル変数は先頭は小文字でいいと思う。（キャメル式。）

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

個人的な理由（自分の作業環境前提）
Unityのインスペクターでは変数名の先頭は常に大文字のため、
先頭の文字は大文字を使いたいと思う。故にむしろローカル変数は小文字でいいと思う。

型別で変数名が同じ方が分かりやすい場合はあリ、それがローカル変数に
止まらない場合もあるので、プリフィックスは使えた方が便利だと思う。
（というか変数名であまり悩みたく無いので割り切る。）

一単語毎にアンダースコアを付ける必要は
視認性を考えると必要では無いが、
全く使わないよりは使った方が見やすい場合が少なく無い。
＆やハイフンなどが変数名に使えたら状況は少し変わるのかも？でも使えないし。

ナンバリングされた変数名に関しては、0から始めて連番にするのを基本にしたい。
for文で利用する際に、間違いにくいのが利点。
しかし、一つしか無いものに0を付けるのもややこしいので、
割り切って変数名は必要に応じて変える方が良いように思う。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
メジャーな書式
　●camelCase      = playerName,enemyPower
　●Pascal         = PlayerName,EnemyPower
　●アンダースコア    = player_name,enemy_power
　　これらを混ぜないのが基本のようです。

プリフィックス　
　●型表現
　　つけない、つける必要がない・・・諸々意見もありますが、
　　型変換を行う際などに、変数名が被ることから付ける場合もあるようです。
　　単純な型の確認の役目としては、エディタの機能が向上したことから、
　　マウスポインタを被せると情報が出るなどの利便性に助けられて、
　　必要性はあまり無くなっているようです。（昔はあったのでしょうね？）
　●定数、メンバー変数
　　c,m を先頭につけるという作法があるようです。
　　c_,m_ とアンダースコアを使う場合もあるようです。
Twitterのような画像をフリックすると画面を閉じれるライブラリを作った - FlingLayout


## 今回の成果物
### FlingLayout
https://github.com/chuross/flinglayout

![31901843-b1bdb554-b85d-11e7-9ae4-cc49b3a161b2.gif](https://qiita-image-store.s3.amazonaws.com/0/20629/0e7cdaa6-6f9e-2bf6-bfb2-24a906c29bbb.gif)

## 特徴
Twitterの画像とこで使われてるように、上下にフリック操作すると画面を閉じれる挙動をレイアウトに内包するだけで実現できる。

## 導入
1. jitpackをrepositoryに追加する

```
repositories {
    maven { url "https://jitpack.io" }
}
```

2. dependenciesにライブラリを追加する [![](https://jitpack.io/v/chuross/flinglayout.svg)](https://jitpack.io/#chuross/flinglayout)

```
dependencies {
    compile 'com.github.chuross:flinglayout:x.x.x'
}
```

## 使い方
サンプルプロジェクトでは[PhotoView](https://github.com/chrisbanes/PhotoView)を使って実現している。

具体的にどう使えばTwitterみたいにできるんじゃみたいなの知りたい場合はここ見てね

https://github.com/chuross/flinglayout/tree/master/app

### XMLにレイアウトを記述する
これだけで挙動自体は完成
内包できるViewは1つだけなので注意

```
<com.github.chuross.flinglayout.FlingLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <!-- something view parent -->

</com.github.chuross.flinglayout.FlingLayout>
```

### ドラッグ操作を制御する
FlingLatoutにドラッグを無効にするフラグを用意しているので適宜セットする

```
val flingLayout = findViewById<FlingLayout>(R.id.flinglayout)
flingLayout.isDragEnabled = false
```

サンプルプロジェクトではPhotoViewのスケールを見てフラグを必要に応じてセットしている。(拡大時はFlingLayoutはドラッグ操作を受け付けないようにしている)

### Dismissのリスナーを拾って画面を閉じる
いつものDismiss用のリスナーセットできるようにしてあるので、それを使えばおｋ

```
val flingLayout = findViewById<FlingLayout>(R.id.flinglayout)
flingLayout.dismissListener = { /** something your code **/ }
```

## XML属性一覧
| key | type | description | etc |
| --- | --- | --- | --- |
| fl_isDragEnabled | boolean | ドラッグの有効 / 無効 |  |
| fl_isDismissEnabled | boolean | Dismissの有効 / 無効 | 無効にした場合はスワイプしても元の位置に戻る |

## ライセンス
```
Copyright 2017 chuross

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
```

## あとがき
内部的にはViewDragHelperを使用しているので、実装はいたってシンプルに作れた。

需要はありそうな気がしてたけど、ざっと検索した感じ引っかからなかったり、メンテされてなくてビルドできなかったりしてたので自分で作った。
arduinoのコマンドラインビルドツール 👉 leo

# leo とは？
ざっくりまとめると、次の３点となります。

* Arduinoのコマンドラインビルドツール
* node.js を使ってる
* [Ino](http://inotool.org/)(python) にインスピレーションを得ている

詳しいことは、[makewitharduino/leo](https://github.com/makewitharduino/leo)をどうぞ。

# なぜ、leo？

理由は、

* `Arduino IDE` をうまく活用している
* `node.js` で動くツール

だからです。

正直、上記の点が不要なら、今だと[PlatformIO](http://platformio.org/)一択だと思います。あと、Arduino IDEにも標準のCLIツールもあるけど、正直コマンド叩くとアプリが起動するので好きじゃないです。

# leoの概要
できることは少ないです。
ただ、その分さくっと使えます。

## インストール

>$ npm install -g leo

## コマンド
プロジェクトを作って、ビルドして、Arduinoに書き込み、コンソール表示まで一気にできます。

```
leo new Blink
cd Blink
leo build -b uno
leo upload -b uno -p /dev/tty.usbmodem1141
leo console -p /dev/tty.usbmodem1141 -b 9600
```

## ビルドについて
leoは、ビルドツールです。

これに対して、例えば、[avrgirl-arduino](https://github.com/noopkat/avrgirl-arduino)は結構有名なnode.jsのコマンドラインツールですが、あくまで `Arduino IDE` でビルドされたhexファイルを書き込めるものです。
とても惜しい。

他に、node.jsでビルドして書き込めるツールがあれば、ぜひ教えてください。

### leoの仕組み
leoは、ビルド実行時に、`Arduino IDE` から `/java/hardware/arduino/avr/cores/arduino/` フォルダをごっそり `.build` フォルダにコピーしてきて、 [Build Process](https://github.com/arduino/Arduino/wiki/Build-Process) のプロセスを内部で実行しているようです。

この部分が、`Arduino IDE` をうまく活用していると感じた点です。（前述の `ino` がこの仕組み）

# leoの現状
実は、開発元の[AdamMagaluk/leo](https://github.com/AdamMagaluk/leo)は２年前に開発が停止してます。
このため、最新のArduino IDE v1.5系までしか対応してませんでした。（今は、v1.8系）

これでは使えないため、 [makewitharduino/leo](https://github.com/makewitharduino/leo)で、最新のVersionに対応させました [^1]。

[^1]: 動作確認がMacのみなので、ぜひWindowsで確認してもらえると助かります。

なお、Versionによって何が違うかというと、Version毎にIDEで参照するフォルダ位置が若干変更になっているようです。

このバージョンの違いを吸収しているところが、[makewitharduino/leo-platform-arduino](https://github.com/makewitharduino/leo-platform-arduino) になります。

## 追加コマンド
アップデートついでに、ライブラリを追加するコマンドも実装してみました。
例えば、下記のコマンドでライブラリをダウンロードしてきて、Arduinoに追加できます。

>$ leo library https://github.com/arduino-libraries/LiquidCrystal/archive/1.0.7.zip 

# leoの今後
正直、leoは今あるツールなどと比べると、できることは極端に少ないです。
ただ、node.jsで動くことが利点なので、そこをうまく活用できるといいかなと思ってます。
せっかくなので、活用できそうな事例があれば、ぜひ使ってみて下さい。
Karabiner-Elementsでenthumble(Windows App)のような操作を実現する方法

# 経緯

Windowsにはenthumbleというキーボード快適化ソフトがあります。

ソフトの紹介 [enthumble Readme 【説明書】 - Qiita](https://qiita.com/mhara/items/d2d072592a4db9243c99) より引用

> 使用頻度の高いキー操作を手もとで行えるようにする、簡単設定のカスタマイズソフト
> Windows用フリーソフト | インストール不要 | 商用利用可 | 有料版はキーカスタマイズ可能
> enthumbleは、無変換キーを押している間だけ、キーボードの機能が変化します。面倒な設定なしに、ソフトを起動するだけで効果を発揮します。

上記のとおり、Windowsではほとんど使わない"無変換キー"を押している間だけ、一部のキーにカーソルキーに役割を持たせたり、またはBackSpaceの機能を持たせたりするというソフトで、一度使うと手放せなくなるソフトです。ただ、Windows版しかないためMacでは使えません。Karabiner-Elementsの前身のKarabinerには、最初からenthumbleの動作を実現するための設定が用意されるほどで、WindowsとMacを使う人にとっては需要が高い設定だったと思われます。しかし、Karabiner-Elementsでは設定が用意されていないため、作ることとしました。この設定を使えば、macOS Sierraでもenthumbleライクなキーバイドを利用することができます。


# 実装した機能

enthumbleには、基本的な使い方として以下のようなキー変換があります。 [^1] これらの設定のうち、"「←, ↓, ↑, →」入力"以外は、Karabiner-Elementsの前身のKarabinerでも提供されていました。

[^1]: 設定ファイルを見れば、"無変換/英数 + 数字 -> Functionキー"のような設定なども多数あるのですが、ReadMeなどで紹介されているものはこれだけです。

| 押したキー                           | 変換後のキー                       |
|--------------------------------------|------------------------------------|
| 無変換/英数 + I, J, K, L             | 矢印キー（←, ↓, ↑, →）             |
| 無変換/英数 + A, S, W, D             | 矢印キー（←, ↓, ↑, →）             |
| 無変換/英数 + B, N, P, F             | 矢印キー（←, ↓, ↑, →）             |
| 無変換/英数 + H, J, K, L             | 矢印キー（←, ↓, ↑, →）             |
| 無変換/英数 + Space/かな             | Enter/Escape                       |
| 無変換/英数 + N, M                   | BackSpace                          |
| 無変換/英数 + ',' '.'                | Delete                             |
| 無変換/英数 + Y, U                   | BackSpace                          |
| 無変換/英数 + I, O                   | Delete                             |
| 無変換/英数 + 矢印キー（←, ↓, ↑, →） | 「←, ↓, ↑, →」入力(2017/11/25追加) |

これらのキー変換は、Shift・Controlと組み合わせても動作する、言い換えれば、`無変換/英数 + shift + H`を押すと`shift + 左矢印`に変換されるのですが、この動作も実現させる必要がありました。

# 実装時の工夫点

ひとまず、Karabinerが最初から用意していた設定を実現するため、以下のとおりキー変換を実装しました。また、Windows版のenthumbleで最初から使えるようになっている「thumbIME」という設定もついでに実装しました。
`from` -> `key_code` -> `modifiers` -> `optional` に`any`を設定することで、ShiftやControlを一緒に押した際にそのキーが変換後のキーに引き継がれるようにしました。
つまり、"Shift + 無変換/英数 + H, J, K, L -> Shift + 矢印キー（←, ↓, ↑, →）"という動作を実現しました。
また、「←, ↓, ↑, →」の入力については、Karabiner-Elementsに文字入力の機能はないため、代わりにシェルコマンドを実行する機能を使い、`AppleScript`を実行することで対応しました。具体的には、押した矢印キーに対応する「←, ↓, ↑, →」の文字をクリップボードにコピーし、それを貼り付けする方法で対応しました。

```json
"to": [
  { "shell_command": "osascript -e 'set the clipboard to \"←\"'" },
  { "shell_command": "osascript -e 'tell application \"System Events\" to keystroke \"v\" using command down'" }
]
```

## 実際のコード

設定に必要なコードは900行以上ありますので、実際のコードを見たい方は、下のリンクからGitHubにある設定ファイルを開いて確認してください。
また、下にあるもう一つのリンクから、設定済みのルールをインポートすることができるページへアクセスできます。設定をインポートするには、"enthumble(Windows App) mode"の右にある"import"ボタンをクリックしてください。インポートした後は、Karabiner-Elementsの設定画面からルールを有効にしてください。

設定ファイル（JSONファイル）：[KE-complex_modifications/blob/master/docs/json/enthumble_mode.json](https://github.com/s-show/KE-complex_modifications/blob/master/docs/json/enthumble_mode.json)
設定のインポートページ：[Karabiner-Elements complex_modifications rules by s-show](https://s-show.github.io/KE-complex_modifications/)
nodist をつかってみる

Node のバージョンがそろそろいろんなのを使わないといけなくなったので、まず　Windowsで、バージョン管理を実施してみることにした。
Windowsだと

* [WindowsでNode.jsのバージョンを管理する](https://ystklog.com/390)

がよさげ。Mac も使うことになりそうだが、これはWindows 用っぽい。しかし、コマンドが簡単なのでこれにしておく。

# コマンド

## 使えるバージョン

```
nodist dist
```

## 使いたいバージョンをダウンロード

```
nodist add 6.10.3
```

ちなみに、add のかわりに `+`, `-` が使えるもよう。

## 現在つかえるnodeの一覧

```
nodist list
```

## バージョン切り替え

```
nodist 6.10.3
```

ただし、バージョンを切り替えた後は

```
npm rebuild
```

をするのが良いらしい。

* [nodist](https://github.com/marcelklehr/nodist)

# はまったところ

最初グローバルインストールがうまくいかなかった。勘違いかもですが。一旦 git bash をあげなおしたらいけた。
また、コマンドの引数もかわっているかも。

```
npm install
npm install typings@2.1.0  --global-style
npm install typescript@2.1.5 --global-style
npm install tfx-cli@v0.3.45  --global-style
``` 
をやろうとしたけどうまく入らなかった。

```
npm install --global typescript@2.1.5
```
とかならうまくいった。ちなみに、`--global-style` オプションは、パッケージをローカルの`node_modules` にいれるためのものらしい。
よくみたら、~ に `node_modules` が出来ていた。意味をちゃんとわかってやらんとね。

* [npm-install](https://docs.npmjs.com/cli/install)
kerasで学習が再現できない人へ

「kerasの学習が再現できない!」という時の解決法を書きます!
実行環境は下記の通りです。

- python3.6.1
- Keras==2.0.9
- tensorflow==1.4.0

## 導入(飛ばしていいけど読んでほしい!)
簡単なモデルを作る時にkerasを使いがちな自分ですが、今回研究でマルチレイヤーパーセプトロンを組んだ時に「学習の再現ができない!」という状態でしばらく格闘しました。
その時に発見した解決法を伝授いたします。

ちなみにブログ書くのは人生2回目の未熟者なのでお手柔らかに。。。
([1回目はこちらのkaggleの記事です!](http://kysmo.hatenablog.jp/entry/2017/11/07/124156))
読み飛ばさないでほしいというのは、1回目のブログとかも読んで欲しかったからです。。。笑

## ダメだった例
```py
import numpy as np
import tensorflow as tf

np.random.seed(7)
tf.set_random_seed(7)
```
これでnumpyとtensorflowの乱数シードは固定していたのですが学習過程でずれが出てしまい、再現性が担保できませんでした。

## 結論(もう!?)
```py
import os
import numpy as np
import random as rn
import tensorflow as tf

os.environ['PYTHONHASHSEED'] = '0'
np.random.seed(7)
rn.seed(7)

session_conf = tf.ConfigProto(
    intra_op_parallelism_threads=1,
    inter_op_parallelism_threads=1
)

from keras import backend as K

tf.set_random_seed(7)
sess = tf.Session(graph=tf.get_default_graph(), config=session_conf)
K.set_session(sess)
```
これ書いておけば再現性担保できました!
調べていた中でもnp.random.seedだけの記述も多かったんですが、それだけだと微妙に学習過程でずれが出ちゃいましたね。
PYTHONHASHSEEDでpythonの乱数固定して、random関数のシードも固定して、sessionも定義してようやくありつけました。
いらない部分もあるかもなので、コメントいただけるとありがたいです。

## まとめ
今回はすごく短いですが、困っている人の助けになればなと思います。
近々othlo techという名古屋の学生クリエイティブ団体のAdvent Calendarでブログを書くことになると思うので、その時によろしくです！
また見てください〜
supersetの表示期間で未来を指定する方法

#前提
 - supersetはairbnb製のOSSの可視化ツールです
 - supersetについては[こちら](https://qiita.com/momota10/items/ee774188f770555238)をご確認ください

#問題
 - ビジネスロジック上**未来**のデータを可視化する必要があった
 - しかし、普通に作業をするとsupersetでは**現時点**までのデータしか可視化してくれない
 - untileの項目がデフォルトでは**now**になる

![スクリーンショット 2017-11-23 23.11.45.png](https://qiita-image-store.s3.amazonaws.com/0/45434/346dd60f-9ecf-da8e-05c5-bb0b728f4895.png)


#解決方法
 - Timeを設定するエリアのUntileの項目を**1year later**に書き換えるだけ

![スクリーンショット 2017-11-23 23.12.53.png](https://qiita-image-store.s3.amazonaws.com/0/45434/72c56a6e-22f3-2e2d-c7bd-899b9871716f.png)


#余談
 - 選択式の項目を直に書き込んで良いとは、、、、
C3.jsのline-chartをiOSで使ったら重かった(解決済み)

C3.jsというチャート描画ライブラリのline-chartについての記事です。

##C3.jsとは
[C3.js](http://c3js.org)はjavascriptでチャートを作成できるライブラリです。色々なチャートを描画することが出来るので大変便利です。今回はこの中のline-chartについてです。


##現象
C3.jsのline-chartをつかって300point位のデータを20本並べたline-chartを描くWebPageを作成していました。再現プログラムを切り出したので、下のサンプルプログラムのデータは乱数で生成しています。
<img width="1310" alt="c3-graph.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/159374/a3ca2683-96de-34a3-af88-f98dcd616700.jpeg">

MacのSafariやChromeでは問題なく動いていたのですが、同じページをiOSの端末からアクセスすると異常に動作が遅く、たまに落ちてしまう現象が発生しました。
最初はデータの転送量が多くて中々反応していないのかと考えたり、iOSのjavascriptで扱うにはデータが多すぎるのかと考えていたのですが、どうも違ったようです。


```html:c3-sample.html
<!doctype html>
<html lang="ja">
  <head>
    <meta charset="utf-8" />
    <link href="https://cdnjs.cloudflare.com/ajax/libs/c3/0.4.18/c3.min.css" rel="stylesheet">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.17/d3.min.js" charset="utf-8"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/c3/0.4.18/c3.min.js"></script>
  </head>

  <body>
    <div id="chart"></div>
  </body>

  <script>
    const chartObj = {
      bindto: '#chart',
      size: { width: 1280, height: 600 },
      point: { show: false },
      tooltip: { show: false },
      data: {
        columns: [],
      },
    };
    for(let i = 0; i < 20; i++) {
      chartObj.data.columns[i] = ['data' + i];
      for(let j = 0; j < 300; j++) {
        let d = Math.random() * 100;
        if(j == 0) {
          chartObj.data.columns[i].push(d);
        } else {
          d = chartObj.data.columns[i][j] + (d / 10 - 5);
          if(d < 0) d = 0;
          if(d > 100) d = 100;
          chartObj.data.columns[i].push(d);
        }
      }
    }
    c3.generate(chartObj);
  </script>
</html>
```

##問題点
Safariのinspectorで中身を見てみたところ、c3.jsのチャートはsvgで描画されているようですので更にその中を見ていくと
`<g class="c3-chart-lines">`の下に
`<g class="c3-chart-line c3-target c3-target-data0">`から順に20本のlineがあります。
更にその中を見てみると
`<g class=" c3-shapes c3-shapes-data0 c3-lines c3-lines-data0">`があり、こちらがline-chartの線を引いているデータです。
ここまでは全く問題ありません。
この次に出てくるのが
`<g class=" c3-shapes c3-shapes-data0 c3-circles c3-circles-data0" style="cursor: pointer;">`
なのですが、中身は
`<circle class="c3-shape c3-shape-0 c3-circle c3-circle-0" r="2.5" cx="13" cy="467.5179823348915" style="fill: rgb(31, 119, 180); opacity: 0;">`がline-chartのポイントの分全て存在しています。
20x300=6000個のcircleを描画しているので重たいようでした。
勿論そんなにline-chartにpointを表示させると画面がbusyなので消す設定にしているのですが、`point: { show: false },`がどこに効いているかというと`opacity: 0;`の部分みたいです。

##解決策
結局のところ、画像などに比べてデータの量としては問題になる大きさではないのでcircleを描画させなければいいと考えて、下記のstyleをcssに追加しました。

```
.c3-circles {
  display: none;
}
```
これでグラフのスクロールや描画がサクサクと動くようになりました。
【vim-go】便利なコマンド一覧

# 参考

[公式vim-goドキュメント](https://github.com/fatih/vim-go/blob/master/doc/vim-go.txt)

# 一覧

個人的によく使うものを、よく使う順にまとめます。

|キー|内容|
|-------|---|
|gd|定義元にジャンプ(Ctrl-oで元のファイルへ戻る)|
|Ctrl-x Ctrl-o|カーソル下のコード補完|
|:GoFmt|go fmt実行(:wで保存時にも実行される)|
|:GoErrCheck|現在のpackage内でエラーチェック|
|:GoImports|足りないpackageを追加、不要packageを削除|
|:GoRename [to]|カーソル下にある識別子を[to]で指定した名前に一括変更|
|:GoDoc [word]|[word]のドキュメントを新たなウィンドウで開く。デフォルトの[word]はカーソル下|
|:GoDocBrowser [word]|上記GoDocをブラウザで表示|
|:GoImplements|カーソル下の構造体やインターフェイスのリレーションを表示|
|:GoFillStruct|カーソル下の構造体にデフォルト値を与える|

# エイリアスをつけよう

コマンドが長いので、エイリアスを設定しましょう。
.vimrcに以下のように記述します。
エイリアスの最初の文字は大文字でないと怒られます。

```vim:.vimrc
" :command <エイリアス> <元のコマンド>
:command Ge GoErrCheck
:command Gii GoImports
.
.
.
```
神保町シアターをチェックする！

小学館が経営している神保町シアターでは、いわゆる名画座的なラインアップを定期的に上映している。何度か見逃してしまった。
そこで、DVDやBlu-rayになっていないもう一度みたい映画を、定期的にチェックすることにした。
C#でWebブラウザを使って、タイマーでチェックする。
映画のタイトルを設定しておくと、そのタイトルを上映するときに警告してくれる。

```
namespace Movie
{
	public class CheckTheater
	{
		private void 神保町シアター(string movietitle)
		{
			if (webBrowser.Url.ToString().Contains("/program/"))
			{
				checktitle(movietitle);
				return;
			}

			HtmlElementCollection links = webBrowser.Document.Links;
			foreach (HtmlElement link in links)
			{
				string href = link.GetAttribute("href");
				if (href.Contains("/program/"))
				{
					webBrowser.Navigate(href);
					break;
				}
			}
		}

		private void checktitle(string movietitle)
		{
			HtmlElementCollection links = webBrowser.Document.Links;
			foreach (HtmlElement link in links)
			{
				string href = link.GetAttribute("href");
				if (link.InnerText.Contains(movietitle))
				{
					MessageBox.Show(movietitle);
					break;
				}
			}
		}
	}
}
```
bytes→str→dict


python3 で b"" になってるやつ
astは標準なのでimport文書くだけ


## 文字列型
```python
text = bytes.decode('utf-8')

print(text)
print(type(text))
```

### 出力
```bash
"{'x':1,'y':2}"
<class 'str'>
```


## バイト型
```python
text_bytes = text.encode('utf-8')

print(text_bytes)
print(type(text_bytes))
```

### 出力
```bash
b"{'x':1,'y':2}"
<class 'bytes'>
```

## 辞書型
```python
import ast

text_dic = ast.literal_eval(text)
print(text_dic)
print(type(text_dic))
```

### 出力
```bash
{'x': 1, 'y': 2}
<class 'dict'>
```


これで触れる。
48行で Login して User とる

謎にハマってしまって結構調べた。。。次に何かのネタに。。。

```java
package com.example;

import java.net.URI;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso;
import org.springframework.boot.autoconfigure.security.oauth2.resource.PrincipalExtractor;
import org.springframework.context.annotation.Bean;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import com.fasterxml.jackson.databind.ObjectMapper;

import lombok.Value;
import lombok.extern.slf4j.Slf4j;

@SpringBootApplication
@EnableOAuth2Sso
@RestController
@Slf4j
public class LineLoginApplication {
    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

    public static void main(final String... args) throws Exception {
        SpringApplication.run(LineLoginApplication.class, args);
    }

    @Value
    public static class LineUser {
        String displayName;
        String userId;
        URI pictureUrl;
        String statusMessage;
    }

    @Bean
    public PrincipalExtractor principalExtractor() {
        return map -> OBJECT_MAPPER.convertValue(map, LineUser.class);
    }

    @GetMapping("/")
    public Object whoami(
            @AuthenticationPrincipal final LineUser lineUser) {
        return lineUser;
    }
}
```
Windows上でNode.jsを実行してHello worldをブラウザに表示する方法

Windows上でNode.jsを実行する方法を以下に記載する。
なお、Windows上では、インストールを行わない実行ファイルを利用して稼働させることとする。

#1.Node.jsサイトへアクセスする。
[https://nodejs.org/ja/](https://nodejs.org/ja/)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204260/7dc73304-26dd-24c0-fb45-4e668e539184.png)

#2.どちらかの「他のバージョン」を押下する。
※ ボタンを押して先のファイルは、インストーラーファイルがダウンロードされてしまう。

#3.「Windows Binary(.zip)」の「64-bit」を押下する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204260/853573c1-7c55-7db4-1495-a2dceb3ec804.png)

#4.適当なフォルダにダウンロードして解凍する。
※ 以下の画像は参考画像の為、このフォルダを作成する必要はない。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204260/5df1c53d-443b-321a-d087-e01e038e551e.png)

#5.適当なフォルダにjsファイルを作成する。
※ 以下の画像は参考画像の為、このフォルダに作成する必要はない。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204260/7b7b0eca-6dd9-441c-b4d1-116399421402.png)

#6.jsを以下の通り記述して保存する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204260/977a00ac-4bb7-0011-8679-596be587c823.png)
```コマンド
const http = require('http');
const PORT = 90;
http.createServer((request, response) => {
  response.writeHead(200, {'Content-Type': 'text/plain'});
  response.end('Hello World!\nThis site is created in Node.js.');
}).listen(PORT);
console.log(`Server running at http://localhost:${PORT}/`);
```

#7.コマンドプロンプトを起動して以下の様にコマンドを発行する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204260/d585d4af-0876-bc2c-66e1-2b28b3b933d4.png)
<details><summary>Text</summary>
C:\000_MySpace\003_liferay_server_only\node-v6.11.2-win-x64\node.exe C:\tmp\example.js
</details>

#8.セキュリティダイアログが表示された場合は、「アクセスを許可する」を押下する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204260/f2124698-5097-8900-a60a-8697225ee7f1.png)

#9.js内にアクセス用URLを定義した為、URLを表示される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204260/ad82ee67-2bea-b2d0-d53e-68a8d4f36789.png)

#10.URLにアクセスして表示されるか確認する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204260/5598e2a1-0e5f-a521-2786-d2ccbbf080c7.png)
ServiceWorkerを触ってみる

https://dev.to/mizchi/-devto--b5
の記事を読んでServiceWorkerってどんな仕組みなんだろうということが気になって調べてみました。

https://developers.google.com/web/fundamentals/primers/service-workers/?
によると
- domは触れない
- ネットワークプロキシ的なことがコードで書ける

らしいです。なのでAPIのレスポンスをネットワークアクセスなしにキャッシュしたりできると。
ほぼ参考文献ままですがコード書いてみました。

```html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
  </head>
  <body>
    <h1>sw test</h1>

    <input id="url" type="text" name="" value="">
    <button id="add" type="button" name="button">add</button>
    <div id="list">
    </div>
    <script type="text/javascript">
    if ("serviceWorker" in navigator) {
      navigator.serviceWorker.register("/sw.js").then(function(registration) {
        console.log("success", registration.scope);
      }).catch(function(err) {
        console.log("error", err);
      });
    }

    var addBtn = document.querySelector("#add");
    addBtn.addEventListener("click", function() {
      var url = document.querySelector("#url").value;
      fetch("/resp/"+url)
      .then(function(resp) {
        return resp.json();
      })
      .then(function(data) {
        html = "";
        data.list.forEach(function(item) {
          html += "<p>"+item.name+"</p>";
        });
        document.querySelector("#list").innerHTML = html;
      });
    });
    </script>
  </body>
</html>
```
```sw.js
var CACHE_NAME = "my-site-cache-v1";

self.addEventListener("fetch", function(event) {
  event.respondWith(
    caches.open(CACHE_NAME).then(function(cache) {
      return cache.match(event.request).then(function(resp) {
        if(resp) {
          return resp;
        }
        return fetch(event.request.clone()).then(function(resp) {
          if (resp.status<400 && (resp.url.indexOf("a.json")>=0)) {
            cache.put(event.request, resp.clone());
          }
          return resp;
        });
      });
    })
  );
});

```
respディレクトリ以下に以下の形式のjsonをモックとして置く

```a.json
{
  "list": [
    {"name": "a1"},
    {"name": "a2"}
  ]
}

```

1. `navigator.serviceWorker.register` でserviceWorkerの登録ができます。すでに登録されている場合はそれが使われる
2. `CACHE_NAME`の値をキーにしてAPIのレスポンスをキャッシュする。キャッシュする条件はレスポンスオブジェクトから好きに設定できる(今回の場合はa.jsonはしかキャッシュしないようにした
3. API呼び出し側はキャッシュされているかどうかは気にせずレスポンスを使えばいい。なので、serviceWorkerが使えない場合でも正常に動く

上記を試したときのchrome devtoolのnetwork
![image.png](https://qiita-image-store.s3.amazonaws.com/0/20986/a8e7ccd0-4f1b-147a-f5d2-f7ef8b382745.png)

枠で囲った部分が1リクエストあたりに表示される。a.jsonを取得するときには二回目以降は「from ServiceWorker」となっているが、b.jsonはsw.jsが取得してきたものが渡されている。sw.jsがAPIを呼び出すログも出力されているのでキャッシュされているかどうかを判断ここで判断できる(はず)。


## 参考文献
- https://developers.google.com/web/fundamentals/primers/service-workers/?
- https://developer.mozilla.org/ja/docs/Web/API/ServiceWorker_API/Using_Service_Workers
- https://github.com/GoogleChrome/samples/tree/gh-pages/service-worker/selective-caching