OmniAICreator/Qiita-1.07M huggingface dataset:
markdown AIを使ってマークダウンを布教する記事を作成した

※本記事はQiita Engineer Festa 2024のキャンペーン「[markdown AIを使った記事を投稿しよう！](https://qiita.com/official-events/142fdd0d69ff6bb2d547)」の参加記事となります。

# markdown AIの強み

markdown AIのコンセプトに「子どもたちが簡単にウェブサイトを作成し、世界中の人々と交流できるようにする」とあります。

しかし、ウェブサイトを作成するだけであればもっと簡単に作成できるサービスが既に存在します。
そのうえで「markdown AI」を使う意味を考えた結果、markdownAIが他サービスと違う強みとは
- Googleアカウントのログインだけで無料で使えること
- サイトの公開も簡単にできること
- マークダウンを使って自由なコンセプトで記事が作れること

だと感じました。
ここに加えてマークダウンのテンプレートを独自に作成出来たり、AIが執筆を補佐する機能が加わってより一層簡単にウェブサイトが構築できるということだと思います。

この強みのうち「マークダウンを使って自由なコンセプトで記事が作れること」に着目しました。
Qiitaのような特定の分野に限った話題でなくても、自由なテーマでマークダウンに触れられることは良い事だと思います。

## markdown AIの活性化のために
子どもたちにmarkdown AIでサイトを作ってもらい、マークダウンを慣れ親しんでもらうきっかけが大切だと考えました。そのためにまずはマークダウンの魅力やメリットを知ってもらいます。

「マークダウンのメリットを説明するサイト」を**markdown AIで**作成することによりマークダウンの布教を行いたいと思います。

※今回のサイトを閲覧する対象は小学生高学年以上を想定しています。

## 成果物

https://storage.googleapis.com/topdowncom/content/zSvKzuWqNjTnM29CLoUhOn71Tv42/16ad9cc4-f4e5-471f-a873-83e60a17ed4e/index.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781188/ed245d36-6f9a-1494-0703-c78f9028978b.png)


マークダウンの紹介記事です。
使わなかった場合の比較と、どのような場面で使われているかについて説明しています。
ここに貼って気づいたのですが、OGPのタイトルがundefinedで表示されてしまうので可能であれば設定したタイトルが表示されたらいいなと思いました。
また、マークダウンで作成する系のサービスには見出しに応じたリンクを自動生成する機能がある印象なので、それもあると嬉しいです。

### 作ってみての感想
基本的には普段Qiitaで書いているのと同じ流れで作成できました。
ただし、Qiitaのように隣り合わせのプレビューがあったら嬉しいなとは思いました。
後、そもそものmarkdown AIの使い方が載っておらずマニュアルページは必要だと思います。

ちなみにサンプルのゴリラの紹介はChatGPTにお願いしてマークダウン形式で出力してもらいました。
ChatGPTにお願いしたものがそのまま使えるのもマークダウンの利点であると思います。
細かな仕様の違いはサービスごとにありますが、大まかなルールが同じなので「マークダウンでお願い」で通じるのが大きいです。
今後AIが機能として利用できるようになるとChatGPTと行き来することもなくなるのが良いと思います。

### 反省点

比較してもらうために、記事の中にマークダウンで執筆したサンプルの記事を書いたのですが、マークダウンで書いたほうが見づらくなってしまいました。
心なしか空白でインデントを付けたほうが見やすくなっている気がします。

それと、利点の1つである「HTMLタグも使える」が今回は活かせませんでした。

## markdown AIの今後について

個人的に一番気になるのはテンプレート作成で、styleタグによる装飾も込みでテンプレート化することにより、好みの見た目を選べてかつマークダウンで書けるサービスとして充実していきそうと感じました。
今後改修を重ねていく中でどのように充実されていくのか気になります。
GITブランチモデルを見直した

# 最初にまとめ
- 10年間git flowモデルでやってきたのを見直した
- 結局git flowベースの独自ルールになった
- 現在ではgit flowは良しとされていないが、新しいベストプラクティスがあるわけでもないため、既存のルールが合わなければ自分で独自ルールを決める必要がある

# きっかけ
今まで業務ではほぼBitBucketを使用して開発していたが、
同じチームのまま追加で開発することになった新規サービスでGithub Enterpriseを使うことになり、Github enterpriseではBitBucketの自動マージングが標準ではサポートされていなかったため、やり方を見直す必要がでてきた

Githubにも標準の自動マージ機能はあるが、用語の意味が異なる
### Github
PRが承認され自動テストも通った場合に自動でPRをマージする
https://docs.github.com/ja/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/automatically-merging-a-pull-request
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244191/fe645bf3-fd38-caa4-11d9-142173a016c8.png)

### BitBucket
releaseブランチにマージした時、それより未来のreleaseブランチにもマージする
https://confluence.atlassian.com/bitbucketserver089/automatic-branch-merging-1236435695.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244191/e9abb83c-8402-bcb2-c2f0-1a4d86a53b9d.png)

# 従来の開発スタイル
B to B to Cの比較的規模の大きめのサービスであり、即日~数日でリリースする小規模なものもあれば、半年以上かける大規模なものもあり、かつ複数同時に走ることがある

そのため複数のreleaseブランチが平行して存在していることも珍しくはなく、
featureブランチからreleaseブランチにマージした後はreleaseブランチ間、及びreleaseブランチからdevelopブランチ間を自動でマージしてくれるBitBucketの自動マージング機能が重宝していた

# 従来の小さな問題点
- リリースを終えたreleaseブランチをmasterブランチへマージするのはいいが、その後にmasterブランチを次のreleaseブランチにマージしなおすのがやや手間（自動化は検討していた）
- masterブランチは管理上存在しているが、それを直接使うことはあまりない

# なぜgit flowは廃れたか
10年前に[A successful Git branching model](https://nvie.com/posts/a-successful-git-branching-model/)を見て導入を決めたが、本人が追記している通り、昨今の自動化が進んだwebアプリには必要以上に複雑で合わない場合が多いため
とはいえ万能薬ではなかったというだけで、複数バージョンを同時に開発することのあるうちのような開発スタイルには合っていた

# 他の有名な開発手法との比較対象
例えばgithub flowは軽量な手法として今一番人気があると思われるgitブランチモデルだが、大規模な複数のラインが走る開発には向いておらず、他の方法も同様の傾向が見られたため採用を見送った

# 結論
既存のルールでは自分たちの開発スタイルに合わないことがわかり、
開発スタイルをそのために変えるのは本末転倒、かつ短期間で変えるのは問題が多いということで、
当面はgit flowをベースに一部を見直したルールで運用することにした

まずは直近のリリースブランチを作成するのをやめ、masterブランチに兼任させた
これによりリリース後のmasterブランチへのマージが不要になり、hotfixが必要な場合は直近のtagから生成することにした

また、当面の間は自動マージングを手動で運用することにした
こちらはGithub actionsを使えば自動化はできるが、将来的により軽量な開発サイクルへの移行を期待し、
複数の大型リリースブランチが混在すること自体を避けるようにするための試みとして決定した

# 感想
github flow以外にも名前がついている開発手法はいくつかあるが、
実際に試してみないとイメージが掴みづらく、思ったよりも決定に時間がかかった

ブランチモデルの命名ルールによる検索性の低さからか、あるいは単純に興味を持つ人がすくないのか、gitの利用者数の割にブランチモデルのついての議論が少ないように思われた

特に見直すタイミングがなく、深く考えないまま10年も続けていたやり方なので、自分たちの開発スタイルも含めて見直すいい切っ掛けとなった
ついにMWAAのコンソールからプライベートなWebサーバーにアクセスできるようになった！！

## はじめに
2024年6月18日、タイトル通りのことが出来るようになりました。
試してみたので記事にしてみました。

https://aws.amazon.com/jp/about-aws/whats-new/2024/06/amazon-mwaa-custom-web-server-urls/

## 今まではどうだったのか
MWAAのコンソールには、「Airflow UIを開く」というリンクがありまして、それを押下するとAiwflowの管理画面に遷移することが出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/7a2fb4b5-92e3-013e-35c1-585e1b5423b3.png)

ただし、それはパブリックネットワークで環境を作成した場合です。
**プライベートネットワーク**で環境を作成すると、WebサーバーがVPC内に配置されます。そのため、この「Airflow UIを開く」を押しても、VPC内のWebサーバーにインターネットを介してアクセスすることが出来ず、エラーとなって接続できません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/c43ad084-ee5f-9fbd-707e-a2ae72c9785a.png)

ではどうするかというと、アクセストークンを発行して、そのトークンをウェブサーバーのURLの後ろにくっつけて、そのURLでアクセスしなければなりません。

https://docs.aws.amazon.com/ja_jp/mwaa/latest/userguide/call-mwaa-apis-web.html

CloudShellなどでアクセストークンを発行して、そのトークンをURLの後ろにくっつけてコピーして、ブラウザにペーストして…やっとWebサーバーにアクセス出来ます。流石に毎回それは面倒なのでスクリプトを書いて、トークン発行とURLの作成を行って表示することになると思いますが、それもそれで面倒なものでした。

**しかし！！！！**
今回のアップデートで、「Airflow UIを開く」の**リンク先を変更**できるようになったのです！！！！つまり、
**ALBのアドレスをここに登録しておけばコンソールからワンクリックでAirflow UIに飛べます！！**
人類待望のワンクリックアクセスが現実となったのです！！！

## やってみる

### 前提
こちらを参考に実施します。
といっても以下に書いてあるのはほとんどがRoute 53とACMとALBを使っての接続のやり方です。

https://docs.aws.amazon.com/ja_jp/mwaa/latest/userguide/configuring-custom-domain.html

こちらで分かりにくい場合は、以下を見ながら設定することをお勧めします。今回は、既に固定アドレスでAirflow UIにアクセスできるようになっている状態からスタートします。

https://blog.serverworks.co.jp/mwaa-network

https://dev.classmethod.jp/articles/route53-domain-onamae/

### リンク先の変更
[update-environment](https://docs.aws.amazon.com/cli/latest/reference/mwaa/update-environment.html)を実行してベースURLを変更します。
以下をCloudShellで実行しました（`xxxxx.com`がAirflow UIのURLです）。

```
aws mwaa update-environment --name MyAirflowEnvironment-private --airflow-configuration-options '{"webserver.base_url":"xxxxx.com"}'
```

上記実施後にget-enviromentで確認すると、以下のように`webserverUrl`が変更されていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/fd2c1a38-7d39-b2da-eca3-c2c33d839c53.png)


では、コンソールからリンクを押してみます…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/8c3d39fd-e215-ce50-bc3e-eefa33b8b57f.png)
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/59bfc233-4dfd-a8ee-64c3-843ee5139255.png)
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/11eea5dd-fb36-c3f6-0f30-7b447c6581fe.png)

無事、プライベートのWebサーバーに、MWAAコンソールからアクセスできました。便利！

## おわりに
MWAAを企業で運用していく場合は、ほとんどの場合はプライベートに配置することになると思います（[別の記事](https://qiita.com/yust0724/items/05e9b3d15f4a0f4da51d)でも書きましたが、パブリックだとIPアクセス制限かけられず全開放になってしまう）。
その場合、毎回トークン発行してログインしなくてはならず手間がかかっていました。それがこのように楽にアクセスできるようになったので、より活用しやすくなっていったと思います。
今後も、MWAA色々触っていこうと思います。
円周上の3点の内積「2020 一橋大学 前期【3】」をChatGPTとsympyとWolframAlphaでやってみたい。(その2)質問を変更「XA=1+cos(a),YA=sin(a),XB=1+cos(b),YB=sin(b) の時のXB*XC+YB*YCの時の最大値と最小値」


申し訳ありません。私は、理解できませんでした。
＞**今から、Pythonを用いて作図を行います。...**
いつになく、ステキ。


# (再)オリジナル
・PASSLABO 様 (0:00〜12:05) 

https://youtu.be/Hc56A5pTcJs?si=gL-hDZpmLIvhMYOX

・大学入試数学問題集成 様＞ 前期【3】　テキスト

https://mathexamtest.web.fc2.com/2020/202010272/2020102720100mj.html#top-0103

# ChatGPT-3.5先生へ(1回目) できませんでした。
```
XA=1+cos(a),YA=sin(a),XB=1+cos(b),YB=sin(b) の時のXA*XB+YA*YBの時の最大値と最小値
```
...
したがって、式 XA⋅XB+YA⋅YB の最大値は 4、最小値は -2 となります。

# ChatGPT-3.5先生へ(2回目) sympyで、できませんでした。
・**1点を原点にしました。**
　他のサイトだと、1点を(-1,0)にして円の中心を、原点にしてありました。
```
XA=1+cos(a),YA=sin(a),XB=1+cos(b),YB=sin(b) の時のXA*XB+YA*YBの時の最大値と最小値。
最大値と最小値の時の三角形も作図して下さい。
```
...
この条件を考慮して図を作成するには、プログラムを使用して描画することができます。今から、Pythonを用いて作図を行います。

# WolframAlphaで できませんでした。

https://www.wolframalpha.com/input?i=XA%3D1%2Bcos%28a%29%2CYA%3Dsin%28a%29%2CXB%3D1%2Bcos%28b%29%2CYB%3Dsin%28b%29+%E3%81%AE%E6%99%82%E3%81%AEXA*XB%2BYA*YB%E3%81%AE%E6%99%82%E3%81%AE%E6%9C%80%E5%A4%A7%E5%80%A4%E3%81%A8%E6%9C%80%E5%B0%8F%E5%80%A4&lang=ja

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

# いつもと違うおすすめです。
・
SRC.ai - Io.net、MOU締結 "GPUインフラと自律走行モデルの強化"

AI基盤のデータプラットフォームSRC.aiと分散型コンピューティングネットワークIo.netは、MOUを締結し協力関係を結んだと発表した。

![SRC1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784576/1a47036d-e5c2-6a99-b7dc-3bc7a4a66f09.jpeg)

Io.netはWeb2クラウドコンピューティングサービスAWSのWeb3分散型バージョンである。アマゾンなど大手企業が提供していたクラウドサービスに比べ、より安価にコンピューティングパワーを利用できる。AI人工知能およびマシンラーニング企業向けのコンピューティングパワーソーシングに重点を置いている。ソラナベースのIo.netは、昨年のソラナハッカソンで優勝し、Hack VCが主導するMulticoin Capital、6th Man Ventures、Solana Labs、Delphi Digital、Animoca Brands、OKX Ventures、Solana Ventures、The Sandboxなどの一流企業から3,000万ドルを成功裏に調達した。11月のリリース以降、25,000を超えるノードと47,000を超えるコンピューティング時間を処理し、30万ドル以上の収益を上げており、成功軌道を走っている。

SRC.aiは、日常の運転データから収益を生み出し、運転習慣を記録して報酬を得る活動に変えるAI基盤のWeb3アプリである。この革新的なプラットフォームは、AIエージェントを通じてデータ収集と意思決定を自動化し、GPS速度追跡とAI分析を統合することで運転活動を改善し、報酬を与える。注目すべき点は、SRC.aiが運転手に生成したデータをTeslaの自律走行技術開発に貢献する機会を提供し、Teslaの自律走行アルゴリズムの発展に必要な実際の走行データを提供することで、運転手に追加収入を生み出せることだ。また、グローバルモビリティサービスプラットフォームUberの運転手も、SRC.aiプラットフォームを通じて記録されたデータを提供することで報酬を受け取れるため、大きな関心が寄せられている。

![SRC2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784576/5f14e4b3-b826-2d54-7aa4-abf7e83bdd37.jpeg)

一方、最近SRC.aiはTeneoとMOUを締結したことが報じられた。Teneoは、革新的なトークノミクス、ガバナンス参加、収益創出、ステーブルコインメカニズムを提供するDeFi環境の包括的ソリューションを代表するプロジェクトで、分散金融の進化する世界に参加しようとするユーザーにとって注目すべきプラットフォームである。初期の成功裏のリリース後、価格が最高で約3,000倍になるなど目覚ましい成果を上げている。また、PeaqとTeneo財団は様々な側面で緊密なパートナーシップを結んでおり、TeneoはPeaqでERC20トークンの形でトークンを構築し、DeFi(分散型金融)サービスもPeaqで立ち上げ準備中である。

2024年に仮想通貨ベンチャーキャピタル投資が復活し、40億ドル以上がスタートアップに投資された中で、ソラナプラットフォームのDePIN(分散型物理インフラネットワーク)プロジェクトが主要分野となり、Io.net、Peaqなどがその代表例である。SRC.aiとTeneoのこの協力により、世界中の数百万台のダッシュカムからメタデータにアクセスできるようになった。これにより、ユニークなPeaq IDを持つ多数のデバイスをオンチェーンに持ち込むことで、Peaqとの協力が強化される。Io.netのA100モデルを使用してLLMが自律走行およびビジョン研究のための教育データを構築し、最終的に自律走行モデルを開発できるようになる。より多くのユーザーがビデオおよび画像の走行データを提供することで、GPUコンピューティングをさらに向上させ、最低8×A100まで成長すると予想されており、協力を惜しまないと述べている。さらにSRC.aiは、Burrito Walletとの業務提携を通じてビジネスネットワークを積極的に活用し、SRC.aiのユーザー拡大を図る。Burrito WalletはBithumbが運営する仮想通貨ウォレットサービスの一つで、Bithumbのデジタル資産管理プラットフォームである。

<b>メディア関係者連絡先</b>

会社：Cryptofellas LLC 
担当者：Justin Chang 
ウェブサイト：https://saferoadclub.app/
GASで指定した範囲のセル内の空白を削除する

ベストプラクティスがこれでいいのかもわからないがメモ。

### やりたいこと
- スプレッドシート上でセルを範囲指定する
- 各セルの中にある全角・半角スペースを削除する

### ソース
- getRange()で範囲を指定
    - 1行目D列のデータがある最終行(getLastRow())まで
- createTextFinderで検索条件を指定
- useRegularExpressionで条件を正規表現として扱う
- replaceAllWithで置換する文字列を指定(今回は削除)

\sが効いてなさそうで、半角スペースそのものを入れたらいけた

```JavaScript
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName("シート2");
  const lastRow = sheet.getLastRow();
  sheet.getRange(1,4,lastRow,1)
       .createTextFinder('(\s| |　)')
       .useRegularExpression(true)
       .replaceAllWith('');
```
Raspberry pi4でK8Sクラスタを立ててみた。

# はじめに

naritomoと申します。

本職はインフラエンジニアを行っています。

今回はラズパイ4でK8Sクラスタを構成してみました。

いろいろアドバイスいただけると嬉しいです。

## 概要

RaspberryPi４（４GB）４台でK8Sクラスタを立ててみました。

## 外観図

![E973F558-7BD8-435C-855D-C8F24D016B4C_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/6a16b45f-8512-1192-7c48-d8424a1bb17a.jpeg)

上から以下の機器を付けています。
* 無線APアクセスルータ
* ラズパイ4 4台
* LANスイッチ５ポート
* USB電源　６ポート

## 物理構成図

![raspik8s-物理構成.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/0c61622a-e260-4b67-b417-aba9763ca0d4.jpeg)

## 論理構成図

![raspik8s-論理構成.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/7a8753db-5af7-f6a9-8f56-c24363075a92.jpeg)

## Laravelサイト構成

実際の運用例として以下の構成でLaravelサイトを建ててみました。

![raspik8s-Laravelサイト構成.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/a520dd0e-bd09-f7d0-45e5-062eaf5205a2.jpeg)

## 参考サイト

以下のサイトがかなり参考になりました。

ありがとうございます。

https://qiita.com/kentarok/items/6e818c2e6cf66c55f19a

https://skanehira.github.io/this-week-in-gorilla/articles/raspberry-pi-cluster.html

https://zenn.dev/eiden0029/articles/kubernetes-cluster

https://blog.pinfort.me/posts/raspberry-pi-4-k8s-3/

https://qiita.com/honma-h/items/fc9f187dcafa9f91d97e

https://qiita.com/tkarube/items/d3c008cc0dc9d139f819

https://blog.denet.co.jp/building-an-nfs-server-and-using-it-as-storage-from-kubernetes/

https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#kubeadm-kubelet-kubectl%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB:~:text=Ubuntu%E3%80%81Debian%E3%80%81%E3%81%BE%E3%81%9F%E3%81%AFHypriotOS

# おわりに

この記事がK8Sを扱う方の助けになればと思います。
【試用版のみ】Exchange OnlineでThunderbirdからの送信が出来なかった【解決済み】

## ・そういえば書き忘れていた
以前投稿した、[【令和6年最新版】苦しんでThunderbirdでExchangeのメールを使う](https://qiita.com/myamivrc/items/4df95a05e201f0c435a7 "【令和6年最新版】苦しんでThunderbirdでExchangeのメールを使う")ではたくさんの方に見ていただいたようであった。
また、コメントくださった方もいてこんな場末の記事に来ていただき感謝してもしきれない。

さて、筆者が本記事投稿日に[別の記事](https://qiita.com/myamivrc/items/7d1ab3295ce1eabcaef1 "どうやってもAndroidスマホが重い場合の別のアプローチ")を書いていたところ、[【令和6年最新版】苦しんでThunderbirdでExchangeのメールを使う](https://qiita.com/myamivrc/items/4df95a05e201f0c435a7 "【令和6年最新版】苦しんでThunderbirdでExchangeのメールを使う")で書き忘れてたことがあったことを思いだした。

それがタイトルに書かれていることなのだが、あの時Docsの隅々まで検索してやっと見つけたものだったなをふと思い出した。

**じゃあQiitaに書くしかないな。**

## ・なぜか送信が出来ない。
Thunderbirdの設定が終わり、さらにQiitaに対処法を書き終わって一息ついていたころ、利用者から送信が出来ないと問い合わせがあった。

何事かと思いExchenge管理センターを覗いたところ当該メールと思わしきメールが「550 5.7.708」で送信エラーとなっていた。

Docsを覗いたところ以下のことが書いてあった。

```
550 5.7.708
完全な NDR エラー メッセージは次のとおりです。

550 5.7.708 サービスを利用できません。 アクセスが拒否され、この IP からトラフィックが受け入れられない。

この NDR は、評判の低い IP アドレスから電子メール メッセージを送信した場合に生成されます。 この問題は、Microsoft 365 試用版サブスクリプションを持つユーザーなど、新しい顧客に影響を与える可能性が高くなります。
```
参考URL：[NDR エラー コード 550 5.7.703、550 5.7.705、550 5.7.708、550 5.7.750](https://learn.microsoft.com/ja-jp/exchange/troubleshoot/email-delivery/ndr/fix-error-code-5-7-700-through-5-7-750#550-57708 "NDR エラー コード 550 5.7.703、550 5.7.705、550 5.7.708、550 5.7.750")

**なんとExchange Onlineの体験版中ではメールが送信できないようであった。**
また、OWA・Outlookでは送信できるあたり、**試用版ではThunderbirdによる送信はできないようであった。**

## ・結論
このエラーを上司に説明し、サブスクリプションを契約後、正常に送信を行うことが出来た。
しかしながら、まぁOutlookを使っていれば出ないエラーなのでいい体験ができたと思う。

とはいえくやしい。チクショウ
Python for 鬼の100本ノック in range(1, 30)

日記

30【要素と同時にインデックス情報の取得】まで1週目

https://www.youtube.com/watch?v=Gh0qRBHbnVs&t=2392s

エディターにいるペットのおかげではかどります。

![画像6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/b7e8e508-7aa4-d9e7-299a-df8186df58d3.png)
マウスカーソルを乗せているときだけ表示される要素を Chrome の開発者ツールで抽出する方法

# はじめに
マウスカーソルを乗せているときだけ表示される要素ってありますよね。たとえば

* YouTube のサムネイルにマウスカーソルを合わせると動画のプレビューが表示される
* Twitter の投稿の投稿者名にマウスカーソルを合わせるとその人のプロフィールのプレビューが表示される

などが挙げられます。

こういった要素を Chrome の開発者ツールで検証したいとき、要素を抽出しようとしてもマウスカーソルを動かしたらその要素が消えてしまうので指定できないという問題が発生します。今回はこれを解決する方法を紹介します。



# 設定方法
方法はいたってシンプルです。

1. 開発者ツールを開く
    * 右クリックメニューから「要素を検証」（または "Inspect"）を選択すると開きます
    * macOS の場合は `Command` + `Option` + `I` でも開きます
2. タブから "Sources" を選択する
3. 検証したい要素にマウスカーソルを合わせて表示された状態にする
4. `F8` を押して JavaScript デバッガのブレークポイントを設定する
    * MacBook のキーボードの場合は `Option` + Media の再生/停止キーで `F8` になります
5. 要素を抽出する
    * 開発者ツールメニューの左上にある左斜め上の矢印があるアイコンをクリックします
    * macOS の場合は `Command` + `Shift` + `C` でも同様の結果となります

ポイントは "Sources" タブを開いた状態で `F8` を押すことです。別のタブ（たとえば "Elements" タブなど）では JavaScript のデバッグ機能が使用できませんのでご注意ください。



# 解除方法
解除する場合は再び `F8` を押下してブレークポイントから再開します。



# 参考
* [マウスカーソルを乗せている間だけ表示される要素を、開発者ツールで調べるには](https://ja.stackoverflow.com/questions/24648/%E3%83%9E%E3%82%A6%E3%82%B9%E3%82%AB%E3%83%BC%E3%82%BD%E3%83%AB%E3%82%92%E4%B9%97%E3%81%9B%E3%81%A6%E3%81%84%E3%82%8B%E9%96%93%E3%81%A0%E3%81%91%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B%E8%A6%81%E7%B4%A0%E3%82%92-%E9%96%8B%E7%99%BA%E8%80%85%E3%83%84%E3%83%BC%E3%83%AB%E3%81%A7%E8%AA%BF%E3%81%B9%E3%82%8B%E3%81%AB%E3%81%AF)
* [Chrome DevToolsでJavaScriptのデバッグ！](https://learningbox.co.jp/2019/12/16/blog_chrome-devtools/)
円周上の3点の内積「2020 一橋大学 前期【3】」をChatGPTとsympyとWolframAlphaでやってみたい。(その1)

・~~(その2)を制作中です。　2024-06-21~~    
https://qiita.com/mrrclb48z/items/e0399d05b7350a2e9e11

# オリジナル
・PASSLABO 様 (0:00〜12:05) 

https://youtu.be/Hc56A5pTcJs?si=gL-hDZpmLIvhMYOX

・大学入試数学問題集成 様＞ 前期【3】　テキスト

https://mathexamtest.web.fc2.com/2020/202010272/2020102720100mj.html#top-0103

# ChatGPT-3.5先生へ(1回目) できませんでした。
・ページのソースを表示です。MathMLです。
　省略しようと思いましたが、大学入試数学問題集成 様 の全文から必要部分の抜粋です。
```
<div class="refinfo">
<p>2020　一橋大学　前期</p></div>
<div class="refinfo2">
</div>
<div class="diff"><p>易□　並□　難□</p></div></div>
<div class="qbody">
<p class="slevel"><a name="q-0103" 
id="q-0103"></a><span 
class="qnum">【３】</span>　半径<math>
<mspace width=".2em"></mspace><mn>1</mn>
<mspace width=".2em"></mspace>
</math>の円周上に<math>
<mspace width=".2em"></mspace><mn>3</mn>
<mspace width=".2em"></mspace>
</math>点<math>
<mspace width=".2em"></mspace><mrow>
<mi mathvariant="normal">A</mi><mspace width=".2em"></mspace>
<mtext>，</mtext></mrow>
</math><math>
<mrow><mi mathvariant="normal">B</mi>
<mspace width=".2em"></mspace><mtext>，</mtext></mrow>
</math><math>
<mi mathvariant="normal">C</mi><mspace width=".2em"></mspace>
</math>がある．内積<math>
<mspace width=".2em"></mspace><mrow><mover><mi>AB</mi>
<mo>&rightarrow;</mo></mover><mo>&sdot;</mo>
<mover><mi>AC</mi><mo>&rightarrow;</mo></mover></mrow>
<mspace width=".2em"></mspace>
</math>の最大値と最小値を求めよ．
</p>
</div>
</div>
```
```
日本語で
```
結論
最大値は 4、最小値は 0です。

# ChatGPT-3.5先生へ(2回目) sympyで、できませんでした。
```python
import sympy as sp

# 変数を定義
theta1, theta2 = sp.symbols('theta1 theta2')

# 点の座標を定義
A = sp.Matrix([1, 0])
B = sp.Matrix([sp.cos(theta1), sp.sin(theta1)])
C = sp.Matrix([sp.cos(theta2), sp.sin(theta2)])

# ベクトルABとACを計算
AB = B - A
AC = C - A

# 内積を計算
dot_product = AB.dot(AC)

# 内積の式を簡単化
simplified_dot_product = sp.simplify(dot_product)

# 内積の最大値と最小値を求める
max_value = sp.Max(simplified_dot_product.subs(theta1, 0).subs(theta2, 0),
                   simplified_dot_product.subs(theta1, sp.pi).subs(theta2, sp.pi),
                   simplified_dot_product.subs(theta1, 0).subs(theta2, sp.pi),
                   simplified_dot_product.subs(theta1, sp.pi).subs(theta2, 0))

min_value = sp.Min(simplified_dot_product.subs(theta1, 0).subs(theta2, 0),
                   simplified_dot_product.subs(theta1, sp.pi).subs(theta2, sp.pi),
                   simplified_dot_product.subs(theta1, 0).subs(theta2, sp.pi),
                   simplified_dot_product.subs(theta1, sp.pi).subs(theta2, 0))

max_value, min_value
```

結論
このコードを実行すると、内積の最大値が　4、最小値が 0 であることを確認できます。



# sympyで(オリジナル 様の方法を参考に)
勉強中です。省略

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

# いつもと違うおすすめです。
・
Next.js が何もしていないのに壊れました

壊れていない。

# 環境
- Windows 10 Enterprise 22H2
- Windows PowerShell 5.1.19041.4291

# 現象

開発サーバーを起動して意気揚々と [http://localhost:3000/](http://localhost:3000/) にアクセス。

```shell
PS C:\Users\Foo> cd /dev
PS C:\dev\next-app> npm run dev

> next-app@0.1.0 dev
> next dev

  ▲ Next.js 14.2.4
  - Local:        http://localhost:3000

 ✓ Starting...
 ✓ Ready in 1989ms
 ```

![localhost_3000_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/9b0bbe08-a3cf-9949-eebf-7326d4cdf639.png)

 > Application error: a client-side exception has occurred (see the browser console for more information).

 ターミナルにぶわーっとエラーが流れてえぐぅーっとなった。

 # 原因
 ターミナルのカレントディレクトリまでのパスに実際の大文字・小文字と差異があった。
 今回の例では `/dev` が誤りで正しくは `/Dev` であった。

 ```shell
PS C:\Users\Foo> cd /Dev
PS C:\Dev\next-app> npm run dev

> next-app@0.1.0 dev
> next dev

  ▲ Next.js 14.2.4
  - Local:        http://localhost:3000

 ✓ Starting...
 ✓ Ready in 2.1s
 ```

 ![localhost_3000_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/44e2d4fa-f15e-9722-fa03-f4584751a4e0.png)


 # 参考
[Nextjs Error: Application error: a client-side exception has occurred (see the browser console for more information)](https://stackoverflow.com/questions/77571562/nextjs-error-application-error-a-client-side-exception-has-occurred-see-the-b)
JavaScriptでファイルのサイズ、拡張子をチェックする

```
<script>
document.addEventListener('DOMContentLoaded', function () {
  const allowExtensions = '.(jpeg|jpg|png|gif)$'; // 許可する拡張子
  const file01= document.getElementById('file01');
  file01.addEventListener('change', function () {
    if(file01.files[0].size > 2000000) {
        alert("ファイルサイズは2MB以内にして下さい");
　　　　file01.value = "";
        return; // 処理を中断
    }
    if (!file01.files[0].name.match(allowExtensions)) { // 許可する拡張子以外の場合
        alert('拡張子が jpeg, jpg, png, bmp, gif 以外のファイルはアップロードできません。');
        file01.value = "";
        return; // 処理を中断
      }
  });

});
</script>
```
JavaScriptのみで非同期通信

チェックボックスの状態を取得し、apiで表示を変更するサンプル
```
async function entertainer_api() {
	api_val = getValue("api_val");
	let form = new FormData();
	form.append("api_val", api_val);
	const url = "/api.php";
	await fetch(url, {
		method: 'POST',
		body: form,
	})
	.then(response => response.json())
	.then(data => {
		var update_ul = document.getElementById("re_ul");
		update_ul.innerHTML = "";
		if(data.retuen_list) {
		  re_ul.innerHTML = data.retuen_list;
		}
	})
	.catch(error => {
		console.error('通信に失敗しました', error);
	});
}

function getValue(classname) {
	var checks = document.getElementsByClassName(classname);
	var str = '';
	for ( i = 0; i < checks.length; i++) {
		if ( checks[i].checked === true ) {
			if(i > 0) {
				str += ",";
			}
			str += checks[i].value;
		}
	}
	return str;
}
```
どうやってもAndroidスマホが重い場合の別のアプローチ

## ・こんなところに書くことでもないが・・・
さて、Qiitaというのはエンジニアtoエンジニア向けのブログサービスであって、システムに詳しくない一般ユーザ向けのサービスではないのは周知のとおりである。

時に、筆者のスマホ(Torque 5G)がどうもLINEを開くにも一苦労、いらないアプリを削除しても重いしウイルスチェックをしても引っかからない状況であった。

しかしながら、各事象を一つずつ紐解いた結果、原因が判明し対処を行ったところスマホの動作が正常になった。

しかもどのサイトを見てもその対処が書いてない始末。

**じゃあQiitaに書くしかないな。**

## ・結局のところ原因は何なのさ
まぁこんな記事を見ている時点で切羽詰まっているだろうし原因を記載する。
原因は、

**SDカードの劣化による破損**

であった。

一般のアフィリエイトブログであればつらつらと毒にも薬にもならないことを書くのだがここはQiitaである。
筆者の解析した結果を以下に記載していく。

## ・AndroidにおけるSDカードの役割
AndroidにおいてSDカードを使用する場合、役割は主に2つに分けられる。

| 役割 | 説明 |
|:-:|:--|
| 内部ストレージとして扱う  |  スマホ内部のストレージとSDカードを混ぜて運用する。ストレージ容量が大きく見えるがSDカードが破損したらスマホの中身は全損である。 |
| 外部ストレージとして扱う  | あくまで、内部のストレージとSDカードは別として運用する。SDカードが故障してもスマホは無事。でもSDカードに保存したデータはお星さまに。思い出はプライスレス。|

さて、勘のいいひとは、ここで **「どうせお前内部ストレージとしてSDカードを設定したんやろ」** と思われるかもしれない。それは正しい考えである。しかしながら筆者は **外部ストレージとしてSDカードを設定していた。**

じゃあなぜ外部ストレージとして設定したSDカードの破損がスマホに影響を齎したのか。

## ・AndroidにおけるSDカード(外部ストレージ)の役割
それはずばり、 **AndroidにおいてSDカード(外部ストレージ)の役割はバックアップやデータの移動のみではない** からである。

Androidにおいて、SDカードを内部ストレージとして設定した場合アプリなどもそちらに保存されるわけである。
SDカードを外部ストレージとして設定した場合は？アプリなどはSDカードを使用できないように見えるが実は違う。
空っぽのSDカードをAndroidスマホに差せば一目瞭然であるが、初回接続時に **Android用領域や各アプリ(後述)用のフォルダが生成される。** 
つまり、外部ストレージとして設定しようがAndroidは勝手にSDカードを使うわけである。
その中身を覗いたところ、 **AndroidはSDカードをキャッシュとして使用していた！** 

さらに、最近のアプリは **SDカードを使用する権限を要求し(内部ストレージとして設定したなら権限無しに使ってくる)、SDカードにアプリ用領域を作る始末。**

こんな状況ではSDカードが破損すればAndroidに影響が出るのは確実であろう。

## ・結論
破損したSDカードは使用開始から6年以上が経過しており、もはや限界は遥か前に通り過ぎていたであろう。
何とか読み出しには成功したものの、以前より読み出しに異常が出ておりさっさと交換していればイライラしなかったのは自明であろう。

また、ネットでは当然こんなことは書いていないので一般ユーザからすればスマホには異常が無いのに携帯ショップに行って勧められるがままに機種変を行うのは目に見えている。

だからこそ、Qiitaにこの記事を残しておきたい

:::note info
結論
電子機器は消耗品なんだから異常が出たらさっさと交換しよう。
:::
Laravelのクエリビルダとモデルの違い

## はじめに
Laravelには、データベース操作を簡単にするためのツールとして、クエリビルダとEloquent ORM（モデル）が用意されています。
これらのツールはそれぞれ異なる目的と特性を持ち、適切に使い分けることで効率的なデータベース操作が可能になります。
Laravelのクエリビルダとモデルの違いについて解説します。

## クエリビルダとは
クエリビルダは、データベースクエリをSQL文として直接書かずに、メソッドチェーンを使用してクエリ実行することができます。
複雑なクエリもSQL文をそのまま書くより簡潔に記述でき、データベース操作に対して細かい制御も可能です。
```php
use Illuminate\Support\Facades\DB;

// 単純なSELECTクエリ
$users = DB::table('users')->get();

// 条件付きSELECTクエリ
$activeUsers = DB::table('users')->where('active', 1)->get();

// 複雑なJOINクエリ
$usersWithPosts = DB::table('users')
    ->join('posts', 'users.id', '=', 'posts.user_id')
    ->select('users.*', 'posts.title')
    ->get();
```

## Eloquent ORM（モデル）
モデルオブジェクトとデータベーステーブルを対応させることで、データベース操作をオブジェクト指向的に扱えるようにします。
コードが直感的で読みやすくでき、モデル間のリレーションシップ（1対多、多対多など）などを簡単に定義し操作できます。
多くの便利なメソッドが用意されています。
```php
use App\Models\User;

// 全てのユーザーを取得
$users = User::all();

// 条件付きクエリ
$activeUsers = User::where('active', 1)->get();

// リレーションシップを使ったクエリ
$user = User::find(1);
$posts = $user->posts; //

```

## クエリビルダとEloquentの違い
### 構文と使用感
#### クエリビルダ:
メソッドチェーンを使ってクエリを構築します。
SQLに近い構文で、細かい制御が可能です。
SQLに精通している開発者には直感的ですが、モデルの概念がないため、オブジェクト指向的な操作には向いていません。

#### モデル:
オブジェクト指向的にデータベース操作を行います。
リレーションシップやスコープを使った柔軟なクエリが容易に書けます。

## リレーションシップ
### クエリビルダ:
JOINを使用してテーブル間のリレーションを操作します。
明示的にJOIN条件を記述する必要があります。

### モデル:
モデル間のリレーションシップを定義し、簡単にリレーションを操作できます。
$user->postsのような直感的な構文でリレーションを扱えます。

## まとめ
Laravelのクエリビルダとモデルは、それぞれ異なる目的と特性を持っています。
クエリビルダは、直接的なSQL操作と柔軟性を提供し、モデルはオブジェクト指向的なデータベース操作とリレーションシップ管理を簡素化します。
プロジェクトの要件に応じて、これらのツールを適切に使い分けることで、効率的かつ効果的なデータベース操作を実現できます。
リポジトリ内のコードの行数の合計値を取得するには

## リポジトリのコードの行数の合計値を取得するには
```
git ls-files
```
コマンドでリポジトリ内のファイルを一覧で表示します

```
xargs wc
```
のオプションを追加することで左から行数、単語数、バイト数を表示し、
-lオプションで行数のみ表示させることができます

```
git ls-files | xargs wc -l
      50 .github/workflows/deploy-storybook.yml
     130 .gitignore
      19 Makefile
      16 README.md
       4 application/.env
       3 application/.eslintrc.json
      31 application/.storybook/main.ts
       7 application/__test__/handlers.ts
      22 application/__test__/mocks/authinfo/index.ts
       0 application/__test__/mocks/user/index.ts
       4 application/__test__/node.ts
      22 application/__test__/unit/login.test.tsx
      11 application/components/elements/Task.jsx
      35 application/components/elements/Task.stories.jsx
      22 application/components/elements/input.tsx
      72 application/features/LoginForm.tsx
      74 application/features/fetch.ts
      31 application/jest.config.js
      29 application/jest.polyfills.js
      10 application/jest.setup.ts
       5 application/next-env.d.ts
      13 application/next.config.js
   22387 application/package-lock.json
      64 application/package.json
       9 application/pages/404/index.tsx
       6 application/pages/_app.tsx
      13 application/pages/_document.tsx
      11 application/pages/index.tsx
       9 application/pages/top/index.tsx
       6 application/postcss.config.js
      30 application/public/favicon.ico
       0 application/public/next.svg
       0 application/public/vercel.svg
       3 application/styles/globals.css
      82 application/tailwind.config.ts
      23 application/tsconfig.json
       4 application/types/index.ts
   23257 total
```

また、以下のようにgrepを使って特定の拡張子を持つコードの行数の合計値を取得できます
```
git ls-files | grep '\.ts' | xargs wc -l
      31 application/.storybook/main.ts
       7 application/__test__/handlers.ts
      22 application/__test__/mocks/authinfo/index.ts
       0 application/__test__/mocks/user/index.ts
       4 application/__test__/node.ts
      22 application/__test__/unit/login.test.tsx
      22 application/components/elements/input.tsx
      72 application/features/LoginForm.tsx
      74 application/features/fetch.ts
      10 application/jest.setup.ts
       5 application/next-env.d.ts
       9 application/pages/404/index.tsx
       6 application/pages/_app.tsx
      13 application/pages/_document.tsx
      11 application/pages/index.tsx
       9 application/pages/top/index.tsx
      82 application/tailwind.config.ts
       4 application/types/index.ts
     403 total
```

以上です

## 参考
https://stackoverflow.com/questions/26881441/can-you-get-the-number-of-lines-of-code-from-a-github-repository

https://qiita.com/YASU_ojisan/items/4478ba6e5d68c9af0f68
VSCode 拡張機能 vscode-pets をインストールしてみた

やってみました。

https://www.youtube.com/watch?v=1hKNrOX133c

背景のテーマは none, forest, castle の3種類で動画のサムネみたいな海っぽいのはどうやって出すのかわかりません。
forest で totoro を飼ってみました。

![vscodepets2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/97b53278-ecaf-ea3f-4ae0-3ade853880d3.png)

![vscodepets.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/b70889b0-3240-aa3f-3358-feaa4a77b392.png)
TigerVNC for CentOS Stream9 or CentOS7

## TigerVNC for CentOS Steam9

### install

```bash
dnf install tigervnc-server
```

※vncserverコマンドの代わりにsystemdで実行するようになりました。  
詳しくは`/usr/share/doc/tigervnc/HOWTO.md`を見てください。  
### systemdの設定

```bash
vi /etc/tigervnc/vncserver.usets
```

```:/etc/tigervnc/vncserver.users
:1=<UserName>
```

※1はvncの番号

### passwordの設定

`$HOME/.vnc/passwd`があれば削除して以下のコマンドを実行。

```bash
vncpasswd
```

パスワードを入力すると`$HOME/.vnc/passwd`が作成される。一度行う(なんでもいいが、ユーザーのログインパスワードと同じにするとよい。)　

### systemctlの設定

```bash
systemctl enable vncserver@:1 #自動起動にする
systemctl start vncserver@:1
```

5900+[番号]/tcpのポートを利用するのでfirewallを使用している場合はポートを開けること。 


## TigerVNC for CentOS 7

### install

```bash
yum install tigervnc-server
```

### passwordの設定

`$HOME/.vnc/passwd`があれば削除して以下のコマンドを実行。

```bash
vncpasswd
```

パスワードを入力すると`$HOME/.vnc/passwd`が作成される。一度行う(なんでもいいが、ユーザーのログインパスワードと同じにするとよい。)　　

### 起動しているvncserver一覧表示

```bash
vncserver -list
```

### vncserverの起動

```bash
vncserver :[番号]
```

起動時に`$HOME/.vnc/xstart`が作成される。  
5900+[番号]/tcpのポートを利用するのでfirewallを使用している場合はポートを開けること。  

### vncserverの停止

```bash
vncserver -kill :[番号]
```
コマンドの場所を調べるwhich

実行するコマンドのバイナリがどこに格納されているか調べたい時は、`which`コマンドを実行します。

# 構文
```bash
which コマンド名 オプション
```

# 実行例

### dnfの場所を調べる

```bash
[yoyo@AL ~]$ which dnf
/usr/bin/dnf
```
dnfは`/usr/bin`にある事が分かりました。

### sshdの場所を調べる
```bash
[yoyo@AL ~]$ which sshd
/usr/sbin/sshd
```
sshdは`/usr/sbin`にある事が分かりました。

### 複数コマンドを同時に調べる
```bash
[yoyo@AL ~]$ which dnf sshd
/usr/bin/dnf
/usr/sbin/sshd
```
このように複数コマンドを同時に調べる事もできます。

### コマンドがない場合
```bash
[yoyo@AL ~]$ which python
/usr/bin/which: no python in (/home/yoyo/.local/bin:/home/yoyo/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin)
```
実行コマンドがインストールされていない場合はこのように表示されます。

### バージョンを確認する
```bash
[yoyo@AL ~]$ which -v
GNU which v2.21, Copyright (C) 1999 - 2015 Carlo Wood.
GNU which comes with ABSOLUTELY NO WARRANTY;
This program is free software; your freedom to use, change
and distribute this program is protected by the GPL.
```

# インストール
環境によってはそもそも`which`コマンドが入っていない事があります。
そんな時は`dnf provides`で調べてインストールします。

### パッケージの調査
```bash
[yoyo@AL ~]$ dnf provides which
which-2.21-29.el9.x86_64 : Displays where a particular program in your path is located
Repo        : @System
Matched from:
Provide    : which = 2.21-29.el9

which-2.21-29.el9.x86_64 : Displays where a particular program in your path is located
Repo        : baseos
Matched from:
Provide    : which = 2.21-29.el9
```

`which`そのままのパッケージ名で提供されているみたいです。

### インストール
```bash
dnf install which -y
```

# その他の使い方
`which`の基本的な使い方は以上ですが、細かなオプションがいくつかあります。
一度`man which`や`which --help`で確認しておくと良いでしょう。
【一発合格】CompTIA Network+(N10-008)の勉強法について✏️


## １．はじめに
職場のスキルアップ施策的なやつに乗っかり、受験させてもらい、無事合格することができました。
勉強方法や参考資料等について、受験を検討しているor控えている方々に良い情報提供になれば
と思います。また、私の**事前知識**については以下のとおりです。
- 　**仕事でネットワークの維持管理をしているのである程度の用語の理解がある**
  - サーバ（仮想）操作・監視
  - ネットワーク機器の監視
  - 簡単なトラブルシューティング
- **テスト環境等の小規模なネットワーク構築は可能**
  - スイッチ・ルータ数台での構築
- **マスタリングTCP/IP、CCNAテキスト＆問題集等の書籍を読んだことがある**
- **プログラミングの初歩的な資格を有している（これ関係ないかもですが）**



## 2.　準備した教材
- 参考書
  [The Official CompTIA Network+ Study Guide（試験番号：N10-008）日本語版](https://www.comptia.jp/information/2022/06/the-official-comptia-network-study-guiden10-008-614.html)
  
- DVD
→テキストの中身を要約して説明してくれる動画。動画だが全てがテキストと図（一部アニメーションがあったような）

- オンラインラボ環境

- web模擬試験
→***これが肝心！！！！***



## ３．勉強方法
- 参考書を読む
**とても読みにくいです！！！**
間違ったことは書いてありませんが、元々英語のテキスト翻訳したような書きっぷりなので、ところどころ日本語の表現がおかしいです（てか、誤字もありました）。後に説明するweb模擬試験で理解できなかったところを読み返す程度でした。一度さらっと目を通す程度で良いかな〜と感じました。

- オンラインラボの活用
CompTIAのホームページからアカウントを作成し、ラボを実行できます。ラボ上（仮想デスクトップ）でIPアドレス、ルータの設定をできますが、自分には特に必要性を感じませんでしたので、途中でやめました。（GNS３という神ツールを使用していましたので、操作についてはある程度の知識がありました。）

https://zenn.dev/articles/3446d65dfbc15d/edit

- web模擬試験の活用
**やはり一番ためになったのがこれですね！**
私はUdemyでweb模擬試験を購入しました。３回分の模擬試験を実施でき、内容についても本番にかなり近い内容・言い回しでした。現在は３０００円で購入できるようです。


https://www.udemy.com/share/10a3aS3@ospGF8C62kBo_QdfXxGZlo06o7BQ1HUffik93J6rlDXwyTLbLAIXbVPri5BLQ6JLmg==/

こちらの３回分の　模擬試験を２周しました。その中で理解が足りない問題は、参考書を読み返したり、ネットで調べたりして理解を深めました。勉強する中で自分なりに意識していたことが、

**模擬試験を解いただけで、理解したと思わないこと！**

例えば、IPアドレスのサブネット計算などの数字や言い回しを変えられたりすると解けなかったりすることがあると思いますので、しっかり内容は理解することに努めたほうが良いです。

**ただの試験対策にならないこと**

が重要かと思います。

- chatGPTの活用
これは好き嫌いあると思いますが、上記の模擬試験で理解できなかった項目は、chatGPTに聞くというのもありです。私は課金勢（chatGPT　plus利用者）ですので、日々積極的に使うなかでCompTIA Network+の勉強にも活用していました。また、chatGPTに問題を出してもらったりもしてました。なかなか良い問題を出してくれます！




## ４．さいごに
IPAの過去問道場のように無料の模擬試験サイト等がありませんし、市販での書籍も今のところありません。（古い試験N10-007についてはありました）それが一番のネックかと思います。この記事が少しでもみなさんのためになれば良いなと思っております。
（職場の仲間の勉強用に模擬試験アプリを作ってみました。いつかネットにリリースできればいいな！）
![](https://storage.googleapis.com/zenn-user-upload/0e9964fdc1f3-20240308.png)
2024/06/21 現在 Axon ONNX を使う場合の注意（GutHubから最新を取得すること）

## はじめに

久しぶりに Livebook で Axon ONNX を使ってみたらインストールできなかったので共有します

https://hex.pm/packages/axon_onnx

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/axon/axon_onnx_resnet.livemd

## モジュールのインストール

以下のように Axon を含むモジュールをインストールします

```elixir
Mix.install(
  [
    {:exla, "~> 0.7"},
    {:axon_onnx, "~> 0.4"},
    {:stb_image, "~> 0.6"},
    {:req, "~> 0.5"},
    {:kino, "~> 0.13"}
  ],
  config: [nx: [default_backend: EXLA.Backend]]
)
```

すると、途中で以下のようにエラーが発生します

```elixir
== Compilation error in file lib/axon_onnx/shared.ex ==
** (CompileError) lib/axon_onnx/shared.ex:58: undefined function transform/2 (there is no such import)
    (nx 0.7.2) lib/nx/defn/compiler.ex:832: Nx.Defn.Compiler.compile_error!/3
    (nx 0.7.2) lib/nx/defn/compiler.ex:429: Nx.Defn.Compiler.normalize/2
    (elixir 1.15.7) lib/enum.ex:1819: Enum."-map_reduce/3-lists^mapfoldl/2-0-"/3
    (elixir 1.15.7) lib/enum.ex:1819: Enum."-map_reduce/3-lists^mapfoldl/2-0-"/3
    (nx 0.7.2) lib/nx/defn/compiler.ex:422: Nx.Defn.Compiler.normalize/2
    (elixir 1.15.7) lib/enum.ex:1819: Enum."-map_reduce/3-lists^mapfoldl/2-0-"/3
    (elixir 1.15.7) lib/enum.ex:1819: Enum."-map_reduce/3-lists^mapfoldl/2-0-"/3
    (nx 0.7.2) lib/nx/defn/compiler.ex:422: Nx.Defn.Compiler.normalize/2
could not compile dependency :axon_onnx, "mix compile" failed. Errors may have been logged above. You can recompile this dependency with "mix deps.compile axon_onnx --force", update it with "mix deps.update axon_onnx" or clean it with "mix deps.clean axon_onnx"
```

この問題は GitHub の Issue にも登録されており、最新のコードでは解消されていますが、まだリリースされていません

https://github.com/mortont/axon_onnx/issues/55

## 対処

Axon ONNX を GitHub から取得するため、コードを以下のように変更します

```elixir
Mix.install(
  [
    {:exla, "~> 0.7"},
    {:axon_onnx, "~> 0.4", git: "https://github.com/mortont/axon_onnx/"},
    {:stb_image, "~> 0.6"},
    {:req, "~> 0.5"},
    {:kino, "~> 0.13"}
  ],
  config: [nx: [default_backend: EXLA.Backend]]
)
```

差分

```diff_elixir
-    {:axon_onnx, "~> 0.4"},
+    {:axon_onnx, "~> 0.4", git: "https://github.com/mortont/axon_onnx/"},
```

## まとめ

エラーが出た場合、 GitHub の Issue を確認してみましょう

最新版では解消していることがあります
検索王になるためのGoogle検索テクニック

使わない日はないといっても過言ではないGoogle検索。インターネットの普及でWebページが量産されるようになり、最近目的のページにたどり着くのが難しくなってきたと感じます。
検索効率化を図るため、以前から知ってはいましたがあまり使ってこなかったGoogle検索のコマンドオプションを備忘録としてまとめました。今後は積極的に活用したいです。


# キーワードを用いた検索コマンド一覧
| コマンド | 内容 |
|:-:|:-:|
| [キーワード1] [キーワード2]  | AND検索  |
| [キーワード1] OR [キーワード2]  |  OR検索 |
| [キーワード1] ([キーワード2a] OR [キーワード2b])  | 複数条件の検索[^1]  |
| -[キーワード]  | NOT検索  |
| “[キーワード]”  |  完全一致検索 |
| [キー*]  |  あいまい検索[^2] |
| ~[キーワード]  | 類似検索[^3]  |
| intext:[キーワード]  | 本文から検索  |
| allintext:[キーワード1 キーワード2]  | 本文からAND検索  |
| intitle:[キーワード]  | タイトルから検索  |
| allintitle:[キーワード1 キーワード2]  |  タイトルからAND検索 |
| inanchor:[キーワード]  | リンクから検索[^4]  |
| allinanchor:[キーワード1 キーワード2]  |  リンクからAND検索[^4] |

[^1]: [キーワード1]と[キーワード2a]または[キーワード2b]を含むページを検索する
[^2]: ワイルドカードを用いて[キー]から始まる語句を含むページを検索する
[^3]: [キーワード]と類似する語句を含めて検索する
[^4]: ページ中のアンカーリンクに[キーワード]を含むページを検索する


# URL、その他ページの属性を用いた検索コマンド一覧
| コマンド | 内容 |
|:-:|:-:|
| site:[URL]  |  特定サイトを指定して検索 |
| related:[URL]  |  類似サイトを含めて検索 |
| cache:[URL]  |  直近のキャッシュを検索 |
| inurl:[キーワード]  |  URLをキーワードで検索 |
| allinurl:[キーワード1 キーワード2]  | URLをキーワードでAND検索  |
| filetype:[ファイルタイプ]  | 拡張子を指定して検索  |
| before:[****/**/**]  | 公開日時を指定して検索[^5]  |
| after:[****/**/**]  |  公開日時を指定して検索[^6] |

[^5]: 指定日時より前に公開されたページを検索する
[^6]: 指定日時より後に公開されたページを検索する

# コマンドの組み合わせ例
以上のコマンドは組み合わせて使うことにより真の威力を発揮します。
当たり障りのない例でいくつか例示します。
___
```
site:qiita.com Java -JavaScript
```
qiita.com のサイトの中から、Javaを含み、JavaScriptを含まないページを検索します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519892/a85e99ee-50f0-e467-d35a-bc8088a07660.png)
___
```
filetype:pdf "Python" ~初心者
```
"Python"に関する初心者用のドキュメントPDFを検索します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519892/982dfc20-0a82-d691-f47e-a7dba24c92ed.png)
___
```
-site:qiita.com related:qiita.com after:2024/01/01 PHP
```
qiita.com以外のqiita.comに類似したサイトの中から2024年1月以降に公開されたPHPに関するページを検索します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519892/e72666a3-661b-4d92-89a4-c88c3dd04b36.png)
[暫定措置]Githubのプルリクエスト作成画面からブランチの検索機能が消えた！？その応急措置

困っている方が居るため、速報的な共有

## 2024年6月21日、githubのブランチ検索フォームが消える

![Screenshot from 2024-06-21 13-10-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293892/01d343cb-91d6-23e9-3414-37e0e545fb7d.png)

不要になったリモートブランチを削除してこなかった皆様大変です！develop、staging、master、main、productionといったよく使うブランチが見つかりません！

## 取り急ぎの対処方法

以下の様なURLを直接叩いてみてください
`https://github.com/組織・ユーザー名/リポジトリ名/compare/比較元ブランチ..比較ブランチ名`

例
`https://github.com/hoge_user/foo_reposit/compare/staging..develop`

みたいな感じで、取り急ぎのプルリクエストは作れます。
【アイディア】対滑舌悪い人用 文字起こし電話


## 前書き

これはただのアイディアです。

## どんなの？

電話対応していると向こうの滑舌が悪くてなんと言っているのか分からないことがある。
これが辛い。
聞き返すとイライラされるし、かといって聞き取れた風にするわけにもいかない。

そんなとき、音声を文字起こししてくれる機能があれば、そんな悩みからも解放されるだろう。
AIかなんかで滑舌が悪い発音を正常な文章に直してくれればハッピーである。

外部ツールで云々するのが面倒なので、電話自体に組み込んでほしいなあ。
電話に専用のディスプレイをつけるとか、無線でPCに表示させるとか？
どっかの電話作ってる会社がこの記事を読んでるなら、パクっていいので作ってくれないかなあ。

## チラ裏

そもそも開発中に電話対応するの辛すぎる。
[Dify]メールの送信設定をGmailのSMTPで設定する方法


## はじめに
みなさん、Difyはセルフホスティングしていますか？
チームで使おうとすると、ユーザー登録時のメール送信使いたいですよね？

メール送信サービスは、SendGridやResendが思い浮かぶかもしれません。
DifyはResendをサポートしているのでResend使うのめちゃくちゃ簡単です。
しかし、登録したくない気持ちもわかります。

そこで今回はGmailで登録する方法を紹介します。
GmailをSMTPサーバーとして使用するのは結構簡単なのでおすすめです！

## Gmailでの設定方法

1. Googleアカウントの検索バーでアプリパスワードと検索
![スクリーンショット 2024-06-21 10.40.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376115/caacd3e6-972a-0efc-e3d7-056d70d7c171.png)


2. アプリ名を入れる。︎(ご自身がわかる名前にすること)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376115/d0de9e7a-95ed-803e-3131-797c9cf21880.png)

3. アプリパスワードが生成されるので覚えておくこと。コピーとっておいて！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376115/823bdd9a-40d4-157b-146a-211c550b6bc7.png)


取得したアプリパスワードは後ほど使用します！
Gmail側の設定はこれで終わりです。


## Dify側のメール送信設定
では次にDify側の設定をしていきましょう。
docker-composeで起動している方は以下をdocker-compose.ymlに設定してください。
そうでない方は以下を環境変数として登録してください。

```
MAIL_TYPE: 'smtp'
MAIL_DEFAULT_SEND_FROM: 'ご自身のgmailアドレスを入れてください'
SMTP_SERVER: 'smtp.gmail.com'
SMTP_PORT: ５８７
SMTP_USERNAME: 'ご自身のgmailアドレスを入れてください'
SMTP_PASSWORD: '先ほど設定したアプリパスワード'
SMTP_USE_TLS: 'true'

```

これで完了です。MAIL_TYPEの設定を忘れないようにしてください！私はSMTP_に引っ張られてMAIL_の入力を忘れてハマりました。


## 最後に

Xやってるので気になる方はフォローお願いします。
https://x.com/hudebakonosoto
Laravelで非同期のJobをテストする3つ方法(同期処理にして確認する)

# 結論

- Laravelで非同期の処理を同期実行してテストしたい場合は`config(['queue.default' => 'sync'])`するのがいい


## 1. `dispatchSync`メソッドでジョブを実行する

```php
DeleteUserJob::dispatchSync($userId);
```
✅ pros: 簡単に実装でき、特定のジョブを確実に実行できる
❌ cons: ジョブに依存したテストになる

## 2. Artisan::call('queue:work --once')でジョブを実行する
```php
Artisan::call('queue:work --once');
```

✅ pros: 実際のキューワーカーの動作に近い
❌ cons: テストの実行速度が遅くなる

## 3. config(['queue.default' => 'sync'])でジョブを同期実行する
```php
config(['queue.default' => 'sync']);
```

✅ pros: キューを同期的に実行でき、テストが簡潔になる
❌ cons: 非同期処理の一部の側面（遅延、再試行など）をテストできない

## 実装例
```php
phpCopypublic function testDeleteUser()
{
    // キューの実行をsyncに設定
    config(['queue.default' => 'sync']);

    $user = User::factory()->create();
    $response = $this->deleteJson("/api/users/{$user->id}");

    $response->assertStatus(200);
    $this->assertDatabaseMissing('users', ['id' => $user->id]);
}
```

## 🚨 注意点

実際の非同期処理をシミュレートしていないため、遅延ジョブや再試行ロジックなどの特定の機能はテストできない
本番環境との動作の違いに注意が必要
Arduino NANO EVERYを使ってATTINYと仲良くする

## 目的
Arduino NANO EVERYを使って超・簡単にATTINY（ここでは85Aを使用）に書き込む。UNO3で書けたのにNANO EVERYで書けなかった人向け。

## ここで使用した諸々のバージョン
- Windows10 22H2
- Arduino IDE 2.3.2

## 準備 （UNO3と一緒）
追加のボードマネージャーのURLに`http://drazzy.com/package_drazzy.com_index.json`を追加するという内容を見かけるがこれは古い。`https://web.archive.org/web/20230504110614/http://drazzy.com/package_drazzy.com_index.json`を使う。

## Arduino ISPをNANO EVERYに焼く （UNO3と一緒）
ファイル > スケッチ例 > 11.ArduinoISP > ArduinoISPが使える。

## Arduino as ISPを使って書き...

Arduino UNO3を使っていると書き込み装置をArduino as ISPにするという記事に騙されてはいけない（自戒）。NANO EVERYでATTINYに書き込む場合は、`Arduino Leo/Micro as ISP (ATmega32U4)`にする。［**超重要**］

## 好きなスケッチを書き込む （UNO3と一緒）

あとは煮るなり焼くなり好きにどうぞ。

## ATTINY85で節電のために遅くしたい

### 1. クロックを 128kHz にする

Clock Source (Only set on bootload) から 128 kHz (internal WDT)を選択してブートローダーを書き込む。no bootloaderでも書き込む必要がある（らしい。紛らわしい。）。

### 2. ArduinoISPのスケッチを低速で使えるように修正する

45～51行目までのコメントにある通り、53行目の`#define SPI_CLOCK (1000000 / 6)`の部分を　`#define SPI_CLOCK (128000 / 6)`にしてスケッチをNANO EVERYに書き込む。

### 3. ATTINY85に好きなスケッチを書き込む

あとは煮...（略）

### ATTINY85を128kHzにした場合の注意

128kHzにしたATTINY85を8MHzにする場合は、低速にしたスケッチを使わないと元に戻せない。書き込みが遅くても良ければ低速のままのスケッチを使えば時間はかかるがどちらにも書き込める。
Visual Studio Codeを使ってWordにコードをきれいに貼ろう

## 概要
Wordを使ってソースコードを貼付すると，コードエディタと違って色分けやフォントなどが整理されず見にくくなります．ここでは簡単に見やすく貼れる方法をレクチャーします．

## 用意するもの
* Visual Studio Code
* Microsoft Word

## 手順
1. Visual Studio Codeで貼付したいソースコードを開く
例として，.javaを開きます．色づけなどがされていない場合は言語ごとの拡張機能を入れましょう．多分，Extension Pack for Java等を入れれば良いです．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641672/aee17066-857c-3d8f-8a1a-a3434a1d1d79.png)


2. 貼付したい箇所をVisual Studio Codeで選択しクリップボードにコピーしましょう．右クリックでコピーを選択，または，Ctrl+C（Windowsの場合）です．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641672/555db2d0-027c-7684-a8cb-3e80484e9e45.png)

3. Wordを起動します．テンプレート等を用いて新規のファイルを作成してください．
4. 枠組みを作ります．「挿入タブ」から「表」を選択し，1x1の表を作成します．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641672/48ee5add-07c3-09d2-90be-3b9e274d4bf3.png)


5. 枠の中に Visual Studio Codeからコピーしたテキストを貼り付けます．右クリックで貼り付け or Ctrl+V(Windowsの場合）です．このままでも良いですが，少し行間が広くて見づらいですね．行間を狭くしてみましょう．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641672/ec03f903-466e-89a8-749b-07559f6eed80.png)

6. Wordで行間を狭くしたい部分をドラッグして選択してください．表全体に適用したい場合には，表（枠）左上の十字マークを選択してください．枠全体が選択できます．
7. 「ホーム」タブの「段落」エリアの右下にあるマーク（段落の設定）を押します．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641672/c8641e9f-3f4b-9ada-43be-0d8698313141.png)
8.段落ダイアログの間隔，行間を固定値，11ptに設定してください．あるいは，適宜，大小を調整してください．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641672/0f9702a9-d918-7cc4-9a3c-52fe6fbc3e9d.png)
9.見え方を確認してください．下の例では少しい行間が狭くなっていると思います．これが良いかどうかはケースバイケースですが，ページ数を増やしたくなく，かつ，可読性が担保されるならば，このくらい狭くても良いでしょう．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641672/5c28b52b-46ce-cb2f-d79e-340981c6337e.png)



## まとめ
Word＋Visual Studioコードで手軽に見やすくソースコードを貼付する方法をまとめました．見やすさは，フォント，色づけ，行間，インデント，が主要な要素だろうと思います．そのため，そもそもソースコードのインデント等を適当にやっていると，この手段をもってしても見づらいです．可読性で評価するならば低い点数がつきます．基本的な事務スキルの1つなので覚えておきましょう．

なお，**レポートはLaTeXで作るに限ります**．そう言っておきながら，テンプレートを用意して無くて申し訳ないのですが，情報系にいるなら使えるようになっておきましょう．ソースコードもとてもきれいに貼付できます．是非，TeXを使いましょう．
LaravelでCSVデータを使ってDBにテストデータを作成する方法

LaravelでCSVデータをmysqlへ登録する処理を作成したので、その方法を説明します。

LaravelでMySQLに登録しているデータを取得するAPIがあり、自動テストを行う際に、テスト用データを作成したいのですが、テストメソッドの中でfactoryを使用してデータを作成すると、テストコードが冗長化して見づらくなってしまいます。

テストコードにはテストのロジックだけを書きたいため、テストデータの作成は外部ファイル（CSVファイル）に定義し、テスト実行時にデータを作成する処理を含めないようにするため、LaravelでCSVデータをmysqlへ登録するようにしました。

## ロジックの内容
CSVファイルにテストで使用するDBのデータを作成して、それをテストコード実行するときにインポートしてテストデータを作成する。

CSVはテストケースごとにディレクトリを分けて、1つのテストケースで登録したいDBごとにcsvファイルを分けることにする。

csvファイル名はDB名と同じ名前にして、一致する名前のDBにcsvの内容を登録するものとする。

## ディレクトリ構造
```
database
 ┗ seeders
  ┗ CsvToDataSeeder.php //csvファイルの中のCSVをすべてmysqlに登録する

tests
 ┗ csv
  ┗ testCase1
   ┗ 各CSVファイル（ファイル名はDB名と同じにする）
 ┗ Feature
  ┗ ***Test.php
```


## 実際のコード
```CsvToDataSeeder.php
namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class CsvToDataSeeder extends Seeder
{
    public function run(string $testCaseName): void
    {
        // テストケース名に一致するディレクトリ内の全てのCSVファイルを取得
        $files = glob(base_path("tests/csv/{$testCaseName}/*.csv"));

        foreach ($files as $file) {
            // CSVファイルを読み込む
            $csv_data = $this->csvToArray($file);

            // ファイル名からテーブル名を取得（拡張子.csvを削除）
            $tableName = basename($file, '.csv');

            // データベースに挿入するためのデータの作成
            $insert_data = [];
            foreach ($csv_data as $row) {
                // 'null'文字列をNULLに変換
                foreach ($row as $key => $value) {
                    if ($value === 'null') {
                        $row[$key] = null;
                    }
                }
                $insert_data[] = $row;
            }
            // データベースに挿入
            DB::table($tableName)->insert($insert_data);
        }
    }

    protected function csvToArray($filename)
    {
        $rows = [];
        if (($handle = fopen($filename, 'r')) !== false) {
            $header = fgetcsv($handle, 0, ','); // ヘッダー行を読み込む
            while (($row = fgetcsv($handle, 0, ',')) !== false) {
                $rows[] = array_combine($header, $row);
            }
            fclose($handle);
        }
        return $rows;
    }
}
```
### runメソッド内容について
このクラスは、CSVファイルからデータを読み込み、それをデータベースに挿入します。

runメソッドは引数に「テストケース名」を受け取っています。
テストケース名に一致するディレクトリ内の全てのCSVファイルを取得し、それぞれのファイルに対してDBに登録する処理を行います。

各CSVファイルはcsvToArrayメソッドによって配列に変換され、その後、ファイル名からテーブル名のみを取得します（拡張子.csvを削除）。

次に、データベースに挿入するためのデータを作成します。

各行に対して、'null'文字列をNULLに変換し、それぞれの値を上書きします。
そして、その行を挿入データの配列に追加します。

最後に、DB::table($tableName)->insert($insert_data);を使用して、データをデータベースに挿入します。

### csvToArrayメソッドの内容について
csvToArrayメソッドは、指定されたCSVファイルを開き、ヘッダー行を読み込みます。
その後、各行を読み込み、ヘッダーと行の値を組み合わせて配列を作成します。
これを繰り返し、全ての行を処理したら、ファイルを閉じて配列を返します。

*****

```***Test.php
// テストデータを作成
$seeder = new CsvToDataSeeder();
$seeder->run('testCase1');
```
自動テストのファイルの中で、runメソッドを実行します。
引数にテストケース名を渡すことで、CsvToDataSeeder.phpの中で同一名のディレクトリ内のcsvファイルをすべてDBに登録できます。
[Microsoft] Windows Server 2022 でOpenSSHサーバをー動かす

# はじめに

[以前](https://qiita.com/sengoku/items/ce61cb6fd6e513098d0b)、Windows 11 で動かしました。今回は Windows Server 2022 です。

https://qiita.com/sengoku/items/ce61cb6fd6e513098d0b

# 環境

* サーバー
  * Windows Server 2022 Standard 21H2
* クライアント
  * Ubuntu 22.04

# Windows Server 2022 に OpenSSHサーバーをインストールする

管理者権限でPowerShell を起動します。

名前を確認します。

```powershell
Get-WindowsCapability -Online | where -Property Name -ILike "openssh*"
```

インストールします。

```powershell
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
```

:balloon: バージョン番号は以前と変わりませんね。

# サービスを有効にして起動する

自動起動するようにします。

```powershell
Set-Service -Name sshd -StartupType Automatic
```

起動します。

```powershell
Start-Service -Name sshd
```

# 接続する

`IdentitiesOnly=yes` オプションをつけることで、とりあえず繋がりました。

```zsh
ssh -o IdentitiesOnly=yes ホスト名
```

# 鍵認証を使えるようにする

Administratorsグループ所属のユーザーなので、`$env:ProgramData\ssh\administrators_authorized_keys` ファイルへ自身の公開鍵を書き込みました。

ファイルのACLも変更し、SYSTEMとAdministratorsグループ **のみ** にフルコントロール権限を与えます。

```powershell
icacls.exe $env:ProgramData\ssh\administrators_authorized_keys /inheritance:r /grant Administrators:F /grant SYSTEM:F
```

# 既定のシェルをPowerShellにする

cmd.exeをやめてPowerShellにします。

```powershell
$pspath=Get-Command powershell | Select -ExpandProperty source
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value $pspath -PropertyType String -Force
```

# トラブルメモ

## ［トラブル］環境変数が反映されない

### ［現象］

Windows GUIから環境変数を設定しても、ssh シェル内に反映されません。

### ［原因］

（不明）


### ［解決策］

Windows を再起動します。
「VBAでInteger型は使わない」って、知ってた！？

## わざわざ教わらない当然のこと
社会人になってから特に感じますが、「当たり前のことすぎて、わざわざ教わることも自身で調べるタイミングもない」事象って多いですよね。

今回は完全にそのパターンです。

多くの方にはそんなことも知らないのか！と思われるかもしれませんが、意外に知らない人もいるよという話ができたらと思います。
（また、同じく知らない方・初めて触れる方へ届きますように……。）

## VBAで整数 ⇒Long型でよし！
他にも種類はありますが、整数を扱う型というとInteger型とLong型が代表的かと思います。（私はそう思っています。）

| 型名 | データ型 | 範囲 |
|:-----------|------------:|:------------:|
| Integer      | 整数型       | -32,768 ～ 32,767  |
| Long    | 長整数型     | -2,147,483,648 ～ 2,147,483,647|		

「パフォーマンス向上のため、無駄に大きい範囲の型にしない方がいい」と認識していたので、今までVBAでも普通にInteger型を使っていました。

先日オーバーフローのエラーが発生したのですが、原因は予想以上に取り込むデータが多く、計算結果がInteger型の範囲を超えてしまったという初歩的なミスでした。（完全に見通し不足。）

それを見た先輩に **「VBAでIntegerは使わないよ」** と言われ、そうなの！？と驚いたことが今回の記事の発端です。

### そもそもVBAでInteger型を使っても意味ない
以下、Microsoftのサイトから引用したものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518925/df18f316-9a5b-45b1-edf7-6b08d5046eb3.png)


https://learn.microsoft.com/en-us/previous-versions/office/developer/office-xp/aa164754(v=office.10)?redirectedfrom=MSDN

>最近のバージョンでは、VBA は、整数型として宣言されている場合でも、すべての整数値を Long 型に変換します。したがって、Integer 変数を使用することによるパフォーマンス上の利点はなくなりました。

この記載、完全にInteger型使う意味ないですね！
2014年の記事なので、少なくともVBAでInteger型を使う意味がなくなってから10年は経っているということ。全然知らなかった……。

オーバーフローの心配をなくすためにも、莫大でない整数ならLong型にしていきましょう。
（という認識で合ってますかね？）

:::note info
整数はとりあえずLong型！Integer型は使わない。
:::

## 「当然」を少しずつ学んでいく
経験者にとっては当たり前の事実も、意外に知らない人は多いかもしれません。
初心者ならではの学びは積極的に発信していきたいと思います。

有識者の方、ご教示いただけると幸いです！