OmniAICreator/Qiita-1.07M huggingface dataset:
Connpass のイベント情報を取得する in Python

Connpass API を使用してイベント情報を取得してみました。
会員登録等はいらないです。

リクエスト送るときには、1秒スリープ入れましょう。

## Requirement
- anaconda3-5.2.0 
    - Python 3.6.5

## Program
```python
import time
import requests

URL = 'https://connpass.com/api/v1/event/'


def get_event_url(keyword, count=10):
    """
    イベント情報を取得する

    Parameters
    ----------
    keyword : string
        検索するキーワード
    count : int, default 10
        取得するイベント数
    """

    params = {
        'keyword': keyword,
        'count': count,
    }
    response = requests.get(URL, params=params)
    time.sleep(1)
    resources = response.json()

    for event in resources['events']:
        print(event['event_url'])

get_event_url('python', 20)
```
```
$ python get_event_url.py
https://python-web.connpass.com/event/108056/
https://coderdojo-tachikawa.connpass.com/event/109668/
https://bpstudy.connpass.com/event/109688/
https://soracom.connpass.com/event/110110/
https://fukuokaphp.connpass.com/event/109317/
https://connpass.com/event/109698/
https://maid-cafe-nomad.connpass.com/event/109572/
https://itpropartners.connpass.com/event/85381/
https://python-algo.connpass.com/event/104394/
https://pyhack.connpass.com/event/110414/
https://ai-iot-bol-fukui.connpass.com/event/104798/
https://nnc.connpass.com/event/106620/
https://data-science-academy.connpass.com/event/107546/
https://speee.connpass.com/event/103514/
https://coderdojo-sapporo.connpass.com/event/110267/
https://soil.connpass.com/event/107287/
https://supporterz-seminar.connpass.com/event/107463/
https://supporterz-seminar.connpass.com/event/107979/
https://forcia.connpass.com/event/110173/
https://forcia.connpass.com/event/110138/
```
## Hint
設定できるパラメータとレスポンスは、[API リファレンス](https://connpass.com/about/api/)に書いてあります。
日本語なので気軽に見てください。
緯度と経度が取得できるのは面白いです。

定員と参加者数を使用して、参加可能なイベントのみ送ってくる Bot を作成するのも良いですね。

```
# イベントタイトル
event['title']
# 開催場所
event['address']
# 緯度
event['lat']
# 経度
event['lon']
# 定員
event['limit']
# 参加者数
event['accepted']
```

個人的には、参加者（申込者）のアカウントが取ってこれないのが残念です。
[Connpass の利用規約](https://connpass.com/term/)ではスクレイピング自体は禁止していません。
API を使って取得した URL を、サイトの運営を妨げない範囲でスクレイピングすればいけますね。
> 第２条【サービス】
>> 当サイトの利用に際してはウェブにアクセスする必要がありますが、利用者は自らの費用と責任で必要な機器・ソフトウェア・通信手段等を用意し適切に接続・操作することとします。

> 第７条【禁止事項】
>> 当サイトの運営を妨げる、または、当社の信用を毀損する行為

## Reference
- [connpass API リファレンス](https://connpass.com/about/api/)
- [Connpass 利用規約](https://connpass.com/term/)
Application.get_env/3で取得できる値の設定方法の確認

`Application.get_env/3` 値を設定する方法について確認した。
`get_env`で取得できる値はApplication Environmentといって環境変数はSystem Environmentといって区別するらしい。(こちらは`System.get_env/1`で取得できる)

* [The application environment - 公式ドキュメント](https://hexdocs.pm/elixir/Application.html#module-the-application-environment)
* [確認用のプロジェクト](https://github.com/eiel-sample-code/elixir_app_env)

以下の場所で設定できる(下に書いたものほど優先順位が高いようだ。

1. `mix.exs`の `application/0`の実装に記述する
2. `erl`コマンドの`-config`オプションにconfigファイルを指定する
3. `config/config.exs`の中で指定する
4. `Application.put_env/4`を呼び出す

# `mix.exs`の `application/0`の実装に記述する

ここに書いた場合`.app`ファイルに記載される。そのため一番優先度が低いようだ。

## 例

```elixir
  def application do
    [
      extra_applications: [:logger],
      env: [value: "load mix.exs"]
    ]
  end
```

## 確認

```
$  mix run -e 'Application.get_env(:appenv, :value) |> IO.inspect'
"load mix.exs"
```

# `erl`コマンドの`-config`オプションにconfigファイルを指定する

erlangでの上書き方法と考えれば良さそう。erlangのタプルで記述しないといけないのでが少しつらそう。
環境変数`ELIXIR_ERL_OPTIONS`が使える。コマンドによって`--erl`も使える。

## 例
```value.config
[{
  appenv, [
    {value, <<"load value.config">>}
  ]
}].
```
https://github.com/eiel-sample-code/elixir_app_env/blob/master/value.config

## 確認

```
$ env ELIXIR_ERL_OPTIONS="-config value.config" mix run -e 'Application.get_env(:appenv, :value) |> IO.inspect'
"load value.config"
```

```
$ iex --erl '-config value.config' -S mix
iex> Application.get_env(:appenv, :value)
```
"load value.config"

# `config/config.exs`の中で指定する

よくでてくるので周知されてると思う。

mix経由での起動でないと使われなさそうなのが気になるところ。デプロイツールによっては良い感じにやってくれるのかもしれない。(よく知らない)
`Mix.Config.persist/1`で `Application.put_env/4`を呼ぶという仕組み。
https://github.com/elixir-lang/elixir/blob/v1.7.4/lib/mix/lib/mix/config.ex#L304

## 例

```
config :appenv, value: "load config.exs"
```
https://github.com/eiel-sample-code/elixir_app_env/blob/master/config/config.exs#L5

## 実行例

```
mix run -e 'Application.get_env(:appenv, :value) |> IO.inspect'
"load config.exs"
```

#  `Application.put_env/4`を呼び出す

要するに実行時にApplication Environmentはいつでも書き換えられる。開発時にREPLの再起動いらずで便利そう。

## 実行例

```
$ mix run -e 'Application.put_env(:appenv, :value, 1); Application.get_env(:appenv, :value) |> IO.inspect'
1
```


# 関連

* [調査メモ](https://scrapbox.io/eiel/Application.get_env%2F3%E3%81%A7%E5%8F%96%E5%BE%97%E3%81%A7%E3%81%8D%E3%82%8B%E5%80%A4%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
Dockerでrails開発環境を構築するShellScript

# はじめに
自動的にdockerのコンテナ上でrailsの開発環境を作ってくれるShellScriptを作成したのでメモがわりに投稿。

# 環境
- Docker for mac
- ruby 2.4.0
- mysql 5.7
を使用。

Docker for macはインストール済みとする。

# shellscript
```docker_rails.sh
#!/bin/bash

echo "docker pull ruby:2.4.0"
docker pull ruby:2.4.0

echo "docker pull mysql:5.7"
docker pull mysql:5.7

echo "docker images"
docker images

# make Dockerfile
cat <<'EOF' > Dockerfile
FROM ruby:2.4.0
ENV LANG C.UTF-8
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN gem install bundler
WORKDIR /tmp
ADD Gemfile Gemfile
ADD Gemfile.lock Gemfile.lock
RUN bundle install
ENV APP_HOME /app_name
RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME
ADD . $APP_HOME
EOF

# make Gemfile
cat <<'EOF' > Gemfile
source 'https://rubygems.org'
gem 'rails'
EOF

# make Gemfile.lock()
touch Gemfile.lock

# make docker-compose.yml
cat <<'EOF' > docker-compose.yml
version: '2'
services:
  db:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=password
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/app_name
    ports:
      - "3000:3000"
    depends_on:
      - db
EOF

echo "docker-compose run web rails new . --force --database=mysql --skip-bundle"
docker-compose run web rails new . --force --database=mysql --skip-bundle

# fix Gemfile
echo "fix Gemfile(uncoment mini_racer)"
cat Gemfile | sed "s/# gem 'mini_racer'/gem 'mini_racer'/" > __tmpfile__
cat __tmpfile__ > Gemfile
rm __tmpfile__

docker-compose build

# fix config/database.yml
echo "fix config/database.yml"
cat config/database.yml | sed 's/password:$/password: password/' | sed 's/host: localhost/host: db/' > __tmpfile__
cat __tmpfile__ > config/database.yml
rm __tmpfile__

echo "docker-compose run web rake db:create"
docker-compose run web rake db:create

echo "docker-compose up"
docker-compose up

```

上記の`docker_rails.sh`を他にファイルの無いディレクトリ上で実行する。

```
bash docker-rails.sh
```

しばらくしてターミナルで

```
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
```
と表示されたらブラウザで`localhost:3000`にアクセスするとrails serverが立ち上がっているはずです。

![スクリーンショット 2018-11-20 0.19.39.png](https://qiita-image-store.s3.amazonaws.com/0/251648/cdf47cf5-f661-56e9-7f5b-c8c3c58fdf89.png)
予約語が無いということ


# シャドウイング

プログラミング言語 Scheme では予約語というものはない。 たとえば `define` のような基本的な構文すら `define` の機能に `define` という名前が束縛されていると考えることが出来る。

再定義や代入には制限があるので予約語ではないからといってどこにでも現れることが出来るわけではないが、 `let` などで隠蔽 (shadowing) する分にはどんな識別子でも対象に出来る。

こんなコードは<ruby><rb>全</rb><rp>(</rp><rt>まった</rt><rp>)</rp></ruby>く正しい。

```scheme
(let ((define *)
      (a 2))
  (define a 2))
```

もちろん、ほとんどの場合には単にわかり<ruby><rb>難</rb><rp>(</rp><rt>にく</rt><rp>)</rp></ruby>くなるだけなので基本的な構文と同じ名前に別の意味を持たせるのは避けるべきだが、 Scheme における識別子の考え方を理解する上では重要な点でもある。

# 短縮表記

以下のような式を評価すると何が返ってくるか答えられるだろうか？

```scheme
(let ('-) '1)
```

`'` はあくまでも `quote` を短縮した表記法だ。 そのことを思い出して書き換えると、上記は

```scheme
(let ((quote -)) (quote 1))
```

と等しい。

`quote` もまた単なる識別子であり隠蔽可能であるので、この `quote` は `-` と同じ手続きに束縛された変数に過ぎず、式を評価した結果は `-1` となる。

# `import`

Scheme では、 R6RS からモジュール化の仕組みが追加された。 __ライブラリ__と呼ばれる別のモジュールが公開する機能を `import` すればその機能が使えるようになる。 ライブラリは規格 (処理系) が提供するものの他に、自分で作ることもできる。

さて、 `import` の<ruby><rb>際</rb><rp>(</rp><rt>さい</rt><rp>)</rp></ruby>には、名前を変更する機能がある。

たとえば `define` を `def` という名前で導入する場合には R6RS ではこのように書ける。

```scheme
#!r6rs
(import (rename (rnrs) (define def))
        (except (rnrs) define))

(def a 1)
(display a)
```

この場合は

- `(rnrs)` というライブラリから `define` という名前を `def` にリネームして導入する
- `(rnrs)` というライブラリから `define` 以外を導入する

ということを指定している。

# 違いの吸収

Scheme の仕様の改定で変更されたもののひとつとして `define` が挙げられる。

R6RS の `define` は束縛する値を省略することが出来る。 その場合は変数を束縛している値は未定義であるが、直後に `set!` をするような場合には未定義であることを強調する書き方が出来た方が好ましい場合もある。 R7RS では `define` で変数を定義するときには初期値を省略することは出来ない。

この違いを吸収して R7RS で R6RS 風の `define` を使おうとすると以下のように書くことが出来る。

```scheme
(import (rename (scheme base) (define r7rs:define))
        (except (scheme base) define)
        (scheme write))

;; R6RS 風の define を定義する
(define-syntax define
  (syntax-rules ()
    ((_ i)
     (r7rs:define i (if #f #t)))
    ((_ i f)
     (r7rs:define i f))))

(define a)  ; R7RS だが、 R6RS 風の define にできる
(set! a 'foo)
(display a)
```

# まとめ

Scheme では仕様の改定によって新しい機能が追加されることも、既存の機能の挙動が変更されることもある。 また、処理系ごとの差異もかなり大きい。

しかし、基本的な言語機能を予約語として表現しないという性質によって名前の衝突は簡単に回避できるし、別バージョンの共存も簡単に成し得る。 いくつかの言語がバージョンアップと共に予約語の追加で破壊的な衝撃を<ruby><rb>齎</rb><rp>(</rp><rt>もたら</rt><rp>)</rp></ruby>すのと比較すると、<ruby><rb>穏当</rb><rp>(</rp><rt>おんとう</rt><rp>)</rp></ruby>に移行可能なのが Scheme なのである。
【Git】Cloud9のインスタンスにアクセスできなくなった時の対処法【プログラミング学習84日目】

# はじめに
初心者が学びの内容を言語化することで、学習の中で得た知識を定着させすることを目的としている記事です。

今回は、Railsチュートリアルを実施するために、チュートリアル内で推奨されているCloud9を初めて使用している際に起きたトラブルとその対処法についてメモしていきます。

# トラブルの症状
何かの拍子にCloud9で作成していたインスタンスを消してしまったことで、アクセス不能になりました。（ローカル環境のデータが抹消されてしまいました。）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/307533/ac45d9e3-a4a8-428e-b16c-daa0330ea536.png)

# 考えられる原因
以下のような警告文が何回も出てきたことで焦り、指示通りTool > Process Listへ行きました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/307533/8ef88a20-2546-d3cb-3bfa-e51c78b3799c.png)

その後、プロセスリストがずらーっと出てきたのですが、焦っていたので、よく分からないけど何かしなければと全処理をKillしてしまったことが原因だと考えられます。
（もしかすると原因は違うかもしれませんが、これをした直後にインスタンスが消滅していてアクセス不可能となったのでこれが原因ではないかと考えています。）

# 対処法について
- 消滅したのはローカル環境にあったファイルであって、GitHubやBitbucket上にプッシュされていたデータがあれば、そこからファイルを復元できるのではないかと初心者なりに考えました。
- そこで、Cloud9にて新規インスタンスを作成し、GitHubやBitbucket上のリポジトリからクローンを作成する方法を調べながら実施しました。

## 実際に実行したこと
```
(1) Cloud9にて新規インスタンスを作成
(2) Cloud9にRailsをインストール
    - $ gem install rails -v 5.1.6
(3) 秘密鍵、公開鍵の再発行（毎度する必要はない？）
    - $ cd ~/.ssh
    - $ ssh-keygen
    - $ cat ~/.ssh/id_rsa.pub
(4) 公開鍵をコピーしてGitHubやBitbucketに登録
(5) ディレクトリの移動
    - $ cd ..
    - $ cd environment
(6) $ git init（※後から不必要な作業だったと発覚）
(7) クローンの作成
    - GitHubの場合、$ git clone https://github.com/ユーザー名/リポジトリ名.git
    - Bitbucketの場合、$ git clone git@bitbucket.org:ユーザー名/リポジトリ名.git
    - ユーザー名とパスワードを聞かれるので入力
(8) 以上で無事に復元成功！
```

以上のような流れで予想していたよりも簡単に復旧ができたので良かったです。

しかしながら前述の流れの中で1点反省点があります。
`$ git init`を実施したのですが、この流れだとリモートブランチに合わす必要があるため、よく考えるとせっかくリモートブランチに最新版があるのにforce pushしたら消えてしまうという危険なことをしていたことに後から気付きました。

当たり前のことですが、きちんと各コマンドの意味を意識しながらこういったミスを減らせるように精進していきます。

なお、前述の流れの後、本番環境（Heroku）にも接続しておきたかったため、[【Cloud9】Herokuへの接続方法](https://fukutech.qrunch.io/logs/Y46snipzONPaZot1)を参考に実施しておきました。

# まとめ、所感

- ローカル環境のデータがなくなってしまったときに、GitHubやBitbucketからファイルのクローンを作成する方法について学びました。
- 慣れない作業だと深く理解できていない状態で手を動かす場面もあるため、こういったミスが出てくることが多々あるとは思いますが、今後は焦らず適切な対処をするよう意識付けしていきたいです。
- また、こういうミスをカバーするためにも、GitHubやBitbucketに適宜更新したものをプッシュしておく重要性を身をもって体験することができました。GitHubは偉大です。
【GCP】Google Stackdriverの紹介

##Google Stackdriverとは
クラウドベースのアプリケーション向けに統合化された、監視機能やロギング機能を提供するモニタリングツール。
GCPだけでなく、AWS上で動くリソースの監視や情報収集、診断が行うことができる。

〜歴史的なお話〜
元々は2012年からAWS向けのアプリケーション監視を代行するサービスを提供していたStackdriver。
その後、2014年にGoogleが買収し、2016年10月にGoogle Stackdriverとして公開。（このあたりからGCPの勢いがすごかったらしい。）

##Stackdriver Monitoring
クラウドで実行されるアプリケーションのパフォーマンスや稼働時間、全体的な動作状況を視覚的に確認が可能。
収集したデータを取り込んでダッシューボード、グラフ、アラートで表示する。
アラート機能は、メール、SMS、Slack、PagerDuty、Campfireで受け取ることができる。

##Stackdriver Logging
クラウドや、オープンソースアプリケーションからのログを表示、フィルタリング、検索する機能を備えている。
ログを BigQuery、Google Cloud Storage、Pub/Sub にエクスポートすることもできるので、高速にログ解析ができる。

##Stackdriver Error Reporting
実行中のクラウドサービスで発生したクラッシュをカウントして、分析と集計を行う。
タイムチャート、発生回数、影響を受けたユーザー数、最初 / 最後の発生日時、削除された例外スタック トレースといったエラー詳細まで表示される。
新しいエラーが発生した際は、メールやスマホに通知が届くように設定もできる。

##Stackdriver Debugger
本番環境で実行中のアプリケーションを停止したり、処理速度を下げたりすることなく、アプリケーションの状態を調べることができる。

##Stackdriver Trace
アプリケーションのパフォーマンスにおけるボトルネックを検出する。
ほぼリアルタイムでパフォーマンスの分析情報を提供し、レイテンシの詳細レポートも生成する。
App Engineアプリケーションはすべて自動的にトレースされる。

##Stackdriver Profiler（BETA）
本番アプリケーションのリソース消費を継続的にプロファイリングする。
この情報を使い、潜在的なパフォーマンスの問題を特定し、問題を解消する。
npmライブラリ「nice-try」使ってみた

# Try And Errorも大事だが…

プログラミングとは、Try And Errorの繰り返しです。
数々のエラーをなぎ倒し、ようやく真のプログラムを手にした時の快感というのは、ものすごいものです。
しかし、ものすごい集中力の末、一切デバッグなしに、エラーもなく実行し終えるというのも気持ちが良いものです。
そんな願いを叶えてくれる粋なライブラリ「nice-try」をご紹介します。

[nice-try](https://www.npmjs.com/package/nice-try)

## 使い方

使用方法は至って簡単です。
あらゆる処理を、niceTryでラップするだけです。

```javascript
const niceTry = require('nice-try');

niceTry(() => {
    const num = 0;

    num = [1,2,3].reduce((pre, curr) => {
        return pre + curr;
    }, num);
    
    console.log(num);
});
```

そんなこんなを言っているうちに、ものの数十秒で、スマートかつ完璧なコードができあがりました。
Nice try!!
完璧なコードを書き上げる爽快感がたまりません。

## あとがき

今回ネタ的に使ったライブラリですが、テストで通っちゃいけないところを通したりする時とかに使えそう、、、ですかね？ほんと何に使うんだこれ。誰か教えてください。
そして、今日も一日、**Nice try**でした。
Firebase Storage でメタデータを設定してセキュリティルールに利用する

Firebase Storage の閲覧・更新などの権限を細かく設定できます。今回は Storage にアップロードされているファイルのメタデータに基づいて権限を設定する方法を残しておきます。

## 仕様

- read は誰でもできる
- create は認証済みユーザなら誰でもできる
- update, delete は create したユーザしかできない

### ルール

```
service firebase.storage {
  match /b/{bucket}/o {
    match /json/{allPaths=**} {
      allow read;
      allow create: if request.auth != null;
      allow update, delete: if resource.metadata.owner == request.auth.uid;
    }
  }
}
```

`create` は `if request.auth != null` で認証済みユーザのみ許可しています。

`update` `delete` は `if resource.metadata.owner == request.auth.uid` で設定されているメタデータからオーナ ID を参照して一致すれば許可しています。

### カスタムメタデータの設定

`customMetadata` というキーが任意に設定できるフィールドなので、ここに Object を保存することでルールファイルから `resource.metadata` で参照が可能です。

```javascript
const meta = {
  cacheControl: 'public,max-age=300',
  contentType: 'application/json',
  customMetadata: { owner: userId }
}
const storageRef = firebase.storage().ref(`json/${id}.json`)
storageRef.putString(JSON.stringify(json), 'raw', meta).then(async () => {
  const url = await storageRef.getDownloadURL()
  console.log(url)
}).catch(err => {
  console.log(err)
})
```

以上です。
Google スプレッドシートで入力制限を設定

# スプレッドシートで入力制限
スプレッドシートの特定のセルに入力制限を設けたいときは「データ」→「データの入力規則」を適用するのですが、デフォルトの規則にない独自のルールを設定する場合はどうすればよいでしょうか？
例えば日本においては特定の列で「ひらがなのみ」「カタカナのみ」を許すように設定したいことがありますが、これらの規則はスプレッドシートのデフォルトに組み込まれていません。

このような場合は「カスタム数式」と「正規表現マッチ」の組み合わせで対処します。以下に具体例を示します。

![cellrule.png](https://qiita-image-store.s3.amazonaws.com/0/176789/b31af79c-3805-b4e8-9a5e-1bdfe5b4b110.png)


## ひらがなのみ
以下の式をカスタム数式の右側に入力して下さい。

```
=REGEXMATCH(B2, "^[あ-ん]+$")
```

## カタカナのみ
以下の式をカスタム数式の右側に入力して下さい。

```
=REGEXMATCH(B2, "^[ア-ン]+$")
```

## 半角英数字のみ
これも実はカスタム数式で設定する必要があります。以下の式を入力して下さい。数字だけの場合はテキストとして認識されず正規表現マッチが機能しません。そのため間に`TO_TEXT`関数を噛ませています。

```
=REGEXMATCH(TO_TEXT(B2), "^[ -~]+$")
```
CentOS7 ファイルシステムの暗号化

・SSMインストール
`yum install -y system-storage-manager`
・ストレージデバイスの設定状況確認

```
[root@localhost ~]# ssm list
-------------------------------------------------------------
Device         Free      Used      Total  Pool    Mount point
-------------------------------------------------------------
/dev/sda                        50.00 GB          PARTITIONED
/dev/sda1                      500.00 MB          /boot
/dev/sda2  44.00 MB  49.46 GB   49.51 GB  centos
-------------------------------------------------------------
---------------------------------------------------
Pool    Type  Devices      Free      Used     Total
---------------------------------------------------
centos  lvm   1        44.00 MB  49.46 GB  49.51 GB
---------------------------------------------------
-------------------------------------------------------------------------------------
Volume            Pool    Volume size  FS     FS size       Free  Type    Mount point
-------------------------------------------------------------------------------------
/dev/centos/root  centos     45.59 GB  xfs   45.57 GB   37.21 GB  linear  /
/dev/centos/swap  centos      3.88 GB                             linear
/dev/sda1                   500.00 MB  xfs  496.67 MB  207.93 MB  part    /boot
-------------------------------------------------------------------------------------
```

・暗号化されたLVMボリュームの作成
`ssm create --fstype xfs -p pool001 -e luks /dev/sda5 /mnt`
「-e luks」オプションを付与すると、暗号化されたボリュームが作成される

暗号化された論理ボリュームはパスフレーズが付与されているため、マウントされないようにロックをかけることができる
・ロック
`cryptsetup luksClose /dev/mapper/encrypted001`
・解除
`cryptsetup luksOpen /dev/mapper/encrypted001`
scaffoldで生成されるコードをコードリーディングしてみた

#scaffold
英語に直訳すると「足場」。
Railsに用意されている[ジェネレーター](https://kotobank.jp/word/%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AC%E3%83%BC%E3%82%BF%E3%83%BC-4081)の一つで、コマンド一つで最低限の[CRUD](https://www.weblio.jp/content/CRUD)に関わるルーティング(routing)やコントローラー(controller)、ビュー(view)、モデル(model)とテーブル（データベース）の記述やファイルなどを自動で作成してくれるコマンド。

##ルーティング(routing)

scaffoldコマンドを実行する前のルーティングファイル

```routes.rb
Rails.application.routes.draw do
end

```

scaffoldコマンドを実行すると、、、

```routes.rb
Rails.application.routes.draw do
  resources :◯◯◯s
end

```

このように **resources :◯◯◯s** というコードが追加される。

では、 **resoures :◯◯◯s** とはどういうコードなのか？

##resoures

resouresは、[RESTful](https://ja.wikipedia.org/wiki/Representational_State_Transfer)なURLを自動生成するコードである。

###使い方
使い方としては、

```
resources :リソース名 [, オプション]
```

このような形で使います。

###生成されるURL
では、実際にどのようなURLが生成されるのか、表にしてまとめました。

| URL	                   |  アクション	       |  HTTPメソッド	    |  説明               |
|:-------------------------|------------------:|:------------------:|:------------------:|
| /◯◯◯s(.:format)	   |  index	       |  GET	            |  一覧画面を生成       |    
| /◯◯◯s/:id(.:format)	   |  show	       |  GET	            |  詳細画面を生成       |
| /◯◯◯s/new(.:format)	   |  new	       |  GET	            |  登録画面を生成       |
| /◯◯◯s(.:format)	   |  create	       |  POST	            |  登録処理            |
| /◯◯◯s/:id/edit(.:format) |  edit	       |  GET	            |  編集画面を生成       |
| /◯◯◯s/:id(.:format)	   |  update	       |  PUT	            |  更新処理            |
| /◯◯◯s/:id(.:format)	   |  destroy	       |  DELETE	    |  削除処理            |

resourcesでこれだけのURLが自動生成されます。

##参考サイト
[resources - リファレンス - - Railsドキュメント](http://railsdoc.com/references/resources)
MySQL Workbenchで、DDL文、INSERT文を生成

# DDL文を生成
1. MySQL Workbenchで、データベースに接続
2. Navigatorバーから、対象となるテーブルの名前を右クリック
3. Table Inspectorをクリック
4. 出てくる画面の中で、DDLタブをクリック

# INSERT文を生成
1. MySQL Workbenchで、データベースに接続
2. Navigatorバーから、対象となるテーブルの名前を右クリック
3. Select Rows - Limit 1000 をクリック
4. メニューバー→Query→Export Resultsをクリック
5. 好きなファイル名を入力
6. ファイルの種類：SQL INSERT statementsを選択し、保存を押す
7. Exportをクリック
突然自作キーボードにハマりHelixとHelix Picoを作った話 その2

[ブログ](https://aoirohn.hatenablog.com/entry/2018/11/19/224359)からの転載です

---

Helix Picoを作った話

Helixを作った話は[その1](https://qiita.com/aoirohn/items/d4374ace4169aa993028)へ

---

Helixを作って[いつも通り](https://qiita.com/aoirohn/items/cf85e2a87b2903e1dedb)Aの左のキーをEsc, Ctrl, 矢印キーに変えていた頃だった

天下一キーボードわいわい会なるものが開催されることを知った。
[天下一キーボードわいわい会 Vol.1](https://connpass.com/event/104755/)

会自体は残念なことに定員が一杯だったりでTwitterで見守ることしかできなかったのだが、会場でHelix Picoが売られているという情報を入手した。

「これは週明けに遊舎工房でも売られるパターンでは🤔」と思い監視していたら、本当に在庫が復活していたので一瞬でカートに入れた。

#  Helix Pico (LED付き) を作る

買ったのは[HelixPico キーボードキット](https://yushakobo.jp/shop/helixpico/)の蛍光グリーン。その他、スイッチは赤軸、キーキャップは白の刻印キーキャップを買った。

更に、前回のHelixでうまく実装できて調子に乗っていた自分はHelix PicoにもLEDをつけることにした。

## 工具について

工具は[前回](https://qiita.com/aoirohn/items/d4374ace4169aa993028)と基本的に同じ。今回は[リードベンダー](https://www.amazon.co.jp/gp/product/B00J3E11VQ/ref=od_aui_detailpages00?ie=UTF8&psc=1)が滅茶苦茶活躍した。使い方がわからなかったけどググったら[公式の動画](https://www.youtube.com/watch?v=WX0qc8gKQcM)があった。

## 組み立て

組み立て方の説明書が入っていて簡単だった。
やっぱりHelix Picoを最初に作るべきだったのでは？と何度か思った。

以下、気をつけるところ

### MOGE対策

Helixの二の舞とならないよう最初に端子を接着する。大事。最初にやった。
![2018-11-04 16.09.17.jpg](https://qiita-image-store.s3.amazonaws.com/0/256100/f4ecb240-d733-e577-4efd-d2d32a44cb1a.jpeg)


### LEDはダイオードより先につける

Helixではダイオードを先につけたが、Helix Picoではダイオードは表面側にくるので先にLEDを付ける必要がある。
![DSC_2244.JPG](https://qiita-image-store.s3.amazonaws.com/0/256100/f8176e69-e32c-f2e8-3369-de36d71b360d.jpeg)

ダイオードとLEDをつけた後の図。ダイオードは表側だがLEDは裏から実装するので先にLEDをつけたほうが良い。

![DSC_2244.JPG](https://qiita-image-store.s3.amazonaws.com/0/256100/223e06f9-2a13-8a75-fa42-0c28bd781754.jpeg)

今回も240℃くらいで実装したけど大丈夫だった。途中で間違って4つ270℃ではんだ付けしてしまって1つ壊れた。[^1]
[^1]: 240℃なら絶対壊れないと言っているわけではないです

## 完成
かわいい
![DSC_2248.JPG](https://qiita-image-store.s3.amazonaws.com/0/256100/844246b2-33a2-747d-8393-0274d61d3d90.jpeg)

とてもかわいい
![saved_file1541952008558.jpg](https://qiita-image-store.s3.amazonaws.com/0/256100/68517bcd-891a-75b4-a8da-fd33855013c3.jpeg)

# 結論

LED付きHelix Picoかわいいしコンパクトだし簡単だしおすすめ！

次はキーボード配列について書きます。
ローカルのmasterブランチで間違ってコミットしてしまった時に戻す方法

間違ってmasterでコミットしてしまった。
git pullしても変化なし。
どうすれば良いかの備忘録。

#一回ローカルのmasterを削除してからリモートのmasterにcheckout

```
$git checkout 他のブランチ
$git branch -D master  # ローカルのmasterを一回削除
$git checkout master # リモートのマスターに切り替える。
```

そうすると綺麗なmasterに切り替わる。
React.jsの特徴

ようこそ、[React.js Advent Calendar 2018](https://qiita.com/advent-calendar/2018/react)へ！

カレンダーを作ったトップバッターということで、React.jsの特徴を、他のフレームワークとも比較しつつ書き連ねていきます。

## 仮想DOMフレームワーク

仮想DOMについて詳しいことは[ちょうど4年前のカレンダー記事](https://qiita.com/mizchi/items/4d25bc26def1719d52e6)に譲りますが、3行でまとめるなら、

* シンプルなJavaScriptのオブジェクトとして、DOM構造を表現する「仮想DOM」を構築する
* 実際のDOMへの反映の際は、現在のDOMと仮想DOMを比較して、差分だけ適宜反映する
* 画面描画ごとに仮想DOMを構築しても、実用十分な性能が出る

ということで、jQueryでやっていた「ここをこう変化させる」と要素ごとに操作する必要性がなくなります。

## 仮想DOMオブジェクトを直接変数に入れられる

RiotはHTMLをHTMLとして表現する方式だったのですが、そのために[`<table>`など、タグの組み合わせが決まっているところでうまく組めない](https://qiita.com/jkr_2255/items/ddb00e04a7328f30829e)という事態に陥ることがありました。Reactでは純粋なJavaScriptのオブジェクトとして仮想DOMを組むので、複雑なテーブルでもJavaScript的に組み上げてしまうことができました。

## コンポーネント化

[picodom→ultradom→superfine](https://github.com/jorgebucaran/superfine)[^1]という仮想DOMライブラリを使っていたこともありましたが、これには状態をもたせたコンポーネントがなかったので、本来であれば親が知る必要もないような細かな状態についても、まとめて管理せざるを得ず、コードが密結合になってしまっていました。

Reactでは状態を持ったコンポーネントを作れるので、上位層から知る必要のないような`state`は子コンポーネントに封じきってしまうことができます。

## Controlledな要素

これは[自分自身が以前に書きました](https://qiita.com/jkr_2255/items/c994b4ceebdd127bd710)が、フォーム要素に値を記憶させるというデフォルトの機能をあえて殺して、「ユーザーからの入力」と「値の表示」を切り離すことで、入力値の管理をシンプルにしています。素のJavaScript、jQuery、Riotでも、「イベントと書換と読出しのタイミング」で悩まされてきたので、全部をJavaScript側のデータで管理できるというのも便利に感じました。

## バックエンドの自由度（ブラウザ以外への発展）

まだ使ったことはないのですが、同じ仕組みでReact Nativeというものがあって、DOM APIではなくプラットフォームごとのGUI用APIを呼ぶことで、ネイティブアプリもReactで作れるようになる、とのことです。仮想DOMのルーチン自体はDOMに依存するものではないので、バックエンドさえ作れば多様な環境に対応が可能となりますし、その実例があるというのもいいものです。

## 始めるまでのハードル

Reactは慣れてしまえば快適なのですが、始めるコストはある程度ある気もします。

* 最先端のJavaScript文法（Object Spread、`class`でのプロパティ宣言など）を多用する書き方
* JSXという、仮想DOMを直接JavaScriptで書けるようにするための文法拡張
* これらを処理する環境構築

とはいえ、環境構築は`create-react-app`で済ませてしまうなど、どうにかする手段はあります。

[^1]: 何度も名前が変わるくらいに改変が入り続けたのも、このライブラリから離れた要因の1つです。
PowerShellで上司を設定する

# Office365のユーザの上司を設定する
管理者モードでPowerShellにログインします。
以下を1回だけ実行します。

```powershell:
Install-Module -Name AzureAD
```

その後AzureADに接続します。2回目以降はこのコマンドから実行します。

```powershell:
Connect-AzureAD
```

現在の上司を取得したい場合は以下のコマンド

```powershell:
Get-AzureADUserManager -ObjectId "<ユーザのObjectID>"
```

変更したい場合は以下のコマンド

```powershell:
Set-AzureADUserManager -ObjectId "<ユーザのObjectID>" -RefObjectId "<上司のObjectID>"
```

Set-AzureADUserManagerについてはMSのマニュアルを見てください。
https://docs.microsoft.com/ja-jp/powershell/module/azuread/set-azureaduser?view=azureadps-2.0
【memo】Cent7 firewalld

#firewalldの仕組み
管理するゾーンを定義し、そのゾーンに対して許可・拒否などの制御を施したい各種サービスを割り当てる
そして、定義したゾーンとサービスに対して、NICを紐づける

・デフォルトゾーン
block : 内部に入ってくるパケットは拒否される標準で許可されているサービスはない
dmz : 内部ネットワークへ流れようとするパケットは制限される。デフォルトでsshサービスのみ許可されている
drop : 内部に入ってくるすべてのパケットを破棄し、応答もない。外部へ出ていくパケットのみ許可する
external : IPマスカレード接続を伴う外部ネットワークで利用される。デフォルトでsshサービスのみ許可されている
home : 家庭用ネットワークで利用される。ネットワーク上にあるマシンを信頼する前提で利用する
internal : 内部ネットワークで利用される。内部に入ってくるパケットのうち、明示的に指定したものだけを許可する
public : デフォルトのゾーンであり、一般的にパブリックLANで利用される。内部に入ってくるパケットのみ許可される
trust : 全てのパケットが許可される
work : ワークエリアで利用される。ネットワーク上にあるマシンを信頼する前提で利用する

・ゾーンの設定状況確認
`firewall-cmd --list-all-zones`
・管理対象とするすべてのゾーンを表示
`firewall-cmd --get-zones`
・アクティブになっているゾーンを表示

```
[root@localhost ~]# firewall-cmd --get-active-zones
public
  interfaces: ens192
```

#firewalldを使ったサービスの設定

```
firewall-cmd --permanent --zone=public --add-service=nfs
firewall-cmd reload ←設定反映
firewall-cmd --zone=public --list-services ←設定確認
```

・設定ファイルの確認

```
[root@localhost zones]# cat public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="dhcpv6-client"/>
  <service name="ssh"/>
</zone>
```

#firewalldを使ったNAPT設定
最低2つのNICが必要であり、1つはグローバルIPアドレスを持ち、もう1つはプライべートIPアドレスを持つ
・IPv4のフォワーディングを有効化
`vi /etc/sysctl.conf`
「net.ipv4.ip_forward = 1」を追記

・NICが所属するゾーンを確認

```
[root@localhost zones]# firewall-cmd --get-active-zones
public
  interfaces: ens192 ens224
```
・プライベートIPアドレスを割り当てるens224のゾーンを「trusted」に変更

```
[root@localhost zones]# firewall-cmd --permanent  --zone=trusted --change-interface=ens224
success
[root@localhost zones]# firewall-cmd --get-active-zones
public
  interfaces: ens192
trusted
  interfaces: ens224
```
※とできるはずが変わらなかったため、
`nmcli c mod "Wired connection 2" connection.zone trusted`で変更

・NAPT有効化
`firewall-cmd --permanent --zone=public --add-masquerade`
設定確認

```
[root@localhost zones]# firewall-cmd --list-all --zone=public
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens192
  sources:
  services: dhcpv6-client ssh
  ports:
  protocols:
  masquerade: yes ←
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
```
.Net > MySQL





## MySQL for Visual Studio


[MySQL :: Download MySQL for Visual Studio](https://dev.mysql.com/downloads/windows/visualstudio/)

↓これを入れた
![image](https://qiita-image-store.s3.amazonaws.com/0/49910/4ae2bb8c-e40e-621c-8ac9-249b883c79c6.png)



## Connector/NET

[MySQL :: Download Connector/NET](https://dev.mysql.com/downloads/connector/net/6.10.html)

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/7cbb28f2-a25e-8aba-b565-606f676cf522.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/21fee36c-4919-29ee-985e-a528e50477e7.png)


## MySql.Data.Entity

[MySQL :: MySQL Connector/NET Developer Guide :: 9.1 Entity Framework 6 Support](https://dev.mysql.com/doc/connector-net/en/connector-net-entityframework60.html)

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/cbefec36-ec37-2894-aa38-6876c571c9e7.png)

これで、データベースからEF Designerが使えるようになります。

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/058e1fb8-3a04-4a45-96fd-6ba5c28f55d9.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/be6ce1e7-0094-3c93-02da-d92065f4ef26.png)




## 使う

データソースの登録
![image](https://qiita-image-store.s3.amazonaws.com/0/49910/8601f3f5-05bc-14b1-3d10-3a7884abe84b.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/d810da3e-7dce-9470-e8dc-d672e2392f2b.png)



## 参考

[(2) C# .NET - How to connect to a MySQL database and run queries - YouTube](https://www.youtube.com/watch?v=h9E2MczMMmQ)

[Visual Studio 2017から MySQL へ接続 - Qiita](https://qiita.com/Masutani/items/ce613bb371c7915b74b9)
Juliaで学ぶ確率変数(10) - コーシー分布（連続型）

[Juliaで学ぶ確率変数(1) - 確率変数の定義 - Qiita](https://qiita.com/sand/items/afb5976ad28120d216c4)
[Juliaで学ぶ確率変数(11) - まとめ - Qiita](https://qiita.com/sand/items/e4b32f7cfd74dea40298)



　確率変数を勉強中ですが、**「確率統計」（森北出版）**は数学的に明確な定義がしっかり書かれているので、これを中心に勉強しています。あわせて**「統計学入門」（東京大学出版会）**と**「確率論入門」（ちくま学芸文庫、赤攝也）**も併読しています。

　本記事は、それらの教科書を読みながら、実際に例題や問題をJuliaで解いていく試みです。Juliaの連続型確率変数のライブラリのドキュメントです。　==>[Distributions/Univariate/ContinuousDistributions](
https://juliastats.github.io/Distributions.jl/latest/univariate.html#Continuous-Distributions-1)


#１．コーシー分布C(μ,β)


```math
\begin{align}
\\
\\
&定数 \mu,\; \alpha を\mu \in (-\infty, \infty),\; \alpha>0　とする。\\
\\
&X: \Omega \rightarrow  (-\infty, \infty)\\
\\
&確率密度関数f(x)が以下のように書けるとき、Xはコーシー分布C(\mu,\alpha)に従うという。\\
\\
&f(x) = \frac{1}{\pi} \frac{\alpha}{(x-\mu)^2+\alpha^2} \qquad x \in (-\infty, \infty)\\
\\
\\
\\
&\qquad \qquad  \qquad \qquad  \qquad \qquad  \qquad \qquad \qquad  \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad  \qquad  \\
\end{align}
```


追加するかもしれませんが、今回は以上です。
Juliaで学ぶ確率変数(9) - ベータ分布（連続型）

[Juliaで学ぶ確率変数(1) - 確率変数の定義 - Qiita](https://qiita.com/sand/items/afb5976ad28120d216c4)
[Juliaで学ぶ確率変数(11) - まとめ - Qiita](https://qiita.com/sand/items/e4b32f7cfd74dea40298)


　確率変数を勉強中ですが、**「確率統計」（森北出版）**は数学的に明確な定義がしっかり書かれているので、これを中心に勉強しています。あわせて**「統計学入門」（東京大学出版会）**と**「確率論入門」（ちくま学芸文庫、赤攝也）**も併読しています。

　本記事は、それらの教科書を読みながら、実際に例題や問題をJuliaで解いていく試みです。Juliaの連続型確率変数のライブラリのドキュメントです。　==>[Distributions/Univariate/ContinuousDistributions](
https://juliastats.github.io/Distributions.jl/latest/univariate.html#Continuous-Distributions-1)


#１．ベータ分布Be(α,β)



```math
\begin{align}
\\
\\
&定数 \alpha,\; \beta を\alpha>0,\; \beta>0　とする。\\
\\
&X: \Omega \rightarrow [0,1]　\subset R\\
\\
&確率密度関数f(x)が以下のように書けるとき、Xはベータ分布Be(\alpha,\beta)に従うという。\\
\\
&f(x) =
\left\{
\begin{array}{ll}
\frac{1}{B(\alpha,\beta)} x^{\alpha-1} (1-x)^{\beta-1} & (0\leqq x \leqq 1 \;のとき) \\
0 & (それ以外のとき)
\end{array}
\right.\\
\\
\\
&念のため 0\leqq x \leqq 1 の時の定義を大きく書いておきます。\\
&f(x) = \frac{1}{B(\alpha,\beta)} x^{\alpha-1} (1-x)^{\beta-1}
\\
\\
&ここでB(\alpha,\beta)は解析学でベータ関数と呼ばれるものです。\\
\\
\\
&ここで以下が成り立つ。\\
&E[X] = \frac {\alpha}{\alpha + \beta}\\
&V[X] = \frac {\alpha \beta}{(\alpha+\beta+1)(\alpha+\beta)^2}
\\
&\qquad \qquad  \qquad \qquad  \qquad \qquad  \qquad \qquad \qquad  \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad  \qquad  \\
\end{align}
```



##１－１．ベータ関数の定義

```math
\begin{align}
\\
&ベータ関数の定義\\
&x>0,\; y>0の時\\
&B(x,y) =\int_{0}^{1} t^{x-1} (1-t)^{y-1} dt\\
\\
\\
&ベータ関数の性質\\
&[B1] \; B(x,y) = B(y,x)  \qquad 任意の実数x>0,\;y>0\\
\\
&[B2] \; B(x,y) = 2 \int_0^{\frac{\pi}{2}} \sin^{2x-1}\theta \;\; \cos^{2y-1}\theta \;\;d\theta  \qquad  任意の実数x>0,\;y>0\\ 
\\
&[B3] \; B(x,y)=\frac {\Gamma(x)\Gamma(y)}{\Gamma(x+y)} \qquad  任意の実数x>0,\;y>0\\
\\
\\

&\qquad \qquad  \qquad \qquad  \qquad \qquad  \qquad \qquad \qquad  \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad  \qquad  \\
\end{align}
```


追加するかもしれませんが、今回は以上です。
typescriptのwebserver【express】

# Webサーバ
```typescript
import * as express from "express";
import { NextFunction, Request, Response } from "express";

const app = express();

//リクエスト処理
app.get("/hello", (req: Request, res: Response, next: NextFunction) => {
  res
    .set("Content-Type", "application/json; charset=utf-8")
    .join({ message: req.url + "のリクエストを受けました" });
});

//未定義パスへのリクエスト
app.use((req: Request, res: Response, next: NextFunction) => {
  next({ message: "該当するパスがありません" });
});

//エラー処理
app.use((err: any, req: Request, res: Response, next: NextFunction) => {
  res.set("Content-Type", "application/json; charset=utf-8").join(err);
});

//---------------
//Webサーバの起動
//---------------
const port = 3000;
app
  .listen(port, () => {
    console.info(port + "番ポートで待機中");
  })
  .on("error", error => {
    console.error("ポートが開けません" + error.message);
  });
```
データの量で精度はどのくらい変わるのか？

# About
赤ちゃんの分類を対象に<b>データの量</b>で学習結果はどのように異なるかを検証
赤ちゃんの分類の詳細は過去記事
https://qiita.com/Phoeboooo/items/2c7457d1bfba514e2dc8

#モデル
比較のため、データが多いときと少ないときのどちらでも同じモデルを使う

```python

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',
                        input_shape=(150, 150, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(GlobalAveragePooling2D())
model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

```
>
Total params: 244,993
Trainable params: 244,993
Non-trainable params: 0

#データが少ないとき
>
Found 5825 images belonging to 2 classes.
Found 2000 images belonging to 2 classes.

##学習結果
```python

Epoch 1/15
233/233 [==============================] - 546s 2s/step - loss: 0.6685 - acc: 0.6113 - val_loss: 0.6959 - val_acc: 0.5000
Epoch 2/15
233/233 [==============================] - 504s 2s/step - loss: 0.6679 - acc: 0.6117 - val_loss: 0.6951 - val_acc: 0.5000
Epoch 3/15
233/233 [==============================] - 509s 2s/step - loss: 0.6664 - acc: 0.6117 - val_loss: 0.6945 - val_acc: 0.5000
Epoch 4/15
233/233 [==============================] - 512s 2s/step - loss: 0.6676 - acc: 0.6117 - val_loss: 0.6998 - val_acc: 0.5000

```
<b>accはずっと61%ぐらい、val_accはちょうど50%で全く動かず学習できていない</b>


#データが多い場合
>
Found 10000 images belonging to 2 classes.
Found 2000 images belonging to 2 classes.

##学習結果
```python

Epoch 1/100
200/200 [==============================] - 605s 1s/step - loss: 0.6939 - acc: 0.5062 - val_loss: 0.6926 - val_acc: 0.5350
Epoch 2/100
200/200 [==============================] - 610s 1s/step - loss: 0.6932 - acc: 0.5129 - val_loss: 0.6921 - val_acc: 0.5213
Epoch 3/100
200/200 [==============================] - 609s 1s/step - loss: 0.6924 - acc: 0.5183 - val_loss: 0.6905 - val_acc: 0.5712
.
.
.
Epoch 18/20
200/200 [==============================] - 1177s 6s/step - loss: 0.4492 - acc: 0.7786 - val_loss: 0.2808 - val_acc: 0.8819
Epoch 19/20
200/200 [==============================] - 1168s 6s/step - loss: 0.4490 - acc: 0.7791 - val_loss: 0.2894 - val_acc: 0.8747
Epoch 20/20
200/200 [==============================] - 1177s 6s/step - loss: 0.4438 - acc: 0.7839 - val_loss: 0.2831 - val_acc: 0.8791
```
＊エポック数があっていないのは学習を簡略化して表記したため
<b>データ拡張ありで87.91%までval_accが上がった　（データ拡張なしで82％）</b>
合計エポック数 : 550

#比較結果
データ集め・整理は地味な作業だが、めっちゃ大事
ドットインストールの「ローカル開発環境の構築 [Windows編] #07 仮想マシンにログインしてみよう」でPuTTYからVagrantにSSHできない！

ドットインストールの「ローカル開発環境の構築 [Windows編] #07 仮想マシンにログインしてみよう」でPuTTYから仮想マシンにログインできない！現象の解決

初心者Rubyistになるためにドットインストールの環境構築を進めていたけども、掲題部分で躓いたからメモ。

■現象
PuTYYからVagrantの仮想環境jにSSHしようとしたけども、エラー「Network error:Connection timed out」が出て先に進めない。

■実行環境
OS：Windows 10
Vagrant：v2.2.1
PuTTY 0.70
VirtualBox 5.2.18

■試したこと
ドットインストールの下部に記載の解決策を順番に確認・試していく

①IPの確認
ドットインストールの説明の通り進めてきていて、Vagrantで設定したIP（192.168.33.10）も間違っていない。
でも、pingは通らず。。。

②仮想環境の再起動
VagrantfileのIPの編集が有効になっているか確認するために、「vagrant reload」を実行してみるも、相変わらずpingは通らず。。。

③複数の仮想環境が立ち上がっていないか確認
ドットインストールに記載の通り、「vagrant global-status」を実行してみるも、特に複数の仮想環境は立ち上がっていない。。。

④セキュリティソフトの確認
セキュリティソフトが邪魔をする可能性もあるらしいけども、ググっても確認の仕方が分からず、試さず、次へ。

⑤仮想化支援機能の確認
ぶっちゃけよーわからんから、後回しにして、「vagrant putty 接続できない」とかでググってみても同じような質問が出てくるだけで、特に解決せず。。。

⑥仮想化支援機能の確認
面倒で後回しにしていた、仮想化支援機能とやらを調査。
ドットインストールの中に書いてある通り、「VBox.log」ファイルの中に、「VT-x is disabled in the BIOS for all CPU modes」がいる！
BIOSを起動して、「Intel(R) VirtualizationTechnology」が「Disable」になってたから「Enable」に変更してPCを再起動。

⇒「192.168.33.10」にpingも通るし、PuTTYからVagratの仮想環境にも接続できた！

■解決方法
今回は、ドットインストールに書いてある解決策（BIOSでVTを使えるようにする）で解決できた。
Swift基礎構文のメモ（初心者向け） part2

#【経緯】
社内もくもく会にてSwiftが始まったので復習がてら。[この記事](https://qiita.com/siroykht/items/10d391f072e488cbd133)のpart2です。

#【基礎構文】
___■配列___

~~~Swift:
/* 配列の宣言 */
var numbers:[String] = ["1", "2", "3"]

/* 配列に要素を追加 */
numbers.append("8")
~~~

___■for___

~~~Swift:
/* 配列の宣言 */
var numbers:[String] = ["1", "2", "3"]

/* 配列に要素を追加 */
numbers.append("8")

/* 配列の要素数分繰り返す */
for numStr in numbers {
    print("配列の中身は\(numStr)です")
}
~~~
~~~:出力
配列の中身は1です
配列の中身は2です
配列の中身は3です
配列の中身は8です
~~~

~~~Swift:
/* 繰り返し範囲の指定 */

let baseNumber:Int = 7

/* 1~9を繰り返す */
for number in 1...9 {
    let result:Int = baseNumber * number
    print("\(baseNumber) * \(number) = \(result)")
}
~~~
~~~:出力
7 * 1 = 7
7 * 2 = 14
7 * 3 = 21
7 * 4 = 28
7 * 5 = 35
7 * 6 = 42
7 * 7 = 49
7 * 8 = 56
7 * 9 = 63
~~~

___■辞書___

~~~Swift:
/* 辞書を定数に代入する方法 */
/* let 定数名: [キーのデータ型: 値のデータ型] = 辞書 */

let user : [String: String] = ["name" : "swift", "email" : "test@test.com"]
print(user["name"])
~~~

~~~:出力
Optional("swift")
~~~

~~~Swift:
/* 辞書を変数で宣言 */
var user: [String: String] = [
    "name": "Suzuki", 
    "email": "suzuki@example.com"
]

user["name"] = "Sato"
print(user["name"])
user["hobby"] = "soccer"
print(user["hobby"])
~~~

~~~:出力
Optional("Sato")
Optional("soccer")
~~~

___■Optional___
前にSwiftやった時はこの辺がわけわからん過ぎて何となくで流してました。
Optionalは「nil」が許容される型という意味らしいです。
「nil」というのは何もない状態。ポインタとして何も指してない事を表し、実体がない、という状態。
ポインタとして何も指してない、という観点だと「nil」「Nil」「NULL」が有りますが、それぞれ以下の違いがあります。

|語句|内容|
|---------------------|---------------------|
|nil：(id)0|オブジェクトを何も指していない|
|Nil：(Class)0|クラスを何も指していない|
|NULL：void *|ポインタを何も指していない|

通常のデータ型に「?」をつけることで表現されます。通常のデータ型の他に「nil」を代入することが出来ます。

___■アンラップ___
Optionalの末尾に「!」をつけることでOptionalの値を参照できる（通常時は参照できない）。
ただし、Optionalはnilを許容する型なので、nilでないことをチェックせずに案ラップすると中身がnilである可能性が発生する。
nilなOptionalの値にアンラップするとエラーが発生するので、絶対にnilではないと判断できる場合以外はnilチェックを行ってからアンラップをすること。
訳が分からなかった時期に取りあえずXcodeに導かれるまま「?」「!」を駆使するとデバッグで地獄を見ることになったのは記憶に新しい。

~~~Swift:
let user: [String: String] = [
    "name": "swift", 
    "email": "swift@example.com"
]

if user["name"] != nil {
    let name:String = user["name"]!
    print(name)
}
~~~
~~~:出力
swift
~~~

__■オプショナルバインディング__
Optionalがnilでないことをチェックし、アンラップして取り出すというパターンはswiftで良く発生します。
そこで、そのパターンを簡単に記述出来るようにした構文がオプショナルバインディング。
オプショナルバインディングを使用した記載では、アンラップを明示的に記載する必要がありません。

~~~Swift:
if let name:String = user["name"] {
} else {
    // nilの場合の処理
}
~~~

__■型推論__
代入する値によってデータ型が明確になる場合に、型宣言を省略できる構文。最近流行りの言語はこれが出来ることが多い。

~~~Swift:
if let name = user["name"] {
   /* true */ 
} else {
   /* false */
}
~~~

# 【所感】
個人的にちゃんと理解出来ていなかったOptionalの理解が出来たのは結構大きいかなと思います。前にアプリ作った時は納期の関係とか周りにやったことある人が居なかったりとかで、開発した人のいないアプリからコピペ＆ググって問題解決していた関係上、ちゃんとは理解出来ていなかったです。nilを許容する型とかその辺くらいでした。
オプショナルバインディングは何度も見たことあるんですが、ぱっと見で「何だこれ」ってなるので毎回意識的に避けてました。めっちゃ便利だった。
辞書（連想配列）とか型推論は最近流行りの言語は結構兼ね備えているような気がしますが、昔は受け入れられなかったです。初めてPHPでサーバーサイドプログラミングした時が懐かしい……。

# 【参考】
・https://qiita.com/tomohisaota/items/9df0b93442a7ee37fe1f・
・https://www.itcowork.co.jp/blog/?p=939
・https://www.dorapro.co.jp/engineerblog/?p=512
・https://www.itcowork.co.jp/blog/?p=939
Linuxでシリアル通信をする

#RS232cで機器を制御する
RS232cで通信して制御したい装置があって、Linuxで簡単にできる方法を調べている。詳しい人ならばLabViewとか使うのかもしれないけど、そこまで大仰なことは必要なくて、簡単なコマンドが使えれば十分なのでなるべく簡単に済ませたい。

##USB-RS232cケーブル
色々あるけど、今回はこれを買ってみた。
[UGREEN USB シリアル変換ケーブル](https://www.amazon.co.jp/dp/B00QUZY4UG/ref=asc_df_B00QUZY4UG2534152/?tag=jpgo-22&creative=9339&creativeASIN=B00QUZY4UG&linkCode=df0&hvadid=219757083513&hvpos=1o4&hvnetw=g&hvrand=16122928370860569160&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009279&hvtargid=pla-440682193641)
AmazonのページにLinuxのロゴがあったのでこれにしてみた。繋いでみたところ`/dev/ttyUSB0`として認識された。

##使えそうなプログラム
WindowsだとTeraTermを使うのが良いが、Linuxだと`cu`や`screen`あたりが有名らしい。どちらもまず初めにハマるのは、起動したもののどうやって抜けて良いのかわからないこと。`cu`は`~.`で、`screen`は`C-a k`で抜けられる。使い方はそれぞれ

```shell:cuの起動
$ cu -s 9600 -l /dev/ttyUSB0
```

```shell:screenの起動
$ screen /dev/ttyUSB0 9600
```
という感じ。ところがコマンドを打っても、うまく返事が返ってこないので困った。
色々と苦戦したのだが、`cu`を`-d`オプションをつけて起動したらようやく原因がわかった。改行で`\r`が入力されているが、相手側は`\r\n`が必要な装置だった。解決方法が見当たらず困ったが、色々とガチャガチャやっていてわかったのは、`C-j`で`\n`が、`C-m`で`\r`が入力されるらしい。これでとりあえずは動いた。

GUIならば、`cutecom`というものを使えば、改行コードを選べる。GUIは面倒なのでできれば避けたいが、今のところ`cu`や`screen`のようなCUIでなんとかする方法がわからない。

##pySerialを使う
pythonでは`pySerial`を使うと比較的簡単にRS232c機器と通信できる。これで装置が動かせるようなGUIのプログラムを作るのはどうしたら良いか、実はかなり悩んだんだけど、結論としては`bottle.py`というのを使ってWebアプリにすることで、一応納得いくようなものができた。詳しくは、そのうち時間があれば書くつもり。
twitterシェア投稿button 設置


# やりたいこと

こんな感じでtwitterに投稿できるようにしたい

↓

<img width="1404" alt="スクリーンショット 2018-11-19 20.53.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/246662/25c18bd0-c8e5-95d8-d467-67c4d1307a53.png">


# 公式ページ
https://developer.twitter.com/en/docs/twitter-for-websites/tweet-button/overview


<img width="590" alt="スクリーンショット 2018-11-19 21.02.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/246662/ac932d12-918f-ec8d-b896-b506b0d25824.png">



# 実際に埋め込む

```html:コード
<a class="twitter-share-button"
  href="https://twitter.com/intent/tweet?text=Hello%20world">
Tweet</a>
```

↑
このコードを好きなところに埋め込む
例えば、、、


```ruby:app/views/posts/show.html.erb
<div class="row">
  <div class="col-md-12">
    <h1><%= @post.title %></h1>
    <p>カテゴリ: <%= @post.category %></p>
    <p>投稿日:<%= @post.created_at %></p>
    <hr>
    <%= simple_format(@post.body) %>
    <hr>
    <p></p>


<!-- 変更場所 --!>
    <a class="twitter-share-button" href="https://twitter.com/intent/tweet?text=[ブログタイトル]:<%= @post.title %>">
    Tweet
    </a>
<!-- ここまで --!>


    <p></p>
    <a href="https://twitter.com/intent/tweet?screen_name=KEIBADEIKKAKU&ref_src=twsrc%5Etfw" class="twitter-mention-button" data-show-count="false">Tweet to @KEIBADEIKKAKU</a><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
    <p></p>
    <a href="https://twitter.com/KEIBADEIKKAKU?ref_src=twsrc%5Etfw" class="twitter-follow-button" data-show-count="false">Follow @KEIBADEIKKAKU</a><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
    <p></p>
    <%= link_to "編集", edit_post_path(@post), class: "btn btn-secondary" %>
    <%= link_to "削除", post_path(@post), class: "btn btn-danger", method: :delete %>
  </div>
</div>
```


# デフォルトの文字変更

<img width="682" alt="スクリーンショット 2018-11-19 21.46.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/246662/77ef24ba-57be-509d-1249-70ef48b55987.png">

<img width="689" alt="スクリーンショット 2018-11-19 21.47.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/246662/3d141efb-ea59-ebc6-18e8-b0bf105c1267.png">


```html:コード
<a class="twitter-share-button"
  href="https://twitter.com/intent/tweet?text=[ブログタイトル]:<%= @post.title %>">
Tweet</a>
```


```html:コード
<a class="twitter-share-button"
  href="https://twitter.com/intent/tweet?text=ここのデフォルト文字を変更するよ">
Tweet</a>
```

~/tweet?text=**[ブログタイトル]:<%= @post.title %>**">
~/tweet?text=**ここのデフォルト文字を変更するよ**">
↑
大文字の部分を変更すれば、デフォルトで文字が入ります


# 結果

<img width="1236" alt="スクリーンショット 2018-11-19 21.14.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/246662/b26e0bc5-fd63-08f9-64d0-7adc12039325.png">

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">twitterに投稿 <a href="https://t.co/4BRQ9I5NW1">pic.twitter.com/4BRQ9I5NW1</a></p>&mdash; オストルぃ 🌔🌈 (@KEIBADEIKKAKU) <a href="https://twitter.com/KEIBADEIKKAKU/status/1064497406580903936?ref_src=twsrc%5Etfw">November 19, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# 参考
https://qiita.com/dora_____emon/items/4230d28086c5913622bd
matplotlibの日本語文字化けを解決する

# matplotlib の日本語の文字化け（豆腐）問題解決方法

matplotlib を使っていて日本語の文字化け（豆腐）の解決に苦労したので手順をメモ。

## 環境

Python 3.7.1
macOS Mojave 10.14.1

## 日本語の文字化け（豆腐）問題

下のグラフのX軸とグラフタイトルが文字化け（豆腐：◻︎◻︎◻︎◻︎）になっています。
この問題を解決したい。

<img width="469" alt="スクリーンショット 2018-11-19 22.24.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/317297/70a97cf7-c97d-8a68-e376-8c211b0073f4.png">

# matplotlibの設定ファイルの場所を探す

```
import matplotlib
matplotlib.matplotlib_fname()
```

僕の環境では以下っぽい。
******/lib/python3.7/site-packages/matplotlib/mpl-data/matplotlibrc


# 日本語フォントをダウンロード

[IPAexフォント](https://ipafont.ipa.go.jp/node26#jp)をダウンロード。

ダウンロードして解凍するとipaexg.ttfというファイルがあるはず。
それを、さっき調べたmatplotlibの設定ファイルが置いてあるフォルダ内のfonts/ttf/フォルダにコピーする。

# フォントキャッシュの削除

matplotlibはフォントキャッシュを持っていて、それを削除しないと設定が再読み込みされないらしい。

```
# フォントキャッシュの場所を探す
import matplotlib as mpl
mpl.get_configdir()
```

僕の環境では以下っぽい。
/Users/＜ユーザー名＞/.matplotlib

とりあえず存在しているファイルを削除してみる。

```
# ファイルとフォルダ
$ rm fontlist-v300.json
$ rm -r tex.cache
```

そしてpythonにてIPAPGothicを指定して再度グラフ表示。

```
# フォントを指定
from matplotlib import pyplot as plt
plt.rcParams['font.family'] = 'IPAPGothic'
```

# 結果


豆腐のまま。。。。

# 解決

いろいろ四苦八苦していたら、
fontlist-v300.json の中身を見ると以下の記述。

```
    {
      "fname": "fonts/ttf/ipaexg.ttf",
      "name": "IPAexGothic",  # ここ #
      "style": "normal",
      "variant": "normal",
      "weight": 400,
      "stretch": "normal",
      "size": "scalable",
      "__class__": "FontEntry"
    },
```

フォント名がIPAexGothicだと気がつく。
ネット情報に頼り意味もわからずコピペ（IPAPGothicを指定）していたことが原因。

```
# フォントを指定
from matplotlib import pyplot as plt
plt.rcParams['font.family'] = 'IPAexGothic'
```

やっと日本語が表示されるようになりました。

<img width="469" alt="スクリーンショット 2018-11-19 23.08.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/317297/2b005a10-a35f-79c4-4d3d-8921e5dfbc51.png">

おしまい
MySQLを起動しようとしたらエラーが出た

くだらない内容ですが、同じように引っかかってしまう人もいるかもしれないので書いておきます。

# 事象

MySQLを起動しようと思ったらこのようなエラーが出た。

```
$ mysql start
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
```

# 原因と解決法

原因は起動コマンドが間違えていたからでした。
正しくはこちら。

```
$ mysql.server start
Starting MySQL
 SUCCESS!
```

.serverをつけないといけなかったんですね。

# その他

もちろんこんなくだらないことが原因ではない人もいると思うので、そういった人たちは他の記事を参考にしてみてください。

参考
https://qiita.com/masa_stone22/items/38a286a89c309de7d44e
https://qiita.com/kanohisa/items/564035efd74d9c75bdcb
Firefox Quantum向けのWebExtensionsアドオンを作ってみる0

Firefox 57から古き良きアドオンたちが使えなくなったので、
とりあえず手始めにマウスジェスチャーを作りました。
このページではとりあえず基本的な準備まで。

# 0. はじめに
使用言語は生JavaScript。ライブラリは使ったら負け。
Firefox 57以降向けに書いていくので、ES6も7もasync/await含めごりごり使っていきます。

## そもそもWebExtensionsとは
https://developer.mozilla.org/ja/docs/Mozilla/Add-ons/WebExtensions

- 昔のアドオン (Legacy Add-on) に比べてセキュリティが強化された（らしい）
- W3Cで標準化されているらしく、ChromeやEdgeにもコードが使い回せる（らしい）

## 開発環境
- Windows 10 x64
- Visual Studio Code（使いやすい！）

## 基本的なファイル構造
- src/
    - manifest.json
        - アドオンの基本情報を書く。ファイル名もこの通りじゃないとダメ。
    - background.js
        - バックグラウンドで動くスクリプト。つまりブラウザを起動すると一緒に動き始める。
        - 全WebExtensions APIが使えるが、各ページにはアクセスできない。
    - content.js
        - それぞれのタブ（ページ）で動くスクリプト。コンテンツスクリプトを言うらしい。
        - WebExtensions APIのうち`runtime`, `i18n`, `storage`くらいしか使えない。

# 1. マニフェストを書く
https://developer.mozilla.org/ja/docs/Mozilla/Add-ons/WebExtensions/manifest.json
manifest.jsonにアドオンの基本情報を書きます。JSON形式だがコメントも書けるらしい。

```json-doc:manifest.json
{
	"manifest_version": 2, // 必ず2
	"name": "アドオンの名前",
	"version": "バージョン",
	"description": "簡単な説明",
	"developer": {
		"name": "開発者の名前",
		"url": "開発者のページとか"
	},
	"permissions": ["*://*/", "notifications", "sessions", "storage"], // 必要なパーミッション
	"icons": { // アイコンは48×48pxと96×96pxのものを準備する（とりあえずなくてもOK）。SVGなら同じでいい。
		"48": "icon.svg",
		"96": "icon.svg"
	},
	"background": {
		"scripts": ["background.js"]
	},
	"content_scripts": [
		{
			"all_frames": true, // trueだとフレームごとにスクリプトが動く。falseだとwindow.topだけ（デフォルト）。
			"js": ["content.js"],
			"match_about_blank": true, // about:blankで動かすか
			"matches": ["<all_urls>"], // どのURLの場合に動かすか
			"run_at": "document_start" // どのタイミングで動かすか
		}
	],
	"content_security_policy": "default-src 'self'", // なくてもよし
	"options_ui": {
		"page": "options.html", // 設定ページ
		"open_in_tab": true // タブで開く(true) かアドオンマネージャーに組み込む (false) か
	}
}
```
必要なパーミッションについては https://developer.mozilla.org/ja/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions

スクリプト書いている内に必要なパーミッションがわかってくるので、とりあえず形だけ作っておきましょう。
アイコン、設定ページは必要な場合のみ。不必要ならごっそり削除。

`content_scripts`の`run_at`は次の3通り。

- `"document_start"` - ページを読み込み始めてすぐ。
- `"document_end"` - DOMを読み込み終わったら。いわゆる`DOMContentLoaded`。
- `"document_idle"` - ページを読み込み終わってから（画像含め）。`window.onload`と同じ。デフォルトはコレなので要注意。

# 2. スクリプトを書く
WebExtensions APIはグローバル変数`browser`に入っています。ちなみにChromeの場合は`chrome`に入っているようです。Firefoxでは両方使えます。
癖で即時関数を使ってしまいました。

```javascript:background.js
(function () {
    console.log('Hello, background script!');
    console.log(browser);
})();
```

```javascript:content.js
(function () {
    console.log('Hello, content script!');
    console.log(browser);
})();
```

# 3. デバッグしてみる
- **about:debugging**にアクセス
- [ ] **アドオンのデバッグを有効化** にチェック
- **[一時的なアドオンを読み込む]** からmanifest.jsonを選択
- 読み込まれたアドオンの[デバッグ]をクリック
- “リモートデバッグ接続要求”なるものを許可（わかりにくい）

これでアドオン (background.js) のコンソールが表示されます。
また各ページのコンソールには `Hello, content script!` などとふざけた文字列が表示されるはずです。
`browser`の中身は先述の通り、利用できるAPIの数が違うのでbackground.jsとcontent.jsで大きく異なります。パーミッションによっても変わります。

ちなみにmanifest.jsonに誤りがあるとそもそもアドオンを読み込めません。

---
とりあえずここまで。
Swift：配列のmax(by:),min(by:)の使い方

カスタムクラスや構造体，タプルなどの配列の最大値，最小値を取得する時に使える`max(by:)`と`min(by:)`
使い方に注意点があったので備忘録

```swift:
var items: [(name: String, number: Int)] = [("banana", 234), ("apple", 423), ("grape", 142)]
    
let max = items.max(by: { (a, b) -> Bool in
    return a.number < b.number //ここの不等号の向き要注意！
})
    
let min = items.min(by: { (a, b) -> Bool in
    return a.number < b.number
})
    
Swift.print("\(max), \(min)")

// -> ("apple", 423), ("grape", 142)
```

※maxの時の不等号の向きに要注意です！