OmniAICreator/Qiita-1.07M huggingface dataset:
Re:dash API のタイムアウト設定を変更する

Re:dash でそこそこ大きいデータを Excel ダウンロードしようとするとエラーが発生することがある。
nginx のエラーログに以下のログが出力されていれば、Re:dash コンソールから叩いている API 側でタイムアウトが発生している。

```
2018/05/08 03:16:40 [error] 31782#0: *10976469 upstream prematurely closed connection while reading response header from upstream, ...
```

## 環境
redash.0.10.1.b1834 (公式 AMI で構築した Ubuntu 環境)

## 変更手順

Re:dash の API は Python の flask で実装されていて、gunicorn で起動している模様。
なので、gunicorn の timeout オプションを渡してあげれば OK。

### `/opt/redash/supervisord/supervisord.conf` を編集して、タイムアウト値を設定する

ここでは 300 秒で設定。

```conf
[program:redash_server]
command=/opt/redash/current/bin/run gunicorn -b 127.0.0.1:5000 --name redash -w 4 --max-requests 1000 --timeout 300 redash.wsgi:app
```

### supervisord を reload する

supervisord.conf を編集したら reload が必要となる。
redash_server の worker が再起動される。

```bash
$ sudo supervisorctl reload redash_server
```

ps コマンドを叩くと、オプションが適用されていることが確認できる。

```bash
$ ps aux | grep /usr/local/bin/gunicorn

redash    1437  0.0  0.9 248120 70584 ?        S    May09   0:02 /usr/bin/python /usr/local/bin/gunicorn -b 127.0.0.1:5000 --name redash -w 4 --max-requests 1000 --timeout 300 redash.wsgi:app
redash    2985  0.0  0.9 248232 70680 ?        S    May09   0:00 /usr/bin/python /usr/local/bin/gunicorn -b 127.0.0.1:5000 --name redash -w 4 --max-requests 1000 --timeout 300 redash.wsgi:app
redash    3223  0.0  0.9 248372 70924 ?        S    May09   0:01 /usr/bin/python /usr/local/bin/gunicorn -b 127.0.0.1:5000 --name redash -w 4 --max-requests 1000 --timeout 300 redash.wsgi:app
ubuntu    8441  0.0  0.0  10432   672 pts/0    S+   01:10   0:00 grep --color=auto /usr/local/bin/gunicorn
redash   28836  0.0  0.9 248444 70900 ?        S    May09   0:05 /usr/bin/python /usr/local/bin/gunicorn -b 127.0.0.1:5000 --name redash -w 4 --max-requests 1000 --timeout 300 redash.wsgi:app
redash   32199  0.0  0.1  56780 13876 ?        S    May08   0:16 /usr/bin/python /usr/local/bin/gunicorn -b 127.0.0.1:5000 --name redash -w 4 --max-requests 1000 --timeout 300 redash.wsgi:app
```

### nginx の リバースプロキシのタイムアウト値を設定する

前段に nginx がいるので、こちらのタイムアウト値も設定しておく。
ちなみに設定ファイルは `/etc/nginx/sites-available/redash` にあった。

```conf
proxy_connect_timeout 300s;
proxy_read_timeout 300s;
```

nginx をリロードして反映させれば OK。

```bash
$ service nginx reload
```
Rails/Rspec でケースが fail となった場合にテストを中断する

割りと大きめな Spec を流していて、途中のケースが fail となった場合にその時点でテストを途中で止めたい場合は `--fail-fast` オプションを付ける。

```bash
bin/rspec xxx_spec.rb --fail-fast
```

https://relishapp.com/rspec/rspec-core/docs/command-line/fail-fast-option
atom内蔵のgit/githubを使いたい

# atom内蔵のgithubが使えなくてハマった
atom v1.18から統合されたgit/githubを使おうとしたところなかなか出来なかったので自分の対応をメモしておきます。
## ハマった経緯
 - http://blog.rokuzeudon.com/entry/atom-git このページを参考に使おうとした。
 - atomのgithubタブ(gitタブではない)を開いても黒い画面のままでtokenを入力する画面が出てこなかった。
 - gitに上げたいフォルダをプロジェクトフォルダとしているときにgitタブを開くとcreate repositoryというボタンが出てきた。
 - 押して.gitフォルダが作られて再起動するとgitタブにstageやcommentなどが書いてある画面が出てきた。
 - commentを入力した後commit to masterまでは出来たがその後pushすることが出来ない。(githubと連携できてないので当然)
 - git自体をインストールしてないからと思いインストールしてみたが出来ない。
 - 沼にハマる

## 現在の環境
 - windows10 64bit
 - atom 1.26.1 x64 (gitに関するパッケージは新しく入れてない)
 - Git-2.17.0-64-bit (git bashを使う)
    - https://opcdiary.net/?page_id=27065 ここを見てインストールした。

## 対応策
### git bash で先に一度pushすればいい。
#### 詳細
 - atomのgitタブからgithubに上げたいフォルダに.gitファイルを作る
    - gitタブのcreate repositoryボタンを押してパスを上げたいフォルダに設定する。
    - atomを再起動して.gitフォルダを確認する。
 - https://techacademy.jp/magazine/6235 ここを見てリモートリポジトリを作ってgit bash上で git push origin master まで行う。(このときatomは閉じておいたほうが良い？)
 - githubタブを確認開くとtokenを入力する画面が出る。
 - 指示に従って発行したtokenを入力する。(その後に出てくる画面は一人で使うなら必要ないはず)
 - gitタブでstage allしてcomment書いてcommit to masterして画面下にある上下の矢印のところを押すとpushボタンがあり、それを押すとpushが完了する。
 - 念の為githubで確認。
 - 一度行えばgit bashを経由すること無くpushできるようになる。

## 注意事項
 - branchとかわからない。
 - 自分の環境でしか試してないから実際これで絶対できるかわからない。
Android EmulatorでMapboxのマップが表示できない


エミュレータでMapboxを使用しているActivityを起動したところ、以下のようなエラーをEvent Logに吐き続け、マップが表示できない状態でハマりました。

```
9:39	Emulator: android/android-emugl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUniform1i:3282 error 0x502
```

私の環境ではエミュレーターの右のドットメニュー -> Settings -> Advanced タブ -> OpenGL ES renderer をSwiftShaderに変更して、エミュレーターを再起動することで無事に表示できるようになりました。

もしかしたらHAXMを最新にするのも必要かも。

参考
https://github.com/mapbox/mapbox-gl-native/issues/11266#issuecomment-368724115
Materialize / Flaskでタグ(chips)を配列でPOSTする方法

CSSフレームワークの[MaterializeのChips](https://materializecss.com/chips.html)を使うと簡単にタグの実装ができて便利です。
投稿ページなどでchipsを実装し、それをサーバー（今回は簡易的にFlask）
にPOSTする方法のメモです。

## クライアント側
```javascript
// 流れ
// 1. chipsのDOM(例では.chips)からデータを取得
// 2.　input type="hidden"にタグのデータを追加

var tagData = $('.chips').material_chip('data');
if (tagData.length > 0) {
  for (var i = 0; i < tagData.length; i++) {
    $('form').append('<input type="hidden" name="tags" value="' + tagData[i].tag + '" />');
  }
}
```

## サーバー側

```python
## Flask側
@app.route('/submit', methods=['POST'])
def submit():
    tags = request.form.getlist('tags') # tagsにタグが配列で入る
```
BigQueryで特定のデータセットだけ共有する方法

BigQueryで特定のデータセットのみ共有したかったが、IAMユーザーの追加と、データセットの権限の両方を適切に設定しなければならず、分かりずらかったのでメモ。

# 実現したかったこと
- BigQueryの特定のデータセットをクエリが発行できる状態で外部の人と共有したい
- 同じプロジェクトにある他のデータセットは見えないようにしたい

# IAMユーザーの追加

Google Cloud のコンソール画面の「IAMと管理」→「IAM」から、データを共有したいユーザーを「BigQuery ジョブユーザー」として追加します。

![スクリーンショット 2021-02-09 14.12.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48137/675840d1-1efc-6249-01ee-d0a1133a5c84.png)

![スクリーンショット 2021-02-09 14.15.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48137/16e8b558-bb82-677a-7240-ce0197e2e45d.png)

# データセットの共有

BigQuery の ウェブ UI で、共有したいデータセットを開いて、下記の赤枠で囲ったアイコンをクリックします。

![スクリーンショット 2021-02-09 14.22.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48137/7d766c89-f2c0-ca5e-ac9c-6db14e9ed914.png)

追加したいユーザーを「BigQuery 閲覧者」として追加します。

![スクリーンショット 2021-02-09 16.35.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48137/18b113f8-2ac2-f2fb-40ed-6a208872964b.png)



# 参考情報
[BigQuery / アクセス制御](https://cloud.google.com/bigquery/docs/access-control?hl=ja#bigquery.jobUser)
[Cloud Identity and Access Management / 役割について](https://cloud.google.com/iam/docs/understanding-roles?hl=ja)
機械学習(machine learning)と自動会話系(chat bot system)入門前夜

参考文献の言葉の意味範囲に関する記述が参考になるかも。
人によって、言葉の意味範囲が異なり、そこをいかに機械学習するかが課題と理解。

視点によって、上位概念と下位概念が逆転することはしばしば。
例えば、SoftwareはSystemの一部で、Systemが上位概念とする視点がある。
SystemもSoftwareの中に、Systemとして記述する。
Softwareの視点では、SystemはSoftwareの一部で、Softwareが上位概念。

細かい視点では、system> software > System(software) > Software(software)というような入れ子構造かもしれない。

この辺りの整理を、機械学習でどのように処理できるかが注目点。

ボット開発者のための機械学習入門
https://qiita.com/fullkawa/items/0c8a9e253d7fc7728bd7

Watson ConversationのTutorialを日本語でやってみた （前編）
https://qiita.com/sukusuku_watson_editorial_room/items/2ab2b4738e31b276b91e#_reference-01ea602c36bf67f81690

Watson ConversationのTutorialを日本語でやってみた （後編）
https://qiita.com/sukusuku_watson_editorial_room/items/e3111d2ccce996db7feb

人工知能ボットAPIを使ってSlackのBotと会話する
https://qiita.com/nobukatsu/items/a216e4597e299d62ca2a
機械学習を使って自動会話系へ意見を述べるための準備

自然言語入力処理のMicrosoft LUIS(日本語版)を使ってChatBotサンプルを作ってみる
https://qiita.com/tomohiku/items/86d85dcfbd34864e7b5d

人工知能パーツ Microsoft Cognitive Services で食べ物画像判定 BOT を作ろう！ [Bot Framework (C#) 編]
https://qiita.com/annie/items/bd232f67e06c83586ca5

人工知能パーツ Microsoft Cognitive Services で食べ物画像判定 BOT を作ろう！ [Bot Framework (Node.js) 編]
https://qiita.com/annie/items/41b60b90affe26925761

Facebook bot に wit.ai のボットエンジンを連携させてみる
https://qiita.com/u-minor/items/0a212a99968f1119905f

Jubatusを使った感情分析を行うLINE Botの作成
https://qiita.com/Ryuichirou/items/283cbd411b6d73d9fc6a

LINE Business Centerとapi.aiを使ってチャットボットを作る
https://qiita.com/salmonosushi/items/20310131b0423c408ea1

BOTで使える会話API・ライブラリ・サービスまとめ
https://qiita.com/kenzo0202/items/582e3a5e06b64ab24964

チャットボットをAIでもっと素敵にする！自然言語処理の仕組み
https://qiita.com/okajax/items/0534c92bb9b7f9bc1413

機械学習を使って作る対話システム
https://qiita.com/Hironsan/items/6425787ccbee75dfae36

# 参考文献(reference)
AI,機械学習,Deep Learning わかりにくい流行り言葉をまとめる
https://qiita.com/tomohiku/items/364a1b06b35ea4d514d6

【続】AI,機械学習,Deep Learning わかりにくい流行り言葉をまとめる
https://qiita.com/tomohiku/items/c996055542a74a035a3d

# 文書履歴(document history)
ver. 0.10 初稿 20180510
ver. 0.11 項目追記 20180801
ver. 0.03 URL追記　20230307
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Objective-Cで実装したクラスのSwift部分でRxSwiftのDisposeBagを使う

# どういう問題か？

タイトルで説明しきれなかったのでここで問題点について説明いたします。

Objective-Cで開発されたプロジェクトを部分的にSwiftに移植していく場合は、Swift側でObjective-Cクラスのextensionとしてメソッドを定義する方法があります。

参考: [【Swift】Objective-Cで書いたクラスをメソッド単位で少しずつSwiftへ移行する方法](http://egg-is-world.com/2015/07/14/objective-c-swift-transition/)

勉強会などでiOSアプリエンジニアに話を聞いていると、Objective-CとSwift混在のアプリはまだまだあるのではないかという印象なので、この手法のお世話になっている人もいるのではないでしょうか。

一方、RxSwiftを使っている場合はDisposeBagのインスタンスをUIViewControllerのプロパティとして持たせておいて、ViewController消滅時にDisposeさせる手法が広く扱われていると思います。

しかしSwiftのextension内では`Stored property`を定義することができないため、DisposeBagをViewControllerクラスインスタンスの寿命と連動させることが困難です。

# 解決方法

`Associated Object`を使うことで、Swiftの`Computed property`を用いてもDisposeBagをインスタンスに保持させることができます。`Associated Object`下記の記事などで解説されているので参照ください。
参考: [[Objective-C] Associated Objectを使いランタイムにプロパティを追加する](https://qiita.com/edo_m18/items/410f7d0634cb6b5fdb17)
ざっくりいうと、プロパティとは別の仕組みでオブジェクトに動的にデータを設定するための仕組みです。


とはいえ、こんな黒魔術みたいなのを自分で書きたくないという人にお勧めのライブラリがありました。[NSObject+Rx](https://github.com/RxSwiftCommunity/NSObject-Rx) というライブラリを入れることで下記のようにDisposeBagを生成&取得できます

```swift
extension HogeViewController {
    func configureBinding() {
        thing
          .bind(to: otherThing)
          .disposed(by: self.rx.disposeBag)
    }
}
```

`self.rx.disposeBag` の部分がNSObject+Rxによって追加されたプロパティです。このプロパティは内部で`Associated Object`として`DisposeBag`のインスタンスを保持するように実装された`Computed property`です。初回のgetでDisposeBagのインスタンスを生成して保持するようになっています。(2018/05/10現在の情報です。このライブラリの実装は紆余曲折もあったらしく、今後変わる可能性も考えられます)

# まとめ

`Associated Object`でできます。
ライブラリがすでにあるので[NSObject+Rx](https://github.com/RxSwiftCommunity/NSObject-Rx) を使えます。

NSObject+Rxの目的はこのような目的ではなく、「わざわざDisposeBagを各クラスのプロパティとして定義する手間を省く」ためのものらしいので、今回のような用途の解決策として検索していても見つかりにくいように思いました。検索で見つかる可能性が増えるためにこの記事を書きました。

# 補足

この記事の内容は下記のブログ記事の内容の一部としても取り上げましたが、記事のタイトルからこの問題の解決を連想しにくいと思いました。そのためこの問題のみを抜き出して記事化しました。

[RxSwiftを部分的に導入してみてわかった3つの効果と4つのハマりどころ](http://blog.lisb.direct/entry/2018/02/28/080000)
「CredSSP」2018年5月の更新プログラム適用によるリモート デスクトップ接続不可への回避策

* [2018 年 5 月の更新プログラム適用によるリモート デスクトップ接続への影響 | Ask CORE](https://blogs.technet.microsoft.com/askcorejp/2018/05/02/2018-05-rollup-credssp-rdp/)

## 現象

![credssp_error.jpg](https://qiita-image-store.s3.amazonaws.com/0/25728/95a2a17f-dba5-d1d1-5468-04ac19c7dace.jpeg)

リモートデスクトップ接続が急に接続できなくなった！

## 対処

とりあえず！接続したい場合

```sh:コマンドプロンプトの管理者権限で実行
REG ADD HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\CredSSP\Parameters /v AllowEncryptionOracle /t REG_DWORD /d 2
```

## Linuxからの接続の場合

* [xfreerdp: can't connect to latest Windows10: ERRCONNECT_PASSWORD_CERTAINLY_EXPIRED · Issue #4449 · FreeRDP/FreeRDP](https://github.com/FreeRDP/FreeRDP/issues/4449)

xfreerdp に `/sec:tls`オプションを追加することで接続できるようになる。

![スクリーンショット_2018-05-14_07-56-26.png](https://qiita-image-store.s3.amazonaws.com/0/25728/01d0db23-3ffc-0a3c-7471-38fc845f7dde.png)
boost::regexの怪

ハマったので自分用にメモ

`boost::regex hoge("(?:\".+?\"|[^:\\ ]+?)");`

こんなコードがあるとして、エラーにならないけど、マッチしない場合がありました。

動くんだけど、マッチしない。
他の言語、環境ならマッチするのになんでや！

意味が分からないので、なんとなくOR条件の前後を入れ替えてみました。

`boost::regex hoge("(?:[^:\\ ]+|\".+?\")");`

すると例外が発生します。なんやて！ウソやろ。。。
文字クラスがおかしいらしい・・・

原因は文字クラスのエスケープシーケンスが不足していたため。
`boost::regex hoge("(?:\".+?\"|[^\\:\\\\ ]+)");`

boostのバージョンとか環境にもよると思いますが、中途半端に動いちゃうためにドツボにハマってしまいました。
定義した時点で正規表現がおかしかったら例外が発生すると思ってた（実際してた）のでなおさら。
今さらだが macOS High Sierra に Ruby 1.8.7 をソースビルドでインストールしてみる

[Fukuoka.rb](https://fukuokarb.connpass.com/) にお邪魔して色々試し、 @udzura さんに~~そそのかされた~~推されたので投稿します。

# 経緯

最近購入した MackBook Pro に Ruby 1.8.7 をインストールしたかったが、rbenv からインストールすることができなかった。Ruby 1.8.7 をビルドするにあたり apple-gcc42 を使用していたが、 homebrew/dupes が廃止になり apple-gcc42 自体がインストールされなくなっていた。だけど、どうしてもインストールしたいのでソースビルドでインストールすることにした。

※ 「こうすれば rbenv でインストールできるよ！」とご存知の方、ご一報ください。

# インストールしたい環境

* macOS High Sierra (10.13.4)
* MacBook Pro (15-inch, 2017)

# 前提条件

* Xcode / Xcode Command Line Tools はインストール済み
* GitHub から clone できる状態にしている

# やったこと
## Ruby 1.8.7 のソースを落としてきてビルドしてみる

ビルドの手順は　README　の「How to compile and install」を素直に実行します。

```
$ git clone git@github.com:ruby/ruby.git ruby_1_8_7
$ cd ruby_1_8_7
$ git checkout -b ruby_1_8_7 origin/ruby_1_8_7
$ autoconf
$ ./configure
$ make
（中略）
  :
Find Tcl/Tk libraries. Make tcltklib.so which is required by Ruby/Tk.
gcc -I. -I../.. -I../../. -I../.././ext/tk -DHAVE_RB_SAFE_LEVEL -DHAVE_RB_HASH_LOOKUP -DHAVE_RB_PROC_NEW -DHAVE_RB_OBJ_TAINT -DHAVE_ST_PTR -DHAVE_ST_LEN -DRUBY_VERSION=\"1.8.7\" -DRUBY_RELEASE_DATE=\"2014-01-28\"  -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE   -DWITH_TCL_ENABLE_THREAD=0 -fno-common -g -O2 -pipe -fno-common   -c stubs.c
In file included from stubs.c:10:
/usr/include/tk.h:78:11: fatal error: 'X11/Xlib.h' file not found
#       include <X11/Xlib.h>
                ^~~~~~~~~~~~
1 error generated.
make[1]: *** [stubs.o] Error 1
make: *** [all] Error 1
```

コンパイルに失敗しました。ヘッダーファイルがないらしいです。

## ぐぐる

[macでx11/xlib.hの参照](https://teratail.com/questions/41574)

ズバリな感じがしたので、まずは [XQuartz](https://www.xquartz.org/) をインストールします。dmg ファイルをダウンロードしてインストールすれば大丈夫です。

## 再度ビルド

```
$ make clean
$ make CC='gcc -I/opt/X11/include'
（中略）
  :
45 warnings generated.
cc -dynamic -bundle -undefined suppress -flat_namespace -o ../../.ext/i686-darwin17.5.0/zlib.bundle zlib.o -L. -L../.. -L.     -lz  -ldl -lobjc
making ruby
gcc -I/opt/X11/include -g -O2 -pipe -fno-common    -DRUBY_EXPORT  -L.    main.o  -lruby-static -ldl -lobjc   -o ruby
```

確かに警告 45 個出てますけど、コンパイルは出来たようです。

## インストール

```
$ make install
./miniruby -I./lib -I.ext/common -I./- -r./ext/purelib.rb  ./instruby.rb --make="/Applications/Xcode.app/Contents/Developer/usr/bin/make" --dest-dir="" --extout=".ext" --mflags="" --make-flags="" --data-mode=0644 --prog-mode=0755 --installed-list .installed.list --mantype="doc"
installing binary commands
installing command scripts
installing library scripts
installing headers
installing manpages
installing extension objects
installing extension scripts
```

何か成功したっぽいので確認してみます。

```
$ /usr/local/bin/ruby --version
ruby 1.8.7 (2014-01-28 patchlevel 376) [i686-darwin17.5.0]
```

無事インストールできたようです。

# まとめ

最初やった時は `make CC='gcc -I/opt/X11/include'` を実行した後に「zlib が見つからない」みたいなエラーが出てつまづいたのですが、何故か再現せずインストールに成功しました。
また、X11/Xlib.h が見つからないエラーについては @udzura さんから「tk じゃないすかね？」と助言をもらいました。なので README にある通り、ext/Setup の tk のコメントマークを削除すればオプション指定なしの `make` でコンパイルが成功するかもしれません。その場合 XQuartz のインストールが必要かどうかは確認していません。実際試された方、ご一報ください。

# 最後に

この記事は需要あるのかな？
IntelliCode を使ってみて戦慄した

# IntelliCode を使ってみて戦慄した

Buildで発表されていたIntelliCodeを試してみたら思ったよりスゴかったので書いてみた。

## インストール

MarketPlace から .vsix を[ダウンロード](https://marketplace.visualstudio.com/items?itemName=VisualStudioExptTeam.VSIntelliCode)してインストールする方法と、VisualStudio の「拡張機能と更新プログラム」からインストールする方法の二通りがあります。
特にこだわりが無い限り「拡張機能と更新プログラム」から入れるで良いと思います。

![install.png](https://qiita-image-store.s3.amazonaws.com/0/246831/c0b84a23-a8de-99f9-36f4-77fe2325378a.png)

拡張機能と更新プログラムで Visual Studio Marketplace を選択し、"IntelliCode" で検索すると出てきます。VisualStudioが最新版でない場合は出てこないので、VisualStudioのバージョンが古い場合は先にアップデートを掛けましょう。

## 使ってみる

![console.png](https://qiita-image-store.s3.amazonaws.com/0/246831/003a7cda-fc8d-d50b-2205-8cdcef98085d.png)

現在はC#のみ対応です。
よく使うであろうメソッドが★付きで上位に出てきます。地味に嬉しいですね。


## IntelliCodeのココがスゴイ

そしてここからがスゴイ所。今までの IntelliSense は例えばクラスインスタンスと. を入力した時に入力候補となるメソッドやプロパティがアルファベット順に出てきますが、IntelliCode は前後のコンテキストから多く使われるであろうものを自動的に前の方に出してくれます。

つまりどういうことだってばよというと例えばこんな感じ。

普通に HttpClient で何かダウンロードするコードを書こうと思います。
適当に HttpClient を確保して GetAsync() で HttpResponse を持ってきます。
で、「response.」まで入れて次の入力候補に出てくるのはこんな感じ。

![response1.png](https://qiita-image-store.s3.amazonaws.com/0/246831/4e286c7e-a0df-b410-8294-70b986797675.png)

ほう、オススメは StatusCode ですか・・・
普通はステータスコードをチェックしてから処理すると思うのでステータスコードをチェックしてから処理するコードにしましょう。

![response2.png](https://qiita-image-store.s3.amazonaws.com/0/246831/c6fda0e4-9f61-a357-450c-96c2aa986c8d.png)

if文の中だと第一候補が IsSuccessStatusCode に変わりました。「HttpResponse取った後で if(response. まで書いたら後に続くのは当然 IsSuccessStatusCode だよね？」と言われている気がします。
そして、ステータスコードをチェック後そのブロックの中で「response.」を入力すると・・・

![response3.png](https://qiita-image-store.s3.amazonaws.com/0/246831/6cb99d92-d517-44d8-e156-e7ff892bd9b1.png)

すっご！！
そうですよね！ HttpResponse 取って成功かチェックしたら次に見るのは普通 Content ですもんね！

つまり従来の単純な入力候補を出すものに対し、前後の文脈から「こういうコードの後ではこれが使われる事が多い」というのを判断し場所によって最適と思われる入力候補が上位に出てくるという事ですね。

# 感想

ちなみにここまでいい感じに動くのは HttpClient とか一般的に良く利用されるクラスやメソッドだけで、あまり利用されていないクラスや(GitHubで公開されているソースから学習しているらしい)、そもそも自分で定義したクラスだとそこまで気が利いた動きはしません。

とはいえここまで頭良く補完の候補が出るのなら定型的な処理ならほぼ手を動かさずにコーディングできちゃう日も遠くはないと期待してしまいます。
JavaScriptの正規表現で数値を3桁カンマ区切りの文字列に変更する

# やりたかったこと

| item | item1 | item2 | item3 |
|:---|---:|---:|---:|
| 単価 | 1,000 | 2,000 | 3,000 |
| 発注数 | 2  |  3 |  4 |
| 小計  | 2,000  | 6,000  | 12,000  |

↓

| item | item1 | item2 | item3 |
|:---|---:|---:|---:|
| 単価 | 1,000 | 2,000 | 3,000 |
| 発注数 | 5  |  3 |  4 |
| 小計  | 5,000  | 6,000  | 12,000  |

- 発注数が入力フォームになっている
- 単価と小計はフォームではなく、`<td>`内の文字列
- フォームのchangeイベントで発火させて小計の計算を行い、3桁区切りの文字列として表示する

# 問題発生

カンマ区切りの文字列を数値に変換しようとするとカンマ以降の文字が捨てられてしまっていた

`1,000` → `1`

そのため、下記のような残念な状況に

| item | item1 | item2 | item3 |
|:---|---:|---:|---:|
| 単価 | 1,000 | 2,000 | 3,000 |
| 発注数 | 5  |  3 |  4 |
| 小計  | 5  | 6  | 12  |

# 対策

カンマがあるせいで数値扱いできないので

- カンマを削除する
- 計算する
- カンマを付け直す

の3ステップを踏むだけ。
ただし自分にとってはカンマを付け直すのが難問だった。

## 追記 2018.05.15

下にごちゃごちゃ書いてるけどもっとはるかに単純な方法があった。

```
var numberWithComma = new Intl.NumberFormat();
var price = 5000;

numberWithComma.format(price); // -> '5,000'
```

これだけでカンマ区切りの数値にできる。
コメントいただいた[og24715](https://qiita.com/og24715)さんありがとうございます。

というわけでここから下は正直蛇足。

# 実装

```javascript:items.js
// カンマを削除し、数値に変換して扱えるようにする
var price = parseInt($("#item_price").text().replace(/,/g, ""));
var order_vol = parseInt($("#order_vol").text());
var subtotal_price = price * order_vol

// 正規表現で3桁ごとにカンマ区切りを挿入する
$("#subtotal_price").text(subtotal_price.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ','));
```

## 解説

カンマ区切りを挿入しているのは下記の部分

```
replace(/\B(?=(\d{3})+(?!\d))/g, ','));
```

[こちらのサイト](https://webllica.com/add-comma-as-thousands-separator/)を参考にさせていただいてとりあえずの解決はしたが、何をしているのか理解するのに時間がかかったのでそれぞれの要素に分解してみる

### メタ文字の意味

- `\B` : 単語の境界以外の位置
- `(?=AAA)` : AAAという文字列の**直前の位置**を表す肯定の先読み
- `(?!AAA)` : AAA**ではない**文字列の**直前の位置**を表す否定の先読み
- `\d` : 1個の半角数字(0123456789)
- `(pattern)` : グループ化 括弧内の文字列をひとつの塊として扱う
- `{n}` : 文字の個数を指定する
- `+` : 直前の文字が1文字以上

### 要素への分解

- `\B` : 空白やカンマ、ピリオド、改行などの前後をマッチの対象から除外する
-  `(?=)`  : 位置にマッチさせる
- `(\d{3})+` : 半角数字3つが一つ以上続く範囲にマッチさせる
- `(?!\d)` : 数字以外の文字の直前を指定することで、空白やカンマ、ピリオド、改行などの直前から(数字の後ろの方から)マッチさせる

### 各正規表現でマッチする範囲または位置

位置にマッチする場合は`^`で表現する

| 正規表現 | 1000 | 1,000 | 1000000000 | 1000000.00 |
|---|---|---|---|---|
| (\d{3})+ | 100 | 000 | 100000000 | 100000 |
| (\d{3})+(?!\d)  | 000  | 000  | 000000000  | 000000 |
| (?=(\d{3})+(?!\d))  | 1\^000  | 1,\^000  | 1\^000\^000\^000  | 1\^000\^000.00 |
| \B(?=(\d{3})+(?!\d))  | 1\^000  | なし  | 1\^000\^000\^000  | 1\^000\^000.00 |

一番下の正規表現では狙い通り数字の3桁区切りの位置にマッチしている事がわかる

# 感想

後ろからカウントする方法も3桁ごとにマッチさせる方法もさっぱり思いつかなかったけど要素に分解して1つずつ確認すると納得。

[Rubular](http://rubular.com/)便利

数値に変換するときにカンマ以降の数が捨てられていたのはなんでなんだろうか。

# 参考

[入力した数値を JavaScript で自動的に3桁カンマ区切りにして表示する方法！全角入力を許容する拡張機能も実装！](https://webllica.com/add-comma-as-thousands-separator/)
MySQL Progate

//purchasedテーブルからnameカラムを取り出す
SELECT name FROM purchased;

//purchasedテーブルからpriceカラムを取りだす
SELECT price FROM purchased;

//purchasedテーブルからpriceカラムとnameカラムを取り出す
SELECT price,name FROM purchased;

//purchasedテーブルから全てのカラムを取りだす
SELECT * FROM purchased;

//aテーブルからcategoryカラムが食費に該当するものを取り出す
SELECT * FROM a WHERE category = "食費";

//数値データは""クォーテーションで 囲まない
//日付データは""クォーテーションで 囲む

//aテーブルからpriceカラムが1000に該当するものを取り出す
SELECT * FROM a WHERE price = 1000;

//aテーブルからdateカラムが2017-01-10のものを取り出す
SELECT * FROM a WHERE date = "2017-01-10";

//比較演算子には=,>=,<=,<,>,がある。

//aテーブルからdateカラムが2017－01－10以前のものを取り出す
SELECT * FROM a WHERE date <= "2017-01-10";

//aテーブルからpriceカラムが2000以上のものを取り出す
SELECT * FROM a WHERE price >= 1000;

//aテーブルからnameカラムがプリンを含むものを取り出す。
SELECT * FROM a WHERE name LIKE "%プリン%";

//%はワイルドカード
//"%プリン"はプリン、焼きプリンが取り出せる
//"プリン%"はプリン、プリン大福が取り出せる
//"%プリン%"はプリン、焼きプリン大福、焼きプリン、プリン大福が取り出せる

//aテーブルからnameカラムがプリンで終わるものを取り出す
SELECT * FROM a WHERE name LIKE "%プリン";

//aテーブルからnameカラムがプリンから始まるものを取り出す
SELECT * FROM a WHERE name LIKE "プリン%";

//aテーブルからnameカラムがプリンを含まないものを取り出す
SELECT * FROM a WHERE NOT name LIKE "%プリン%";

//aテーブルからpriceカラムが1999でないものを取り出す
SELECT * FROM a WHERE NOT price = 1999;

//NOTを使うことでそれ以外のデータを取り出せる

//NULLはなにも保存されていない場合になる
//NULLを取り出す場合は=をつかえないISを使う
//NULLいがいはIS NOTをつかう

//aテーブルからpriceカラムがNULLのものを取り出す
SELECT * FROM a WHERE price IS NULL;

//aテーブルからpriceカラムがNULLでないものを取り出す
SELECT * FROM a WHERE price IS NOT NULL;

//複数条件を設定するときはAND OR を使うその際WHEREは一回だけ

//aテーブルからpriceが1000かつnameがプリンのものを取り出す
SELECT * FROM a WHERE price = 1000 AND name = "プリン";

//aテーブルからnameがぷでぃんまたはnameがプリンのものを取り出す
SELECT * FROM a WHERE name = "ぷでぃん" OR name = "プリン";

//昇順はASC降順はDESCを使う
//ORDER BYが必要になる
//aテーブルからpriceカラム基準に降順で並び変えたデータを取り出す
SELECT * FROM a ORDER BY price DESC;

//aテーブルからnameカラムがプリンのものをpriceカラムを基準に昇順で取り出す
SELECT * FROM a WHERE name = "プリン" ORDER BY price ASC;

//取り出すデータ件数をLIMITで制限できる
//aテーブルから最大5件のデータを取り出す
SELECT * FROM a LIMIT 5;

//aテーブルからpriceカラムが1000のデータを最大10件取り出す
SELECT * FROM a WHERE price = 1000 LIMIT 10;

//aテーブルからpriceカラムを基準に昇順で10件とりだす
SELECT * FROM a ORDER BY price ASC LIMIT 10;
Kaggle初めてやってみた　　Talkingdata

<h1>kaggle　初挑戦で得られた知見と結果をまとめてみた

kaggle初挑戦したので、日記代わりにまとめてみた


[TalkingData AdTracking Fraud Detection Challenge](https://www.kaggle.com/c/talkingdata-adtracking-fraud-detection)

###言語・ツール
- jupyter notebook
- python
 
###スキル
- numpy, pandas, sklearnはある程度使える。わからないところはネットで調べて理解できる程度
- pythonの基本的なところはわかる程度


###talkingdataコンペの説明

中国で、クリックだけして広告料を得るというのが問題になっているらしい。
そこで、ip, app, device, os, channel, click_timeの6つの特徴量からアプリをダウンロードするかどうかを判別するようなモデルを作るという課題だった。学習用データが1千万行以上あって、とにかく特徴量が少ないようなデータセットだった。評価関数はAUCでそれぞれのデータに対して0から1の間の数値を返すようにする。重要なのは正解データが0のものが、正解データが1のものより高い数値をとらないよにすることである。


### 失敗

- 評価関数を理解していなくて0か1の値を返していた。
- 最初はkernelなどをほとんど見ずにやって、失敗しまくって時間を無駄にした
- 特徴量を増やさなければいけないところで、むしろ減らしていた。
- オブジェクトを保存せずにやり直し、時間を浪費した
- データサイズと考えずにメモリエラーを起こしまくっていた
- 関数を定義していなかったので、同じ処理を書き直した



###わかったこと/得られたもの

- xgb, lgbmインストールしてある程度使い方はわかった
- kaggleのkernelは大事
- データを見る時間を増やさないと無駄に時間を浪費する
- 当たり前だけど、評価関数はちゃんと見る
- pandasでの時系列データの扱い方のかじり程度
- 行数に対して特徴量が圧倒的に少なかったので、特徴量を付け加えること（当たり前）
- kaggleはモチベーション維持に良い
- メモリに対して少し理解が深まった

### 結果


[結果](https://www.kaggle.com/daisi041896)
1332位/3967位
kernelからコピペしたlgbmのモデルに少しだけ特徴量加えて、xgbでもやったものをアンサンブルしたものです。
今回はほぼ特徴量生成をどうやるかで決まったようです。


###まとめ

失敗を書いて見直していると、kaggleというより基本的なところで失敗しているんだなと思いました。スキルが低すぎるし、知識も少なすぎたので、成長して再挑戦したいと思います。
Production環境でNet::HTTPが使えない？

# 起きたエラー
Production(本番)環境

```terminal

NameError (uninitialized constant Net::HTTP):

```

# 原因と解決

```Ruby

# ↓の行を追記
require 'net/http'

http = Net::HTTP.new(uri.host, uri.port)

```

Development(開発)環境だと必要ないみたい


# 参考
https://github.com/AzureAD/omniauth-azure-activedirectory/issues/33
https://teratail.com/questions/112198
.NETのデバッグ時に使用するライブラリを開発しました

### 概要

DebugTrace-javaを`.NET`用にコンバートしました。  
C#およびVisualBasicから使用できます。`.NET Standard`のライブラリなので他の言語からでも使用できると思いますが(試してはいません)、言語固有のリテラル表記に対応していません。

### 対象者

プログラムの実行状況をログに出力してデバッグしたい人。

### インストール方法、使用方法

以下のサイト(GitHub)を参照ください。

[DebugTrace-net GitHub](https://github.com/MasatoKokubo/DebugTrace-net/blob/master/README_ja.asciidoc) - README_ja.asciidoc

### C#での出力例(上記サイトからの転記)

```
2018-10-28 20:23:13.809 [03] DebugTrace-net 1.5.0
2018-10-28 20:23:13.809 [03]   Referenced properties file: Z:\Develop\C#\DebugTrace\DebugTrace\DebugTraceTest\bin\Debug\netcoreapp2.1\DebugTrace.properties
2018-10-28 20:23:13.810 [03]   Logger wrapper: DebugTrace.Console+Error
2018-10-28 20:23:13.811 [03] 
2018-10-28 20:23:13.811 [03] ______________________________ Thread 3 ______________________________
2018-10-28 20:23:13.811 [03] 
2018-10-28 20:23:13.880 [03] Enter Readme.ReadmeExample1.Example1() (ReadmeExamples.cs:14)
2018-10-28 20:23:13.901 [03] | 
2018-10-28 20:23:13.902 [03] | contacts = Readme.Contact[2] {
2018-10-28 20:23:13.902 [03] |   Readme.Contact {
2018-10-28 20:23:13.902 [03] |     ____ Readme.Entity ____
2018-10-28 20:23:13.902 [03] |     ID: 1, 
2018-10-28 20:23:13.902 [03] |     ____ Readme.ContactBase ____
2018-10-28 20:23:13.904 [03] |     FirstName: "Akane", LastName: "Apple", 
2018-10-28 20:23:13.904 [03] |     ____ Readme.Contact ____
2018-10-28 20:23:13.904 [03] |     Birthday: 1991-02-03 00:00:00.0000000, 
2018-10-28 20:23:13.904 [03] |   }, 
2018-10-28 20:23:13.904 [03] |   Readme.Contact {
2018-10-28 20:23:13.904 [03] |     ____ Readme.Entity ____
2018-10-28 20:23:13.904 [03] |     ID: 2, 
2018-10-28 20:23:13.904 [03] |     ____ Readme.ContactBase ____
2018-10-28 20:23:13.904 [03] |     FirstName: "Yukari", LastName: "Apple", 
2018-10-28 20:23:13.904 [03] |     ____ Readme.Contact ____
2018-10-28 20:23:13.904 [03] |     Birthday: 1992-03-04 00:00:00.0000000, 
2018-10-28 20:23:13.904 [03] |   }, 
2018-10-28 20:23:13.904 [03] | } (ReadmeExamples.cs:20)
2018-10-28 20:23:13.905 [03] | 
2018-10-28 20:23:13.906 [03] Leave Readme.ReadmeExample1.Example1() (ReadmeExamples.cs:22) time: 00:00:00.0245863
```

### 参考

[DebugTrace-java Qiita](https://qiita.com/MasatoKokubo/items/a2b54f6977e783ca10d0) - Java プログラムをデバッグする時に便利なトレース・ログ出力ライブラリの紹介

[DebugTrace-java GitHub](https://github.com/MasatoKokubo/DebugTrace-java/blob/master/README_ja.asciidoc) - README_ja.asciidoc

### 更新履歴

- 2018-05-19
    - 「対象者」を追加
    - 「C#での出力例」をversion 1.2.0での出力に変更
- 2018-05-26 「C#での出力例」をversion 1.3.0での出力例に変更
- 2018-10-28 「C#での出力例」をversion 1.5.0での出力例に変更
ELBでアクセスログ出力

問題の切り分けで、ELBに正常にアクセスされているか確認したい場合など、ELBのアクセスログを出力する。

![ロードバランサアクセスログ.png](https://qiita-image-store.s3.amazonaws.com/0/79214/fce28b3b-3ea7-e9db-4bd5-f23acc0f2615.png)

S3に出力される。
Mac OSX HighSierraにVirtualBoxがインストールできない件について

#はじめに
Mac OSX HighSierraにKali Linuxの仮想マシンを作るべく、
VirtualBox 5.2.10 をインストールしようとしたらインストーラーが最後にエラーを吐く。

##エラー内容
ソフトウェアの製造元に問い合わせてください。

#解決策
一度、VitualBoxのインストーラーのインストールエラーを確認してから、
「システム環境設定」「セキュリティーとプライバシー」「一般のタブ」「ダウンロードしたアプリケーションの実行許可：」の「開発元”Oracle America, Inc.”のシステム・ソフトウェアの読み込みがブロックされました。」を許可して、再度インストーラを実行。

#解決策？（未確認）
https://blog.icsphere.com/support-information/321/
WindowsへのMavenインストール

## 前提条件
- Windows環境
- プロキシサーバーは利用しないと仮定する
- Windowsへのjdkインストールは完了していることとする

## Mavenのインストール手順
- Apache Mavenからファイルをダウンロードする
- [ダウンロードサイト](https://maven.apache.org/download.cgi)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/217019/5dbabbc1-c155-2634-8559-bd4dd1b82eed.png)

- ダウンロードしたファイルを解凍し、配置する
(今回の手順ではC:\直下に配置)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217019/d3f6daf8-739a-a571-2160-1a1b60ed374a.png)

## 環境変数を設定
- システム環境変数 Path に以下の内容を追加する

(今回は`setEnv.bat`を実行する)

```言語:setEnv.bat
set PATH=%PATH%;C:\apache-maven-3.2.5\bin
```

## mavenコマンドの確認
- コマンドプロンプトを起動

「windows」 + 「R」から「cmd」で起動
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217019/ca9fd5da-9a30-f055-941d-3172c2feac31.png)

- コマンドプロンプトが起動したら、 "mvn -v" で動作確認
下記のようにvesion情報が表示されたら設定は完了

![image.png](https://qiita-image-store.s3.amazonaws.com/0/217019/b56c7612-1852-f768-f704-a60e87e853c1.png)
vue-cliで作ったアプリをAzureWebAppsで公開するまでのメモ

タイトルの通り、vueアプリをAzureWebAppsで公開しようとしたら、少し詰まったのでメモします。

# 1. config/index.jsの編集
@tiwu_official 様の記事を参考に編集しました。とても助かりました。
.gitignoreの`/dist/`を消し忘れないようにしてください。
記事：https://qiita.com/tiwu_official/items/43dc554ec43dd951812a#vue-cli%E3%81%A7%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9

# 2. アプリケーション設定
vue-cliで作ったプロジェクトはそのままgithubにあげて、azureとリポジトリの連携をしています。
しかし`https://<app-name>.azurewebsites.net`にアクセスしても404が返されてしまいます。

vue-cliでプロジェクトを作成して、ビルドすると、公開したいものはdistディレクトリに作られます。
なので、`https://<app-name>.azurewebsites.net`にアクセスしたらdistディレクトリを参照するように設定します。

AzureのWebアプリ管理画面から、[アプリケーション設定]に進みます。
下の方の画像のように編集します。
![appsetting.png](https://qiita-image-store.s3.amazonaws.com/0/215440/1cc4486a-1861-e416-2a1f-605174db3e4e.png)


以上です。
ConstraintLayoutの罠

罠というか自分で勘違いしてハマっただけです。
教訓のため残します。

## 勘違い
- なんかよく30%くらい早くなりますよーという記事を見ていた
- で、何気なくConstraintLayoutに置き換えた(結果は見えていたはず

## 結果
- Android4系の端末でView生成時に落ちるようになりました。


## なんでだ!？
- 記事を色々読んで推測してみました。

ConstraintLayoutってそもそも1階層にするから早いのであって、ConstraintLayout入れ子にしたら元も子もないのでは？


考えれば至極真っ当で、相対的に大きさを計算しているLayoutなのだから計算処理はより複雑になっているはず。

- 実際にネストして試そうかと思う
- と思ったら見つけたこの記事[
[ConstraintLayoutをネストすると激重になる - Qiita](https://qiita.com/alt_yamamoto/items/3dd5ceaed850816e27da)]

ありがとうございます。
Revertして戻した。いまのところ落ちていない模様。

## おわり
- RelativeLayoutより重いとは。
電子工作初心者のESP32勉強会③~SD編~

#前回
[I2C編](https://qiita.com/networkyohan69/items/391910c6942422cac6d0)

#SDカードを使う
ロケット電装ではセンサーで取得した値などの保存先が必要です。それが今回はSDを用います。
SDカードを用いるにあたってマイコン環境によっては内蔵されてる場合もありますが、多くの場合、モジュールを使うかなと思います。

配線は若干複雑で、I2C通信のようにシンプルな仕組みにはなっていませんでした。

#準備物
-[microSDカード　CK-４０](https://www.marutsu.co.jp/pc/i/95439/)
- ESP32
- 10kΩ抵抗 × 3
- 30kΩ抵抗 × 4
- ジャンパー線

#SPI通信モード
センサーはI2C通信によってデータを取得しました。SDモジュールはSPI通信(Serial Peripheral Interface)を使います。今回は名前だけ覚えてもらえれば大丈夫だと思います。
SPI通信はI2C通信よりも複雑で、難しかったので割愛。（私もあまりわかってない)

#回路
回路は以下の通りです。

<img width="556" alt="スクリーンショット 2018-05-09 23.37.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/253129/9e3e617f-3b88-d44c-5667-ab20413c3387.png">

追記
- MISOとSCKの接続が逆でした

左がESP32
右がmicroSDモジュール

PIN19から出ている線はプルアップしています。

#コード
SDの基本となるコードは以下の通りです。
githubのreferenceを見ると、ライブラリの使い方が載っています。
https://github.com/esp8266/Arduino/blob/master/libraries/SD/src/SD.h

"hello world"を繰り返し、出力します。

```c:densou.ino
//ライブラリを取得
#include <SD.h>

// CSを5に設定
const uint8_t cs_SD = 5; 

///ESP_Densou_test.txtというファイルがSDに生成される
const char* fname = "/ESP_Densou_test.txt";

int i = 0;

//Fileオブジェクトをfile(任意)と定義
File file;

//SD準備関数
void prepare_sd(){
// 連続書き込みモードでファイルを開く
  file = SD.open(fname, FILE_APPEND);

// 20回hello worldを書き込む
for(i=0; i<20; i++){
  //書き込み
  file.println("Hello world");

  //シリアルモニタに"Writing now"と表示がされる
  Serial.println("Writing now");

  // ファイルを閉じる
  file.close();
  delay(1000);  
}

//初期化関数
void setup{
//IDEのデータ通信速度を9600bpsとしてください
Serial.begin(9600);

//SDモジュールが接続できるか否か
if(SD.begin(cs_SD, SPI, 24000000, "/sd")){
  Serial.println("OK!");
}
else{
  Serial.println("NG!");
}
}

//ループ関数
void loop{
//SD準備関数実行
prepare_sd();
}
```

連続して書き換えたいなら、FILE_APPEND
一度だけの書き込みなら、FILE_WRITEにしてください。

```
fo = SD.open(fname, FILE_APPEND);
```

結果はHello worldが繰り返し、書き込まれているのではないでしょうか。

#やってみよう

加速度センサーで取得した値などをSDに保存するコードを書いてみましょう。
センサーの取得は[こちらの記事を参照に](https://qiita.com/networkyohan69/items/391910c6942422cac6d0)。

#データ
以下の画像は他のセンサーの値をSDに書き込ませた様子です。

シリアル通信でのご様子

![SD_data.gif](https://qiita-image-store.s3.amazonaws.com/0/253129/94451678-eed1-1d25-ea53-e2741eb1dad5.gif)

SDでのご様子

![IMG_6027.JPG](https://qiita-image-store.s3.amazonaws.com/0/253129/22b810cd-79b2-8371-3dcc-13593d31fe16.jpeg)

#参考文献
http://blog.livedoor.jp/sce_info3-craft/archives/9621848.html
この方がいなければ僕は未だ闇にさまよっていました。まさに救世主です。

#次回
次回はモーターでも動かしていきますか
Ruby で Ethereum の秘密鍵・アドレスを生成

```
require 'openssl'
require 'base16'
require 'digest/sha3'

def eth_address(public_key)
	s = public_key[2, 128]
	s.downcase!
	s = Base16.decode16(s)
	h = Digest::SHA3.hexdigest(s, 256)
	a = '0x' + h[-40..-1]
	return a
end

ec = OpenSSL::PKey::EC.new('secp256k1')
ec.generate_key

public_key = ec.public_key.to_bn.to_s(16)
private_key = ec.private_key.to_s(16)
eth_address = eth_address(public_key)

puts "address: #{eth_address}"
puts "private_key: #{private_key}"
```

# Note
- Ethereum 関連の情報は https://scrapbox.io/sushiether/ に集約することにしました。
- この記事の内容に変更・更新がある場合は、以下の URL を更新します。
- https://scrapbox.io/sushiether/Ruby_で_Ethereum_の秘密鍵・アドレスを生成
PythonでNPBのチームデータが取りたい。２(球団名とPDFのpath)

少しスッキリさせた。同じprint文を何度も書いている辺りは絶対にもっとスッキリ出来るはず。

```getURL.py
import bs4
import requests
url = requests.get('http://jpbpa.net/register/')
url.raise_for_status()
soup = bs4.BeautifulSoup(url.text, "html.parser")
elems = soup.select('a')
for elem in elems:
    team = elem.getText()
    path = elem.get('href')
    repath = path.replace('..', 'http://jpbpa.net')
    # elem.getText=球団名、elem.get('href')=PDFのpath
    if elem.getText() == "ロッテ":
        print('{}({})'.format(team, repath))
    elif elem.getText() == "ソフトバンク":
        print('{}({})'.format(team, repath))
    elif elem.getText() == "西武":
        print('{}({})'.format(team, repath))
    elif elem.getText() == "楽天":
        print('{}({})'.format(team, repath))
    elif elem.getText() == "オリックス":
        print('{}({})'.format(team, repath))
    elif elem.getText() == "日本ハム":
        print('{}({})'.format(team, repath))
    elif elem.getText() == "広島":
        print('{}({})'.format(team, repath))
    elif elem.getText() == "阪神":
        print('{}({})'.format(team, repath))
    elif elem.getText() == "DeNA":
        print('{}({})'.format(team, repath))
    elif elem.getText() == "巨人":
        print('{}({})'.format(team, repath))
    elif elem.getText() == "中日":
        print('{}({})'.format(team, repath))
    elif elem.getText() == "ヤクルト":
        print('{}({})'.format(team, repath))
```
paizaで他の人が書いたPHPソースを動かす方法

このソースを発見したので、Paizaで試してみようと思いました。
https://qiita.com/hedrall/items/fa8d43292f6bbeaf96d7

paiza.toでは、Githubからのリポジトリをインストール実行しようとすると、paiza cloudを使わないとダメと分かりました。

https://paiza.cloud/ja/

ただ、無料だと作ったサーバーが24時間で消えてしまうので、本当にお試しという感じです。

今回は、PHPの環境で作りました。
npmも、使えました。
でも、後ほど詳しく書きますが、エラーが出たので、npmのバージョンを最新にしようと思い、下記の記事を読んでアンインストールしてから、再びインストールしました。
https://qiita.com/taikan/items/88ff45a12b4e06293794

Node.jsが必要とわかったので、こちらの記事を参考にしてインストールしました。
https://qiita.com/seibe/items/36cef7df85fe2cefa3ea

paizaのクラウドサーバーは、Ubuntuでした。

これが無いと怒られるので、インストールしました。
https://www.npmjs.com/package/@angular/core

こちらも、必要になります。
https://github.com/angular/angular-cli#updating-angular-cli

また、パッケージの依存関係を作るために、下記の記事を参考にしてインストールしました。
http://phiary.me/node-js-package-manager-npm-usage/

このコマンドを使いました。
package.json がある階層に移動して、このコマンドを実行します。
```
$npm install
```
paiza cloudは、ターミナルがあるので、こうした操作も楽です。

今回のリポジトリを動かすために、色々とインストールしました。

##もっと簡単に使うことができた
実は、Angularの環境を作ったとに、ブラウザへのアクセスが出来ない？みたいなエラーが出たのです。
**”Invalid Host header”**
このエラーのことが分からず、冒頭から無駄なことをしてしまいました。
今回あえて、私がスタックオーバーフローで教えて頂けるまでにハマった様子も、残そうを思います。
実施は、下記の手順で、出来ました。

public_htmlの直下に新しいフォルダを作りました。
（Appで作りました。）

作ったフォルダーに、今回見つけたリポジトリを追加します。
この状態でサーブすると@angular/coreが無いとエラーが出ます。

https://www.npmjs.com/package/@angular/core　
これをリポジトリを入れたフォルダーに、追加して ください。

```
ng serve --disable-host-check
```
とコマンドから入力すると、無事にサーブできます。
私は、回線があまりに遅いので、サーブしてポート4200でブラウザが開いたあと、數十分画面が変わりませんでした。
そのため、何か足りないのかなと思い、先に書いたように依存関係をまとめてインストールするコマンドを試しました。
そして、ソースを見ていて下記のリポジトリを呼び込んでいたので、念のため追加しました。
https://www.npmjs.com/package/@angular/platform-browser-dynamic

##今回Angular初体験
今回、Angularを初めて使ったので、色々と勉強しながら環境作りをしました。
別途書いた記事のように、初期のプロジェクトを作って、ブラウザに表示できるか試したりしました。
今回を契機にして、Angularの勉強を進めて行きます。

勉強するのに役立つと思う記事を見つけましたので、シェアしたいと思います。
https://www.buildinsider.net/web/angulartips/002

https://blog.mismithportfolio.com/web/ngtodo
ラプラス変換をしてみた(wolframalphaとsympy)

おすすめのページを教えて下さい

http://cega.jp/math/laplacetransformstable

#wolframalpha
制作中
#sympy
```python
#(参考)sympy.integrals.transforms.laplace_transform(f, t, s, **hints)
#http://docs.sympy.org/latest/modules/integrals/integrals.html?highlight=laplace_transform#sympy.integrals.transforms.laplace_transform
from sympy import *
var('s t n')
print(laplace_transform( DiracDelta(t), t, s))
print(laplace_transform( Heaviside(t), t, s))
print(laplace_transform( 1, t, s))
print(laplace_transform( t, t, s))
print(laplace_transform( t**2, t, s))
print(laplace_transform( t**n, t, s))
#(-Heaviside(0) + 1, -oo, True)
#(1/s, 0, True)
#(1/s, 0, True)
#(s**(-2), 0, True)
#(2/s**3, 0, True)
#(s**(-n)*gamma(n + 1)/s, 0, -re(n) < 1)
```
LaradockでLaravel開発環境をDocker上に構築する on Mac

# 概要
Laravelの開発環境をLaradockを用いてDocker上に構築しました。
出来る限りシンプルにできないかと考えてLaradockを使ってみたのですが、
意外と苦戦したりしなかったりしたので今後のための備忘録です。

# Laradock
[Laradock.io](http://laradock.io/)
[laradock/laradock - github](https://github.com/Laradock/laradock)

>A full PHP development environment for Docker.
Includes pre-packaged Docker Images, all pre-configured to provide a wonderful PHP development environment.

セットアップ方法の概要は公式ページにさらさらっと書いてあります。
公式ページを参考にして構築していきます。

# 環境構築
## ディレクトリ構成
ディレクトリの構成は好みによると思いますが、僕は下記のようにしてます。

```
project-name
    - project-name_app
    - laradock_project-name
```

`project-name_app` -> ソースコードディレクトリ
`laradock_project-name` -> Laradockをcloneしてくるディレクトリ

## Laradockの導入とDockerコンテナの起動
### Laradockをgithubからclone
今回はプロジェクト単位でLaradockを導入します。
上記の `laradock_project-name` ディレクトリにLaradockのリポジトリをcloneしてきます。

```
$ cd my_project
$ git clone https://github.com/Laradock/laradock.git laradock_project-name
```

### Laradockの環境設定
環境設定ファイルのexampleがあるので、それを `.env` としてコピーします。

```
$ cd laradock_project-name
$ cp env-example .env
```

`.env` ファイルの以下の部分を書き換えます。
その他にも色々と項目がありますが、下記は最低限コンテナを立ち上げるために必要な設定なので参考にしてください。
それ以外は構築したい環境に合わせて書き換えてください。

```txt:.env
### Paths #################################################

# Point to the path of your applications code on your host
APP_CODE_PATH_HOST=../project-name_app

# Point to where the `APP_CODE_PATH_HOST` should be in the container. You may add flags to the path `:cached`, `:delegated`. When using Docker Sync add `:nocopy`
APP_CODE_PATH_CONTAINER=/var/www:cached

# Choose storage path on your machine. For all storage systems
DATA_PATH_HOST=~/.laradock_project-name/data
```

### Dockerコンテナの起動
下記のコマンドを実行します。
コンテナのStateがUpになっているのを確認できればOKです。

```
$ cd laradock_project-name
$ docker-compose up --build -d nginx postgres redis workspace
$ docker-compose ps
            Name                           Command               State                     Ports
-------------------------------------------------------------------------------------------------------------------
laradock-codenote_nginx_1       nginx                            Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
laradock-codenote_php-fpm_1     docker-php-entrypoint php-fpm    Up      9000/tcp
laradock-codenote_postgres_1    docker-entrypoint.sh postgres    Up      0.0.0.0:5432->5432/tcp
laradock-codenote_redis_1       docker-entrypoint.sh redis ...   Up      0.0.0.0:6379->6379/tcp
laradock-codenote_workspace_1   /sbin/my_init                    Up      0.0.0.0:2222->22/tcp
```

### ここまでの動作確認
ブラウザでlocalhostにアクセスして、nginxの404エラーが出ていれば大丈夫です。

## Laravelの導入
### workspaceの起動
workspaceというコンテナイメージがLaradockには用意されています。
workspaceはLaravelに必要なツールを一式用意してくれます。
composerなどのコマンドを叩く時はworkspaceを通して叩くことになります。

```
$ docker-compose exec workspace bash
```

### Laravelのインストール
composerを利用してLaravelの新規プロジェクトを作成します。

```
$ composer create-project --prefer-dist laravel/laravel ./
```

### Laravelの環境設定
Laravelのプロジェクトディレクトリに `.env` ファイルが作成されています。
ここに記載されているのがLaravelの環境設定になります。
Laradockの `.env` ファイルに記載した設定を同様に記載してください。

### 動作確認
DBの設定が上手く出来ているかどうかは、 `php artisan migrate` などを走らせて確認してください。
最後に、ブラウザでlocalhostにアクセスして、Laravelのスタート画面が表示されていれば問題ないです。
PandasのDataFrameをグラフ表示してCSVでダウンロードする

# 試したこと

[前回](https://qiita.com/FrozenVoice/items/d29f197602aa8cbcd7f1) で気象庁の「アメダス(表形式)」から取得したデータをグラフ表示&CSVダウンロードしてみる。

# 気温をグラフ表示

```python
import matplotlib
import matplotlib.pyplot as plt

plt.style.use('ggplot')
df = tables[0].iloc[1:,:1]

df.columns=['temperature']
df=df.astype(float)
df.plot()
```

|![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/165884/ac210d1f-05a4-9714-69ef-27063920c96a.png)|
|:--|


最初に試した時には `TypeError: Empty 'DataFrame': no numeric data to plot` となってしまった。

調べた所値が ~~整数ではなく小数点以下を含む~~ 文字列として認識されている場合に発生するようなので、`df=df.astype(float)`を指定して回避した。

また、取得しているデータの先頭行に値の単位が文字列として入ってしまっている事が文字列として認識されている原因なので、下記のように予め単位も含めてヘッダ行にすればastypeの指定が不要だった。

```python

tables = pd.read_html(url, flavor='bs4', match="時刻", header=[0,1], index_col=0)
```

**@skotaroさんから頂いたコメントを反映**

# データをCSVでダウンロード

```python
from google.colab import files

filename = 'sample.csv'

tables[0].to_csv(filename)
files.download(filename)
```

<pre>
時刻,気温,降水量,風向,風速,日照時間,湿度,気圧
時,℃,mm,16方位,m/s,h,%,hPa
1,13.6,0.5,北,2.7,,99,1008.0
2,13.5,0.5,北北東,2.6,,99,1008.4
3,12.8,0.5,北北西,2.9,,100,1009.0
4,12.5,0.0,北北東,2.6,0.0,98,1009.5
5,12.5,0.0,北北東,2.7,0.0,97,1010.3
6,12.4,0.0,北北西,1.9,0.0,98,1011.2
・・・以下略
</pre>

Colaboratoryのfilesでダウンロード出来る。
アップロードも同じように指定するとブラウザからアップロード出来る模様。
minikubeでefkを使ってみる

# EFKでk8sのログを取得したい
ということで、minikubeからefkを使ってみました。

# お急ぎの方
```
# minikube start --memory 4096
# minikube addons enable efk
```
しばらく待つとkibanaにアクセスできます

# minikubeの起動
こちらのサイト様を参考にしてください。
[Minikube ではじめる Kubernetes 入門](https://qiita.com/nirasan/items/6207cf7ef94e04640fbf)

# addon-manager
minikubeにはよく利用される追加機能のmanifestを管理してくれる`addon-manager`が存在します。
[addon-manager](https://qiita.com/inajob/items/300805e895eec6535dd2)

この中にefkがあるので、今回はそちらを利用します。

# efkの起動
まずはminikube起動時に有効になっているaddonを調べます。

```
# minikube addons list
- addon-manager: enabled
- coredns: disabled
- dashboard: enabled
- default-storageclass: enabled
- efk: disabled
- freshpod: disabled
- heapster: disabled
- ingress: disabled
- kube-dns: enabled
- registry: disabled
- registry-creds: disabled
- storage-provisioner: enabled

# kubectl get pod -n kube-system
NAME                                    READY     STATUS    RESTARTS   AGE
kube-addon-manager-minikube             1/1       Running   0          54s
kube-dns-54cccfbdf8-dkjrd               3/3       Running   0          45s
kubernetes-dashboard-77d8b98585-ckb68   1/1       Running   0          45s
storage-provisioner                     1/1       Running   0          46s
```

efkはdisableになっているため、有効にします

```
# minikube addons enable efk
# minikube addons list
- addon-manager: enabled
- coredns: disabled
- dashboard: enabled
- default-storageclass: enabled
- efk: enabled
- freshpod: disabled
- heapster: disabled
- ingress: disabled
- kube-dns: enabled
- registry: disabled
- registry-creds: disabled
- storage-provisioner: enabled
```

これだけです。

# 起動しない
`elasticsearch-logging`と`kibana-logging`が起動に失敗し、再起動を繰り返します。

調べたところ、[efkのメモリ不足](https://github.com/kubernetes/minikube/issues/2330)のようです。
（minikubeのデフォルトは2048MB）

# メモリを増やす
上記サイト様の通り、minikubeのパラメータで`--memory`を指定します。

```
# minikube start --memory 4096
# kubectl get po -n kube-system
NAME                                    READY     STATUS    RESTARTS   AGE
elasticsearch-logging-mvs8g             1/1       Running   0          3m
fluentd-es-7c7mw                        1/1       Running   0          3m
kibana-logging-m5j4f                    1/1       Running   0          3m
kube-addon-manager-minikube             1/1       Running   0          5m
kube-dns-54cccfbdf8-dkjrd               3/3       Running   0          5m
kubernetes-dashboard-77d8b98585-ckb68   1/1       Running   0          5m
storage-provisioner                     1/1       Running   0          5m
```

起動が確認できました！
あとは`minikube addons open efk`でkibanaのブラウザが立ち上がります。

# kibanaにつながらない
`Connection refused`となり、他にも原因があるのかと調べてたところ、kibanaにアクセスできるようになっていました。
おそらくkibanaにつながるまである程度時間がかかるようです（情報求）

# kibanaにアクセス
あとはいつもの画面が出てきますので、「Create」ボタンを押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/237745/df8f30f8-7f24-e494-77a3-abc8e5586572.png)

minikubeのクラスタ情報が取得できました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/237745/970c9be6-9150-827d-a062-c32d34d13dd7.png)

# 次回
どういったログが取得できるのかを見ていきます。
あとdashboard作れるようになります。。。
手順をシェアするとき、「gif画像+文字」でやるととても楽だった

#誰に向けて
・チーム開発でドキュメント作成する人
・手順書作るのが面倒な人
#経緯
チーム開発でバグを発見。
メンバーにもシェアよう。
↓
バグチケット作成。
再現方法を記述。
↓
現場ではドキュメント作成は英語。
チームメンバーは多国籍。
文字だけだと伝わるか不安。
↓
世界に共通言語があればいいのに…
↓
#gif画像を生成するツール「ScreenToGif」
https://freesoft-100.com/review/screentogif.html
gif画像がありました。
こちらはgif画像を作るためのフリーツールです。
使い方は省略します。
gif画像は「手順」を伝えるベストな手段の1つです。
速いし正確に伝わります。
#gifの速さがわかる例
たとえば、
「Google Chromeで検索結果の文字列を全て赤枠で囲む手順」
を伝えたいときを考えます。
そんなときはないですが。
##文字で伝えるとき
1.適当な文字列でGoogle検索する
2.検索結果の1番目を右クリック
3.「検証」を選択してDeveloperToolを開く
4.「Style」タブを選択する
5.「Style」タブ内の右上にある「+」ボタンをクリック
6.「h3>a」と入力
7.TABキーを押下
8.入力カーソルが点滅するのを確認
9.「border」と入力
10.TABキーを押下
11.「solid」と入力
12.ENTERキーを押下
13.「border-color」と入力
14.TABキーを押下
15.「red」と入力
16.ENTERキーを押下

長い。
あえてかなり刻んで記述しました。

これが、gif画像だとどうなるか。
↓
##gif画像
![gif_effective.gif](https://qiita-image-store.s3.amazonaws.com/0/228301/542b5b28-e27d-2ac8-c896-043fb2526812.gif)
（クリックすると最初から再生されます）

圧倒的に速い。
「どこをクリックすればいいか」
「どう入力するか」
が文字よりわかりやすい。
ただ、入力する内容は補足で書いておくのが親切ですね。
コピペしやすいように。

#gif画像が文字より伝わるのは、一次情報だから

あるできごとを誰かに伝えるとき、**言語化した時点で二次情報になります**。
1つのニュースの切り取り方がメディアによって異なるように、言語化は人によって異なります。
一方で、gif画像は誰が作っても同じになります。
言語化する前の一次情報だからです。
したがって、誰が見ても正確に伝わります。

#メリット
・資料作成が圧倒的に楽
・すぐ伝わる
・漏れなく伝わる
・言語の壁がない
#デメリット
・あまりに長い手順には対応できない
→見落としたとき、初めから再生する必要がある
「今どうやったんだ？」
ということがあります。
短い手順なら、最初から再生するのも苦じゃありません。
長い手順だと苦です。
#おわりに
gif画像は便利です。
ただ、文字による手順も書いた方が親切です。
補足的に使いましょう。
Ruby 開発環境構築(SublimeText)

Rubyを少し触ってみたくなったのでので開発環境を構築してみた。
ゆくゆくはRuby on RailsでWebアプリを作ってみたい。

## Rubyのインストール

今回はWindowsで開発をするため**RubyInstaller**を使用してインストール。
https://rubyinstaller.org/


## エディタの選定

最初はVisualStudio Codeを使おうと思っていたが、コードの補完機能の設定が上手くいかなかったので今回は**SublimeText**を選択した。

https://www.sublimetext.com/
上記サイトからダウンロードしてインストール

## Package Controlのインストール

Package ControlはSublimeTextを拡張するパッケージをインストール・管理したりするためのツール。

### インストール方法
1. SublimeTextを起動して、**ctrl+`**でコンソールを開く
2. コンソールに下記の文字列を入力して**Enter**を押す(文字列はhttps://packagecontrol.io/installation
に記載されている)

```
import urllib.request,os,hashlib; h = '6f4c264a24d933ce70df5dedcf1dcaee' + 'ebe013ee18cced0ef93d5f746d80ef60'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)
```

## SublimeCodeIntelのインストールと設定

SublimeCodeIntelはコードの補完機能を行ってくれるプラグイン。

1. SublimeTextで`ctrl+shift+P`でコマンドパレットを開く
2. **package control install package**を選択する
3. **SublimeCodeIntel**と入力する
4. インストールが始まる

SublimeCodeIntelプラグインの設定については下記サイトが参考になる
https://daruiapprentice.blogspot.jp/2015/05/sublime-text3ruby.html

## IMESupportのインストール

SublimeTextは日本語を入力すると小窓が表示されてしまう。
そのためIMESupportというプラグインをインストールする必要がある。

1. SublimeTextで`ctrl+shift+P`でコマンドパレットを開く
2. **package control install package**を選択する
3. **IMESupport**と入力する
4. インストールが始まる

## Terminalのインストール

Terminalはショートカットキー(`ctrl+shift+T`)でターミナルを開けるようになるプラグイン。

1. SublimeTextで`ctrl+shift+P`でコマンドパレットを開く
2. **package control install package**を選択する
3. **Terminal**と入力する
4. インストールが始まる

その他にも役に立ちそうなプラグインがあれば適宜追加する予定。
fetch from NSURL

```
/ * sample
var videos: [Video] = {
   var kanyeChannel = Channel()
    kanyeChannel.name = "TTT"
    kanyeChannel.profileImageName = "TTTTT"
    
    var tmpVideo = Video()
    tmpVideo.title = "fafds"
    tmpVideo.thumbnailImageName = "spdka"
    tmpVideo.channel = kanyeChannel
    tmpVideo.numberOfViews = 3232

    var ttVideo = Video()
    ttVideo.title = "aaaaaaaa"
    ttVideo.thumbnailImageName = "fffffff"
    ttVideo.channel = kanyeChannel
    ttVideo.numberOfViews = 3434343

    return [tmpVideo, ttVideo]
}()
*/

var videos: [Video]?


func fetchVideos() {
  let url = NSURL(string:"https://....../home.json")
  NSURLSession.sharedSession().dataTaskWithURL(url!) { (data, response, error) in
   if error != nil {
      print(error)
    }

    do {
         let json = NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers)

          self.videos = [Video]()
          for dictionary in json as! [[String: AnyObject]] {
              let video = Video()
              video.title = dictionary["title"] as? String
              ....
              let channelDictionary = dictionary["channel"] as! [String: Anyobject]
              let channel = Channel()
              cannel.name = channelDictionary["name"] as? String
              video.channel = channel
              videos?.append(video)
          }
          self.collectionView?.reloadData()
          //print(json)
         
    } catch let jsonError {
       print(jsonError)
    }
  
  }.resume()
}

collectionView numberOfItemsInSection..
return videos?.count ?? 0
```