OmniAICreator/Qiita-1.07M huggingface dataset:
rbenvを使用したRubyのバージョン管理

この記事は、rbenvがインストールされている事を前提に書いてあります。
インストールに関しては他記事をご参照してください。

# 目的
Rubyのバージョンを変えずに作業していると、簡単なrbenvのバージョン管理方法を忘れてしまいがちなので、すぐに思い出せるように簡潔にまとめました。


### Rubyのインストール
今回はバーション2.5.7のインストールします。
他のバーションをインストールするときは「2.5.7」の部分を書き換えてください。

```ruby:ターミナル

# インストールできるRubyのバージョンを一覧表示
$ rbenv install -l

# Ruby 2.5.7をインストール
$ rbenv install 2.5.7

# インストールしたRubyのコマンドを使えるようにする
$ rbenv rehash

# 既にインストールされているバージョンの確認
$ rbenv versions
```

### バージョンの変更
**PCの全体で使うバージョンの設定**

```terminal:ターミナル
$ rbenv global 2.5.7
```
**カレントディレクトリだけのバーションの設定**

```terminal:ターミナル
$ rbenv local 2.5.7
```

### 不要になったバージョンの削除

```terminal:ターミナル
$ rbenv uninstall 2.5.7
```

## Ruby インストール後にrailsコマンドが使えないとき
Rubyのインストール後に、Railsを使おうとすると「rails: command not found」と表示されると思います。
なので、変更したバージョンにRailsをインストールしましょう。

```ruby:ターミナル
# gem のupdate
$ gem update --system
# bundler のinstall
$ gem install bundler
# rails のinstall
$ gem install rails
```
Railsインストール部分は[こちらの記事](https://qiita.com/kamillle/items/5a7befd0ebad47378832)を引用させていただきました。こちらの方が詳しく書いてあるのでおすすめです。
Slackチャットボット作成 Python

# Slackチャットボット作成
※こちらは自分が忘れないようにするメモ書きです。

①以下のURLにアクセスする。
※「XXX」はSlackのワークスペースのアドレス

https://XXX.slack.com/apps/A0F7YS25R-bots?next_id=0

②以下画面の「Slackに追加」ボタンを押下する。
<img width="996" alt="スクリーンショット 2020-04-21 1.55.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172696/f6267dab-364d-4a5d-e985-f7331fe4e7ce.png">

③チャットボット用のユーザ名を入力し、「ボットインテグレーションを追加する」を押下する。
<img width="960" alt="スクリーンショット 2020-04-21 1.56.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172696/bd41795a-f5f9-bd48-a222-8b53bd15fa8c.png">

④以下のURLをコピーする。
<img width="921" alt="スクリーンショット 2020-04-21 2.21.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172696/b3a66d41-f287-bb6f-5f13-12d8648affd0.png">

⑤画面一番下の「インテグレーションの保存」を押下する。
<img width="953" alt="スクリーンショット 2020-04-21 1.57.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172696/b9f7cae2-3860-171f-ed07-4c47de6478a5.png">

⑥SlackのApp欄に③で作成したチャットボット用ユーザを追加する
※追加しなくてもできるが、追加することでダイレクトメッセージが送れる
※この時点では非活性になっている。
<img width="205" alt="スクリーンショット 2020-04-21 2.23.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172696/4f11b110-34b7-94c5-eaaf-a2bf49f373d7.png">

⑦Slackでチャネルを作成し、「アプリを追加する」をクリックする。
<img width="424" alt="スクリーンショット 2020-04-21 2.27.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172696/dca3633b-1054-d42d-b3a6-3f4c012e4036.png">

⑧③で作成したチャットボット用ユーザの「追加」を押下する。
<img width="629" alt="スクリーンショット 2020-04-21 2.40.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172696/cb207717-3a61-9840-ab1a-50895690d7ae.png">


⑨④でコピーしたURLを使用し、以下URLの手順で実行する
参考：https://qiita.com/sukesuke/items/1ac92251def87357fdf6
【秒】vim操作時の'readonly' オプションが設定されています (! を追加で上書き、と言われた状態で保存してvimから抜け出す方法

自分用に残します。

参考記事
https://qiita.com/shuthimaru/items/2334f63845d8b0d85bdd

・編集が終わったらescキーをクリック。

下記を入力。空白も関係してきます。

```
:w !sudo tee %
```


なんか言われても気にせずにすぐさま下記を入力。

```
:q!
```


終わりです。
vscodeのsassCompilerで生成されるmapがずれるのでgulpに移動した話（話はない！）

# cssをどうしても１つにしてくれと言われた

複数人でガシガシ書いているところに放り込まれ
ルールもなく
設計書もない
ゲラ見てそれを各自がおこしていくそんな現場。。。こわい。。。

mixinでメディアクエリ沢山あるなぁ。。がんがる
とりあえずマップ観てみ。。。ずれてる。
理解できなかったので
コンパイラ変更の儀　発動

## npm コマンド
```
npm i -D gulp gulp-sass gulp-progeny gulp-postcss css-mqpacker gulp-sourcemaps
```
- gulp
- gulp-sass
- gulp-progeny
- gulp-postcss
- css-mqpacker
- gulp-sourcemaps

### gulpfile.js

```gulpfile.js
// gulpプラグインの読み込み
const gulp = require("gulp");
// Sassをコンパイルするプラグインの読み込み
const sass = require("gulp-sass");

// パーシャル更新時にコンパイルするよう
const progeny = require('gulp-progeny');
// mqpackerを入れるためにpostcss
const postcss = require('gulp-postcss');
// あっとメディアまとめるプラグイン
const mqpacker = require("css-mqpacker");
// コンパイル後のsaucemapsブラウザで確認用
const sourcemaps = require('gulp-sourcemaps');
// style.scssをタスクを作成する
gulp.task("default", function () {

  // scssファイルを監視
  return gulp.watch("scss/*.scss", function () {
    // sscssの更新があった場合の処理
    // scssファイルを取得
    return (
      gulp
        // 読み込み先指定
        .src("scss/*.scss")

        // パーシャル更新時もコンパイル
        .pipe(progeny())

        // mapはsassの前に
        .pipe(sourcemaps.init())

        // Sassのコンパイルを実行
        .pipe
        (sass({
          outputStyle: "expanded"
        })

          // scssのコンパイルエラーを表示
          .on("error", sass.logError)
        )
        // @mediaをまとめる
        .pipe(postcss([mqpacker()]))

        // mapのセットの〆の方
        .pipe(sourcemaps.write("./"))

        // scssフォルダー以下に保存
        .pipe(gulp.dest("./"))
    );
  });
});
```
Tera TermでVMwareのゲストOSへSSH接続する

# 動機
dockerが注目されている昨今、VMを利用するメリットは薄いかもしれませんが、
仮想マシンとLinux周りの勉強を兼ねてVMを利用しました。

・・・いざVMwareを触り始めたところ、コンソールが見にくい！！！
もっと効率よく操作できる方法はないのか？と探したところ普通にTera Termで接続すればいいことを発見しました。

今回はその方法を備忘録として記録します。


# 手順
### ①VM起動
ゲストOSを適当にダウンロードして、起動します。
私は無難にCentOS x64にしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410918/68e640c9-ec79-f320-657e-a5926e0daa2e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410918/8d11b0f3-545b-ec31-7242-b0267b2755c1.png)


### ②IP確認
ゲストOSのIPを```ifconfig```で確認します。
※ここで調べたIPがTera Termのホスト名になります。
※OS側でIPを固定にする設定をしとかないと起動する度に変わってしまう、と記憶しています。
　今は特段設定していませんが、時間があれば固定にするかも？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410918/eea14d74-bbef-d506-de40-70b53b393e86.png)


### ③Tera Termから接続
あとは調べたIPをホスト名に設定し、ログイン情報を入力すればゲストOSへ入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410918/53d17b2b-6da1-5e4d-f93f-0cf68f252acb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410918/8a6868e2-547a-aca3-2997-75243a89b841.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410918/c2706fa6-898e-2551-f29a-970eee8a48b9.png)


# おわり
以上、お付き合いいただきありがとうございました。
SlackApp 外部からチャネルに投稿する方法

# SlackApp 外部からチャネルに投稿する方法
※こちらは自分が忘れないようにするメモ書きです。

①以下のURLにアクセスする。
※「XXX」はSlackのワークスペースのアドレス
```
https://XXX.slack.com/apps/A0F7XDUAZ--incoming-webhook-?next_id=0
```

②以下画面の「Slackに追加」ボタンを押下する。
<img width="976" alt="スクリーンショット 2020-04-21 0.36.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172696/c60c8a06-416e-e6b9-96a1-37ca3334ffdc.png">


③投稿したいチャンネルを選択し、「Incoming Webhook インテグレーションの追加」を押下する。
<img width="963" alt="スクリーンショット 2020-04-21 0.37.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172696/792bdfa0-08d7-3f46-d81f-9c9ffe5d83b5.png">

④以下のURLをコピーする。
<img width="972" alt="スクリーンショット 2020-04-21 0.55.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172696/a4493499-b20b-9fc0-2e73-67467a3fe94f.png">

⑤画面一番下の「設定を保存する」を押下する。
<img width="959" alt="スクリーンショット 2020-04-21 1.01.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172696/1b9cb856-6bd4-f0a2-a531-cd93be6edfb7.png">

⑥以下のコマンドを実行する。

```
curl -X POST --data-urlencode "payload={ \"text\": \"これは webhookbot という名のボットから #api に投稿されています。\"}" "④でコピーしたURL"
```

⑦Slackの指定したチャネルにメッセージが投稿される。
<img width="446" alt="スクリーンショット 2020-04-21 1.44.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172696/333eefd0-b8d3-4c18-bd9c-9d5ec5354b3c.png">

▪️参考
https://qiita.com/namutaka/items/233a83100c94af033575
https://qiita.com/ik-fib/items/b4a502d173a22b3947a0
利用頻度の高い開発ツールについてTips

開発するときに必ず導入するツールについて、開発端末が変わってもすぐ使えるように注意点などを含め記事にします。

##[Tera Term　（Ver4.105 /2020.4時点) ](https://ja.osdn.net/projects/ttssh2/releases/)
　自端末(windows)からサーバ(RHEL等)に接続して、操作する場合に使います。リンク先からダウンロード。日本語を選択して、あとはデフォルトで入れてしまえばいいと思います。

- ***Tips***

    - 起動したら、ホストに接続情報(IPアドレスだったりDNSに登録されたサーバ名だったり)を入力し、OKを押下。SSHの場合、次のダイアログで秘密鍵(PPK)を選択したり、コマンドラインでID/PWを入力して接続する場合が多いかなと思います。ttlファイルを作成して自動ログインも良く使います。

    - ログの取得について、ファイル→ログを選択すると、logファイルを作ってくれます。自分の操作を情報展開する場合によく使うと思います。

    - **ショートカット（Alt + D）でセッションを複製し、窓を増やすことができます（便利）。**

　　<img width="245" alt="Teraterm.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/70c3f5a0-9921-fb13-c91f-c3fb7c6340fd.png">

##[WinSCP （Ver5.17　 /2020.4時点) ](https://winscp.net/eng/download.php)
　自端末(windows)からサーバ(RHEL等)に接続して、ファイルの授受をする場合に使います。
　リンク先からダウンロード。デフォルトで入れてしまえばいいと思います。

- ***Tips***

    - 起動したら、新しいセッションを選択して、接続情報（プロトコル、ホスト名、ポート、ユーザ名、など）を入力します。秘密鍵(PPK)を利用する場合は、設定→SSH→認証→秘密鍵で選択すればOK。
    - 前までFFFTPを使っていたのですが、WinSCP は接続先をタブで切替できスッキリするので使うようになりました。
    - 時間がたつと勝手に切れるのはFFFTPと変わりません。なんかおかしいと思ったら更新。

　　<img width="388" alt="winSCP.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/651ebbc6-b82c-e5de-08a7-c863de9ce40c.png">

##[CarotDAV （Ver1.15.8　 /2020.4時点) ](https://winscp.net/eng/download.php)
　WebDAVクライアントです。WebDAVサーバとのファイル授受に使います。WinSCPでもwevdavに接続できますが、日本語ファイルの連携が良くないので、CarotDAVが良く使われるようです。

- ***Tips***

    - 起動したら、File→Newconnection→WebDAVを選択、接続画面が開くので接続情報を入力します。
　　
    - proxyがある場合はproxyタブを開いて、Specify Proxyをチェックして、入力します。

    - 大した話ではありませんがWinSCPとの操作の違いについて、WinSCPだと画面上、(左)ローカル：(右)サーバのようなレイアウトですが、CarotDAV の場合レイアウトにサーバしかないので、ローカルはエクスプローラーでフォルダを表示させて、ドラッグアンドドロップで操作しています。

　　<img width="271" alt="carotdav.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/a921e0c1-ef8c-9276-572a-5670d4e00bdb.png">


##[VisualStudioCode  （Ver1.44　 /2020.5時点) ](https://code.visualstudio.com/download)
　テキストエディタといえば、サクラディタを利用してきたのですが、勧められてVisualStudioCodeを導入しました。コードの自動補完機能が強力です。

- ***Tips***

    - 日本語化
    起動したら拡張機能をクリックし、japanese languageを選択して追加
    ![vscode1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/60e0f5c4-d9a3-e977-086d-eeb39cf28530.png)

    - 右クリックメニューに追加(インストール時に☑でも可能です) 。regedit→該当の位置まで右クリック→新規→キーでフォルダを作成しcommandまで来たら値に”VisualStudioCode のexeのパス”と引数"%1"を設定します。
　
　　![vscode2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/7a14ebd3-8683-816b-3c86-dd174c2d70cb.png)
ポータルサイト創作記：６日目

昨日は、以下のコマンドを使って、ファイルが追加されるまでを行った。
`$  bundle exec rails g controller homes index`
↓実行すると
・app/controllersフォルダ（ディレクトリ）の中にhomes_controller.rbファイルが作成された。
・app/viewsフォルダ（ディレクトリ）の中にhomesフォルダ（ディレクトリ）が作成され、index.html.erbファイルが作成された。
・routes.rbに`get homes/index`というコードが追加された。
<img width="252" alt="スクリーンショット 2020-04-20 0.14.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576912/84b02fc6-8f68-75ff-6bca-5394d1d3e912.png">

今日は、昨日つくられたファイルがなんなんだ？ということに触れる。

覚えておかなければいけないことは、次の３つ。
・app/controllers/homes_controller.rb
　→このファイルを*「コントローラー」*と呼ぶ
・app/views/homes/index.html.erb
　→このファイルを*「ビュー」*と呼ぶ。
・routes.rb
　→このファイルを*「ルーティング」*と呼ぶ。

今日は、それぞれの役割を見ていく。
<img width="637" alt="スクリーンショット 2020-04-21 0.13.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576912/02c747a1-0b4e-3339-9dd6-9da36351aa29.png">
Webサービスはリクエストとレスポンスのやりとりで成立している。
ユーザーは端末から見たいページなどをリクエストし、サービス側はサーバーでレスポンスを返す。

先ほどの*ルーティング*、*コントローラー*、*ビュー*はサーバーの中にある。
<img width="646" alt="スクリーンショット 2020-04-21 0.53.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576912/794be453-e7da-c500-8bf5-8f56cd7593f5.png">
①スマホからレスポンスが送られた。このレスポンスはURLで送られている。

②URLはサーバーに届くと、ルーティングで読み込まれる。
<img width="325" alt="スクリーンショット 2020-04-21 0.22.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576912/8d8202d5-38a5-947c-3a59-476079e22737.png">
`homes/index`ということで、homes_controllersのindexアクションの呼び出しを実行する。

③ルーティングで呼び出されたcontorollerのアクションに従って、viewファイルを呼び出す。
<img width="421" alt="スクリーンショット 2020-04-21 0.24.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576912/697bb740-9ab3-cf19-c8e2-3c4fbaf725f1.png">
app/controllers/homes_controller.rbのファイルの画像。
`def index`と、indexアクションが定義され、viewファイルを呼び出している。
呼び出されたのは、app/views/homes/index.html.erbファイル。

④呼び出されたviewファイルのコードをレスポンスとして返す。
<img width="441" alt="スクリーンショット 2020-04-21 0.25.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576912/244cdad3-87fc-977c-29fc-2f271f691163.png">
viewファイルの画像。
Homes#indexという文がh1などで囲まれているが、これは「タグ」と呼ばれる装飾。h1で挟むことで見出しになる。
ちなみにFind me in app/views/homes/index.html.erbをはさんでいるpは段落をつくるタグ。

⑤viewの内容のレスポンスを受けとったブラウザが、情報を表示する。
<img width="713" alt="スクリーンショット 2020-04-21 0.40.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576912/6e68d78a-c538-6cb2-f7d5-92c020a56bee.png">
こうして、情報が手元に届く。

このようにして、ルーティング−アクション−ビューが連携して、リクエストを受け取り、レスポンスを返すことでWebサービスが成立している。

今日はここまで！
Ubuntu(18.04.3) MySQLをインストール

<h1>1.MySQLインストール</h1>
下記のコマンドでMySQLとクライアントツールがインストールできます。

```
$ sudo apt install mysql-server mysql-client
```

え、クライアントツールって何？？？？？？
『mysql クライアントツール』でググっても出てこない。
何のクライアントツール!?!?!?!?!?!?!?!???????

そんなことを考えてたらインストールが終わります。
確認。

```
$ mysql --version
mysql  Ver 14.14 Distrib 5.7.29, for Linux (i686) using  EditLine wrapper
```

<h1>2.Rootのパスワード変更</h1>

```
$ sudo mysql_secure_installation
```

パスワードの強度をチェックするプラグインのセットアップをするかどうからしいです。
あると良さげなのでYES

```
Press y|Y for Yes, any other key for No:
```

ここは新しいパスワード・確認

```
New password:
Re-enter new password:
```

匿名のユーザーを削除するか聞かれます。
YES。

```
Remove anonymous users? (Press y|Y for Yes, any other key for No)
```

リモートからrootにログインできないようにするか聞かれてます。
YES。

```
Disallow root login remotely? (Press y|Y for Yes, any other key for No) :
```

<h1>3.文字コードをUTF-8で統一</h1>
この状態だと、サーバーサイドアプリから日本語を含んだデータを投入すると文字化けするみたいです。

Rootにログイン

```
sudo mysql -u root
```

※もし『mysql>』から抜けられなくなったら『\q
』で抜けられます(ひっそり)

以下を編集
/etc/mysql/my.cnf

```
[mysqld]
character-set-server=utf8
skip-character-set-client-handshake
default-storage-engine=INNODB

[mysqldump]
default-character-set=utf8

[mysql]
default-character-set=utf8
```

MySQL再起動

```
$ sudo /etc/init.d/mysql restart
```

以下でステータス確認

```
mysql> status;
```

下記がutf8になっていることを確認。

```
Server characterset:	utf8
```

<h1>4.ユーザー作成</h1>
Rootのみでしかログインできないとセキュリティ上あまり良くないみたいです。
ユーザーを作成します。

```
CREATE USER ユーザー名@localhost IDENTIFIED BY ‘パスワード’;
```

※この時の注意
ユーザー名をoh!nobitasan!にしたらエラーが出ました。
!は登録できません。

では、ログイン。

```
$ sudo mysql -u oh_nobitasan -p
```

これでパスワードを入力すれば入れるはずです。

<h1>最後に</h1>
下記を参考にさせて頂きました。
ありがとうございました。
https://qiita.com/kojionilk/items/bdace886c3664d75c5f7
https://qiita.com/yokomichi_ask/items/7ff2bff2e57ca9e7450a
https://utano.jp/entry/2017/10/mysql57-mysql-secure-installation/
LaravelでFatal error: require(): Failed opening required '/〇〇/public/../vendor/autoload.php' (include_path='.:') in 〇〇/public/index.php on line 24というエラー

# 問題
laravelプロジェクトで

```
php artisan serve
```
をしてブラウザをアクセスすると

```
Warning: require(/〇〇/public/../vendor/autoload.php): failed to open stream: No such file or directory in /〇〇/public/index.php on line 24

Fatal error: require(): Failed opening required '/〇〇/public/../vendor/autoload.php' (include_path='.:') in 〇〇/public/index.php on line 24
```

と出てきた。

## 解決法
プロジェクト直下で

```
composer install
```

をする！
Python #型の同一性をチェック

## `type()`メソッドを用いる
`type()`メソッドは引数に指定した_値_または_変数_の型を引数として返す。このメソッドを用いて型の
同一性をチェックするには`is`を用いて以下のように行う。

~~~python
a = type('Hello, World') is str
b = type('Hello, World') is int
c = type('Hello, World') is not str
~~~
実行結果
>True
>False
>False
【Rails】I18n::InvalidLocaleDataになったときの初歩的な振り返り

#エラー内容
[Ruby on Rails5 速習実践ガイド](https://www.amazon.co.jp/現場で使える-Ruby-Rails-5速習実践ガイド-大場寧子/dp/4839962227/ref=sr_1_1?__mk_ja_JP=カタカナ&dchild=1&keywords=速習実践&qid=1587393574&sr=8-1)を使って進めてみると、思わぬエラーに嵌ったので、自分用のメモのために残します。

`can not load translations from /Users/sampleApp/config/locales/ja.yml:`

上記のエラーは**ja.yml**ファイルが読み込めてませんという内容です。

#原因

私が上記のエラーを出してしまったコードをピックアップします。

```ruby:ja.yml
    models:
      task: 仕事
    attributes:
      task:
      id: ID
      name: 名前
      description: 説明
      created_at: 登録日
      updated_at: 更新日
```
taskから下の項目のインデントが同じになっていたので、taskに対してのものなのか判別できず、上記のエラーが出てしまいました。

#解決方法

```ruby:ja.yml
    models:
      task: 仕事
    attributes:
      task:
        id: ID
        name: 名前
        description: 説明
        created_at: 登録日
        updated_at: 更新日
```
微妙な違いですが、インデントの位置を正しくすることで読み込むことができるようになりました！

#終わりに

まだまだですが、インデントはどの言語に対しても気をつけないといけないですね。。。
改めて勉強不足なのを思い知りました。
エラーで躓いてしまう人はインデントの位置の確認や、スペルなどが間違っていないかという初歩的なところを振り返るとあっさり解決できたりします！

以上、ありがとうございました。
書画カメラで黒板講義


オンライン講義の「板書」に書画カメラを利用する，というお話です．

オンライン講義で厄介なのは**「板書をどうやって学生に見せるのか？」**ですね．

ごく普通の講義風景をカメラで録画するのは，実は結構準備・テクニック・装置・人的資源が必要です．

「講義している講師を撮さなくてはならない」と考えてしまうと，特に準備・環境が整っていない場合は，かなりのテマヒマカネがかかると考えていいでしょう．

どうやってそれを簡便に済ませるのか．その方法の一つとして，「書画カメラ」を使うことを提案します．

##書画カメラはOHC：下向きカメラ

書画カメラはこんなやつです．↓(EPSON ELPDC21)

![EPSON ELPDC21](https://www.epson.jp/products/bizprojector/ohc/elpdc21/images/index/ph_visual.jpg)

**「パソコンに接続できるOHC」**と考えて差し支えないでしょう．

これをパソコンにつなげると，「外部カメラ」として認識します．Window10では「カメラ」アプリが標準でありますから，それを使えば，PCの画面に書画カメラが捉えた，机上のもの(書類やメモや，特に実物)を映すことができます．

これを利用します．

要するに「書画カメラをPCつないでカメラアプリで提示したのを共有配信」です．
 
##やり方は簡単です

書画カメラをPCに接続して，PCがカメラとして認識することを確認します．これができなければ始まりません．

Window XPなど古いOSだと，それ用のデバイスドライバが必要かもしれません．ちゃんとしたメーカーだと古いOS向けのドライバを配布していることが多いので確認しましょう．

Window10はたいてい，USB接続すればデバイスを用意してくれるので，大丈夫だと思います．

PCとの接続構成図はこんな感じ．↓

![書画カメラ配信.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441159/121d7293-5808-3640-ff3d-f0ec0c9006bf.png)

以下，手順です．
	
1. 書画カメラとPCを接続 → PCは外部カメラとして認識させる
2. カメラアプリを起動，書画カメラを提示(内蔵カメラがあると切替必要かも)
3. Google MeetなりTeams会議なりZoomに接続し，会議を始める
4. **☆ポイント☆**会議用のカメラは大抵はインカメラだが，書画カメラを接続したことで切り替わっているかもしれない．**会議カメラはインカメラに**する．書画カメラのほかになければOFFにしておく．
5. 会議画面で**画面共有**→**ウィンドウ共有**でカメラアプリのウインドウを選ぶ
6.  → これで書画カメラの映像が全員に配信される
7.  あとは講義をしながら書画カメラに写った紙資料を提示したり，白紙に板書したり，説明のためになにか(例えば回路)の実物を見せたり．

これなら，板書代わりに白紙に手書きしながら講義ができます．
 
簡易スタジオを用意する際にも，一つあれば結構役に立つシロモノです．ぜひ導入ご検討を．すでにお待ちの職場では活用をご検討ください．
 
### ※注意事項があるとすれば……	
* 書画カメラはUSBでPCに接続できるタイプでないとダメ
* 紙と書画カメラの関係は配信前に調整しておく．
* 紙の文字が小さすぎると解像度の関係でぼやけて見えなくなります．
  - カメラにはたいていズーム機能がついていますが，
  - ズームIn/Outをやりすぎると，見ている人の気分が悪くなりますのでご注意．
* 書画カメラは静止画向け設計でシャッタースピードが遅い．なので，カメラに映っているものを動かすときはゆっくり．
 
## おまけ：

書いていて，思いつきました．
 
###教室備え付けの書画カメラ+ PCで授業配信できないかしら．
 
なんらかの改良は必要かも知れませんが……
Googleフォームの記述式テキスト欄をGASから数値のみ入力に指定する

#はじめに
　ご存知の方も多いとは思いますが、Googleフォームとは無料でアンケートの作成や集計ができるサービスです。
　
　フォームの編集画面から大抵の事はできますが、Google スプレッドシートと連携させたいときはGoogle Apps Script(GAS)を使うことが出来ます。

　今回は、GASから記述式テキスト欄への入力を数値のみに制限する方法について記事にします。

#方法

```
function createTextbox(){
  //フォームの作成
  const form = FormApp.create("フォーム");
  
  //入力規則を作成
  var textValidation = FormApp.createTextValidation()
  .requireNumber()
  .build();
  
  //テキスト入力フォームの作成
  form.addTextItem().setTitle('テキスト').setValidation(textValidation); 
}
```

#作成されたフォーム
![フォーム.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537831/714d5946-69ef-ab1b-9213-c33cc373b99e.png)

　無事に数値以外の入力が弾かれています。

#おわりに
　フォームの編集画面からでも設定できるので、この記事に需要はあるのか...

　ご覧いただきありがとうございました。質問・ご指摘等ありましたらよろしくお願いします。
gitにてローカルで修正を加えたファイルを元通りにする方法

# 変更前の状態を確認したいが、加えた修正は消したくない場合
stashコマンドで修正箇所の一時避難ができます。
ローカルのワーキングディレクトリの変更が一時避難されます。

```
# 変更を一時避難させておくコマンド
$ git stash
もしくは下記のコマンド。動作は同じです。
$ git stash save
```
またわかりやすく名前を付けておきたい場合は以下のように名前を指定しておくと確認の手間が省けるから楽になります。特に名前の指定をしない場合は直前のコミットメッセージが名前として入るようです。

```
$ git stash save ○○の修正分
```

一度避難させた修正分を戻す時は以下のコマンドを使います。

```
# まず戻したい変更ファイルを確認
$ git stash list
# 戻したい修正分を指定して適用する
$ git stash apply stash@{0}
```
必要なくなったファイルは消しておきましょう。

```
$ git stash drop stash@{0}
```

# 変更前の状態に戻したい場合

### 各ファイルごとに戻したい時

```
$ git checkout <filename>
```

## 変更を加えた全てのファイルを戻したい時

```
$ git checkout .
```

# 参考
完全上位互換の記事はこちらからどうぞ
[色々な git stash](https://qiita.com/akasakas/items/768c0b563b96f8a9be9d)
S3のバケットをcloudflare経由で独自サブドメインで運用する

# 概要
AWSとcloudflareを連携させてS3のバケットを独自運用しようという話です。
色々調べてできたのですが、その後わざわざAWSのS3使うメリットも薄れてきたので、
サーバー直置きにする関係でこれを個人的に記録しようというのがきっかけです。
Route53でもできる話なのですが、サーバーがAWSでない時に画像置き場としてS3を使いたい時など有用だと思います。
（具体的にはHrokuとAWSを使ってwordpressで自分のサイトを運営してたのですが、そもそもwordpressくらいなら月に300円程度でそこそこのレンタルサーバーを借りた方がいいなと思いレンタルサーバーに引っ越すついでにこれを行うという私的事情です。）

# AWSのS3側の設定

<img width="1196" alt="スクリーンショット 2020-04-20 23.29.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145608/90b075e7-022b-2360-2a34-5fa9efe055d5.png">

まずはバケットを作成します。バケット名は使用するサブドメイン名と同一にします。
ちなみにバケットは一意な値なので先に取られていたら作成することができません。
今回はサンプルで自分のドメインの nkmt.info に対してサブドメインimage.nkmt.infoを使うという意味でS3のバケットを作っています。

## バケットにパーミッションを設定

<img width="1095" alt="スクリーンショット 2020-04-20 23.38.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145608/b33f45dd-8fe7-2095-cbda-c5debc66a8fa.png">


つくったばかりのバケットには外部からデフォルトでアクセスが禁止されてしまっているので、バケットポリシーを追加し許可をします。

```
{
    "Version": "2020-02-29",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::image.nkmt.info/*"
        }
    ]
}
```
ちなみに上記の設定はむかしネットで探してきたのですが、参照元を忘れてしまいました。確か公式にも似たようなことが書かれていたと記憶。

## アクセスしてみる
適当なファイルをS3にあげてみてアクセスしてみましょう。
例えば下記のURLの場合は、S3のバケット名とその後にフォルダパスとなっています。

https://s3.ap-northeast-1.amazonaws.com/image.nkmt.info/wp-content/uploads/2016/12/server.jpg
※ サーバー引っ越すので上記は見れなくなってます。

ttps://s3.ap-northeast-1.amazonaws.com + バケット名 + ファイルパス

このバケットへのアクセスのURLは別のURLからもアクセス可能です。

http://image.nkmt.info.s3.amazonaws.com/wp-content/uploads/2016/12/server.jpg

ttp:// + バケット名 + .s3.amazonaws.com/ + ファイルパス

これをcloudflareにエイリアスとしてcnameに設定するということです。

# cloudflareの設定

<img width="1027" alt="スクリーンショット 2020-04-20 23.51.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145608/717957fd-a6a5-9a37-778a-7bb4e43f800d.png">

cloudflareをDNSとして利用している前提ですので上記のようにすればcnameに設定すればできます。
cnameに入れるのは下記のアドレスです。
ttp:// + バケット名 + .s3.amazonaws.com/ + ファイルパス
RedisのReplicationをEC2で構築する

# ■概要
AWS使えるけどElastiCache使えない残念なお仕事です。ならばEC2に自力でRedisを構築するしかないわけですが、Replicationを構築する際にちょっとハマったので手順を残しておきます。

# ■構築
## 1. EC2インスタンス起動
今回はAmazon Linux 2のAMIを利用します。
インスタンスタイプはt3.smallを2台、セキュリティグループはtcp/6379を開けます。
## 2. Redisインストール
master/slave両方
`sudo amazon-linux-extras install redis4.0`

下記の記事を参考にしました。
AWS EC2にredisをインストールする
https://qiita.com/stoshiya/items/b8c1d2eb41770f92ffcf
## 3. redis.conf修正
master/slave両方
`sudo vi /etc/redis.conf`
### 3.1. bindの設定
（修正前）
bind 127.0.0.1
（修正後）
 #bind 127.0.0.1
コメントアウトする
### 3.2. protected-modeの設定
（修正前）
protected-mode yes
（修正後）
protected-mode no
### 3.3. slaveの設定 ※slaveのみ※
（修正前）
 # slaveof <masterip> <masterport>
（修正後）
 # slaveof <masterip> <masterport>
slaveof aa.bb.cc.dd 6379
※aa.bb.cc.ddにはmasterのプライベートIPを指定する
## 4. Redis起動
master/slave両方
`sudo redis-server /etc/redis.conf &`
# ■動作確認
## 5. Replicationが設定されていることを確認
### 5.1. それぞれのサーバでredis-cli起動
master/slave両方
`redis-cli`
### 5.2. それぞれのサーバでinfo表示
master/slave両方
`127.0.0.1:6379> info`
（master側）
 # Replication
role:master
（slave側）
 # Replication
role:slave
※slave側でrole:masterと表示される場合は、正しくReplication設定できていないので、構築手順を見直す。
## 6. masterを更新してslaveに反映されることを確認
### 6.1. masterで値セット
master側
`127.0.0.1:6379> set key1 value1`
=> OK
### 6.2. slaveで値を確認
slave側
`127.0.0.1:6379> get key1`
=> "value1"
ちゃんとmaster=>slave間でレプリケーションされていることが確認できましたね。
## 7. slaveは更新できないことを確認
slave側
`127.0.0.1:6379> set key2 value2`
=> (error) READONLY You can't write against a read only slave.
## 8. slaveがmasterに昇格できることを確認
### 8.1. slaveをmasterに昇格
slave側
`127.0.0.1:6379> SLAVEOF NO ONE`
=> OK
### 8.2. 確認
slave側
`127.0.0.1:6379> info`
 # Replication
role:master
### 8.3. 値が設定できる
slave側
`127.0.0.1:6379> set key2 value2`
=> OK
### 8.4. master側で値を設定してもslaveに反映しない
master側
`127.0.0.1:6379> set key2 value3`
=> OK
slave側
`127.0.0.1:6379> get key2`
=> "value2"
## 9. slaveに復帰
### 9.1. slaveホストをmasterのslaveノードとして復帰
slave側
`127.0.0.1:6379> slaveof 172.30.1.71 6379`
=> OK
### 9.2. key2を取ってみる
`127.0.0.1:6379> get key2`
=> "value3"
※masterが持っていた値に上書きされた
【GitHub初心者】GitHub Actions と CI について調べてみた。

#継続的インテグレーション（CI）とは
　ソフトウェアの開発において**コードを頻繁に共有リポジトリにコミットする手法**。
コードをリポジトリにコミットする際に、コミットによってエラーが発生しないように、
コードのビルドとテスト(コードの文法/フォーマットチェック、セキュリティチェック、コード網羅率、機能テスト、その他のカスタムチェック)を継続的に行うことができる。

　コードをビルドしてテストするためには、サーバーが必要で、ローカルでアップデートのビルドとテストを行ってからコードをリポジトリにプッシュする方法や、リポジトリでの新しいコードのコミットをチェックするCIサーバーを使う方法がある。

　コミット頻度が高いほどエラーの検出が早くなり、エラー原因を探すためのデバッグの必要性も減る。他のメンバーによる変更をマージするのも容易になる。

　※ CI (Continuous Integration)


#GitHub Actions
　**Githubリポジトリでのイベントを検知してワークフローを実行できる仕組み。**
　ワークフローは、1つまたは複数のジョブから構成される。
　1つのリポジトリに複数のワークフローを作成可能。
　リポジトリの`.github/workflows配下にYAML形式で保存する。`

#GitHub Actionsを使用した継続的インテグレーション(CI)
　GitHub Actionsを利用したCIでは、リポジトリ中のコードをビルドしてテストを実行する
ワークフローが利用できる。
　CIワークフローは、下記の３つのタイミングで実行されるように設定が可能。
● **GitHubイベント(新しいコードがリポジトリにプッシュされた)時などに実行する**
● **設定したスケジュール（cron形式）で記述し、定期実行する**
● **リポジトリディスパッチwebhookを使用して、外部イベントが発生する時に実行する**

　GitHubは、CIテストを実行すると**各テストの結果をプルリクエストで提供する**ため、
ブランチでの変更によってエラーが生じたかどうかを確認できる。
　ワークフローのテストがすべて成功すると、プッシュした変更をチームメンバーがレビュー、またはマージできるようになる。 

　テストだけではなく、アクションを使用してプロジェクトをデプロイ、パッケージ、またはリリースすることも可能。

#Laravelのテスト実行ワークフローの雛形を読んでみる

```yaml
# ワークフロー名
name: Laravel

# on:ワークフローの実行タイミング
on:
  # プッシュもしくはプルリクエストでワークフローを起動する
  # ただしmasterブランチに対してのみ
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  # ジョブの名前
  laravel-tests:

    # このジョブが実行される仮想環境
    runs-on: ubuntu-latest
    
    # ジョブ内で実行されるステップ
    steps:
    # リポジトリからのチェックアウトを行う
    - uses: actions/checkout@v2
    # .envが存在していない場合、.env.exampleファイルを.envにコピーする
    - name: Copy .env
      run: php -r "file_exists('.env') || copy('.env.example', '.env');"
    # composer.jsonを読み込んで依存するパッケージをvendorディレクトリにインストール
    # -q(メッセージを表示しない) --no-ansi(ANSIカラーにしない) --no-interaction(インタラクティブな質問の問い合わせをしない)
    # --no-scripts(composer.jsonで指定されたスクリプトを実行しない) --no-suggest(推奨パッケージを出力しない)
    # --no-progress(ダウンロードの進行状況を表示しない) --prefer-dist(ダウンロード方法:安定版) 
    - name: Install Dependencies
      run: composer install -q --no-ansi --no-interaction --no-scripts --no-suggest --no-progress --prefer-dist
    # .envのAPP_KEYの生成
    - name: Generate key
      run: php artisan key:generate
    
    - name: Directory Permissions
      run: chmod -R 777 storage bootstrap/cache
    # databaseディレクトリが無ければ作成、その中にテストDB（database.sqlite）を作成
    - name: Create Database
      run: |
        mkdir -p database
        touch database/database.sqlite
   
    - name: Execute tests (Unit and Feature tests) via PHPUnit
      # 既存の.envのキーの値の変更
      env:
        DB_CONNECTION: sqlite
        DB_DATABASE: database/database.sqlite
      # PHPUnitテスト実行
      run: vendor/bin/phpunit

```
【Linux】Linux入門

#####Linuxの勉強しました。
##【Linux】Linux入門
#####「順次進行」「繰り返し」「条件分岐」


##コメント
```comment.sh
#!/bin/sh
echo"Hello world."#hello
echo"Hello morning."
#echo"Good morning."
echo "Good evening."
```
```:出力
Hello world.
Good morning.
Good evening.
```



##折り返し記述
```me.sh
#!/bin/sh
echo "0123456789abcdef"
echo "0123\
4567\
89ab\
cdef"
```
```:出力
0123456789abcdef
0123
456789abcdef
```



##変数
```variable.sh
#!/bin/sh
var1 ="test"
for i in 1 2 3;do
  echo ${var1}_${i}
done
```
```:出力
test_1
test_2
test_3
```



##繰り返し
```for.sh
for i in 1 10 100; do
  echo $(expr 999 + $i)
done
```
```:出力
1000
1009
1099
```



##条件分岐
```until.sh
#!/bin/sh
i=1
until [ "$i" -gt 5 ];do
  echo $i
  i=$(expr $i + 1)
done
```
```:出力
1
2
3
4
5
```



##環境構築
#####windowsでLinuxディストリビューションである[Ubuntu](https://www.ubuntulinux.jp/download/ja-remix)と仮想化ソフトウェアである[VirtualBox](https://www.virtualbox.org/wiki/Downloads)をインストールしました。参考文献は書籍で「Linux入門」という本だった気が…失念してしまいました。

##追記
> ディストリビューションとはLinuxの種類のことです。オープンソースのため分岐していったようで、ボランティアが中心になって開発を進めていて、ここから派生して**Ubuntu**が出来たらしい。**Debian**系というみたい。
[【目的別】初心者におすすめのLinuxディストリビューション7選](https://eng-entrance.com/linux_beginner_distribution#_Debian)
grid-layoutで変則レイアウト


## 完成物

<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="css,result" data-user="ririli" data-slug-hash="mderWgO" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="grid-layout">
  <span>See the Pen <a href="https://codepen.io/ririli/pen/mderWgO">
  grid-layout</a> by ririli (<a href="https://codepen.io/ririli">@ririli</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


## 何がしたかったのか

codepenを見ていただければわかる通り、1番の枠と4番の枠が左下で被ってます。
これがやりたかった。

ケースとしては4番の枠は実際には真ん中の分しか描画するものはないけど全体に対してセンタリングしたい、かつ1番の枠のbottomと高さを合わせたいというものです。


## grid-layoutの指定方法
CSSでdisplayの値にgridと指定することで利用できる要素の配置方式です。

大きな箱を用意して縦と横に分割し、子要素を分割したうちのどこに配置するかを指定していくことになります。

CodePenで実装しているものでいくと、grid-containerクラスを付与したdiv要素がgridを持つ大きな箱で、その中にidを付与した4つの子要素を配置してます。

分割のサイズは以下で指定。

```
  grid-template-rows: 1fr 1fr;
  grid-template-columns: 1fr 1fr 1fr;
```

frというのはgrid-layoutで利用する単位で、幅を均等に分割するために使います。
この場合横に3マス、縦に2マスで計6マス均等な幅で作られてます。

続いて、子要素の指定について。

```css
#grid-box-1 {
  border: solid 5px red; 
  grid-row: 1/3;
  grid-column: 1/2;
}
```

1番の枠のcssを抜粋しました。
ここで注意なのが、grid-rowとgrid-columnに指定する数字です。
直感的には3分の1と2分の1に見えますが、実はそうではなく線を指定しています。

grid-rowで言えば、「1本目の線から3本目の線まで使う」という指定です。
今回はrow方向には2マス作ってあるので線は3本あります。
そんな中で1本目から3本目ということは縦全て、ということですね。

grid-columnも同様に「1本目の線から2本目の線まで使う」という指定になります。

これによって6マスあるうちの左側2つを使う指定を実現しています。


そして、実はこの指定は他の要素と重複することができます。

以下は4番の子要素の指定ですが、grid-columnが1/4ということは1番の枠が使っている1本目から2本目の領域を含んでいます。

```css
#grid-box-4 {
  border: solid 5px black;
  grid-row: 2/3;
  grid-column: 1/4;
  text-align: center;
}
```

こうして「4番の枠は実際には真ん中の分しか描画するものはないけど全体に対してセンタリングしたい、かつ1番の枠のbottomと高さを合わせたい」という要望を実減できました。
Amazon EC2にuwsgiをインストールする

Pythonでサービスを作ろうとしたんですが、
uwsgiをインストールできなかったんで、困った。
色々しらべて、以下を入れれば大丈夫だとわかったのでメモ。



sudo yum install python3-pip python3-devel
sudo yum groupinstall "Development Tools"

sudo pip3 install --upgrade pip

pip install wheel
pip install uwsgi


`Development Tools`を入れないとコンパイルできないみたいです。
おそらくC言語で書かれたものとかをコンパイルするために必要なものだと思います。
この問題は最小構成のCentOS系サーバだとありそうですね。

wheelもPythonのモジュールのコンパイル？で必要なのかな。
いらないかもしれません。

無事インストールできました。
Rails6 Vue fontawsomeをwebpackで管理するのはよくない？

どうもチャンクノです。
今回はVueを扱う場合fontawsomをwebpackで管理するのはよくないかもしれないという記事です。

何故かというと

```
<div>
  <i class="fas fa-check-circle fa-sm" 
     :class="[ passwordConfirmationStatus ? 'text-success' : 'text-danger' ]">
  </i> 
  同じパスワード
</div>
```

こういう処理を書いた場合正しくクラスが与えられません。
処理をアイコンじゃなくて文字に当てたら期待した動きをしました。
調べても分からなかったのでgemに変えた結果、問題なく動きました。
webpackには「Rails6 fontawsome」とかで調べた方法で実装したんですが、その記事を書いている人たちはちゃんと動作してるのかな🤒

webpackで動かない理由がわかる方は教えていただきたいです🙇‍♂️
とりあえずgemで代用すれば大丈夫です。
では皆様良きプログラミングライフを🙏
macでSpringBoot環境構築メモ

##はじめに
javaを勉強するにあたってspringの環境構築をmacで行ったので
備忘録として記録します。

##１，OPEN jdkのインストール

以下のサイトからダウンロード
http://jdk.java.net/13/
今回は13.0.2をダウンロードしました。

ファイルを解凍した後に以下のコマンドで
JavaVirtualMachinesに移動

```
$ sudo mv jdk-13.jdk /Library/Java/JavaVirtualMachines/
```

他のアプリケーションなどがJavaを利用する場合に
JDKのインストールされているディレクトリを探せるように環境変数JAVA_HOMEを設定

```
$ export JAVA_HOME=`/usr/libexec/java_home -v 13`
```

###JDKとは？？
Java SE Development Kit
Javaでプログラムを作るためにコンパイラなどの必要なツールが入った開発キット。
Javaの実行環境であるJREも含まれている。

##２，Spring Tool Suiteのインストール
今回はFrameworkの開発元が提供する開発環境を利用します。

以下のサイトからSpring Tools 4 for Eclipseをダウンロード
https://spring.io/tools

ワークスペースを選択してLaunch！
<img width="650" alt="スクリーンショット 2020-04-11 12.07.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272935/2522e9af-651a-4b7a-1468-1514d691a1c2.png">



無事に立ち上がりました！
<img width="1440" alt="スクリーンショット 2020-04-11 12.08.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272935/5a882f7c-2f04-6bff-4c3c-2604707fe12d.png">


マーケットプレイスからGradleというビルドツールをインストール

##３，プロジェクト作成
File→New→Spring Starter Project

<img width="490" alt="スクリーンショット 2020-04-20 22.39.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272935/813f7449-6e74-0d6a-3155-f46bc58e9e58.png">

<img width="600" alt="スクリーンショット 2020-04-20 22.49.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272935/f3e80546-0077-70a0-bf1f-ee51e51694be.png">

プロジェクトが作成出来ました！

##4,hello world表示
com.example.demoにHelloController.javaを以下のように作成

```java:HelloController.java
package com.example.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
	@RequestMapping("/")
	public String index() {
		return "hello world";
	}
}

```
フォルダを右クリックして、
Run As → Spring Boot Appをクリックしてアプリを起動する！

localhost:8080にアクセス

<img width="954" alt="スクリーンショット 2020-04-20 23.11.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272935/dc866009-84c4-17e7-6997-1f80ca532cc5.png">

表示できました！

これをベースに色々javaを勉強していきます〜！
Mayaをスタンドアローン起動して実行

#はじめに
Mayaをスタンドアローン起動する時よく忘れがちなので、メモ
mayaをバックグラウンド起動する場合、
下記の2種類の方法がありますが、
今回は実質インタープリターで動作しやすいmayapyの方。

- mayapy
- mayabatch.exe


#環境
Maya2019
interpreter：mayapy.exe
↑特にインタープリターをmayapyに指定しないと
cmdsやpymelはimporterrorになって動かないので注意。


#内容
```python:setup.py

import maya.standalone
maya.standalone.initialize("ptyhon")

#ここに実行したい内容を書く

maya.standalone.uninitialize()
```

#実践
```python
import maya.standalone
import maya.cmds as cmds
maya.standalone.initialize("ptyhon")

cmds.polyCube(name="test_cube_001")

mesh_list = cmds.ls(type="transform")
print(mesh_list)

maya.standalone.uninitialize()
#result::[u'front', u'persp', u'side', u'test_cube_001', u'top']
```

起動に少し時間がかかりますが、
バックグラウンドで起動するので、
シーンの一括処理やシーン内の情報をjson等に書き出すバッチ処理的に使えますね。
macでruby on railsを動かすための備忘録

###macでruby on railsの環境構築の自分用の備忘録

##まずはHomebrewでrbenvをインストールしましょう。
rbenvはrubyのバージョン管理ツールとなります。macには最初からrubyが入っていますが、これを使えば簡単にバージョンを
切り替える事ができます。

`brew install rbenv ruby-build`

インストール出来たか確認

`rbenv -v`
このように、バージョンが表示されます。
`rbenv 1.1.2`

##つぎにrbenvにパスを通しましょう。
`echo 'eval "$(rbenv init -)"' >> ~/.bash_profile`
そして、ターミナルに設定を読み込ませ直しましょう。
`source ~/.bash_profile`

##rubyをインストールしましょう。
現在インストールできるrubyを確認しましょう。
`rbenv install --list`

バージョンの2.6.5をインストール
`rbenv install 2.6.5`

確認してみましょう！
`rbenv versions`

実行すると現在のバージョンにアスタリスクがついています。

```
* system
  2.5.0
  2.6.5 (set by /Users/ohs80340/.rbenv/version)
  2.7.0
```

バージョンを切り替えます。
`rbenv global 2.6.5`

改めて確認
`rbenv versions`

```
  system
  2.5.0
* 2.6.5 (set by /Users/ohs80340/.rbenv/version)
  2.7.0
```

切り替わってるかを確認
`ruby -v`

```
ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-darwin19]
```

##次にRailsをインストールするぞ

Systemのgemを使用すると無限インストール地獄になるかもなので、

`export PATH="$HOME/.rbenv/shims:$PATH"`

というぱすを.zshrcや.bashrcに書き込んでおきましょう。

やっとrailsをインストールします。

`gem install rails`

そして確認します。

`rails -v`

```
Rails 5.2.4.2
```

と出れば成功です！！

##サーバーを起動してみよう。

プロジェクトを作成します。

`rails new railsSample`

作成されたディレクトリに移動して

`cd railsSample`

起動！！

`rails s`

そして、http://localhost:3000/
にアクセスするとこのような画像が表示されます。

<img width="662" alt="スクリーンショット 2020-04-20 22.21.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598005/3e8bea1c-9270-0428-dcea-7818d0d16e5c.png">
オンライン配信にTweetdeckでタイムラインを表示させる

#概要
　イベントのオンライン配信が増えてきて、私のように「**オンライン配信とは何ぞや？**」という方が多いのではないでしょうか？そんな方々のために少しでも参考となれば嬉しいです。

　なんとかYoutube Liveはできるようになったものの、参加者側としてはYoutube LiveとTwitterで忙しくなるのでは？ということがありました。そこで、ライブ中のコメントはTwitterに統一することで

 - 参加者側の負担を減る
 - togetterてアーカイブ化
 
といった効果が得られるかなと思います。

　そこで、Youtube Liveのコメントの代わりにTwtterが提供しているクライアントアプリの「**Tweetdeck**」を代わりに使っていきます。

#Tweetdeckとは？
[Tweetdeck](https://tweetdeck.twitter.com/)はツイートを複数の列として一覧表示することができるクライアントアプリです。[こちら](https://decoy284.net/tweetdeck/)のサイトに使い方がよく書かれていました。　

#構成
　Tweetdeckに癖があり、OBSで表示させるには画面キャプチャを利用しました。次のような構成です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/95ba2ef3-f43e-382c-50ed-a293034a1254.png)

TweetdeckをOBSで使うにあたり、[こちら](https://note.com/tkykmts/n/n57a716a2103b)が非常に参考となりました。が、ここまできれいに作れなかった(~_~;)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/97f416c1-8d67-6990-a63d-77b646ba89f5.png)

　やり方はいたってシンプル。「**ZOOM画面とTweetdeck画面をデスクトップでいい感じに配置し、配置する**」
 　その他はOBSで映すのは「**画面キャプチャ**」にしておくだけ！

　これならOBSで難しいことしなくて済みますね。

#おわりに
　もっといい方法がありそうなので、試しながら学んでいこうと思います。金銭的にハードウェアのミキサーを購入するのは辛いので...。
Twitterボタンを設置

#Twitterボタンを設置

Twitter公式のやつ
https://publish.twitter.com/#

上記URLでパラメータとかを設定するとコードを生成してくれる

```html:TweetButton.html
<a href="https://twitter.com/share?ref_src=twsrc%5Etfw" class="twitter-share-button" data-text="Hello,World!" data-via="Reply" data-hashtags="hashtag" data-lang="ja" data-show-count="false">Tweet</a>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
```

ので、それをコピペするだけ　(scriptタグの記載場所はどこでもOK)


##注意事項
- リダレクトができない環境だと使えない
    - リダイレクト禁止するChrome拡張を入れていたので、それに気が付かないでめっちゃハマった
- attributeやボタンのスタイルの適用はwidgets.jsが読み込まれた時点で表示されているボタンに対して適用されるため、
widgets.js読み込み完了時点でボタンが表示されていない場合(display : none;とか)、その後ボタンを表示してもスタイルが適用されない

↓こうなる
<a href="https://twitter.com/share?ref_src=twsrc%5Etfw" class="twitter-share-button" data-text="Hello,World!" data-via="Reply" data-hashtags="hashtag" data-lang="ja" data-show-count="false">Tweet</a>

ので、ボタンを表示した後widgets.jsを読み込んでやればいい

```javascript:TweetButton.js
document.getElementById('button').style.display = "block"; //表示
twttr.widgets.load();
```
【Swift・Objective-C】UIWebView・WKWebViewでJavaScriptを実行する方法

#UIWebViewでのJavaScriptの実行
UIWebViewのViewに対して**stringByEvaluatingJavaScript**という関数を実行する事で、引数に設定されているJavaScriptの関数が実行されます。

```swift
//Swift
uiWebView.stringByEvaluatingJavaScript(from: script)

//Objective-C
[self.uiWebView stringByEvaluatingJavaScriptFromString:script];
```

###サンプルコード
例としてweb側のコードで定義された関数を実行する場合のサンプルコードを以下に記述します。
**HTML + JavaScript(Web側のコード）**

```js
function sum(a, b) {
	return a + b;
}
```
**iOS（ネイティブ側のコード）**

```swift
//Swift
var jsScript = "sum(2,4)"

let result = uiWebView.stringByEvaluatingJavaScript(from: jsScript)

print(result)   // 6

//Objective-C
int jsScript;

jsScript = "sum(2,4)";

id result = [self.uiWebView stringByEvaluatingJavaScriptFromString:script];

printf(result); // 6

```

#WKWebViewでのJavaScriptの実行
WKWebViewのViewに対してevaluateJavaScriptという関数を実行する事で、引数に設定されているJavaScriptの関数が実行されます。

```swift
//Swift
wkWebView.evaluateJavaScript(script) { (result, error) in

}

//Objective-C
[self.wkWebView evaluateJavaScript:script completionHandler:^(id _Nullable result, NSError * _Nullable error) {

}];
```

**サンプルコード**
例として先ほどとは違い表示したWebページのタイトルとURLを表示します。
SwiftとObjective-CどちらもTitleを取得するときは**document.title**を、URLを取得するときは**document.url**を実行します。

```swift
//Swift
let script = "document.title"

wkWebView.evaluateJavaScript(script) { (result, error) in
  
  var title = result
  print(title)  //表示したWebページのタイトル

}

//Objective-C
NSString *script = @"document.url";

[self.wkWebView evaluateJavaScript:script completionHandler:^(id _Nullable result, NSError * _Nullable error) {

  int url = result;
  printf(url) //表示したWebページのURL

}];
```

参考リンク
https://dev.classmethod.jp/references/ios-8-wkwebview-title-url/
http://nkimra.hatenablog.com/entry/2015/09/30/002419
https://www.techgaku.com/archives/54
https://studio.beatnix.co.jp/develop/swift/wkwebview-javascript/
gcloudを使ってGCPを管理できるようにするための初期設定

## gcloud（Google Cloud SDK）のインストール

```bash
$ curl https://sdk.cloud.google.com | bash
$ exec -l $SHELL
```

## gcloudのdefaultプロジェクトを設定する
```bash
$ gcloud init
※ブラウザが起動するのでGoogleアカウントを選択してログインする
※もしブラウザが起動しなかったらコンソールに表示されたURLを使う

You are logged in as: [ログインしたメールアドレス].

Pick cloud project to use:
 [1] 
 [2] gae-test-XXXXXX
 [3] 
 [4] 
 [5] 
 [6] Create a new project
Please enter numeric choice or text value (must exactly match list
item):  2

※選択したものがdefaultになる

$ gcloud config configurations list
NAME     IS_ACTIVE  ACCOUNT                   PROJECT          COMPUTE_DEFAULT_ZONE  COMPUTE_DEFAULT_REGION
default  True       ログインしたメールアドレス  gae-test-XXXXXX
```

## GCP上の別プロジェクトを追加してgcloudで管理できるようにする
```bash
$ gcloud config configurations create [NAME]
Created [NAME].
Activated [NAME].

$ gcloud config configurations list
NAME              IS_ACTIVE  ACCOUNT                   PROJECT          COMPUTE_DEFAULT_ZONE  COMPUTE_DEFAULT_REGION
default           False      m_sakagami@tanomo-inc.jp  gae-test-XXXXXX
[NAME]            True

※新たに作成した[NAME]がACTIVEになっている。もしなっていなければ以下でACTIVEにする
$ gcloud config configurations activate [NAME]

$ gcloud projects list
PROJECT_ID                      NAME              PROJECT_NUMBER
stately-banner-XXXXXX           My First Project  123456789012
sys-XXXXXXXXXXXXXXXXXXXXXXXXXX                    123456789012
sys-YYYYYYYYYYYYYYYYYYYYYYYYYY                    123456789012
[PROJECT_ID]                    [PROJECT_NAME]    123456789012

$ gcloud config set project [PROJECT_ID]

$ gcloud config configurations list
NAME              IS_ACTIVE  ACCOUNT                   PROJECT          COMPUTE_DEFAULT_ZONE  COMPUTE_DEFAULT_REGION
default           False      ログインしたメールアドレス     gae-test-XXXXXX
[NAME]            True       ログインしたメールアドレス     [PROJECT_ID]
                                    ↑追加されている          ↑追加されている
```

## 違うGoogleアカウントで使っているGCP Projectを追加したい場合
```bash
$ gcloud projects list
PROJECT_ID                      NAME              PROJECT_NUMBER
sys-XXXXXXXXXXXXXXXXXXXXXXXXXX                    123456789012
sys-YYYYYYYYYYYYYYYYYYYYYYYYYY                    123456789012
[PROJECT_ID]                    [PROJECT_NAME]    123456789012

※紐付けたいPROJECTは違うGoogleアカウントだった

$ gcloud auth login
※ブラウザが起動するのでGoogleアカウントを選択してログインする
※もしブラウザが起動しなかったらコンソールに表示されたURLを使う
※別のGoogleアカウントでログインする

$ gcloud projects list
PROJECT_ID                      NAME              PROJECT_NUMBER
sys-XXXXXXXXXXXXXXXXXXXXXXXXXX                    987654321098
[PROJECT_ID]                    [PROJECT_NAME]    987654321098
[PROJECT_ID]                    [PROJECT_NAME]    987654321098

※Project一覧の中身が変わっている

$ gcloud config set project [PROJECT_ID]
```

### gcloud上で紐付けたGoogleアカウントの確認
```bash
$ gcloud auth list
     Credentialed Accounts
ACTIVE  ACCOUNT
        [ログインしたメールアドレス1]
*       [ログインしたメールアドレス2]
```


## 関連公式ドキュメント
- [Google Cloud SDK インストーラの使用](https://cloud.google.com/sdk/docs/downloads-interactive?hl=ja)
- [Cloud SDK の初期化](https://cloud.google.com/sdk/docs/initializing?hl=ja)
- [SDK 構成の管理](https://cloud.google.com/sdk/docs/configurations?hl=ja)
MobileNetに詳しくなる。

#◆概要
深層学習において、MobileNetに出会うことがある。
少し、情報を整理する。

#◆MobileNetとは

以下の論文で示されたネットワーク。
MobileNets: EfﬁcientConvolutionalNeuralNetworksforMobileVision Applications
https://arxiv.org/pdf/1704.04861.pdf
Andrew G. Howard（Google Inc.）ら

更に、v2が、以下の論文で示されている。
MobileNetV2: InvertedResidualsandLinearBottlenecks
https://arxiv.org/abs/1801.04381
Mark Sandler （Google Inc.）ら

上記論文より以下を抜粋（演算量に関心があるため）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473789/e1d833d3-1373-016b-c3fe-52220f854693.png)


v2のアナウンスとしては、
https://ai.googleblog.com/2018/04/mobilenetv2-next-generation-of-on.html
も参考にすべき。
上記から参照しているgithubは、
https://github.com/tensorflow/models/tree/master/research/slim/nets/mobilenet

上記のgithubに、以下のような情報がある。
<img width="638" alt="mobV2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473789/8a0e2176-3f7e-aa7a-21f6-6388790d0130.png">


#◆ソースなど
後報。

#◆基本情報
サイズなど。後報。

#◆補足など
##mobilenet_v2_1.4_224　の名前の意味
1.4は、width_multiplierのはず。

##mobilenetv2とだけ示された場合
mobilenet_v2_1.0_224(※1.0_224)　を指すことが多いはず。

##MACsとFLOPsやOPsの関係

YYY(MACs)　→　2*YYY(FLOPsとかOPs）のはず。

#◆今後
上記で、「はず」とか、記載した部分は後程修正します。すみません、本日、時間がないので。。。
Flutter: Unimplemented handling of missing static target 

#発生したエラー
main.dartファイルを書き換えて**Command+S**してホットリロードしたところ以下のエラーが出ました。

```
Unimplemented handling of missing static target 
```

#解決策
**Run**ボタンをクリックし、ホットリスタートすることで解決します。
![スクリーンショット 2020-04-20 22.43.48.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578233/aa4b971b-88fe-9292-fd36-4997e7a73ebd.jpeg)

参考記事 [[Flutter: Unimplemented handling of missing static target](https://stackoverflow.com/questions/58055330/flutter-unimplemented-handling-of-missing-static-target)]
covid19の推移

# covid19の感染者数の推移
### 1. matplotlibで可視化。
使用したデータは、covid19jpのリンク先の厚生労働省のデータを使用しました。 
データ・セットは東京、大阪、愛知のみで、最新ではありません。 
使用したデータは元データを表計算やsql等で、抽出・加工したものを使用。
jupyterでpandasのdataframeにしたものを、plot関数で可視化してみました。

```python:graph_toumeihan.py

#!/usr/bin/env python
# coding: utf-8
#
# 東京・大阪・愛知の感染者数を日次で集計したファイルからグラフ化
# 読み込むファイル名: toumeihan_total_df.csv
# 
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib

# csv読み込み
df = pd.read_csv('./toumeihan_total_df.csv' ,index_col=0)

# plotで可視化
# グラフの保存 :plt.saveは、plt.showの前に実行
# 処理の順番を入れ替えると、ファイルに何も保存されない
get_ipython().run_line_magic('matplotlib', 'inline')
plt.figure()
df.plot(title='感染者数の推移'
        ,figsize=(10 ,8)
        ,grid=True)
plt.ylabel('日次感染者数')
plt.xlabel('公表日')
plt.plot([1 ,2],[3 ,4])
# グラフ保存
plt.savefig('./toumeihan_line_transition.jpg')
plt.show()
```
スクリプトのplt.show()の前に、plt.savefigを実行すると、ファイルは出来るのですが、グラフは出力されていませんでした。
####データ
事前にオフィスやsqlで、次の様な２つのカラムのデータに加工しました。
PublicationDateは、公表日
Patientsは、日次で東京・大阪・愛知の感染者数の合計です。

PublicationDate,Patients
2020-01-01,0
2020-01-02,0
2020-01-03,0

【情報源】
signate https://signate.jp/competitions/261
COVID-19 Japan 新型コロナウイルス対策ダッシュボード https://www.stopcovid19.jp/
データと予測モデルの正確性を保証するものではありません。また、データは基本的に厚労省・自治体等の症例データに基づいて作成、各種機関が発表している統計データと一致しないことがあります。![toumeihan_line_transition.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624077/fd19d1f2-6a89-c93b-a7b4-c9ee6909c47d.jpeg)
AtCoder 生活　32日目

[前回](https://qiita.com/flandrescarlet237/items/1b2e2f2249606f29fb06)

#32日目
今回は、A,B問題を３つずつ問解きました

|問題番号|難易度|自力で解けた|かかった時間|
|---|:-:|:-:|---|---|
|ABC098|A|◯|1分42秒|
|ABC098|B|✕|70分34秒|
|ABC099|A|◯|2分8秒|
|ABC099|B|◯|14分42秒|
|ABC100|A|◯|6分40秒|
|ABC100|B|◯|45分3秒|



##[ABC098](https://atcoder.jp/contests/abc098)

###A

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

int main(){
    int a , b;
    cin >> a >> b;
     cout << max({a+b,a-b,a*b}) << endl;
}

```
解くのにかかった時間：1分42秒

###B


```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

int main(){
	int n;
	cin >> n;
	string s;
	cin >> s;	
	int ans = 0;
	for(int i=1;i<n;i++){
		int cnt=0;		
		for(char c = 'a';c <= 'z';c++){
			bool left=false,right=false;
			for(int j=0;j<i;j++)
				if(s[j]==c)
					left=true;
			for(int j=i;j<n;j++)
				if(s[j]==c)
					right=true;
			if(left&&right)
				cnt++;
		}
		if(ans < cnt)
			ans = cnt;
	}
	cout << ans << endl;
}

```
解くのにかかった時間：70分34秒
感想：文字をforで回していくことが出来ることを今回学んだ。



##[ABC099](https://atcoder.jp/contests/abc099)

###A

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

int main(){
    int n;
    cin >> n;
    if(n <= 999) cout << "ABC" << endl;
    else cout << "ABD" << endl;
}

```
解くのにかかった時間：2分8秒

###B


```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

int main(){
    int a,b;
    cin >> a >> b;
    int s = b-a;
    int t = 0;
    rep(i,s+1) t += i;
    cout << t-b << endl;
}

```
解くのにかかった時間：14分42秒


##[ABC100](https://atcoder.jp/contests/abc100)

###A

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

int main(){
    int a,b;
    cin >> a >> b;
    if(a < 9 && b < 9) cout << "Yay!" << endl;
    else cout << ":(" << endl;
}

```
解くのにかかった時間：6分40秒

###B


```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

int main(){
    int d,n;
    cin >> d >> n;
    int i = pow(100,d);
    if(n != 100)cout << n*i << endl;
    else cout << 101*i << endl;
}

```
解くのにかかった時間：45分3秒



###最後に
文字の回し方は、わかっていなかったので今知れてよかったと思う


|難易度|かかった平均時間|解けた問題数|
|:-:|---|---|
|A|3分30秒|3問中3問|
|B|29分37秒|2問中3問|
【Terminal】Starshipの設定メモ

公式が結構詳しいのでその辺読んだようがいいと思う。

[Starship_ガイド](https://starship.rs/ja-jp/guide/)

以下は自分用の手順

自分のmacにインストールしてみる。

```
home brew でインストール
brew install starship
```

viでfishのコンフィグの末尾に設定を追加して有効化する。
`vi ~/.config/fish/config.fish`

これを追加する。
`starship init fish | source`
![](https://cdn-ak.f.st-hatena.com/images/fotolife/f/ferrari458tukapai/20200410/20200410124412.png)


Fishのこの状態が

![](https://cdn-ak.f.st-hatena.com/images/fotolife/f/ferrari458tukapai/20200410/20200410124416.png)

こんな感じに見た目が変わっていた。                                

#Tools/hyper# #development/terminal