OmniAICreator/Qiita-1.07M huggingface dataset:
SadServers のご紹介

# SadServers　とは

https://sadservers.com/

> Troubleshoot and make a sad server happy!
> "Like LeetCode for Linux"
Capture The Flag challenges. Train and prove your debugging skills.
> Practice for your next SRE/DevOps interview.
> Get a full remote Linux server with a problem and fix it.

google翻訳
>ラブルシューティングを行って、悲しいサーバーを幸せにしましょう!
「Linux 用 LeetCode のような」
キャプチャー・ザ・フラッグチャレンジ。 デバッグ スキルをトレーニングして証明します。
次回の SRE/DevOps 面接に備えて練習してください。
問題のある完全なリモート Linux サーバーを入手して修正します。

# 利用の流れ
1.https://sadservers.com/ にアクセス。
![FireShot Capture 015 - SadServers - Troubleshooting Linux Servers - sadservers.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209826/b47503e1-40e1-2843-128b-d4bbd3a1e4ed.png)

2.メールアドレスとパスワードを入力して、登録。
![FireShot Capture 016 - SadServers - Troubleshooting Linux Servers - sadservers.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209826/b28b0f83-4b28-2e2a-ed4a-29158aa00e47.png)
3.ログインすると課題の一覧が表示されます。
![FireShot Capture 017 - SadServers - Troubleshooting Linux Servers - sadservers.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209826/4dbcdd72-0a11-9df3-05c1-169c1622b590.png)
4.infoをクリックすると課題の概要が表示されます
![スクリーンショット 2023-10-22 9.49.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209826/af2a5375-ee28-585a-97b7-5d1f09dc39af.png)

google翻訳
>開発者は、ログ ファイル /var/log/bad.log に継続的に書き込み、ディスクをいっぱいにするテスト プログラムを作成しました。 
たとえば、tail -f /var/log/bad.log で確認できます。
このプログラムはもう必要ありません。 それを見つけて終了させてください。

4.Runをクリックするとサーバを準備してくれます。課題の概要も下に記載されます。サーバの準備ができたら、[Open the server terminal in a new window.]をクリックします。
![サーバの起動画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209826/10a0bb27-fe85-eeae-ffa9-35f2066fec48.png)

5.ターミナルが別のウィンドウで表示されます。
![スクリーンショット 2023-10-22 9.57.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209826/f5b9a867-4865-2373-af13-0be889dfc1bc.png)

6.問題を解いていきます。詰まった時は[Next Clue/Solution]をクリックして、ヒントを出します。
![スクリーンショット 2023-10-22 10.03.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209826/a7200428-98a5-b898-cbdf-4f84f4b5f945.png)

7.解き終わったら[Check My Solution]をクリックして、答え合わせをします。あっている場合は下記の画面が表示されます。
![スクリーンショット 2023-10-22 10.10.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209826/54ad54e7-63f5-b027-8e51-03872b9f9c34.png)

# まとめ
ログ解析の課題などもありまして、大量のログを吐いたサーバを準備するのが難しい時などに使っていました。
障害対応の業務を始めたばかりの方などにはお手軽に練習ができるサイトとなっています。
LPIC 勉強メモ

## コマンド
### mkdir
新規ディレクトリを作成できるコマンド。

|オプション|説明|使い方 例|
|--|--|--|
|-m アクセス権|指定したアクセス権でディレクトリを作成|mkdir -m 700 dir|
|-p|引数に階層のあるディレクトリを指定した場合、存在しない中間ディレクトリも同時に作成|mkdir -p dir1/dir2|

### cp
ファイルやディレクトリをコピーする
|オプション|説明|使い方 例|
|--|--|--|
|-f|コピー先の既存のファイルやディレクトリが上書きできない場合、削除してからコピーする||
|-i|同名のファイルやディレクトリがある場合、上書きするかどうか問い合わせる||
|-p|ファイルの属性（パーミッション、所有者、更新時間など）を保持したままコピー 所有者権限を保持できるのはrootユーザーのみ||
|-r &#124; -R|ディレクトリをコピー||

### gzip
gzip形式でファイルを圧縮、または展開するコマンド。圧縮されたファイルの拡張子は.gz。

~~~
gzip configure
~~~

|オプション|説明|使い方 例|
|--|--|--|
|-d|圧縮ファイルを展開||
|-c|元ファイルを残して標準出力に出力||
|-r|ディレクトリ内の全てのファイルを再帰的にそれぞれ圧縮||

### bzip2
bzip2形式でファイルを圧縮、または展開するコマンド。gzip形式より圧縮率が高い。圧縮されたファイルの拡張子は.bz2。

~~~
bzip2 configure
~~~

|オプション|説明|使い方 例|
|--|--|--|
|-d|圧縮されたファイルを展開||
|-c|元ファイルを残して標準出力に出力|bzip2 -c configure > configure.bz2|

### bzcat
ファイルの内容を標準出力へ送信するコマンドは「cat」コマンドです。しかし圧縮されたファイルの場合もそのまま送信するため正しく表示されません。
bzip2形式（拡張子.bz2）で圧縮されたファイルを展開して直接標準出力へ送信するには「bzcat」コマンドを使用します。
~~~
bzcat configure.bz2
~~~

### bunzip2
bzip2形式のファイルを展開するコマンド
~~~
bunzip2 configure.bz2
~~~

ただし、–cオプションを付けると、bzcatコマンドと同じように実行できます。
~~~
bunzip2 -c configure.bz2
~~~
### stat
ファイルやファイルシステムのinode番号やタイムスタンプ（アクセス時刻や修正時刻）などの詳細情報を表示するコマンド

~~~
stat file.txt
~~~

### tar
複数のファイルをまとめて1つのファイル（アーカイブ）にする、またはアーカイブを展開する際に使用するコマンド。

|オプション|説明|使い方 例|
|--|--|--|
|-c|新しいアーカイブを作成||
|-x|アーカイブからファイルを展開||
|-t|アーカイブの内容を一覧表示||
|-f|アーカイブファイル名を指定||
|-v|処理の詳細情報の表示||
|-z|gzipを通して圧縮/展開||
|-j|bzipを通して圧縮/展開||
|-J|xzを通して圧縮/展開||

### cpio
tarコマンドと同じく、複数のファイルをまとめて1つのファイル（アーカイブ）にする、またはアーカイブを展開する際に使用するコマンド。
cpioコマンドは標準入力や標準出力を使用します。ですので、入力ファイルや出力ファイルをコマンドの引数として指定することができません。そのため、以下のようにパイプ(|)およびリダイレクト(<と>)を使用してファイルを指定します。

|オプション|説明|使い方 例|
|--|--|--|
|-o|新しいアーカイブを作成|カレントディレクトリ以下にある全てのファイルを1つにまとめて、ユーザのホームディレクトリに「backup.cpio」というアーカイブを作成する場合<br><br>find . &#124; cpio -o > ~/backup.cpio|
|-i|アーカイブからファイルを展開|cpio -i < backup.cpio|

### dd
データをコピーするコマンド。
cpコマンドと異なり、ブロックサイズ(bsオプション)とそのブロックをコピーする回数(countオプション)を指定してファイルを作成することができる。

|オプション|説明|使い方 例|
|--|--|--|
|if=入力ファイル|入力側ファイルを指定||
|of=出力ファイル|出力側ファイルを指定||
|bs-バイト数|入出力のブロックサイズ（一度に読書きするバイト数）を指定。デフォは512バイト||
|count=回数|ブロックをコピーする回数を指定||

### xz
bzip2よりも圧縮率が高い圧縮形式として、LZMA2圧縮アルゴリズムを採用したxzフォーマットがあります。xzはbzip2よりも多くのCPU／メモリを要求しますが、その分圧縮率が高く、また展開速度はbzip2より短いためファイル配布時の圧縮形式として採用されることが増えています。Linuxカーネルソースの配布形式としても採用されています。

### ls
ディレクトリ内のファイルやディレクトリを表示するコマンド

|オプション|説明|使い方 例|
|--|--|--|
|-a|隠しファイルも含むすべてのファイルとディレクトリを表示||
|-A|「-a」と同じ。ただし、カレントディレクトリ「.」と親ディレクトリ「..」は表示しない||
|-d|名前の後ろにファイルタイプを表示<br><br>・通常ファイル：なし<br>・実行可能ファイル：* <br>・ディレクトリ：/ <br>・シンボリックリンク：@||
|-i|inode番号を付けて表示||
|-l|詳細情報の表示||
|-R|サブディレクトリの内容も再帰的に表示||
Bing Chat  に形成的評価のための質問例と総合評価のためのテスト問題を作らせてみる

# はじめに
本記事は Bing Chat Enterprise を使用して各小単元における形成的評価のための質問例と総合評価のためのテスト問題を作れるかどうかを実験した結果です。

# なぜ Bing Chat Enterprise を使用するのか

対話型生成AIサービスといえば、OpenAI の ChatGPT が有名です。Microsoft も個人が利用できる Bing Chat と組織が利用できる Bing Chat Entperise の2種類のサービスを提供しています。では Bing Chat Enterprise を使うべきなのでしょうか。

Bing Chat Enterprise の [**「プライバシーと保護」についてのドキュメント**](https://learn.microsoft.com/ja-jp/bing-chat-enterprise/privacy-and-protections) を見ると **「Microsoft はプロンプトと応答を保持しないため、基になる大きな言語モデルのトレーニング セットの一部として使用することはできません。」**　と書かれています。要するに、ユーザーが入力した情報やその回答はマイクロソフトが利用しないため、情報漏洩の心配がないのです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/655e1c54-29c6-2441-115d-cf4a53d81db7.png)

# 教育機関が Bing Chat Enterprise を使用するにはどうすればよいのか

Bing Chat Enterprise は、Microsoft 365 A3 もしくは A5 の教員向け(Faculty)ライセンスを付与されたユーザーのみが利用できます。

# 質問例やテスト問題をうまく作らせるためのポイント

例えば Bing Chatに「〇〇についてのテスト問題を10問作ってください」とお願いすれば、問題は作成してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/9185ab58-5e7a-86c1-7a53-3937e03f9fbd.png)

本記事では **「学習目標」** や **「評価基準」** を元に、質問やテスト問題を作成することで、どのような質問やテスト問題が Bing Chat によって作成されるのかを見ていきたいと思います。

# 前提条件

**「学習目標」** や **「評価基準」** は教育出版が[**指導計画作成資料**](https://www.kyoiku-shuppan.co.jp/2020shou/shakai/category04/download.html#download_00)と公開している[**令和２年度版『小学社会 ５』年間指導計画・評価計画（案）** ](https://www.kyoiku-shuppan.co.jp/2020shou/shakai/files/r2shakai5_nenkeihyouka_2004.pdf)を使用します。

# プロンプト
```:プロンプト
あなたは小学5年生(Grade 5)を担当している社会科の教員です。
{形成的評価のための質問例}と{総合的評価を行うための例題}を{学習目標}と{評価基準}を元に作成してください。

# 条件
{学習目標}
-日本国の国土の地理的環境の特色について，国民生活との関連を踏まえて理解するとともに，地図帳や地球儀，統計などの各種の基礎的資料を通して，情報を適切に調べまとめる技能を身に付けるようにする。
- 日本国の国土の地理的環境の特色や国民生活との関連を多角的に考える力，考えたことを説明する力を養う。
- 日本国の国土の地理的環境の特色や国民生活との関連について，主体的に学習の問題を解決しようとする態度を養うとともに，多角的な思考や理解を通して，日本国の国土に対する愛情を養う。

{評価基準}
知識・技能:
- 世界における日本国の国土の位置，国土の構成，領土の範囲などを大まかに理解している。
- 日本国の国土の地形や気候の概要を理解するとともに，人々は自然環境に適応して生活していることを理解している。
- 地図帳や地球儀，各種の資料で調べ，まとめている。
- 
思考・判断・表現:
- 世界の大陸と主な海洋，主な国の位置，海洋に囲まれ多数の島からなる国土の構成などに着目して，日本国の国土の様子を捉え，その特色を考え，表現している。
- 地形や気候などに着目して，日本の国土の自然などの様子や自然条件から見て特色ある地域の人々の生活を捉え，日本の国土の自然環境の特色やそれらと日本の国民生活との関連を考え，表現している。

主体的に学習に取り組む態度:
- 日本国の国土の様子と国民生活について，主体的に問題解決しようとしている。

# 形成評価のための質問例
- この学習活動について、学習者の進捗や理解度を見るための質問の例を5つ作成してください。 

# 例題
- 総括的評価を行うための例題を10問作成してください。 
- 10問の構成は、記述式の問題を5問、単一選択式の問題を2問、複数選択式の問題を1問、穴埋め問題を2問とします。 
- 100点を満点として点数配分も例示してください。
```
※ 上記のプロンプトは我が国→日本国に置き換えています。

# 質問とテスト問題の作成

上記のプロンプトを使用して Bing Chat が回答したものを以下に示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/fdc3352f-f3ef-0977-e761-a22e4c2c47f0.png)

4問目でストップしてしまったので、プロンプトに「例題の続きを作成して」と入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/a77a6047-2609-9b57-9ec4-5f1b1a236948.png)

# まとめ

**学習目標**と**評価基準**を示すことで、適切な質問やテスト問題が作成できたと思います。他の教科でも試してみたいと思います。
Splunk: GUIでAPPをファイルからリリースする


###### 実施環境： Splunk Free 8.2.2

 Splunk の App について、 GUI から作成や更新を行いたい場合があります。
もちろん、枠を先に作成してダッシュボードやレポートを1つ1つ登録してもよいですが、登録するものが多い場合などはなかなか大変です。

そのような場合、 App を圧縮ファイルから作成するという方法があります。

### 方法

まずは、リリースする App を準備します。
基本的には、 .tar.gz 形式で圧縮したフォルダをリリースすることで、解凍されたフォルダが `${SPLUNK_HOME}/etc/apps` 配下に配置される形となります。
 .tar.gz ファイル自体のファイル名は基本的にリリースには影響しませんのでなんでもよいです。
今回は「 test 」フォルダを「 sample.tar.gz 」というファイル名で圧縮したものを使用します。

![WS000428.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/8d98f28a-5ee3-0f95-3a84-ef16daea2e04.jpeg "tar.gz")

それでは、 Splunk にログインし、まずは App の管理画面を開きます。
「 App 」の横の歯車マークか、「 App 」⇒「 App の管理」を選択することで画面を開けます。

![WS000423.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/1ae60a73-9d49-90b1-0b39-92ca5432b2a3.jpeg "歯車")

![WS000429.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/a0d29360-e4b0-10d0-fea7-c57742f1f607.jpeg "Appの管理")

次に、右上の「ファイルから App をインストール」を選択します。

![WS000424.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/059037fe-0579-c639-eab7-34a5c0dfc5ec.jpeg "Appインストール")

アップロードするファイルを選択し、「アップロード」を押します。
アップロード後に再起動を求められた場合は再起動します。

![WS000425.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/b9046bd5-5bce-9b66-4e93-c9a2ad4d2e9e.jpeg "ファイルのアップロード")

これで、 App をリリースすることができました。

![WS000427.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/8c1640ac-f503-0c6b-6789-0cfb56ea9b9f.jpeg "アップロード結果")
モバイル（ネイティブVSハイブリッド）、NextBestAction、SandboxVSスクラッチOrg


### モバイル
Salesforceのモバイルの選択肢としては以下あり。
・Salesforeアプリ　※社員のみアクセス可
・HTML5（ブラウザからのアクセス）　※外部のみアクセス可
・MobilePubliser　※外部のみアクセス可
・ハイブリッド
・ネイティブ
（その他、FieldServiceアプリなど）

判断軸は以下の通り
・利用者属性に応じた選択　⇒Salesforeアプリは社員のみ、HTML5（ブラウザからのアクセス）は外部顧客のみ。
・モバイルへのPushなど通知が欲しい場合⇒HTML5よりもMPが優位
・オフライン要件あり⇒HTML5（ブラウザからのアクセス）やMobilePubliserは×
・BluetoothやNFC要件あり⇒ネイティブ、ハイブリット ★記述を2024/09/20に訂正

ネイティブとハイブリットの違いは何か？
・ネイティブとは、特定のOSに最適化されて構築したアプリ。（iOS用やAndroid用など、個々に開発が必要。）
・ハイブリットとは、ネイティブとWebアプリの特徴を組み合わせたアプリ。
OSとHTML5などのUIを組み合わせて構築できる技術。UIをHTMLやJavaScritpなどWebの言語で構築できる。

メリデメとしては
・コスト：ハイブリッド＜ネイティブ
⇒なぜならネイティブはOSの個々に開発が必要なため。
⇒アップデートする際に、再度ストアに上げる必要がある。
⇒ハイブリッドは、1回目はストアからのインストールだが、以降のアップデートは再インストール不要。また、OSごとの開発も原則不要。
・機能：BluetoothやNFC
⇒ハイブリット、ネイティブ双方利用可能
★記述を2024/09/20に訂正

・その他
⇒読み込み速度はネイティブの方が早い、アプリ内課金ができる、Webより信頼性高い、一時利用しやすい。

確かにCookPadはWebとモバイル同じUI（ハイブリッドアプリ

https://yapp.li/magazine/3190/

https://www.wecode-inc.com/blog/%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E3%80%81%E3%83%8D%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96%E3%81%A8%E3%83%8F%E3%82%A4%E3%83%96%E3%83%AA%E3%83%83%E3%83%88%E3%81%A9%E3%81%A1%E3%82%89%E3%82%92/#:~:text=%E3%80%90%E3%83%8F%E3%82%A4%E3%83%96%E3%83%AA%E3%83%83%E3%83%88%E3%82%A2%E3%83%97%E3%83%AA%E3%80%91,%E3%81%A4%E3%81%91%E3%82%8B%E3%81%93%E3%81%A8%E3%82%82%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82

### NextBestAction
・手順としては、おすすめオブジェクトの登録、戦略フローの設定、コンポーネントの配置。特定条件の時にクーポンなど表示可。

### おまけ
・Einstein予測ビルダー：Score75等表示してくれる。

### SandboxVSスクラッチOrg
Sandboxがよい。
​理由ですが以下2点です。
①スクラッチは環境が壊れるのに期限があるので長期開発に適していない。
　⇒スクラッチは30日で壊れる。（長期的な開発の場合、Sandboxの方が便利）

②Sandboxは手動で環境コピーができるので便利
　⇒スクラッチ環境は、まっさらな環境なので、最初開発環境にするためにGitからソースコードを引いてセットアップが必要だが、実態としてすべての設定がメタになってないので、手動手順も必要。一方、Sandboxは手動で本番やSandbox間のメタコピーできるので便利。
ウェブブラウザ Google Chrome のオフラインインストール

「Google Chrome」は無料のウェブブラウザです。この記事では 18 歳の新入社員向けに Chrome のオフラインインストール手順を説明します。

## Chrome を使う目的
Chrome ブラウザは以下のような目的で使われます。

### 高速なブラウジング体験
Chrome はページの読み込み速度や [JavaScript の実行速度が高速](https://www.gizmodo.jp/2022/05/the-fastest-browsers-on-windows-and-the-downsides.html)です。スムーズなウェブブラウジング体験を求めるユーザーにとって魅力的です。

### 拡張機能とカスタマイズ
Chrome には[数千の拡張機能やテーマ](https://www.lifehacker.jp/article/2212-the-10-best-chrome-extensions-of-2022/)が提供されています。ユーザーはこれらを利用してブラウザの機能を独自にカスタマイズすることができます。

### クロスプラットフォームの同期
[Googleアカウントとの連携](https://atmarkit.itmedia.co.jp/ait/articles/1712/25/news033_2.html)により、ブックマーク、履歴、タブ、パスワードなどのブラウザデータを複数のデバイス間で簡単に同期することができます。

## Chrome のシステム要件
2023年10月時点の [Chrome のシステム要件](https://support.google.com/chrome/a/answer/7100626?hl=ja)は以下の通りです。

- Windows
  - Windows 10 以降または Windows Server 2016 以降
  - Intel Pentium 4 以降のプロセッサ（SSE3 対応）
- Mac
  - macOS Catalina 10.15 以降
- Linux
  - 64 ビット Ubuntu 18.04 以降、Debian 10 以降、openSUSE 15.2 以降、Fedora Linux 32 以降のいずれか
  - Intel Pentium 4 以降のプロセッサ（SSE3 対応）
- Android
  - Android 7.0（Nougat）

ここでは 企業向け Chrome を例に、Windows 11 にインストールする手順を説明します。

## Chrome のインストール手順
### ダウンロード
企業向け Chrome のページにアクセスします。ページが表示されたら、チャンネルの項目に「**Stable**」、ファイル形式の項目に「**MSI**」、アーキテクチャの項目に「**64 ビット**」を選択し、「**ダウンロード**」をクリックします。

[https://chromeenterprise.google/intl/ja_jp/browser/download/#windows-tab](https://chromeenterprise.google/intl/ja_jp/browser/download/#windows-tab)

![01_officialsite.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/11bf0008-54b0-ab87-bee7-ba9852429f42.png)

確認ダイアログが表示されたら、「**使用統計情報と障害レポートを Google に自動送信して Google Chrome の機能向上に役立てる**」のチェックを外し、「**同意してダウンロード**」をクリックします。

![03_officialsite.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/19d36421-1058-38bb-81b7-685a8829e522.png)

### インストーラの起動
ダウンロードが完了したら、インストーラをダブルクリックして起動します。

![11_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/78d50fc5-b3be-a682-a61e-7a5c99b8ba7c.png)

### ユーザーアカウント制御の確認
ユーザーアカウント制御画面が表示されたら、「**はい**」をクリックします

![17_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/09ddc633-a653-fe28-ed85-7e5c5060c3f9.png)

### インストール終了
デスクトップに Chrome のアイコンが作成されたら、インストール完了です。

![21_desktop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/b051afd2-913d-901c-51b4-16e338d2276b.png)
ChatGPTの応答が無くなった件

ChatGPT3.5のAPIでチャットボットを作っているのですが、
先だって、**急に応答を失敗し始め、やがて完全に沈黙しました。**

調べても情報が無いし、困惑しました。
**思い当たるのは、数日前、他所に移したWebサーバー・ドメインを、その前日に元の環境に戻したこと。**
（前日に戻した直後は、問題無く動作しました）
試しに、他のNW環境（グローバルIP）にスクリプトを置いて実行したところ、問題無く応答がありました。

そして、**沈黙～約24時間後に復旧しました。**

他の理由は考えにくいので、
**短期間でのNWの切り戻し＝怪しいので、ChatGPTが、当グローバルIPへの応答を一定期間止めたのかとも思います。**

「数日前、他所に移したWebサーバー・ドメインを、その前日に元の環境に戻した」
こういう事自体を滅多にないと思いますが、同じく困惑している方がいたらと思い書きました。
知ってる？Django Rest FrameworkでDBデータを加工して表示する方法

## はじめに

　初心者ながらバックエンドにDjango REST frameworkを使い、webアプリを作っています。データ一覧のapi表示は出来たのですが、そのデータをごちゃごちゃ計算して表示する方法に中々到達出来なかったので備忘録として残します。初学者なので、ご指摘あれば教えて頂けると嬉しいです。


## やりたいこと

　以下のようなデータにおいて、`date`と`hour`をそれぞれ合計し、表示させたいとします。

```json
    {
        "id": 1
        "date": 1
        "hour": 2
    },
    {
        "id": 2
        "date": 2
        "hour": 3
    }
```

　APIで表示させたい内容は以下のようなものです。

```json
    {
        "sum_date": 3
        "sum_hour": 5
    }
```


## 結論

　[関数ベースビュー](https://www.django-rest-framework.org/api-guide/views/#function-based-views)を用いて実現します。まず結論となるプログラムです。

```python:views.py
from django.db.models import Sum
from django.db.models.functions import Coalesce
from rest_framework.decorators import api_view
from rest_framework.response import Response

from .models import Data


@api_view(["GET"])
def get_summary_data(request):
    summary_dict = Data.objects.aggregate(
        sum_input_date=Coalesce(Sum("date"), 0), sum_input_hour=Coalesce(Sum("hour"), 0)
    )
    return Response(summary_dict)
```

### @api_viewとは
　Httpメソッドを受け取り、それに応じてシリアライズされたデータをAPIに表示できるデコレータです。デコレータとは、関数を受け取り、関数を返す関数です。デコレータについては[とてもわかりやすい記事](https://zenn.dev/ryo_kawamata/articles/learn_decorator_in_python)がありますので、詳しく知りたい方はぜひ。

　デフォルトはGETメソッドのみを受け取り、それ以外は`405 Method Not Allowed`を返します。他のメソッドを許可したい場合は、次の例のように`@api_view`の引数にメソッドを追加します。

```python
@api_view(['GET', 'POST'])
def hello_world(request):
    if request.method == 'POST':
        return Response({"message": "Got some data!", "data": request.data})
    return Response({"message": "Hello, world!"})
```

### `aggregate`でデータを加工する

```python
    summary_dict = Data.objects.aggregate(
        sum_input_date=Coalesce(Sum("date"), 0), sum_input_hour=Coalesce(Sum("hour"), 0)
    )
```

　データの加工は、`aggregate`で行います。データベースから受け取ったクエリセットを加工し、dictで返します。引数を設定することでキーが生成されるので、上記例だと、`sum_input_date`と`sum_input_hour`というキーが作られます。

　`Sum`は、`django.db.models`からimportしたもので、データベース上のカラムを合計してくれます。

　`Coalesce`は、引数に取ったもののうち、nullでない最初のものを返すデータベース関数です。データが一つも入ってない場合に0を返し、エラーを回避しています。


## 勘違いしていたこと

　最初は、`annotate`が使えると思って必死に調べてましたが、各データに対しての集計ができるのが`annotate`なので今回は使えません。使い方を工夫すればできると思って固執してしまったのが良くありませんでした。



## おわりに
　振り返れば簡単な内容ですね。３日もかかってしまいました…。でも、`aggregate`と`annotate`の違いが、使い方も含め明確になったので結果オーライですかね！


## 参考記事
- [python - Django Rest Framework for Calculations - Stack Overflow](https://stackoverflow.com/questions/72044195/django-rest-framework-for-calculations)
- [[Django REST Framework] View の使い方をまとめてみた - くろのて](https://note.crohaco.net/2018/django-rest-framework-view/)
- [【DRF】データごとの件数をカウントして返すやり方 #Python - Qiita](https://qiita.com/chatrate/items/0b9108626981e595a81a)
【3D Object Detection】CenterPoint

# 概要
- Anchor-baseの物体検出を行うと3次元上だと回転方向(yaw angle)の影響を受けやすい。そこでCenter-baseのモデルを提案
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/6f84a511-80d9-8d14-ee9e-2b1776fa3be8.png)

- Backbone -> 3Dのpoint cloudをBEV(=Map View)に変換出来る物であれば何でも問題なさそう。
- 1st stage Head -> それぞれのBEV Gridにclass毎のCenterの確率と、center offset(delta_x,delta_y)、高さ(h)、サイズ(width,length,hight)、yaw angle(sin,cos)を推定する。
- 2nd stage Head -> 1st stageの結果の差分を推定する。やらなくても良い。
- Assinment -> Ground TruthのBounding Box Centerが一致するBEV Gridの推定結果をLossにAssignする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/f337f3b2-8650-ebd1-2a4c-7764972e6c38.png)

# 参考文献
[Center-based 3D Object Detection and Tracking](https://arxiv.org/pdf/2006.11275.pdf)
構造力学

Chidemyへようこそ。これは[構造力学](https://chidemy.com/)、数学、その他の勉強される科目のための関連性のある研究された学習リソースで生徒たちを力づけるためのオンライン学習プラットフォームです。私たちは小学校、中学校、高等学校、および大学の生徒たちが学問の知識とパフォーマンスを向上させるだけでなく、専門の洞察と発展を助けるお手伝いをします。
デカ文字)ESP32でカラー液晶、赤外線距離計を作って遊ぶ2(センサー部品)


x ATM0177B5

デカ文字)ESP32でカラー液晶、赤外線距離計を作って遊ぶ2(センサー部品)


使用した部品の一覧



●MPU(CPU)

![o_cop682.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c92b38c3-df58-4686-ea26-3966a61cc677.jpeg)


ＳＴＭ３２マイコン　ＳＴＭ３２Ｌ０１０Ｆ４Ｐ６
[STM32L010F4P6]
通販コード　I-15689
発売日　2020/09/10
メーカーカテゴリ　STMicroelectronics(STマイクロ)


●基板

![o_con263.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/93560186-25d4-e95d-b17d-13f60a92682d.jpeg)


オリジナル

抵抗(なぜか売り切れ　千石で同じ様な物が売っている)

![o_cop683.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/bbd62507-b812-cb33-3605-28be30451c5c.jpeg)



超精密級　金属皮膜チップ抵抗器　３２１６　１／４Ｗ１０ｋΩ　±０．１％　（５個入）
[RG3216P-1002-B-T5]
通販コード　R-11802
発売日　2017/03/17
メーカーカテゴリ　進工業株式会社(SSM/Susumu)


●コンデンサー(だいたい　0.1uFなら何でもいい)

![o_cop684.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d689ebf3-5503-8a49-a4d7-93fc2f924b76.jpeg)


チップ積層セラミックコンデンサー　０．２２μＦ５０Ｖ　Ｂ　３２１６　（１０個入）
[GRM31MB11H224KA01L]
通販コード　P-09323
発売日　2015/05/04
メーカーカテゴリ　株式会社村田製作所(muRata)



●コネクター

![o_cop685.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/3e97166f-59bf-419f-477a-2172c9a2e28c.jpeg)


ピンソケット（メス）　１×１０（１０Ｐ）・白
[FH-1x10SG-W]
通販コード　C-10298
発売日　2016/05/05
メーカーカテゴリ　Useconn Electronics Ltd.

センサー(接続注意　一発で壊れるよ　ケーブルを入れ替えた)

![o_cop686.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f7c1b91c-2c0f-f999-5fcc-b16b09cecc36.jpeg)


シャープ測距モジュール　ＧＰ２Ｙ０Ａ２１ＹＫ
[GP2Y0A21YK]
通販コード　I-02551
発売日　2008/09/10
メーカーカテゴリ　シャープ株式会社(SHARP)


●DOS/Vでよく使われるコネクター
(QI/2550/信号伝達/Dupontｺﾈｸﾀと言うらしい)
(金メッキありの方)

![o_cop687.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/07f0fd99-8668-c7d1-fc99-9b2637ff6ddf.jpeg)



信号伝達コネクター（ピンコネクター）　（オス）　（１０本入）
[A295-TM12548]
通販コード　C-13181
発売日　2018/03/20
メーカーカテゴリ　Useconn Electronics Ltd.

●DOS/Vでよく使われるコネクターカバー

![o_cop688.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/82eca122-0455-4da1-0145-ef4c52564b29.jpeg)


コネクタ用ハウジング　１Ｐ
[2226A-01]
通販コード　C-12150
発売日　2017/06/08
メーカーカテゴリ　Neltron Industrial Co., Ltd.
コラッツ予想をGoogle Colaboratoryでプロットする

``` python
import matplotlib.pyplot as plt

def collatz(num, count = 0):
  count += 1

  if num == 1:
    return count

  if num % 2 == 0:
    return collatz(num/2, count)
  else:
    return collatz((num * 3) + 1, count)

# グラフの作成
x = []
y = []

for i in range(1, 30):
  x.append(i)
  y.append(collatz(i))

fig, ax = plt.subplots(dpi=120)
ax.plot(x, y)

plt.show()
```

## コラッツ予想って何？

https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%A9%E3%83%83%E3%83%84%E3%81%AE%E5%95%8F%E9%A1%8C
02_NVR500の初期状態のconfig

[参考URL]("http://www.rtpro.yamaha.co.jp/RT/manual/rt-common/index.html")

今回は前回に続いてNVR500の初期状態のcinfigについて精査していきます。
それでは取得したcinfigファイルを提示します。


`# NVR500 Rev.11.00.43 (Wed Jul 20 11:22:59 2022)`
`# MAC Address : 00:a0:de:7f:95:6c, 00:a0:de:7f:95:6d`
`# Memory 64Mbytes, 2LAN, 1BRI`
`# main:  NVR500 ver=00 serial=S35066826 MAC-Address=00:a0:de:7f:95:6c MAC-Address=00:a0:de:7f:95:6d`
`# Reporting Date: Oct 21 07:22:35 2023`
ip lan1 address 192.168.100.1/24
telnetd host lan
dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.100.2-192.168.100.191/24
dns private name setup.netvolante.jp
analog supplementary-service pseudo call-waiting
analog extension dial prefix line
analog extension dial prefix sip prefix="9#"
#

解説

ip lan1 address 192.168.100.1/24
IPアドレスを「192.168.100.1/24」で指定

telnetd host lan
LANからTELNET サーバーへアクセス

dhcp service server
DHCP サーバーとして機能させる

dhcp server rfc2131 compliant except remain-silent
指定した機能以外が RFC2131
リース情報を持たないクライアントからの DHCPREQUEST を無視する

dhcp scope 1 192.168.100.2-192.168.100.191/24
DHCP スコープは「192.168.100.2-192.168.100.191/24」


[dns private name setup.netvolante.jp(("http://www.rtpro.yamaha.co.jp/RT/docs/relnote/Rev.05.01/relnote_05_01_21.txt")

◇NVR500はひかり電話に対応

[analog supplementary-service pseudo call-waiting]("http://www.rtpro.yamaha.co.jp/RT/manual/nvr500/analog/analog_supplementary-service.html")

[analog extension dial prefix line]("http://www.rtpro.yamaha.co.jp/RT/manual/nvr500/voip/analog_extension_dial_prefix.html")

[analog extension dial prefix sip prefix="9#"]("http://www.rtpro.yamaha.co.jp/RT/manual/nvr500/voip/analog_extension_dial_prefix.html")

NVR500はひかり電話の機能を用いたルーターになりますが、
今回はひかり電話機能を使いません。

次回はひかり電話機能を無効にする動作を投稿します。
Suricata サブインタフェースの通信を拾わないなぁと思ったら

# Suricata 7 on CentOS 7

Suricataをちょっと使ってみる機会があり。
かつ、久々にCentOSで実装せねばならず。

ちょこちょこ試していたのですが、地味にめんどくさい点があったので、一応備忘録まで。

# 通信をチェックするインタフェース

今回の構成ですが、インタネット向けの通信を通すeth0以外に、管理NWからSSHを受けるeth1を追加していました。
このeth1でシグネチャに引っかかるはずの通信を出しても検知しないなぁ、、と設定ファイル（/etc/suricata/suricata.yaml）をいじっていたのですが、結論は単純でした。。

suricataサービスを起動する際に、"-i eth0"というオプションが入っているのですが、そこで今回の管理NWにあたるeth1が入っていないのが原因でした。

で、このオプションはCentOSではどこで設定しているかというと、/etc/sysconfig/suricata。
OPTIONSを以下のようにして、サービス再起動してやればOK。

```
元: OPTIONS="-i eth0 --user suricata "
変更後: OPTIONS="-i eth0 -i eth1 --user suricata "
```

suricata.ymlのaf-packetなどでeth1を作らないといけない、、ということはない。

# メモ

今回動作確認の際に使っていたコマンド。
忘れそうなので。

```
# tail -f /var/log/suricata/eve.json | jq 'select(.alert)'  
```

で、試しに適当に発火させる方法。

```
# curl http://testmynids.org/uid/index.html
```

あるいはnetcatで"uid=0(root) gid=0(root) groups=0(root)"を返す。
これをやると"signature_id": 2100498”が発火するので、そのログを見る。

初期設定のままだと、dnsクエリのログや内部でstat作りました系のログがたくさんでてくるので、検知系に絞ります。

なんか検知のタイミングがTCPセッション終わってからになってしまっていて、リアルタイムじゃないような、、
そこら編を調整する設定も見かけましたので、きちんと設定調べて深堀しないといけないなぁ。
JavaScript 正規表現にマッチした文字列のインデックスを「全て」取得する方法

## 結論
[`String.prototype.matchAll()`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/matchAll)を利用します。

```javascript
const regex = /o/g;
const str = 'hello world';
const result = [];
const matches = str.matchAll(regex);
for (const match of matches) {
    result.push(match.index);
}
console.log(result);// [ 4, 7 ]
```

## GitHubのリポジトリ
「searchAll」という関数で利用できるようにしました。よければ。

[Github:js-searchAll](https://github.com/aurora1530/js-searchAll)
NVR500の初期状態

今回はNVR500の初期状態について精査していきます。
まずはNVR500の管理画面を開きます。
ブラウザを起動し、パスに「192.168.100.1」を入力、アクセスします。
![スクリーンショット (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581855/d2e9b65b-8f2c-46ee-92c1-e91b4e6c0feb.png)

パスワード入力画面が表示されますが、設定していないので「OK」をクリックします。
![スクリーンショット (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581855/5a92e496-5700-e056-4fff-906f8aa1a89b.png)

メッセージが表示されますが「OK」をクリックします。
![スクリーンショット (15).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581855/fa1c73f3-b46e-4107-a8d5-17f81b1e35d3.png)

NVR500のトップ画面が表示されました。
congfigファイルを取得したいので「詳細設定と情報」をクリックします。
![スクリーンショット (16).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581855/95143680-957f-a3aa-e337-8dae58b6d15c.png)

詳細設定と情報画面が表示され、
下にスクロールし「レポートの作成・コマンド実行・初期化」にある、
「本製品の全設定(config)のレポート作成」の「実行」をクリックします。
![スクリーンショット (17).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581855/a8aab1a9-4594-130f-c7f9-79b60cd6d55e.png)

本製品の全設定(config)のレポート作成が表示され、
「text形式で表示」を右クリック「名前を付けてリンク先を保存」クリックします。
![スクリーンショット (19).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581855/819bf901-8a0f-34ce-c03b-4d74431b1780.png)

名前を付けて保存が表示され、任意の場所に「config.txt」を保存します。
![スクリーンショット (20).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581855/89c4979a-de7f-69ee-df3f-2078a2099b18.png)

config.txtがダウンロードされていることを確認します。
![スクリーンショット (22).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581855/11eb97ba-0ec3-7ae1-3ec5-acb79bc97cb5.png)

次回は「config.txt」の内容を精査します。
Linuxコマンドのワンライナーで連続した日付を生成したい 

Linuxコマンドで連続した日付を生成したいことがたまにあるので、自分用のメモとして残しておきます。たとえば2023/09/07から15日連続した日付を生成したい場合、次のようなワンライナーで実現可能です。

```
seq 0 14 | xargs -I{} date -d 2023/09/07+{}days +%Y/%m/%d
```

実行結果は以下の通りです。

```
2023/09/07
2023/09/08
2023/09/09
2023/09/10
2023/09/11
2023/09/12
2023/09/13
2023/09/14
2023/09/15
2023/09/16
2023/09/17
2023/09/18
2023/09/19
2023/09/20
2023/09/21
```

**環境情報**

```
$ seq --version
seq (GNU coreutils) 8.30
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

作者 Ulrich Drepper。


$ xargs --version
xargs (GNU findutils) 4.7.0
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Eric B. Decker, James Youngman, and Kevin Dalley.


$ date --version
date (GNU coreutils) 8.30
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

作者 David MacKenzie。
```
LangChain: HTMLテキストの内容を要約する

# 0. はじめに
今回の記事は以前書いたPythonでのWebスクレイピングの続編です。

https://qiita.com/mashmoeiar11/items/36e0de1491d5bf5b153d

今回は、HTMLのテキストを取得できた前提で、そのテキストの内容の要約をつくらせてみようという話です。***スクレイピングから要約までの一連の流れをスクリプトにまとめて自動化し、自分の欲しい情報があるURLのリストさえ作ってしまえば、欲しい情報を効率的に入手できるようになります！*** 適切な方法で行われるスクレイピングは、データ解析や市場調査などの多岐にわたる用途で非常に有用ですが、行う前には十分な注意と配慮が必要です。

::: note warn
法的問題：無許可でのスクレイピングは、著作権侵害や不正アクセスとみなされることがあります。
サイトの利用規約：多くのWebサイトは利用規約でスクレイピングを禁止している場合があります。
サーバーへの負荷：頻繁なアクセスはサイトのサーバーに負荷をかける可能性があります。
:::

このような点には十分に気を付けてください。それでは早速みていきましょう。

# 1. LLMの定義

まずはいつも通りAPIキーやLLMを設定します。

```python
import os
import openai
from langchain.chat_models import ChatOpenAI

# OpenAI APIキー設定
openai.api_key = os.environ['OPENAI_API_KEY']

# ChatOpenAIモデルの設定
LLM = ChatOpenAI(
    model_name='gpt-3.5-turbo-16k',
    temperature=0
)
```

# 2. プロンプトテンプレートの作成

次に`ChatPromptTemplate`をつかって`SystemMessage`や`HumanMessage`を仕込みます。そして最後に入力のテキストファイルを読み込みます。

```python
from langchain.schema import AIMessage, HumanMessage, SystemMessage
from langchain.prompts import PromptTemplate, ChatPromptTemplate
from langchain.prompts.chat import SystemMessage, HumanMessagePromptTemplate

# プロンプトテンプレートを定義
template = ChatPromptTemplate.from_messages(
    [
        SystemMessage(
            content=(
                 "以下は、HTMLからテキストに変換したものです。"
                 "登場人物やあらすじについて4000字程度にまとめてください。"
            )
        ),
         HumanMessagePromptTemplate.from_template("{text}"),
    ]
)

# テキストの読み込み
with open("./output/html_data.txt", 'r', encoding='utf-8') as file:
    text_from_file = file.read()
```

# 3. 出力結果の確認

最後にLLMへ読み込んだテキストを入力します。

```python
result = LLM(template.format_messages(text=text_from_file))
print(result)
```

それでは出力結果を確認してみましょう。今回は、ウィキペディアからドラゴンボール超について要約させてみました。
```
'『ドラゴンボール超』は、鳥山明の漫画作品『ドラゴンボール』を原作としたテレビアニメで、孫悟空を主人公に、魔
人ブウとの戦いのその後を描いています。物語はいくつかの編に分かれており、以下にそれぞれの編の概要をまとめま
す。

1. 破壊神ビルス編：ビルスとの戦いの後、悟空たちは平和な日々を過ごしていましたが、ビルスの双子の兄弟である破
壊神シャンパが現れ、地球の美味しい食べ物を求めて戦いを挑んできます。シャンパとビルスは各宇宙の戦士を選抜
して団体戦を行い、最終的に第7宇宙が勝利します。

2. “未来”トランクス編：未来のトランクスが現代にやってきて、ゴクウブラックという戦士が未来世界で暴れているこ
とを伝えます。悟空たちは未来世界に向かい、ゴクウブラックと戦います。最終的にはゴクウブラックを倒し、未来
世界を救います。

3. 宇宙サバイバル編：全宇宙の代表戦士たちによる武道大会「力の大会」が開催されます。第7宇宙の戦士たちは他の
宇宙の戦士たちと激闘を繰り広げ、最終的には第7宇宙が勝利します。

4. ブロリー編：ブロリーという強力な戦士が登場し、悟空たちは彼と戦います。最終的にはブロリーを倒し、平和を取
り戻します。

5. 銀河パトロール囚人編：凶悪犯のモロが脱獄し、悟空たちは彼と戦います。最終的にはモロを倒し、地球を救います。

6. 生残者グラノラ編：グラノラという生き残りのシリアル人が登場し、悟空たちは彼と戦います。最終的にはグラノラ
の復讐を果たし、彼と和解します。

7. スーパーヒーロー編：トランクスと悟天がヒーロー活動を行いながら、謎の敵と戦います。\n\n以上が『ドラゴンボ
ール超』の主な登場人物やあらすじの概要です。物語は悟空たちの戦いや成長、友情や家族の絆を描きながら、宇宙
の平和を守るために戦い続ける彼らの姿を描いています。
```

4000字程度という指示はあんまり守られている感じはしませんが、そもそも入力トークンがすでに16kに近かったため、致し方ないかなとは思います。

# まとめ

LangChainのおかげで、ちょっとしたPythonコードを書くだけで簡単に文章の要約を行うことができるようになりました。これで大量の情報を効率よく把握することが可能になります。ぜひ、皆さんも試してみてください！

# 関連記事

https://qiita.com/mashmoeiar11/items/36e0de1491d5bf5b153d

# 参考文献

https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%A9%E3%82%B4%E3%83%B3%E3%83%9C%E3%83%BC%E3%83%AB%E8%B6%85

＊本記事はcode snippetをもとに、ChatGPTに作らせています。（手直しはしてます）
SDDMのログイン画面でエンター押せないときの対処法

# 症状

Virtualbox上で，Arch LinuxにSDDM + KDE Plasmaでデスクトップ環境を構築するも，ログイン画面でエンターが効かず，ボタンも存在しなかったのでログインできずに立ち往生した．

# 解決策

ズバリ，**SDDMのログイン画面のテーマを変更**してボタン付きのテーマにすればよい．
私は`breeze`にした．

設定ファイルは`/etc/sddm.conf.d/`なるディレクトリに適当な名前のファイル(私は`theme.conf`にした)をつくって，そこに
```
[Theme]
Current=breeze
```
って書き込んだ．

[参考にしたサイト]

- [SDDM - ArchWiki](https://wiki.archlinux.org/title/SDDM#Configuration)

- [Linux で SDDM ディスプレイ マネージャーをカスタマイズする方法](https://wowgold-seller.com/ja/stories/8846-how-to-customize-the-sddm-display-manager-on-linux)

ちなみにテーマは`/usr/share/sddm/themes/`にはいっている．

プレビューもできるらしい．

# 結論

SDDMのログイン画面のテーマ変更で解決でした．

ちなみに私はインストールを最初からやり直したが，多分GUIからtty1(仮想コンソール)に切り替えてログインできると思う．
【JavaScript•学習ログ３】配列、オブジェクト、関数など

# 目次


[1. 配列](#1-配列)
[2. オブジェクト](#2-オブジェクト)
[3. 関数](#3-関数)
[4. 引数](#4-引数)
[5. 戻り値](#5-戻り値)
[6. スコープ](#6-スコープ)

<font color=gray>参考：侍テラコヤ『JavaScriptの基礎を学ぼう』https://terakoya.sejuku.net/programs/60/chapters</font>

## 1. 配列
```javascript
const userNames = ['太郎','一郎','次郎','三郎','四郎'];

console.log(userNames);
userNames[1] = '花子';
userNames[5] = '五郎';
console.log(userNames);
console.log(userNames[2]);
```
※配列を宣言するときは基本的にconstを使う。

## 2. オブジェクト
配列で格納した値に対して、番号をつけるのではなく**キー**と呼ばれるラベルをつける。
このまとまりのことをオブジェクトという。

《取り出し方》
- ブラケット記法：オブジェクト名['キー名']
- ドット記法：オブジェクト名.キー名

一般的にはドット記法が主流。
```javascript
const personalDate = {name:'太郎', age:30, gender:'男性'};

console.log(personalDate);

personalDate.age = 35;

personalDate.address = '東京都';

console.log(personalDate);

console.log(personalDate.gender); // 特定の値を呼び出す
```
![スクリーンショット 2023-10-21 144116.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/63aca41b-9c3f-c71e-c0f6-cc131dafcba5.png)

## 3. 関数
一連の処理をひとまとめにし、再利用する仕組みのこと。
現在は**アロー関数記法で記述するのが主流。
![スクリーンショット 2023-10-21 145744.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/c9f79d00-be7e-4b42-dd9c-21d10b74e92a.png)
![スクリーンショット 2023-10-21 150205.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/96fbd9d6-5734-dadc-6e36-eaa9bf990ba0.png)
定義しただけでは呼び出されないので実行する際は必ず実行する処理を記述する。

#### よくある関数名一覧

※プログラミング言語では、関数名は「動詞＋目的語」といった形にすることが多い。
下記はよくある一例。
|処理の内容|関数|例|
|-|-|-|
|追加する|add～|addProduct(商品を追加する)|
|削除する|remove～|removeProduct(商品を削除する)|
|存在するかチェックする|has～|hasProduct(商品が存在するかチェックする)|
|状態をチェックする|is～|isPurchased(購入されたかどうかチェックする)|
|それが起こったら処理をする|on～|onPushedButton(ボタンが押されたときに処理をする)|

## 4. 引数
引数は関数に渡すデータのこと。
![スクリーンショット 2023-10-21 234428.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/34eeb7d5-0396-05b3-31d1-59accd57728c.png)
![スクリーンショット 2023-10-21 234752.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/890cd94d-b844-b774-f754-42fe58f7ccc0.png)

## 5. 戻り値
処理した結果、返ってくる値のこと。関数内ではreturnで記述する。
![スクリーンショット 2023-10-22 000733.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/85ba7ba2-15c6-426e-bcec-8af79a042a34.png)
![スクリーンショット 2023-10-22 000935.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/ca039caf-fea2-5fc2-18de-83f8b45c0425.png)

## 6. スコープ
変数や定数の有効範囲のこと。
![スクリーンショット 2023-10-22 001956.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/dbd69d96-bd50-30f6-051f-f08b1299db23.png)

<hr>

（簡易メモ）

1. 同じ処理を繰り返し行いたい場合は関数が便利。
1. キーも関数もわかりやすく名付ける。
1. 有効範囲を理解しないとエラーにつながる。
備忘録　Promiseオブジェクトについて

## Promiseオブジェクト
:::note
Promiseオブジェクトとは、「今は値を返せないけど、あとでちゃんと返すよ」と約束するオブジェクトのこと。（ずっとなんでPromiseと呼ぶのか疑問だったのでスッキリしました）
:::

非同期処理では、処理結果の値をすぐに使えないという性質があるため、同期処理のような結果を関数の戻り値にできない。そこで非同期処理が実行された将来に得られるであろう結果として、Promiseオブジェクトを返すことができる。


そして、Promiseが返された時点では結果が確定していない場合もあるため、PromiseからPromise.resultのように結果を参照することはできない。

その代わりに、Promiseのthenメソッドにコールバック関数を渡すことで、**結果が確定した時**に、その値を参照することができる。

---

参考文献

https://gihyo.jp/magazine/SD/archive/2023/202309
openCVでVP9の動画をうまく読み込めない

# 古めのopenCVでvp9コーデックの動画を読むとフレームが大量にドロップする件
ほとんど見出しのままです。
Python版openCVのバージョン4.5.1.48で約6000フレームのVP9の動画を読み込んだところ、5600フレーム目ほどで読み込みエラーが発生しました。
…これだけならただのフレーム欠落だなぁ、重い動画とかだとたまにあるよなぁ～で終わりなのですが

・何度やり直しても読み込めない
・諦めて次のフレームを読み込もうとしてもそちらもだめ
・なんと、そのあとの約400フレーム全てが読み込めない

とただならぬ予感。
openCVのバグんじゃないかと思い、いろんなバージョンで動作を検証してみました。
# 検証内容
```python
import cv2

print(cv2.__version__)

file="xxxx.mp4"

cap=cv2.VideoCapture(file)
if cap.isOpened():
    print(file+" accepted")

w=cap.get(cv2.CAP_PROP_FRAME_WIDTH)
h=cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps=cap.get(cv2.CAP_PROP_FPS)
frame=cap.get(cv2.CAP_PROP_FRAME_COUNT)

print(w)
print(h)
print(fps)
print(frame)

for i in range(int(frame)):
    ret,img=cap.read()

    if not ret:
        print(i)
        break
```
ただひたすらフレームを読み込んでいくプログラムを作りました。
これを複数のバージョンのopenCVを使って実行し、何フレームまで読み込めるか試してみます。
## v4.5.1.48
```
4.5.1
xxxx.mp4 accepted
1920.0
1080.0
23.97945982524929
6025.0
5608
```
これが私が愛用しているバージョンでの挙動です。まずは目いっぱいバージョンを上げてみます。
## v4.8.1.78（23年10月22日時点の最新）
```
4.8.1
xxxx.mp4 accepted
1920.0
1080.0
23.976023976023978
6024.0
```
最新版では最後まで読み切ることができました。他にバグの原因が思い当たらなかったのでとりあえず安心しました。
ところで総フレーム数が1減っているのはなぜ…いろいろと気になるので、もう少しバージョンを下げて遊んでみます。
## v4.8.0.74/76
```
4.8.0
xxxx.mp4 accepted
1920.0
1080.0
23.976023976023978
6024.0
```
こちらも異変無し
## v4.7.0.72
```
4.7.0
xxxx.mp4 accepted
1920.0
1080.0
23.97945982524929
6025.0
6024
```
先ほどより総フレーム数が1増え、6024（つまり、1オリジンで数えて6025枚目）の読み込みに失敗しました。
どうやら、この動画の正しいフレーム枚数は6024なのに対し、openCV4.7.0くんは6025フレームだと勘違いして最後の無いフレームを読み込もうとして失敗した模様。
## v4.5.2.52
```
4.5.2
xxxx.mp4 accepted
1920.0
1080.0
23.97945982524929
6025.0
6024
```
4.5.2.52（私の使用しているバージョンの1つ上）からこの挙動だったようです。
# まとめ
（環境によって異なる可能性もありますが）openCVでVP9の動画を読み込むなら、バージョンは4.8.0以降にあげておいた方がよさそうです。

# 追記
あれからもう少しいろいろな動画ファイルで追実験しましたが、4.5.2.52~4.7.0.72で総フレーム数が数フレームだけ大きくなる現象はどのVP9動画でも共通なようでした。
ついでに、MP4コーデック(MPEG4/AVCではない古いやつ)の動画は最新を含む近年の全てのopenCVバージョンで総フレーム数が数フレームだけ大きくなる現象を観測しました。
【Next.js】サーバーコンポーネントで現在のURLを取得する方法

以下のようにするとサーバーコンポーネントで現在のURLを取得できます。

```middleware.ts
import { NextResponse } from 'next/server'
import { NextRequest } from 'next/server'

export async function middleware(req: NextRequest) {
  const requestHeaders = new Headers(req.headers)
  requestHeaders.set('x-url', req.url)

  return NextResponse.next({
    request: {
      headers: requestHeaders,
    }
  })
}

```

```layout.tsx
import { headers } from 'next/headers';

export default function RootLayout() {
  const headersList = headers()
  const header_url = headers().get('x-url') || "";
}
```


パスを取得するには以下のようにします。


```middleware.ts
import { NextResponse } from 'next/server'
import { NextRequest } from 'next/server'

export async function middleware(req: NextRequest) {
  const requestHeaders = new Headers(req.headers)
  requestHeaders.set('x-pathname', req.nextUrl.pathname)

  return NextResponse.next({
    request: {
      headers: requestHeaders,
    }
  })
}

```

```layout.tsx
import { headers } from 'next/headers';

export default function RootLayout() {
  const headersList = headers()
  const pathname = headers().get('x-pathname') || "";
}
```
PandasAI を Langchain、Azure OpenAIと共に使ってみた

pandasAIなるpythonライブラリがリリースされていたのでAzure OpenAI、langchainと組み合わせて試してみた。

# PandasAIとは
PandasAIは、一般的なデータ分析・操作ツールであるpandasにGenerative AI機能を追加するPythonライブラリ。pandasと組み合わせて使用するように設計されており、pandasを置き換えるものではない。
PandasAIはpandas（および最もよく使われるデータ分析ライブラリ）を会話型にし、自然言語でデータに質問できるようにする。例えば、あるカラムの値が 5 より大きい DataFrame 内のすべての行を検索するよう PandasAI に依頼すると、その行のみを含む DataFrame を返す。
また、PandasAI にグラフの描画、データのクリーンアップ、欠損値のインプット、特徴量の生成を依頼することもできる。

https://docs.pandas-ai.com/en/latest/

# インストール
```
pip install pandasai[langchain]
```

# langchainのLLM定義（gpt-4モデルを使用）
pandasAIはLangchainのLLM定義をそのまま使うことができる。
https://docs.pandas-ai.com/en/latest/LLMs/langchain/

```python
BASE_URL = "https://[].openai.azure.com/"
API_KEY = ""
DEPLOYMENT_NAME = "gpt-4"

from langchain.chat_models import AzureChatOpenAI
from langchain import LLMChain, PromptTemplate

llm = AzureChatOpenAI(
    openai_api_base=BASE_URL,
    openai_api_version="2023-07-01-preview",
    deployment_name=DEPLOYMENT_NAME,
    openai_api_key=API_KEY,
    openai_api_type="azure",
)
```

# PandasAIのSmartDataframe定義
pandasDFとlangchainのLLM定義を引数として、SmartDataframeを定義する。

```python
import pandas as pd
from pandasai import SmartDataframe

df = pd.DataFrame({
    "country": ["United States", "United Kingdom", "France", "Germany", "Italy", "Spain", "Canada", "Australia", "Japan", "China"],
    "gdp": [19294482071552, 2891615567872, 2411255037952, 3435817336832, 1745433788416, 1181205135360, 1607402389504, 1490967855104, 4380756541440, 14631844184064],
    "happiness_index": [6.94, 7.16, 6.66, 7.07, 6.38, 6.4, 7.23, 7.22, 5.87, 5.12]
})

df = SmartDataframe(df, config={"llm": llm})
```

# PandasAIへの分析問い合わせ
SmartDataframeのchatメソッドで自然言語で分析の問い合わせを行うことができる。

```python
df.chat('Which are the 5 happiest countries?')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288299/a98041cf-137a-34e1-55bf-2dc707363c4c.png)

```python
df.chat('最もGDPが高い国はどこですか？')
```
```
'The country with the highest GDP is United States.'
```

```python
df.chat('GPDが高い国は幸せと言えますか？')
```

```
"Unfortunately, I was not able to answer your question, because of the following error:\n\nMissing optional dependency 'seaborn'.  Use pip or conda to install seaborn.\n"
```
seabornライブラリをインストールするようエラーが出た。seabornはPythonの可視化ライブラリ。
インストールして再実行。

```
pip install seaborn
```

```python
df.chat('GPDが高い国は幸せと言えますか？')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288299/420b62e3-78e6-4464-a534-41474a9f4e7f.png)

GDPが高いからといって幸せとは言えないらしい。

```python
df.chat('Calculate the sum of the gdp of north american countries')
```

```
20901884461056
```
Canada + United StatesのGDPをちゃんと回答。

# まとめ
インストールも簡単で、pandasデータに対して直接自然言語で分析指示できるのは便利。
疑問としては、chatGPTは計算処理が不得意（そのためにCoT等を使う）であるが、それを補えているのかという点。
自分の職場従業員名簿をデジタル化してみた

### 今までいくつかのフォームがありましたが
私は現在、スーパーで店舗で運営に関わった仕事をしています。店内なら大体何処にでも現れる感じのポジションで動いています。もうすぐ**年末**、ということで、**売場**に関するお仕事はもちろんなのですが、今年オープンしたお店なので、年末調整を含めた**従業員管理**に関わる業務も多数発生する為、１度雛形を作成しなくては、ということでチャレンジしようと思います。

私の現在のデジタルレベル、こんな感じです。😭これから頑張ろう。

https://qiita.com/jf0129/items/c6b0cbea4740106f2e6c

今まで勤めていた店舗でも、**従業員名簿**は存在していましたが、それぞれの店舗で雛形はバラバラ、そもそもフォームが統一されていればいいのに、と思いつつも良いものが出来ていればそれをアピールしていけば良いのでは、ということでやってみます。
　今回はglideを使用して**従業員名簿アプリ**を作成してみたいと思います。

### 使用したもの
①Glide
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552218/3c98bad3-f528-793a-2b64-765ac8176ad5.png)


②GoogleSpreadSheet
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552218/d2745d71-3df4-3ed1-54a8-be91fa35f587.png)


### ここまで出来ました
https://twitter.com/jf0129190483/status/1715730074740380016
![Something went wrong]()


アプリはもちろんログインありにする必要があります。

![s-IMG_0014.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552218/8c06bbc5-3f1f-dcf7-21da-27b0d241311f.jpeg)


### 使ってもらいました
　試作品を試してもらう相手は私の同僚のＮさん（私の部下で事務がメインの女性、とにかくみんなに優しく、ほぼ、お母さん的な存在）に試してもらいました。
 　「Nさんにとってはこれからの年末に向けて大変忙しくなる時期なんだけど、従業員のデータがすぐに検索できると便利だと思って名簿を作成しましたので試してみてください」と説明して試してもらいました。

  「どういう項目があると助かる？また、逆にこれは要らないなって思う項目あれば教えて欲しいです」という質問をしてみたところ

　職場の同僚Ｎさん談
「今ある項目は全部欲しいです。早いところ**完全体**にしてください」
とのありがたい感想を頂きました。

今回は個人情報にあたるのでちゃんと権限がある人に試してもらう必要がありました。
（Ｎさんはパートさんですが個人情報を管理する権限を与えています。）

![うさぎいいねjpeg.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552218/91c5f016-6be3-0a4c-a880-4f56afdb50b6.jpeg)

### 参考にさせてもらったもの
https://qiita.com/hakodatenakayama/items/10cfb91102b976e7ad17

https://qiita.com/88Eqv/items/2e7f32a96f29e0e2febf

https://www.youtube.com/@nocodechannel/videos


### 最後に
　使い勝手が良さそうに感じた半面、改めて考えると、**個人情報**の扱いのルールは職場でちゃんと決まっているので出来上がったものがそこのルールをクリアしているのか？が使用できるポイントになると思います😅。

![s-やっちまったjpeg.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552218/2d49712f-bd64-9c4a-0a61-2e12062b65cd.jpeg)
M5Stackで温湿度センサーを作る

# M5Stackで温湿度センサーを作る

作業部屋の湿度を感じることが多いのですが、気づいたら気にならない時期になってます。。 
除湿機を買おうか悩んでいたのですが、実際どの程度湿度変化があるのか気になり、  
温湿度センサーを作ってみることにしました。

画面があると色々と便利なので、M5Stackを使ってみます。
BLE、Wi-Fi使えるので、幅広げるのも楽そうかなと思っています。

本記事では、M5Stackで温度・湿度・気圧を取得するところまで進めます。

## ハードウェア構成

- M5Stack BASIC V2.7
- M5Stack用温湿度気圧センサユニット Ver.3(ENV Ⅲ)

## 環境構築

PlatformIOを業務で使っていたので、PlatformIOを使って環境構築します。

前提として、Visual Studio Codeの拡張機能にPlatformIOインストール済みです。
PlatformIOのインストールは[こちら](https://platformio.org/install/ide?install=vscode)を参考にしてください。

困った時は、他記事で丁寧に環境構築が書かれているので、参考にしてください。
[こちらなど](https://qiita.com/lutecia16v/items/1c560bdd7eac7ebeaff7)

### PlatformIOのプロジェクト作成

以下設定でプロジェクトを作成しました。

- Name: env-sensor
- Board: M5Stack Core ESP32
- Framework: Arduino

プロジェクトを作成すると、以下のようなディレクトリ、ファイルが自動生成されます。

```plain
.
├── include
│   └── README
├── lib
│   └── README
├── platformio.ini
├── src
│   └── main.cpp
└── test
    └── README
```

### M5Stackライブラリのインストール

PlatformIOのライブラリ画面から以下ライブラリをインストールします。

```plain
M5Stack by M5Stack
```

### 書き込みの確認

適当なソースコードを用意して、Uploadの確認をします。  
確認用のソースコードは、`PlatformIO/Libraries/M5Stack/Examples/Display`のサンプルコードをmain.cppにコピペしました。  
これで、M5Stackに書き込めることを確認しました。

#### 書き込み方法

PlatformIOの書き込みは以下方法があります。

- PlatformIOのサイドメニュー（PlatformIOのプロジェクトとしてVS Codeを開いている時）
- VS Code下部のアップロードアイコン（→）
- コマンド (`pio run -t upload`)

pioコマンドは、`source ~/.platformio/penv/bin/activate`を実行すると使えます。

## 温湿度の取得

実際にセンサ値を取得するソースコードを実装します。

### センサ値を取得するためのソースコードをダウンロード

GitHubに M5Stack用温湿度気圧センサユニット Ver.3(ENV Ⅲ) の制御コードが置かれているので、ダウンロードします。  
[M5Stack用温湿度気圧センサユニット Ver.3(ENV Ⅲ)のGitHub](https://github.com/m5stack/M5Unit-ENV/tree/master)  
自分の環境では、以下のように保存しました。

```plain
.
└── src
    └── main.cpp
    └── sensor
        ├── DHT12.cpp   <-- 追加
        ├── DHT12.h     <-- 追加
        ├── M5_ENV.h    <-- 追加
        ├── QMP6988.cpp <-- 追加
        ├── QMP6988.h   <-- 追加
        ├── SHT3X.cpp   <-- 追加
        └── SHT3X.h     <-- 追加
```

main.cpp のソースコードを下記に記載します。

```cpp
#include <M5Stack.h>
#include "sensor/M5_ENV.h"

SHT3X sht30;
QMP6988 qmp6988;

float temperature = 0.0;
float humidity = 0.0;
float pressure = 0.0;

void setup()
{
    M5.begin();
    M5.lcd.setTextSize(2);

    Wire.begin();
    qmp6988.init();
    sht30.init();
    M5.lcd.println("ENV III Unit Test");
}

void loop()
{
    pressure = qmp6988.calcPressure();
    if (sht30.get() == 0)
    {
        temperature = sht30.cTemp;
        humidity = sht30.humidity;
    }
    else
    {
        temperature = 0.0;
        humidity = 0.0;
    }

    M5.lcd.fillRect(0, 20, 100, 60, BLACK);
    M5.lcd.setCursor(0, 20);
    M5.lcd.printf("T: %2.1f  \r\nH: %2.0f%%  \r\nP:%2.0fPa\r\n",
                  temperature, humidity, pressure);
    delay(1000);
}
```

ここまでで、M5Stackにソースコードをアップロードすると、M5Stackで温度・湿度・気圧を確認することができます。

## まとめ

M5Stackとセンサを用いて、温度・湿度・気圧を取得することができました。
今後、BLEやWi-Fiを用いてWebやスマホからセンサ値を確認できるようにする予定です。
【AWS】Lambda SAMを使用したローカル開発で標準出力結果をファイルに保存する

## 概要
Lambda関数の開発において、``SAM（Serverless Application Model）``を利用することで、ローカルでの開発がスムーズに行えます。

しかし、Lambda関数をローカルで呼び出す際、通常の方法では結果がファイルに保存されず、``ターミナル上(Macの場合)に表示``されてしまいます。

そこでLambda関数の``出力結果やログをファイルに保存する方法``があったので備忘録として残したいと思います。

## SAM(Serverless Application Model)とは？
SAM（Serverless Application Model）は、Lambda関数の開発において非常に便利な``オープンソースフレームワーク``です。

SAMを使用することで、ローカルでの開発プロセスが劇的に簡略化されます。これにより、Lambda関数の開発を迅速かつ効果的に行えるようになります。

公式がかなり分かりやすいです。

https://aws.amazon.com/jp/serverless/sam/

## 出力結果やログはファイルに保存したい
下記のように、SAM CLIでなにもオプションを指定せずにLambda関数をローカルで実行するとファイルには出力されません。

```
$ sam local invoke MyFunctionName
省略...
{"statusCode": 200, "body": "{\"message\": \"hello world\"}"}% 
```
そこで、オプションを使用することで出力結果とログをファイルに出力することができます。

以下はその手順です。

まずは簡単なLambda関数を用意します。

``` python
def handler(event, context):
    print("log") 
    return "hello world" 
```

次に、Lambda関数の出力結果である "hello world" をファイルに保存します。
```
sam local invoke 1> stdout.log
```
同様に、ログもファイルに保存します。

```
sam local invoke 2> stderr.log
```

このように、SAM CLIにオプションを指定することで、Lambda関数の出力結果とログをファイルに保存できます。これにより、後で結果やログを簡単に確認できるようになります。

## 参考
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/using-sam-cli-local-invoke.html
InfraAcademyなるものでLinuxコマンドの基礎を学んでみた

# はじめに
20年くらいエンジニアをしていますが、
Linuxを触った経験がほぼないです。
勉強しようと思い、ネットで調べてましたが、ただコマンドの解説だけだといまいちな感じがしてたました。
そんなところInfraAcademyなるものを見つけたので、それを使って少し勉強してみようと思います。

## ディレクトリ
Windowsでいうフォルダと同じ

## pwd
なんだか、パスワードチックだなってすぐ思うのですが、print working directoryの略みたいです。納得。

## .ドット一つ
カレントディレクトリを指します。

## ..ドット２つ
一つ上のディレクトリを指します。

## ~
ホームディレクトリ

## touch [ファイル名]
ファイルを作成するコマンド

## cat [ファイル名]
ファイルの中身を表示する

## >
追記じゃなくて、新規にファイル作成
<font color="red">上書きされます。</font>

## >>
追記される

## lsって？
listの略です。

## rm(remove)
削除

## touch
タッチ。なぜタッチなんだろう。
空のファイルを作ります。

## echo
文字列を表示するコマンド。
ファイル作成もできる。

```
echo "test" > file.txt
```

## cat
ファイルの中身を確認する。

con<font color="red">cat</font>enate（つなぐ、連結する）の略。
ファイルを連結するためのコマンド。
しかし、いまでは連結させずに単一ファイルの中身をみることの方が多いコマンドとなっています。

## lsのオプション
### -a
隠しファイルも表示する。
<font color="red">Linuxの隠しファイルは．ドットから始まります。</font>

### -l
詳細情報を表示する

### -t
日付順に並び替え

## ls grep

```
ls -la /etc | grep pro
```
自宅サーバーでRootless dockerを使えるようにした話

## 目次
[はじめに](#はじめに)
[なぜRootless？](#なぜRootless？)

[1 Dockerのインストール](#1-Dockerのインストール)
[2 必要なパッケージのインストール](#2-必要なパッケージのインストール)
[3 ユーザーの作成](#3-ユーザーの作成)
[4 RootlessDockerのインストール](#4-RootlessDockerのインストール)
[5 起動](#5-起動)

[おわりに](#おわりに)


## はじめに
前回は自宅サーバーとcloudflare経由でSSH接続ができるようにしました。
今回はRootless dockerを使えるようにしていこうと思います。

## なぜRootless？

このサーバーはwebサーバーの公開とかファイルサーバーとか色々な用途に使おうとしているため、「Aという目的のために動かしたコンテナがBという目的で動かしていた常駐プログラムに影響を与える」みたいなことは避けるべくRootlessモードを採用しました。

今回のケースには該当しませんが、複数人で使うPCでdockerを使いたい場合などもRootless dockerを使うのが良いです。


## 1 Dockerのインストール
すでにインストールを済ませている方は飛ばして問題ありません。
今回はDocker DesktopではなくDocker Engineのみをインストールします。

公式サイトの手順に従ってインストールします。

https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository

レポジトリを追加↓
```
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Add the repository to Apt sources:
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
```

インストール↓
```
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```

以下のコマンドが問題なく実行されたらインストール成功です。
```
sudo docker run hello-world
```


## 2 必要なパッケージのインストール
まずは必要なパッケージをインストールします
```
sudo apt install uidmap
```
Dockerデーモンを停止します
```
sudo systemctl disable --now docker.service docker.socket
```

## 3 ユーザーの作成
Rootless Dockerを使う一般ユーザーを追加します。
```
sudo adduser {ユーザー名}
```

追加したユーザーにログインします。
```
sudo login {ユーザー名}
```
systemctlを有効化します。
```
loginctl enable-linger {ユーザー名}
```

### 補足(2023/11/11 追記)
新しく作成したユーザーは環境変数`$XDG_RUNTIME_DIR`が設定されていません(少なくとも私の環境では)。
そのときは
```
$ id
```
で自身のUIDを確認し、`~/.bashrc`に
```
export XDG_RUNTIME_DIR=/run/user/{確認したUID}
```
と記述した上で次のステップに進んでください。
```
source ~/.bashrc
```
で変更を適用するのを忘れずに！(自戒)

## 4 RootlessDockerのインストール

Rootless dockerを使用する一般ユーザーにログインして次のコマンドを実行します。
```
curl -fsSL https://get.docker.com/rootless | sh
```
表示された内容を`~/.bashrc`に追記します。

例↓
```~/.bashrc
export PATH=/home/{ユーザー名}/bin:$PATH
export DOCKER_HOST=unix:///run/user/1000/docker.sock
```

## 5 起動
`docker run hello-world`が一般ユーザー権限で実行できることを確認します。
```
docker run hello-world
```

## おわりに
今回は非rootユーザーでもdockerが使えるよう、Rootless dockerをサーバーに導入しました。
次回はこのDockerを使ってwebサーバーを立ててみようと思います。

## 参考資料

https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository

https://e-penguiner.com/rootless-docker-for-nonroot/

https://docs.docker.jp/engine/security/rootless.html