OmniAICreator/Qiita-1.07M huggingface dataset:
簡易実効再生産数の予測値を出してみる

新型コロナウイルスが猛威を奮って２回目の夏が来ました。皆様、体調にお気をつけて。

新型コロナウイルス感染症の拡大指標の一つに[実効再生産数](https://www3.nhk.or.jp/news/special/coronavirus/effective/)があります。よくテレビでもその数値が報道されていたりもしますね。この数値は 1 を境に、1以上だと感染者数が増加傾向に、逆に1未満だと減少傾向にあることを表します。実効再生産数を算出するには結構な計算をする必要があります。と言っても [R のソースコードが公開されている](https://github.com/contactmodel/COVID19-Japan-Reff)ので、入力する数値さえ揃えばあとはプログラムを走らせれば結果は出ます。しかしながら、揃える数値は感染者をほとんど全数把握できている前提で設定されているので、昨今のような市中感染が広がっている状況下では入力する数値を揃えることも困難になります。

そこで、厳密ではないにせよ、ある程度の指標となり得る[簡易実行再生産数](https://www.niid.go.jp/niid/ja/diseases/ka/corona-virus/2019-ncov/2502-idsc/iasr-in/10465-496d04.html)というものがあります。こちらはパラメータさえ決めてしまえば、残りの変数は新規感染者数だけになるため、日々の新規感染者数に応じて簡易実行再生産数を計算し、モニタリングすることが可能になります。

# 簡易実行再生産数

簡易実行再生産数 Rt は次の式で表されます[^1]。

```math
R_t = \frac{\sum_{k=0}^6 d_k}{\sum_{k=g}^{g+6} d_k}
```

ここで、 dk は k 日前の新規感染者数（k=0は今日）、g は既存患者が他の人に移して感染するまでの時間（＝世代時間）です。分母は直近一週間の新規感染者数、分子は1世代時間前の新規感染者数になります。試しに今日時点(2021/8/14)の東京都の簡易実行再生産数を計算してみましょう。[東京都の新規感染者数はこちら](https://stopcovid19.metro.tokyo.lg.jp/cards/number-of-confirmed-cases)から参照できます。

| 8/14 | 8/13 | 8/12 | 8/11 | 8/10 | 8/9 | 8/8 | 8/7 | 8/6 | 8/5 | 8/4 | 8/3 | 8/2 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| 5094 | 5773 | 4989 | 4200 | 2612 | 2884 | 4066 | 4566 | 4515 | 5042 | 4166 | 3709 | 2195 |

これを元に、世代時間 g = 5 として計算してみましょう。

```math
R_t = \frac{5094+5773+4989+4200+2612+2884+4066}{2884+4066+4566+4515+5042+4166+3709}=\frac{29618}{28948}=1.023...
```

となり、 1.02 という値が得られました。1以上なので、まだ収束しなさそうですね...

# 未来の簡易実行再生産数を予測する

さて、簡易実行再生産数 Rt であれば、世代時間さえ決めてしまえば、あとは四則演算で求めることができるのがわかりました。ただし、求めた Rt は現時点での瞬間値であるため、今後の動向を把握するにはちょっと心許ないです。ところで、[Googleは新規感染者数の予測値を公開しています](https://datastudio.google.com/u/0/reporting/8224d512-a76e-4d38-91c1-935ba119eb8f/page/ncZpB?s=nXbF2P6La2M)。そこで、Googleの予測した新規感染者数を使って Rt を出せば、Rt の予測値を計算できそうです。

8/14 時点で公開されている Google のデータを用いて、各都道府県の簡易実行再生産数をまとめてみました[^2]。Google の予測値は実測値の反映が若干遅いことに注意です（このデータでの実測値の最新は 8/11 になっている）。

https://docs.google.com/spreadsheets/d/1sbf2tOzO7DWZf2S2PZrXW3j-tNSO2wi9sa17RFoheeA/edit?usp=sharing

これをみると、お盆の時期に1を超える地域がありますが、8月末頃になると1を下回っている地域がほとんど、つまり予測の新規感染者数は減少傾向にありますね。現実もそのようにうまくいってくれると良いですが...

# まとめ

- 簡易実行再生産数の計算式の紹介をしました。
- 実際の東京都のデータを使って計算してみました。
- Google の感染者数の予測値を使って、簡易実行再生産数を計算しました。

[^1]: ここでは[こちらの論文](https://www.niid.go.jp/niid/ja/diseases/ka/corona-virus/2019-ncov/2502-idsc/iasr-in/10465-496d04.html)に基づいた計算式を使っています。簡易計算式は他にも提案されており、例えば[東洋経済ONLINE](https://toyokeizai.net/sp/visual/tko/covid19/?_ga=2.161608316.1775000089.1628957791-1802576570.1628957791)では異なる式が利用されています。
[^2]: 世代時間 g = 5 としています。最近流行しているデルタ株の世代時間はもっと短いことが予想されるため、ここでの値はあくまでも参考値としてご覧ください。
td-agentのupdateでfluent-plugin-twitterが動かなくなった話と回避策

# 概要

td-agentを使って、twitterのsamplingデータを取得している。td-agnetのバージョンを `(4.1.1-1)` から ` (4.2.0-1)` へアップデートした。
その際、 fluent-plugin-twitter が動かなくなったので報告する。

# エラー内容

`$sudo systemctl restart td-agnet.service` をしてもエラーで起動しない。

次の様にsystemctlを使わず起動するとエラーが出色される。

```
/opt/td-agent/bin/fluentd --dry_run -c /etc/td-agent/td-agent.conf
```
エラーを見ると
```
because http_parser.rb-0.7.0 conflicts with http_parser.rb (~> 0.6.0)
```
というエラーが出る。
`fluent-plugin-twitter` が http_paraser.rb の 0.6.0 が必要なところを、0.7.0が優先的に起動し、そちらでエラーになった模様。

# 回避策

調べた所、 http_parser.rb で 0.6.0と0.7.0の両方がインストールされていたので、0.7.0をアンイストールした。

```
$/opt/td-agent/bin/fluent-gem uninstall http_parser.rb 
```
をすると、どちらのバージョンを削除するか聞いてくるので `0.7.0` を削除した。

# 環境

ubuntu20.04
NodeJS+Parcelでjavascriptのタイムリーなデバッグを可能にする

# はじめに
　先日からTextAliveAppAPIの勉強をしており、APIの使い方まで分かるようになりました。しかし、実行環境がサンプルのままだったので、少し気持ち悪かったのです。そこで今回、自力で環境を構築しようと試み、苦戦し、理解したので記事にまとめたいと思います。

# この記事の対象者

* かなり初心者
* nodeJSのインストールが完了している人
* TextAliveAppAPIの開発環境を自前で作りたい人

　この記事は、nodeJSのインストールが完了しており、`npm`コマンドが使用できる方が対象です。また、ゼロからjavascriptの環境を構築する手順を書きます。かつ、TextAliveAppAPIのサンプルと同じ開発環境を整える手順で書きます。筆者の実行環境は、Windows10です。一応注意してください。

# この記事から得られる事

* javascriptのデバッグがタイムリー（保存→自動で反映）に行える

# 要約
　NodeJS上にparcelをインストールし、parcelからファイルを起動する。

# parcelの「🔥 ホットモジュールリプレイスメント」
　実は、筆者はparcelについてあまり分かっていません((+_+))。しかし、parcelの公式ページには、以下のようなことが書いてあります。
>Parcel は、開発時に変えた変更に応じてブラウザー上でモジュールを自動アップデートします。もちろん、設定不要です。

つまり、開発時の変更内容を<b>自動でアップデート</b>してくれる、ということですね。例えば、chrome上で実行結果を確認していたとすると、javascript変更が即座にchromeへ反映される。感激ですね。

参考
※[Parcel 驚くほど速く、設定不要なWebアプリケーションバンドラー](https://ja.parceljs.org/)

# 手順１．parcelをインストールする
　まずは、parcelをnodeJS上にインストールしましょう。以下のコードを打ち込むと、インストールできます。
 
`npm install -g parcel-bundler`　


参考
※[PARCEL はじめに](https://ja.parceljs.org/getting_started.html)

# 手順２．nodeJSプロジェクトの初期化
　開発するディレクトリ上で、nodeJSプロジェクトの初期化を行いましょう。以下のコマンドを打ち込んでださい。`package.json`というファイルが出来ましたね。

`npm init -y`

参考
※[PARCEL はじめに](https://ja.parceljs.org/getting_started.html)

# 手順３．必要最低限のファイルを作成する
　開発するディレクトリ上で、`index.html`と`index.js`ファイルを作成してください。これはparcelでデバッグする上で必要最低限なファイルです。また`index.html`では、以下のように、必ず`index.js`ファイルを呼び出すようにしてください。
　`index.html`上で`index.js`を呼び出す作業をしないと、自動更新＆反映が起動しないようです※２。

```ruby:index.html
<html>
  <body>
    <script src="./index.js"></script>
  </body>
</html>

```

参考
※１[PARCEL はじめに](https://ja.parceljs.org/getting_started.html)
※２[Parcel does not live reload browser if index.html is the only file #2557](https://github.com/parcel-bundler/parcel/issues/2557)

# 手順４．package.jsonのnpm scriptsを編集する
　正直、この手順はしなくてもいいですが、TextAliveAppAPIの開発環境に合わせるために取り上げました。
　nodeJSには`npm run <hogehoge>`というコマンドがあり、特定のコマンドを実行する機能があります。今回はこれを用いて、parcelを呼び出すようにしたいと思います。
　まず、`package.json`を開いて、`script`タグの内容を以下のように書き換えてください。

```ruby:package.json->script
"scripts": {
  "dev": "parcel index.html"
},
```
参考
※[フロントエンド開発の３ステップ（npmことはじめ） ビルドは npm run](https://qiita.com/hashrock/items/15f4a4961183cfbb2658#%E3%83%93%E3%83%AB%E3%83%89%E3%81%AF-npm-run)

# 手順５．デバッグしてみる
　準備完了です。以下のコマンドを打ち込み、実行してみましょう。おそらくデフォルトのサーバーであるhttp://local:1234 が立ち上がるので、chromeとかで開くことが出来ます。
　そして！`index.html`とか`index.js`とかを編集し、保存すると、ブラウザも自動的に更新されます！これで開発効率爆上がりですね。

`npm run dev`

# おわりに
　nodeJSって何ぞや。。。ってところから10日もたってない筆者です。nodeJSを使って、index.htmlとかを編集するだけで、デバッグしたかったのです。そして、parcelを使うとこんなに楽だなんて知らなかったのです。
　また、この記事に間違いなどがあれば、コメントでご教授くださるとありがたいです。プロコンがんばります(/・ω・)/。それじゃ！
m1 macでmysqlのDockerを立てる

もともとのmysqlのイメージを使っていると動かず、linux/amd64のプラットフォームを利用する必要がある。

`Dockerfile.m1`と`docker-compose.m1.yml`をそれぞれ作った。

```Dockerfile.m1
FROM --platform=linux/amd64 mysql:5.7
# FROM mysql@sha256:77b7e09c906615c1bb59b2e9d7703f728b1186a5a70e547ce2f1079ef4c1c5ca

RUN echo "USE mysql;" > /docker-entrypoint-initdb.d/timezones.sql &&  mysql_tzinfo_to_sql /usr/share/zoneinfo >> /docker-entrypoint-initdb.d/timezones.sql

COPY ./my.cnf /etc/mysql/conf.d/my.cnf
```

`docker-compose.m1.yml`では`Dockerfile.m1`を指定するようにしている

```docker-compose.m1.yml
    mysql:
        build:
            context: .
            dockerfile: ./mysql/Dockerfile.m1
        environment:
            TZ: Asia/Tokyo
            MYSQL_ROOT_PASSWORD: root
            MYSQL_DATABASE: backend
        ports:
            - 13306:3306
        volumes:
            - mysql_volume:/var/lib/mysql
```

my.cnfは以下のようにしている。

```my.cnf
# MySQLサーバーへの設定
[mysqld]
# 文字コード/照合順序の設定
character_set_server=utf8mb4
collation_server=utf8mb4_bin

# タイムゾーンの設定
default_time_zone=SYSTEM
log_timestamps=SYSTEM

# デフォルト認証プラグインの設定
default_authentication_plugin=mysql_native_password

# mysqlオプションの設定
[mysql]
# 文字コードの設定
default_character_set=utf8mb4

# mysqlクライアントツールの設定
[client]
# 文字コードの設定
default_character_set=utf8mb4
```

## 参考

ありがとうございました。

https://qiita.com/yamagen0915/items/e84ae95066add052d15b
JavaScriptで個人的によく使う操作

## URLを操作
### URL各要素取得

``` JS 
let url = new URL(location);

let href = location.href;
let host = location.hostname;
let port = location.port;
let path = location.pathname;
let query = location.search;
let protocol = location.protocol;
```

###ブラウザー履歴エントリに state, title, url をセット
画面に更新をかけたくはない。
けどURLを更新したいというときに使ってます。

``` JS
const url = new URL(window.location);
url.searchParams.set('foo', 'bar');
window.history.pushState({}, '', url); 
```

### 参照

https://developer.mozilla.org/ja/docs/Web/API/History/pushState
nuxtjsにfabricjsを導入するときの手順

nuxtjsにfabricjsを導入するときの情報が少なかったのでそのメモです。

## 必要な項目のインストール

```
yarn add fabric
yarn add canvas
```

package.jsonとyarn.lockに追加される。

plugin直下に`fabric.js`ファイルを作成。

```fabric.js
import { fabric } from 'fabric'
import Vue from 'vue'

Vue.use(fabric)
export default fabric
```

nuxt.config.jsに情報を追加

```nuxt.config.js
  // Plugins to run before rendering page: https://go.nuxtjs.dev/config-plugins
  plugins: [
    {
      src: '@/plugins/fabric',
      mode: 'client'
    }
  ],
```

## 実際のコード

これは赤い四角形を表示するためのサンプル

```fabric/index.vue
<template>
  <canvas ref="can" width="200" height="200"></canvas>
</template>

<script>
import { fabric } from 'fabric';

export default {
  mounted() {
    const ref = this.$refs.can;
    const canvas = new fabric.Canvas(ref);
    const rect = new fabric.Rect({
      fill: 'red',
      width: 20,
      height: 20
    });
    canvas.add(rect);
  }
};
</script>
```

これで `localhost:3000/fabric`にアクセスすると以下のように赤い四角形が表示されているはず。

![Screen Shot 2021-08-15 at 1.28.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/5962b12c-26eb-1c21-9152-976d0b187c65.png)


## 参考

https://blog.csdn.net/weixin_45041261/article/details/106454711

https://stackoverflow.com/questions/42344356/how-can-i-set-up-fabric-js-in-vue
[Rails]redirect_toとrenderの違いについて

# はじめに
本記事では、redirectとrenderの違いについて記述しています。
私自身何気なく、コントローラーなどに記述しておりましたが、
改めて振り返りアウトプットしたいと思います。

# redirectとrenderの違い

```
redirect_to
↓
ルーティング
↓
コントローラー
↓
ビュー

```

```
render
↓
ビュー
```

随分あっさり書きましたが、このような違いです。

### redirect_to
redirect_toは新しくリクエストが送られてきた時と同じ流れになります。
そのため、同様に`ルーティング→コントローラー→ビュー`の流れになります。

### render
renderは、特にリクエストをされることがなく、そのまま直接ビューにいきます。

`redirect_toはコントローラーへ！`　`renderはビューへ！`ということですね。

## 例え

```ruby
class MessagesController < ApplicationController
.
.
省略
.
.
 
   def create
     @room = Room.find(params[:room_id])
     @message = @room.messages.new(message_params)
     if @message.save
       redirect_to room_messages_path(@room)　　　　　　　　←ここ
     else
       @messages = @room.messages.includes(:user)
       render :index　　　　　　　　←ここ
     end
   end
 
.
.
"省略"
.
.
end
```

`redirect_to`は、
`データを送信する時`（例えば、記事を投稿できた時、記事を編集できた時）
の場合などに使用されています。

今回の場合ですと、
メッセージが送れたら、ルーティング→コントローラー→ビュー`room_messages_path(@room)`ですね。
コントローラーへいくことでとモデルとも連携ができ、メッセージを情報として保存することもできます。（メッセージのテーブルがあれば）


`render`は、
`データの送信に失敗した時`（例えば、なんらかの項目が空白でログインができなかった時、記事が投稿できない時）
の場合などに使用されています。

今回の場合ですと、
送信に失敗したら、ビューへ`index`ですね。
メッセージ送信に失敗しているので、
イジワルな言い方をすると`もっかいやり直し〜（ビューへ）`という感じですね😇



# 終わりに
インプットの段階では、？？？でしたが、
簡単なアプリケーションで試してみると理解は深まると思い、コードを記述してみました。

他に、図を用いて理解を深めてらっしゃる記事もありましたので、
こちらを参考にしながらだと、なお理解は深まると思います。

[分かりやすい図がある記事](https://qiita.com/january108/items/54143581ab1f03deefa1)

[RailsGuide](https://railsguides.jp/layouts_and_rendering.html#redirect-to%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B)

明日は日曜日ですが、コツコツがんばります！！
OIDC (OpenID Connect) のフロー

## 1. OAuth同意画面の作成

- GCPコンソールから「APIとサービス」 > 「OAuth同意画面」を開く
- 「内部」 or 「外部」の選択 => 今回はテスト目的のため「内部」を選択
- アプリ名、ユーザサポートメール、デベロッパーの連絡先情報を埋める
- スコープを選択 => 今回はBigQuery APIを選択 (.../auth/bigquery)

## 2. OAuthクライアントIDの作成

- GCPコンソールから「APIとサービス」 > 「認証情報」を開く
- 「認証情報を作成」 > 「OAuthクライアントID」を選択
- アプリケーションの種類から「デスクトップアプリ」を選択

## 3. 認証リクエストの送信

### 認可エンドポイント

```
https://accounts.google.com/o/oauth2/v2/auth
```

### クエリパラメータ
ref. https://developers.google.com/identity/protocols/oauth2/openid-connect#authenticationuriparameters

- client_id=\<CLIENT_ID>
- response_type=code # インプリシットフローの場合はtoken
- scope="openid email" # OIDCの基本的なリクエストではopenidとemailが必要
- redirect_uri=\<REDIRECT_URI>

```shell
% CLIENT_ID=<CLIENT_ID>
% REDIRECT_URI=$(echo "urn:ietf:wg:oauth:2.0:oob" | nkf -WwMQ | sed 's/=$//g' | tr = % | tr -d '\n')
% SCOPE=$(echo "openid email" | nkf -WwMQ | sed 's/=$//g' | tr = % | tr -d '\n')
% echo "https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id=$CLIENT_ID&scope=$SCOPE&redirect_uri=$REDIRECT_URI"
```

出力されたURLをブラウザで開くとOAuth同意画面にリダイレクトされ、同意すると認可コードが取得できる。

![スクリーンショット 2021-08-15 1.09.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1177074/bf6acf9f-d2ba-c00e-301e-e11962fa7a59.png)

## 4. アクセストークン、IDトークンの取得

### トークンエンドポイント

```
https://oauth2.googleapis.com/token
```

### クエリパラメータ
- code=\<認可コード>
- client_id=\<CLIENT_ID>
- client_secret=\<CLIENT_SECRET>
- redirect_uri=\<REDIRECT_URI>
- grant_type=authorization_code


```shell
% CLIENT_SECRET=<CLIENT_SECRET>
% CODE=$(echo "4/1AX4XfWimLiJLj9Ru-bgcnG5zGhOcUtORu_uEEYSKRiHPTjpY6rW4Ua0Zdjw"|nkf -WwMQ|sed 's/=$//g'|tr = %|tr -d '\n')
% curl -XPOST 'https://oauth2.googleapis.com/token' -d "code=$CODE&redirect_uri=$REDIRECT_URI&client_id=$CLIENT_ID&client_secret=$CLIENT_SECRET&scope=&grant_type=authorization_code"
```

## 5. id_tokenのデコード

以下のサイトなどよりid_tokenをデコードして中身を確認できる。

https://jwt.io/
VSCodeにUSS(Unity style sheets)をシンタックスハイライトさせる

UnityのUIElementsを用いたエディタ拡張では\*.ussファイルを記述することがあります。
しかし、VSCodeでは標準で\*.ussにシンタックスハイライトがなく、もちろんフォーマッタも利用できません。
また、マーケットプレースにこれを解決するズバリな拡張機能を見つけることはできませんでした。(2021/08/15現在)

VSCodeに\*.ussと\*.cssを関連付けさせることで__シンタックスハイライト__をさせる方法を紹介したいと思います。

#settings.jsonを開く
`ctrl + shift + p`で開いたコマンドパレットに`settings.json`と入力してください。
![vscode_settings_json.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1891872/77b420da-7110-bf43-6986-f4453b125acc.png)
ちなみに、`基本設定：ワークススペースを開く（JSON）`を選択すると現在のプロジェクトのみに設定が反映されるようになります。

#settings.jsonを編集する

```json:settings.json
"files.associations": {
    "*.uss": "css",
}
```
上記の記述を`settings.json`へ追加することで\*.ussと\*.cssに関連付けがなされます。

#*.ussを編集する

![uss_colorpicker.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1891872/f515f9a0-6c76-d04d-c169-78343fc3ed2a.png)
\*.ussと\*.cssに関連付けがなされたため__シンタックスハイライト__されるようになりました。
また、これにより\*.css同様に__カラーピッカー__や__フォーマッタ__が利用できるようになりました。

#参照
[[VSCode] Language Identifiers](https://code.visualstudio.com/docs/languages/identifiers)
web会議が終わったら お礼メール自動作成　PADで業務をスリムに !

## メール作成の時間を圧縮したい!
　web会議、本当に多くなりましたよね。手軽に実施できる反面、日程調整でメール数往復。
　スケジューリングが大変だった会議ほど、終了後、毎回やっぱりメールでお礼を伝えたい。
　<font color="Red">**「web会議が終わり次第お礼メール作成」自動化できないかなぁ**</font>

## 「会議終わり次第　お礼メール自動作成」作ってみた

　Power Automate Desktopで作成　(今回はTeamsでのweb会議に限定)
　<iframe width="560" height="315" src="https://www.youtube.com/embed/6qKL_DMR2RY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

　<font color="Red">**クリックひとつで、Teams会議終了を察知して、お礼メールを自動生成することに成功!**</font>

　**PowerAtuomateDesktopフロー**
　　①Teamsの「web会議ウィンドウが閉じた」を検知
　　②Outlook起動　新規メール作成
　　③作成済のお礼本文と件名が自動入力　(宛先入力・送信は手作業)
![フロー.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793443/f90ec698-c132-a6e6-4813-89d7176e09cd.png)

## 技術面で工夫したところ

　会議中・・・Teamsウィンドウ2個　➡　終了・・・ウィンドウ1個　と考え
　「ウィンドウ2個の状態が消えたらOutlook起動」のアクションを当初組んだが、
　まれに会議中にウィンドウが3個になる場合があり、Outlookが起動してしまう。

![当初.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793443/93399644-3d7b-839e-84da-85a0161b95b0.png)

　ループや条件のアクションでは解決できなかったが、
　<font color="Red">**「ウィンドウが1個になったら起動」を追加し、ウィンドウが途中何個になっても、
　会議が終わってウィンドウが1個になった時点でOutlookを起動させることに成功!**</font>

![改善.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793443/c37dc5c7-845f-ce6a-d0a5-fbd7effb0283.png)

## 1クリック＆30秒でお礼メールの完成!!

　手入力でメールを作成すると、送付まで約180秒。月間10回web会議があるとして
　(30秒-180秒)×10＝1,500秒 つまり　<font color="Red">**月間約25分の業務スリム化に成功!**</font>
　1クリック後はほぼ作業がいらないので、<font color="Red">**空いた時間でちょっと気の利いた一言を添えよう!**</font>
　今後はzoomのweb会議にも対応したシステム開発にトライします!
現在のディレクトリ配下のファイル一覧を取得したい

目的
-------------------------
現在のディレクトリ配下のファイル一覧を出力したい。

コード
----------------------

```powershell
Get-ChildItem * -Recurse `
| Where-Object { ! $_.PSIsContainer } `
| Select-Object { (Resolve-Path $_.FullName -Relative).Remove(0,2) } 
```

参考文献
-------------------

コードを作成するにあたって参考にしたサイト。

- [ファイル一覧を取得し各ファイルの情報をCSV化する方法](https://win.just4fun.biz/?PowerShell/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E4%B8%80%E8%A6%A7%E3%82%92%E5%8F%96%E5%BE%97%E3%81%97%E5%90%84%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E6%83%85%E5%A0%B1%E3%82%92CSV%E5%8C%96%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)
- [Resolve-Path - Microsoft docs](https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.management/resolve-path?view=powershell-7)
- [Powershellで文字列を操作する方法まとめ](https://bgt-48.blogspot.com/2018/07/powershell.html#%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%9F%E4%BD%8D%E7%BD%AE%E3%81%8B%E3%82%89%E3%80%81%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%9F%E6%96%87%E5%AD%97%E6%95%B0%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B)
GitHubにいきなりPush出来なくなった件

#Pushしようと思ったら....
実装にひと段落していつも通りPushしようと思ったら。
Push出来ない！初めて見るエラー文が。

```
remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.
```

なるほど。わからん。
調べてみるとどうやらアクセスの方法が8月13日から変わったみたい。
知らなかったの焦りました。
パスワードから個人アクセストークンでのアクセス方法に！

#解決方法
1.パーソナルアクセストークンの発行
 GitHub にログインして右上の自分のアイコンをクリック → Settings → Developer settings → Peresonal access tokens　→　 Generate New Token
 →わかりやすい名前を付けて、repoにクリックを入れて、GenerateTokenボタンを押下。

2.キーチェーンに登録されている情報を更新
　新しく作成したアクセストークンを、キーチェインの情報に更新します。
①Spotlight で『キーチェーンアクセス』を開く
②github.com で検索
③「パスワードを表示」をクリックし
④表示されたパスワードをパーソナルアクセストークンで置き換えて保存
GitHub のパスワードをパーソナルアクセストークンに変更する【sourcetree】

# 現象
Githubにpushしようとしたら、下記エラーがでてpushできない。

```
Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.
fatal: unable to access 'https://john-doe@github.com/john-doe/foo-repository.git/': The requested URL returned error: 403
```

**エラーの意味**
2021年8月13日からパスワード認証のサポートは終了したので、[personal access token]に変えろ、とのこと。これまでgitHub.comのログインに使用しているパスワードで認証していたのですが、このパスワードを[personal access token]に変えないといけないみたいです。
（これ、かなりの人に影響があるのでは・・？）

**※注意※**
当方windows環境で、Gitクライアントにsourcetreeを使用しております。

## 作業環境
- windows10 64bit
- sourcetree 3.4.5(内臓gitバージョン：2.30.2)

## はまりポイント
- sourcetreeの認証情報が更新できない!  
今回はまった原因はこれです。認証方法をpersonal access tokenに変えようにもsourcetreeが変更してくれず・・

# 手順
**※注意※**
**手順6,7によりsourcetreeのユーザー設定がリセットされます。ローカルリポジトリの情報もリセットされるため、再度ローカルリポジトリはsourcetreeにAddする必要があります。当方はそれほど多くなかったのですべてAddしました。これを実施しないと認証情報が更新されないようです。**

１. GitHub の自分の Settings → Developer settings → Personal access tokensでトークンを生成
下記サイトの動画をみるとわかりやすいです。

https://dev.to/arjungautam/support-for-password-authentication-was-removed-518o

２. 生成したトークンをローカルに保存（トークンは再確認できないのでテキストファイル等で保存しておきましょう）
３. コントロールパネル → 資格情報マネージャーでWindows資格情報を選択
４．下記資格情報を削除
 `git:https//github.com`
`git:https://[アカウント]@github.com`
`sourcetree`から始まるものすべて
５．SourceTreeを閉じる
６．`C:\Users\ユーザ名\AppData\Local\Atlassian\SourceTree\ `にある下記のファイルを削除
・bookmarks.xml
・opentabs.xml
・userhosts
７．`C:\Users\ユーザ名\AppData\Local\Atlassian\SourceTree.exe<ランダム文字列>\<バージョン番号>\` にある下記ファイルを削除
・user.config
８．SourceTreeを起動
９．コードをGithubにpush
１０．認証情報の入力をもとめられるので、ユーザー名と、ステップ１で取得したトークンをパスワードに指定してOK

私はこれで成功しました。

# さいごに
私の環境で成功した手順なので当てはまらない方もいると思いますが、参考になれば幸いです。
【小ネタ】Ruby で new するたびにクラスインスタンス変数をインクリメントして、インスタンス変数にぶち込む

```Ruby
class BankAccount
  @current_account_number = 0

  def self.new(name)
    super(name, @current_account_number += 1)
  end

  attr_accessor :name
  attr_reader :account_number

  def initialize(name, account_number)
    @account_number = account_number
    @name = name
  end
end
```
rustの所有権と参照

Cと少し違うところがある感じがしたのでメモ。
前提として、Cでのポインタ、参照などを分かっていないと難しい。

# 所有権について
rustには所有権という概念がある。

String型など、ヒープによって確保されるデータ（コンパイル時にサイズが不明なデータとも言える）を変数に格納するとき、そのデータ __”そのもの”__ ではなく __”データのポインタ”__ が格納される。（Cでの文字列と同じ感じ。）

もし、下コードのように ```x``` がString型の変数であり、そこから ```y = x``` とするとき、```x, y```どちらも、同じ"データのポインタ"が格納される。

そして、rustは__スコープを抜けたら、メモリを開放する__という特徴がある。

もし```x, y```で同じポインタを持っているのであれば、同じメモリを解放しようとしてしまう。
これを防ぐためのものが__”所有権”__である。
```y = x``` としたときに___所有権がyに移る___、つまり__xは無効にされる__のである。
なので下コードはコンパイルが通らない。

```rust:main.rs
fn mov()
{
    // 前提　rustはスコープから抜けたらメモリを開放する
    let x = String::from("hello");
    let y = x;
    // この時、”所有権”がyに渡される
    // 渡されたらxは無効となる(開放するとき、xが有効だとx, yで同じアドレスを開放することになってしまう)
    // 所有権はポインタとは違う(参照ではない)
    println!("{}, {}", x, y);
    // この場合コンパイルエラーが発生(xを指定したため)
}
```

ちなみに__ヒープで確保されないデータ__（スタックで確保されるデータ、整数型など。）では、値がコピーされるので、下のコードのように

```rust:main.rs
fn cpy()
{
    let x = 5;
    let y = x;

    println!("{}, {}", x, y);
    //出力結果:5, 5
}
```
とすることができる。

# 所有権はそのままで、データを参照する
参照を使えば、所有権は移動しないで、値を見ることができる。

```rust:main.rs
fn mov()
{
    let x = String::from("hello");
    let y = &x;
    // yはxを参照する　所有権は移動しない
    println!("{}, {}", x, y);
    // 出力結果:hello, hello
    // この場合コンパイルエラーは発生しない
}
```

ここでは、```x```は__文字列データのポインタ__を持っており、```y```は__xへのポインタ__を持っている
つまり、__二重開放にならず、エラーを吐かない。__


~~ただし、ここでは参照なので、```x```の値が変化したら```y```も変化してしまう。~~
__借用されているのでそもそもxの値を変化できないです(&mutとか使えば違うのかもしれないですけど)。2か月前の自分変なこと書いてる...__

それが嫌なら、__depp copy__をすればいい。これでヒープデータが完璧にコピーされる。

```rust:main.rs
fn mov()
{    
    let x = String::from("hello");
    let y = x.clone();
    // yはxのdeep copyとなる　つまりhelloという文字列がメモリ空間に二つ確保される
    println!("{}, {}", x, y);
    // 出力結果:hello, hello
}
```

# まとめ
ヒープで確保されるデータ ... 一つのデータで、アドレスを参照することによってやりくり -> __ムーブ__
rustはこのようなデータはデフォルトでは一つでやりくりする？

スタックで確保されるデータ ... データを複製できる -> __コピー__

__所有権が移る = データがムーブされる__といった感じでいいのだろうか。

#参考
https://doc.rust-jp.rs/book-ja/ch04-01-what-is-ownership.html

https://doc.rust-jp.rs/book-ja/ch04-02-references-and-borrowing.html
rubyをバージョンアップしてrailsコマンドが使えなくなった時の対処法

rubyをバージョンアップしてrailsコマンドが使えなくなった時の対処法

railsコマンドを実行して
can't find gem railties (>= 0.a) with executable rails (Gem::GemNotFoundException)
上のエラーが出る時

gem install rails 
を実行すると解決する。
AtCoder Beginner Contest 214 参戦記

# AtCoder Beginner Contest 214 参戦記

過去最悪の順位をかろうじて更新しなくてすんだ程度の大爆死……….

## [ABC214A - New Generation ABC](https://atcoder.jp/contests/abc214/tasks/abc214_a)

1分半で突破. 書くだけ.

```python
N = int(input())

if N <= 125:
    print(4)
elif N <= 211:
    print(6)
else:
    print(8)
```

## [ABC214B - How many?](https://atcoder.jp/contests/abc214/tasks/abc214_b)

3分半で突破. 素直に3重ループしても *O*(10<sup>6</sup>) 程度で TLE しないので、素直にやれば良い.

```python
S, T = map(int, input().split())

result = 0
for a in range(101):
    for b in range(101):
        for c in range(101):
            if a + b + c > S:
                break
            if a * b * c > T:
                break
            result += 1
print(result)
```

## [ABC214C - Distribution](https://atcoder.jp/contests/abc214/tasks/abc214_c)

51分半で突破. TLE4、WA2. i番目のすぬけ君が初めて宝石をもらう時刻が最小となるスタート地点は1からNのどれか. 受け渡しリレーを2周すれば全てのすぬけくんに可能性があるスタート地点が必ず全て試されるので、2周回せば良い. 冷静に考えれば難しくなくて絶望.

```python
N = int(input())
S = list(map(int, input().split()))
T = list(map(int, input().split()))

result = T[:]
for _ in range(2):
    for i in range(N):
        j = (i + 1) % N
        x = result[i] + S[i]
        if result[j] > x:
            result[j] = x
print(*result, sep='\n')
```


## [ABC214D - Sum of Maximum Weights](https://atcoder.jp/contests/abc214/tasks/abc214_d)

突破できず. 重みの小さい頂点から順に繋いでいくと言われると「ああぁーーーっっっ」ってなりますね. 過去に類題解いているのに何故気づかない. C問題で爆死したのもやらかしだけど、こっちが解けなかったことのほうがやらかしな気がしてきた.

```python
from sys import setrecursionlimit, stdin


def find(parent, i):
    t = parent[i]
    if t < 0:
        return i
    t = find(parent, t)
    parent[i] = t
    return t


def unite(parent, i, j):
    i = find(parent, i)
    j = find(parent, j)
    if i == j:
        return
    parent[j] += parent[i]
    parent[i] = j


readline = stdin.readline
setrecursionlimit(10 ** 6)

N = int(readline())
uvw = [tuple(map(int, readline().split())) for _ in range(N - 1)]

result = 0
parent = [-1] * (N + 1)
for u, v, w in sorted(uvw, key=lambda x: x[2]):
    x = -parent[find(parent, u)]
    y = -parent[find(parent, v)]
    result += x * y * w
    unite(parent, x, y)
print(result)
```
Error: Cannot install under Rosetta 2 in ARM default prefix (/opt/homebrew)!

# エラーの発生状況
- macのM1チップのPCにおいて、homebrewを使ってインストールしようとしたら、上記タイトルのエラーが発生しました。

# 具体的なエラー発生の流れ

- 自分の場合、homebrewでaws-sam-cliをインストールしようとしたら、上記タイトルのエラーが発生しました。
- 以下のようにmacのターミナルにコマンドを入力しました。

```
$ brew tap aws/tap

$ brew install aws-sam-cli
Error: Cannot install under Rosetta 2 in ARM default prefix (/opt/homebrew)!
To rerun under ARM use:
    arch -arm64 brew install ...
To install under x86_64, install Homebrew into /usr/local.
```

# 解決方法

```
arch -arm64 brew install aws-sam-cli
```

- 上記、エラー発生時の英語のコメントで書いてある通りにbrewの前に、`arch -arm64`をつけて実行するだけで解決します。なお、`...`の部分が不親切な気がします。
- `aws-sam-cli`の部分は、自分のインストールしたいパッケージ名に変更して下さい。


# 参考サイト
- 詳細は以下のサイトに詳しく載っています。
- [https://shiro-changelife.com/cannot-install-under-rosetta/](https://shiro-changelife.com/cannot-install-under-rosetta/)

# 追記

- `brew install tree`を実行しても同様のエラーが出ました。
  - `arch -arm64 brew install tree`と入力して、解決しました。
- 他は確認してませんが、MacのM1チップのPCにおいて、`brew install ~`を実行すると、基本的にこのエラーが出るということみたいですね。
CentOS7にJava11インストール

#java11のパッケージを検索
「yum search」 コマンドでパッケージを検索します。

```:
sudo yum search java-11
(中略)
====================================== N/S matched: java-11 ===================
java-11-openjdk.i686 : OpenJDK Runtime Environment 11
java-11-openjdk.x86_64 : OpenJDK 11 Runtime Environment
java-11-openjdk-demo.i686 : OpenJDK Demos 11
java-11-openjdk-demo.x86_64 : OpenJDK 11 Demos
java-11-openjdk-devel.i686 : OpenJDK Development Environment 11
java-11-openjdk-devel.x86_64 : OpenJDK 11 Development Environment
java-11-openjdk-headless.i686 : OpenJDK Headless Runtime Environment 11
java-11-openjdk-headless.x86_64 : OpenJDK 11 Headless Runtime Environment
java-11-openjdk-javadoc.i686 : OpenJDK 11 API documentation
java-11-openjdk-javadoc.x86_64 : OpenJDK 11 API documentation
java-11-openjdk-javadoc-zip.i686 : OpenJDK 11 API documentation compressed in a single archive
java-11-openjdk-javadoc-zip.x86_64 : OpenJDK 11 API documentation compressed in a single archive
java-11-openjdk-jmods.i686 : JMods for OpenJDK 11
java-11-openjdk-jmods.x86_64 : JMods for OpenJDK 11
java-11-openjdk-src.i686 : OpenJDK Source Bundle 11
java-11-openjdk-src.x86_64 : OpenJDK 11 Source Bundle
java-11-openjdk-static-libs.i686 : OpenJDK libraries for static linking 11
java-11-openjdk-static-libs.x86_64 : OpenJDK 11 libraries for static linking
```

#java11をインストール
実行環境のみが必要な場合はopenjdkをインストールします。

```:インストール
sudo yum install -y java-11-openjdk.x86_64
```

開発をする場合はopenjdk-develをインストールします。

```:インストール
sudo yum install -y java-11-openjdk-devel.x86_64
```

インストール後、Javaのバージョンを確認します。

```:バージョン確認
$ java -version
openjdk version "11.0.12" 2021-07-20 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.12+7-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.12+7-LTS, mixed mode, sharing)
```
【Xcode】xcodeproj上で誤って追加してしまった URL Types を削除する

# どういうことか

追加するためのボタンはあるが削除するためのボタンはない。なんてことだ。

![248cc903ea66be3a1a26065ff5fd57d8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413699/67dbdb5c-adb5-df89-f458-03a6763543eb.png)

*なぜか文字が逆さまになっている*

## 解決策

**How to delete “URL Types” from Xcode?**
<https://stackoverflow.com/questions/43421130/how-to-delete-url-types-from-xcode>

**info.plist** で削除すればいいっぽい。
それでもプロジェクトファイルにおける **URL Types(n)** のカッコ内の数字は変わらないが、再起動すれば直る。

おわり(´・ω・｀)
[シリーズ] Ruby Elasticsearch 7.x client の使用例

# はじめに

Ruby の Elasticsearch Client を使って Elasticsearch 7.14 で REST API の操作する.
また、比較のために、Kibana DevTool でのクエリも合せて記しておく.

調査状況に応じて都度更新する予定です

|コンテンツ|掲載時期|
|:--|:--|
|[[000] Ruby の elasticsearch client パッケージを使って Elasticsearch 7.14 を操作してみる ... 検証環境構築編](https://qiita.com/robozushi10/items/8bd936fe6fbab080149e)|2021/08|
|[[001] クラスタ状態の取得 by Ruby elasticsearch 7.14](https://qiita.com/robozushi10/items/c8ae660cb6ae47317c59)|2021/08|
|[[004] マッピングの取得 by Ruby elasticsearch 7.14](https://qiita.com/robozushi10/items/427d20ce781cb6a4c446)|2021/08|
|[[010] ドキュメントを 10件だけ取得する by Ruby elasticsearch 7.14](https://qiita.com/robozushi10/items/b3c10aa0f82ad2fdf58a)|2021/08|
|[[014] ドキュメントの検索 by Ruby elasticsearch 7.14](https://qiita.com/robozushi10/items/3df2d742d17b03a4dac0)|2021/08|
|[[015] ドキュメントの AND による絞り込み検索 by Ruby elasticsearch 7.14](https://qiita.com/robozushi10/items/de6bc9fac3f30937eaea)|2021/08|
|[[016] ドキュメントの複数フィールドを使った AND による絞り込み検索 by Ruby elasticsearch 7.14](https://qiita.com/robozushi10/items/2f7ea1497629cc08ffff)|2021/08|
|[[017] ドキュメントの検索結果と該当件数の表示をする by Ruby elasticsearch 7.14](https://qiita.com/robozushi10/items/d259dd954ecef938d97e)|2021/08|
|[[030] ドキュメントを全件(11万件超)取得する by Ruby elasticsearch 7.14](https://qiita.com/robozushi10/items/4a0f44d215405eee27c8)|2021/08|
|[[035] ドキュメントの AND による絞り込み検索(「015」)の全件表示 by Ruby elasticsearch 7.14](https://qiita.com/robozushi10/items/57f6cb087d757a003be7)|2021/08|
5章 コンピュータアーキテクチャ(コンピュータシステムの理論と実装)

# はじめに

これは、「コンピュータシステムの理論と実装」(以下「Nand2Tetris」という)の第5章 コンピュータアーキテクチャのプロジェクトに対するレポートである。

Qiitaでは、画像の利用に制約があるため、論理回路図など掲載することは省いている。


# プロジェクトに対するレポート

## 目標
* 1章から3章で作成した論理回路を使い、Hackコンピュータの論理回路を作成する。

## 材料
* Nand2Tetrisで定義しているHDL言語
* ハードウェアエミュレータ

## 実装

### Memory
Hackの最終的なメモリ回路である。DMux8Wayを使うだけの分岐がないためDMuxで分岐している。
キーボードとの分岐をアドレスの13ビットのみで行うとRAM16Kでも不具合が出たため、14ビット目とAndをとっている。

```hdl:Memory.hdl
    // Put your code here:
    DMux(in=load, sel=address[14], a=w1, b=w2);
    And(a=address[14], b=address[13], out=w3);
    DMux(in=w2, sel=w3, a=w4, b=w5);
    RAM16K(in=in, load=w1, address=address[0..13], out=w6);
    Screen(in=in, load=w4, address=address[0..12], out=w7);
    Keyboard(out=w8); //w5
    Mux16(a=w7, b=w8, sel=w3, out=w9);
    Mux16(a=w6, b=w9, sel=address[14], out=out);
```

ハードウェアエミュレータを使い、Memory.Tstスクリプトを動作させると、途中キー入力を行った後、Comparison ended successfullyと表示された。

### CPU
HackのCPU回路である。CPUの回路図はすでに与えられているため、それをベースに作成する。
デコードフェーズは、CPUの回路図中のcのところに入るフラグの振り分けについて必要なものを解読している。
実行フェーズは、CPUの回路図のとおりに組み立てている。
フェッチフェーズは、JMP命令のときのALU出力フラグとのAndチェックを行う。大なりのフラグはないため、ALU出力フラグがともにゼロのときとする。

```hdl:Memory.hdl
    // Put your code here:
    //decode
    DMux(in=true, sel=instruction[15], a=w1, b=w2); //i bit w1: A_Inst w2: C_I\
nst
    And(a=w2, b=instruction[12], out=w3);
    And(a=w2, b=instruction[11], out=w4); //zx
    And(a=w2, b=instruction[10], out=w5); //nx
    And(a=w2, b=instruction[9], out=w6); //zy
    And(a=w2, b=instruction[8], out=w7); //ny
    And(a=w2, b=instruction[7], out=w8); //f
    And(a=w2, b=instruction[6], out=w9); //no
    And(a=w2, b=instruction[5], out=w10);
    Or(a=w1, b=w10, out=w11); // load ARegister
    And(a=w2, b=instruction[4], out=w12);     //load DRegister
    And(a=w2, b=instruction[3], out=writeM); //writeM
    And(a=w2, b=instruction[2], out=w13); // out < 0
    And(a=w2, b=instruction[1], out=w14); // out = 0
    And(a=w2, b=instruction[0], out=w15);  // out > 0
    //execute
    DRegister(in=w20, load=w12, out=w16);
    Mux16(a=instruction, b=w20, sel=instruction[15], out=w17);
    ARegister(in=w17, load=w11 ,out=w18, out[0..14]=addressM);
    Mux16(a=w18, b=inM, sel=w3, out=w19);
    ALU(x=w16, y=w19, zx=w4, nx=w5, zy=w6, ny=w7, f=w8, no=w9, out=w20, zr=w21\
, ng=w22, out=outM);
    //fetch
    DMux4Way(in=true, sel[0]=w21, sel[1]=w22, a=w23, b=w24, c=w25, d=w26);
    And(a=w15, b=w23, out=w27); // out > 0
    And(a=w14, b=w24, out=w28);// out = 0
    And(a=w13, b=w25, out=w29);// out < 0
    Or(a=w27, b=w28, out=w30);
    Or(a=w29, b=w30, out=w31);
    PC(in=w18, inc=true , load=w31, reset=reset , out[0..14]=pc);
```

ハードウェアエミュレータを使い、CPU.Tstスクリプトを動作させると、Comparison ended successfullyと表示された。

### Computer
最後に、メモリとCPUを接続しコンピュータを作成する。

```hdl:Computer.hdl
    // Put your code here:
    ROM32K(address=w5 ,out=w1);
    CPU(inM=w6, instruction=w1, reset=reset, outM=w2, writeM=w3, addressM=w4, \
pc=w5);
    Memory(in=w2, load=w3, address=w4, out=w6);
```

ハードウェアエミュレータを使い、各スクリプトを動作させると、Comparison ended successfullyと表示された。実行時間は以下の通りである。
第4章で作成したプログラムは、アセンブラ作成後確認する。

| スクリプト名 | 実行時間 |
|:-:|:-:|
| ComputerAdd | 13 |
| ComputerMax |  25 |
| ComputerRect | 63 |
[SQL] DELETE文の基本構文

## はじめに
前回に引き続き、今回はDELETE文の基本構文を記事にしていきます。
よろしくお願いします。

##DELETE文
DELETE文はテーブルの行を削除するためのものです。SELECTやUPDATEはピンポイントで列を指定して更新や取得できましたが、DELETEは行（レコード)を消してしまうという点が注意です。

基本は下記のとおりです。

```sql
DELETE
  FROM テーブル名
```

しかしながら上記だけで実行してしまうと、そのテーブルの中身が全て削除されてしまうので、普通はWHERE句と一緒に使います。UPDATEもそうでしたね。

下記のような家計簿テーブルがあるとします。

| 日付 | 費目 | メモ | 入金額 | 出金額 |
| --- | --- | ---- | ----- | ---- |
| 2021-08-02 | 食費 | パンを購入 | 0 | 300 | 
| 2021-08-03 | 食費 | 晩ご飯材料 | 0 | 1000 |
| 2021-08-08 | 交通費 | 電車代 | 0 | 520 |
| 2021-08-13 | 給料 | 7月分給料 | 250,000 | 0 |
| 2021-08-13 | 食費 | 外食 | 0 | 7000 |

これをDELETEで8/3の晩ご飯材料を消してみます。

```sql
DELETE
  FROM 家計簿
 WHERE 日付 = '2021-08-03'
```

こうするとWHEREで指定した行(レコード)がまるまる消えます。

| 日付 | 費目 | メモ | 入金額 | 出金額 |
| --- | --- | ---- | ----- | ---- |
| 2021-08-02 | 食費 | パンを購入 | 0 | 300 | 
| 2021-08-08 | 交通費 | 電車代 | 0 | 520 |
| 2021-08-13 | 給料 | 7月分給料 | 250,000 | 0 |
| 2021-08-13 | 食費 | 外食 | 0 | 7000 |


参考: スッキリわかるSQL入門
Docker 環境別 CacheMount を用いた依存install

DockerにはCacheMountという機能がある。

ものすごく雑に言うと`docker build`が爆速になるし、いちいち`RUN`の最後でcacheを消すことをしなくて良くなる神機能だ。

https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/syntax.md#run---mounttypecache

機能の概要は https://kotaroooo0-dev.hatenablog.com/entry/2020/06/19/110150

> BuildKitの--mount=type=cacheによるキャッシュ

のところで解説されている。
この記事は、この機能がexperimentalだったときに書かれていたものだが、DockerEngineリリースノートによると

https://matsuand.github.io/docs.docker.jp.onthefly/engine/release-notes/

> 20.10.0

> buildkit,dockerfile: Support for RUN --mount options without needing to specify experimental dockerfile #syntax directive. moby/buildkit#1717

とあるので、Version 20.10.0時点でexperimentalではなくなった。
Dockerfileの一行目に書く`#syntax`も書かなくて良くなったらしい。

cacheディレクトリの内容はイメージレイヤーに残らないが、空ディレクトリ自体は残ってしまう模様。

## cacheを削除するのは

```
docker builder prune --filter type=exec.cachemount
```

ちなみに

```
docker system df -v
```

で確認可能。

## Dockerのツール別の動作報告

###  Docker Desktop for Mac
初期設定のまま`experimental: false`でも、何もしなくてもうごいた。

### Github actions

この記事を書いている時点の[GithubActionsのUbuntu環境](https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu2004-README.md)では、`DOCKER_BUILDKIT=1`を設定する必要があった。
ちなみにBUILDKITのlogは、ciのレポートとしては読みにくいので `--progress=plain` をつけると良い

`--cache-from`の利用元のイメージを生成するときは、build時に`docker build --build-arg BUILDKIT_INLINE_CACHE=1 .`というようにINLINE＿CACHEオプションを有効化しないと、**cacheとして扱えない地雷があるので注意**
https://github.com/moby/moby/issues/39003

## no cache install が不要になった

以前まで
https://qiita.com/hikaruna/items/e049e53b0147e37db977

という記事を書いていたが、今回のCacheMount機能によりこれは不要になった。代わりにCacheMountを用いたレシピを書き溜めたい。

### apt

```
FROM ubuntu

RUN \
  --mount=type=cache,target=/var/cache/apt \
  --mount=type=cache,sharing=locked,target=/var/lib/apt \
  apt-get update && apt-get install -y \
    *
```

[参考](https://medium.com/nttlabs/docker-v18-09-%E6%96%B0%E6%A9%9F%E8%83%BD-%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%83%93%E3%83%AB%E3%83%89-%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3-9534714c26e2)

[sharing=lockedの参考](https://github.com/moby/buildkit/issues/1662#issuecomment-683962222)


### npm

```Dockerfile
# Dockerfile
FROM node

WORKDIR /app
COPY package.json yarn.lock ./
RUN \
  --mount=type=cache,target=/tmp/npm_cache \
  npm_config_cache=/tmp/npm_cache \
  npm install
```

編集リクエスト歓迎

### yarn

```Dockerfile
# Dockerfile
FROM node

WORKDIR /app
COPY package.json yarn.lock ./
RUN \
  --mount=type=cache,target=/tmp/yarn_cache \
  YARN_CACHE_FOLDER=/tmp/yarn_cache \
  yarn install
```

- [yarn cache folder指定方法](https://classic.yarnpkg.com/en/docs/cli/cache/#toc-change-the-cache-path-for-yarn)

### gem
```Dockerfile
# Dockerfile
FROM ruby

RUN \
  --mount=type=cache,target=/usr/local/bundle/cache \
  gem install *
```

### bundler

```Dockerfile
# Dockerfile
FROM ruby

WORKDIR /app
COPY Gemfile Gemfile.lock ./
RUN \
  --mount=type=cache,target=/usr/local/bundle/cache \
  bundle install
```

### yum

TODO
編集リクエスト歓迎
racket-layerでYasnippetsが補完候補に出ない問題の対応

`.spacemacs` に下記の記述をした場合

```elisp
(setq-default dotspacemacs-configuration-layers
              '((auto-completion :variables
                                 auto-completion-enable-snippets-in-popup t)))
```


emacs-lisp-modeではYasnippetsのコードが補完候補に現れるが、racket-modeでは補完候補に現れなかった。


## 仮説
`packages.el` で呼ぶべき`spacemacs|add-company-backends` をracket-modeでは呼び出していない？

たとえばemacs-lispでは下記の箇所でマクロ呼び出しを行っている。
https://github.com/syl20bnr/spacemacs/blob/develop/layers/%2Blang/emacs-lisp/packages.el#L80-L81

## 解決法
.spacemacsの user-config セクションで明示的にマクロを呼び出すように設定を行った。

```elisp
(defun dotspacemacs/user-config ()
    (with-eval-after-load 'racket-mode
      (spacemacs|add-company-backends :backends company-capf
                                      :modes racket-mode))
)
```

`M-x describe-variable` で `company-backends` の値は下記のようになった

```
Value:
((company-capf . #1=(:with company-yasnippet))
 (company-semantic company-dabbrev-code company-gtags company-etags company-keywords . #1#)
 (company-files . #1#)
 (company-dabbrev . #1#))

```
Github push出来ない件について

#GitHubは2021/8/13を持ってパスワード認証の廃止するようです。

`git push origin <branch>`を実行すると、ベーシック認証を使用してる際は、下記のようなエラーが表示するようになっております。

```:エラー内容
remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.

```
上記を見ると2021年8月13日にパスワード認証のサポートを廃止するようで、代わりに個人用アクセストークンをご利用してくださいとのことです。

#個人アクセストークンの発行方法
1. Githubにログインして下記を開いてください。
2. Settingsをクリック
3. Developer settingsをクリック
4. Personal access tokensをクリック(https://github.com/settings/tokens)
5. Generate new tokenをクリック
6. token名を決めnoteに入力
7. 権限を設定
8. Generate tokenをクリック
9. トークン情報はコピーしてください ＊ページを離れると参照不可になるので気を付けてください
10. コピーしたトークン情報をパスワードの代わりに使用してください

##キーチェインの情報更新
1. Spotlight でキーチェーンアクセスを開く
2. github.com で検索
3. インターネットパスワードと記載されているレコードを開く
4. パスワードを表示をクリックし、表示されたパスワードをパーソナルアクセストークンで置き換えて保存

以上となります。
CentOS7にApacheインストール

# Apache インストール

下記コマンドをroot権限で実行する

```:インストール
# yum -y install httpd
```

下記コマンドでインストールされた Apache のバージョンを確認することができます。

```:バージョン確認
# httpd -version
Server version: Apache/2.4.6 (CentOS)
```

# Apache 起動

下記コマンドで起動します。

```:起動
# service httpd start
```

起動を確認します。
「Active: active (running)」となっていればオッケーです。

```:起動確認
# systemctl status httpd.service
httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled)
   Active: active (running) since Mo 2021-08-09 13:29:12 CEST; 4s ago
```

# Apache 停止

下記コマンドで停止します。

```:停止
# service httpd stop
```

# Apache 再起動

下記コマンドで再起動します。

```:再起動
# service httpd restart
```

# 自動起動の設定

サーバを起動した際に自動的に Apache を起動したい場合は、以下の手順で設定します。
まずは現在の設定を確認します。

```:設定確認
# systemctl is-enabled httpd
disabled
```

下記のコマンドで自動起動を設定します。

```:自動起動有効
# systemctl enable httpd.service
```

設定されたことを確認します。

```:設定確認
# systemctl is-enabled httpd
enabled
```

自動起動を無効にする場合は下記コマンドを実行

```:自動起動無効
# systemctl disable httpd.service
```

# firewalldのポート(80番)開放

CentOS 7 の初期状態では firewalld というファイアウォールが起動しており、http(80番ポート)が開放されていないため、開放する必要がある。
まずは下記コマンドで firewalld の起動状態を確認。active (running)となっている。

```:起動確認
# systemctl status firewalld
firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
   Active: active (running) since Di 2021-08-10 16:40:55 CEST; 26min ago
```

次に下記コマンドで firewalld の設定内容を確認する。
「services:」に「http」が存在しない。

```:設定確認
# firewall-cmd --list-all
public (default, active)
  interfaces: enp0s3 enp0s8 enp0s9
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:
```

下記コマンドでhttp(80番ポート)を開放する。

```:ポート開放
# firewall-cmd --zone=public --add-service=http --permanent
success
```

firewalld の設定再読み込み。

```:再読み込み
# firewall-cmd --reload
success
```

再度、 firewalld の設定内容を確認する。
「services:」に「http」が追加されている。

```:設定確認
# firewall-cmd --list-all
public (default, active)
  interfaces: enp0s3 enp0s8 enp0s9
  sources:
  services: dhcpv6-client http ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:
```
業務効率を目的にPythonを勉強します

プロになりたいわけではありませんが、ちょっとした処理を効率化するためにデータサイエンスを学ぼうと思います。
Rは大学院生のときに使っていた経験がありますが、pythonは未経験です。以下のページなどいろいろ見ていると、高度な統計処理をしたいわけではないならpythonで十分のようです。

https://otona-study.site/2021/08/12/r-python_comparison/
https://otona-study.site/2021/08/13/datascience/
https://otona-study.site/2021/05/23/datascience_statistics_summary/

独学でちまちま進めるのも楽しいですが、短期集中でやった方が身に付くので最初だけオンライン講座を受講しようと思います。
HDF5について①　〜Quick Start Guide〜

備忘録です。かなり初心者なので、どしどしご指摘お願いします。
https://docs.h5py.org/en/latest/index.html
Quick Start Guide
を参考にしています。

###1.HDF5とは（超ざっくり）
HDFとは"Hierarchical Data Format"の略であり、ファイル形式の一種。イメージ的には、HDF5ファイルひとつに、フォルダ（ディレクトリ）＆ファイルをしまうことができるイメージ。


###2.HDF5の中身
中に入っているオブジェクトは、ディレクトリ的存在の「groups」とNumpy配列のような「datasets」の2種類に大別できる。

####2-1中身を確認するコード（Anaconda）
私はAnacondaを使用しています。
まず、rootにあるオブジェクトの確認。

```py
#準備:h5pyパッケージ&HDF5ファイルの読み込み
import h5py
f = h5py.File('読み込むファイル名.h5','r')

#今いる階層内にあるオブジェクトのリストを表示
list(f.keys())
#こっちでも○
for name in f:
   print(name)
```
次に、個別のデータセットの情報確認

```py
dset = f['データセット名'] #準備
dset.shape #データセット（配列）の形確認
dset.dtype #データセット（配列）のタイプ確認
dset.name  #オブジェクトのいる階層確認
```
などができる。
ちなみに、データ階層は/で区切られ、トップの階層はrootといい、"/"と表される。



####2-2データを作成するコード（Anaconda）
こっちを先に書くべきだったかもしれません。hdf5ファイル・group・datasetの作成についてです。

```py
f=h5py.File("mytestfile.hdf5","w")#ファイル作成。'w'は、初期化・新規作成。
dset=f.create_dataset(name="mydataset",shape=(100,),dtype='i')#データセットの作成(root直下）
grp = f.create_group("subgroup")#（サブ）グループの作成
dset2 = grp.create_dataset("another_dataset", (50,), dtype='f')#サブグループ内にデータセット作成
```
また、次のようにパスをフルで書いてもいける

```py
dset3 = f.create_dataset('subgroup2/dataset_three', (10,), dtype='i')
```
#####（補足）Attributes
2−1で、HDF5の中身はgroup＆datasetに大別できると書きましたが、Attributesというものもあるらしいです。イメージ的には、データのすぐ隣りにあって、データ属性を示すもの？（自信ないです）


####2-3中身を確認するコード（Ubuntu）
```
h5dump -H ファイル名.h5   #ヘッダーの情報を返す
h5dump -n ファイル名.h5   #データセットの情報を返す
```
ヘッダーが何なのかはよく分かっていないので勉強してきます。
ROS2 FoxyでRealSenseの環境構築（ubuntu20.04）

#パッケージインストール for Ubuntu 16/18/20 LTS

```
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE || sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE
sudo add-apt-repository "deb https://librealsense.intel.com/Debian/apt-repo $(lsb_release -cs) main" -u
sudo apt-get install librealsense2-dkms
sudo apt-get install librealsense2-utils
sudo apt-get install librealsense2-dev
sudo apt-get install librealsense2-dbg
sudo apt-get update
sudo apt-get upgrade
```
#起動確認

```
realsense-viewer 
```
右上にFirmware Update Recommended!と表示された場合はinstallをクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620517/2b6d0b34-f841-df6f-5561-808dcefb2a68.png)



###ROS2関連パッケージインストール
```
sudo apt-get install ros-foxy-cv-bridge ros-foxy-librealsense2 ros-foxy-message-filters ros-foxy-image-transport
sudo apt-get install -y libssl-dev libusb-1.0-0-dev pkg-config libgtk-3-dev
sudo apt-get install -y libglfw3-dev libgl1-mesa-dev libglu1-mesa-dev

mkdir -p ~/realsense_ws/src
cd ~/realsense_ws/src/
git clone https://github.com/IntelRealSense/realsense-ros.git -b foxy
git clone https://github.com/IntelRealSense/librealsense
cd librealsense/
git checkout  remotes/origin/ros2debian 

cd ~/realsense_ws/
colcon build 
source ~/realsense_ws/install/local_setup.bash
```
#起動確認（ターミナル１）
```
ros2 launch realsense2_camera rs_launch.py 
```

#起動確認（ターミナル２）
```
source ~/realsense_ws/install/local_setup.bash
ros2 run rqt_image_view rqt_image_view 
```
topicを切り替えて確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620517/41891048-1a22-e45d-104d-fe17efc8405f.png)
GitHubで個人アクセストークンによりHTTPS接続したい男

いつものようにGit操作をしていたら、以下のようなエラーが出現しました。

```
remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.
fatal: unable to access 'https://github.com/hogehoge/fugafuga.git/': The requested URL returned error: 403
```

『なんやなんや...?』

ああ、、そういえばGitHubでは2021年8月13日に**パスワード認証が廃止された**のでした。

これにより今後はベーシック認証ができなくなり、認証が必要なGitHub操作ではトークンベースの認証が必要となりました。
すなわち、「今までのログインパスワード」の代わりに「個人アクセストークン」を使用する必要があります。

今回の変更により代用となる認証方法は
1. 個人アクセストークンによるHTTPS
2. SSH
などが挙げられます。

今回はSSHについては割愛し、「個人アクセストークンによる認証」について記します。

## 解決する手順

1. GitHubの個人アクセストークンの生成・取得
2. 認証情報を更新する

### 1. GitHubの個人アクセストークンの生成・取得

GitHubの「Personal access tokens」の設定画面を開きます。

https://github.com/settings/tokens

設定済みの個人アクセストークンの一覧画面が表示されます。
ここでは新しい個人アクセストークンを作成するために右上の「Generate new token」を選択します。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618097/17cc0559-514e-3ae6-7f13-95ad54d40519.png)
新しく生成する個人アクセストークンの名前とスコープを決定します。ここでは`repo`をスコープに定めて作成します。
※より詳細なスコープの説明に関しては[こちら](https://docs.github.com/en/developers/apps/building-oauth-apps/scopes-for-oauth-apps)を参照。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618097/47b1e8c0-74d3-a828-205d-e166cac4c101.png)
「Generate token」を押し、トークンの作成を行います。
![スクリーンショット 2021-08-14 21.03.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618097/801081ee-29a4-aca7-3bf3-5e970095cbc0.png)
トークンが作成できました。

なお、ここで生成され表示されたトークン文字列は**別ページに遷移するなどすると見られなくなります**。
コピーなどで保存しておくことを強く推奨します。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618097/0c9011dc-dc5f-30db-578e-459d901a2208.png)
これで個人アクセストークンの生成ができました。

今後は、`git clone`などの操作でパスワードを求められた場合には**今回取得した個人アクセストークンを使用する**ようにしてください。以前までのログインパスワードでは無効となります。

```
$ git clone https://github.com/username/repo.git
Username: your_username
Password: your_token
```

### 2. 認証情報を更新する

`git push`などの操作をしてもユーザ名とパスワードの入力が求められない場合があります。これは情報がコンピュータにキャッシュされていることが原因だと考えられます。
GitHubを使用している多くのユーザは、このような状態になっているのではないでしょうか。

そこで古いパスワードを今回作成したトークンに更新するため、キーチェーンにて情報の更新を行います。

ここでは、macOSのキーチェーンから認証情報を更新します。
`command`+`space`を押し「キーチェーンアクセス」と入力しページを開きます。
![スクリーンショット 2021-08-14 21.40.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618097/c0483465-ffcb-ddc2-be39-7af6556fb1c8.png)
次に右上の検索で「github.com」と検索して、種類が「インターネットパスワード」となっているものを開きます。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618097/2eb5194e-3654-647f-120e-399298fdfd6a.png)
ここで「パスワードを表示」をクリックし、既に入力されているパスワードを消去して先ほど取得した「個人アクセストークン」に置き換えて保存します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618097/251f40dc-f379-e1b6-169c-25fb6494b8b3.png" width=70%>
これでパスワード情報の更新は完了です。
`git fetch`などの操作で確認してみてください。

参考）
https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token


## 最後に
初投稿になります。
分かりにくい表現や間違っている箇所など多々あるかもしれませんが、優しい眼差しと鋭いマサカリをお待ちしております。
[OAuth2] インプリシットグラントフロー

## 1. OAuth同意画面の作成

- GCPコンソールから「APIとサービス」 > 「OAuth同意画面」を開く
- 「内部」 or 「外部」の選択 => 今回はテスト目的のため「内部」を選択
- アプリ名、ユーザサポートメール、デベロッパーの連絡先情報を埋める
- スコープを選択 => 今回はBigQuery APIを選択 (.../auth/bigquery)

## 2. OAuthクライアントIDの作成

- GCPコンソールから「APIとサービス」 > 「認証情報」を開く
- 「認証情報を作成」 > 「OAuthクライアントID」を選択
- アプリケーションの種類から「ウェブアプリケーション」を選択
  - 承認済みの JavaScript 生成元 : https://example.com
  - 承認済みのリダイレクト URI : https://example.com/oauth2redirect

## 3. アクセストークンの取得

### 認可エンドポイント

```
https://accounts.google.com/o/oauth2/v2/auth
```

### クエリパラメータ
- client_id=\<CLIENT_ID>
- scope=https://www.googleapis.com/auth/bigquery
- redirect_uri=https://example.com/oauth2redirect
- response_type=token # インプリシットグラントフローの場合はtoken

```shell
% CLIENT_ID=<CLIENT_ID>
% REDIRECT_URI=$(echo "https://example.com/oauth2redirect" | nkf -WwMQ | sed 's/=$//g' | tr = % | tr -d '\n')
% SCOPE=$(echo "https://www.googleapis.com/auth/bigquery" | nkf -WwMQ | sed 's/=$//g' | tr = % | tr -d '\n')
% echo "https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=$REDIRECT_URI&response_type=token&client_id=$CLIENT_ID&scope=$SCOPE"
```

出力されたURLをブラウザで開いて認証及び認可するとリダイレクトURIのハッシュパラメータにアクセストークンが含まれている。

```
https://example.com/oauth2redirect#access_token=<access_token>&token_type=Bearer&expires_in=3599&scope=https://www.googleapis.com/auth/bigquery
```

## 4. アクセストークンの取り消し

```shell
curl 'https://accounts.google.com/o/oauth2/revoke?token=<access_token>'
```