OmniAICreator/Qiita-1.07M huggingface dataset:
HomeBrewでmacOS 10.13(Hight Sierra)にCarthage入れる時のエラー

"XCodeプロジェクト名".xcworkspaceで、Run実行しようとしたら

```
Run custom shell script 'Run Script'
```
との警告がなされ、

```
/Users/XXX/Library/Developer/Xcode/DerivedData/XXXX
/Build/XXX/XXX.build/Debug-iphonesimulator/
XXX/Script~512334.sh: line 2:/usr/local/bin/carthage: No such file or directory
```
とのエラー文が...

＞[Xcode＋CocoaPodsで起こった問題と対処](https://qiita.com/Takumi_Mori/items/42a5c993041dbbc86f85)
という記事の中にXcodeの Info Configrationの設定がおかしいとの記述があるので
試してみた所　→　errorは消える事なく。。。


先程のerror文をよく見ると、最後の一文に

```
usr/local/bin/carthage: No such file or directory
```
と「もう！localのbinの中に"carthage"が見つからないよ！」
的なこと書いてあったのでインストールを試みました。


```
$sudo brew install carthage
```

すると、、

```
Error: You are using macOS 10.13.
We do not provide support for this pre-release version.
You may encounter build failures or other breakages.
Please create pull-requests instead of filing issues.
```

どうやらHigh Sierraだとサポート対象上のエラーが出るようです。

そして調べていくとHigh Sierra とHomeBrewの相性の問題のようですね。

['brew update' errors on MacOS 10.13 (High Sierra)  for GitHub](https://github.com/Homebrew/brew/issues/3285#issuecomment-334976806)

ってことで、HomeBrewを再インストールすると無事Runできました。
OpenStreetMap データ（japan-latest.osm.pbf）から指定範囲切り出し

こんにちは。
日本の OpenStreetMap データ（japan-latest.osm.pbf, 1GB以上）をダウンロードし、指定範囲で切り出しなどを行いました。以下の手順です。

#### ダウンロード

```console
$ wget https://download.geofabrik.de/asia/japan-latest.osm.pbf
$ wget https://download.geofabrik.de/asia/japan.poly
```

#### データ最新化する場合
osmupdate コマンドを使いました（osmfilter に含まれるコマンド）。

```console
$ brew install osmfilter
$ osmupdate --hour --day -B=japan.poly -v japan-latest.osm.pbf japan-latest-updated.osm.pbf
```

#### 必要な範囲のデータを抽出する場合
osmium コマンド（の extract 処理）を使うと（osmium-tool に含まれるコマンド）、必要な範囲のデータを抽出処理できます：

```console
$ brew install osmium-tool
$ osmium extract --polygon japan.poly -o japan-latest-updated-complete.osm.pbf japan-latest-updated.osm.pbf
$ osmium check-refs japan-latest-updated-complete.osm.pbf
Nodes in ways missing: 0
```

##### 矩形範囲を指定しデータを切り出す場合
より小さい矩形範囲を指定し切り出す場合は、

```console
$ brew install osmium-tool
$ tokyo_bbox="139.500,35.494,140.000,35.900"
$ osmium extract --bbox $tokyo_bbox -o tokyo.osm.pbf japan-latest-updated.osm.pbf
$ osmium check-refs tokyo.osm.pbf
Nodes in ways missing: 0
```

#### pbfデータ読み取り例
上記データの読み取り例です（参考：「[Golang で OpenStreetMap ファイル（osm.pbf）の読み込み（osmpbf 利用）](https://qiita.com/kkdd/items/bd653e3d02546d1aa340)」）。

```console
$ go run osmpbf_progressbar.go -ncpu 4 tokyo.osm.pbf 
54732 / 54732 [====================================================] 100.00 % 4s
Nodes: 5,492,671, Ways: 1,039,991, Relations: 4,422
```
新しい Slack チャンネルが作られたことを知りたい

チャンネル数が多くなってくると新しくチャンネルが作られてもわからないという課題が出てくる
他にも次が発生したときにすぐにそのことを知りたい

- チャンネルの名前が変わる
- チャンネルが archive される

チャンネルに対して何か操作された際に特定チャンネルにその情報を post することで解決を図る

Events API
---

チャンネル操作をハンドリングするために Slack が提供している Events API を利用する

https://api.slack.com/events-api

Slack App に対してイベントを通知するための API で、イベントをよしなに処理することでいろいろできる
次に使用するための設定を記載する

### イベント送信先 URL の verification

まずイベント送信先 URL の verification が必要
Slack App 設定の `Event Subscriptions` を開く

<img width="761" alt="verification.png" src="https://qiita-image-store.s3.amazonaws.com/0/27516/86104063-7d9c-0d43-7737-dfeac563b900.png">

↑のように送信先 URL をいれると次のような JSON が飛んでくる

```json
{
    "token": "Jhj5dZrVaK7ZwHHjRyZWjbDl",
    "challenge": "3eZbrw1aBm2rZgRNFdxV2595E9CY3gmdALWMmHkvFXO7tYXAYM8P",
    "type": "url_verification"
}
```

`type` が `url_verification` となっている
このときに `challenge` をそのまま送り返すと verification が完了するという仕組み

### イベントの subscribe

同じく `Event Subscriptions` ページにどのイベントを送るかを指定する欄がある
そこに次を指定する

- channel_archive
- channels_read
- channel_deleted
- channel_rename
- channel_unarchive 

記事公開時点でチャンネルに関して指定できるイベントは↑で全部

<img width="761" alt="events.png" src="https://qiita-image-store.s3.amazonaws.com/0/27516/d2d540fe-1afa-c4df-59ae-6a3317897f32.png">

### permission の scope を設定する

`OAuth & Permissions` の Scopes で設定する
チャンネル関係で必要になる scope は `channels:read` のみ
メッセージを post したいので `incoming-webhook` も指定する

<img width="699" alt="scope.png" src="https://qiita-image-store.s3.amazonaws.com/0/27516/393c6ab2-7407-c4c7-d712-3a37639f6ea2.png">

### Incoming Webhook の登録

`Incoming Webhooks` の一番下にある `Add New Webhook to Workspace` から登録する
post したいチャンネルを指定するだけでいい

### OAuth token の取得

作成した Slack App はすでに自分の workspace に導入済みなので OAuth token は発行済み
`OAuth & Permissions` に記載されているのでメモる

実装
---

イベントハンドラーは AWS Lambda と API Gateway 上に Serverless Framework を使って実装してみた

https://github.com/januswel/slack-channel-notifier

`sls deploy` して次の環境変数を設定すれば使えるようになる

- `SLACK_OAUTH_TOKEN`
- `SLACK_INCOMING_WEBHOOK`

注意点
---

Slack App で Incoming Webhook を使う場合、 Slack App のアイコンと名前が使われる
この場合 Incoming Webhook ではアイコンと名前を指定できない
railsでbootstrapを導入する方法

# bootstrapのDL

https://getbootstrap.com/docs/4.0/getting-started/download/

でCompiled CSS and JSをDL

# jsとcssを設置

railsはassets下においたcssとjsをコンパイルしてくれるのでここのファイル下に上記でDLしたファイルを設置

これだけ
deviseのログインをcookieで維持する方法

Railsでdeviseというお決まり認証gemを使う際に、アクセスするたびにuserにログインさせるのではなく、一度ログインしたら次回以降ログイン不要になるように実装しました。

# まずはコード
下の３行を足せば実現できました。めっちゃ簡単！！

```ruby
# deviseを適用させているモデル
class User < ActiveRecord::Base
 
  devise :database_authenticatable, 
    :trackable, :encryptable, :confirmable, :recoverable,
    :registerable, :validatable, :lockable, :rememberable # 有効にするdeviseモジュール達
 
  # @return [Boolean] cookieを使いログイン情報を保持するかどうか -> ここではtrue
  #   この3行を付け足せばokです
  def remember_me
    true
  end
end
```
同じことを実現している記事が見つからなくて、公式ドキュメントなど読んでいたんですが、個人ブログで書いている方がいてそちらを転載させていただきました。感謝です。。（[元ソース](https://mensfeld.pl/2013/12/rails-devise-and-remember_me-rememberable-by-default/)）
まあデフォルトでremember meのチェックボックスがあるんだからこれでできますよねそりゃ。

# その他
他にcookieに対するtimeout設定などはドキュメント等に記載されているのでそちらをご参考に。（[公式doc](http://www.rubydoc.info/github/plataformatec/devise/)）

そもそもdeviseの初期設定などは他にも記事があるのでそちらを参考にして見てください！
では！
google cloud sdkを190.0.1にバージョンアップしたら `goapp cannot import name goroots` のエラーが発生した

今日、 `google cloud sdk` を `190.0.1` にバージョンアップしたら、 `goapp cannot import name goroots` というエラーが出た。

再インストールしたりしても直らなかったため備忘録として。

## 原因
`${GCLOUD_SDK_ROOT}/platform/google_appengine/google/appengine/tools` から `goroots.py` というスクリプトが消えてた。

## 対応
過去のバージョンを参考に、下記のスクリプトを追加した。

```python:${GCLOUD_SDK_ROOT}/platform/google_appengine/google/appengine/tools/goroots.py
GOROOTS = {
    'go1': 'goroot-1.8',
    'go1.6': 'goroot-1.6',
    'go1.8': 'goroot-1.8',
}
```

とりあえずこれで動く。

他にいい対応あるかもしれないし、もしかしたら僕の環境でしか発生しないかもしれないけど、誰か何か知ってたら教えてください。


# 追記 Google Cloud SDK の goapp コマンドについて
[golang/appengine#124 (comment)](https://github.com/golang/appengine/issues/124#issuecomment-368942338)より

> goapp is not supported when run from the gcloud sdk. If you still must use it, please use the legacy SDK by going to https://cloud.google.com/appengine/docs/standard/go/download and clicking "Download and install the original App Engine SDK for Go."

このコメント見る感じ、なんか今後修正されなさそうな気配がするため、今後は `goapp` 使わない方がいい気がする。
`goapp` コマンド使えなくても対して困らない気はするけど、CIとかでテストとかデプロイにgoappコマンド使ってるケースもあると思うので、既存のプロダクトは気をつけた方がよさそう。
LaTeXで楽に規則案を作成しよう！

#はじめに
健全な日常生活を送っているみなさんならば、最低でも一年に一回は法律案や、規則・規約を作らなければいけない状態になると思います。ところが日本の法律というのは昔から続くかなり特殊な書き方に則って書かれています。

というわけで、中身以外の“本質的ではない”部分を肩代わりするパッケージを作りました。

置き場所は[GitHub](https://github.com/puripuri2100/joubun)です
#機能紹介
目次（自動ではなく、中身は手打ちです。いつか半自動、もしくは完全自動にしたいものです。）と、編・章・節・款・目・条・項・号と、附則をサポートしています。また、枝番号と削除にも対応しています。今のところ、イロハなどのかなり下の方の項目は付けていません。

番号については、きちんと全角数字にするところは全角数字に、漢数字にするところは漢数字になっています。しかし、漢数字は色々な事情があった結果、最大で2千までしか使えません。まあ日本にある法律で最も多いのは民法の1044条らしい（なんか中央省庁等改革関係法施行法とかいうものは、1344条まであるとかなんとか？）のでたぶん大丈夫でしょう（どうにかしてきちんとしたアルゴリズムを実装したいものです。）。

横組みだけではなく、縦組みにもきちんと対応しています。このパッケージには直接は関係しませんが縦組みと横組みのどちらが正当なのでしょうね？国としては。
#コマンドについて
2018/02/24現在、コマンドの命名規則はよくわからないローマ字式です。ここらへんをきちんと整理したらその他の機能もつけたり内部処理をすっきりさせたりして新たにパッケージとして公開する予定です。

編・章・節・款・目・項・号については単純に、`\hen{<中身>}`とか`\syou{<中身>}`とかです。単純ですね。

条については、`\jou[<（見出し）>]{<中身>}`です。見出しについては括弧も付けて書いてください（実力不足ですね。すみません。）。

附則と目次については環境です。そして、その中に`\jou{<中身>}`とか`\kou{<中身>}`とか`\hen{<中身>}`とか書くわけです。つまり

~~~latex
\begin{mokuji}
\hen{あれ}
\syou{アレ}
\setu{ｱﾚ}
\kan{ああれれ}
\moku{アレアレ}
\hen{ア・レ}
\end{mokuji}

\begin{husoku}
\kou{附則については項番号を用いるらしい}
\jou{でも最近では条を用いることも多いとか}
もちろん一つしかないときは地の文ですが
\end{husoku}
~~~

とか書けば良いわけです。ちなみに、`\hen`とか`\kan`とかのコマンドは本文内で使うものと同じです。環境内だけで定義を少し変えています。

#使い方
実際に少し書いてみます。入力と出力を載せておきます。

入力

~~~latex
%pLaTeXじゃないと使えません。
\documentclass{jsarticle}

\usepackage{joubun}

\begin{document}

\begin{mokuji}
\hen{債権}
\syou{総則}
\setu{多数当事者の債権及び債務}
\kan{保証債務}
\moku{賃金等根保証契約}
\hen{親族}
\husoku
\end{mokuji}

\hen{債権}
\syou{総則}
\setu{多数当事者の債権及び債務}
\kan{保証債務}
\moku{賃金等根保証契約}

\jou[（共同保証人間の求償権）]{第四百四十二条から第四百四十四条までの規定は、数人の保証人がある場合において、そのうちの一人の保証人が、主たる債務が不可分であるため又は各保証人が全額を弁済すべき旨の特約があるため、その全額又は自己の負担部分を超える額を弁済したときについて準用する。}
\kou{第四百六十二条の規定は、前項に規定する場合を除き、互いに連帯しない保証人の一人が全額又は自己の負担部分を超える額を弁済したときについて準用する。}


\edajou[（貸金等根保証契約の元本の確定事由）]{次に掲げる場合には、貸金等根保証契約における主たる債務の元本は、確定する。}
\gou{債権者が、主たる債務者又は保証人の財産について、金銭の支払を目的とする債権についての強制執行又は担保権の実行を申し立てたとき。ただし、強制執行又は担保権の実行の手続の開始があったときに限る。}
\sakujo{gou}
\gou{主たる債務者又は保証人が死亡したとき。}

\sakujo{jou}

\jou{債権は、譲り渡すことができる。ただし、その性質がこれを許さないときは、この限りでない。}

\hen{親族}

\begin{husoku}
\kou{削除}
\kou{この法律に定めるもののほか、この法律の施行に伴う経過措置及び関係法律の整備その他必要な事項については、別に法律で定める。}
\end{husoku}

\end{document}
~~~

結果

![joubun-manual_000001.jpg](https://qiita-image-store.s3.amazonaws.com/0/222743/b0ffb30a-b2c7-f642-f4b5-fd5307f91aa6.jpeg)


#問題点等
現在、このパッケージは不充分であることは十分に自覚していますので、以下に書いておきます。

 - 定義がぐちゃぐちゃで空白幅なども適当すぎる
 - 号の部分の定義をもっと適切にしなければならない
 - 号の下を作らねばならない
 - 各ドキュメントクラスに依存しすぎている
 - 漢数字への置き換えが力技すぎる
 - ローマ字の書き方

#今後の展望
定義や漢数字やローマ字、号の下は後で追加できると思います（漢数字についてはかなり微妙ですが）。

ですが、号の形を適切にするにはlist環境の勉強をきちんとしなければならないと思います。が、あまり情報がなくて困っています。

また、目次部分は一つのコマンドでできるようにしたいと思っています（実は第n章　hoge（第m条―第l条）とのように書かなければいけないようなのでそれも実装したいのです。）。

後は、joubunクラスを作る必要があると強く感じました。しかしあまりにも知識がなさすぎて困ってもいます。まあボチボチ作成すれば良いのかもしれませんが。

ということでまだまだ先は長いですが、一つの区切りとしてここに完成品を作りましたので、後はこれを参考に発展させる方がいればお願いします。（これからも開発は続けていく予定ではありますので楽しみにしていてください……）最初はCTANにもあげるつもりでしたがあまりにも酷い出来なので見送ります。
ゼロから作るDeepLearning第二章　パーセプトロン

#0.　第二章について
　第二章では、第三章から解説されるニューラルネットワークの単体パーツであるパーセプトロンについて語られるのじゃあ・・・。
　基本中の基本となるらしいので、ここをある程度理解しないと後々やばいのじゃ・・（体験談）

#1.　パーセプトロンとは
　パーセプトロンは、人間の脳の神経細胞を模したものであり、複数の入力を受け取って、ある信号を出力するのじゃ。
　パーセプトロンは複数の**ニューロン**で構成されていて、各ニューロンから送られてきた信号に重みが乗算され、その総和がある限界値（**閾値**）を超えた場合に１を出力されるのじゃ。（基本的な場合のじゃあ）
　以下の図では、一つ一つの○がニューロンであって、矢印の部分の値が重みなのじゃ。図全体で一つのパーセプトロンを表すのじゃよ。計算式は

```math
y = x_1*w_1 + x_2*y_2
```

　なのじゃあ！


![パーセプトロン](https://qiita-image-store.s3.amazonaws.com/0/211482/982d80db-cd3c-bf28-ffb3-a37e95b83f6b.png)


#2.　パーセプトロンの特徴

##2.1　パラメータ
　パーセプトロンは複数のパラメータを持つのじゃあ・・
　具体的には

- 重み(w1, w2)
- バイアス(b)
- 閾値・出力値（またの名を活性化関数h）

などがあるのじゃあ・・・

![パーセプトロン](https://qiita-image-store.s3.amazonaws.com/0/211482/0dc02b47-6402-a863-a07c-71de4f9ee8dd.png)


パーセプトロンの行っている処理の計算式は以下のこうなのじゃ！

```math
a = x_1*w_1 + x_2*w_2 + b\\
y = h(a)
```

上記の説明ではわらわ含めてちんぷんかんぷんのはずじゃあ・・
というわけでとりあえずそれぞれのパラメータを見ていった後、もう一度全体と数式を見直そうと思うのじゃあ・・

##2.2　重み w1, w2, w3...
　重みは図でいうと矢印の値ことなのじゃ。それぞれのニューロンがどれぐらいの関連度で結びついてるかを定めるのじゃあ・・・
　例えば、重みw1が１０００ぐらいだったら無茶苦茶ニューロンが結びついてて、重みw2が0だったら、最早ないに等しいのじゃ。

##2.3　バイアス b
　バイアスは英語だとbias。
　他のヒューロン間の重みとは独立していて、必ず足されるものじゃな・・・
　理解しずらかったら、中学数学で習ったy=ax+bの、y切片のbみたいなもんじゃと考えると分かり易いのかもしれないのじゃが・・
　バイアスを使用する理由としては、完全には理解してないのじゃが、必ず足す値としてバイアスを使用することで、ニューロンの反応しやすさをコントロールするためなのだと思うのじゃ・・・・理解が足りず申し訳ないのじゃ・・

##2.4 閾値・出力値・活性化関数h
　ここが一番パーセプトロンの理解で難しいと思うのじゃあ・・
　パーセプトロンは、複数のニューロンから受け取った信号の総和を、**活性化関数hで変換してから出力するのじゃあ・・・**

```math
a = x_1*w_1 + x_2*w_2 + b\\
y = h(a)
```
　上の式を見てみるとまず
1.　それぞれのニューロンからの重み付きの信号を受け取る (x1*w1 + x2*w2)
2.　反応しやすさを決めるバイアスを足す (+b)
3.　総和を求める　(a = x1*w1 + x2*w2)
4.　活性化関数hで変換をする
　という処理を行っているのじゃ・・
　
比較的1~3は理解しやすいと思うのじゃ・・・なぜならそれぞれのニューロンからの信号を受け取って足し算をしているだけなのじゃ・・
4では、何をやっているかというと、パーセプトロンの表現を豊かにするために、活性化関数をかけているのじゃ・・・
　まあドーピングキメて気持ちよくなっているみたいなもんじゃな・・・

##2.5　活性化関数
　活性化関数って何なのじゃあ！って声が聞こえてきたのじゃあ・・・
　活性化関数は、入力された値に一手間加えて、表現豊かな値に変換して出力する関数なのじゃ・・・
　活性化関数がないと、線形的な値しか出ず、後々のニューラルネットワークがうまいこと行かず死んでしまうのじゃあ・・・
　ちなみに、活性化関数にはシグモイド関数だとか、Relu関数があるんじゃが・・・
　とりあえずそういう関数があるんじゃなと思ってほしいのじゃ。第三章で記述しようと思うのじゃ・・・

##2.6　パーセプトロンの特徴総括

```math
a = x_1*w_1 + x_2*w_2 + b\\
y = h(a)
```
　
　一つ一つパラメータや関数を振り返ってみたのでパーセプトロンの処理を、処理の流れに沿って振り返っていこうと思うのじゃあ。

1. それぞれのニューロンから重みがかけられた信号を受け取るのじゃ
2. 反応しやすさをコントロールするためにバイアスが足されるのじゃ
3. 総和を求めるのじゃ
4. 活性化関数に先程求めた総和をぶち込むのじゃ
5. 活性化関数から出力された表現豊かな値を、また次のニューロンにぶち込むのじゃ

　以上のような流れでパーセプトロンは処理を行うのじゃあ・・・
　分かりづらかったら申し訳ないのじゃあ・・・


#3. なぜパーセプトロンを使うのか

　パーセプトロンを使用するのには理由があるのじゃあ・・・
　なぜなら、この後記述するニューラルネットワークはパーセプトロンの集合体でできており、DeepLearningの基本だからなのじゃ。
　パーセプトロンは構造が簡単で計算がしやすく、それを組み合わせるだけでDeepLearnigが出来るなんて夢のようじゃな・・・


#4. それぞれの章へのリンク
・[自己流まとめホーム](https://qiita.com/ganariya/items/03e303d9d059d96e213e)
・[第二章 パーセプトロン]()
・[第三章 ニューラルネットワークの学習](https://qiita.com/ganariya/items/d72075679871460c21a1)
・[第四章 ニューラルネットワークの学習]()
・[第五章 誤差逆伝播法]()
・[第六章 学習においてのテクニック]()
・[第七章 畳み込みネットワーク]()
・[第八章 DeepLearning]()

#5.　参考文献
書籍　ゼロから作るDeepLearning　オライリー・ジャパン
マークダウン記法　https://qiita.com/hiroyuki_hon/items/f2a779bb295fd12646ab
BLE Nano V2ボードをFeather nRF52のファームウェアで開発する

##概要
Feather nRF52のファームウェアは使いたいけどボードはもっとシンプルなのがいい人。

##ブートローダー書き込み
https://github.com/adafruit/Adafruit_nRF52_Arduino
の`bin/bootloader`内にある`feather52_bootloader_5.1.0_s132_dual.hex`ファイルをドラッグアンドドロップで書き込む。
<img width="768" alt="IMG_0408.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/21846/217c6065-3314-6d53-5c58-95c12830bdca.jpeg">

##書き込み器の制作
Feather nRF52のブートローダーはArduino Unoなどと同じようにUSBシリアル変換器を介してファームウェアをマイコンに書き込みます。その為にまずはNano V2のP6,P8,P21端子を引き出しましょう、この端子とUSBシリアル変換器を接続することになります。
<img width="768" alt="IMG_0409.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/21846/931fb5ac-597e-7973-a169-2b06bc769139.jpeg">

<https://learn.adafruit.com/assets/39913>
の回路図を参考にUSBシリアルボードと繋げます、UBSシリアルは信号レベルが3.3Vの物を使用しましょう。

![IMG_0414.jpg](https://qiita-image-store.s3.amazonaws.com/0/21846/0c219f6a-f5fa-1956-1bc1-ea5c66a80b04.jpeg)
こんな感じ
<img width="768" alt="IMG_0410.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/21846/6a8b0115-d0c3-9360-5040-7af3846f81b6.jpeg">

##ピン定義の変更
SPIやI2Cに割り当てられているピンがFeather nRF52と全然違うのでその辺のペリファラルを使用したい場合は`variant.h`を変更して割り当てたいピンに割り当てたい機能を割り当てる。

https://github.com/adafruit/Adafruit_nRF52_Arduino/blob/master/variants/feather52/variant.h

実際にはArduinoのボードマネージャーでAdafruit nRF52をインストールした時に追加されるファイルを書き換えます、私の環境では`C:\Users\XXXXX\AppData\Local\Arduino15\packages\adafruit\hardware\nrf52\0.8.2\variants\feather52\variant.h`でした。

##まとめ
たまにはこういうのもいいんじゃないかな。
もしプログラミングを12歳ではじめたら ３日目

もしプログラミングを12歳ではじめたら ３日目
----

# ３日目です。

しばらく間があきましたが、３日目です。毎回やっているようにパソコンを開きます。
今回は電源もつないだし、バッテリー切れの心配もありません。

![バッテリー](https://qiita-image-store.s3.amazonaws.com/0/47058/16b3d6b0-f805-d814-25f5-9f063c57e6b9.png "バッテリー")

電源ボタン🔘をポチッとな。よし、準備完了。

# パスワードもおぼえてる

パスワードも忘れてないよ。今回はばっちりだよ。

![パスワード](https://qiita-image-store.s3.amazonaws.com/0/47058/1037977f-ccc4-2257-8501-bba1db7e7d86.png "パスワード")

# つづきはどこだっけ？

えーっと、前回は第２章の最初のほうでした。
えーっと、"hello, world" というのを書いた気がする。
そして、今回は、alertのなかまたちをおぼえます。

[![12歳からはじめるJavaScriptとウェブアプリ](//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4899774710&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=taniokah-22 "12歳からはじめるJavaScriptとウェブアプリ")](http://amzn.to/2iwQovO)
[12歳からはじめるJavaScriptとウェブアプリ](http://amzn.to/2iwQovO)

alertというのは、アラートダイアログというものなんですね。
それから、そのなかまには、prompt と confirm があるというわけですか。
prompt は入力で、confirm は確認っと。

# 変数を使う

confirm や prompt の入力は、変数で受け取るようです。どう書くんだ？

```
var name = "テントくん";
```

ふむ、この name というのが変数なわけですな。

# 自己紹介！！

よし、サンプルプログラムだよ。作ってみよう。

```jikoshokai.html
<script>
  var name = prompt("おなまえは？");
  confirm(name + "でいいんですか？");
  alert("こんにちは！" + name + "さん");
</script>
```

このプログラムをブラウザで開いて見ると？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/47058/b3085193-5c5f-6e81-3db4-289fd756d105.png)

お、なんか出た！ 

![image.png](https://qiita-image-store.s3.amazonaws.com/0/47058/444101a6-b92f-1287-25d0-1a0f69949206.png)

よし、「たくみん」っと。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/47058/7d2f41a5-80d7-8b30-1712-75ef197cd510.png)

うん、たくみんで、いーんです！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/47058/ef6ee778-07d2-0e58-ae86-ea325ef09a99.png)

「こんにちは！」だって、ふーん。なるほどね。
なんだか今回はすんなり動いてしまいましたよ。天才かも。あれ？でもまてよ、
本に出てくる四角とちょっとデザインが違うなあ。なんだろうなあ... (つづく)

# （あとがき）

こんにちは、谷岡です。少しあいだがあいてしまいましたが、３日目です。今回は、prompt や confirm を使って、ダイアログから文字列の入力や、確認画面を出せるようにしてみました。最後の方でつぶやいてますが、本の写真と、実際にやってみたダイアログのデザインが少し違うようです。本で使っているブラウザも、たくみんが使っているブラウザも、同じ Mac 用の Chrome なんですけどね。

本ではこんなかんじ　↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/47058/65b3b201-2175-2e7a-e7fc-d25910a60b4b.png)

やってみるとこんなかんじ　↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/47058/d8432373-9562-1379-de51-999a5e5d7152.png)

これは、Chrome のバージョンが新しくなって、デザインが変更されたことが原因です。OS や ブラウザの違いだけでなく、同じ環境、同じブラウザでもバージョンが異なることで、デザインや動作が少し変わってしまうことがあるのです。

実は、JavaScript というプログラミング言語自体の仕様が変更されることもあります。この本では、できるだけ基礎的で普遍的な文法のみを取り扱っていますが、もし文法の変更があった場合は、注意深く読み替えて記述する必要があることにお気をつけください。
dockerを使って好きなバージョンのMySQLを使う

Qiita初投稿です！
すでにたくさん記事が上がっている内容ですので、この記事は自分の日記のように書きたいと思います。


## きっかけ

先日、MySQLのバージョン5.6と5.7の差によって以下のようなエラーが起こりました。

```
# ActiveRecord::StatementInvalid: Mysql2::Error: Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'column_name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by:
```

手元ではMySQL5.7を使っていたのですが、会社ではMySQL5.6.38を使っていたためです。

自分のlocalのMySQLバージョンを5.6に下げる、という対応でもよかったのですが、
会社の先輩に「dockerでバージョン共存させてみたら？」と言われたのでやってみました。

dockerやMySQLはすでに設定済という前提で進めます。
記事の最後にRailsアプリからDB HOSTの向き先を変えるところも紹介しますが、Rails5を使っています。


## docker-machineの作成

以下のコマンドで作成・確認します

```
$ docker-machine create --driver virtualbox dev

$ docker-machine ls
NAME   ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
dev    -        virtualbox   Running   tcp://192.168.99.100:2376           v18.02.0-ce
```

ここで`STATE`が`Running`になっていなかったら再起動します。

## MySQLをインストール

バージョンを指定しつつ、dockerにMySQLをインストールします。

```
$ docker pull mysql:5.7
$ docker pull mysql:5.6.38

$ docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
mysql                             5.7                 f0f3956a1dd7        6 days ago          409MB
mysql                             5.6.38              15a5ee52ec53        2 months ago        299MB
```

##コンテナを起動
バージョン5.6の方で、コンテナ・MySQLの起動までやってみます。

```
$ docker run --name mysql5.6.38 -p 3307:3306 -e MYSQL_DATABASE=xxx -e MYSQL_USER=root -e MYSQL_ROOT_PASSWORD=xxx -d mysql:5.6.38
f1e8e25e6db7c26bc28dd2c3816ba5aj5b9d1504dc74f67e206566ed112g3b4a

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
f1e8e25e6db7        mysql:5.6.38        "docker-entrypoint.s…"   58 seconds ago      Up 58 seconds       0.0.0.0:3307->3306/tcp   mysql5.6.38

$ mysql -h$(docker-machine ip dev) -P3307 -uroot -pxxx
#いろいろ書かれる
・
・
・
mysql>
```

##Railsのデータベースへの向き先を変える
development環境とtest環境のみ向き先を変えたいので、
dotenvというgemを利用します。

```ruby:Gemfile
gem 'dotenv-rails'
```

```ruby:.env
DB_HOST=192.168.99.100
DB_PORT=3307
```

```database.yml
host: <%= ENV['DB_HOST'] || '127.0.0.1' %>
port: <%= ENV['DB_PORT'] || 3306 %>
```

`.env`ファイルはgit管理されていないので、手元で開発するときは`ENV['XXX']`を読み、本番環境では`'127.0.0.1'`などを読みます。

これで無事にRailsアプリをMySQL5.6.38で管理できるようになりました！

会社で開発するたびにdockerを起動するのが面倒（普段dockerを使わない人）だなぁと思うので、模索中です。

##参考にさせていただいた記事
・[DockerでMySQL複数バージョンを共存させる](https://qiita.com/tanakaworld/items/427b94ea0435b5dccfa2)
・[Railsで開発環境のデータベースだけdockerにしてみる](https://qiita.com/soudai_s/items/472bd702d74765bb06c5#_reference-4a8ab8bedb29dd133565)
・[環境によって変わる設定値はdotenvを使うと便利](https://qiita.com/closer/items/f8d8ba00ae86d7051764)
Laravel5.5から5.6へ更新する

# 親記事
[Laravelで基本的なCRUDを作る - Qiita](http://qiita.com/sutara79/items/ef30fcdfb7afcb2188ea)

親記事の中で作ったLaravelアプリを更新します。

# 依存パッケージを更新
公式ドキュメントの指示通りに`composer.json`を修正します。
:link: [5.5から5.6.0へのアップグレード](https://readouble.com/laravel/5.6/ja/upgrade.html)

```diff:composer.json
     "require": {
-        "php": ">=7.0.0",
+        "php": ">=7.1.3",
-        "fideloper/proxy": "^3.3",
+        "fideloper/proxy": "~4.0",
-        "laravel/framework": "5.5.*",
+        "laravel/framework": "5.6.*",
     },
     "require-dev": {
-        "laravel/dusk": "^2.0",
+        "laravel/dusk": "~3.0",
-        "phpunit/phpunit": "~6.0"
+        "phpunit/phpunit": "~7.0"
     },
(中略)
     "scripts": {
         "post-install-cmd": [
-            "Illuminate\\Foundation\\ComposerScripts::postInstall",
-            "php artisan optimize"
+            "Illuminate\\Foundation\\ComposerScripts::postInstall"
         ],
         "post-update-cmd": [
-            "Illuminate\\Foundation\\ComposerScripts::postUpdate",
-            "php artisan optimize"
+            "Illuminate\\Foundation\\ComposerScripts::postUpdate"
         ],
```

その後、更新を実行します。

```text:PowerShell
> composer update
```

# 漏れがないかを確認
[outdatedコマンド](https://getcomposer.org/doc/03-cli.md#outdated)で、他の依存パッケージに更新がないかを確認します。
`composer.json`に記載されているものの中では、mockeryに更新があるようです。

```text:PowerShell
> composer outdated
hamcrest/hamcrest-php                 v1.2.2  ~ v2.0.0  This is the PHP port of Hamcrest Matchers
mockery/mockery                       0.9.9   ~ 1.0     Mockery is a simple yet flexible PHP mock object framework ...
phpdocumentor/type-resolver           0.4.0   ~ 0.6.1
symfony/translation                   v3.4.4  ~ v4.0.4  Symfony Translation Component
```

さっそく下記のように`composer.json`を修正して再度updateを実行すると、失敗しました。

```diff:composer.json
-        "mockery/mockery": "0.9.*",
+        "mockery/mockery": "^1.0",
```

下記のログを読むと、どうやらmockeryを更新するにはhamcrest-phpの更新が必要のようです。

```text:PowerShell
> composer update mockery/mockery
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - don't install hamcrest/hamcrest-php v2.0.0|remove hamcrest/hamcrest-php v1.2.2
    - don't install hamcrest/hamcrest-php v2.0.0|don't install hamcrest/hamcrest-php v1.2.2
    - don't install hamcrest/hamcrest-php v2.0.0|don't install hamcrest/hamcrest-php v1.2.2
    - mockery/mockery 1.0 requires hamcrest/hamcrest-php ~2.0 -> satisfiable by hamcrest/hamcrest-php[v2.0.0].
    - Installation request for mockery/mockery ~1.0 -> satisfiable by mockery/mockery[1.0].
    - Installation request for hamcrest/hamcrest-php (locked at v1.2.2) -> satisfiable by hamcrest/hamcrest-php[v1.2.2].
```

[whyコマンド](https://getcomposer.org/doc/03-cli.md#depends-why-)で確認すると、hamcrest-phpを使っているのはmockeryだけです。

```text:PowerShell
> composer why hamcrest/hamcrest-php
mockery/mockery  0.9.9  requires  hamcrest/hamcrest-php (~1.1)
```

そこで、mockeryをインストールしなおします。

```text:PowerShell
# 一旦削除
> composer remove --dev mockery/mockery

# 改めてインストール
> composer require --dev mockery/mockery
```

これで完了です。
iOSをアップデートしたために実機でビルドができない

iOSをアップデートしたことによって、Xcodeから実機ビルドできない時がある。

![Screen Shot 2018-02-24 at 16.19.11.png](https://qiita-image-store.s3.amazonaws.com/0/143619/2bbac0a3-9490-a450-54a6-57efee042352.png)

```
Could not locate device support files.

This iPhone 6s is running iOs 11.3 (15E5189f), which may not be supported by this version of Xcode.
```


iOS11.3のデバイスサポートファイルが無いよと怒られている。

「DeviceSupport iOSXXX」とかで検索するとデバイスサポートファイルをDLできるサイトとかGithubリポジトリが出て来るはずです。

今回は[iPhoneOSDeviceSupport](https://github.com/filsv/iPhoneOSDeviceSupport)を使わせて貰いました。

不足しているデバイスサポートファイルをDLして、`/Users/<YOUR_NAME>/Library/Developer/Xcode/iOS DeviceSupport/`配下に入れときます。

一度Xcodeを再起動してからビルドすると、正常にビルドが通って幸せになれます。
Domo のデータセットの一覧を取得する (Node.js)

こちらのプログラムを Node.js で書きました。
[https://qiita.com/ekzemplaro/items/1efb65fcae5a826fa9b7](https://qiita.com/ekzemplaro/items/1efb65fcae5a826fa9b7)

```js:get_list.js
#! /usr/bin/node
/*
	get_list.js

					Feb/24/2018
*/
// ----------------------------------------------------------------
var config_domo=require("./config_domo")
// ----------------------------------------------------------------
function list_dataset_proc(access_token)
{
	const url_datasets="https://api.domo.com/v1/datasets"

	var Client = require('node-rest-client').Client
	var client = new Client()

	const args = {
			headers: {
				"Authorization": "Bearer " + access_token
				},
			parameters: {
				"includeHeader": "true",
				"sort": "name",
				"offset": 0,
				"limit": 50
				}
			}

	client.get(url_datasets,args,function (data, response) {
		console.log(data)
		console.error(data.length)
		console.error ("*** 終了 ***")
		})
}

// ----------------------------------------------------------------
console.error ("*** 開始 ***")

const config = config_domo.config_domo_proc ()

var Client = require('node-rest-client').Client
var client = new Client(config)

const url="https://api.domo.com/oauth/token?grant_type=client_credentials&scope=data"

client.get(url,function (data, response) {
	console.error(data.access_token)
	list_dataset_proc(data.access_token)
})

// ----------------------------------------------------------------
```

実行方法

```bash
./get_list.js
```
Domo のデータセットのデータをイクスポートする (Node.js)

こちらのプログラムを Node.js で書きました。
[Python で Domo のデータセットのデータをイクスポートする](https://qiita.com/ekzemplaro/items/0d5494cc87cc74fecdd1)

```js:export_dataset.js
#! /usr/bin/node
/*
	export_dataset.js

					Feb/24/2018
*/
// ----------------------------------------------------------------
var fs = require("fs")
var config_domo=require("./config_domo")
// ----------------------------------------------------------------
function export_dataset_proc(access_token,dataset_id,file_out)
{
	const url_datasets="https://api.domo.com/v1/datasets/" + dataset_id + "/data"

	var Client = require('node-rest-client').Client
	var client = new Client()

	const args = {
			headers: {
				"Authorization": "Bearer " + access_token,
				"Content-Type": "text/csv"
				},
			parameters: {
				"includeHeader": "true"
				}
			}

	client.get(url_datasets,args,function (data, response) {
		console.log(data)
		console.log("---------------------")
		console.log(response)
		fs.writeFileSync (file_out,data)
		console.error ("*** 終了 ***")
		})
}

// ----------------------------------------------------------------
console.error ("*** 開始 ***")

const dataset_id=process.argv[2]
console.error ("dataset_id = " + dataset_id)
const file_out=process.argv[3]
console.error ("file_out = " + file_out)

const config = config_domo.config_domo_proc ()

var Client = require('node-rest-client').Client
var client = new Client(config)

const url="https://api.domo.com/oauth/token?grant_type=client_credentials&scope=data"

client.get(url,function (data, response) {
	console.error(data.access_token)
	export_dataset_proc(data.access_token,dataset_id,file_out)
	})

// ----------------------------------------------------------------
```

実行方法

```bash
./export_dataset.js 58590023-9167-442a-bca0-8e7a28c212f6 output.csv
```
Domo のデータセットにデータをインポートする (Node.js)

こちらのプログラムを Node.js で書きました。
[Python で Domo のデータセットにデータをインポートする](https://qiita.com/ekzemplaro/items/c29c8dcaa613c2c8d107)

```js:import_dataset.js
#! /usr/bin/node
/*
	import_dataset.js

					Feb/24/2018
*/
// ----------------------------------------------------------------
var fs = require("fs")
var config_domo=require("./config_domo")
// ----------------------------------------------------------------
function import_dataset_proc(access_token,dataset_id,str_csv)
{
	const url_datasets="https://api.domo.com/v1/datasets/" + dataset_id + "/data"

	var Client = require('node-rest-client').Client
	var client = new Client()

	const args = {
			headers: {
				"Authorization": "Bearer " + access_token,
				"Content-Type": "text/csv"
				},
			parameters: {
				"includeHeader": "true"
				},
			data: str_csv
			}

	client.put(url_datasets,args,function (data, response) {
		console.log(data)
		console.log("---------------------")
		console.log(response)
		console.error ("*** 終了 ***")
		})
}

// ----------------------------------------------------------------
function token_import_proc (dataset_id,str_csv)
{
const config = config_domo.config_domo_proc ()

var Client = require('node-rest-client').Client
var client = new Client(config)

const url="https://api.domo.com/oauth/token?grant_type=client_credentials&scope=data"

client.get(url,function (data, response) {
	console.error(data.access_token)
	import_dataset_proc(data.access_token,dataset_id,str_csv)
})
}

// ----------------------------------------------------------------
console.error ("*** 開始 ***")

const dataset_id=process.argv[2]
console.error ("dataset_id = " + dataset_id)
const file_csv=process.argv[3]
console.error ("file_csv = " + file_csv)

if (fs.existsSync(file_csv))
	{
	const str_csv = fs.readFileSync (file_csv,'utf8')
	token_import_proc (dataset_id,str_csv)
	}
// ----------------------------------------------------------------
```

実行方法

```bash
./import_dataset.js 58590023-9167-442a-bca0-8e7a28c212f6 sample.csv
```
ゼロから作るDeepLearning自分流まとめ

#この記事について
　DeepLearningへの理解を深めるために記述するのじゃあ!
　第一章はpython, numpyの基本のため省略させていただくのじゃあ。
　DeepLearningはもちろんpython, numpyの理解も足らず、少しでも理解するために書いておるので、分かりづらかったら他のサイト様に行ってほしいのじゃあ・・・
　間違っているところが合ったらぜひコメントして教えていただければと思うのじゃあ・・・

#それぞれの章へのリンク
・[自分流まとめホーム](https://qiita.com/ganariya/items/03e303d9d059d96e213e)
・[第二章 パーセプトロン](https://qiita.com/ganariya/items/016696290223be88d172)
・[第三章 ニューラルネットワークの学習](https://qiita.com/ganariya/items/d72075679871460c21a1)
・[第四章 ニューラルネットワークの学習]()
・[第五章 誤差逆伝播法]()
・[第六章 学習においてのテクニック]()
・[第七章 畳み込みネットワーク]()
・[第八章 DeepLearning]()


#参考文献
書籍　ゼロから作るDeepLearning　オライリー・ジャパン
マークダウン記法　https://qiita.com/hiroyuki_hon/items/f2a779bb295fd12646ab
Domo のデータセットを削除する (Node.js)

こちらのプログラムを Node.js で書きました。
[Python で Domo のデータセットを削除する](https://qiita.com/ekzemplaro/items/371bef175b6e85c6349a)

``js:delete_dataset.js
#! /usr/bin/node
/*
	delete_dataset.js

					Feb/24/2018
*/
// ----------------------------------------------------------------
var config_domo=require("./config_domo")
// ----------------------------------------------------------------
function delete_dataset_proc(access_token,dataset_id)
{
	const url_datasets="https://api.domo.com/v1/datasets/" + dataset_id

	var Client = require('node-rest-client').Client
	var client = new Client()

	const args = {
			headers: {
				"Authorization": "Bearer " + access_token,
				"Content-Type": "application/json",
				"Accept": "application/json"
				},
			parameters: {
				"includeHeader": "true"
				}
			}

	client.delete(url_datasets,args,function (data, response) {
		console.log(data)
		console.log("---------------------")
		console.log(response)
		console.error ("*** 終了 ***")
		})
}

// ----------------------------------------------------------------
console.error ("*** 開始 ***")
const dataset_id=process.argv[2]
console.error ("dataset_id = " + dataset_id)

const config = config_domo.config_domo_proc ()

var Client = require('node-rest-client').Client
var client = new Client(config)

const url="https://api.domo.com/oauth/token?grant_type=client_credentials&scope=data"

client.get(url,function (data, response) {
	console.error(data.access_token)
	delete_dataset_proc(data.access_token,dataset_id)
})

// ----------------------------------------------------------------
```

config_domo.js はこちら
[Domo の アクセストークンを取得する (Node.js)](https://qiita.com/ekzemplaro/items
/3247158a1a20eb9901db)

実行方法
DataSet の ID が必要です。

```bash
./delete_dataset.js 58590023-9167-442a-bca0-8e7a28c212f6
```
firebase realtime database 勉強メモ

firebaseを勉強中です。
本ページでは、realtime databaseの内容について勉強したことを書いていきます。

公式ドキュメント
[データベース ルールを使い始める  |  Firebase Realtime Database  |  Firebase](https://firebase.google.com/docs/database/security/quickstart?hl=ja)

# ルール設定
- 誰でもデータベースに対して読み取り、書き込みができる

```json
{
  "rules": {
    ".read": true,
    ".write": true
  }
}
```

- アプリの認証済みユーザーのみ、読み取り/書き込みアクセスを許可する

```json
{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}
```
⇒このauthの定義が厄介....!（涙）
ログイン中は書き込み/読み込みができるが、ログアウトした瞬間に権限エラーとなって落ちる。
ログアウト処理を実行した瞬間に以下のエラーが表示される。
どうしたらいいんだろう。

```
FIREBASE WARNING: Exception was thrown by user callback. Error: permission_denied at /path/{uidが入る}: Client doesn't have permission to access the desired data.
    at Object.exports.errorForServerCode (http://localhost:8100/build/vendor.js:19686:17)
    at onComplete (http://localhost:8100/build/vendor.js:141790:40)
    at Object.onComplete (http://localhost:8100/build/vendor.js:59792:34)
    at PersistentConnection.onListenRevoked_ (http://localhost:8100/build/vendor.js:86704:20)
    at PersistentConnection.onDataPush_ (http://localhost:8100/build/vendor.js:86476:18)
    at PersistentConnection.onDataMessage_ (http://localhost:8100/build/vendor.js:86464:18)
    at Connection.onDataMessage_ (http://localhost:8100/build/vendor.js:87176:14)
    at Connection.onPrimaryMessageReceived_ (http://localhost:8100/build/vendor.js:87170:18)
    at WebSocketConnection.onMessage (http://localhost:8100/build/vendor.js:87071:27)
    at WebSocketConnection.appendFrame_ (http://localhost:8100/build/vendor.js:88247:18) 
```


- アプリの認証済みである且つUIDが一致するユーザーのみ、読み取り/書き込みアクセスを許可する

```json
{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}
```
- 非公開で、firebaseコンソールへの直接アクセスのみ許可する

```json
{
  "rules": {
    ".read": true,
    ".write": true
  }
}
```
Domo のデータセットを作成する (Node.js)

こちらのプログラムを Node.js で書きました。
[Python で Domo のデータセットを作成する](https://qiita.com/ekzemplaro/items/5b772b95e120e1e6dd3c)

```js:create_dataset.js
#! /usr/bin/node
/*
	create_dataset.js

					Feb/24/2018
*/
// ----------------------------------------------------------------
var fs = require("fs")
var config_domo=require("./config_domo")
// ----------------------------------------------------------------
function create_dataset_proc(access_token,json_str)
{
	const url_datasets="https://api.domo.com/v1/datasets"

	var Client = require('node-rest-client').Client
	var client = new Client()

	const args = {
			headers: {
				"Authorization": "Bearer " + access_token,
				"Content-Type": "application/json",
				"Accept": "application/json"
				},
			parameters: {
				"includeHeader": "true"
				},
			data: json_str
			}

	client.post(url_datasets,args,function (data, response) {
		console.error(data.id)
		console.error(data.name)
		console.error(data.description)
		console.log(data)
		console.log("---------------------")
		console.log(response)
		console.error ("*** 終了 ***")
		})
}

// ----------------------------------------------------------------
function token_create_proc (json_str)
{
const config = config_domo.config_domo_proc ()

var Client = require('node-rest-client').Client
var client = new Client(config)

const url="https://api.domo.com/oauth/token?grant_type=client_credentials&scope=data"

client.get(url,function (data, response) {
	console.error(data.access_token)
	create_dataset_proc(data.access_token,json_str)
})
}

// ----------------------------------------------------------------
console.error ("*** 開始 ***")

const file_json=process.argv[2]
console.error ("file_json = " + file_json)

if (fs.existsSync(file_json))
	{
	const json_str = fs.readFileSync (file_json,'utf8')
	token_create_proc (json_str)
	}
// ----------------------------------------------------------------
```

config_domo.js はこちら
[Domo の アクセストークンを取得する (Node.js)](https://qiita.com/ekzemplaro/items/3247158a1a20eb9901db)

schmea.json のサンプルはこちら
[Python で Domo のデータセットを作成する](https://qiita.com/ekzemplaro/items/5b772b95e120e1e6dd3c)

実行方法

```bash
./create_dataset.js schema.json
```
c# 基礎　その2

###演算子(オペレーター)
与えられた変数やリテラルを処理するための記号。(「+」や「=」など)
演算子によって処理される変数やリテラルを***被演算子(オペランド)***という。

***浮動小数点の演算***
2進数では無限循環小数なることがあるため、以下のような結果になる場合がある

```C#
0.2 * 3 == 0.6 // false
```

decimal型や10で除算するなどしてを使うことで回避することは可能。decimal型はdouble型より桁数が多く、　内部的に10進数で演算する利点があるが、有効範囲が狭く、double型と比べて処理が低速である。

```C#
0.2M * 3M = 0.6M
2 * 3 / 10d == 0.6
```

***同一性と同値性***
**同一性(Identity)** : オブジェクト参照同士が同じオブジェクトを参照している。
**同値性(Equivalence)** : オブジェクトが同じ値を持っている。

```c#
var builder1 = new StringBuilder("あいう");
var builder2 = new StringBuilder("あいう");

Console.WriteLine(builder1 == builder2); // false
Console.WriteLine(builder1.equals(builder2)); // true
```

型違いの equals メソッドには注意

```C#
string data1 = "123";
int data2 = 123;

Console.WriteLine(data1.equals(data2)); // false
Console.WRiteLine(data1 == data2); // ERROR
```

**浮動小数点の比較**

```C#
const double EPSILON = 0.00001
double x = 2 * 0.3;
double y = 0.6;
Console.WriteLine(Math.abs(x - y) < EPSILON); // true
```

**配列の比較**

```C#
var data1 = new[]{"あ", "い", "う"};
var data2 = new[]{"あ", "い", "う"};
Console.WriteLine(data1 == data2); // false
Console.WriteLine(data1.Equals(data2)); // false
Console.WriteLine(data1.SequenceEqual(data2)); // true
```

**三項演算子**

```C#
int x = 2;
int y = 1;
Console.WriteLine(x > y ? x : y); // 2
```

**null合体演算子**
nullの場合だけ右側の値を返す 。

```
string s1 = "あいう";
string s2 = "かきく";
Console.WriteLine(s1 ?? s2); // あいう
```

**ビット演算子**
&
<<
~

**その他の演算子**
sizeof : 値型のサイズをバイト単位で返す
nameof : 変数名を返す


*unsafeモード*
ポインタ型のような規定では無効かされている機能を有効化できる。
pandas.Timestamp / pandas.Timedelta と ナノ秒/日付文字列 を相互変換

毎度忘れるのでメモ。ちゃんと整理してみると統一されてて分かりやすい。

- `pd.Timestamp(xxx)` / `pd.Timedelta(xxx)` は、ナノ秒か文字列表現で渡す
- `xx.value`　でナノ秒を取得する
- `str(xx)` すると文字列表現になる

## pandas.Timestamp

### 日付文字列 -> `pandas.Timestamp`

```py
>>> pandas.Timestamp('2018-02-24 06:53:21')
Timestamp('2018-02-24 06:53:21')
```

### UnixTime（ナノ秒） -> `pandas.Timestamp`

```py
>>> pandas.to_datetime(1519455201000000000)
Timestamp('2018-02-24 06:53:21')
```

※ こっちでも良いらしい

```py
>>> pandas.Timestamp(1519455201000000000)
Timestamp('2018-02-24 06:53:21')
```

### `pandas.Timestamp` -> UnixTime（ナノ秒）

```py
>>> t = pandas.Timestamp('2018-02-24 06:53:21')
>>> t.value
1519455201000000000
```

### `pandas.Timestamp` -> 日付文字列

```py
>>> t = pandas.Timestamp('2018-02-24 06:53:21')
>>> str(t)
'2018-02-24 06:53:21'
```

## pandas.Timedelta

### 時間文字列 -> `pandas.Timedelta`

```py
>>> pandas.Timedelta('900 ms')
Timedelta('0 days 00:00:00.900000')
```

### ナノ秒 -> `pandas.Timedelta`

```py
>>> pandas.Timedelta(900000000)
Timedelta('0 days 00:00:00.900000')
```

### `pandas.Timedelta` -> ナノ秒

```py
>>> td = pandas.Timedelta('900 ms')
>>> td.value
900000000
```

### `pandas.Timedelta` -> 時間文字列

```py
>>> td = pandas.Timedelta('900 ms')
>>> str(td)
'0 days 00:00:00.900000'
```
Vimでもminimapぽいことがしたいのでnanomap.vimをつくった

# TL; DR
こういうVim pluginを作りました。
https://github.com/hisaknown/nanomap.vim

# Sublime TextにおけるMinimap
オシャレテキストエディタとして有名なSublime Textには、Minimapという機能があります。
画面の右側に出る、コードの縮小表示です。
![Minimap on Sublime Text](https://qiita-image-store.s3.amazonaws.com/0/45136/fa80fc46-9974-fc7c-a985-4af79d1b63ed.png)

私は主にVimを使っているのですが、Vimにもこういう機能が欲しいなあと常々思っていました。

# 偉大な先達たち
実はこれまでにもVimでMinimapしようとした人々はいらっしゃいます。

- https://github.com/koron/minimap-vim
    - kaoriya-vimも配布しているKoRoNさんの実装
    - Minimap対象のGVimに隣接させて、フォントサイズの小さいGVimを立ち上げるという~~変態的な~~実装
- https://github.com/severin-lemaignan/vim-minimap
    - Lemaignanさんの実装
    - 別バッファでMinimapを表示する
    - PythonのDrawilleを使って、そこそこ表現力の高いマップを実現している

# 問題点
- KoRoNさん実装
    - GVimでしか動かない & GVim複数起動はちょっと……
- Lemaignanさん実装
    - スクロールしていくと表示が崩れる…… @ GVim on Windows
- (そもそも論ですが) 元々のMinimapってカーソル周辺の縮小表示しかない (i.e. 大きいファイルが対象の場合、Minimap自体にスクロールが発生する) けど、どっちかというと**カーソル周辺よりはファイル全体のoverviewが見たい**

# 作ったもの
https://github.com/hisaknown/nanomap.vim
![Screencast of nanomap.vim](https://raw.githubusercontent.com/wiki/hisaknown/nanomap.vim/screencast.gif)

# 機能
- 対象バッファの右側に、細長いバッファをつくってファイル全体の密度を濃淡で表示
    - Unicodeの上半分ブロック (▀) を使うことで、解像度を底上げ
- 現在の表示位置をハイライト表示
- マップの任意の行で `<CR>` すると該当行に移動
- (最近の流行りに乗って、`timer`と`job`を使って実装)
- (`setbufline`も使っているので、最近のVim (たぶん`8.0.1274`以降) でないと動かない)

# Future work & Known issues
- `/`で検索したときに、どこにマッチがあるか表示したい
    - やればできそう
- syntaxとhighlihgtを大量に定義しているので (？)、マップの更新時 (デフォルトでは500msおき) に若干もたつくことがある
    - これはどうにかしたいけれど、どうすれば良さそうか分からない……
    - Workaroundとしては、使う色数を減らすとよいと思われる
- もうちょっと気の利いた配色を作りたい

# おわりに
初Vim pluginなのでbuggyだと思われますが、ぜひ使ってみてください！
JavaScriptでdynamic import 使えばオンラインエディタでもmoduleをimportできる

# 背景
ブラウザで動くJavaScriptのオンラインエディタでモジュールを開発して, それを共有して作業を進められないか考えていました。オンラインエディタでJavaScriptを実行するときはFunctionコントラクタでエディタの中に書いたコードを実行します。しかし、普通のimportはJavaScriptのファイルの冒頭に書いて、静的に読み込まなくてはならないため、Functionコントラクタの中でimportはできません。JavaScriptでもpythonのようにいつでもimportできればいいのにと思っていました。

そんなある日、tonkotsuboy_comさんの記事を発見しました。

[Chrome 63以降で使えるJavaScriptのdynamic import（動的読み込み）](https://qiita.com/tonkotsuboy_com/items/f672de5fdd402be6f065)

おぉ、これでいける！！tonkotsuboy_comさんありがとうございます。
きっとこれでJavaScriptでデータ処理するコードを開発するのが加速すると思います。

# 方法
tonkotsuboy_comさんが書いてくださった方法そのままでいけます。複数のmoduleをインポートすることを考えると、async & awaitで書くのが良いとおもいます。
export_test1.jsとexport_test2.jsをネットから見える場所においておけば、async付けた関数の中でawait importで順番に読み込めば、moduleで読み込んだ関数を使えます。

```javascript:export_test1.js
export const func1 = (value) =>{
  console.log('export_test1.js func1')
  return value*2
}

export const func2 = (value) =>{
  console.log('export_test1.js func2')
  return value**2
}
```
```javascript:export_test2.js
export const func1 = (value) =>{
  console.log('export_test1.js func1')
  return value*2
}

export const func2 = (value) =>{
  console.log('export_test1.js func2')
  return value**2
}
```


```javascript:import_test1.js
const main = async ()=>{
  const module1 = await import("/jsnote/sample/public/module/export_test1.js")
  const module2 = await import("/jsnote/sample/public/module/export_test2.js")
  console.log(module1.func1(3))
  console.log(module1.func2(3))
  console.log(module2.func1(3))
  console.log(module2.func2(3))
}
main()
```

# 実行の様子
jsnoteのレジスタでexport_test1.jsとexport_test2.jsを登録して、import_test1.jsで使ってみました。
[![Imgur](https://i.imgur.com/x9s3TcJ.png)](https://toyoharu-nishikawa.github.io/jsnote/#sample=sample/public/module/import_test1.js)

Chromeの最新版をお使いの方は、github pagesで動く[こちら](https://toyoharu-nishikawa.github.io/jsnote/#sample=sample/public/module/import_test1.js
)で試してみてください

[![Imgur](https://i.imgur.com/HstpPha.png)](https://toyoharu-nishikawa.github.io/jsnote/#sample=sample/public/module/import_test1.js) 

jsnoteでレジスタに自分のmoduleを登録してをお使いになられる方はgithubからcloneしてご自分の環境で動かしてみてください。

リポジトリへのリンク
https://github.com/Toyoharu-Nishikawa/jsnote

使い方へのリンク
https://qiita.com/Toyoharu-Nishikawa/items/044d53974c42bc635f0f
[Flutter]Android StudioでFlutter使用。

こんにちは。お久しぶりです。
最近Androidアプリ作りで忙しい日々を過ごしてます。

昨日YouTubeで、Flutterの公式動画を見ましたか？
FlutterはC++EngineでGoogleで作ったDart語を基本にします。
XamarinのようにCross Platformの一つです。

動画はこちら。
[Introducing Flutter](https://www.youtube.com/watch?v=fq4N0hgOWzU)

Android Studioで自分が使っている方法を紹介したいと思います。

[Flutterの公式サイト](https://flutter.io/)


#まず、Android Studio install

intellijで使っているほともいるとおもいます。Android Studioもintellij基盤ですね。

[Android Studio](https://developer.android.com/studio/index.html?)


#Plugin

plugin でFlutter 検索するとインストールでじます。
Dart語も自動インストールになります。

![flutter install.JPG](https://qiita-image-store.s3.amazonaws.com/0/137182/482670aa-c367-8725-bef3-77ef2ecdcfb5.jpeg)

#New Flutter Project
Flutter SDKまだインストールしてない方はこちで
簡単にインストールできます。

![flutter_03.JPG](https://qiita-image-store.s3.amazonaws.com/0/137182/6d6b4e71-eb8f-6f01-bfb0-6d6ce343b83e.jpeg)

![flutter_02.JPG](https://qiita-image-store.s3.amazonaws.com/0/137182/6e99eb13-7460-7e98-678e-5951f36bdbe8.jpeg)

#Flutter Application

flutter Applicationを選択してNext

![flutter_04.JPG](https://qiita-image-store.s3.amazonaws.com/0/137182/ef03028d-b966-d0f8-3e5e-13f063573e95.jpeg)

#Android Studioと同じにBuild＆Run

その結果。

![device-2018-02-24-095350.png](https://qiita-image-store.s3.amazonaws.com/0/137182/4244b797-483e-a0f8-5d35-398ea163c45a.png)


#終わりに

簡単なアプリ作りはFlutterで悪くないと思いますが、NativeでAndroidをアプリ作りとしてはJavaやKotlinで今までやっているように開発する事が良いなーと思います。現在はFlutter　Alphaだから後にはもっとよくなるんじゃないかと
[Rails]paperclip使い方

## 初めに
localのstorage => Railsのアセットパイプライン下に保存 => 読み込み の流れです。

環境: Rails 5.1.4


```rb:Gemfile
gem paperclip
```

```bash:terminal
$ bundle install
```

## model Picture

```bash:terminal
$ rails g model Picture name:string
$ rails db:migrate 
``` 

## paperclipを使うために必要なカラムを足す。

以下のようにすると、”photo”カラムが追加されるだけでなく、
photo_file_name,photo_file_sizeなどpaperclipに必要なカラムが追加されます。

```bash:terminal
$ rails g paperclip picture photo
```

こんな感じのmigrationファイル
※[5.1]を足さないとエラーになるので注意

```rb
class AddAttachmentPhotoToPictures < ActiveRecord::Migration[5.1]
  def self.up
    change_table :pictures do |t|
      t.attachment :photo
    end
  end

  def self.down
    remove_attachment :pictures, :photo
  end
end
```

```
$ rails db:migrate
```


## paperclipの設定

ここでは、保存先のパスをapp/assets/imagesにして、Railsから読み込むようにしています。
ローカル完結型。

```rb:models/picture.rb
class Picture < ApplicationRecord
   has_attached_file :photo,
                      styles: { medium: "300x300>", thumb: "100x100>" },
                      path: "#{Rails.root}/app/assets/images/:filename"
   validates_attachment_content_type :photo, content_type: /\Aimage\/.*\z/
end
```

## controller と route

```rb:routes.rb
get  'pictures/new'
get  'pictures/index'
post 'pictures' => 'pictures#create'
```

```bash:terminal
rails g controller Pictures
```

```rb:app/controllers/pictures_controller.rb
class PicturesController < ApplicationController
  def new
    @picture = Picture.new
  end

  def create
    @picture = Picture.new(picture_params)
    if @picture.save
      redirect_to '/pictures/index'
    end
  end

  def index
     @pictures = Picture.all
  end

  private

  def picture_params
    params.require(:picture).permit(:photo)
  end
end
```

## View

```eruby:new.html.erb
<%= form_for  @picture, url: pictures_path do |f| %>
  <%= f.text_field :name %>
  <%= f.file_field :photo %>
  <%= f.submit %>
<% end %>
```

```eruby:index.html.erb
<h1>All Photos</h1>

<ul class="pictures" >
  <%= render @pictures %>
</ul>
```

```eruby:_picture.html.erb
<li>
  <%= picture.photo_file_name %>
  <%= image_tag picture.photo_file_name %>
</li>
```


## 参照
https://github.com/thoughtbot/paperclip
[RailsでPaperclipを使ってファイルをアップロードする](http://ruby-rails.hatenadiary.com/entry/20140716/1405443484)
Google AIY Voice Kitと赤外線リモコンを組み合わせる

# Alexa（まだやってない）
既存のOSにドライバーをインストールすればOKそう
https://dev.classmethod.jp/cloud/alexa-avs-using-google-aiy-voice-kit/

# Google Persistent API
## Demo（英語）
僕はその前にOSを初期化してしまい、VoiceKit用のImageを焼いてしまったので下記をまんまやった
https://qiita.com/tsato12345/items/07805faf74f5b01233bf

## 日本語受付
下記を参考に（GoogleAssistantSDKはImageの中にインストール済み）
https://yuki-no-yabo.com/google-aiy-voice-kit-in-japanease/

Oauth2.0の鍵情報が入ったclient~.jsonは/home/piに配置（ここではファイル名をmvしない）
#### 認証
google-oauthlib-tool --scope https://www.googleapis.com/auth/assistant-sdk-prototype --save --headless --client-secrets /home/pi/client~.json
#### 登録
googlesamples-assistant-devicetool register-model --manufacturer [自由入力] --product-name [自由入力] --type SWITCH --model sai-no-raspberrypi-smart-speaker-01
#### 起動
googlesamples-assistant-pushtotalk --project-id [client~.jsonの中に記載] --device-model-id sai-no-raspberrypi-smart-speaker-01 --lang ja_jp

# 赤外線リモコン（検証中）
## テレビのリモコンの赤外線を分析
回線のつなぎ方は下記を参考
https://qiita.com/KAKY/items/55e6c54fa2073cdc0bbe

```
$ sudo apt-get install lirc
$ sudo modprobe lirc-rpi gpio_in_pin=24 gpio_out_pin=25
modprobe: ERROR: could not insert 'lirc_rpi': No such device
$ vi /boot/config.txt：コメントアウトを外すor追記する
dtoverlay = lirc-rpi
$ sudo shutdown -r now
$ sudo modprobe lirc-rpi gpio_in_pin=24 gpio_out_pin=25
$ ls  -l /dev/lirc*
crw-rw---- 1 root video 244, 0 Feb 24 13:32 /dev/lirc0
$ sudo mount -t debugfs debugfs /sys/kernel/debug
mount: debugfs is already mounted or /sys/kernel/debug busy
       debugfs is already mounted on /sys/kernel/debug
$ sudo cat /sys/kernel/debug/gpio
gpiochip0: GPIOs 0-53, parent: platform/3f200000.gpio, pinctrl-bcm2835:

gpiochip2: GPIOs 100-101, brcmvirt-gpio, can sleep:
 gpio-100 (                    |?                   ) out lo

gpiochip1: GPIOs 128-135, brcmexp-gpio, can sleep:
 gpio-135 (                    |?                   ) in  hi
$ mode2 -d /dev/lirc0
Using driver devinput on device /dev/lirc0
Trying device: /dev/lirc0
Using device: /dev/lirc0

```
っとここでテレビのリモコンのボタンを押しても何も反応がない。gpioが上手く認識できてないので調べる
配線の番号も念のためチェックしてみたが問題なし
https://tool-lab.com/make/raspberrypi-startup-22/
この人のブログで解決
http://make.bcde.jp/blog/2017/11/19/lircで-etc-lirc-hardware-confファイルが存在しない/

```
$ sudo vi /etc/lirc/lirc_options.conf
driver = default
device = /dev/lirc0
$ sudo vi /boot/config.txt
dtoverlay=lirc-rpi
dtparam=gpio_in_pin=24
dtparam=gpio_out_pin=25
$ sudo reboot -h now
$ sudo /etc/init.d/lircd stop
$ sudo mode2 -d /dev/lirc0
```
この状態でリモコンボタンを押すと反応があった

```
$ sudo mode2 -d /dev/lirc0 | tee TVON
```
CVEからCVSSを取得する

Python2ですんません。

この脆弱性はどれぐらい危険かを示すCVSSという指標があるのですが、これをCVEから引けたら楽かも、ということで書いてみました。NIST（米国）の値を引っ張ってきて、CSSセレクタで抜いてます。

こんな感じのをAzure NotebookなどJupyter環境でまとめておくと便利ですね。

```py
cve_list = [
    "CVE-2017-0001",
    "CVE-2016-0001",
    "CVE-2015-0001",
    "CVE-2014-0001",
    "CVE-2013-0001"
]

import urllib2
from bs4 import BeautifulSoup

for cve in cve_list:
  instance = urllib2.urlopen("https://nvd.nist.gov/vuln/detail/"+cve)
  soup = BeautifulSoup(instance, "html.parser")
  desc = soup.select_one("[data-testid=vuln-cvssv2-base-score-link]")
  if hasattr(desc,"text"):
    print cve, desc.text.strip()
```