OmniAICreator/Qiita-1.07M huggingface dataset:
Trelloとカレンダー(Google, 標準アプリ)によるテンション上がるタスク管理術

## About
長い間効率のよく、テンションの上がるタスク管理を探してきました。
ようやく見つけた気がします。
簡単にいうと、Trelloでtodoを作り、Google, apple標準カレンダーに同期するだけです。

### 大事なこと
- タスク管理自体を簡単にする
- 達成感を得る == テンションあがる
- todoとdoneの可視化
- 期日を忘れない


### 使うツール群
- Trello
- Google calendar
- Mac, iPhone の標準 カレンダーアプリ

## How to

1. まず、Trello にログイン、ボードを作る。
2. todo, on_going, done などで分けると良いかも
3. カードを作る。
3. due dateを設定する。
4. Menu -> Power-ups -> Calendar をenabled にする。
5. iCal を取得。
6. Googleカレンダーを開く。
7. url からカレンダーをインポート。
8. 以下のサイトでインポートしたカレンダーにチェックを入れる。
    8. https://calendar.google.com/calendar/syncselect
9. 完了！

### もっと
Trelloでdoneに入れたときに自動でカレンダーから削除してくれればいいのに。
Android Contributors (AOSP) のJavaコードスタイルをAndroid Studioに設定する

[Code Style for Contributors](https://source.android.com/source/code-style) でAndroid Open Source Project (AOSP) のJavaコードスタイルが説明されていますが、AOSPからAndroid Studio (IntelliJ) 用の設定ファイルも公開されていることはご存知でしょうか？この設定ファイルをAndroid Studioに設定すれば、Android Studioが、このコードスタイルでコードをフォーマットしてくれるようになります。

# コードスタイルの設定ファイル

[platform/development](https://github.com/android/platform_development) リポジトリの [ide/intellij/codestyles/AndroidStyle.xml](https://github.com/android/platform_development/blob/master/ide/intellij/codestyles/AndroidStyle.xml) に存在しています。

# Android Studioへの設定方法

Android Studioは、コードスタイル設定ファイルをGUIからインポートする手段を提供していません。設定ファイルをAndroid Studioのコンフィグディレクトリ内に手動で配置する必要があります。

1. `AndroidStyle.xml` を、Android Studioのコンフィグディレクトリにコピーする
    - コンフィグディレクトリはAndroid Studioのバージョンごとに分かれているので注意してください
    - Windowsの場合: `%userprofile%\.AndroidStudio*\config\codestyles`
        - 例: `C:\Users\<ユーザー名>\.AndroidStudio2.3\config\codestyles`
    - macOSの場合: `$HOME/Library/Preferences/AndroidStudio*/config/codestyle`
        - 例: `/Users/<ユーザー名>/Library/Preferences/AndroidStudio2.3/codestyles`
2. Android Studioを再起動する
3. Android Studioの設定画面で、"Editor" - "Code Style" の "Scheme" で "AndroidStyle" を選択する

![Screen Shot 2017-04-16 at 13.30.26.png](https://qiita-image-store.s3.amazonaws.com/0/80557/b72512ad-a478-3c36-2156-fe775a4cee2c.png)

# おまけ: Eclipseが現役の方は

同リポジトリの [ide/eclipse](https://github.com/android/platform_development/tree/master/ide/eclipse) ディレクトリに以下のファイルが存在しているので、これらをEclipseの設定画面からインポートすれば、いい感じにAOSPコードスタイルに従えるようになります。

- コードフォーマッターの定義ファイル: [android-formatting.xml](https://github.com/android/platform_development/blob/master/ide/eclipse/android-formatting.xml)
- インポート文の順序の定義ファイル: [android.importorder](https://github.com/android/platform_development/blob/master/ide/eclipse/android.importorder)
RubyMineでVagrantのRailsをリモートデバッグする

Vagrantで作ったrailsの環境をRubyMineに設定することで、RubyMineからrails serverを実行したり、デバッグのステップ実行ができたりします。仕組みとしてはRubyMineからリモート環境にSSH接続して、リモート環境のインタープリタを使用します。

# 前提
- rbenvを使っています。
- ポートフォワーディングを下記のように設定している状態です。

```
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/xenial64"
  config.vm.network "forwarded_port", guest: 80, host: 9080, host_ip: "127.0.0.1"
  config.vm.network "forwarded_port", guest: 3000, host: 9030, host_ip: "127.0.0.1"
end
```

# リモート環境へのSSH接続に関する設定

## VagrantのSSHログイン情報の確認

下記でSSHログインに必要な情報が表示されます。

```
$ vagrant ssh-config
Host default
  HostName 127.0.0.1
  User ubuntu
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile C:/Users/endoy/vagrant/ubuntu/default/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL
```

## Deploymentの設定

### Connection

File > Settings > Build, Execution, Deployment > Deployment > Connection

+ボタンで追加し、上記で確認した情報を入力します。

![rubymine1.png](https://qiita-image-store.s3.amazonaws.com/0/147049/d663b2dc-87e4-2cd5-eeaa-1626e0475f27.png)

### Mappings

File > Settings > Build, Execution, Deployment > Deployment > Mappings

![rubymine1_2.png](https://qiita-image-store.s3.amazonaws.com/0/147049/1fb62151-81cb-fdaa-193c-ac5421053ada.png)


# 使用するインタープリタの設定

File > Settings > Languages & Frameworks > Ruby SDK and Gems

+で追加して、リモートで使用しているインタープリタを設定します。

![rubymine2.png](https://qiita-image-store.s3.amazonaws.com/0/147049/c5c55a33-57e3-cc94-c74e-5ca20b36371e.png)

下記のRuby interpreter pathは、`/home/ubuntu/.rbenv/shims/ruby`ではなく、`/home/ubuntu/.rbenv/versions/2.4.0/bin/ruby`の方のパスを使う必要があります。そうでないとGemが読み込まれません。

![rubymine3.png](https://qiita-image-store.s3.amazonaws.com/0/147049/39702a0c-a421-46d3-a621-9fe2769c5033.png)

# Run/Debug Configurationsの設定

![rubymine4.png](https://qiita-image-store.s3.amazonaws.com/0/147049/64124a18-0c7c-2005-da18-2414cb0f95bc.png)

# rails serverにコントローラの変更が反映されない場合

Vagrantの設定によるかもしれませんが、コントローラを変更してもrails serverを再起動しないと変更が反映されないことがあります。その場合、`config/environments/development.rb`を下記のように変更すると反映されるようになります。

```
#config.file_watcher = ActiveSupport::EventedFileUpdateChecker
config.file_watcher = ActiveSupport::FileUpdateChecker
```

参考：
[IntelliJ IDEA 13.1 + Ruby plugin 6.5.0.20140314 DE リモートインタプリタ Rails開発](http://qiita.com/takeyuweb/items/67f7081dc116c5bb3f3f#_reference-47cd1985dfbcd5b110f3)
scipyでピーク値の抽出

#scipyでピーク値の抽出

scipy.signal.argrelmaxを利用
ピーク値のインデックスが取得できる。

```py3

import numpy as np
from scipy import signal
import matplotlib.pyplot as plt

x = np.linspace(0,10,100)
yorg = np.sin(x)
y = yorg + np.random.randn(100)*0.2

#ピーク値のインデックスを取得
maxid = signal.argrelmax(y, order=1) #最大値
minid = signal.argrelmin(y, order=1) #最小値

plt.plot(x,yorg,'r',label='オリジナルsin')
plt.plot(x,y,'k-',label='元系列')
plt.plot(x[maxid],y[maxid],'ro',label='ピーク値')
plt.plot(x[minid],y[minid],'bo',label='ピーク値（最小）')
plt.legend()
```

![peak.png](https://qiita-image-store.s3.amazonaws.com/0/117425/73f08899-fee7-530f-dbb8-03737c9a01f1.png)

orderの値を変更すると、抽出する間隔が変わる。
![peak2.png](https://qiita-image-store.s3.amazonaws.com/0/117425/c4a39fba-2ad6-74b1-119b-abcbbce701a1.png)
Git Github 入門/発展

サルでもわかるGit入門/発展を読みメモとしてまとめる

##場所
リモートリポジトリ
↑
ローカルリポジトリ
↑
インデックス
↑
ワーキングツリー

##状態確認コマンド
・git status:ワーキングツリーとインデックスの状態確認。赤色がワーキングツリー。緑がインデックス
・git diff:ワーキンググリー上で変更箇所を表示
・git diff --インデックス上でstaged:変更箇所を表示
・git log:ローカルリポジトリーの状態を確認
・git log --oneline:ローカルリポジトリーのログのみの状態を確認

##error
・Untracked files:ワーキングツリーからインデックスに上がってない状態のファイル
↓
git add .

・Changes to be committed:インデックスからローカルリポジトリに上がってない状態のファイル
↓
git commit 


##競合
==で区切られた上側がローカルリポジトリ、
下側がリモートリポジトリの編集内容ば表しとるとよ。

＞＞＞＞＞HEAD
hello　→　ローカルリポジトリ-
＝＝＝＝＝＞
こんにちは　→　リモートリポジトリ-
＞＞＞＞＞


##git chでのエラー
コミットせず、ワークングツリー（未add＆未commit）やインデックス(済add&未commit)に
残ったまま違うブランチに移動すると、その変更箇所を引き継いだまま違うブランチに移動する。
しかし、移動先ブランチで変更箇所が変更されていた場合checkoutができない。

##mergeとrebaseの違い
・結論：履歴のあり方の違い
・merge:枝分かれしたbranch履歴と、masterのbranch履歴を合わせない（履歴が分岐した状態で）で合併する
・rebase:枝分かれしたbranch履歴を、masterのbranch履歴の前に追加して履歴を一本化して、合併する

##pull と fetch　違い
・pull（fetch+merge） 最新履歴を取得してmergeする
・fetch 最新履歴を取得

##その他のコマンド
・git commit --amend:commit messageを書き換える

##revert　と resetの違い
・git revert:commit を取り消す　commit を作る
・git reset 
   soft:コミットを削除
   hard:コミット＋インデックスを削除
vimrc 設定


# .vimrcの置き場所

$HOMEにはシンボリックリンクおいて、
作成したdotfilesフォルダに本体は保存しておく

```
ln -s $HOME/work/dotfiles/vim/.vimrc $HOME/.vimrc
```


# .vimrcの設定
慣れたら増やす

```vim:.vimrc
"####　　設定####
set fenc=utf-8 "文字コードをutf-8に設定
set nobackup "バックアップファイルを作らない
set noswapfile "スワップファイルを作らない
set autoread "編集中のファイルが変更されたら自動で読み直す
set showcmd "入力中のコマンドをステータスに表示する
set clipboard+=unnamed "クリップボートとの共有
set ruler "カーソルが何行目の何列目に置かれているか表示


"####表示設定####
set number "行番号を表示
set title "編集中のファイル名を表示
set showmatch "括弧入力時の対応する括弧を表示
syntax on "コード色分け
set tabstop=4 "インデントをスペース4つ分に設定
set smartindent "オートインデント
set cursorline "現在の行を強調
set shiftwidth=4 "<< や >> を入力したときに挿入されるtabがスペースいくつ分か

"####検索設定####
set ignorecase "大文字/小文字の区別
set wrapscan "検索時に最後まで行ったら最初に戻る
set hlsearch "検索語をハイライト表示
set incsearch "/を打った後の文字を入力したタイミングからリアルタイム検索

```
知らないで損したJS標準ビルドインオブジェクト関数たち

先日初めて自分が作ったウェブアプリがリリースされ「めでたい！」となってたんですが、
時間の余裕ができたため、改めてJSのリファレンスを読み、「ちゃんと読んどきゃよかった…」と後悔すること多数。
恥の上塗り感がすごいですがここにさらします。

※ちなみにリファレンスと呼んでるのはこれ([MDN JavaScript リファレンス](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference))のことです。

Date.now()
------------------------------
> Date.now() メソッドは、UTC (協定世界時) での 1970 年 1 月 1 日 0 時 0 分 0 秒 から現在までの経過時間をミリ秒単位で返します。

[Date.now() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/now)

###こんな風に書いてました

```js
new Date().getTime()
```

###処理の目的
当たり前ですが「現在時刻のタイムスタンプを取得すること」でした。
今まではいちいちDate型のオブジェクトを作ってから取得してました…。いやはや。

date_object.getUTCDate()
------------------------------
> getUTCDate() は、協定世界時に基づき、指定された日付の「日」を返します。

[Date.prototype.getUTCDate() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCDate)

###こんな風に書いてました
タイムスタンプからTimezoneoffsetを引いてました。
(ちなみにJSのgetTimezoneOffset()は分単位で返ってきます。)

```js
new Date((timestamp_msec + this.getTimezoneOffset() * 60 * 1000))
```
###処理の目的
「タイムスタンプを用いてDateオブジェクトを生成する時、ローカルタイムでなくUTCで表示してほしい」時に使います。

私が実装したアプリケーションが若干特殊な気もしますが、サーバから送られてくるタイムスタンプとは別にタイムゾーンの情報が送られてきます。
タイムスタンプはUTCで送られてきて、タイムゾーン情報は、例えば東京なら `-540` が送られてきます。
それで、JSは`new Date`でDate型オブジェクトを使うと、そのブラウザの時間帯が使われてしまうので、
単純にタイムスタンプにタイムゾーン情報を引き算してしまうと、それに利用者のローカルタイムも適用されてしまい、意味不明な時刻が表示されてしまいます。

そのため、利用者のローカルタイム分引くようにしていたんですが、普通にUTCで表示できたみたいですね…。

number_object.toFixed()
------------------------------
> toFixed() メソッドは、数を固定小数点表記を用いてフォーマットします。

[Number.prototype.toFixed() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed)

###こんな風に書いてました
1000かけてFloorしてから10で割るという荒業。

```js
Math.floor(number_object * 1000)/10
```
###処理の目的
「小数点第〇位まで表示したい、等」

この toFixedを使えば

* 引数を入れないと整数に四捨五入される
* 引数に整数を入れると、その値分の少数〇位のところで四捨五入され表示される
    * 例えば `num.toFixed(1)` とすれば小数点第一位まで表示される
* ちなみに 数が `1.1` で `toFixed(3)` とかやると `1.100` になるみたいです。

number_object.toLocaleString()
------------------------------
>toLocaleString() メソッドはある言語に則した数の表記を適用したstringを返します。

[Number.prototype.toLocaleString() - JavaScript | MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString)

###こんな風に書いてました
実は道を踏み外す前に先輩に教えてもらったのでやらかしてはいないです。
最初は後ろから3文字ごとにカンマを挿入しようとしてました。

###処理の目的
「数値をカンマ区切りで表示したい」
おそらく本来の意図した用途とは違うのでしょうが、とりあえず使っとけば数字がカンマ区切りになります。

string.trim()
------------------------------
>trim() メソッドは、文字列の両端の空白を削除します。このコンテクストでの空白には、空白文字（スペースやタブ、ノーブレークスペースなど）とすべての改行文字（LF や CR など）を含みます。

[String.prototype.trim() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/trim)

###こんな風に書いてました
```js
string.split(" ").join().split("　").join()
```
※1個目が半角で2個目が全角の空白です。

###処理の目的
「空白を除いた文字列が1文字以上か確認する」です。

一番やらかした感大きいです。
trimは前後の文字列の空白を取るものなので、間の空白は取らなかったりするんですが、
今回の処理の目的は達成可能なので、明らかにこっち使う方がいいですね死にたい。

かんそう
==============================
基礎の勉強は大切だなーと実感…。
知ってる知らないで大きな差が出ることもあるので、
初めて触れる技術はドキュメント丸読みくらいでいいのかもと思いました。
モノによりますがそんなに時間取られるわけでもないですしね。
numpyで移動平均

#numpyで移動平均をかけるメモ

convolveを利用する。

```py3
import numpy as np
import matplotlib.pyplot as plt


x=np.linspace(0,10,100)
yorg=np.sin(x)
y=np.sin(x)+np.random.randn(100)*0.2

num=5　#移動平均の個数
b=np.ones(num)/num

y2=np.convolve(y, b, mode='same')#移動平均

plt.plot(x,yorg,'r',label='オリジナルsin')
plt.plot(x,y,'k-',label='元系列')
plt.plot(x,y2,'b--', label='移動平均')
plt.legend()
```
結果
![sin.png](https://qiita-image-store.s3.amazonaws.com/0/117425/7921ddc0-62db-da00-424c-36b1b6afca45.png)
【IIS/SSL】Windows Server 2016でLet's Encryptを設定する時の注意

# 前提
Windows Server2016で、Let's Encryptをインストールしたいけど、なんかエラー出て動かない。
基本的なことは、
[https://www.ipentec.com/document/document.aspx?page=software-iis-ssl-certificate-using-lets-encrypt](https://www.ipentec.com/document/document.aspx?page=software-iis-ssl-certificate-using-lets-encrypt)
を見るとわかりやすいが、更に少し注意点がある。


# 80番ポートは開放しておく
80番ポートと443番ポートを開放し、IISにバインドさせておく必要がある。
そしてなぜか、**80番ポート→443番ポートの順にバインド**させておかないとエラーが出た……

![a.jpg](https://qiita-image-store.s3.amazonaws.com/0/63338/19733ab9-c779-288c-6235-c153616eb4d8.jpeg)




#最後に
Windows Server2016た～のし～！
気が付いたらJSスクラッチ界隈が便利になってた件3

1.[気が付いたらJSスクラッチ界隈が便利になってた件1](http://qiita.com/Bong/items/27a9763880723df4f3b2)
2.[気が付いたらJSスクラッチ界隈が便利になってた件2](http://qiita.com/Bong/items/b49c6e9f8e9be9d7fe7c)
3.気が付いたらJSスクラッチ界隈が便利になってた件3
4.[気が付いたらJSスクラッチ界隈が便利になってた件4](http://qiita.com/Bong/items/00bb6d097ecbc3830b6c)

#属性の操作が便利になっていた
確かに[前回](http://qiita.com/Bong/items/b49c6e9f8e9be9d7fe7c)で終わったはずだった。
ところが急遽、第3弾を書くことに。

##属性を取得する
いつものように**attributes**を使います。

```html:sample1.html
<a id="human" href="javascript:void(0)" age="30" gender="男">一郎</a>
```

```javascript:sample1.js
window.onload = function(){
    var human = document.getElementById("human");
    human.onclick = function(){
        var age = human.attributes["age"].value;
        var gender = human.attributes["gender"].value;
        alert("年齢は" + age + "歳、性別は" + gender);
    };
};
```

この処理は、**getAttribute**でも行けます。

```javascript:sample1.js
window.onload = function(){
    var human = document.getElementById("human");
    human.onclick = function(){
        var age = human.getAttribute("age");
        var gender = human.getAttribute("gender");
        alert("年齢は" + age + "歳、性別は" + gender);
    };
};
```

##ところが
先日、研修生が書いたコードに、「**data-○○**」という文字を発見。

これはもしかして、JSスクラッチの課題なのに、何かのJSライブラリを使っちゃったかな？
いや、これは違う！

##dataset
どうやら、HTML5のカスタム属性は
「**data-○○**」で定義して、「**dataset**」で取得するのが作法とのこと！

具体的には、以下の書き方になります。

```html:sample2.html
<a id="human" href="javascript:void(0)" data-age="30" data-gender="男">一郎</a>
```

```javascript:sample2.js
window.onload = function(){
    var human = document.getElementById("human");
    human.onclick = function(){
        var age = human.dataset.age;
        var gender = human.dataset.gender;
        alert("年齢は" + age + "歳、性別は" + gender);
    };
};
```

##まとめ
確かに、これは便利ですね～。
今までの方法ですと、うっかり「title」属性にデータを埋め込んで、「マウスオーバーで内容が表示されちゃう」事故が起きますし。
今後は**dataset**を、積極的に使っていきたいと思います。

※今回の調査で、新たな学びがありましたので、もう1エントリー書けそうです。
というか、私の勉強不足が露呈しているだけですが (^_^;
自作のmodulemapを組み込んだFrameworkの作り方


　皆さんあっさり作っておられるようですが、自分は悩んだので覚え書きと同様にお悩みの方へ。

## ファイルを置くだけじゃ駄目！！

　modulemapの文法自体は、[Clang Moduleについて](http://qiita.com/ysn551/items/6f783af2b65c2c4d4631 "Qiita")や[Clang Documentation](http://clang.llvm.org/docs/Modules.html "Clang")に詳しく書いてあるので割愛します。

## `module.modulemap`を作ったら

### まずはファイルをプロジェクト内に配置する

　`module.modulemap`を作ったら、それをプロジェクト内の任意の位置に配置します。
例えばですが、プロジェクトファイルと同じディレクトリであれば`$(SRCROOT)`ですね。
とりあえずこの、`module.modulemap`ファイルを置いた場所を`$(SRCROOT)`等からの相対位置で憶えておいて下さい。

### ターゲットを確認する

　Xcode一番左のペインのプロジェクトアイコンをクリックし、次のペインのターゲットから作成した`modulemap`を適用したいフレームワークをクリックします。

### サーチパスに、`module.modulemap`を置いたパスを追加する

　Build Settingsを選び、Search Paths のほぼ最下部のUser Header Search Pathsに`module.modulemap`を配置したパス（今回の例では`$(SRCROOT)`）を追記する。

### パッケージングにmodulemapがあることを教える

　最後にPackagingセクションを探して
* Defines ModuleがYesに（基本なっているはずです）なっていることを確認する
* その一行下のModule Map Fileに`modlue.modluemap`と自作のmodulemapファイル名を記述する。

## あとはビルドしてみると

　作成されたフレームワークのModuleフォルダー内の、module.modulemapが自作のmapになっているはずです。お疲れ様でした。

## いいね、ストックが多かったり、コメントがあればスクリーンショットを追加します。
Googleフォームで入力された情報をrailsのデータベースに保存する


# Googleフォームの情報をrailsのデータベースに送りたい

Googleフォーム使うときはスプレッドシートに集計するパターンはあるある。
今回はRailsアプリケーションのデーターベースに保存してみたので自分用に簡単にメモ。
目的としては入力されたユーザーの住所情報を保存すること。
このときLocationはstring型の:addressを持っている、データベースはpostgreSQL。

ルーティングでPOST先のURLを用意して、スクリプトでPOST先のURLにfetchしてあげる。
そうしてPOSTで送られてきた内容をコントローラで処理してLocationに保存
といった流れになっている。

## Googleフォームのスクリプト

実際のフォームとスクリプトエディタの中身がこちら
このとき、フォームの質問内容を　**住所を入力してください**　としている

### フォーム内容

![スクリーンショット 2017-04-16 10.40.20.png](https://qiita-image-store.s3.amazonaws.com/0/159449/a5f292ec-3959-fc5e-ac22-dfbaf9922ee0.png)



### スクリプトエディタ

```post_form.js
function post_contents(e) {
    var itemResponses = e.response.getItemResponses();
    var address = '';
    for (var i = 0; i < itemResponses.length; i++) {
        var itemResponse = itemResponses[i];
        var question = itemResponse.getItem().getTitle();
        var answer = itemResponse.getResponse();
        if (question == '住所を入力してください'){
            address = answer;
        }
    }

    var data =
        {
            "User":
                {
                    "address": address
                }
        };

    var payload = JSON.stringify(data);

    var options =
        {
            "method"  : "POST",
            "payload" : payload,
            "contentType" : "application/json",
            "followRedirects" : true,
            "muteHttpExceptions": true
        };

    var response = UrlFetchApp.fetch("POST先のURL", options);
    Logger.log(response);
}
```


## Controller (Rails)
CSRF対策を無効にしてます。


```locations_controller.rb
class LocationsController < ApplicationController
  protect_from_forgery except: :create

  def create
    location = Location.new(location_params)
    location.save
    render json: {}, status: :ok
  end

  def location_params
    params.require(:user).permit(:address)
  end

end
```

ちなみにルーティングには

```routes.rb
  resources :locations, :only => [:index, :create]
```

を加えている。

端的に書いてるので
足りない情報あったら教えてください。。
zsh　設定

かっこいいものを使いたい。bash→zshに変更する！！
インスコは省略します。

##　ログインシェルをzshに変更する

[http://blog.tokoyax.com/entry/zsh/bash-to-zsh]

~~/usr/local/bin/zsh にインストールされた最新版のzshを使うための設定をしていきます。~~

2022/9/24追記
Apple Silicon Mac では Homebrew のインストール先が /opt/homebrew 以下となっています。




インストールされているシェルとそのパスを確認します。

```
$ cat /etc/shells
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
```

~~/usr/local/bin/zsh を追加しましょう。~~

2022/9/24追記
/opt/homebrew/bin/zsh を追加しましょう


```
$ sudo vi /etc/shells
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
/opt/homebrew/bin/zsh
```

ログインシェルを変更します。

```
$ chsh -s /opt/homebrew/bin/zsh
…パスワード入力
```



[ -s ] オプション ：変更するシェルを指定する

これで、ターミナルを起動するとzshが起動するようになります。


## zshrc

ひとまずの設定はこちら
色々参考にさせてもらいました。
全然使いこなせてないので、最低限にしておく。

```
# Lines configured by zsh-newuser-install
export EDITORP=vim #エディタをvimに設定
export LANG=ja_JP.UTF-8 #文字コードをUTF-8に設定

# プロンプト設定
PROMPT='[%~:%n] %# '

# history
HISTFILE=~/work/dotfils/zsh/.zsh_hist
HISTSIZE=1000
SAVEHIST=1000
setopt extended_history #ヒストリに実行時間も保存
setopt hist_ignore_dups #直前と同じコマンドはヒストリに追加しない

#vi ライクな操作ができる
bindkey -v
# End of lines configured by zsh-newuser-install
# The following lines were added by compinstall

autoload -Uz compinit
compinit

#
# setopt
#

# cdした先のディレクトリをディレクトリスタックに追加
setopt auto_pushd

# pushdしたとき、ディレクトリがすでにスタックに含まれていればスタックに追加しない
setopt pushd_ignore_dups

# コマンドのスペルを訂正する
setopt correct

# <Tab>でパス名の補完候補を表示したあと、
# 続けて<Tab>を押すと候補からパス名を選択することができるようになる
zstyle ':completion:*:default' menu select=1

autoload colors
zstyle ':completion:*' list-lolors "${LS_COLORS}"


#エイリアス
alias la='ls -aG'
alias ll='ls -lG'
alias vz='vim ~/work/dotfiles/zsh/.zshrc'

# cdの後にlsを実行
chpwd() { ls -ltrG  }

# 補完候補のメニュー選択で、矢印キーの代わりにhjklで移動出来るようにする。
zmodload zsh/complist
bindkey -M menuselect 'h' vi-backward-char
bindkey -M menuselect 'j' vi-down-line-or-history
bindkey -M menuselect 'k' vi-up-line-or-history
bindkey -M menuselect 'l' vi-forward-char


# End of lines added by compinstall

```


# zshenv 

```
# zshが起動した際に必ず読み込まれる設定ファイル
# 主に環境変数などの、操作に関係ない設定を記述

export ZDOTDIR=$HOME/work/dotfiles/zsh/


```
SyntaxError: Missing parentheses in call to 'print' と言われました

Python で `print` を使ったら動かなくて困りました。

# 環境
環境は python3 です。

```
python --version
Python 3.5.1 :: Anaconda 4.0.0 (x86_64)
```


# print が使えません

```
  File "<stdin>", line 1
    print "hoge"
               ^
SyntaxError: Missing parentheses in call to 'print'
```

# python3 から print の書き方が変わった
何だこれおかしいと思ったら、python3 から書き方が変わったのを知りませんでした😓

```
print "Hello world"  # python 2.x

Is now

print("Hello world")   # python 3.x
```

`print("hoge")` に変更したら動きました😳

# 参考
http://stackoverflow.com/questions/41341149/python-3-6-0-syntax-error-missing-parentheses-in-call-to-print
windows10 ubuntu デュアルブートが壊れたのを直す3

[前回] [windows10 ubuntu デュアルブートが壊れたのを直す2 - Qiita](http://qiita.com/o-kei/items/cda50bc3e62161528cb9)

あとはwindowsの復活を目指す。

GPU二枚差しだが，片方にモニタを繋いでもbiosやubuntuが出力されない。windowはでる。なぜ。
この問題はほおって置いて，MBRの修復を目指す。

インストールDVDから起動してコマンドプロンプト。

修復開始！（つまり再インストール）

（寝る）
（起きる）

アプリなどは消えたが，症状は同じ。
（更新とかセーフモードで起動とかbcdeditできない）
パーティションを切り直さないとだめなようだ。

ubuntuから操作しようとしたが，
ubuntuはapt-get upgradeでgrubのインストールをミスしたようで，

```
attempt to read or write outside of partition
```
となる。
まずはこっちから修正しよう。
キャッシュサーバの鉄則

みんな大好き。キャッシュ。
RDBでは遅い処理を劇的に早くしてくれるアレですね。
大量リクエストを捌かなければいけない本番環境では如何にキャッシュを上手に使えるかがスループットを大きく左右します。

でも、[Redis 本番障害から学んだコードレビューの勘所](http://qiita.com/haminiku/items/43bafbb9d74ef3a1f74c)にあるとおり、キャッシュサーバは運用を一つ間違うと途端に地雷化してしまうものでもあります。

そこで、キャッシュサーバの鉄則を伝授しましょう。（偉そう）

**1. キャッシュサーバがダウンしても、システムにパフォーマンス以外の影響があってはならない。**
**2. 有効期限(TTL)が指定されてないデータを保存してはいけない。**

というものです。キャッシュはあくまでもキャッシュ。いつ消えても問題ないデータしか保存してはいけません。
キャッシュサーバがダウンしたから、システムが全停止したというのはキャッシュとして間違った使い方をしている証拠です。
（もちろん、パフォーマンスが下がって部分的にタイムアウトが発生することはあるでしょうが）

これを担保するためにも、**開発サーバではランダムな期間ごとに全データを削除する、もっと言うとサーバをダウンさせるようにすると良いです。**キャッシュ（サーバ）が存在していることに依存したコードが書けなくなります。
[Redis 本番障害から学んだコードレビューの勘所](http://qiita.com/haminiku/items/43bafbb9d74ef3a1f74c)にもある、よくありがちな「キャッシュサーバのつもりがいつの間にかストレージとして使われていた」問題はこれで防げていたでしょう。

Redisをストレージとして使う必要がある。のであれば、ストレージとして設計をした別Redisを立てて役割を分けるべきです。
キャッシュサーバ用Redisに突っ込むデータはTTL指定必須。TTL指定ができないデータのみストレージ用Redisに入れるようにします。

当然ストレージ用ですから二重化（レプリケーション）必須だし、ディスクへの退避設定(AOF)、定期バックアップの仕組みも必要でしょう。…とここまでくると大変なので、結局はRDBやS3などのファイルストレージにオリジナルを保存して、キャッシュを用Redisにコピーする。という運用にしたほうが簡単だとは思いますが、どうしてもストレージ用Redisが必要ならそうするべきです。


キャッシュを上手に手なづけて、良いサービスライフを。
jsdoでconvnetjs その8

#概要
XOR問題で、活性化関数を替えられる、プレイグランドを作ってみた。

#写真
![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/2/w/Z/2wZr.jpg?t=1492302681)

#説明
XORなので、出力は、softmaxで2つ。
全結合層は、4つで、relu,tanh,sigmoid,maxoutを選択できる。
testボタンで、実行。
時間とロスと推定を表示。
やってみると、sigmoidは、使わない。自分なら、maxoutを使う。

#tensorflowの活性化関数
maxoutが無い。

```
tf.nn.relu
tf.nn.relu6
tf.nn.crelu
tf.nn.elu
tf.nn.softplus
tf.nn.softsign
tf.nn.dropout
tf.nn.bias_add
tf.sigmoid
tf.tanh
```

#成果物
http://jsdo.it/ohisama1/2wZr
WebStorm 導入備忘録

# WebStorm 備忘録

WebStorm が良いと聞いたので試してみます。
キーバインドなどすぐ思い出せるようにメモしておきます。

* Mac OS X 10.11.6
* WebStorm 2017.1

### Install

* `brew cask install webstorm`
* CLIで `webstorm .` 使えるようにする。 "Tools" -> "Create Command Line Launcher..."

### 設定変更したもの

* Font
	* schemeを Monokai
	* Ricty 16
* Projectパネルの歯車から Autoscroll from Source
* 設定＞ (Languages & Frameworks | JavaScript) Flow
* Ensure line feed at file end on Save
* Use soft wraps in editor
* [standard/webstorm.md at master · feross/standard](https://github.com/feross/standard/blob/master/docs/webstorm.md)
* chaiのテストで警告が出るのを無視 http://stackoverflow.com/questions/28568872/how-to-turn-off-jshint-error-in-webstorm

#### Plugin

設定のPluginからインストールできる

* .ignore
* Scratch: `Alt+C Alt+C`
* Markdown Navigator

### キーバインド

* Toggle Window
	* Project `Cmd+1`
	* ToDo `Cmd+6`
	* Structure `Cmd+7`
	* Terminal `Option+F12`
* Jump To Navigation `Cmd+Up`
* Jump To Source `Cmd+Down`
* 機能の検索 `Cmd+Shift+A`
* 宣言元へのジャンプ `Cmd+B`
* 変数・関数の使用箇所を調べる `Option+F7`
* ファイルを開く `Cmd+Shift+O`
	* 他のエディタで慣れているので `Cmd+P` で開きたいかも
* シンボル `Cmd+Option+O`
* いろいろ検索 `Shift Shift`
* 最後に編集した行に移動 `Cmd+Shift+delete`
* 最近開いたファイル `Cmd+E`
* ステートメント補完（セミコロンや括弧など） `Cmd+Shift+Enter`
* コード整形 `Cmd+Option+L`
* Quick Fixes `Option+Enter`
	* ESLint Fixなどもできる
* リファクタリング `Ctrl+T`
	* rename `Shift+F6`
* Live Templates `Cmd+J`
	* Postfixコード補完 （hoge.if）などもある
* 選択範囲
	* 広げる `Option+Up`
	* 狭く `Option+Down`
* 複数行選択
	* `Option + クリック`
	* 単語を複数選択 `Ctrl+G`
	* 全て選択 `Cmd+Ctrl+G`
* git commit changes `Cmd+K`

### 参考にしたもの

* [WebStorm指南書](http://azu.github.io/slide/webstorm/webstorm.html#slide1)
* [ウェブ制作にはWebStormがお勧め！ 使いこなせば操作が爆速になる機能のまとめ - ICS MEDIA](https://ics.media/entry/11642)
* [WebStormを使った快適Web開発のススメ \| mediba Creator × Engineer Blog](http://ceblog.mediba.jp/post/143350750932/webstorm%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E5%BF%AB%E9%81%A9web%E9%96%8B%E7%99%BA%E3%81%AE%E3%82%B9%E3%82%B9%E3%83%A1)
Keras2.0の紹介

# Keras2.0の紹介

1.  Kerasについて
2.  Keras2.0について(Keras2.0の概要)
3.  Keras2.0について(バックエンドについて)
3.  インストール方法
4.  TensorFlowへの簡易インタフェースとしてのKeras


## Kerasについて

KerasはTensorFlowまたはTheanoをバックエンドとして動作する深層学習ライブラリです。
Pythonで実装されています。
Kerasは、迅速な実験を可能にすることに重点を置いて開発されました。 

## Keras2.0について(Keras2.0の概要)
2017年3月にKeras2.0がリリースされました。これにあたりアップデート関連で気になることについてまとめています。
1. KerasではAPIの変更がある場合、そのリリースを1つのリリースにまとめているため、ユーザーはコードの更新をまとめることができる
2. Keras 1とKeras 2の間のAPIの変更は可能な限り下位互換性がある。（複雑な場合を除いて、Keras 2でKeras 1のコードを実行可能。）
3. Keras 2はKerasの最初の「長期サポート」API。Keras 2で書かれたコードは、これからも数年間、最新のソフトウェアで動作するはず。

## Keras2.0について(バックエンドについて)
1. Keras 2 APIはTensorFlowリポジトリの一部となり、TensorFlowの高水準APIとして機能する。
2. Theanoのサポートは無限に続く
3. 将来的に多くのバックエンドをサポートする予定（MicrosoftはKerasのCNTKバックエンドを構築しています）

## インストール方法
$ pip install keras

## TensorFlowへの簡易インタフェースとしてのKeras
以下のようにも使える。

import tensorflow as tf
sess = tf.Session()

from keras import backend as K
K.set_session(sess)

\# Keras layers can be called on TensorFlow tensors:
x = Dense(128, activation='relu')(img)  # fully-connected layer with 128 units and ReLU activation
x = Dense(128, activation='relu')(x)
preds = Dense(10, activation='softmax')(x)  # output layer with 10 units and a softmax activation


https://blog.keras.io/keras-as-a-simplified-interface-to-tensorflow-tutorial.html
より抜粋


#参考資料
[Spring 2017 roadmap: Keras 2, PR freeze, TF integration](https://github.com/fchollet/keras/issues/5299)
[Introducing Keras 2](https://blog.keras.io/introducing-keras-2.html)

# 類似資料
以下のアップデート版です。
Keras 2.0の概要
http://qiita.com/taki_tflare/items/49740a9d8f36464947b9
生命保険 保険金支払への機械学習導入の概要について考える。

# 生命保険 保険金支払への機械学習導入の概要について考える。

 [日本初!保険金支払審査への導入で見えてきたIBM Watsonの実力 提供：日本IBM](http://ps.nikkei.co.jp/ibmwatson1603/p2.html)
 
 上記を見たので、保険金支払への機械学習導入はどのような感じでできるか、少し考えてみた。 
 詳細な落とし込みは別途とします。


## 生命保険 保険金支払をざっくりまとめると
生命保険の保険金支払はざっくりいうと以下の手順で行われる。

1. 保険契約者の保険金請求
2. 保険会社から保険契約者への必要書類の算出
3. 必要書類の確認、送付依頼
4. 保険契約者から保険会社への必要書類の送付
5. 送られてきた書類を元に機械的な査定を実行(機械査定)
6. 書類、機械的な査定、必要に応じた病院等への紹介などを元にした人的な査定(人的査定)
7. 支払

## 機械学習を導入するとしたら人的査定のサポートに使う
機械学習を導入するとしたら3. 6の人的なサポートに用いるというのが考えられる。
保険会社がシステムで行うのが2.4.5.7
保険会社が人で行うのが3.6

現在システムで行っている箇所に機械学習を導入することで得られるメリットは少ないため（普通にロジックを組んだほうが、コストも低く、結果も固定である。）機械査定へ機械学習を使用するのはどうなのか？については別途記載

3(必要書類の確認、送付依頼)はそこまで難しくないため、それほどのメリットが得られないため、
やるとしたら6(人的な査定)になると考える。

## 人的査定のサポートで何ができる？
人的査定で機械学習を使うのであれば、
以前の似たような入力があった場合は支払をしていましたよ。とか
病院への確認をしていましたよ。等の表示をしてあげる。
ということしかできないだろう。
しかし、上記を行うことで人が行うとどうしても発生してしまう結果が安定しないということが改善できることが大きいと考える。

## 人的査定のサポートの効果は？

これについては、4の機械的な査定をどの程度行っているかによって
得られるものが大幅に変わってくる。
リンク先の資料では、システム的に判定できるのが2割のシステムに導入したようだ。
>「お客さまから頂く請求件数は年間約200万件あり、システム的に判定できるのは２割、残りの８割は人による判断が必要です」

このようにシステム的に判定できる割合が少なく、請求件数が多いところいには大きな価値があると考えられる。
逆にシステム投資を十分していて、システムで8割判断ができてしまえば、使えるのは残り2割となってしまい効果は薄い。


## 機械査定へ機械学習を使用するのはどうなのか？

人が条件を全て決めれるものであれば、機械学習を使わずプログラミングしたほうが良い結果が出る。

ただし、この条件が複雑になりだすと特に保守において問題が出始めると考えられる。
（特定の人しかいじれないものとなりその人がいなくなると保守が困難になる等）
そういった場合は機械学習の強みが活かせるため、機械学習を行わない部分と行う部分を分け、併用することを考えるのもありと考える。
DockerでAndroidアプリをビルドする


こんにちはsekitakaです。

Dockerコンテナ上でAndroidアプリのビルドやテストができれば、jenkinsやクラウドのCIサービスなどでビルドスクリプトを使いまわせて便利ですね。
jenkisスレーブのネイティブの環境を汚さなくて済むというのも魅力的です。

そこでこの記事ではDockerでAndroidアプリをビルドする方法を紹介します。
[サンプルプロジェクト][sample]も公開しているので、自由に利用してください。

# Dockerfile
以下のDockerfileでAndroidをビルドするための基本的な環境が整います。

```
FROM ubuntu:16.04

# JDKインストール
# 2回実行しているのは Connection timed out が起きがちだったため。
RUN apt-get -y update
RUN apt-get -y install openjdk-8-jdk || true
RUN apt-get -y install openjdk-8-jdk

# Android SDKインストール
RUN apt-get install -y wget unzip
RUN wget https://dl.google.com/android/repository/tools_r25.2.3-linux.zip
RUN mkdir -p /Android/sdk
RUN unzip tools_r25.2.3-linux.zip -d /Android/sdk

# 環境変数
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64
ENV ANDROID_HOME /Android/sdk
ENV PATH $ANDROID_HOME/bin:$PATH
```

# Dockerイメージのビルド
このDockerfileを利用してイメージを作成します。
以下のコマンドを実行すると`android`という名前のイメージが作成されます。

```
cd <プロジェクトディレクトリ>
docker build -t android docker/
```

# Androidアプリのビルド
Dockerイメージが作成できたら、以下のコマンドでサンプルアプリのビルドが可能です。
`build.sh` で`gradlew`を実行しています。`build.sh`はコンテナ上で実行されています。
`build.sh` の内容については後述します。

```
cd <プロジェクトディレクトリ>
docker run --rm \
-v `pwd`:/app \
-v `pwd`/docker/share_by_container/android-sdk:/Android/sdk \
-v `pwd`/docker/share_by_container/dot_gradle:/root/.gradle \
-w /app -t android sh build.sh
```

ちなみに `--rm` はコマンド終了後に自動的にコンテナを削除するオプションです。使用後のゴミコンテナを残さないようにしています。

`-v`でホスト側のディレクトリをコンテナから参照できるようにしています。
`/app`にはホストのAndroidプロジェクトのディレクトリ、`/Android/sdk` には共有用のディレクトリ、 `/root/.gradle`にも共有用のディレクトリをマウントしています。
共有用のディレクトリはビルドに必要なパッケージなどが保存される場所で、コンテナ起動毎にダウンロードすると時間がかかるためこのようにしています。

# build.sh
Dockerとは直接関係ないですが、ビルド用のシェルスクリプトは以下のようにしています。
各種パッケージのライセンスへの同意情報を`android-sdk-license`に書き込んでいます。
Macのローカル開発環境のライセンスへの同意情報は `~/Library/Android/sdk/licenses/android-sdk-license` にありました。
下の例では `8933bad161af4178b1185d1a37fbf41ea5269c55` がライセンスの同意情報で、ローカルの開発環境で同意した値をコピーすればdockerでも同意した状態になります。


```bash:build.sh
#!/bin/bash

rm -f local.properties
mkdir -p $ANDROID_HOME/licenses
echo "8933bad161af4178b1185d1a37fbf41ea5269c55" > $ANDROID_HOME/licenses/android-sdk-license

./gradlew clean && \
./gradlew dependencies && \
./gradlew assembleDebug
```

# まとめ
いかがでしたでしょうか。AndroidアプリをDocker上でビルドする方法を紹介しました。
Dockerでビルドすることでビルド環境をコードとしてリポジトリ管理できるようになるのがうれしいですね。

今回の記事で使用した[サンプルプロジェクト][sample]は公開していますので、自由に使用してください。

[sample]:https://github.com/sekitaka/DockerAndroidExample
技術英語 > how it can be used can only [be truly measured] by the end user.

@ http://thecodist.com/article/the-six-goals-of-every-programming-project

> how it can be used can only **be truly measured** by the end user.

https://www.merriam-webster.com/dictionary/measure
> 5 :  to estimate or appraise by a criterion 
measures his skill against his rival

開発者が「これは使える」という機能を実装しても、実際にはユーザはそれを使わない、ということはあるとのこと。
他の製品の似たような機能を考慮して開発するのと、考慮せずに開発する違いも書かれている。
MastodonインスタンスのDBを、Amazon Aurora にするのは面倒だった件

最近はやりのMastodon。コードを見たらPostgreSQL前提だったので、Amazon Auroraで動くように書き換えて、
EC2(Amazon Linux) + RDS(Aurora) + ElastiCache(Redis) で動かしてみました。

動かした結果は↓
https://now.kibousoft.co.jp/

以下のmasterブランチにコードをアップしています↓
https://github.com/kibousoft/mastodon/

pgheroを取った以外は、主にmigrationの修正なのですが、ポイントとしては

- Aurora / MySQLではTEXTに対してDefault valueが設定出来ない
- Foreign Keyが設定済の状態ではChange Column出来ない
- Aurora / MySQLでIndexを張れるカラムの最大長は767bytesまで。そのためVARCHARに対してlimitを設定してやる必要がある。utf8mb4の場合、`limit: 191`を設定すればOK
- jsonとか特殊型はそもそも無いのでtextとかに変える

なので、この辺をひたすら直す感じ。
今後 PostgreSQL→Aurora / MySQL に移行する何かがあったら役立ちそう。

（余談１）
本家はPumaみたいなんですが、自分はunicornのほうが好きなので、今回unicornで動かしました。
unicornでも今のところ問題なさそうです。

（余談２）
今回立てたMastodonインスタンス「Kibousoft Now」では、絶賛ユーザー募集中です。
せっかく立てたので、どうせなら盛り上がったら良いなあ（無理そうだけど）
https://now.kibousoft.co.jp/
boostの導入(Windows10,Visual Studio 2015)

#目的
C++の代表的な機能拡張ライブラリの一つであるboostの環境構築について記述します．

# 環境
- Windows 10
- Visual Studio 2015
- boost 1.63.0

# ダウンロード
まず，[こちら](http://www.boost.org/users/history/version_1_63_0.html)からboost_1_63_0.zipをダウンロードします．
ダウンロードした位置で構わないので全て展開しておきます．

# ビルド
解凍が終わったら，管理者権限でコマンドプロンプトを開きます．
..\boost_1_63_0\boost_1_63_0まで移動して下記バッチファイルを実行します．

```
$ bootstrap.bat
```
32/64ビット版それぞれのライブラリファイルを生成するため，下記コマンドにてビルド実行．
Cドライブ直下に，必要な全てのファイルを配置するようにしています．

```
$ b2.exe toolset=msvc-14.0 link=static runtime-link=static,shared --build-dir=build/x86 address-model=32 -j5 install --includedir=C:\boost_1_63_0\include --libdir=C:\boost_1_63_0\lib\x86
$ b2.exe toolset=msvc-14.0 link=static runtime-link=static,shared --build-dir=build/x64 address-model=64 -j5 install --includedir=C:\boost_1_63_0\include --libdir=C:\boost_1_63_0\lib\x64
```
インストールオプションの詳細は参考に委ねますが，基本的なオプションは下記にまとめておきます．

# boostインストールオプション
- --toolset：ビルドを実行するツールセットを指定します．  
e.g.) --toolset=msvc-14.0：(VS2015) のコンパイラを使用  
- address-model=N：Nに32または64を指定します．  
- -jN：Nに並列実行させるCPUコア数を指定します．  
- --libdir：本来はインストールしたいライブラリファイルの保存先を設定するオプションですが，インストール先ディレクトリを指定するような使い方をしています．  
OOはソリューションプラットフォームに応じて86か64を入れます．  
e.g.) --libdir=C:\boost_1_63_0\lib\xOO：
- --includedir：上と同様に，インクルードファイルのインストール先ディレクトリを指定するために使っています．  
e.g.) --includedir=C:\boost_1_63_0\include

# Visual Studioにおける設定
- C/C++の全般タブから追加のインクルードディレクトリに下記を追加．  

```
C:\boost_1_63_0\include\boost-1_63
```

- リンカーの全般タブから追加のライブラリディレクトリに下記を追加．

```
C:\boost_1_63_0\lib\xOO
```

# 確認
下記を実行して，導入したboostのバージョンが出力されれば成功です．  

```c
#include <iostream>
#include <boost/version.hpp>

int main() {
	std::cout << (BOOST_VERSION / 100000) << "." << (BOOST_VERSION / 100 % 1000) << "." << (BOOST_VERSION % 100) << std::endl;
	getchar();
	return 0;
}
```



# 参考
- [「Boostライブラリのビルド方法」](https://boostjp.github.io/howtobuild.html)
- [「C++ Boostライブラリ（filesystem etc.）をWindows用（MinGW用、Visual Studio用）にビルドする」](https://www.tmp1024.com/programming/windows-install-boost)
dkms prblem Install CUDA toolkit8

#CUDA toolkit8をインストール
[CUDA Toolkit](https://developer.nvidia.com/cuda-toolkit) より
CUDA toolkit8をCentOS7にインストールする。
Linux > x86_64 > RHEL > 7 > rpm(local) を選択し、rpmをダウンロードする。
サイトにしたがって、

```
user$ sudo rpm -i cuda-repo-rhel7-8-0-local-ga2-8.0.61-1.x86_64.rpm 
user$ sudo yum clean all 
user$ sudo yum install cuda 
```
を実行したところ。。。

```
エラー: パッケージ: 1:nvidia-kmod-375.26-2.el7.x86_64 (cuda-8-0-local-ga2)'
             要求: dkms
 問題を回避するために --skip-broken を用いることができます。
```

エラーのためインストール出来ず。

#dkms をインストール
[dkms problem while installing CUDA 8 on RHEL 7.3 ppc64le](https://devtalk.nvidia.com/default/topic/983078/dkms-problem-while-installing-cuda-8-on-rhel-7-3-ppc64le/?offset=3)
より
`yum install epel-release` のあと
`yum install dkms`を実行する。
これで
`yum install cuda`を実行するとちゃんとインストールされる。
`nvcc -V` で確認。

```
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2016 NVIDIA Corporation
Built on Tue_Jan_10_13:22:03_CST_2017
Cuda compilation tools, release 8.0, V8.0.61
```
と出ればOK。

# 参考
[Dynamic_Kernel_Module_Support : wiki.archlinux.jp](https://wiki.archlinux.jp/index.php/Dynamic_Kernel_Module_Support)
docker-composeを使って複数バージョンのRedmineに対してプラグインのテストをする方法

Redmineのプラグインを作っていると複数のバージョンのRedmineに自分のプラグインが対応しているかどうか確認したくなることがあります。

[結論](https://github.com/okkez/redmine_full_text_search/blob/master/docker-compose.yml)はリンク先を見てください。

# docker-composeを使って複数バージョンのRedmineに対してプラグインのテストをする方法

MariaDB(MySQL)とPostgreSQLに対応した[全文検索用のプラグイン](https://github.com/okkez/redmine_full_text_search)を作っているのですが、複数バージョンのRedmineに対する動作を確認したくなったので方法を考えてdocker-compose.ymlを書きました。

方針は以下の通りです。

* docker-compose.yml で書ける範囲でがんばる (Dockerfileは書かない)
    * 配布されている[Dockerイメージ](https://hub.docker.com/_/redmine/)でがんばる
* データベースはホスト環境にインストールしているものを使う
    * MroongaのDockerイメージはあるけど、PGroongaのDockerイメージはないため既にホストに入っているものを活用したい
* プラグインは、Dockerイメージ内にコピーしない
* プラグインの動作確認用なので、セキュリティについてはあまりガチガチにしない

```yaml
version: "2"
services:
  redmine-3.2-mariadb:
    image: redmine:3.2
    ports:
      - "3011:3000"
    environment:
      REDMINE_DB_MYSQL: mariadb
      REDMINE_DB_DATABASE: redmine-3.2
    env_file:
      - env
    extra_hosts:
      - "mariadb:172.17.0.1"
    volumes:
      - .:/usr/src/redmine/plugins/full_text_search:ro
```

最初の1つができたらあとはコピーして増やすだけなので、1つ例を上げて説明します。

ホスト側のポート番号は、複数のRedmineを同時に上げて確認することもあるのでユニークになるようにします。
環境変数は、以下の4つを設定します。

* `REDMINE_DB_MYSQL` or `REDMINE_DB_POSTGRES`: データベースのホスト名を指定します
* `REDMINE_DB_DATABASE`: データベースの名前を指定します
* `REDMINE_DB_USERNAME`: データベースに接続するユーザー名を指定します
* `REDMINE_DB_PASSWORD`: データベースの接続に使用するパスワードを指定します

ユーザー名とパスワードは他のバージョンのRedmineでも共通にしておいた方が設定が楽になるので、上の例では `REDMINE_DB_USERNAME`, `REDMINE_DB_PASSWORD` は `env_file` にまとめています。

`extra_hosts`には`REDMINE_DB_MYSQL`(`REDMINE_DB_POSTGRES`)に設定したホスト名とDockerコンテナ内からホストにアクセスするためのIPアドレスを書きます。これを書いておくとDockerコンテナ起動時に/etc/hostsに自動で追加してくれて、便利です。

最後に`volumes`でプラグインディレクトリを読み込み専用でマウントして完了です。

`docker-compose up`すると`rake db:migrate`はやってくれますが`rake redmine:plugins:migrate`はやってくれないので、以下のように`docker-compose exec`します。

```
$ docker-compose up -d redmine-3.2-mariadb
$ docker-compose exec redmine-3.2-mariadb rake redmine:plugins:migrate RAILS_ENV=production
$ docker-compose restart redmine-3.2-mariadb
```

# 補足

MariaDBやPostgreSQLはデフォルトでは外部からの接続を受け付けないようになっています。
そこで外部(Redmineの入っているDockerコンテナ)からホストで稼働中のMariaDBやPostgreSQLに接続するための設定をします。

## MariaDB

MariaDB 10.1で確認しましたが、MySQLや他のバージョンでも同じだと思います。

以下のようにbind-addressに`*`を設定し、ユーザーを作成するときにどこからの接続を受け付けるのかを指定しておきます。
なお bind-address には複数の条件を指定することはできないので、今回のように複数のIPアドレス範囲(localhostとDockerコンテナ内部)から接続する必要があるときは、以下のように`*`を指定し、`CREATE USER`時にユーザーごとにどこから接続するのかを制限します。

```
bind-address            = *
```

設定ファイルを書き換えたらMariaDBを再起動しておきます。

```sql
CREATE USER 'redmine'@'%' identified by 'passowrd'; -- どこからでも接続できる
CREATE USER 'redmine'@'172.0.0.1/8' identified by 'passowrd'; -- 172.*.*.* から接続できる
```

## PostgreSQL

pg_hba.conf に以下の内容を追記します。

```
host    all             all             172.0.0.0/8             md5
```

Dockerが使いそうなIPアドレスの範囲を書いておきます。
設定ファイルを書き換えたらPostgreSQLを再起動しておきます。

postgresql.confも書き換えておきます。

```
listen_addresses = '*'
```
curlで「Couldn't resolve host」エラーが出た場合の対処

仮想環境(Vagrant)で、curlを試したところ下記のエラーが出ました。

```bash
[root@vagrant-centos65]# curl http://www.yahoo.co.jp
curl: (6) Couldn't resolve host 'www.yahoo.co.jp'
```

/etc/resolv.confのDNS設定がおかしい為に取得失敗していたようです。

```/etc/resolv.conf
nameserver 8.8.8.8
```

上記のように修正し、apacheを再起動しcurlを再実行すると
うまくいきました。
快適なC++生活のためにスクリプト言語を使おう　pythonで検証してからのC++実装

　今日もPythonでプロトタイピングして、そのアルゴリズムがうまくいくことを確かめました。

1. アイディアをPythonで書いてみる。
2. 結果をグラフ化して、1枚のfigureの中でうまくいっていることが分かるようにする。(Spyder統合環境)
3. 複数のデータセットで、うまくいくことを確かめる。
4. 別のデータセットでもうまくいくことを確かめる。
5. pylint で書き方を標準化する。
6. 関数にドキュメンテーションコメントを書く。
7. アルゴリズムの根幹の部分と、グラフ作成などの補助機能との区別を意識する。
8. アルゴリズムの根幹の部分を別モジュールにする。
9. 必要があれば、クラスを作成する。
10. pythonでの設計・実装・ドキュメンテーションコメント・実行結果の確認を完了する。
11. C++で実装する必要がある部分を明確化する。
12. C++で実装する部分を、python実装を参照にして開発に着手する。
13. pythonの中で用いたモジュールのC++があれば、それを使って書く（例cv2.imread()　→ cv::imread())。
14. べた書きでもいいから動くようにする。
15. あるべき実装、モジュール化（もしくはクラス化）をする。
16. それをコマンドラインアプリケーションとして実装したうえで、複数の条件でテストする。
17. 可能な引数にconst 修飾子をつける。データメンバーのprivate化、namespaceの利用などをする。
18. Doxygenで利用するためのドキュメンテーションコメントを書く。
19. モジュールとして組み込むためのライブラリのソースコード、ヘッダファイル、stand-alone用の実行ファイル用のmain関数のソースコードに分離する。
20. 公開する必要のない関数は無名名前空間の中に閉じ込める。
21. メソッド名、関数名、引数の変数名は、それ自体がドキュメントになるような分かりやすい名前になっているか見直して、必要に応じて名前を変更する。
21. 目的の使い方に適した単体テストを書く。
22. その単体テストに対して、テストをパスするまでモジュールを改良する。 
23. 単体テストは正常系だけの記述ではなく、異常系の記述もする。
19. テスト完了後のモジュールを、目的のプログラムに組み込む。

このようなやり方で、C++だけで開発するよりは、有効性を早めに検証してから開発をすることができます。

----
付記：
　処理を高速化しようとする場合には

- スクリプトのバージョン管理をする。
- 改版のたびに回帰テストをして、計算結果が劣化していないことを確認する。
- 劣化を生じていないことを確認できる十分な数のテストサンプルを用意してテストする。
- Pythonモジュールのまま処理時間を計測する。
- 計算の中で明示的に2重ループを書くことはしない。適切な関数を使う。
- なぜその処理をしているのか、処理の妥当性のヒントになるコメントを書いて、アルゴリズムをチェックする。
- 演算の順序を入れ替えることで簡略化できる部分を見つけて簡略化する。
- 計算の無駄を減らす。
- 計算の無駄を減らしたときに、処理時間が短くなっていることを確認する。
- 分かりやすい意味のまとまりを意識して、スクリプトを読み直す。

これらを意識しています。
windows10 ubuntu デュアルブートが壊れたのを直す2

[前回] [windowsのブートマネージャーが起動しない。未解決。 - Qiita](http://qiita.com/o-kei/items/b4f176463973d1b681c3)

Windows10でBIOS入れない、CD起動も出来ない場合の対処方法（windows8.1/10）
http://pcrepair.w-pickup.com/post-799/

高速スタートアップ無効はだめ。

マザボのリセットボタン押したり，モニタのケーブルのつなぎ元GPUを変えたりしてたらubuntuブートローダ出たしDVDから起動できた！これは嬉しい回復。

windowsのDVDから起動して
初期状態に戻す→必要なドライブパーティションが見つかりません。
スタートアップ修復→修復できませんでした。
windowsディスクからはダメそう。

biosのセッティングでファストブートをオフにした。

ubuntuから起動して見ようとすると，ログインなんどもループする（解像度も低いまま）の症状。これは前に経験している。
ubuntuから起動してディスクを色々見て見ようと思うので，ubuntu直す。（確かnvidiaのドライバのバージョンが戻ってしまった時の症状だったような・・）

http://www.rokudw.net/archives/66
http://may46onez.hatenablog.com/entry/2016/02/26/020208

やろうとするけど，
ctl+Alt+F1で仮想コンソールたちあげてもログインパスワードがなぜかincorrectになる。

なのでリカバリーモードでrootから同じことをやる
https://wiki.ubuntulinux.jp/UbuntuTips/Others/RecoveryMode

bumblebeeはだめ？（apt-get updateする必要あるみたいな表示が出てやろうとしたら遷移してしまった。
同じことをnvidia-378インストールでもでた。
--fix-missingなんたら。

http://hiroyky.hatenablog.com/entry/2017/01/03/050900

```
$ sudo ubuntu-drivers list
$ sudo ubuntu-drivers autoinstall
$ sudo reboot
```
これでubuntuは起動した〜。あとはwindows。
ReactXPのHelloWorldをWebとiOSとAndroidで自動更新付きで動かしてみたよ


[SkypeチームがReactで真のクロスプラットフォーム目指してる記事](https://microsoft.github.io/reactxp/blog/2017/04/06/introducing-reactxp.html)から10日ほど経ったわけですが、未だにひとつもQiitaに記事がないのはどういうことだ！　寂しい！

ということでとりあえず動かしてみました。

TL;DR
----------

* ハロワを動かしただけです（Windowsは環境の作り方を知らなくて断念）
* 全プラットフォーム同時にLive ReloadしたかったけどWeb版は最低限のwebpack設定しかなくて自分でHMRを組み込みました
* UI実装のトライアンドエラー環境としては面白い試みだなあと思いました

デモ動画
----------

[![ReactXP HelloWorld Live Reloading Demo - YouTube](https://img.youtube.com/vi/-5VkI0dpHek/0.jpg)](https://www.youtube.com/watch?v=-5VkI0dpHek)

[ReactXP HelloWorld Live Reloading Demo - YouTube](https://www.youtube.com/watch?v=-5VkI0dpHek)

ソースコード
----------

* https://github.com/Nkzn/reactxp-livereload-example

モチベーション
----------

ReactXP自体はReactDOMとReact NativeとReact Native Windowsを抽象化して、TypeScript（TSX）で書かれたReactコンポーネントでUI開発ができるようにしたライブラリという認識です。
その性質上、[公式サンプルのpackage.jsonのdependencies](https://github.com/Microsoft/reactxp/blob/b634d79/samples/hello-world/package.json#L20-L28)が結構えげつないことになってます。

```json:package.json
  "dependencies": {
    "reactxp": "0.42.0-rc.1",
    "react": "15.5.3",
    "react-addons-perf": "15.5.0-rc.2",
    "react-addons-test-utils": "15.5.1",
    "react-dom": "15.5.3",
    "react-native": "0.42.3",
    "react-native-windows": "^0.33.0"
  }
```

Web向けな部分は[React Native Web](https://github.com/necolas/react-native-web)と似たようなアプローチで、React Nativeの各種コンポーネント（`<Text>`, `<View>`など）の挙動を`<div>`などでWeb向けに再実装したコンポーネントを提供しています。

React Native Webと似たようなアプローチという点では、実はReactXPはあまり新しいことをしていない気もしてしまうのですが、React Native向けのコードを無理やりWebで動かそうとしていたReact Native Webと比べると、ReactXPのほうが抽象化のアプローチについて筋がいいような印象もあります。

となると、ReactXPの利点の一端を感じるには、Webとネイティブの同時開発を体験するのが一番です。
そんな理由で手を動かしてみました。

Web版にはLive Reloadがない
----------

ハロワを動かして終わりにしようかと思ったのですが、困ったことに公式のハロワには自動更新の仕組みが付いていませんでした。これでは同時開発っぽい見た目にしづらくなってしまいます。

ですが幸いにも、公式サンプルのWeb向けビルドはwebpackで行われています。webpackならHot Module Replacementの仕組みが使えますね。

なんて話を同僚の @circled9 さんとしていたら、早速[HMRの参考実装を作ってくれた](https://github.com/circled9/reactxp-example)ので、ほぼパクらせていただきました。私の方で手を加えたのは `RX.Platform.getType() === "web"` で判定して、React Native側の処理系に影響が出ないようにすることくらいでした。

感想
----------

React Nativeでの開発を行ったときの経験で、AndroidエミュレータとiOSシミュレータをそれぞれLive Reloadモードにすると、UIの確認が非常に捗ることはわかっていました。
ReactXPになっても、そこにWebが加わってきただけという印象なので、トライアンドエラーが捗るなーくらいの感想です。

まあまだ出てきたばかりなので、生暖かく見守っていけばいいんじゃないでしょうか。

銀の弾丸がほしい方向けの注意
----------

React Native単品でも言えることですが、ReactXPもUI開発の一部の課題を解決するだけのツールです。
開発・リリース・運用を円滑に行っていくためには、次のような人材が必要だと私は考えています。

* Androidアプリのビルドやリリースエンジニアリングに造詣が深いAndroidエンジニア
* iOSアプリのビルドやリリースエンジニアリングに造詣が深いiOSエンジニア
* Web SPA向けのJSのビルドやリリースエンジニアリングに造詣が深いJSエンジニア

画面を作るのはできるけどbuild.gradleは読めない、とか、webpackみたいなバンドルツールには触らないで生きていきたい、とか、Xcodeは絶対に触りたくない、といったエンジニアしかいないチームでは導入を見送りましょう。

最後に
----------

だれかWindows版とWeb版を並べてLive Reload動画つくってください。
nginxとmrubyのインストール

備忘録。

```install.sh
sudo apt-get install bison

wget https://nginx.org/download/nginx-1.10.2.tar.gz
tar vxzf nginx-1.10.2.tar.gz

wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.39.tar.gz
tar vxzf pcre-8.39.tar.gz

git clone https://github.com/openresty/lua-nginx-module
git clone git://github.com/matsumoto-r/ngx_mruby.git
cd ngx_mruby
./configure --with-ngx-src-root=~/kuroneco/env/nginx/build/nginx-1.10.2
cp ~/kuroneco/env/nginx/mruby/build_config.rb ./
make build_mruby
make generate_gems_config

cd ../nginx-1.10.2
LUAJIT_INC=/usr/local/include/luajit-2.0 LUAJIT_LIB=/usr/local/lib/ ./configure --add-module=../lua-nginx-module --with-http_stub_status_module --with-http_ssl_module --add-module=../ngx_mruby --with-pcre=../pcre-8.39
make
sudo make install


```
[Swift]変数と定数

# 変数と定数

## 宣言方法

### 変数

- 値の変更が必要な場合
- ``var``を使用

```Swift:変数の宣言
var 変数名: 型名
```

```Swift:変数の宣言
var a: Int
```
  
### 定数

- 値の変更が不要な場合
  - 変更が想定されていない値を更新してしまうミスを防げる
- ``let``を使用

```Swift:定数の宣言
let 変数名: 型名
```

```Swift:定数の宣言
let a: Int
```

### 型アノテーション(_type annotation_)

  - ``: 型名`` の部分
  - 変数/定数の型を明示的に決定する

### 型推論

  - プログラムの文脈から暗黙的に型を決定
  - 代入される値から型が推論できる場合は型アノテーションを省略可能

### 型は宣言時に決定する必要がある

  - 型アノテーション
  - 値の代入(初期化) → 型推論

### 型の確認方法

#### プログラミングによる確認
  
 ``type(of:)``関数を利用

 ```Swift:型の確認
 type(of: 変数/定数名)
 ```

 ```Swift:型の確認
 let a = 123
 type(of: a)  // Int.Type
 ```
   
#### コーディング中の確認

XcodeのQuick Help機能を利用

- 変数/定数にカーソルを合わせて、``Control + Command + ?``
- Quick Help Inspectorを表示して変数/定数にカーソルを合わせる


## 代入方法

### 代入可能な値

- 変数/定数の型と一致するもの
  - 型アノテーションで指定した型
  - 型推論により決定した型

- 代入元となるもの
  - リテラル
  - 他の変数/定数
  - 式
    - 演算子による演算結果
    - 関数の返り値

### 初期化

初期化されていない変数/定数の使用はコンパイルエラー  
→ コンパイル可能なプログラムには未初期化変数/定数へのアクセスは存在しない

### 定数には再代入できない

再代入できないが、初期化は必須ではない

- 代入が一度しか行われないことがコンパイラによって保証されていれば有効

```Swift:定数の代入(OK)
let a: Int
let condition = true

if condition {
  a = 1
} else {
  a = 2
}
```

- 実際には代入が一度しか行われなくてもコンパイラが保証できない場合はコンパイルエラー

```Swift:定数の代入(NG)
let a: Int

for index in [1] {
    a = index
}
```
android:foreground の罠

Viewにタッチフィードバック持たせるときどうしていますか？
何もカスタマイズしないならこんな感じで `android:background` 属性に `?attr/selectableItemBackground` 設定することが多いと思います。

```xml
<View
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/selectableItemBackground" />
```

簡単ですね。

では次に、子の View を持つ ViewGroup に対して子に重ねてタッチフィードバックを表示したいときを考えます。(`android:background` だと子の裏に表示される)
`android:foreground`  を使ってこんな感じに。

```xml
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@android:color/background_light"
    android:foreground="?attr/selectableItemBackground"
    android:orientation="horizontal">

    <ImageView
        android:layout_width="48dp"
        android:layout_height="48dp"
        android:src="@mipmap/ic_launcher" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="16dp"
        android:text="Title" />

</LinearLayout>
```

Nougat 端末で確認して正常に動く！と思ったら、Lollipop で動かない。(タッチフィードバックが表示されない)
ドキュメント見ると API Level1 から存在するのに。。[setForegroundだけど](https://developer.android.com/reference/android/view/View.html#setForeground(android.graphics.drawable.Drawable))

## View の android:foreground は AndroidM から動く

ググるとこんな Issue が。
[View.setForeground wrong API level](https://issuetracker.google.com/issues/37061503)

要は AndroidM で追加されたのにドキュメントでは API Level1  からと誤った情報がのっているぽい。

## ただし、 android:foreground は FrameLayout では動く

`View.setForeground` は AndroidM からだけど、FrameLayout だけは API Level1 から使える。

android 2.0_r1 の FrameLayout に setForeground の存在を確認。(ちなみにAPI level25では消えてた。多分Viewに追加されたから 23でも多分消えてると思う)
http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.0_r1/android/widget/FrameLayout.java#FrameLayout.setForeground%28android.graphics.drawable.Drawable%29

もちろん CardView 等も FrameLayout を継承してるから下位端末で動く。
Raspberry Piでcifsが使えなくなった件

本日（2017/04/15）、Raspberry Pi type 3 model BでWindows共有フォルダ（CIFS）をマウントできなくなった。
cat /proc/filesystemsで確認すると、確かにcifsが存在していない。

<pre>nodev   sysfs
nodev   rootfs
nodev   ramfs
nodev   bdev
nodev   proc
nodev   cpuset
nodev   cgroup
nodev   tmpfs
nodev   devtmpfs
nodev   configfs
nodev   debugfs
nodev   tracefs
nodev   sockfs
nodev   pipefs
nodev   rpc_pipefs
nodev   devpts
        ext3
        ext2
        ext4
        vfat
        msdos
nodev   nfs
nodev   nfs4
nodev   autofs
        f2fs
nodev   mqueue
        fuseblk
nodev   fuse
nodev   fusectl
</pre>

このときのOSバージョンは以下の通り。

<pre>$ cat /proc/version
Linux version 4.4.48-v7+ (dc4@dc4-XPS13-9333) (gcc version 4.9.3 (crosstool-NG crosstool-ng-1.22.0-88-g8460611) ) #964 SMP Mon Feb 13 16:57:51 GMT 2017
</pre>

apt-get update ; apt-get upgradeを実行したのが原因でそうなった可能性がある。
調べたところ、他にも同じ羽目に陥っている人がいた。

https://www.raspberrypi.org/forums/viewtopic.php?&t=15709

現在、上記リンク先に記載のrpi-updateを実行中。
結果が出たら報告する。

# rpi-update実行結果

rpi-updateを実行してOSを再起動したところ、Windows共有フォルダが再びマウントできるようになった。
なお、cat /proc/filesystemsではマウント後にcifsが現れた（つまり、マウント前は現れなかった）。

このときのOSバージョンは以下の通り。

<pre>$ cat /proc/version
Linux version 4.9.22-v7+ (dc4@dc4-XPS13-9333) (gcc version 4.9.3 (crosstool-NG crosstool-ng-1.22.0-88-g8460611) ) #987 SMP Fri Apr 14 23:23:05 BST 2017
</pre>