OmniAICreator/Qiita-1.07M huggingface dataset:
Invoke-WebRequestの文字化け

日本語のwebページを`Invoke-WebRequest`したときに文字化けしていた場合の対処方法

- [Invoke-RestMethodの文字化け対策 - or1ko's diary](http://or1ko.hatenablog.com/entry/2017/12/16/193621)
- [gooラボ 形態素解析APIを試してみる - pierre3のブログ](http://pierre3.hatenablog.com/entry/2014/12/13/001743)
    - 「レスポンスのエンコーディングについて」の項

# コード

```powershell
$resp = Invoke-WebRequest $url
```

このときの`$resp.Content`が文字化けしていた場合の対処方法

## 本来のエンコードがUTF8の場合

```powershell
[System.Text.Encoding]::UTF8.GetString( [System.Text.Encoding]::GetEncoding("ISO-8859-1").GetBytes($resp.Content) )
```

## 本来のエンコードがShift_JISの場合

```powershell
[System.Text.Encoding]::GetEncoding("Shift_JIS").GetString( [System.Text.Encoding]::GetEncoding("ISO-8859-1").GetBytes($resp.Content) )
```

他のエンコードの場合はこれを参考に都度対応を。。

# 原因

サーバからのレスポンスに`charset`の指定が無いため、らしい。
http://pierre3.hatenablog.com/entry/2014/12/13/001743

> Invoke-RestMethod コマンドレットは、レスポンスヘッダ（Content－Type ;charset？) を見てエンコーディングしてくれるようなのですが、 このAPIのレスポンスヘッダにはcharsetの指定が無いようなのです。
その場合ってどうなるの？
> 
> 以下にその答えがありました。
https://social.technet.microsoft.com/Forums/windowsserver/en-US/d795e7d2-dcf1-4323-8e06-8f06ce31a897/bug-invokerestmethod-and-utf8-data?forum=winserverpowershell
> 
> どうやらcahrsetの指定がない場合は ISO-8859-1 でエンコーディングされるらしい。

イマドキの一般のwebサイトであればこの対応が必要になることは少ないかもしれないが、社内向けの手作り感満載のお知らせ一覧をスクレイピングするとき等に知っていると良いかも。

# Invoke-RestMethodの場合

これは上記処理無しでレスポンスボディ部分をオブジェクトとして変換済みになってしまっているので、`Invoke-WebRequest`を使うようにしてエンコード変換を行い、その結果を`ConvertFrom-Json`でJSON形式文字列をオブジェクトに変換してやればOK
[メモ]Macのbashをfishに乗り換える

本記事は自分用のfishへ乗り換えるメモ

# fishとは
http://fishshell.com/

カスタマイズするとこんな感じになる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/66178/9e060a2e-0161-1b3b-c0d6-099496f5c1da.png)

Gitブランチの表示や入力補完が結構強力。

# 環境
- 本体
MacBook (Retina, 12-inch, Early 2015)

- OS
MacOS Mojave

# インストール手順
- fishインストール  

```shell
brew install fish
```

- Powerlineのインストール  
https://powerline.readthedocs.io/en/master/installation/osx.html#fonts-installation

```shell
pip3 install --user git+git://github.com/powerline/powerline
```

- Powerline用fontのインストール  
https://github.com/powerline/fonts

```shell
# clone
git clone https://github.com/powerline/fonts.git --depth=1
# install
cd fonts
./install.sh
# clean-up a bit
cd ..
rm -rf fonts
```

- ログインはbashのままにする  
https://qiita.com/tak-onda/items/a90b63d9618d6b15c18c#%E8%A7%A3%E6%B1%BA%E7%AD%96  
`~/.bashrc`に以下を追加する

```bash
# If not running interactively, don't do anything
case $- in
    *i*) exec fish;;
      *) return;;
esac
```

- プラグイン管理ツール導入  
https://github.com/jorgebucaran/fisher#installation

```shell
curl https://git.io/fisher --create-dirs -sLo ~/.config/fish/functions/fisher.fish
```

- Gitのブランチを表示するプラグイン導入  
https://github.com/oh-my-fish/theme-bobthefish

```shell
# fishに切り替えてから実行
fish
fisher add oh-my-fish/theme-bobthefish
```

- ターミナルフォントの変更(iterm2)  
使いたいPowerlineのフォントを検索して適用する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/66178/133d8065-3246-e4ed-1411-eac3a6c58e40.png)
技術書典5でもサークル参加してきた

技術書典4に引き続き、技術書典5でもにこ^2ぷんでサークル参加してきました。
今回は「Thread Intelliegenceの話をしよう」ということで今流行り？のThread Intelliegenceについて書いてみた
[技術書典5](https://techbookfest.org/event/tbf05)

今回は初めて完売できたので、非常に達成感のあった技術書典であった。

#参加動機　テーマ選定
転職してから、会社で今後行うであろうThreat Huntingに興味を持ち、Threat HuntingにつながるThreat Intelligeneceをまず勉強してみようと思った。また、日本ではThreat Intelligeneceはまだ紹介され始めたばかりで、情報が少ないので勉強した成果を共有しようと思った。

#同人誌作成

Threat Intelligeneceに関しては、脅威情報の収集、解析、分析、分析結果から見直しというサイクルを踏むため、本来であれば一連の流れを解説する本を作成したい。但し、解析以前と分析以降では構築すべきコンポーネント、必要とする知識が全く違うということが分かり、これを一冊の本するには、時間が全く足りず、とりあえずは脅威情報の収集、解析までを行うこととした。
脅威情報の収集に関しては、以前より気になっていたMineMeldというOSSをインストールから脅威情報の収集、解析の設定まで行えるような形で記載を行った。
脅威情報の解析では、Splunkを利用して、情報の取り込み、ダッシュボードでの情報可視化まで行った。今回はMineMeldのログのみを取り込んでいるが、実環境ではFirewall、IDS、IPS、Proxyのログを取り込み、相関解析を行うことでよりよい結果が得られるだろう。
同人誌自体はWordで作成していたが、仕事でもかなり使っていた部分が応用できたのでその点はよかった。

同人誌を印刷するに辺り、印刷サービスとして今回もキンコーズを利用した。
相も変わらず、USBメモリのせいでコピー機から直接印刷できないので、PCを借り印刷することとした。
※キンコーズは金曜日になると印刷料金が安くなるキャンペーンを行っているが、PCを借用して印刷する場合には適用されないので注意したい

#書典当日
10/8池袋文化会館に行き、設営を行った。前回の秋葉原UDXと異なり、会場がかなり広くとられている印象であった。
今回はコインケースの準備や事前献本が滞りなく行ったのでスムーズに行けた。
始まってみると、かなりのハイペースで本がさばけ、開始して2時半後には用意した本が無くなってしまった。さばけた後も何人かの方が本が残っているかと尋ねてこられ、需要の見積もりの難しさを感じた。

#振返
今回、初めて用意した本が完売した。
要因を考えてみると、以下が考えられる。


| 要因 　　　　  | 説明|
|--------------|------------|
| 参加人数の増加    |前回と比較し、4千人以上も参加人数が増加しており、買うかもしれない人自体が増加した |
| 本来いるべきジャンル配置された   |今回は、セキュリティのエリアで出展しており、同じセキュリティの本を目当てに来る人のついで買いを誘発できた |
| 前回と比較し内容がとっつきやすい    |前回はコンテストの話を本にしたため、コンテスト自体に興味がないと手に取りづらい。今回は内容がより一般的になり、またタイムリーな話を記載していたので手に取りやすいと感じた。 |

完売した点は大いに自分の達成感を感じることが出来た。
次回に向けては以下のような反省点が挙げられる。

|反省点 　　　　  |内容|
|--------------|------------|
| 運営の情報をあまり見なかった    |今回、あまり運営からの情報を見ないまま、進めてしまったので、事前献本がほぼ電子献本だけであることや立ち読み本の存在を知らないまま進めてしまった。運営からの情報を積極的にとって進めていきたい |
| アピールの不足   |ボードや広告での分かりやすい説明がなく、手に取らないとわからないのはユーザフレンドーではない。twitterでの事前告知や手に取ってくれた方への簡単な説明は出来たのでその点は続けていきたい |
| 購入者の利便性を考える   |後から支払いの導入やBOOTHでの電子版の販売などせっかく興味を持ってくれたユーザが購入しやすかったり、作品を入手できるように環境を整備すべきである |

#自分の戦利品
自分でも以下の本を購入した。いずれの本も技術的に内容が面白く、また表紙や体裁が凝っており、自分の同人誌作りの参考にできる部分が多くある。

- ANALYZING MR.ROBOT
- Splunk Appの作り方　炎のダッシュボードApp編
- IotSecJP Vol.2
- R Markdownでword文書を作ろう
- XFLAG　Tech　Note

特に面白かったのは、ANALYZING MR.ROBOTでいわゆる海外ドラマの解説本なのだが、一瞬表示される画面から色々な推測をしているところや、主人公が使用しているHackingの手口を詳細に解説しており、一度視聴をあきらめたドラマをもう一度見直す気にさせてくれた。
スケールアップ、スケールアウト

# スケールアップ

サーバーのCPUやメモリなどのハードウェアを高性能なものにして、性能をあげる方法。

* データベースに適する
* スケールアップしたサーバーで仮想サーバーを複数動かす考え方もある
* 1台であればロードバランサは必要ない

# スケールアウト

サーバーの数を増やすことで性能をあげる方法。

* webサーバーに適する
* 構築コスト：安い
* 1台サーバーが落ちてもwebサービスを継続できる
* 1台そのものが高性能でなくても良い
* リクエスト振り分けにロードバランサが必要になる
* データの同期の必要がある
* ネットワーク通信の遅延時間を考える必要がある
エディタの改行コード

#改行コードというものを初めて知りました
vimからatomにエディタを変更したのですが、
改行コードがおかしいと言われたので修正しました。
そこで初めて改行コードというものを知りました。

#改行コードの種類
改行コードには「CR（キャリッジリターン）」と「LF（ラインフィード）」の2つが存在します。
またCRとLFの2つを合体させて「CRLF（CR+LF）」を1つの改行コードとして扱う場合もあります。
つまり実質的には「CR」「LF」「CRLF」の3種類の改行コードが存在するわけです。

OSによって設定される改行コードが違うのです。
プログラミングをする人はこの点を意識してくださいね。



#確認方法
***【vimエディタでの確認】***
ファイル内で「:se ff?」コマンドで見れます。
⇒
 fileformat=dos  　　これは（dos）CRLFのこと。
いままでこれでやってたから、
基本の改行コードはCRLFなのでしょう多分。
ってことでAtomの改行コードを見て見ます。

***【atomエディタでの確認】***
https://qiita.com/nyoro_712/items/8c80e32aa49f7a2d2eaf
上記qiitaの「手順」部分を参考に。
CRLFに設定して終了。
デフォルトだと「OS Default」の状態だったので、改行コードが統一されてなかったっぽいですね。
pip install して import するだけで matplotlib を日本語表示対応させる

環境依存もしないですし、面倒臭い設定ファイルの書き換えなども必要ありません。

## 利用方法
### 1. 日本語化モジュールをインストール

#### pip
`pip install japanize-matplotlib`

#### conda 
`conda install -c uehara1414 japanize-matplotlib`

### 2. グラフを表示する前に本モジュールをインポートする
```python
import matplotlib.pyplot as plt
import japanize_matplotlib  # <- これ

plt.plot([1, 2, 3, 4])
plt.xlabel('簡単なグラフ')
plt.show()
```

### 3. 実行！
![demo](https://raw.githubusercontent.com/uehara1414/japanize-matplotlib/master/demo.png "demo")

## リポジトリ
https://github.com/uehara1414/japanize-matplotlib


## アップデート履歴
- 2019/09/08 一部環境においてimport時にエラーが発生する不具合を修正 ([@elnikkis](https://github.com/elnikkis)さん、ありがとうございます)
Redisの概要と導入方法

# Redisとは
keyとvalueの組み合わせでデータを保管できる小さいデータベースのようなもの。
軽量で高速なため、何かしらのデータをキャッシュしておくキャッシュサーバーとして利用されることが多い。

# Redisの特徴
* インメモリデータベース（速い）
* データ永続化（定期的にディスクに書き出す）
* データ構造サーバー（複雑なデータ型を扱うことができる）
* Key-Value Store（キーと値の組み合わせで保存する)


# Redisのデータ構造
* String
* List
* Set
* Sorted Set
* Hash

# 公式サイト
[Redis公式サイト](https://redis.io/)
サイト上でコマンドを実行できるのがすごい。

# インストール方法
HomeBrewを利用してインストールすると楽。

```
$ brew install redis

==> Downloading https://homebrew.bintray.com/bottles/redis-4.0.11.high_sierra.bottle.tar.gz
######################################################################## 100.0%
==> Pouring redis-4.0.11.high_sierra.bottle.tar.gz
==> Caveats
To have launchd start redis now and restart at login:
  brew services start redis
Or, if you don't want/need a background service you can just run:
  redis-server /usr/local/etc/redis.conf
==> Summary
🍺  /usr/local/Cellar/redis/4.0.11: 13 files, 2.8MB
```

# Redisサーバーを立ち上げる

なんかAAが表示されたらredisサーバーが立ち上がってます。

```
$ redis-server

7436:C 30 Sep 00:13:30.747 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
7436:C 30 Sep 00:13:30.748 # Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=7436, just started
7436:C 30 Sep 00:13:30.748 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
7436:M 30 Sep 00:13:30.749 * Increased maximum number of open files to 10032 (it was originally set to 256).
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 4.0.11 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 7436
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

7436:M 30 Sep 00:13:30.751 # Server initialized
7436:M 30 Sep 00:13:30.751 * Ready to accept connections
```

終了方法は、Ctr+Cか、クライアントから終了コマンド`shutdown`を入力する。

# クライアントの起動と終了

## 起動

```
$ redis-cli
```
## 終了


```
$ exit
```


# データの保存場所
`redis-server`を実行したパスに"dump.rdb"というファイルが作成されている。
Awesome-XXから、githubのスターを取る方法(おまけ)

# 概要
Awesome-XXから、githubのリンクをたどって、スター数を取る方法を書いておきます。

# Tips
Nodeのライブラリに、[cheerio](https://github.com/cheeriojs/cheerio)というライブラリがあります。  
XMLやHTMLのパースに、大変便利です。
そのライブラリの友達に、cheerio-httpcliというものがあって、URLからhtmlを取ってこれるので、この2つを使ってごにょごにょすれば、30分もあればスクリプトが出来上がりです。

# 手順
1. たとえば、https://github.com/avelino/awesome-go にアクセスし、ページのソースを出して保存します。
2. github.comで始まるaタグを取得して、そのURLをcheerio-httpcliでパースします。
3. githubのスターは、「social-count js-social-count」というCSSクラス名で書かれているため、それを取得したら終わりです。

# ソース
```javascript:github-star-gather.js
const fs = require('fs')
const che = require('cheerio')
const client = require('cheerio-httpcli')
try {
    if( process.argv.length !== 3 ) {
        console.log('github-star-gather.js 使用方法\n')
        console.log(' node github-star-gather.js <awesome-html-path>\n')
        process.exit()
    }
    const filePath = process.argv[2]
    const body = fs.readFileSync(filePath, 'utf-8')
  dollar = che.load(body);
  dollar("li").each(function(i0, e0) {
    const arefs = dollar(this).children("a")
    arefs.each(function(i1,e1){
      const href = dollar(this).attr("href")
      if( href.startsWith("https://github.com") === true ) {
        const name = dollar(this).text()
        const result = client.fetchSync(href)
        const $ = result.$
        $(".social-count.js-social-count").each(function(i2,e2) {
          const stars = $(this).text().replace(/¥n/g, "").replace(/¥r/g,"").trim()
          console.log(name + "          " + stars + "          " + href)
        })
        return
      }
    })
  })
} catch(err) {
    console.log(err.message)
}
process.exit()
```

# さいごに
くぅー疲れました。  
Markdownの表にして、エクセルに★を出す式を書くところがめんどうでした。
ofxHttpUtilsでのFile送信でContent-Typeを指定する

ofImageでSaveした画像をPOSTしようとしたときに、Content-Typeが`application/octet-stream`となっていて、サーバ側のバリデーションに引っかかってしまったので、その時に行った対応のメモです。

[ofxHttpUtils](https://github.com/arturoc/ofxHttpUtils)

結論からいうと、ofxHttpUtilsのメソッドにContent-Typeの書き換えはなかったので、`ofxHttpUtils.cpp`の書き換えで対応しました。

276行目付近にある下記の記述を

**Before**

```c++
pocoForm.addPart(it->first,new FilePartSource(it->second));
```

**After**

```c++
pocoForm.addPart(it->first,new FilePartSource(it->second, "image/png"));
```

と変更しました。
Pocoの　`FilePartSource` の第二引数がContent-Typeの指定なのでそれを足しています。

以上ニッチな内容ですが参考になれば幸いです。
javascriptで比較演算子の練習

##console.logを使って比較演算子の練習をしてみました

```javascript:qiita.js
var number_1 = 10;
var number_2 = 22;
var string_1 = 'one';
var string_2 = 'two';
//10 と 20 は同じ
console.log(number_1 === number_2);  false
//10 と 20 は違う
console.log(number_1 !== number_2);  true
//10 は 20 より大きい
console.log(number_1 > number_2);    false
//10 は 20 以上
console.log(number_1 >= number_2);   false
//10 は 20 より小さい
console.log(number_1 < number_2);    true
//10 は 20 以下
console.log(number_1 <= number_2);   true
//’one’ は ‘two’と同じ
console.log(string_1 === string_2);  false
//’one’ は ‘two’と違う
console.log(string_1 !== string_2);  true
```
Awesome-go(golangのライブラリリスト)のスター数まとめ-環境設定編(2018/10/9版)

# 概要
Go言語のライブラリのリストに、Awesome-goというものがあります。
- https://github.com/avelino/awesome-go

1500近くのライブラリがリストアップされていて、どれを採用してよいやらわからないため、参考までにgithubのスター数をカウントしました。  
環境設定ライブラリ編です。

これも選定したくて、この作業をしていました。

色を塗りたかったのですが、できなかったため、★の数で表現しました。  
★＝100個越え
★★＝500個越え
★★★＝1000個越え
★★★★＝5000個越え
★★★★★＝10000個越え


## Configuration
Libraries for configuration parsing.

|名前|スター数|githubのURL|スターの多さ|
|:---|:-------|:----------|:-----|
|config|174|https://github.com/olebedev/config|★|
|configure|39|https://github.com/paked/configure||
|confita|176|https://github.com/heetch/confita|★|
|conflate|13|https://github.com/miracl/conflate||
|env|574|https://github.com/caarlos0/env|★★|
|envcfg|87|https://github.com/tomazk/envcfg||
|envconf|7|https://github.com/ian-kent/envconf||
|envconfig|126|https://github.com/vrischmann/envconfig|★|
|envh|88|https://github.com/antham/envh||
|gcfg|95|https://github.com/go-gcfg/gcfg||
|go-up|15|https://github.com/ufoscout/go-up||
|goConfig|80|https://github.com/crgimenes/goConfig||
|godotenv|1,464|https://github.com/joho/godotenv|★★★|
|gofigure|55|https://github.com/ian-kent/gofigure||
|gone/jconf|22|https://github.com/One-com/gone/tree/master/jconf||
|gookit/config|18|https://github.com/gookit/config||
|hjson|147|https://github.com/hjson/hjson-go|★|
|ingo|20|https://github.com/schachmat/ingo||
|ini|1,121|https://github.com/go-ini/ini|★★★|
|joshbetz/config|190|https://github.com/joshbetz/config|★|
|kelseyhightower/envconfig|1,868|https://github.com/kelseyhightower/envconfig|★★★|
|mini|17|https://github.com/sasbury/mini||
|sprbox|3|https://github.com/oblq/sprbox||
|store|229|https://github.com/tucnak/store|★|
|viper|6,424|https://github.com/spf13/viper|★★★★|
|xdg|10|https://github.com/OpenPeeDeeP/xdg||

# 総評
viper一択でしょうか。12 Factor App対応もされていて、環境変数からも読み込めるので。
ReSharperを用いてusingを#regionで畳む

　この度、初投稿です。
　usingを#regionで囲めば可読性が良いと思い、ReSharperで一括で可能だったので方法をメモです。
![RegionCode.PNG](https://qiita-image-store.s3.amazonaws.com/0/257214/fcc55b25-8eff-57c2-57d6-23bfde668f4b.png)

# 試行した環境
+ Visual Studio 2017
+ ReSharper 2018.2.3

# ReSharperのCode Cleanup
1. Code Cleanup画面を開く
1. Configureをクリックして設定
1. Usings - 「Embrace 'using' directives in region」にチェック![CodeCleanupUsings.PNG](https://qiita-image-store.s3.amazonaws.com/0/257214/f6de20c2-e52c-08bb-9719-612d8128415c.png)

1. Saveで保存
1. Runで実行

これでソースコードのusingが#regionで囲まれます。

# Visual Studioで表示の設定(オプション）
Ctrl+M+Oで、まとめて#regionも畳めるようにしておきます。

1. 画面上部メニューより、ツール-オプションでオプション画面を開く
1. テキストエディタ-C#-詳細設定を選択
1. 「定義を折りたたむときに、#regionsを折りたたむ」にチェックを入れる
![VisualStudioOption.PNG](https://qiita-image-store.s3.amazonaws.com/0/257214/1b62aa09-729a-a900-8e1d-77cd2c3c89a8.png)

## 参考サイト
+ https://stackoverflow.com/questions/30620641/collapse-all-regions-only-in-c-sharp-visual-studio

# 終わりに
　regionは使うべきではないというコード規約のチームで仕事したこともありましたし、個人的にもそう思っていました。
　とはいえ、usingについては読むことはほとんどありません。可読性が上がって開発効率が向上に期待。
　なので、ソリューションごと一括でCode Cleanupしてしまいました。これでスッキリ。
Awesome-go(golangのライブラリリスト)のスター数まとめ-Logger編(2018/10/9版)


# 概要
Go言語のライブラリのリストに、Awesome-goというものがあります。
- https://github.com/avelino/awesome-go

1500近くのライブラリがリストアップされていて、どれを採用してよいやらわからないため、参考までにgithubのスター数をカウントしました。  
loggingライブラリ（logger編）です。

これを選定したくて、この作業をしていました。

色を塗りたかったのですが、できなかったため、★の数で表現しました。  
★＝100個越え
★★＝500個越え
★★★＝1000個越え
★★★★＝5000個越え
★★★★★＝10000個越え

## Logging
Libraries for generating and working with log files.

|名前|スター数|githubのURL|スターの多さ|
|:---|:-------|:----------|:-----|
|distillog|13|https://github.com/amoghe/distillog||
|glg|21|https://github.com/kpango/glg||
|glog|1,978|https://github.com/golang/glog|★★★|
|go-cronowriter|15|https://github.com/utahta/go-cronowriter||
|go-log|6|https://github.com/subchen/go-log||
|go-log|19|https://github.com/siddontang/go-log||
|go-log|30|https://github.com/ian-kent/go-log||
|go-logger|190|https://github.com/apsdehal/go-logger|★|
|gologger|38|https://github.com/sadlil/gologger||
|gomol|12|https://github.com/aphistic/gomol||
|gone/log|22|https://github.com/One-com/gone/tree/master/log||
|journald|8|https://github.com/ssgreg/journald||
|log|610|https://github.com/apex/log|★★|
|log|255|https://github.com/go-playground/log|★|
|log|18|https://github.com/teris-io/log||
|log-voyage|80|https://github.com/firstrow/logvoyage||
|log15|802|https://github.com/inconshreveable/log15|★★|
|logdump|7|https://github.com/ewwwwwqm/logdump||
|logex|33|https://github.com/chzyer/logex||
|logger|128|https://github.com/azer/logger|★|
|logo|4|https://github.com/mbndr/logo||
|logrus|8,595|https://github.com/Sirupsen/logrus|★★★★|
|logrusly|24|https://github.com/sebest/logrusly||
|logrus|8,595|https://github.com/sirupsen/logrus|★★★★|
|logutils|227|https://github.com/hashicorp/logutils|★|
|logxi|326|https://github.com/mgutz/logxi|★|
|lumberjack|1,000|https://github.com/natefinch/lumberjack|★★★|
|mlog|15|https://github.com/jbrodriguez/mlog||
|onelog|284|https://github.com/francoispqt/onelog|★|
|ozzo-log|96|https://github.com/go-ozzo/ozzo-log||
|seelog|1,193|https://github.com/cihub/seelog|★★★|
|spew|2,612|https://github.com/davecgh/go-spew|★★★|
|stdlog|44|https://github.com/alexcesaro/log||
|tail|1,205|https://github.com/hpcloud/tail|★★★|
|xlog|3|https://github.com/xfxdev/xlog||
|xlog|126|https://github.com/rs/xlog|★|
|zap|5,285|https://github.com/uber-go/zap|★★★★|
|zerolog|1,410|https://github.com/rs/zerolog|★★★|

# 総評
logrusにしようと思います。知っている人のfirehose-to-syslogでも使っていたので。
LightGBMを一瞬でインストールする方法

最近Kaggleで流行っているLightGBM。
公式の通りにインストールすると手順が多いですが、
Anaconda経由でインストールしたらかなり簡単であったので備忘録として記載します。

公式のインストール手順は以下参照↓
https://lightgbm.readthedocs.io/en/latest/Installation-Guide.html

###インストール手順
MacでもWindowsでも同じ方法です。

MacのTerminal, または、windowsでAnaconda promptを起動し、
以下コマンドを実行するだけです。

```terminal:Terminal
conda install -c conda-forge lightgbm
```

確認が入るのでyを押してEnter。

###追記：CatBoostのインストール

```terminal:Terminal
conda install -c conda-forge catboost 
```
https://anaconda.org/conda-forge/catboost


以上です。
Awesome-go(golangのライブラリリスト)のスター数まとめ-ORマッパー編(2018/10/9版)

# 概要
Go言語のライブラリのリストに、Awesome-goというものがあります。
- https://github.com/avelino/awesome-go

1500近くのライブラリがリストアップされていて、どれを採用してよいやらわからないため、参考までにgithubのスター数をカウントしました。  
ORマッパー（ORM編）です。

色を塗りたかったのですが、できなかったため、★の数で表現しました。  
★＝100個越え
★★＝500個越え
★★★＝1000個越え
★★★★＝5000個越え
★★★★★＝10000個越え

## ORM
Libraries that implement Object-Relational Mapping or datamapping techniques.

|名前|スター数|githubのURL|スターの多さ|
|:---|:-------|:----------|:-----|
|beego orm|17,230|https://github.com/astaxie/beego/tree/master/orm|★★★★★|
|go-pg|2,037|https://github.com/go-pg/pg|★★★|
|go-queryset|349|https://github.com/jirfag/go-queryset|★|
|go-sqlbuilder|69|https://github.com/huandu/go-sqlbuilder||
|go-store|91|https://github.com/gosuri/go-store||
|gomodel|59|https://github.com/cosiner/gomodel||
|GORM|10,678|https://github.com/jinzhu/gorm|★★★★★|
|gorp|2,876|https://github.com/go-gorp/gorp|★★★|
|grimoire|26|https://github.com/Fs02/grimoire||
|lore|4|https://github.com/abrahambotros/lore||
|Marlow|32|https://github.com/dadleyy/marlow||
|pop/soda|454|https://github.com/gobuffalo/pop|★|
|QBS|516|https://github.com/coocood/qbs|★★|
|reform|687|https://github.com/go-reform/reform|★★|
|SQLBoiler|1,561|https://github.com/volatiletech/sqlboiler|★★★|
|upper.io/db|1,346|https://github.com/upper/db|★★★|
|Xorm|3,843|https://github.com/go-xorm/xorm|★★★|
|Zoom|216|https://github.com/albrow/zoom|★|

# 総評
beego orm、gormが一万越え。gormはドキュメントも充実しており使いやすかったです。
Awesome-go(golangのライブラリリスト)のスター数まとめ-Web Framework編(2018/10/9版)

# 概要
Go言語のライブラリのリストに、Awesome-goというものがあります。
- https://github.com/avelino/awesome-go

1500近くのライブラリがリストアップされていて、どれを採用してよいやらわからないため、参考までにgithubのスター数をカウントしました。  
まずは、Web Application Framework（WAF編）です。

色を塗りたかったのですが、できなかったため、★の数で表現しました。  
★＝100個越え
★★＝500個越え
★★★＝1000個越え
★★★★＝5000個越え
★★★★★＝10000個越え

## Web Frameworks
Full stack web frameworks.

|名前|スター数|githubのURL|スターの多さ|
|:---|:-------|:----------|:-----|
|Aero|62|https://github.com/aerogo/aero||
|Air|86|https://github.com/sheng/air||
|Banjo|2|https://github.com/nsheremet/banjo||
|Beego|17,230|https://github.com/astaxie/beego|★★★★★|
|Echo|11,786|https://github.com/labstack/echo|★★★★★|
|Fireball|41|https://github.com/zpatrick/fireball||
|Florest|47|https://github.com/jabong/florest-core||
|Gem|154|https://github.com/go-gem/gem|★|
|Gin|20,951|https://github.com/gin-gonic/gin|★★★★★|
|Gizmo|2,394|https://github.com/NYTimes/gizmo|★★★|
|go-json-rest|3,189|https://github.com/ant0ine/go-json-rest|★★★|
|go-relax|152|https://github.com/codehack/go-relax|★|
|go-rest|109|https://github.com/ungerik/go-rest|★|
|goa|3,056|https://github.com/raphael/goa|★★★|
|Golax|64|https://github.com/fulldump/golax||
|Golf|226|https://github.com/dinever/golf|★|
|Gondola|311|https://github.com/rainycape/gondola|★|
|gongular|402|https://github.com/mustafaakin/gongular|★|
|Macaron|2,547|https://github.com/go-macaron/macaron|★★★|
|mango|329|https://github.com/paulbellamy/mango|★|
|Microservice|44|https://github.com/claygod/microservice||
|neo|377|https://github.com/ivpusic/neo|★|
|Resoursea|29|https://github.com/resoursea/api||
|Revel|10,323|https://github.com/revel/revel|★★★★★|
|rex|24|https://github.com/goanywhere/rex||
|sawsij|2|https://github.com/jaybill/sawsij||
|tango|742|https://github.com/lunny/tango|★★|
|tigertonic|986|https://github.com/rcrowley/go-tigertonic|★★|
|traffic|515|https://github.com/pilu/traffic|★★|
|utron|2,076|https://github.com/gernest/utron|★★★|
|violetear|91|https://github.com/nbari/violetear||
|WebGo|53|https://github.com/bnkamalesh/webgo||
|YARF|45|https://github.com/yarf-framework/yarf||
|Zerver|144|https://github.com/cosiner/zerver|★|

# 総評
Beego、Echo、Gin、Revelが一万越えでした。
Ginは使ったことがあります。軽量WAFです。Revelはフルスタックとのこと。
Railsの処理の流れおさらい

#Railsでの処理はルーティング→コントローラ→ビューの流れで行われている。
なるほど？


##ルーティングとは？
送られてきたリクエストに対してどのコントローラのどのアクションを動かすのかを設定するもの。
「ルートを示しますよ」みたいな？

Railsではルーティングをconfig/routes.rbに記述してある。
このファイルを編集して、新しいルーティングを設定したり、ルーティングを削除したり出来る。

```
http://localhost:3000/tweets　←tweetsがパス
```

```ruby:routes.rb
get 'tweets' => 'tweets#index'
     パス         コントローラー　　　　　　　アクション名
```
tweetsというパスに対応して、tweetsコントローラーのindexアクションを動かす　という設定。

##コントローラーとは？

ルーティングとビューをつなぐ役割。
リクエストが送られてきた際にルーティングが読まれ、対応するコントローラーが動く。その後、コントローラーが指定したビューが読みこまれる。
コントローラー内にアクションを定義する。


コントローラーの作成/削除方法は、

```
rails g controller コントローラ名
# コントローラを作成

rails d controller コントローラ名
# 作成したコントローラを削除
```

##ビューとは？
見た目の部分。htmlとか。
一連の流れのレスポンスとして返されるのは、ビューファイルのデータ。ビューファイルは、~~コントローラーのアクション１つにつき１つ存在する。~~


>create
update
destroy
は対応するビューファイルを持たない。他のアクション用のビューファイルを流用したり、リダイレクトしたりするから，同名のビューファイルを持っていない。

具体的には、「コントローラと同じ名前のフォルダ」内の「アクション名と同じファイル名」のビューファイルが返される。
SukuliXでのログイン挙動チェックサンプル

# 動作チェックとしてのRPA
テストサーバや本番サーバにDeployした際にRPAで最低限の動作チェックが行えると素敵よねー、と友人と話してたのでサンプルです。
[Selenium](https://www.seleniumhq.org/)でも（試してないですが、おそらく）できるんですが、それはそれで。

# 前記事
[MacへのSikuriXの導入](https://qiita.com/dzzds/items/728ff14a42bd9f0f8513)
[SukuliXでのHello World(RPA的な動作なし)](https://qiita.com/dzzds/items/6deb971bac770745adc9)

# 動作チェック(サンプル)の挙動
サンプルは「存在しないID/PASSを入力してログイン失敗を確認する」ものになります。
ポップアップで成否を通知していますが、この辺をちゃんとした形で記録取る＋開発者に通知することで、テスト結果を以ってOK/NGを自動的にテストをできる形になると思います。

# コード
IDE上はこんな感じです。
![スクリーンショット 2018-10-09 20.36.50.png](https://qiita-image-store.s3.amazonaws.com/0/280550/6471b840-f69e-3d14-e220-b1242a647d58.png)

```sample_qiita_login.py
import sys
import webbrowser

reload(sys)
sys.setdefaultencoding("SHIFT_JISX0213")

open_url = 'https://qiita.com/'

# ポップアップとして表示
print('処理開始')
popup(u'処理開始')

# ChromeでQiitaを開く
webbrowser.open_new(open_url)

# 「ログイン」を探してクリック
click("1539084120210.png")
# ID/PASSを入力 ※テストなので存在しないID/PASSです
click("1539084564863.png")
type('testid')
type(Key.TAB)
type('testpass')

# ログインボタンを押下
click("1539084365052.png")

# ログインに失敗を確認
if exists("1539084401883.png"):
    print('ログインに失敗をちゃんと検知しました')
    popup(u'ログインに失敗をちゃんと検知しました')

# ポップアップとして表示
print('処理終了')
popup(u'処理終了')
```

[webbrowser.open_new()](https://docs.python.jp/3/library/webbrowser.html)は標準ブラウザで開く関数です。

左上の「スクリーンショットを撮る」を押すと、範囲指定のキャプチャ画面になります。キャプチャ撮ったらそのまま編集画面に挿入されます。
保存はpythonスクリプトと同フォルダになります。
自分で撮ったキャプチャを指定することも可能。

参考のキャプチャ画像内には無いですが、右の方の実行ボタンを押せばスクリプトが開始されます。

動かしてみるとわかると思うんですが、ユーザが操作するのと同じようにきちんとポインタが動いたりしてクリックを行なってくれます。DOM解析してクリックやら入力する形ではなく、描画から要素を選択したり入力したりしてくれるので、チェックを掛けるには良いツールじゃないかと思います。
AngularDartのアプリをNetlifyでデプロイする

# 課題

AngularDartで意気揚々とWebアプリを作成したものの、[Netlify](https://www.netlify.com/)にデプロイする方法は[公式ドキュメント](https://www.netlify.com/docs/)から発見することができませんでした。

npm/ruby/python/goは対応していますが、残念ながらDartは**まだ**[^1]のようです。

# 解決策

ドキュメントには見当たりませんでしたが、Netlifyの仕組み上**シェルコマンドは実行する**ことができます。そこで、以下のスクリプトをリポジトリに配置し、これを呼び出すことで無事デプロイできるようになりました！

やっていることはdartのSDKを落としてきて`build`を走らせているだけです。DART_VERの部分は要件に応じて変更して下さい。

```bash
#!/usr/bin/env bash

set -eux

DART_VER='2.1.0'

curl -o dart.zip https://storage.googleapis.com/dart-archive/channels/stable/release/${DART_VER}/sdk/dartsdk-linux-x64-release.zip
unzip dart.zip

PUB=./dart-sdk/bin/pub
${PUB} global activate webdev
${PUB} get .
${PUB} global run webdev build --output=web:build
```

Netlify上での設定は、上記スクリプトを呼び出すのと`build`フォルダをデプロイ元に指定すれば完了です。

<img width="738" alt="Screen Shot 2018-10-09 at 21.39.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/49432/9c1e7356-11c7-77b1-bc58-f907797377cb.png">

# 余談

Netlifyのお手軽感は素晴らしいですね。私も長らく個人サイトをNetlifyでデプロイしていますが、今後はWebサービスでも積極的に使ってゆきたいです。これで無料、素敵。


[^1]: 期待がこもっています。Flutter効果で頑張ってほしい
来客用 (？) サーバ環境を構築した

某氏から「GPU サーバ[^gpu]貸して」と言われたので、貸すことにした。

[^gpu]: [機械学習用の GPU マシンを組んだ - ほとラボ](https://blog.hotolab.net/entry/zbox)

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">GPU動くマシンの手配に目処が立ったので本格的にPerCUDA再開していきたい. もはやPerlでGPGPUとかいう時代ではないが趣味だ!!!! まずはCUDA::DriverAPI的なモノ作り直す(いいもの作る)所からスタートかなあ...</p>&mdash; ぱぴっくすびぃなす (@__papix__) <a href="https://twitter.com/__papix__/status/1044558914077904897?ref_src=twsrc%5Etfw">September 25, 2018</a></blockquote>

ただし物理的に貸すわけにはいかないので、リモートでログインして使ってもらうことにした。

## 自宅ネットワークまで接続してもらう
既に自宅の EdgeRouter X では VPN サーバが稼働していて、このアカウントを新しく発行するだけで自宅ネットワークまで接続してもらうことができた。

今回はこの話は割愛。

## ログインしてもらうためのコンテナを作る
仮想環境に入ってもらえば好き勝手使ってもらって大丈夫やろ、ということで Docker で SSH できるコンテナを作ることにした。

``` Dockerfile:Dockerfile
# GPU を利用する目的で貸し出すので CUDA Toolkit が入ってるイメージをベースにする
FROM nvidia/cuda:9.0-devel-ubuntu16.04

# sshd を入れる
RUN apt update \
  && apt install -y openssh-server \
  && rm -rf /var/lib/apt/lists/*

# このディレクトリを作っておかないと sshd 起動時に怒られる
RUN mkdir -p /var/run/sshd

# 利用する人の公開鍵 URL
ARG SSH_KEY_URL=https://github.com/papix.keys

# 公開鍵を配置する
RUN mkdir -p /root/.ssh \
  && cd /root/.ssh \
  && chmod 700 . \
  && wget ${SSH_KEY_URL} -O authorized_keys -q \
  && chmod 600 authorized_keys

# 何故かこれを書いておかないと nvcc にパスが通らない
RUN echo "export PATH=$PATH" >> /root/.bashrc

# sshd を起動する
CMD ["/usr/sbin/sshd", "-D"]
```

イメージをビルドする。

``` console
$ docker build . -t cuda-sshd:papix
```

`Makefile` を書いて簡単に管理できるようにしておく。

``` Makefile:Makefile
.PHONY: run start stop sh

USER=papix
IMAGE=cuda-sshd:${USER}
NAME=${USER}-gpu
PORT=10022

run:
        docker run -d \
                --runtime=nvidia \
                -p ${PORT}:22 \
                -h ${NAME} \
                --name ${NAME} \
                ${IMAGE}

start:
        docker start ${NAME}

stop:
        docker stop ${NAME}

sh:
        docker exec -it ${NAME} bash
```

コンテナを起動する。

``` console
$ make run
```

## おわり
あとは「我が家の VPN に繋いだら `root@<サーバアドレス>:10022` に SSH してくれ、公開鍵は配置しておいたから」と伝えれば終了。

コンテナ内のデータは永続化していないので、誤ってコンテナを削除[^prune]してしまわないようにだけ注意が必要。

[^prune]: コンテナ止まってるときにうっかり `docker system prune` してしまいがち
macにlaravelをインストール

##### 久しぶりにPHPのおさらいがてらLaravelをインストールしました。
###### ①macのPHPが5.6だったので7.2にバージョンアップ
```terminal:
$ php -v
PHP 5.6.33 (cli) (built: Jan  8 2018 14:11:21) 
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
```
brew search php@ で検索できなかったのでbrew update

```terminal:
$ brew search php@7
No formula found for "php@7"
```
brew updateでエラー発生。

```terminal:
$ brew update
Warning: php@5.6 is outdated!
To avoid broken installations, as soon as possible please run:
  brew upgrade
Or, if you're OK with a less reliable fix:
  brew upgrade php@5.6
Error: Could not link:/usr/local/share/man/man1/brew.1

Please delete these paths and run "brew update".
Error: Could not link:/usr/local/share/doc/homebrew
```
```terminal:
$ rm -rf /usr/local/share/man/man1/brew.1
$ rm -rf /usr/local/share/doc/homebrew
```
```terminal:
$ brew install php@7.2
```
```terminal:
$ brew install composer
```

あとはlaravelの公式サイトでインストールを続ける。
もうlodashなんていらないなんて言わないよ絶対: iteratee編


[Lodash/Underscoreは必要ない（かも） \- Qiita](https://qiita.com/ossan-engineer/items/ad5313d84da82c6ac421)

「lodashいらんやん、jsネイティブで同じの使えるやん」と言われて久しいですが、やっぱりlodash便利です。  
たとえば**map**

```js
var users = [
  {
    name: 'Alice',
    age: 18,
    sex: 'female'
  },
  {
    name: 'Bob',
    age: 23,
    sex: 'male'
  },
  {
    name: 'Charlie',
    age: 54,
    sex: 'male'
  }
];
```

このような配列があります。ここから`name`だけを取り出した配列を作るにはどうすればいいでしょうか。

```js
// js native
users.map(function(user) {
  return user.name;
});

// lodash
_.map(users, 'name')
```

lodashでももちろんjsと同じ書き方ができますが、本来functionを渡すべき引数にstringを渡すと[\_\.property](https://lodash.com/docs/4.17.10#property)が呼ばれます。

```js
// _.property Example
var objects = [
  { 'a': { 'b': 2 } },
  { 'a': { 'b': 1 } }
];
 
_.map(objects, _.property('a.b'));
// => [2, 1]
 
_.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
// => [1, 2]
```

その結果このようなショートハンドが使えます。便利。

続いて今度は`filter`を使って`sex==='male'`のobjectを抽出してみましょう。

```js
// js native
users.filter(function(user) {
  return user.sex === 'male';
});

// lodash with object
_.filter(users, {sex: 'male'});
// lodash with array
_.filter(users, ['sex', 'male']);
```

もちろんjsネイティブの`function`を渡す方法はlodashでもできますが、関数じゃなく`Object`を渡すと[\_\.matches](https://lodash.com/docs/4.17.10#matches)が呼ばれます。

```js
// _.matches Example
var objects = [
  { 'a': 1, 'b': 2, 'c': 3 },
  { 'a': 4, 'b': 5, 'c': 6 }
];
 
_.filter(objects, _.matches({ 'a': 4, 'c': 6 }));
// => [{ 'a': 4, 'b': 5, 'c': 6 }]
```  
Arrayだと[\_\.matchesProperty](https://lodash.com/docs/4.17.10#matchesProperty)が呼ばれます。

```js
// _.matchesProperty Example
var objects = [
  { 'a': 1, 'b': 2, 'c': 3 },
  { 'a': 4, 'b': 5, 'c': 6 }
];
 
_.find(objects, _.matchesProperty('a', 4));
// => { 'a': 4, 'b': 5, 'c': 6 }
```

引数の型によってそれぞれに振り分けているのが[\_\.iteratee](https://lodash.com/docs/4.17.10#iteratee)です。  
 
```js
// _.iteratee Example
var users = [
  { 'user': 'barney', 'age': 36, 'active': true },
  { 'user': 'fred',   'age': 40, 'active': false }
];
 
// これは `_.matches` のショートハンドだよ！
_.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));
// => [{ 'user': 'barney', 'age': 36, 'active': true }]
 
// これは `_.matchesProperty` のショートハンドだよ！
_.filter(users, _.iteratee(['user', 'fred']));
// => [{ 'user': 'fred', 'age': 40 }]
 
// これは `_.property` のショートハンドだよ！
_.map(users, _.iteratee('user'));
// => ['barney', 'fred']
```

この関数は関数を返します。  
1. 関数を渡したらそのままの関数を返します
2. Objectを渡すと[\_\.matches](https://lodash.com/docs/4.17.10#matches)を返します
3. Arrayを渡すと[\_\.matchesProperty](https://lodash.com/docs/4.17.10#matchesProperty)を返します
4. それ以外だと[\_\.property](https://lodash.com/docs/4.17.10#property)を返します

lodashの配列操作メソッドの多くはこの[\_\.iteratee](https://lodash.com/docs/4.17.10#iteratee)を実装しています。  
`map`だろうが`countBy`だろうが`some`だろうが`find`だろうが`findIndex`だろうが、とても多くのメソッドで使えます。

さらに自分自身で配列操作の関数を書く時に使えば上の機能を簡単に実装できます。

もちろんlodashは配列操作や反復処理だけじゃないのでまだまだ魅力は尽きないのですが、この`iteratee`というメソッドだけでも便利すぎて歌いたくなります。

> もうlodashなんていらないなんて言わないよ絶対

続く(かも)
RxJavaカスタムオペレータ作成時の自分用テンプレ（ただしKotlinで）

RxJavaでカスタムオペレータを作るときの自分用テンプレ。

少しだけ解説すると、noOpは何も加工しません。
myMapは、Observable#map(Function<? super T,? extends R> mapper)と機能は変わりません。
errMapは、流れてきたエラー捕まえて加工したあと、再度エラーを流します。

カスタムオペレータを書く動機になったのは、そのオペレータのうちerrMapです。
流れてきたExceptionを加工したくなったときに、Observableでは提供されていないようなので自作しました。




```kotlin
class LiftTest {
    fun <T> Observable<T>.noOp(): Observable<T> {
        return lift { observer ->
            object : Observer<T> {
                override fun onComplete() { return observer.onComplete() }
                override fun onSubscribe(d: Disposable) { return observer.onSubscribe(d) }
                override fun onNext(t: T) { return observer.onNext(t) }
                override fun onError(e: Throwable) { return observer.onError(e) }
            }
        }
    }

    fun <U, D> Observable<U>.myMap(func: (U) -> D): Observable<D> {
        return lift { observer ->
            object : Observer<U> {
                override fun onComplete() { return observer.onComplete() }
                override fun onSubscribe(d: Disposable) { return observer.onSubscribe(d) }
                override fun onNext(t: U) { return observer.onNext(func(t)) }
                override fun onError(e: Throwable) { return observer.onError(e) }
            }
        }
    }

    fun <T> Observable<T>.errMap(func : (Throwable) -> Throwable): Observable<T> {
        return lift { observer ->
            object : Observer<T> {
                override fun onComplete() { return observer.onComplete() }
                override fun onSubscribe(d: Disposable) { return observer.onSubscribe(d) }
                override fun onNext(t: T) { return observer.onNext(t) }
                override fun onError(e: Throwable) { return observer.onError(func(e)) }
            }
        }
    }

    @Test
    fun カスタムオペレータのテスト() {
        Observable
                .just(1)
                .noOp()
                .test()
                .assertValues(1)
        Observable
                .just(1)
                .myMap { it + 2 }
                .test()
                .assertValues(3)
        Observable
                .just("abc")
                .myMap { it.count() }
                .test()
                .assertValues(3)
        Observable
                .just(1)
                .errMap { RuntimeException(it) }
                .test()
                .assertValues(1)
        Observable
                .error<Int>(Exception())
                .errMap { RuntimeException(it) }
                .test()
                .assertError(RuntimeException::class.java)
    }
}
```

もう少しerrMapを作りたくなった背景を書いておきます。
Retrofit2のHttpException#response()#errorBody()のエラーレスポンスの中味を２回読む必要がありました。
しかし、OkHttp3のResponseBody#string()メソッドが破壊的なため、２回コールしたいけど１回しか許されていません。自作ExceptionでいったんResponseBodyの文字列を退避する必要に迫られ、そのときerrMapで自作Exceptionに変換したという次第です。

Kotlinの拡張関数使って、Observableのメソッドを拡張してます。
Swiftのバージョンを上げるとCarthage経由でインストールしたパッケージでエラーが起きる ( importでエラー )

いきなりですが、
この度Xcode10にアプデすることにしました。(旧バージョンはXcode9.4)

iOS開発者ならライブラリとSwiftとのバージョン管理は嫌でも通らなければならない道ですが、
毎回下記のエラーに毎度人生の時間を費やすので(これもライブラリ使っている代償)
この機会に記録にしようと考えました。

```
Module compiled with Swift 4.1 cannot　be imported by the Swift 4.2 compiler: ~~~
```

## 原因
**コンパイルしてるバージョンとimportしてるバージョンの差分がある**
って言われており、Carthageで入れているパッケージ周りでよくこのエラーが起きます。


## 解決策


まず、選択しているXcodeのバージョンが正しいか確認します。

```
$ xcode-select -print-path
...
/Applications/Xcode.app(⇦注目)/Contents/Developer
```

ここで対象のXcodeのバージョンが**Xcode10.0.app**に相当するものになっていれば大丈夫です。
もし対象のバージョンが古いものだった場合は、

```
$ sudo xcode-select -switch /Applications/Xcode10.0.app(⇦ここ)/Contents/Developer
```
で、**Xcode10.0.app**に相当するものに選択を変更してあげましょう。



####実際のアップデート

他のサイトなどを見ていると、下記のコマンドを推奨してたりします。
(実際にアップデートしても良いのです**が、**)

**方法①**

```
$ carthage update
```

**↑このまま打ってしまうとビルド時間がながくなるなり、10分~15分は平気で時間をとられてしまうので**

**方法②**

```
$ carthage update RxSwift
```
みたいな感じで `RxSwift` の箇所を**アップデートしたいライブラリ名に変更**してあげれば、対象のライブラリのみアップデートできます。
**(あ、コマンド打つ前に...)**


####プラットフォームの指定

ちなみに上記のコマンドだと、iOS以外のプラットフォーム向けにもビルドが走ってしまします。
時間がかかってしまい勿体無いので、以下のオプションでプラットフォームを指定出来ます。

```
carthage update --platform iOS,macOS(⇦カンマ区切りでプラットフォームを指定) RxSwift
```
したがって (iOSを対象にしてビルドを行うのであれば)

```
carthage update --platform iOS RxSwift
```
で問題なくアップデートが走るはずです。


以上で、大体のライブラリはビルドできるようになったのではないでしょうか。
上記の手順でうまくいかない場合は、XcodeやMacを再起動するなどしてみてください。


前職は金融系の開発をしていたので、外部のライブラリを使うことは限られていました。
現在はtoCのプロダクトを開発しており、開発効率を上げるために様々なライブラリを使っています。
つまり、バージョン管理は避けては通れない道ということなので頑張っていこうと思います。


ではこの辺で失礼します。
C言語でクイックソート

# クイックソートとは
実用上最も高速といわれる有名なアルゴリズム。

- 分割統治法による整列アルゴリズム
  - 列を2つに分割して、それぞれを整列していく。

##### 手順：
1. pivot（軸となる要素）を1つ選び、pivotより小さい部分列と大きい部分列に分ける
2. 小さい側をクイックソート
3. 大きい側をクイックソート

# サンプルプログラム
ここでは、int型の配列を、クイックソートを用いて小さい順に整列する。

```c:quick_sort.c
#include<stdio.h>

/* 値を入れ替える関数 */
void swap (int *x, int *y) {
  int temp;    // 値を一時保存する変数

  temp = *x;
  *x = *y;
  *y = temp;
}

/***
* pivotを決め、
* 全データをpivotを境目に振り分け、
* pivotの添え字を返す
***/
int partition (int array[], int left, int right) {
  int i, j, pivot;
  i = left;
  j = right + 1;
  pivot = left;   // 先頭要素をpivotとする

  do {
    do { i++; } while (array[i] < array[pivot]);
    do { j--; } while (array[pivot] < array[j]);
    // pivotより小さいものを左へ、大きいものを右へ
    if (i < j) { swap(&array[i], &array[j]); }
  } while (i < j);

  swap(&array[pivot], &array[j]);   //pivotを更新

  return j;
}

/* クイックソート */
void quick_sort (int array[], int left, int right) {
  int pivot;

  if (left < right) {
    pivot = partition(array, left, right);
    quick_sort(array, left, pivot-1);   // pivotを境に再帰的にクイックソート
    quick_sort(array, pivot+1, right);
  }
}

int main (void) {
  int array[10] = { 2, 1, 8, 5, 4, 7, 9, 0, 6, 3 };
  int i;

  printf("Before sort: ");
  for (i = 0; i < 10; i++) { printf("%d ", array[i]); }
  printf("\n");

  quick_sort(array, 0, 9);

  printf("After sort: ");
  for (i = 0; i < 10; i++) { printf("%d ", array[i]); }
  printf("\n");

  return 0;
}
```

実行結果

```
Before sort: 2 1 8 5 4 7 9 0 6 3
After sort: 0 1 2 3 4 5 6 7 8 9
```

# 性能

- 平均計算量は$O(n\log n)$
- 最悪計算量は$O(n^2)$
  - pivotにより列を2分割するが、これが左右に偏ってしまうと分割数が多くなり時間がかかる
  - できるだけ2等分に近い分け方をすると、効率が良くなる
      - 中央値をpivotにするとか
リモートLinux上のSyncthingのWebUIを表示する方法

リモートのLinuxのSyncthingのWebUIを表示するには、まずSSHポートフォワーディングでリモートのWebUIのポートをポートフォワーディングする:

```
ssh -L 9999:localhost:8384 $リモートホスト名
```

次に、ブラウザで localhost:9999 にアクセスする。
Rubyで継承をつかってみる

継承ってオーバーライドできた、、ような、、
という不安感から、実際にためしてみました。
まずはクラスとメソッドを書いて実行してみます。

```ruby
class Human
  def greet
    puts "I'm Human"
  end
end

human = Human.new
human.greet
```
```
I'm Human
```

Humanクラスのインスタンスを作って、メソッドを実行しました。
人間クラスを作ったので、挨拶してくれるメソッドをつくりました。
greetメソッドです。
ちゃんと、I'm Human
が出力されました

```ruby
class Human
  def greet
    puts "I'm Human"
  end
end

class Programmer < Human
  def greet
    puts "I'm Programmer"
  end
end

human = Human.new
human.greet
programmer = Programmer.new
programmer.greet
```
```
I'm Human
I'm programmer
```

今度はオーバーライドしてみました。
オーバーライドによってHumanクラスのgreetメソッドを上書きして
メソッドの内容を書き換えたので、
出力結果は、I,m Programmer
となっています。
もしも、上記でProgrammerクラスを

```
class Programmer < Human
end
```

このように記述していた場合は、

```
programmer.greet
```

の出力は、　I'm Human
になります。
また、親クラスのメソッドを呼び出したいときは、superを使います。

```ruby
class Human
  def greet
    puts "I'm Human"
  end
end

class Programmer < Human
  def greet
    puts "I'm Programmer"
    super
  end
end

programmer = Programmer.new
programmer.greet
```
```
I'm programmer
I'm Human
```

このように、Programmerクラスのメソッドの中で
super
を使うことによって、親クラスのメソッドを呼び出すことができます。

そのほかにも、親クラスを知る方法や(superclass)
~~親クラスはこれでいいんだよね？といったような確認をとるメソッドもあります。~~
親クラスだけではないそうです。指摘いただきありがとうございました。
（レシーバが属するクラスだけでなく、レシーバが属するクラスの親クラスやインクルードしているモジュールをklassに指定してもtrueが返ります。[is_a?](https://ref.xaio.jp/ruby/classes/object/kind_of)Rubyリファレンス）

```ruby
class Human
  def greet
    puts "I'm Human"
  end
end

class Programmer < Human
  def greet
    puts "I'm Programmer"
  end
end

human = Human.new
human.greet
programmer = Programmer.new
programmer.greet
puts programmer.is_a? Human
puts Programmer.superclass
```
```
I'm Human
I'm programmer
true
Human
```

注意点として今回の場合は
puts programmer.superclass でインスタンスに対してsupercclassメソッドを実行してもエラーになります。classに対して実行しましょう。

×　programmer.superclass
○　Programmer.superclass

インスタンス　　に対してではなく、
クラス　　　に対してメソッドを実行しましょう。

is_a?について、
上記プログラムの場合

```ruby
puts programmer.is_a? Human #=>true
puts programmer.is_a? Programmer #=>true
puts programmer.is_a? Object #=>true
```

このような結果になります。
また、kind_of?でも同じ結果となります。
他にも、instance_of?や、class、===
など、いろいろあるので試してみるとおもしろいです。
Docker内のNode.jsサーバーでファイルの変更を検知して自動再起動

docker-composeで構築した環境の中でNode製アプリを実行。
その際にコード修正後のアプリ自動再起動に苦労したのでメモ。

## 使用したライブラリ

- Docker: version 18.03.1-ce, build 9ee9f40
- docker-compose: version 1.21.1, build 5a3f1a3
- nodemon: v1.18.4
- node.js: v8.12.0

## docker-compose.yml
念の為Volumeのマウント設定を併記。
ホストで修正したコードをコンテナ内に同期するために設定しています。

```yaml:docker-compose.yml
services:
  app:
~~
    volumes:
      - ./node-app:/opt/node-app
~~
```

## docker内でのnodemonの起動コマンド
```sh
$ nodemon -L app.js
```
`-L` がポイント。
legacyWatchオプションをONにしないとホストから同期したコードの変更を検知してくれない。
これにはまった。
https://github.com/remy/nodemon#application-isnt-restarting
syncthingをdocker-composeで起動する方法

## はじめに

Syncthingは優れたファイル同期ツールですが、Docker Composeを使うことで簡単かつ効率的に管理できます。この記事では、Syncthingをdocker-composeで起動する手順を、セットアップからトラブルシューティングまで簡潔に説明します。

## 1. 準備

まず、Syncthing用のディレクトリを作成します：

```bash
mkdir -p ~/data
```

> 注意: このディレクトリを事前に作成することで、後々の権限問題を防ぎます。

## 2. docker-compose.ymlの作成

`$HOME`ディレクトリに`docker-compose.yml`ファイルを作成し、以下の内容を記述します：

```yaml
services:
  syncthing:
    image: syncthing/syncthing
    container_name: syncthing
    hostname: my-linux
    environment:
      - PUID=1000
      - PGID=1000
    volumes:
      - ./data:/var/syncthing
    network_mode: host
    restart: unless-stopped
```

### 設定の詳細説明

- `container_name: syncthing`
  - コンテナの識別名です。Docker環境で管理しやすくなります。

- `hostname: my-linux`
  - Syncthingのノード名として使用されます。他のデバイスから識別しやすい名前を設定してください。

- `environment`:
  - `PUID=1000` と `PGID=1000`
    - ホストマシンのユーザーIDとグループIDを指定します。
    - これにより、コンテナ内で作成されるファイルの所有者がホストのユーザーと一致し、権限の問題を防ぎます。
    - 実際の値は `id -u` と `id -g` コマンドで確認し、適切な値に置き換えてください。

- `volumes`:
  - `- ./data:/var/syncthing`
    - ホストの `./data` ディレクトリをコンテナの `/var/syncthing` にマウントします。
    - これにより、Syncthingのデータと設定が永続化され、コンテナを再作成しても失われません。

- `network_mode: host`
  - コンテナにホストのネットワークスタックを使用させます。
  - これにより、Syncthingがローカルネットワーク上の他のデバイスを適切に検出できるようになります。

- `restart: unless-stopped`
  - Dockerデーモンの再起動時やホストマシンの再起動時に、自動的にコンテナを起動します。
  - ただし、手動でコンテナを停止した場合は再起動しません。

## 3. コンテナの起動

以下のコマンドでコンテナを起動します：

```bash
docker-compose up -d
```

## 4. トラブルシューティング

### 証明書の生成エラー

次のようなエラーが発生した場合：

```
Failed to load/generate certificate: save cert: open /var/syncthing/config/cert.pem: permission denied
```

これは`~/data`ディレクトリの所有権の問題です。以下の手順で修正できます：

1. ディレクトリの所有権を確認：

```bash
ls -la ~/data
```

2. 所有権を自分のユーザーに変更：

```bash
sudo chown -R $(id -un):$(id -gn) ~/data
```

## まとめ

以上の手順で、Docker Composeを使用してSyncthingを簡単に起動できます。この方法を使えば、Syncthingの管理が容易になります。

Syncthingの基本的な設定や使用方法については、[Syncthingの公式ドキュメント](https://docs.syncthing.net/)を参照してください。
個人的によく使うLinuxコマンドメモ

# プログラムの実行結果のログを保存
```bash
# 標準出力をリダイレクトで保存(リダイレクトはデフォルトで1が設定)
$ ./program > program.log
$ ./program 1> program.log

# 標準出力と標準エラーを分けて保存
$ ./program 1> program.log 2> program_err.log

# 標準出力と標準エラーを両方とも保存
$ ./program > program.log 2>&1
```

# ssh接続等でログアウトしてもコマンドをバックグラウンドで実行し続ける

```bash
# バックグラウンドで実行しログ(標準出力)を保存
$ nohup ./program > program.log &

# バックグラウンドで実行しログ(標準出力と標準エラー)を分けて保存
$ nohup ./program 1> program.log 2> program_err.log &
```

# 実行中のプログラムのログを表示

```bash
# ログを出力
$ tail program.log

# ログをリアルタイムで出力
$ tail -f -n 10 program.log
$ tailf program.log

# 監視モードで起動( Ctrl+Cで普通のlessに戻り、qで終了 )
$ less +F program.log
```

# テキストの先頭から任意のサイズで切り取る
```bash
$ head -c 1024 a.txt > a1024.txt

# 環境によっては使えないかも
$ head -c 1k a.txt > a1k.txt
$ haad -c 1m a.txt > a1m.txt
```

# 実行中のプロセスの検索
```bash
$ ps aux | grep 検索したい文字列
```
hyperoptで再現性を担保するために必要なパラメータ設定について

#はじめに
hyperoptを使って、パラメータチューニングしてみたが、毎回結果が変わってしまい、困っていました。
乱数の設定方法について、記載されているようなものも少なかったので、自身の備忘録も兼ねて掲載。

#環境
言語：Python
環境：kaggleのkernel（titanicのチュートリアルを行なっていたので。）

# hyperoptにおいて必要なパラメータ設定
fminの引数にrstateがあり、
rstate = np.random.RandomState()
と記述することで、乱数が固定され、再現性を担保できます。
※使用するモデルでの乱数設定や使用データのスプリットにおける乱数設定は忘れずに。

これに気づくまでに１日ほど費やしてしまいました。。。
困ったときは、Helpを見るのが一番ですね。

## インポート
```python
from hyperopt import hp, tpe, Trials, fmin
import numpy as np
from sklearn.ensemble import RandomForestClassifier
```
##hyperopt
```python
hyperopt_parameters = {
    'max_depth': hp.choice('max_depth', range(1,20)),
    'max_features': hp.choice('max_features', range(2,31)),
    'n_estimators': hp.choice('n_estimators', range(100,300))}

def objective(args):
    classifier = RandomForestClassifier(**args,criterion = "entropy",random_state=0,n_jobs=-1)
    logloss = cross_val_score(X=dev_X,estimator=classifier,n_jobs=-1,y=dev_y,scoring="neg_log_loss",cv=3).mean()
    return -1*logloss

max_evals = 300
trials = Trials()

best = fmin(objective,hyperopt_parameters,algo=tpe.suggest,max_evals=max_evals,trials=trials,verbose=1,rstate=np.random.RandomState(0))
```
クロスオリジンリソース共有（CORS)とAccess-Controll-Allow-Originの関係性

React.js で作ったアプリからtwitterのAPI叩くと 'Access-Control-Allow-Origin'headerがないよって怒られるのを２回経験したのでAccess-Controll-Allow-OriginとCORSについて詳しく確認したいと思います。

## TL:DR;

<img width="928" alt="Screen Shot 2018-10-09 at 18.52.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/236412/64904c9b-a391-6d30-f04c-5a1e0cadcfb6.png">

CORS(Cross Origin Resource Sharing) は異なるドメイン間でブラウザによって通信をすることであり、Access-Controll-Allow-OriginはCORSを可能にするための設定である。


## ウェブブラウザのデフォルトの決まりごと

<img width="793" alt="Screen Shot 2018-10-09 at 17.19.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/236412/23bf4e4c-1700-d0b6-0078-85b9615a2b03.png">


- セキュリティ上の理由より、ブラウザはクライアントサイドのスクリプトによって開始されるドメイン間（オリジン間）のHTTPリクエストについて同じドメイン間では無い場合そのHTTPリクエストを受け付けないようにしてある。

- もし異なるドメインにHTTPリクエストを投げたいのであるならリクエストを受け取る側で`Access-Control-Allow-Origin`ヘッダーにリクエストを投げたドメインサーバーが自分のサーバーにアクセスするのを許可する設定を記述すれば良い。

- `access-controll-allow-origin: ドメイン名 `と記述するが` access controll : allow （origin ドメイン名） ` と解釈するとわかりやすくなる気がする。



## 「'Access-Control-Allow-Origin'headerがないよ」って怒られた時の対処法
<img width="876" alt="Screen Shot 2018-10-09 at 17.18.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/236412/abadeebe-407e-df26-9a41-a857cd7ff116.png">



例)twitterのAPIはCORSが許可されていないのでクライエントサイドのreact.jsからAPIを叩くことはできない　。

自分でtwitterのAPIを叩く用のサーバーを立てれば良い。

flaskやnode.jsでサーバーを立ててtwitterのAPIを叩き、そのサーバーでCORSを許可してそのサーバーを叩くことでtwitterのAPIをreact側から間接的に叩く。（俗に言うもう一つサーバーを用意して噛ませると言うこと）
初めてデータ分析業務を担当することになって、読んだ本の一覧と個人的なおすすめ

#おすすめ
##データ分析関係
データ分析を業務に適用するために、どうすればいいのかという観点では、この２冊がおすすめ。
「戦略的データサイエンス入門」では、AUCや混合表といった結果の解釈の仕方が細かく説明されており、非常に勉強になった。

・**戦略的データサイエンス入門**
・**会社を変える分析の力**
・データサイエンティスト養成読本（青、緑、赤）
・統計学が最強の学問である
・手を動かしながら学ぶ ビジネスに活かすデータマイニング
・やさしく学ぶ　機械学習を理解するための数学のきほん　※未読

##統計学
最初は全く意味がわからず、とりあえず読んだという状況であったが、
他の統計学の本を読んだり、実際にデータ分析をした後で、読み返すと、わかるようになってきた感。
データ分析を行う上では、前提となる知識であるため、理解しておくべき内容。

・**統計学入門（通称：赤本）**
・**データ解析のための統計モデリング入門（通称：緑本）**
・統計学がわかる
・入門統計学
・基本統計学
・統計検定2級公式問題
・44の例題で学ぶ統計的手法と推定の解き方

##R
Rの操作方法を学んだのはこの本。
手を動かしながら、読み進めていくことで、Rの操作にも慣れるし、統計学に対しても理解が深まった。ほんと一石二鳥。

・**Rによるやさしい統計学**
・Rによる統計解析

##python
初めて読んだときは、「ふーん、そうなんだ」って感じだったが、データ分析で行き詰まったときに読み返してみると、役に立つ内容ばかりであった。

・**pythonで始める機械学習**
・**ゼロから作るdeeplearning**
・pythonによるデータ分析入門
・入門python3
・python機械学習プログラミング　※未読

##時系列
・沖本本
・Rによる時系列分析入門
・経済時系列と季節調整法

##SPSS
・SPSSによるロジスティック回帰分析
・すぐわかるSPSSアンケートの多変量解析
 
##udemy
まだ未読が多いのだが。。。
キカガクの内容は、後述のCouseraの内容を理解するのに役立った。
微分や線形代数などを簡単に理解しつつ、それらがどのように役立っているのかを説明してくれています。

・**【キカガク流】人工知能・機械学習 脱ブラックボックス講座 - 初級編 -**
・**【キカガク流】人工知能・機械学習 脱ブラックボックス講座 - 中級編 -**
・【世界で5万人が受講】実践 Python データサイエンス
・Tableau（タブロー）で実践！ビジネスユーザのためのデータ集計・視覚化・分析　基礎編
・【4日で体験しよう！】 TensorFlow x Python 3 で学ぶディープラーニング体験講座　※未読
・Python 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイルを学び、実践的なアプリ開発の準備をする　※未読
・ベイズ推定とグラフィカルモデル：コンピュータビジョン基礎1　※未読


##その他
これまで色々な本を読んできたが、結局この動画を理解することが一番という結論に至りました。
あっ、この内容ってCouseraのやつだっていうぐらい、ほとんどの内容がカバーされている感。

・**Cousera**
　　　　・machine learning