OmniAICreator/Qiita-1.07M huggingface dataset:
Azure Databricks で 個人データ保護のために UUID を利用してみました

## 概要

個人を特定できるデータをそのまま公開するわけにはいかないので、その個人毎にユニークなランダム文字列（UUID利用）を付与することにより、データ処理できるようにする方法となります。

### ローカル環境

- macOS Monterey 12.1 
- python 3.8.3
- Azure CLI 2.28.0

### 前提条件

1. Azure環境がすでに用意されていること（テナント/サブスクリプション）
2. ローカル環境に「azure cli」がインストールされていること
3. Azure Databricks の Workspace 上で Notebook が稼働できていること。

---

## 事前準備

### データファイルのアップロード

1. 対象の Workspace の Azure Databricks ポータルで [Import & Explorer Data] を選択します
2. 「Drop files to upload, or click to browse」に対象のファイルをドラッグ＆ドロップします
3. 「DBFS」タブを選択し、「FileStore - tables」フォルダ配下にドロップしたファイル（SE_Account.csv）を確認することができます

---

## Notebook の実装

#### 対象ファイルの読込（データの抽出）

```python:cmd_1

# 対象データの確認
display(dbutils.fs.ls("/FileStore/tables/"))

# csv型式のデータファイルをDataFrameとして読取る
sdf = spark.read.csv('/FileStore/tables/SE_Account.csv', header='true', inferSchema='true', encoding='utf-8')
display(sdf)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/9a2bda0c-5d7f-505e-9895-7fca42e1a14c.png)


#### SE毎にユニークなUUIDの付与

```python:cmd_2
import uuid

# PySpark Dataframes から Pandas への変換
pdf = sdf.toPandas()

# カラム['U_Name']を新規作成し、UUIDを割り当てる
pdf['U_Name'] = [str(uuid.uuid4()) for x in range(len(pdf))]
display(pdf)

# 不必要なカラムの削除後、Pandas から PySpark Dataframes への変換
df = spark.createDataFrame(pdf.drop(['J_Name', 'E_Name', 'Name', 'mailaddress'], axis = 1))
display(df)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/ac5e2c94-3ba1-93f2-d173-69cc5d4290f2.png)


---

### まとめ

データ分析を実施するにあたり、データの匿名性が大事ということに気が付き、今回の記事を記載。ただ、かなり社内よりの内容なので、忘備録のような扱いになってしまいました、、、、、

### 参考記事

以下の記事を参考にさせていただきました。感謝申し上げます
[pandas DataFrameの新しい列にuuidを追加します](https://www.webdevqa.jp.net/ja/python/pandas-dataframe%E3%81%AE%E6%96%B0%E3%81%97%E3%81%84%E5%88%97%E3%81%ABuuid%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%99/836104350/)
[Python Random Module: Generate Random Numbers and Data](https://pynative.com/python/random/)
testcafeでスクショを撮ってみる


#はじめに
testcafeでスクショを撮ってみるまでの道のり。

# 最終更新日
2021年1月13日

# 環境の情報
OS
Ubuntu20.04


# 注意
最新の状態を確認して下さい。
testcafeの環境構築は完了済の前提です。

# 公式はこちら
https://testcafe.io/
https://testcafe.io/documentation/402635/getting-started
https://testcafe.io/documentation/402675/reference/test-api/testcontroller/takescreenshot


#参考さま
https://www.dcom-web.co.jp/lab/test/try_testcafe


# 基本的な使い方

testcafeの使い方は、ものすごくシンプルです。

```
①testcafeを導入する。
環境構築する。
↓
②テストするコードのjsファイルを書く。
↓
③保存する。
↓
④ファイルをコマンドで動かす。
↓
⑤問題無いか、確認する。
```

# 具体的な例

#####バージョンを確認します。
testcafeは入っていますね。

```
$ testcafe -v
1.17.1
```

↓

#####フォルダを作ります。
どこかにフォルダを作りましょう。
例として、デスクトップにでも、作ってみます。

```
~$ cd デスクトップ
~/デスクトップ$ ls
~/デスクトップ$ mkdir testcafetest
~/デスクトップ$ cd testcafetest/
~/デスクトップ/testcafetest$ ls
```
↓

#####ファイルを作ります。
名前はなんでもいいので、jsフォルダを作ります。
試しにtest.jsにでもしてみます。

```
$ vi test.js
$ ls
test.js
```
↓

#####ファイルの中身を作ります。
test.jsの中身をこのように書きます。

```test.js
import { Selector } from "testcafe";

fixture`Getting Started`.page`http://devexpress.github.io/testcafe/example`;

test("My first test", async (t) => {
	await t
		.typeText("#developer-name", "John Smith")
		.click("#submit-button")
		.takeScreenshot("スクショ.png");
});

```

↓

#####保存します。

↓

#####動かしてみます。
このように書きます。

```
$ testcafe chrome test.js
```

↓

#####このような画面が出ていれば大丈夫です。
![Screenshot from 2022-01-13 22-25-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148394/beeb12ea-deb3-fbd6-97a9-85e1ab57d023.png)



![Screenshot from 2022-01-13 22-23-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148394/3bbb8c3c-3d7b-48d7-d883-2246e4b773e2.png)

↓

#####無事に撮れていると
このように出ます。

```
 Running tests in:
 - Chrome 96.0.4664.45 / Linux 0.0

 Getting Started
 ✓ My first test


 1 passed (4s)
```
↓

#####スクショ確認する
フォルダ内に、スクショがあることを確認して下さい。


![Screenshot from 2022-01-13 22-31-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148394/034beb5b-9b24-370f-f277-d5bdd896f5e9.png)

![Screenshot from 2022-01-13 22-31-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148394/09afa6a1-ebae-238f-b21f-31ef8bdcd527.png)


#こちらが撮れたスクショ
じゃーん
![スクショ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148394/05d10d67-97fe-6c45-f3d1-d1298ba312b7.png)
かっこいいエクスプローラーを使う

#かっこいいexplorerを使う
##対応OS

- Windows10 バージョン1809以降

※2018年10月頃のアップデートなので基本的にだいたいのパソコンはOkなはず

- Windows11

##どんなものか
``Files``というファイルマネージャー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/890310/2c50ef64-8a5e-e64e-166f-868a362a1737.png)

画面はこんな感じ

デザイン言語「Fluent Design System」にも準拠しているらしい．

左の列にクラウドストレージもしっかりと表示されるし，なんならwslも表示されます．毎回``\\wsl$``とか入力する必要もないです．

エクスプローラーを上書きすることも可能で，``Win+e``のショートカットでこのソフトが開くようになったり，デスクトップのショートカットからフォルダを開くこともできるようになります．ただ，上書きした場合，検索からエクスプローラーを開くことも可能なのですが，フォルダを開こうとしてダブルクリックしたとしても``Files``上で開くなるようになるので注意．

タブがある感じのやつです．
ショトカは``Ctrl+W``など

ちなみに，ちゃんと一瞬で開きます．

※設定は自分好みにしましょう．ちゃんと日本語です（ほとんど）

##インストール
https://www.microsoft.com/store/apps/9NGHP3DX8HDX

これを入手するだけです．あとは設定を自分好みにします．

![2022-01-13 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/890310/5221ae6c-6aac-57eb-bd42-3f7f00fd32de.png)

#参考
https://github.com/files-community/Files
(愚痴)renderやredirect_toの後に書かれた後続処理がケアしないと実行されちゃうってセンス悪いと思う

Slack通知とか非同期処理やページレンダリング後にやって良いことを書けるようにすることは必要だけど、その仕組みは使いたいときに使える仕組みのほうが良いと思う。

なぜならrenderやredirect_toを複数書いたり先に書くケースなんて早期リターンみたいなケースがデフォルトだから。
早期リターン時は後続処理をしてほしくないからその記載をしている。

それにもかかわらず、非同期とかをできるようにするために、多数派の早期リターン的なことを実現するために`redirect_to and return`とかを書かなければいけない、手続き的にデフォルト以外の記法を求められるのはセンスが悪い。
それも呼び出されたコントローラーのpublicメソッドの中で（=切り出された関数で書いてはいけない）書かなければならないのは辛い。
Controller内のrenderやredirect_toなんて、raise並の優先度なんだから。

非同期とかできるようにするなら、デフォルトではなく、メソッドの引数に特殊な引数設定するとか、そのメソッドだけインスタンス変数とかヘルパーの変数でtrueにするとか、特殊なことやりたいときに設定できるようにしてほしい。


まぁこんな愚痴を書いても発信力もなければ、Railsのコミッターにつながる能力もなく自分もコミッターにならないので、垂れ流されるだけの意見だけど。
rails db:migrateを実行すると、Warning: the running version of Bundlerと警告が出る

データベースを更新し、usersデータモデルを作成するために下記を実行したところ、、

```
% rails db:migrate

Warning: the running version of Bundler (2.2.32) is older than the version that created the lockfile (2.2.33). We suggest you to upgrade to the version that created the lockfile by running `gem install bundler:2.2.33`.
```

と警告が出る。

↓
```
% gem install bundler:2.2.33

Fetching bundler-2.2.33.gem
Successfully installed bundler-2.2.33
Parsing documentation for bundler-2.2.33
Installing ri documentation for bundler-2.2.33
Done installing documentation for bundler after 3 seconds
1 gem installed
```

この状態で再度　rails db:migrate　を試すも、、

```
 % rails db:migrate
Running via Spring preloader in process 1788
== 20220110000241 CreateUsers: migrating ======================================
-- create_table(:users)
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

you can't redefine the primary key column 'id'. To define a custom primary key, pass { id: false } to create_table.
/Users/chiharatomoya/Desktop/portfolio/mo-vie/db/migrate/20220110000241_create_users.rb:4:in `block in change'
/Users/chiharatomoya/Desktop/portfolio/mo-vie/db/migrate/20220110000241_create_users.rb:3:in `change'
<internal:/Users/chiharatomoya/.rbenv/versions/3.0.3/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
<internal:/Users/chiharatomoya/.rbenv/versions/3.0.3/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
-e:1:in `<main>'
```

調べてみたのですが、idをわざわざ定義しようとしなくても、勝手にidは反映されるので再定義しなくていいとのこと。
なので、idを定義していた一文を消します。（画像）
https://gyazo.com/5f17f452baa250030e29241b3099b9d1

```
% rails db:migrate
Running via Spring preloader in process 1973
== 20220110000241 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0043s
== 20220110000241 CreateUsers: migrated (0.0047s) =============================
```

問題なく実行できました。

一応rails sでサーバーを実行し、/usersを見てみます。
https://gyazo.com/4c30d2ccb3b720d429cf5873d5a1f5fb
(userモデルが作成できました。)
laravel/Carbon 期間を指定して日付文字列の配列取得する

# laravel/Carbon 開始日付・終了日付指定し、その期間の文字列配列を取得する
laravel5.7を使用している案件でCarbonPeriodをuseしたら**「Class 'CarbonPeriod' not found」**とエラー。

バージョンによるものなのか、どうエラー解消するのか、パっと分からなかったので
プロジェクトの日付操作はCarbonで統一されてるみたいなので従来どおりCarbon使って期間の文字列配列生成しました。

また同じ事が起きたとき用にテンプレとして書き残しとこーって
※逆期間非対応

```php
use Carbon/Carbon;
```

```php
$startDateTime = new Carbon('2022-01-01');
$endDateTime   = new Carbon('2022-01-08');
                
$dates = [];
$diffDays = $startDateTime->diffInDays($endDateTime);
for ($i = 0; $i <= $diffDays; $i++) {
        $dates[] = $startDateTime->format('Y-m-d'); //ここで日付フォーマット定義
        $startDateTime->addDays();
}

var_dump($dates);
```
FastAPI+React+DockerでQiitaみたいなサイトを作ってみたい -7日目-

# 目次
- [1日目 - 初期構成](https://qiita.com/ikeikeda/items/eeed5abb2230bf031ba5)
- [2日目 - /docsの作成](https://qiita.com/ikeikeda/items/478b9e9c45b95d8bb482)
- [3日目 - DBとModelの作成](https://qiita.com/ikeikeda/items/5a12fef0fc39d8a5e1c3)
- [4日目 - CRUDの作成](https://qiita.com/ikeikeda/items/ba73f21676d315468a07)
- [5日目 - ユーザの認証の追加](https://qiita.com/ikeikeda/items/f9a738fcf2e6d6022543)
- [6日目 - テストの導入](https://qiita.com/ikeikeda/items/ba65a1408f4f7d92cbaf)

# 7日目 - バリデーションの追加
各Modelのバリデーションを追加し、それぞれのエラーハンドリングを適応させていく。

## Userモデルのバリデーション
```python:api/v1/models/user.py
# ~~~
from sqlalchemy.orm import relationship,validates
# ~~~
  @validates("login_id")
  def check_user_login_id(self,key,v):
    if v == None:
      raise ValueError("LoginId must not be null")
    if v == "":
      raise ValueError("LoginId must not be empty string")
    if not v.replace('-','').replace('_','').isalnum():
      raise ValueError("LoginId can only contain letters, numbers, _, and -")
    if v[0] == "-" or v[0] == "_":
      raise ValueError('LoginId cannot start with _ or -')
    return v

  @validates("name")
  def check_user_name(self,key,v):
    if v == None:
      raise ValueError("Name must not be null")
    if v == "":
      raise ValueError("Name must not be empty string")
    return v
# ~~~
```
ただこの場合、passwordはモデルに入るときにはhashにされてしまうのでここではバリデーションできない。
なので一旦crudsファイル内でバリデーションする。（絶対もっといい方法がある。。。）

```python:api/v1/cruds/user.py
  # ~~~~
  def create_user(db:Session,user:user_schema.UserCreateRequest):
    if len(user.password) < 8:
      raise ValueError("Password require at least 8 characters")
    if not user.password.isalnum():
      raise ValueError("Password can only contain letters, numbers")
    password_hash = get_password_hash(user.password)
    new_user = User(
      login_id=user.login_id,
      name=user.name,
      description=user.description,
      password_hash=password_hash
    )
  # ~~~~
```
これで各部でバリデーションによるエラーを起こすところまでできたので、あとはこのエラーをルーター部分でキャッチする。

```python:api/v1/routers/user.py
# ~~~
@router.post('/users',response_model=user_schema.User)
def create_user(user:user_schema.UserCreateRequest,db:Session = Depends(get_db)):
  db_user = user_crud.get_user_by_login_id(db,user.login_id)
  if db_user:
    raise HTTPException(status_code = 400,detail = "LoginId already exists")
  try:
    new_user = user_crud.create_user(db,user)
  except ValueError as e :
    raise HTTPException(status_code = 400,detail = str(e))
  return new_user
# ~~~
```
これでバリデーションに引っかかった場合も400でエラー内容を返すことができる。
pydanticでもバリデーションが行えるので、そっちにもバリデーションを追加しておくとより良いかも。

とりあえずこれでbackend側の構築はOK。（足りない場合も今までの実装方法で対応できる。。はず。。。）
次からはフロントエンドを作っていくが、Next.jsを利用した構築にチャレンジしてみようと思うので、次回はまた時間がかかりそう。
工業系から情報系に進学して感じたこと

工業高校の中でも成績の低い方だった私が、まったく知識のない情報系の学校に進学して思ったことをお話しします。
#工業系から情報系
工業高校の電子科に進学し、主に電子回路や通信などの基礎について学びました。
しかし工業高校なだけあって、主要５教科の授業が少なく、特に数学は私の苦手科目で、情報系に進んだ今となってはしっかりやっておきたかった科目でした。プログラミングの授業でも頻繁に数学的思考が必要になる場面が出てきて、高校の時に自分で補強しておけばよかったと後悔をし、数学ができないだけではなく、パソコンもあまり触ったこともあまりなかったため、とても苦労しました。
#気づいたこと
私は小さい時から人見知りで、知り合いともあまり話をしなくて、友達も少なく、勉強もあまりしないで生きてきました。後悔先に立たずとはこのことかと、今になって感じさせられました。知識が圧倒的に足りず、勉強をすることが苦手でなかなか課題に取り掛かれない。これはさすがにまずいと専門学校に進学してやっと気づきました。
#まとめ
小、中学校で習う基礎的な知識や社交性はとても大事で、小さい時から様々な知識や人に触れ、初対面での会話や、環境が変わっても周りの人間と関わって、尚且つ勉強からは絶対に逃げないという事が必要なんだなと感じました。
Xcode + Swift でiPhone用 地図アプリ。（22日目）　


昨日に続いて、swiftで地図アプリ作成。

参考サイト：

https://qiita.com/shinobee/items/b8d287d2e34af20aab64

https://qiita.com/yuta-sasaki/items/d426a32ab8356a97fc78


#今日やった事

・位置情報取得
・現在地を画面中央に移動
・アプリアイコン設定
・拡大・縮小ボタン追加と実装
・ロングタップでピンを打つ

#実行画面(iPhone11)

![イメージ7584.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503948/2421c178-5284-eb3a-5623-75f969351c1a.jpeg)
※現在地は画面外

ほぼの解説サイトの情報を、参考にそのまま実装してるので特筆すべきことは特にないですが、
Swiftの「Info.plist」が、kotlin（android studio）でいうところの「AndroidManifest.xml」にあたるとか、ストーリーボード（Main.storyboard）が、kotlinの「activity_main.xml」になるとか、何となくそんな認識です…。

基本的な事が何となくわかったので、明日は、独自にボタンを作って実装できればと思っています。
ちょこっと機械学習入門の人向けランダムフォレスト回帰でボストン住宅価格を予測

ちょっとだけ機械学習をやってみたい方のための、ちょこっとPythonコードです。
scikit-learnに入っている学習用データセット、ボストンデータセットをランダムフォレスト回帰を使って学習・予測するコードです。

## Anacondaをインストールしてください

最初に入っていない人はAnacondaのIndividual版をダウンロードしてインストールしましょう。

[https://www.anaconda.com/products/individual](https://www.anaconda.com/products/individual)

ダウンロードが完了したらインストーラーを起動して、デフォルトのまま次へ次へでインストールしてしまって大丈夫です。

## Jupyter notebookを起動

Anaconda Navigatorを起動して、ホーム画面にあるJupyter notebookを起動しましょう。
ブラウザが開いたら、右上のメニューの「新規」から「Python　３」を選んで新しいノートブックを作りましょう。

## コードを書いて「Run」ボタンで実行

最初の入力フォームに以下のコードを書いて（最悪コピペして）実行してください。
読み込まれたボストンデータセットが表示されます。

```python
# ランダムフォレスト回帰をインポート
from sklearn.ensemble import RandomForestRegressor
# テストデータセット分割関数
from sklearn.model_selection import train_test_split
# 勉強用サンプルデータセットのインポート
from sklearn import datasets
# ボストンデータセットを読み込み
boston = datasets.load_boston()
boston
```

次に読み込んだボストンデータセットのデータと正解ラベルをそれぞれ機械学習用と検証用に分割します。
train_test_split関数を使っています。

```python
# 訓練用とテスト用にデータ分割
train_x, test_x, train_y, test_y = train_test_split( \
        boston.data, boston.target, test_size=0.2)
```

そしてランダムフォレスト回帰のクラスをインスタンス化して学習させ、検証用データを予測してみましょう。

```python
# ランダムフォレスト回帰クラスのインスタンス作成
forest = RandomForestRegressor()
# トレーニング用データと正解ラベルで学習
forest.fit(train_x, train_y)
# 学習したモデルインスタンスでテストデータの値を予測
preds = forest.predict(test_x)
# 結果をデータフレームで結合して表示
import pandas as pd
df_result = pd.DataFrame(test_y, columns=["実売価格"])
df_result["予測価格"] = preds
df_result
```

予測と実際の正解の価格を見比べてみましょう。

```python
# グラフ描画ライブラリをインポート
import matplotlib.pyplot as plt
%matplotlib inline
# 折れ線グラフで表示
plt.figure(figsize=(20,10))
plt.plot(test_y,label="True")
plt.plot(preds, label="predicted")
```

とりあえずやってみるだけの人はこれをやってみて、簡単であることを実感し、興味を持っていただけると幸いです。

以上
コマンドラインツール cli-kintone を使って1万件超えのデータを登録する方法

# 概要

データ移行やAPIの検証等で大量のデータをkintoneのアプリに登録する方法について書きます。

# 環境

* macOS 10.15.7
* cli-kintone 0.13.0

# cli-kintoneについて

以下を参照ください。

https://github.com/kintone-labs/cli-kintone

# 読み込みデータ

Geolonia 住所データを利用します。

## Geolonia 住所データ

https://geolonia.github.io/japanese-addresses/

```
全国の町丁目、大字、小字レベルの住所データ（277,191件）をオープンデータとして公開いたします。

本データは、国土交通省位置参照情報ダウンロードサービスで配布されている「大字・町丁目レベル位置参照情報」をベースとしていますが、「大字・町丁目レベル位置参照情報」データは年に一回更新であるのに対して、本リポジトリで配布するデータは毎月更新しています。
```

# フィールドレイアウト

データを読み込むkintoneアプリのフィールドレイアウトです。


|No.|項目|フィールドコード|タイプ|
|:---:|----|--------------|-----|
|1|都道府県コード|都道府県コード|文字列１行|
|2|都道府県名|都道府県名|文字列１行|
|3|都道府県名カナ|都道府県名カナ|文字列１行|
|4|都道府県名ローマ字|都道府県名ローマ字|文字列１行|
|5|市区町村コード|市区町村コード|文字列１行|
|6|市区町村名|市区町村名|文字列１行|
|7|市区町村名カナ|市区町村名カナ|文字列１行|
|8|市区町村名ローマ字|市区町村名ローマ字|文字列１行|
|9|大字町丁目名|大字町丁目名|文字列１行|
|10|大字町丁目名カナ|大字町丁目名カナ|文字列１行|
|11|大字町丁目名ローマ字|大字町丁目名ローマ字|文字列１行|
|12|小字・通称名|小字・通称名|文字列１行|
|13|緯度（代表点）|緯度|数値|
|14|経度（代表点）|経度|数値|

# 読み込みファイルフォーマット

cli-kintoneは、読み込みファイルの先頭の1行目をヘッダーとしてデータを読み込みます。
読み込みファイルのヘッダー項目はkintoneのフィールドコードです。

# ファイル読み込み

cli-kintoneのオプション `--import` を利用してファイルを読み込みます。

`.env`ファイルにアプリID等を設定します。

```.env
APPID=<アプリID>
APITOKEN='<APIトークン>'
SUBDOMAIN='<サブドメイン>'
```


import.sh

```
#!/bin/bash

source ./.env

cli-kintone --import -a "$APPID" -t "$APITOKEN" -d "$SUBDOMAIN"
```

実行

```
$ cat ./latest.txt | bash ./import.sh
```


# 参考

https://developer.cybozu.io/hc/ja/articles/115000297083

https://developer.cybozu.io/hc/ja/articles/202957070
メール受信後、1 分以内に LINEグループに転送する方法

妻の妹から、公文から届く子供の退出時のお知らせがメールに来るけど、それを Line に通知できないかと相談があったので、やり方を調べました。
この記事では、LINEグループに転送する方法は割愛します。

ちなみに、今回は以下の記事を参考にスクリプトを作成しました。
https://qiita.com/likemii/items/65a0af02fb62042ce9fe

一応記事に従ってテストしたのですが、通知が飛ぶタイミングがまちまちだったので、今回の投稿に至りました。


### 今回やること
Google Apps Script(GAS)の Triggers でスクリプトを毎分動作させるように設定する。

### 設定の流れ

1. Clock のアイコンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172174/a8fd9265-73ce-5fda-b645-3c5613bc8cee.png)

2. Add Trigger をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172174/b8e51a7d-7810-2890-69a1-bb266f851d0a.png)

3. Trigger を設定し保存します。

   - 設定項目
     - 実行対象 function
     - Minutes timer
     - Every minute
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172174/4aa6edad-214d-a9bf-4064-e210e8fe2708.png)


以上で、メール受信後、1 分以内に Line でアラートを受信できるはずです！
初めてのDiscord.js

使い方・初めてではまったことを書いていきます。
初心者なのでミスがあるかもしれないです。

# 条件
* OS: windows

# 参考

> https://discord.com/developers/
> https://qiita.com/yuto0214w/items/1ecee25efca6b5b7445b

# Botの作成方法

以前こちらの記事の前半に書きました。

> https://qiita.com/kigawa/items/b5eee4bb00809e5a4931

# Node.jsのインストール

インストーラーでインストールします
インストールは割愛

> https://nodejs.org/

※v16以降じゃないといけないらしい

# botの設定

1. 左のメニューからbotを選択します
1. Privileged Gateway Intentsの中のPRESENCE INTENTとSERVER MEMBERS INTENTをオンにします

# コードを書く

```js:index.js
const {Client, Intents} = require('discord.js')
const client = new Client({intents: Object.keys(Intents.FLAGS)})

client.on('ready', () => {
    console.log(`log in ${client.user.tag}`)
})

client.on('messageCreate', async msg => {
    if (msg.content === 'cmd.command') {
        msg.channel.send('on command')
    }
})

client.login('token')
```

# 最後に

先日jdaでボットを作ったばかりですがjsで作ることになってしまったので書いてみました。
それも含めてdiscord.jsを始めるにあたって必要なサイトを集めただけになってしまった気がします。
【Rails】ツイートを作成順ではなく、いいねした順に表示したい

# 概要
ツイート投稿機能とツイートへのいいね機能を持つアプリケーションを開発中、
いいねした順番にツイートを取得する方法について調べたのでメモ。

## 環境
ruby 3.0.2
rails 6.1.4
mysql 8.0.26

## やりたいこと
**ツイートの作成順**がデフォルトの時に、
**ツイートの作成順**ではなく**ユーザーがいいねした順**にツイートを取得したい。

## 先に結論
reorderを使用し、中間テーブルのカラムを直接指定する

```ruby:users_controller.rb
# ユーザー詳細画面で表示したい場合
  def show
    @user = User.find(params[:id])
    @favorites = @user.favorite_tweets.reorder('favorites.created_at DESC')
  end
```

以下、詳細


### 関連するモデル

```ruby:user.rb
class User < ApplicationRecord
  has_many :tweets, dependent: :destroy
  has_many :favorites, dependent: :destroy
  has_many :favorite_tweets, through: :favorites, source: :tweet
end
```

```ruby:tweet.rb
class Tweet < ApplicationRecord
  belongs_to :user
  has_many :favorites, dependent: :destroy
  has_many :favorite_tweets, through: :favorites, source: :tweet
# ツイートのデフォルトとしては投稿順に並べたいためここで指定
  default_scope -> { order(created_at: :desc) }
end
```

```ruby:favorite.rb
class Favorite < ApplicationRecord
  belongs_to :user
  belongs_to :tweet
end
```

### ER図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/948830/b67b60b1-4945-0d53-8f89-b6681bf6c646.png)

#### 結論に至るまで

コンソールで確認しつつ試行錯誤。

```ruby
# userに一人目のユーザーを取得
user = User.find(1)
# favoritesに、userがいいねしたツイートを取得
favorites = user.favorite_tweets
```

これだと、tweetのデフォルトである、
**tweetsテーブルのcreated_atカラムの降順**
での取得となってしまう。
（このデフォルトはtweet.rbのdefault_scopeで指定しているもの）

##### そもそもどんなクエリが発行されているのか？
ActiveRecordで発行されるSQLを確認するのに、to_sqlという便利なメソッドがあるとのこと。
先ほどの中身を確認。

```ruby
# userに一人目のユーザーを取得
user = User.find(1)
# userがいいねしたツイートを取得するSQLを確認
user.favorite_tweets.to_sql
# 見やすいよう改行
=> 
"SELECT `tweets`.* 
FROM `tweets` 
INNER JOIN `favorites` 
ON `tweets`.`id` = `favorites`.`tweet_id` 
WHERE `favorites`.`user_id` = 1 
ORDER BY `tweets`.`created_at` DESC"
```
>ORDER BY **tweets.created_at** DESC"

とあるように、tweetsテーブルのcreated_atカラムをDESCで並べている。

指定したいのは
`ユーザーがツイートをいいねした順番`
つまり、
`中間テーブルのcreated_at`
なので、

上記ORDER BYの箇所を
>ORDER BY **favorites.created_at** DESC

にできればいいのでは？

##### defaultを上書きしたい
```ruby
# userに一人目のユーザーを取得
user = User.find(1)
# userがいいねしたツイートを取得するSQLを確認
>> user.favorite_tweets.order('favorites.created_at DESC').to_sql
# 見やすいよう改行
=> 
"SELECT `tweets`.* 
FROM `tweets` 
INNER JOIN `favorites` 
ON `tweets`.`id` = `favorites`.`tweet_id` 
WHERE `favorites`.`user_id` = 1 
ORDER BY `tweets`.`created_at` DESC, favorites.created_at DESC"
```
>ORDER BY **tweets.created_at** DESC, **favorites.created_at** DESC"

.orderでは、デフォルトの後の指定として追加できるだけのよう。

##### ここで結論

reorderで初期化の上、順番を指定

```ruby
# userに一人目のユーザーを取得
user = User.find(1)
# userがいいねしたツイートを取得するSQLを確認
>> user.favorite_tweets.reorder('favorites.created_at DESC').to_sql
# 見やすいよう改行
=> 
"SELECT `tweets`.* 
FROM `tweets` 
INNER JOIN `favorites` 
ON `tweets`.`id` = `favorites`.`tweet_id` 
WHERE `favorites`.`user_id` = 1 
ORDER BY tweet_bookmarks.created_at DESC"
```

無事、意図通りのいいね順で取得することができた。

### 参考にした記事
- reorder含む、default_scopeの初期化

https://umatomakun.hatenablog.com/entry/2014/06/23/013608

- 【Railsドキュメント】reorderについて

https://railsdoc.com/page/model_reorder


### 最後に
より良い方法や間違い等ありましたらご指摘いただけますと幸いです！
WindowsのPowerShellにTensorFlow-GPUを入れて動かした～い

今までPyTorchを使ってきたのですが、TensorFlow For Cを触ってみたくなったので、Windowsでセットアップを行いましたが...？

#環境
- Windows 10
- GPU NVIDIA GeForce RTX 3060 LapTop
- PowerShellで動かしたい

#Instration
基本は[ここ](https://www.tensorflow.org/install/source_windows#install_msys2)見ればわかるらしいけど恐ろしくざっくりしている。

（注）バージョンが合わないと容赦なく動かなくなっちゃうので注意！！

## Visual C++ Build Tools 2019 をインストールする

1. [Visual Studio のダウンロード サイト](https://docs.microsoft.com/ja-JP/cpp/windows/latest-supported-vc-redist?view=msvc-170)に移動します。
1. [再頒布可能パッケージおよびビルドツール] を選択します。
1. 以下をダウンロードしてインストールします。
 - Microsoft Visual C++ 2019 再頒布可能ファイル
 - Microsoft Build Tools 2019

## GPUに対応するドライバーのバージョンを確認
1. [NVIDIAドライブダウンロードサイト](https://www.nvidia.co.jp/Download/index.aspx?lang=jp)にアクセスし対応するドライバーを確認
1. ドライバーのバージョンをメモ
1. ドライバーを入れてない場合はダウンロード＆インストール![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543519/3861615d-a5cf-afc3-15f6-d7b1ccf90a02.png)

## 対応するCUDAとcuDNNをチェックしてダウンロード
1. 先ほどメモったドライバーのバージョンから利用可能なCUDA Toolkitのバージョンを確認する [NVIDIA CUDA Toolkit Release Note](https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html) ドライバーのバージョンより小さいバージョンに対応するCUDAのバージョンを確認する![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543519/64b6b6bb-0434-d2a5-a4c3-0011963f78e1.png)
1. [Build from source on Windows  |  TensorFlow](https://www.tensorflow.org/install/source_windows#gpu) ここからGPUが利用可能であるCUDAのバージョンを起点として、構築するPython, CUDA, cuDNN, TensorFlowのバージョンを決定する（今回→TensorFlow2.6, Cuda11.4, cuDNN8.2, Python3.9にしました）
1. TensorFlowのインストール　`pip install tensorflow==2.6.0`
1. CUDA Toolkitのインストーラーのダウンロードとインストール [CUDA Toolkit Archive](https://developer.nvidia.com/cuda-toolkit-archive)
1. cuDNNのダウンロード [cuDNN Archive](https://developer.nvidia.com/rdp/cudnn-archive) `for CUDAのバージョン`に注意
1. 5.をダウンロードしたら中身を全部 `C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v<バージョン> `内にコピペ

## Bazelのインストール
1. Chocolateyのインストール [Chocolateyで、まっさらWindowsに一気にソフトをインストール](https://tomosta.jp/blog/chocolatey/)
1. Bazelのインストール　`choco install bazel`

## MSYS2のインストール
1. chocolateyでインストールすると楽ちん　`choco install msys2`

# 終わり！
多分本家より気持ちかんたんにインストールできると思います。
Pytorchと比べて手順が多すぎますね..

# エラー
Windows10にTensorFlow GPU環境を構築し、学習を回そうとしたら次のエラーがでた
`tensorflow.python.framework.errors_impl.AlreadyExistsError: Another metric with the same name already exists.`

https://qiita.com/oozzZZZZ/items/3728408c874bf97fc5f5
【Android studio】ImageViewへ容量の大きい画像を読み込む方法

#状況
実機で操作時にImageViewへ2MB以上のjpg画像を挿入しようとしたところ、アプリが落ちてしまった。
メモリ不足に陥っている可能性が考えられた。

#対処方法
1.　jpg画像をBitmapに変換、
2.　Bitmapのサイズを調整。
3.　ImageViewに張り付ける。

```kotlin:MainActivity.kt
val bitmap = adjustImage(resources, R.drawable.imagefilename)
menuImage.setImageBitmap(bitmap)    //・・・3

private fun adjustImage(res: Resources, resID: Int): Bitmap {
    var bmp = BitmapFactory.decodeResource(res, resID)     //・・・1
    return createScaledBitmap(bmp, 320, 264, true)    //・・・2
}

```

#懸念事項
BitmapFactory.decodeResource(res, resID)で容量の大きいjpg画像を読んでいるから、その際にもメモリを消費しているのでは？
本当は下記URLのようにBitmapとして読み込む前にリサイズしたいのだが、自分ではうまくいかず。
kotlinの理解が進んできたら、再度見直すこととしたい。
参考URL：https://developer.android.com/topic/performance/graphics/load-bitmap?hl=ja
TensorFlowでAlreadyExistsErrorがでた

# エラー内容
環境
* Windows10 x PowerShell
* python3.9
* TensorFlow=2.6.0
* CUDA 11.4
* cuDNN 8.2

Windows10にTensorFlow GPU環境を構築し、学習を回そうとしたら次のエラーがでた

`tensorflow.python.framework.errors_impl.AlreadyExistsError: Another metric with the same name already exists.`
同名のメトリクスを２回読み込んでるよ！的なやつ。
同じモジュールを２回importするとでるやつだけど、心当たりがない。

調べてみるとTensorFlowが持ってるKerasのバージョンとオリジナルKerasのバージョンのミスマッチがあると起こるらしい。（クソすぎでは）
`pip list`をすると`keras==2.7.0`だったので、
`pip install keras==2.6.*`をすると動くようになった
STM32L010でモーターを制御する　軽くオリジナルのモータードライバーを作ってみた　100円以下


まだ完全に試していない


目的
モーターのテスト
モーターコントローラを燃やす壊す高いと
いうから軽く100円以下でモーターコントローラを作ってみた。(どや)


部品





R6006AND 通販コード　I-15334   X 4個



https://akizukidenshi.com/catalog/g/gI-15334/



PS817　通販コード　I-11729　　X 2個



https://akizukidenshi.com/catalog/g/gI-11729/



RD16S 470E　通販コード　R-16471　　　 X 6本



https://akizukidenshi.com/catalog/g/gR-16471/



RD16S 100K　通販コード　R-16104　　　X 4本



https://akizukidenshi.com/catalog/g/gR-16104/








![o_con188.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/38de33a7-8324-8ae9-193d-f99bf789df67.jpeg)


![5D52934A-F35D-4C77-A919-AC43D6467C6D.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f1acc408-7aa6-171e-7cb6-4dcea63377d9.jpeg)



![AFBED030-A4CE-467F-97C4-05E30488DAED.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0ab8549e-c0fc-28f7-7991-1f88dcb917ad.jpeg)


![3A6CC1FC-E1F0-4257-8A34-A26B606A1CA2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/24e5b414-df43-b51d-afb8-b5e72c6924c6.jpeg)



![C37161EF-1339-496F-80A8-9CD6684E3659.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c107b3cb-8085-bca3-fa46-df22493d998c.jpeg)



![443BB659-84EF-4D65-B537-AD9CF8A80865.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/412371db-bcfc-7ac1-4163-a1635f8825fe.jpeg)



![o_con192.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/82434d51-ae05-4bcf-b672-7e6a55632e5a.jpeg)



![o_con193.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/06e7210e-2eb0-c81a-20bf-1704a6650530.jpeg)



```c++


//MC_010_1

#include "mbed.h"

#define M_STOP      0
#define L_ROTATE    1
#define R_ROTATE    2

DigitalOut L_SIDE(PB_1);
DigitalOut R_SIDE(PA_5);
DigitalOut myled(PA_4);

int MD_1[3][2] = {  { 0 , 0 } , { 1 , 0 } , { 0 , 1 }  }; 

int motor_1( int control_1 )
{

    if( control_1 < 0 || control_1 > 2 ) return( -1 );

    L_SIDE = MD_1[control_1][0];    
    R_SIDE = MD_1[control_1][1];

    return (0);//正常終了

}//motor_1

//メインルーチン
int main() {

        //GPIOの初期化
    L_SIDE = 0; 
    R_SIDE = 0;

    //無限ループ
    while(1){

        motor_1( M_STOP );
        wait_ms(1000);

        //正面から見て反時計周り
        motor_1( L_ROTATE );
        wait_ms(1000);

        motor_1( M_STOP );
        wait_ms(1000);

        //正面から見て時計周り
        motor_1( R_ROTATE );
        wait_ms(1000);

    }//while
    
}//main



```
pyenv + venv + VSCodeでPython環境構築

# 環境
- macOS Monterey
- Homebrew 3.3.9
- pyenv 2.2.3
- VSCode 1.63.2


# 前提
- ログインシェルはzsh
- Homebrewがインストール済
- VSCodeとPython用の拡張機能(Python)がインストール済み


# 構築手順
### pyenvをインストール
:point_right: [https://github.com/pyenv/pyenv](https://github.com/pyenv/pyenv)のインストール手順を参考にしました。

Homebrewでpyenvをインストール

```
brew update
brew install pyenv
```

zshの設定

```
echo 'eval "$(pyenv init --path)"' >> ~/.zprofile
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
```

:::note info
ここで一旦ターミナルをrestart
:::

依存パッケージをインストール

```
brew install openssl readline sqlite3 xz zlib
```

インストールはこれで完了

インストールできるPythonのバージョン一覧

```
pyenv install --list
```

バージョンを指定してpythonをインストール

```
pyenv install 3.10.0
```


>pyenv installすると
`configure: error: C compiler cannot create executables`
のエラーになりました。
こちらを参考にさせていただき、XcodeとCommand line toolsをアップデートしたら解決しました。
[https://charmie11.hatenablog.com/entry/2021/07/20/101528](https://charmie11.hatenablog.com/entry/2021/07/20/101528)

インストール済みバージョンの確認

```
pyenv versions
```


全てのシェルで利用するPythonのバージョンを指定

```
pyenv global 3.10.0
```

>カレントディレクトリ以下で利用するPythonのバージョンを指定
`pyenv local 3.10.0`
現在のシェルでのみ利用するPythonのバージョンを指定
`pyenv shell 3.10.0`

>バージョン設定の優先順位は、shell > local > global の順。

現在のバージョンを確認

```
pyenv version
```
<br>
### venvで仮想環境を作成
venvはpython3.3から標準搭載されているそうです。

```
cd [/path/to/project]  #プロジェクトのディレクトリに移動
pyenv local 3.10.0  #カレントディレクトリで使用するpythonのバージョンを指定
python -m venv [/path/to/new/virtual/environment]  #仮想環境の作成
```
> 作成した仮想環境を有効化する必要がありますが、VSCodeを使う場合は、自動で有効化されます。
手動で有効化する場合は、
`cd [/path/to/new/virtual/environment]`# 仮想環境のディレクトリに移動
`source ./bin/activate`# 有効化
停止する場合は、
`deactivate`

### VSCodeで開発環境作成
> 拡張機能「Python」が必要です。
以降は、インストールされている前提の手順です。

プロジェクトのディレクトリ[/path/to/project]をVSCodeで開く
`ファイル > フォルダーを開く`

ディレクトリ配下にpythonファイルが無い場合は作成。
例えば、`test.py`など。中身は空でも大丈夫みたいです。
pythonファイルを選択すると、自動的に仮想環境がactivateされるようで、VSCodeの画面一番下の青いステータスバーの左側に
`Python 3.10.0 64-bit ('[仮想環境]':venv)`
のように表示される。

`ターミナル > 新しいターミナル`
でターミナルを開くと、仮想環境が有効になったプロンプトになっている。

以下で、仮想環境になっていることを確認。

```
which python
which pip
```
gem installに失敗してた原因と解決方法

# 環境
- MacBook Pro (16-inch, 2019)
    - macOS Big Sur 11.6.2
- Xcode13.2
- ruby 2.6.3p62 (2019-04-16 revision 67580) [universal.x86_64-darwin20]
    - rbenv 1.2.0のインストール済み(参考：[rbenvでrubyのバージョンを管理する - Qiita](https://qiita.com/hujuu/items/3d600f2b2384c145ad12))


# 発生していたこと①
`gem install jazzy` をすると、パーミッションエラー
> ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /Library/Ruby/Gems/2.6.0 directory.

## 原因
gemのインストールはsudo付けない方が良い（が過去につけたせいで持ち主が管理者に変わってた）

## 解決方法
オーナー変更`chown -R <user名>:staff /Users/<user名>/.rbenv/versions/2.6.5`


# 発生していたこと②
`(sudo) gem install jazzy` をすると必要なファイルがないよと言われる
>Building native extensions. This could take a while...
ERROR:  Error installing jazzy:
	ERROR: Failed to build gem native extension.
>
 >   current directory: /Library/Ruby/Gems/2.6.0/gems/redcarpet-3.5.1/ext/redcarpet
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/bin/ruby -I /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0 -r ./siteconf20220112-1918-u1r6no.rb extconf.rb
creating Makefile
>
> current directory: /Library/Ruby/Gems/2.6.0/gems/redcarpet-3.5.1/ext/redcarpet
make "DESTDIR=" clean
>
> current directory: /Library/Ruby/Gems/2.6.0/gems/redcarpet-3.5.1/ext/redcarpet
make "DESTDIR="
make: *** No rule to make target `/Applications/Xcode13.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.0.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/universal-darwin20/ruby/config.h', needed by `autolink.o'.  Stop.
>
> make failed, exit code 2
>
> Gem files will remain installed in /Library/Ruby/Gems/2.6.0/gems/redcarpet-3.5.1 for inspection.
Results logged to /Library/Ruby/Gems/2.6.0/extensions/universal-darwin-20/2.6.0/redcarpet-3.5.1/gem_make.out

# 確認したこと
インストールされているrubyのバージョンを確認`rbenv versions`
> system
> \* 2.6.5 (set by /Users/<user名>/.rbenv/version)

Rubyコマンドの参照先をチェック`which ruby`
> /usr/bin/ruby

rbenv で Ruby をインストールするところまではできているが、インストールした Ruby を使うところがうまくいってない。

Rubyコマンドの参照先を確認`which rbenv`
> /usr/local/bin/rbenv

コマンド検索パスを確認`echo $PATH `
> /usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin

使っているシェル確認`echo $SHELL`
> /bin/zsh

# 原因

- 使ってるシェルがbashではなくzshだった
    - よって設定書くファイルが違っていた
        - `~/.bash_profile` に`eval "$(rbenv init -)"` を追記していた

参考：[bashとzshの違い。bashからの乗り換えで気をつけるべき16の事柄](https://kanasys.com/tech/803#index1-0)
>2019年、WWDC19の基調講演でApple社は次にリリースする「MacOS X Catalina」より標準のシェルを「zsh」に変更すると発表しました。そして現在、Macを購入したり最新のバージョンにアップデートしてターミナルを開くとbashではなくzshが起動します。

# 解決方法
1. bashではなくzshに設定反映`echo 'eval "$(rbenv init -)"' >> .zshrc`
2. 反映適用 `source ~/.zshrc` (ターミナルの再起動でも可)

# 再確認
インストールされているrubyのバージョンを確認`rbenv versions`
>  system
>\* 2.6.5 (set by /Users/<user名>/STORESPayments-iOS-SDK/.ruby-version)

Rubyコマンドの参照先を確認 `which ruby`
> /Users/<user名>/.rbenv/shims/ruby

コマンド検索パスを確認`echo $PATH`
> /Users/<user名>/.rbenv/shims:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin

使っているシェル確認`echo $SHELL`
> /bin/zsh

→これは変更していないのでこのまま！
[Docker] running中のコンテナがstopもrmもkillも受け付けない時の強制終了

# 背景

Runnning中のコンテナがstop,rm,killに加え、dockerサービスを再起動しても止まらなかったときの対処法です。
止まらなかった原因は特定できていませんが、もしかしたら再度upしようとしたときにGPUのdriverが認識できなくなっていたので、これかもしれません。

**環境**

Ubuntu16.04
Docker20.10.12

# 対処

configの値を変更します。
configはjson形式のdocker inspect <container id>で表示されるものです。
Runningという項目をtrueからfalseに変更します。
dockerサービスを再起動すると再度configが読み込まれdownします。

```bash
sudo vim /var/lib/docker/containers/${CONTAINER_ID}/config.v2.json
# Runninngをtrue -> false に
systemctl restart docker
```

これで止まったかと思います。
その後異常はでていませんが、ネットワークの設定も見ておいた方が良いみたいです。

# 参考
https://inokara.hateblo.jp/entry/2014/02/03/224033
反面教師が教える情報系専門学校での学び方

#はじめに
この記事は、一般の方にとっては当たり前だと思われるような話や、プログラムに限らない内容を挙げますが、私みたいに「当たり前」ができていない方へ、意識して行動してほしいと考え作成しました。
##その１.変数名を分かりやすく作る
まず私が最初にしていたのが、変数の名前を「a」や「x」等、一文字だけにしていたことです。
プログラムが簡単な場合はそれで理解できていましたが、プログラムが複雑になっていくにつれ、どの変数がどんな役割かが分からなくなっていき、どの行でどういった処理をしているのかが分からなくなってしまいます。

なので、変数を作る際は
合計を入れたい→「sum」
名前を入れたい→「name」
というように、一目でどんな役割になるのかが分かるように変数名を付けましょう。

##その２.一、二回問題を解いただけで満足しない
新しい関数などが出てきた際には、内容を大体覚えた後に練習問題に取り組む流れが多いと思いますが、ここで1問か2問問題を解き「完璧だったからもう復習しなくていいや！」と思ってしまう人がいると思います、自分もそうです。
ですが、授業などで出される練習問題は、新しく学ぶ関数が主体として作られているため分かりやすく、先生からヒントが出されたり、似たようなコードが覚える際に使用されているため既視感があったりと、多数のハンデがある状態で解くことになります。

そんな状態で問題を解いて終わらせてしまうと、別の練習問題で同じ関数が出てきたときには、別の関数が主体になっているため解説がなく、似たようなコードも近くにないという、ハンデなしで解かなければならないため、結果がボロボロになってしまいます。

なので、もし完璧に覚えたと思っていても、最低でも家に帰った後に問題を1問解いたほうがいいです。

##その３.提出期限等を必ず守る
###**自分は現在進行形で守れていません！！！！！**
はい。
絶対に守りましょう。
ごめんなさい。

##その４.睡眠をしっかりとる
その３の内容も含めて当たり前だと思われると思いますが、質のいいプログラムを作ったり、効率よく学習を行うにはまず睡眠をとりましょう。
勉強をする気があっても無くても、睡魔には勝てませんし、睡魔が来なかったとしても、頭がすっきりしているほうが物事に集中できることは当然です。
それとこの内容、上記の「提出期限等を必ず守る」に結構深い関わりがありまして、人間は悩みが多いほど不安や考えすぎで眠れなかったり、眠りの質が悪くなったりします。
事実、ここ一週間私は「課題終わらせなきゃ…」という悩みをずっと抱えていたせいで、深夜3~4時就寝＋悪夢によって7~8時起床といった出来事が起きていました。

なので、提出期限を守らなければ「不安が膨らみ眠れなくなる」→「授業に集中できず成績が悪くなる」→「さらに不安が膨らむ」といった悪循環に陥ってしまいます。

そうならないよう、きちんと予定を立て、期限内に課題をしっかりと終わらせるようにしましょう。
やめて。
こっち見ないで。
お前が言うなみたいな視線を向けないで。

##最後に
変数名を付けるのが面倒だから一文字だけにしたり、勉強するのが苦手だから一、二問で終わらせたい気持ちは自分もやっていたため非常に分かりますが、その後に絶望するのは結局未来の自分自身なので、しっかりと努力しましょう。
それと何度も言っているのでしつこいかもですが、**絶対に期限は守りましょう**。
こんなに精神がすり減る行為だとは思ってませんでした。
【BizRobo!】【knowledge】DAのComponentを指定する方法について

# はじめに
現在、RAPを実務で行っていますが、まだまだまだまだ経験が浅く、日々勉強中です。
本記事については、自身の備忘録も含め同じ様な所で頭を抱えている方に対して、
少しでもヒントになり、先に進める力となれれば良いなと思い記事にしましたーー！

## 今回のTips
今回は、knowledgeBaseからの共有です。
ロボットを開発している際に、迷った部分をknowledgebaseで探していたら出てきたものになりますので、同じポイントで躓いている方がいたら、ご参考頂ければと思います。

DA内のステップで設定するComponentは、“Text Match”を用いることで部分一致の指定が可能です。下記はDAで任意のドロップダウンリストの値を選択する場合のknowledgeです。

:sparkles:“Text Match“は、変数で動的に設定を行うことも可能です。
:sparkles:「Component」とは、DAでクリックなどの処理を実施する際に、
　 「どこに対して」が記載されている項目です。(DSでいう、ファインダー)

## Tips概要
[DAのComponentを部分一致で指定する方法](https://knowledge.bizrobo.com/hc/ja/articles/360036835052-DA%E3%81%AEComponent%E3%82%92%E9%83%A8%E5%88%86%E4%B8%80%E8%87%B4%E3%81%A7%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)
→BizRobo!ナレッジベース参照

## Tips 注意点
一致させたいと考えている部分が、設定と完全一致にしていない場合(他にも候補となりえる項目が出てきてしまった場合)、他のページと競合してしまい、そちらが参照されてしまうケースもある為、まずは完全一致する項目なのか、他に候補はないかを気を付ける。

## まとめ
今回は、BizRobo!のknowledgeBaseから「DAのComponentを指定する方法について」について、ご紹介しました。自分の備忘録代わりでもあるのですが、他の同じ部分で悩んでいる方の参考になれば幸いです。
【BizRobo!】【DA】PressKeyはタブから選択すべし

# はじめに
現在、RAPを実務で行っていますが、まだまだまだまだ経験が浅く、日々勉強中です。
本記事については、自身の備忘録も含め同じ様な所で頭を抱えている方に対して、
少しでもヒントになり、先に進める力となれれば良いなと思い記事にしましたーー！

## 今回のTips
知っておられる方も多いとは思ますが、
「PressKey」ステップについて、新規に作成するのと対象ページタブ上で作成するのとでは、
作成効率が変わってきますので、紹介したいと思います。

## Tips概要
以下の様に、新規で作成したステップについては、手作業で対象のアプリケーションなどを指定する必要があり、業務効率が悪くなります。。。
![プレスキー.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715221/bc2f530e-dcd2-4cda-a404-8b61e4ee8a6e.png)
<左：新規作成　右：タブから作成>


## まとめ
今回は、「PressKeyはタブから選択すべし」でした！！
めちゃくちゃ小さい事ですが、1ステップの作成差分が5秒だとしたら、
1ロボットでプレスキーが20個あると、100秒です！
無駄な時間を削減する為のRPAなので、開発側も無駄な時間を削減し効率化していきましょう！
CRUD処理（rails6）エラー解決

#CRUD処理を実装中に発生したエラーについてのアウトプット。

##エラー内容
投稿した情報を削除しようとした時に発生したエラー。
削除なのにHTTPメソッドがGET、本来はDELETE.

![スクリーンショット 2022-01-09 14.51.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505299/80d052a8-cf80-e74a-212b-ea65fdae8a66.png)

##考えられる原因
1.ルーティングが間違っている。
2.コントローラーアクション間違い
3.ビューファイル記述間違い

##エラー解消の流れ
1~3が間違っていないか確認。

```
 ルーティング
  delete '/users/:id', to: 'users#destroy'
  
 コントローラー
  def destroy
    user = User.find(params[:id])
    user.destroy
  end
  
 削除ボタン追加
  <%= link_to '削除', "/users/#{user.id}", method: :delete, data: {confirm: "削除しますか?"}  %>
 
 ビュー
 <h1>削除完了</h1>
　　<%= link_to "一覧画面へ", "/users" %>
```
確認してみたがコードの間違いは見つけられず。
息詰まったのでエラーメッセージでググることに、`link_to`ではなく`button_to`にすれば削除はできるとの記事を発見し、早速実施。
`button_to`にコードを書き換えると削除はできるようになったが、スッキリとは解決していないので再度情報収集。

##結果
エラーの原因としてはRails7がリリースされたことによる`delete`メソッドの記述の仕方の変更。

__エラーが発生した時のRails version__

```
$ rails -v 
```
```
$ rails 7.0.1
```
__修正__

①インストールされているRailsのバージョン確認

```
$ gem list rails
```

②使用したいバージョンがないときはインストール実施

```
$ gem install rails -v 6.0.4.4
```

③rails6で再度作成

```
$ rails _6.0.4.4_ new sample_app
```

__確認__

削除ができる。

##エラーを解決しての感想

エラー文を見て、ルーティングエラーなのはわかると思うので、そこから一つ一つ、間違っている場所を潰していくことでエラーが解決できると思っていたが、
今回のエラーに関しては元の記述も間違っているところがなく手詰まり感がすごかった。
なんとか解決することができたのでまた一つ成長できたと思う。
【BizRobo!】【DA】DA操作時のショートカットキー

# はじめに
現在、RAPを実務で行っていますが、まだまだまだまだ経験が浅く、日々勉強中です。
本記事については、自身の備忘録も含め同じ様な所で頭を抱えている方に対して、
少しでもヒントになり、先に進める力となれれば良いなと思い記事にしましたーー！

## 今回のTips
今回は、「DA操作時のショートカットキー」について、記事にしてみました。
業務中はあまり使わない事も多いですが。。。。地味に知っていると業務効率化につながると思いましたので、本記事が参考になれば幸いです！

## Tips概要
詳しい内容は以下のナレッジにも記載があるのですが、
その中でもよく使えそうなショートカットについて紹介します！

|項目|ショートカットキー|内容|
|---|---|---|
|▼実行を開始|F9|現在のプログラム ポイントからワークフローの実行を開始します|
|▼ステップイントゥー|Ctrl+Shift+↓|次のプログラム ポイントに対して実行します。次のプログラムポイントが折りたたまれたステップ内にある場合は、ステップが展開されます|
|▼次のイテレーションに移動|Ctrl+Shift+Page Down|現在のプログラムポイントがループ ステップ内にあるときに使用可能です。ボタンをクリックすると、開始時の実行位置に再到達するまで実行されます。繰り返し中に実行位置をスキップすると、ループは複数回実行できます。イテレーションがなくなると、繰り返しステップ外のプログラムポイントで処理が停止します。 ⇒これは、DSでも使用できますね！|

詳しくは、knowledgeBaseをご覧ください。
[【操作手順】[DA]エディター操作時のショートカットキー](https://knowledge.bizrobo.com/hc/ja/articles/360037831232--%E6%93%8D%E4%BD%9C%E6%89%8B%E9%A0%86-DA-%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E3%83%BC%E6%93%8D%E4%BD%9C%E6%99%82%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%AD%E3%83%BC)

## まとめ
こういったショートカットは暗記して使用できれば、
業務効率化につながると思いますので、覚えていきましょう。
引き続き展開していきますので、よろしくお願いいたします！！
React x Typescriptでローカルの動画を再生する

# 概要
動画を公開ストレージに上げてそのリンク経由で動画視聴するのではなく、動画をプロジェクト内部に置いて手軽にそれを再生したい時ってあるのかなーと思います。

ローカルの動画を再生するにあたって、若干ハマってしまったので整理します。

# 環境

```shell
$ node -v
v16.13.1

$ npm -v 
8.1.2
```

# 準備
今回はcreate-react-appでプロジェクトを作り、react-playerというライブラリを採用しました。インストールはyarnを使う場合は以下になります。
※「create-react-app」の@5.0.0のバージョン指定は2022年1月時点でエラー出る対策です。これは時期性のものと考えられるので、適宜変更ください。
※動画をインポートする部分のエッセンスはReact x Typescript x create-react-appの組み合わせであれば、videoタグでも同様と思います。

```shell
npx create-react-app@5.0.0 video_play_demo --template typescript
yarn add react-player
```

# 実装
ハマった部分は後述します。とりあえず結論だけ見たいという方は以下のサンプルを参照ください。

```typescript:とあるコンポーネント
import ReactPlayer from "react-player"
// src直下にassetsフォルダを作り、そこに動画を置きました。
import VideoGuideLocalPath from './assets/video_guide.mp4'

export const VideoGuide: React.FC = () => {
  return (
    <ReactPlayer
      url={VideoGuideLocalPath}
      controls
    />
  )
}
```

```typescript:react-app-env.d.ts
// mp4以外であれば、*.mp4の拡張子の部分を変更ください
declare module '*.mp4' {
  const src: string;
  export default src;
}
```

# ハマったこと

## ファイルパスを直接指定すると、何も表示されない
正直、原因はわかってません。。。わかる方コメント等で教えてください。
ただ解決方法としては、ファイルパスをimportする必要がありました。

```typescript
// URL直接指定のみだと、何も表示されない。この1文は参考にしないで。
<ReactPlayer url={'./assets/video_guide.mp4'} />
```

## importすると、ts2307エラーが発生する

```typescript:
// Cannot find module './assets/video_guide.mp4' or its corresponding type declarations.ts(2307)
import VideoGuideLocalPath from './assets/video_guide.mp4'
```

create-react-appの以下の[issue](https://github.com/facebook/create-react-app/issues/6822)によると、Typescript側のエラーらしいです(ほんまかいな)。
issueの通り、`react-app-env.d.ts`に対してmoduleとしてmp4の拡張子を受け入れるようなコードを書くと解決しました。

https://github.com/facebook/create-react-app/issues/6822

```typescript:react-app-env.d.ts
/// <reference types="react-scripts" />
// mp4以外であれば、*.mp4の拡張子の部分を変更ください
declare module '*.mp4' {
  const src: string;
  export default src;
}
```

## controlsオプションを指定しないと動画が再生されない
controlsのオプション指定しないと初期フレームの絵だけ表示されて、動画が再生されませんでした。
メディアボタン(ex.再生ボタン、一時指定ボタン)を表示するオプションを入れないと再生が開始できないので、要注意です。
※YouTubeのURLを直接指定だと、指定せずとも再生ボタンが表示されるので意外とハマりポイントではと思っています。

```typescript:controlsオプションないと動画再生されない
import ReactPlayer from "react-player"
import VideoGuideLocalPath from './assets/video_guide.mp4'

export const VideoGuide: React.FC = () => {
  return (
    // メディアボタン(ex.再生ボタン、一時指定ボタン)は表示されない
    <ReactPlayer url={VideoGuideLocalPath} />
  )
}
```

## 所感
ローカルの動画再生くらい、ライブラリ使えば大したことないやと思ってたのですが、意外とハマりどころ多くて、整理したくなりました。俺だったら、私だったらこうするぜとかあればフィードバックお待ちしてますー。
AzureADとCertCentral(Digicert)でSSOを構成する

#はじめに
AzureADをIDPとしてCertCentralにSSO（シングルサインオン）を行うための設定を行いました。ドキュメントは有るものの、ハマりポイントが多かったため覚書として記載しておきます。


#手順
基本的には下記の通りに進めます。

https://docs.microsoft.com/ja-jp/azure/active-directory/saas-apps/digicert-tutorial
##[AzureAD]SAML構成
エンタープライズアプリケーション作成やユーザー作成が終わってからの手順補足。

* [基本的な SAML 構成] セクションで、次の手順を実行します。
* [識別子] ボックスに下記のURLを入力します。

```
https://www.digicert.com/account/sso/metadata
```

 * [応答 URL] ボックスに下記のURLを入力します。

```
https://www.digicert.com/account/sso/
``` 
    
* [サインオン URL] ボックスに、次のパターンを使用して URL を入力します。

```
https://www.digicert.com/account/sso/<FEDERATION_NAME>/login
```

:::note info
FEDERATION_NAMEは会社名などにしておくと良いようですが、後で入れなおすので適当に入れておいてOKです。
:::

* [属性とクレーム] セクションで下記の内容を追記します。

| 名前 | ソース属性 |
|:-:|:-:|
| nameidentifier  | user.userprincipalname  |
| company  | < companycode >  |
| digicertrole  | CanAccessCertCentral  |

:::note info
companycodeはCertCentral上で確認できるアカウント番号(数字7桁)です。
:::

* [SAML 署名証明書]セクションで下記の内容をメモ帳などにコピペします。
    * [アプリのフェデレーション メタデータ URL]

##[CertCentral]の設定
基本的には下記の通りに進めます。

https://docs.digicert.com/ja/manage-account/saml-single-sign-on-admin-guide/


* DigicertのサポートチームにSSO設定の有効化を依頼する。メールで依頼するとすぐに対応してくれます。
* SSO設定が完了すると[設定]メニューに[シングルサインオン]が表示されるので、開きます。
* [フェデレーション設定を編集する]を選択します。
* [IDPのメタデータ]の項目で[動的URLを使用する]を選択してAzureADでコピペした[アプリのフェデレーション メタデータ URL]を貼り付けします。
* [どのようにユーザーを識別しますか？]の項目で[NameID]を選択します。
* [フェデレーション名]で会社名などの情報を入力します。

:::note info
フェデレーション名は世界で一意でなければなりません。
:::
* [フェデレーション名をIDPのリストに追加する]チェックボックスにチェックを入れます。
* [保存して終了する]ボタンを押します。
* [SP Initiated Custom SSO URL]が出てくるので、AzureADの[サインオン URL]と比べて差があればAzureAD側にコピペしておきます。

##ユーザー
自動プロビジョニングはできないので、AzureADとCertCentralでそれぞれユーザーを作成して連携します。

#おわりに
Digicertのテクニカルサポートは非常に丁寧で、AzureAD側の設定方法も教えてくださるので助かりました。

#参考文献

https://docs.microsoft.com/en-us/azure/active-directory/saas-apps/digicert-tutorial#configure-azure-ad-sso

英語版のみにAzureADの設定値情報があります。
第4回　CSSの書き方について

#はじめに
HTML言語を全く触ったことがない超初心者が、学校で学んだことを忘れないようにすることを目的に作成しています。
HTMLとはどういったものなのか、結局何ができるのかを一緒に学んで行きましょう。
##注意事項
この投稿は第3回目の続きになります。そのため、前回紹介した内容は説明せずに進めていきます。
ド素人ゆえ間違った記載(独自の解釈をしている)場合があるかもしれませんがご容赦ください。
説明に関してはできるだけ図を用いてわかりやすく、作成していこうと思います。
使用するのはGoogle Chrome、Visual Studio Codeの2点になります。

https://qiita.com/hamuo3kameru/items/0fbf12bb2e88e0bb2311

#目次
1.CSSの書く場所について
2.CSSの書き方について

#1.CSSの書く場所について
**3つの方法**を順に書いていこうと思います。
本題に入る前に一度、前回書いたbodyタグの中身は一度全て消してください。
###1ｰ1 HTMLタグの中に書く方法
先ずはh1タグでCSSと表記されるようにbodyタグの中に書きましょう。
そのh1タグの中に書いて行きます。h1のとなりに半角スペース、style="color:red;"と書きます。
**style属性を書くとその中でCSSを書くことができます。**
色の指定の後に**セミコロン**を忘れないように！

参照コード

```html:
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>hamuo3</title>
    </head>
    <body>
        <h1 style="color: red;">CSS</h1>
    </body>
</html>
```
実行したときCSSの文字が赤色になっていればOKです。
###1-2 HTMLファイルの中に書く方法
一度bodyタグの中をstyle属性を消してこの状態にしておいてください。

```html:
<h1>CSS</h1>
```
方法はheadタグの中にstyleタグを書いていきます。
そのstyleタグの中にh1{}と書きます。{}の間で改行し、その中に先ほどと同じようにcolor:blue;と書き、一度保存し、Chromeを再読み込みすれば、今度はCSSの文字が青色に変わっているはずです。

参照コード

```html:
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>hamuo3</title>
        <style>
            h1{
                color: blue;
            }
        </style>
    </head>
    <body>
        <h1>CSS</h1>
    </body>
</html>
```
###1-3 別のファイルに書く方法
ホームページを作成するときはCSSを別ファイルに書くことが一般的です。
なぜかというとCSSファイルを作っておくことによって修正する際にhtml内に書いているより負担が少なくて済むからです。
ではファイルを作っていきましょう。
作る場所は**sampleファイル内のindex.htmlのある場所に新規作成からCSS**と名前を付けて作ります。
CSSのファイルの中で**右クリック→新規作成→テキストドキュメント→style.cssと名前を変更**します。

![スクリーンショット (121)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2416548/a5f33af9-e7df-bd0d-ad48-bd5ea600ecb1.jpeg)

次にこのテキストエディタをVSCodeにドラッグ&ドロップで読み込ませます。
ここまでできたらhtml
ファイルとcssファイルを紐付けしていきます。
方法はhtmlのheadタグから行います。
先ほど書いたstyleタグは消して、新しくlinkタグを使って紐付けを行います。
参照コード

```html:
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>hamuo3</title>
        <link rel="stylesheet" href="css/style.css">
    </head>
    <body>
        <h1>CSS</h1>
    </body>
</html>
```
この href="css/style.cssでcssファイルのstyle.cssを使う言うことになります。
これによって紐付けは完了です。ではcssを操作して文字の色を変えていきましょう。
**style.css**にこちらのコードを入れて、style.cssとリンク付けを行ったので**index.html**の保存を忘れずにしてください。

```html:
h1{
    color: green;
}
```
Chromを再読み込みさせ、文字が緑になっていれば成功です。

#2.CSSの書き方について
ここまでの説明である程度、規則性に気づいていると思いますが、書き方としてはCSSを適用させたい箇所、**セレクター**を書き、{}を書き、その間に操作したい内容を書いて行く形になります。ここの部分のことを**プロパティー**といいます。
そのため、今回の文字色変換の大まかな流れとしては、**セレクター{プロパティー、コロン、値、セミコロン}**という書き方になります。
また、cssの中身は色の変換+文字サイズの変更など複数書くことができます。
いかがだったでしょうか、今回はここまでとさせていただきます。
次回は一度簡単なホームページを作ってみようと思います。
それでは皆さん、お疲れ様でした。
Flutterのupgradeをしたら「CocoaPods installed but not working.」で苦戦した話

## 概要
Flutterを利用してiOSアプリを作成していたのだが、高解像度の画像をImage.networkで取得して表示するので、ページの読み込みに時間がかかっていた。
そこで、[cached_network_image](https://pub.dev/packages/cached_network_image)をpubspec.yamlに記述して```flutter pub get```した。
画像の処理を書き換えて、いざ```flutter run```すると、以下のようなエラーが発生した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505050/97ce15ca-c718-e1f2-9137-865a60430809.png)
```flutter doctor```を実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505050/a84629af-1d3d-1a23-99e4-9e3a03d5f571.png)
どうやらCocoaPodsがおかしいみたいだ。
installしているのにbrokenやらnot workingやら、内心「ハ・・・？」って感じ。

## 試したこと
### CocoaPodsの再インストール
エラーに[CocoaPods Guides](https://guides.cocoapods.org/using/getting-started.html#installation)を参照してre-installしろとご丁寧に書いてある。
言われるがままに実行してみる。

```
$ sudo gem install cocoapods
```

変化がなかったので、一度アンインストールして入れ直す。

```
$ sudo gem uninstall cocoapods && sudo gem install cocoapods
```

```flutter doctor```してみたが、これも同じエラーが返された。ビルドも失敗。

### 再起動
再起動後、```flutter doctor```したが、変化なし。

### brewでCocoaPodsをインストール
まずは、既存のCocoaPodsをアンインストールする。

```
$ sudo gem uninstall cocoapods
```

次に、brewでインストールしてみた。

```
$ brew install cocoapods
```
```flutter doctor```したが、変化なし。

## 解決策
CocoaPodsはRubyで動いているので、Rubyバージョンを上げることによって解決した。
今回は、rbenvを用いてアップグレードした。

```
$ brew install rbenv
```

その後、バージョン一覧を取得

```
$ rbenv install --list
2.6.9
2.7.5
3.0.3
3.1.0
jruby-9.3.2.0
mruby-3.0.0
rbx-5.0
truffleruby-21.3.0
truffleruby+graalvm-21.3.0
```

最新版をインストールする。
現時点(2022/01/13)での最新版は3.1.0
本体にインストールされていたのは2.6.8だった。逆になんで今まで動いてたんだ...？

```
$ rbenv install 3.1.0
$ rbenv global 3.1.0
$ rbenv init

# Load rbenv automatically by appending
# the following to ~/.zshrc:

eval "$(rbenv init -)"
```

次に、上記の```eval "$(rbenv init -)"```を、~/.zshrcに追加した。
最後に、```source ~/.zshrc```をして、```flutter doctor```を実行すると、正常に動作した。

一日中ゴニョゴニョしてしまったので、忘備録として。