OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonでマイル(mile)とキロ(km)を変換するプログラムコードを作成してみた

### 前置き
日本では、野球の投手の球速や野手の打球速度を測る時に、キロ(km)が使用されているが、アメリカでは、マイル(mile)が使用されている。そこで、今日は、キロからマイルに変換できるプログラムコードを作成してみたかった。

### プログラムコード（マイルからキロに変換）
``` python
from tkinter import *

def miles_to_km():
  miles = float(miles_input.get())
  km = miles * 1.609344
  kilometer_result_label.config(text=f"{km}")
  
window = Tk()
window.title("Miles to Km converter")
window.config(padx = 20, pady = 20)

miles_input = Entry(width = 7)
miles_input.grid(column = 1, row = 0)


miles_label = Label(text = "Miles")
miles_label.grid(column = 2, row = 0)

is_equal_label = Label(text = "is equal to")
is_equal_label.grid(column = 0, row = 1)

kilometer_result_label = Label(text = "0")
kilometer_result_label.grid(column = 1, row = 1)

kilometer_label = Label(text = "Km")
kilometer_label.grid(column = 2, row = 1)

calculate_button = Button(text = "Calculate", command = miles_to_km)
calculate_button.grid(column = 1, row = 2)

window.mainloop()
```
### 出力結果
![Screenshot 2024-06-26 at 18.31.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518583/5ca18b40-1575-ed6b-88dc-110af7a87825.png)
1マイルは、1.609344kmで変換できる。

### ちなみに
一般的に投手が100マイル、野手が打球速度175kmを計測したら超一流と言われている。
日本で1番球速が速い投手は、大谷翔平（ドジャース）の165km/hである。
今年のプロ野球においては、佐々木郎希（ロッテ）の160km/hである。

世界最速投手はアロルデイスチャップマンが計測した169.1kmだ。
日本で打球速度が一番速い野手は柳田悠岐（ソフトバンク）が181km/hを計測している。
阪神タイガースでは、森下翔太選手が今季第3号を放った際、175km/hを計測している。

一方、メジャーリーグでは、R.アクーニャJr.（ブレーブス）が195.1km/hを計測している。
大谷翔平（ドジャース）は4位の190.9km/hを計測している。

引用元：https://number.bunshun.jp/articles/-/860425?page=2
引用元：https://www.nikkansports.com/baseball/news/202404100001880.html

### プログラムコード（マイルとキロを相互変換）
```python
def miles_to_kilometers(miles):
    """
    マイルをキロメートルに変換する
    """
    kilometers = miles * 1.609344
    return kilometers

def kilometers_to_miles(kilometers):
    """
    キロメートルをマイルに変換する
    """
    miles = kilometers / 1.609344
    return miles

def convert_distance(dist_str):
    """
    距離と単位が入力された文字列を受け取り、変換された距離と単位を表示する
    """
    if 'mi' in dist_str.lower():
        miles = float(dist_str[:-2])
        kilometers = miles_to_kilometers(miles)
        return f"{miles} マイル = {kilometers:.2f} キロメートル"
    elif 'km' in dist_str.lower():
        kilometers = float(dist_str[:-2])
        miles = kilometers_to_miles(kilometers)
        return f"{kilometers} キロメートル = {miles:.2f} マイル"
    else:
        return "入力が無効です。マイルは 'mi' を、キロメートルは 'km' を付けてください。"

# ユーザー入力例
user_input = input("距離を入力してください（例: 10mi, 20km）: ")
print(convert_distance(user_input))
```
### プログラムコードの説明
このコードでは、ユーザがkm（キロ）に数値を入力したらmile（マイル）が表示される。
反対に、mile（マイル）に数値を入力したらkm（キロ）が表示されるいう仕組みだ。

### 出力結果
```python
距離を入力してください（例: 10mi, 20km）: 175km
175.0 キロメートル = 108.74 マイル
距離を入力してください（例: 10mi, 20km）: 190.9km
190.9 キロメートル = 118.62 マイル
距離を入力してください（例: 10mi, 20km）: 100mi
100.0 マイル = 160.93 キロメートル
```
森下翔太選手（阪神タイガース）の175km/hという打球速度は、108.74マイルになる。
大谷翔平選手（ロサンジェルスドジャース）の190.9km/hという打球速度は、118.62マイルになる。一方、　100マイルは、160.93kmになる。

このように、ちゃんとユーザーがキロメートルの数字を入力したらマイルが出力され、マイルを入力したらキロメートルが出力される。

皆さんも時間がある時に、このプログラムコードを参考にしながら、キロメートルをマイルに変換してみたり、マイルをキロメートルに変換してみてはいかがでしょうか。
「コメントに対するコメント」をモデルで表現してみた！

## 動作環境
vscode、ruby3.3.0、rails7.1.3.4

## 実装したかったこと
x(旧twitter)のようなクローンアプリを作っていたのですが、投稿文に対するコメントに対して更にコメントする機能を実装してみました。
探せば山ほど参考になる記事は出てくると思ったのですが、今回は自分のテーブルや関係性の理解度を確認するために、敢えて自分で試行錯誤しながら一から作ってみました！💪

## 実装のゴール
コメントの子要素を取得できる。
コメントの３階層まで。4階層目のコメントは作成できない。(コメントのコメントのコメントまでは作成できる)

## 実装前のモデルの状態
user→post→comment
(既にpostへのコメント機能は作成済みです)
```app/models/user.rb
has_many :posts, dependent: :destroy
has_many :comments, dependent: :destroy
```
```app/models/post.rb
belongs_to :user
has_many :comments, dependent: :destroy
```

```app/models/comment.rb
belongs_to :user
belongs_to :post, counter_cache: true
```

## コメントの子コメントを取得できるようにする
### コメントと子コメントを1対多の関係にする

コメントにparent_comment_idカラムを追加します。
```db/migrate/20240621054017_add_parent_comments_to_comment.rb
class AddParentCommentsToComment < ActiveRecord::Migration[7.1]
  def change
    add_column :comments, :parent_comment_id, :integer
    add_foreign_key :comments, :comments, column: :parent_comment_id
  end
end
```

子コメントをchild_commentsという名前で定義します。
```app/models/comment.rb
has_many :child_comments, class_name: 'Comment', foreign_key: 'parent_comment_id', inverse_of: :parent_comment, dependent: :destroy
```

コメントの親コメントを取得できるよう、親コメントをparent_commentという名前で定義します。
１階層目のコメントは親コメントがいないので、parent_commentとの紐付けは任意にします。
```app/models/comment.rb
belongs_to :parent_comment, class_name: 'Comment', inverse_of: :child_comments, optional: true
```

## 3階層目以降のコメントは作成できないようにする
作成しようとするコメントのコメントのコメントのparent_comment_idカラムに値が入っていれば、つまり既に3階層になっていれば、保存できないようにするという処理を書きます。
どこかイけてない気がしなくもない…
FBをもとに改良したいと思います。
```app/models/comment.rb
validate :layer_over_three

def layer_over_three
  if self.parent_comment&.parent_comment&.parent_comment_id.present?
    errors.add(:base, 'parent comment already has layers over three')
  end
end
```

## 最後に
初めてコメントに対するコメント機能を作成しました。
社内のチャットシステムを見ながらいつも、どうやって実装しているんだろう？自分も実装してみたいと思っていたので、とりあえず実現できたのは良かったです。
画面の作成がまだ途中なので、画面の作成の完了次第、ビューファイルもアップしようと思います！
SQLのOFFSET句を解説：使い方とベストプラクティス

## はじめに
[前回](https://qiita.com/t1k2a/items/b6869ac13c1636a7690f)の記事でOFFSETを記述しましたが、具体的な意味や使い方を理解していなかったので
改めて調べて自分なりに理解した内容で解説しようかと思います

## OFFSET句とは何か
- `OFFSET`句は、データの取得を行う最初の位置を指定します
- 例： 「SELECT * FROM users OFFSET 10」は、最初の10行をスキップして、11行目から取得します

## `OFFSET`句が必要なシナリオ
- ページネーション
    - 大量データをページごとに表示する際に、`OFFSET`句を使用して適切な位置からデータを取得します
- データのスキップ
    - 特定の行をスキップしてデータを取得したい場合に使用します
- 大量データを扱う
    - 数千、数万のデータを扱うときにすべてを一気に取得するとパフォーマンス低下につながるので、`OFFSET`を使用します

## `OFFSET`句の基本
- `OFFSET`句と`LIMIT`句の併用
    -  `OFFSET`句は`LIMIT`句と組み合わせて使用されます
    -  `LIMIT`句を省略するとSQLエラーが発生するため、省略はできませんのでご注意ください
```sql
SELECT * FROM LIMIT 10 OFFSET 20
```
21行目から30行目まで10件のデータを取得します

## 具体的な使用例
- ページネーションまたは大量データ活用での使用例
```sql
SELECT * FROM users LIMIT 10 OFFSET 0;  -- 1ページ目
SELECT * FROM users LIMIT 10 OFFSET 10; -- 2ページ目
SELECT * FROM users LIMIT 10 OFFSET 20; -- 3ページ目
...

-- 大量データを扱う際は OFFSET 100 になることもあります
```

- データのスキップと取得の例
```sql
SELECT * FROM orders LIMIT 5 OFFSET 5; -- 最初の5行をスキップして次の5行を取得
```

## 注意点とベストプラクティス
- `OFFSET`句のパフォーマンスの問題
    - 大量データがある場合、後のページになればなるほど応答が悪くなることがあります
        - クラシ句は下記のリンクを参照してください

https://qiita.com/madilloar/items/b4e786a932ef9d4551b9#%E3%82%AA%E3%83%95%E3%82%BB%E3%83%83%E3%83%88%E6%B3%95%E3%81%AE%E7%89%B9%E5%BE%B4

- 効率的なページネーションの方法
    - インデックスを利用する
        - インデックスを適切に設定することで`OFFSET`句のパフォーマンスを改善できます
    - 主キーの使用
        - 主キーを利用したページネーションを行うことでパフォーマンスが向上します
```sql
SELECT * FROM users WHERE id > 100 ORDER BY id ASC LIMIT 10;
```
idが100より大きいデータを10件取得する

## まとめ
`OFFSET`句は、特定の位置からデータを取得するために非常に便利です
特にページネーションの実装で有用です
ただし、フォーマンスの問題を考慮し、大量データを扱う際には適切な手法を検討することが重要になりようですね

## 参考リンク

https://www.sqltutorial.org/sql-limit/

https://anko.education/reference/sql/limit_offset

https://www.javadrive.jp/sqlite/select/index10.html#section2

https://qiita.com/madilloar/items/b4e786a932ef9d4551b9
AWS Summit Japan（2024）でJamに参加して3位入賞しました！

たんじです。

今回は、AWS Summit Japan（2024）の中で開催されたJamイベントに参加してとても面白かったのと3位に入賞できたのでそのことについて書かせていただきます！

# AWS Jamとは？

> AWS Jam は、AWS のユースケースに沿って用意された様々なテーマの課題を解決しながら「AWS を楽しく学ぶ」実践型のイベントです。参加者は AWS やシステム開発の知識や経験を活用し、必要に応じてその場で情報を調べながら、与えられた複数の課題を AWS マネジメントコンソールを利用してクリアしていきます。
課題ごとに獲得得点やヒントが設定されており、時間内にクリアした課題と使用したヒントを総合してチームの得点を競い合います。

というものです。「AWS を楽しく学ぶ」とうところがGameDayとの違いかなと思います！

https://aws.amazon.com/jp/summits/japan/expo/#:~:text=%E3%81%8A%E7%9F%A5%E3%82%89%E3%81%9B%E3%81%97%E3%81%BE%E3%81%99-,aws%20jam,-AWS%20Jam%20%E3%81%AF


# チーム決め

会場に入りくじを引き番号の書かれたテーブルへ「13」でした。
知り合いや同じ会社の方と参加されていそうな方はいましたが私は1人で参戦。
4人1チームで全員が初めましての方々でした。


# 昨年のレポート

昨年は15 チームだったみたいです。今年や約倍の人数になってました！！

https://aws.amazon.com/jp/blogs/news/aws-jam-report-aws-summit-tokyo-2023/



# ルール
- 1チーム4人（今回約30チーム約120人？？）
- ソロでの実施はNG
- ドライバー、ナビゲータに別れてペアで取り組む事が推奨

AWS Jamではチーム戦で問題をガンガン解いて上位を目指すということよりも、参加者同士でAWSを利用した学びを得ることを大切にしていました！

# チーム名決め

チームに分かれて一番はじめの課題は、各々自己紹介を実施後チーム名を決めること

うちのチームでは、色々と意見を出しながらChatGPTも利用してたりして以下の候補が出ていました。

- System Managers(SSMs)
- S3 SAMURAI
- 31(サーティーワン)
etc...

結局、元々のチーム番号を逆にした３１から「サーティーワン」が採用されましたw
 
# Jam の様子

![IMG_1554 2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1985649/99991146-3b9d-edf6-9bb9-6a8d7afc491e.jpeg)

# 作戦＆進め方

- モブワークかペアワークで進めるのがルールになっていたため元々席が隣あっている二人でペアワークで進める
- Easyから進めるペアとMediumから始めるペアで分かれて課題を進める
- ラスト１時間くらいは、Hardの課題はヒントを多用してガンガン進める

といった形で実施しました。
結果的には、お互いに半々くらい問題を解いて出題された問題全て解くことができました。


# 結果

３位に入賞することができました！!


![IMG_1571.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1985649/7c2d3f4f-2749-e719-68ba-c6cfa5fe48c1.jpeg)


![スクリーンショット 2024-06-20 16.19.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1985649/77aaeffa-48cd-817c-6830-7ab1557240b8.png)

1位はトロフィーで2位、3位はメダルでAWS Jamのキャラクターであるサルのデザインでした。

![IMG_1520.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1985649/256ebf6c-cd1c-68d6-c23d-c318d8304570.jpeg)

昨年のサルよりリアルなデザインになったようですｗ

3位だったのでメダルを頂きました！！
また、参加賞のAWS Jamステッカー2枚と$25分のAWSクレジットも頂きました！

![IMG_1600.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1985649/1ee80835-e2a0-1c84-da58-1c89adf115c3.jpeg)



# AWS Skill Builder

弊社（WHI）では、AWS Skill Builderのチームチームサブスクリプションに参加しています。
チームサブスクリプションでは、Jamイベントを開催することができます！

https://skillbuilder.aws/jp/subscriptions


そして、WHI Cupと称して40-50人ほどで月に1回社内でAWS Jamイベントを開催しています。

https://x.com/WHI_developers/status/1765237402598285365

# まとめ

AWS Jamとても楽しかったです。
社内で開催しているJamはオンラインだったので初めて現地で、オフラインで作業を実施することで初対面の方でもきちんとコミュニケーションを取りつつ協力して実施できました。

途中過程をダッシュボードで確認して自分たちのチームがTopになったタイミングをありとても盛り上がりました。

今回、3位になれたのは正直たまたま同じチームになったメンバーが良かったので運が大きいですがAWS Jamを社内で定期的に実施してチャレンジに慣れていることでチームに貢献できたのでは??と思っています。

普段、オンラインで実施しているのでオフラインでの実施はとても楽しかったです。
またの機会があれば参加したいと思います！
AWSDataLifecycleManagerDefaultRoleを使おうとしたらIAMサービスロールの罠に引っかかったお話

# 事象
罠に引っかかるまでの流れを記します。

■準備段階
①検証アカウントで、既に存在していた「**AWSDataLifecycleManagerDefaultRole**」のARNを確認
②DLMの設定をデプロイするためのCloudFormationテンプレートに①で確認したARNを記載。
※アカウントID部分は本番アカウントIDに置換しました。

■構築時
③新規の本番アカウントでCloud ShellからAWS CLIでAWSDataLifecycleManagerDefaultRoleを事前に作成
④新規の本番アカウントで②で準備したCloudFormationテンプレートをデプロイ

■試験時
⑤構築翌日にDLMの実行がエラーになっていることを確認

入念にCloudFormationテンプレートの中身は確認していたので、単なる誤字脱字ではありませんでした。
皆さんはこの事象が起きた原因が何かわかりますでしょうか。

:::note info
そもそもIAMサービスロールってなんだっけという方は、以下の記事のIAMサービスロールとIAMロールの違いをまとめた表がわかりやすかったです。
[IAMサービスロールとIAMロールの違い](https://qiita.com/kimuni-i/items/adc80c0f94b0dec4ebbb#iam%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%A8%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AE%E9%81%95%E3%81%84)
:::

# 原因
単刀直入に述べると
**CloudFormationテンプレートのDLM設定に記載したIAMロールのARN（①で確認したARN）が正しい文字列でなかったこと**
が原因でした。

ではなぜ間違っていたか。
それは以下のように**IAMサービスロールの作成方法が異なること**が根本の原因でした。
* 検証アカウントの「AWSDataLifecycleManagerDefaultRole」→ AWSコンソールで作成されたIAMサービスロール
* 本番アカウントの「AWSDataLifecycleManagerDefaultRole」→ CloudShell（AWS CLI）で作成されたIAMサービスロール

具体的には以下のように異なるようです。
| 作成方法 |ARN形式|
|:-|:-|
|AWSコンソール|arn:aws:iam::account_id:role/**service-role**/AWSDataLifecycleManagerDefaultRole|
|AWS CLI | arn:aws:iam::account_id:role/AWSDataLifecycleManagerDefaultRole |

[AWS公式：Amazon Data Lifecycle Manager のデフォルトのサービスロール](https://docs.aws.amazon.com/ja_jp/ebs/latest/userguide/service-role.html#default-service-roles
)

話を戻すと、本番アカウントでは新規にCloudShell（AWS CLI）で作成されたIAMロール、つまり **/service-role\/のパスがつかないIAMサービスロール**が作成されたにもかかわらず、
CloudFormationテンプレートのDLMの設定部分では **/service-role/のパスがついたIAMサービスロール**のARNを指定してしまっていたことにより、エラーが起きたようでした。

# あとがき
日頃、事前準備時にリソースに必要なパラメータなどは準備しておくことが多いですが、本番のリソースをどのように作成するかで今回のようにIAM ARNが変わるといったこともあるので、構築の流れを見据えて準備するべきだと学んだ一件でした。
どなたかの役に立ちますように。
ポリモーフィズムは何を目的としているのか

## はじめに
　ポリモーフィズムについて調べると、動物を例に挙げてどうやってポリモーフィズムを実現させるかという説明をよく目にします。しかし、ポリモーフィズムもプログラミングを分かりやすくするためのtipsなのであくまで手段です。どのようにポリモーフィズムを満たすかも重要ですが、なぜポリモーフィズムを満たしたらプログラミングが分かりやすくなるのかがより重要だと思います。この記事では「なぜポリモーフィズムを満たしたらプログラミングが分かりやすくなるのか」について触れようと思います。

## ポリモーフィズムとは
　まずは目的を話す前に、ポリモーフィズムとはを簡単に説明します。ポリモーフィズムとは抽象クラスを使い、「抽象的な振る舞い」が状態に応じた「具体的な振る舞い」をすることです。

 >　抽象的な振る舞いと具体的な振る舞いという単語を使いましたが、私の造語です。「振る舞い」という単語私の中で2種類あるので、明確にするために分けました。それぞれの定義は以下の通りです。
 >
>**抽象的な振る舞い**
　抽象度が高い振る舞い。動物は「鳴く」、動物は「走る」など。プログラムで言うと抽象メソッド。どういう型の引数と取り、どういう型の返り値を返すなど。リスコフ置換の原則で言われる振る舞いはこっち。
>
>**具体的な振る舞い**
　抽象度の低い振る舞い。犬は「ワンと鳴く」、チーターは「時速100㎞で走る」など。プログラミングで言うと具象メソッド。実際のロジックが記載される。ポリモーフィズムで言われる振る舞いはこっち。

 ## ポリモーフィズムの目的
 　この記事の本題に入りたいと思います。私が思うにポリモーフィズムの目的は以下２点だと思います。それぞれ説明していきます。

・呼び出し側でif文やswitch文を無くす。
・システムの拡張を簡単にする。

#### 呼び出し側でif文やswitch文を無くす
　ポリモーフィズムとは**抽象的な**振る舞いが状態に応じて**具体的な**振る舞いをすることです、なので子クラスは親クラスと異なる**抽象的な**振る舞いをしてはいけません（メソッドを増やしたり、引数を広げたり戻り値を狭めたりする分には問題ない）。SOLIDの原則の一つであるリスコフ置換の原則を守る必要があります。
　上記を満たすことで、呼び出し側は状態を意識せずに親クラスの**抽象的な**振る舞いに（親クラスの型）対してプログラムを行うことが出来ます。

>　状態を意識したプログラミングとは様々意見あると思いますが、ここではステータスや選択値を使いif文やswitch文で処理を分岐しているプログラミングとします。このようなプログラミングは単純にコードが肥大化し可読性が下がるのと、if文やswitch文が乱立して何をしたいプログラムなのかが判断つきにくくなったり、コードを読むときに状態を意識して読む必要があったり、誤った条件文を修正してしまうなどの恐れがあります。

　親クラスの抽象的な振る舞いに対してプログラミングを行うことで、if文やswitch文をなくすと説明しましたが、呼び出し側で子クラスのインスタンスを作成するタイミングで結局if文、switch文必要になってしまうのではという疑問を持たれた方もいるかもしれません。この問題はFactoryパターンで回避したりします。

　サンプルコードは気が向いたら作成して追記します。

　以下の本の序盤の方で同じような説明がされていて、サンプルコードもあるのでここまでで興味持たれた方は読んでみてください。

https://www.kinokuniya.co.jp/f/dsg-01-9784774190877

### システムの拡張を簡単にする。
　ポリモーフィズムはリスコフ置換の原則を守る必要があると説明しました。これにより呼び出し側は親クラスの抽象的な振る舞いに対してプログラミングを行うことが出来ます。つまり呼び出し側はどの子クラスを利用しようが関係がないということになります。
 
　決済を行うシステムを例に考えてみます。前提として既存の決済方法としてはクレジット決済とコンビニ決済があり、新しくQR決済が増えるとします。
 
 　ポリモーフィズムを利用していない場合は、if文やswitch文で決済方法ごとの分岐を行い支払い処理を行っているので、QR決済用に新しく分岐を用意する必要が出てきます。これは機能の拡張を行うのに既存のコードの修正をしているので、オープンクローズドの原則を守れていません。
  　一方でポリモーフィズムを利用している場合は、上述したように呼び出し側は親クラス（今回の例でいうと決済クラス）の抽象的な振る舞いに対してプログラミングを行っています。QR決済を増やす場合、決済クラスを継承したQR決済クラスを新しく実装するだけになります。これは機能の拡張を行うのに既存のコードの修正をしていないので、オープンクローズドの原則を守れています。
　オープンクローズドの原則を守ると、機能を拡張する際、既存のコードの影響を考えなくて済むのと、単体テストが行いやすくなるため、機能の拡張が容易になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267761/6d6d1dee-3f8b-0425-1c7d-be950338399b.png)

## まとめ
　ポリモーフィズムの行っていることは振る舞いの抽象化です、振る舞いを抽象化する必要がなければ、ポリモーフィズムを利用しなくていいです。普通に抽象データ型で対応しましょう。
【PostgreSQL】メタコマンド〜\if〜

## 初めに

Qiita Engineer Festa 2024に参加中。完走目指してます。
他のバックスラッシュコマンドについては以下から読んでください。

[【PostgreSQL】バックスラッシュコマンドを纏めていく](https://qiita.com/dai_chi/items/04f5339d54130f070671)

## \ifとは
合わせて以下の説明もしています。

```json
\elif expression
\else
\endif
```

> このコマンド群は入れ子にすることができる条件ブロックを実現します。 条件ブロックは`\if`で始まり、`\endif`で終わらなければなりません。 その間には`\elif`句をいくつでも置くことができ、さらにその後に`\else`句を１つだけ置くことができます。 条件ブロックを構成するコマンドの間には、通常の問い合わせや他の種類のバックスラッシュコマンドを置くことができます（通常は置きます）。
> 
> 
> `\if`コマンドおよび`\elif`コマンドはその引数を読み取り、それを論理式であるとして評価します。 式の結果が`true`であれば、通常通りに処理が続きますが、そうでないときは、対応する`\elif`、`\else`または`\endif`に到達するまで行をスキップします。 ひとたび`\if`または`\elif`の評価が真になったら、同じブロック内のそれより後にある`\elif`コマンドの引数は評価されず、偽であるとして扱われます。 `\else`より後にある行は、それより前の対応する`\if`と`\elif`が一つも真にならなかった時にのみ実行されます。
> 
> `\if`コマンドおよび`\elif`コマンドの`*expression*`引数は、他のバックスラッシュコマンドの引数と同様、変数置換と逆引用符展開の対象となります。 その後で、on/offのオプション変数の値のように評価されます。 従って有効な値は、`true`、`false`、`1`、`0`、`on`、`off`、`yes`、`no`のいずれかに曖昧性なしに、大文字小文字を区別せずにマッチするものです。 例えば、`t`、`T`、`tR`はすべて`true`であるとみなされます。
> 
> 真にも偽にも適切に評価できない式には警告を発行し、偽として扱います。
> 
> スキップされる行も、問い合わせとバックスラッシュコマンドを特定するため、通常通り解析されますが、問い合わせはサーバには送信されず、条件コマンド（`\if`、`\elif`、`\else`、`\endif`）以外のバックスラッシュコマンドは無視されます。 条件コマンドは入れ子の有効性の確認のためだけに検査されます。 スキップされる行の変数参照は展開されず、逆引用符の展開も実行されません。
> 
> 条件ブロック内のすべてのバックスラッシュコマンドは同じファイル内になければなりません。 ファイル内のすべての`\if`ブロックが閉じられるより前に、メインの入力ファイルまたは`\include`されたファイルの終端に到達した場合、psqlはエラーを発生させます。
> 

[\ifについて](https://www.postgresql.jp/docs/15/app-psql.html#:~:text=%5Cif%20expression%0A%5Celif%20expression%0A%5Celse%0A%5Cendif)

## 試してみた

以下をif.sqlとして作成
usesは既に作成済みである

```sql
SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'users') AS users_exists
\gset

\if :users_exists
    \echo 'Table users exists'
\else
    \echo 'Table users does not exists'
\endif
```

実行してみる

```sql
psql -f if.sql
```

結果が返ってきた

```sql
Table users exists
```

ちなみに以下のような条件を指定、実行すると、、

```sql
\if :value = 1
```

Errorになってしまう。。。

```sql
psql:if.sql:3: error: unrecognized value "1 = 1" for "\if expression": Boolean expected
```

どうやら\ifに比較はかけなさそう

参考：[https://qiita.com/nuko_yokohama/items/f736454315a80fa96850#expressionに数式を指定してみる](https://qiita.com/nuko_yokohama/items/f736454315a80fa96850#expression%E3%81%AB%E6%95%B0%E5%BC%8F%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B)

## まとめ

実務での利用はしたことないが、どのよう活かせるか。。
すぐには思いつかなかったです。
何かできそうだけど、なんだろうか。
OpsRamp - チケットにSLAを設定する方法について

本記事では、OpsRampのチケットにおいて SLA (Service Level Agreeement)の設定方法について説明します。

# 概要
OpsRampでは、インシデントまたはサービスリクエストチケットに対して SLA を設定することが可能です。

# 設定方法
SLA は、Setup > ServiceDesk > Service Level Agreements から設定可能です。

リクエストのタイプに、Incident または Service Request から選択します。
Priority に、対象となるチケットプライオリティを設定します。
応答時間に、初回応答までの時間を設定します。
解決時間に、初回応答までの時間を設定します。
Add Reminder では、SLA を超える前にリマインダーを設定することが可能です。
![sla.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/41476e0f-aeaf-371d-299f-6205b02b97f7.png)

応答時間、解決時間およびリマインダーに設定した時間にメール通知することが可能です。
メール通知は、Setup > ServiceDesk > 通知から設定可能です。
- Response SLA Reminder : 応答時間に設定した時間に達した場合にメール通知されます。
- Response SLA Breach Reminder : 応答時間のリマインダーに設定した時間に達した場合にメール通知されます。
- Resolution SLA Reminder : 解決時間に設定した時間に達した場合にメール通知されます。
- Resolution SLA Breach Reminder : 解決時間のリマインダーに設定した時間に達した場合にメール通知されます。

![sla-notification.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/daaf4fdc-d716-7576-f4b2-dbabe061a705.png)


---------------------------------------
[<img width = 250 height = 200 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/111de30a-4d33-aa33-5c7d-83d9015093e6.png">](https://www.vistanet.jp/knowledge-base/)
?(オプショナルプロパティ)と| undefined の違い

## オプショナルプロパティ
TypeScript のオブジェクトの型は`{<key名>: <プロパティの型>}`の形で表されますが、プロパティキーの後に`?`をつけることでそのプロパティがあってもなくてもよいこと（オプショナルであること）を明示できます。
```ts
type Fish = {
  name: string
  age?: number
}
```

一方で、`undefined`型とのユニオン型をとることでも、プロパティが`undefined`であってもよいことを明示できます。
```ts
type Fish = {
  name: string
  age: number | undefined
}
```

一見同じ型に思える`?` と`| undefined` ですが、実はそれぞれ異なる意味を持っています。
以下で両者の違いをみていきたいと思います。

## `?`と`| undefined`の違い
両者の違いは、**プロパティが必須かどうか**にあります。

`?`の場合には、オブジェクトにその**プロパティがなくても型エラーが発生しません**。

一方で、`| undefined` とした場合には、オブジェクトにその**プロパティ自体が存在している**必要があります。
```ts
type Fish = {
  name: string 
  age?: number
}

type Octopus = {
  name: string
  age: number | undefined
}

const fish: Fish = {
  name: 'Tuna'
}

const octopus: Octopus = { //Property 'age' is missing in type '{ name: string; }' but required in type 'Octopus'.(2741)
  name: 'octopus'
}
```
`undefined`型とのユニオン型の場合には、値が`undefined`であることは許すが、プロパティ自体が存在しないことは許さないので、プロパティ自体は持たせておきたいという場合に使用すると、型により詳細な情報を持たせられていいですね。
```ts
const octopus: Octopus = { // プロパティが揃っているので型エラーは出ない
  name: 'octopus',
  age: undefined
}
```
Podmanよく利用するコマンド一覧

# コンテナーイメージ関連

## イメージの一覧
```
podman images
```

## イメージの取得
```
podman pull {イメージ名}
```
デフォルトでは以下のレジストリからイメージ取得を行います。
1. registry.access.redhat.com
2. registry.redhat.io
3. [docker.io](https://hub.docker.com/)

## イメージの削除
```
podman rmi {イメージ名/ID}
```

## イメージからコンテナーの実行
```
podman run --restart=always -v {ホストディレクトリパス}:{コンテナーディレクトリパス} -p {ホストポート番号1}:{コンテナーポート番号1} -p {ホストポート番号2}:{コンテナーポート番号2} -t -i -d --network={ネットワーク名} --ip=192.168.100.2 --name {コンテナー名} {イメージ名/ID} {コマンド}
```

オプション
1. ボリュームのマウント -v {ホストディレクトリパス}:{コンテナーディレクトリパス}
2. ポートマッピング -p {ホストポート番号}:{コンテナーポート番号}
3. Podmanネットワーク指定 --network={ネットワーク名}
4. IPアドレスの指定 --ip={IPアドレス}
5. コンテナ名 --name={コンテナ名}


## イメージをファイルにエクスポート
```
podman save -o {出力先パス} {イメージ名/ID}
```

## イメージファイルからインポート
```
podman load -i {イメージファイルパス}
```

## イメージに対してタグを付ける
```
podman tag {イメージ名/ID} {イメージ名}
```


# ネットワーク関連

## ネットワークリスト
```
podman network ls
```

## ネットワークの詳細
```
podman network inspect {ネットワーク名}
```

## ネットワークの作成
```
podman network create --subnet=192.168.100.0/24 --gateway=192.168.100.254 {ネットワーク名}
# 192.168.100.1～192.168.100.253までをコンテナーが利用可能
# ホスト側の通信はゲートウェイの192.168.100.254となる
```

# コンテナー操作関連

## 実行中のコンテナーの確認
```
# 実行中のコンテナーのみ
podman ps

# 終了したコンテナーを含む場合は、-a(--all)オプションで表示
podman ps -a
```

## 実行中のコンテナーでコマンドの実行
```
podman exec {コンテナー名/ID} {コマンド}
```

## コンテナーからイメージの作成
```
podman commit {コンテナー名/ID} {イメージ名}
```

## コンテナーの削除
```
podman rm {コンテナ名/ID}
```

## コンテナーの停止
```
podman stop {コンテナー名/ID}
```

## コンテナー内のファイルをホスト側にコピー
```
podman cp {ホストファイルパス} {コンテナー名/ID}:{コンテナーファイルパス}
```

## コンテナー間のファイルコピー
```
podman cp {コピー元コンテナー名/ID}:{コピー元コンテナー側ファイルパス} {コピー先コンテナー名/ID}:{コピー先コンテナー側ファイルパス}
```

## コンテナー内のファイルをホスト側にコピー
```
podman cp {コンテナー名/ID}:{コンテナーファイルパス} {ホストファイルパス}
```
WSL2で認証付きネットワークドライブをマウントする

個人的「質はともかく継続する」１9日目です

# WSL2で認証付きネットワークドライブをマウントする

WSL2 + Dockerで環境を作っていたときに
地味にハマりました。

1.マウント用のディレクトリをつくる
```sh
sudo mkdir testdir
```

２．マウントする

認証に必要なIDとパス、ドメイン名をいれる。
```sh
sudo mount -r -t drvfs -o username=<ユーザ名>,password=<パスワード>,domain=<ドメイン名> <ネットワークドライブのパス> ./testdir
```
解説します。

- `-r`: 読み取り専用にする
- `-t drvfs`: マウントするファイルシステムのタイプを `drvfs` に指定
- `-o username=<ユーザ名>,password=<パスワード>,domain=<ドメイン名>`: マウントオプションとして、ネットワークドライブにアクセスするためのユーザ名、パスワード、ドメイン名を指定

ポイントはオプションで認証情報を指定するところです。
コレを入れたらうまくマウントしてくれました。
エンジニアの道を外れるとIT企業に勤めても転職しにくい話

## 私はエンジニア、、、、でした、、、

こんにちは！私は一応IT企業に勤めている男です。

そう、毎日していることはExcelとにらめっこしているだけで

**趣味でプログラミングをしている**次第です。

つまりITの会社なのに会社ではまったく**プログラミングは仕事になりません**

## 実際アラフォーになるとリーダーの経験ばかりきかれる

アラフォーになると、面接ではこれまでのPLやPMの経験ばかりきかれます。

つまり**プログラマーは求められていない**と肌身に感じます。

## 転職だけが道ではない

わたしはむしろ転職の幅が狭くなったことで今の職場でもっとコミットしていこうという気になりました。

あと、私のいる職場は私のような人間がいるくらいですからまわりも正直現場に復帰できるような人材は少ないです。

だから似た者同士これからも慰めあって生きていこうという気になります。

## 世の中は基本思い通りにならない

牧師さんのいうとおり、世の中自分の思い通りにいくという驕りはいけません。

強欲になり、自分や他人が傷つく結果となってしまう。

肩の力を抜いて流れに身を任せて生きていく、それでもいいと思います。

## Q. 結局この記事は何が言いたいんですか？

それは読者の皆様のご想像にお任せします。

優しい読者の皆様に一読していただけていれば本望です。
[備忘録]　フリーランスエンジニアの保険について学んだこと

# はじめに
こんにちは，Umamusume22です．今回はフリーランスエンジニアとして働く場合，加入した方が良さそうな保険について調べてみました．会社員であれば毎月の給与から健康保険や厚生年金などが天引きされます．保険制度は沢山存在して雇用保険や労災保険などがあります．ところが，フリーランスの場合は会社員より保険がないというイメージを持っています(失礼)．そこで，本当にフリーランスエンジニアには加入対象の保険制度が存在しないのか調べて勉強します

# 保険について学んだことの備忘録[1,2]
- 健康保険
    - 自己負担料が3割
    - 傷病手当金や出産手当金という保障あり
        - 1日あたり標準報酬日額の2/3がもらえる
        - 傷病手当の場合，4日を超える休業が発生した時はこの日を起点に最長1年半の間，給付が貰える
    - フリーランスになった場合は健康保険を任意継続するか国民健康保険に加入
        - 任意継続する場合，支払う保険料が倍になる
        - 傷病手当金がもらえない
        - 保険料の計算がシンプル
    - 国民健康保険も自己負担料が3割で傷病手当金がもらえない
    - 傷病手当金の代替→所得保障保険

- 厚生年金
    - 国民年金
    - 確定拠出年金
- 退職金
    - 小規模企業共済
        - iDeco
    - 倒産防止共済
- 労災保険
    - 民間の損害保険に加入
- 雇用保険
    - フリーランスでバイトを雇った場合は雇用保険が必要
    - フリーランスで働く人を保護する法制度が進んでいる
        - 2024年の秋ごろに施行予定



参考文献
[1] "フリーランスを目指すなら知っておけ！ ~社会保険のお話~"
https://qiita.com/jo7ueb/items/14d9945a732392fffa7b

[2] "フリーランスは雇用保険に加入できる？｜雇用保険の代わりとなる制度を解説【シン・会社のマナー】" 
https://news.yahoo.co.jp/articles/463bb65660ed23eaf385eea69054f4e94dc2c311?page=3
【Unity】Andriodビルド時にInstalled Build Tools revision **** is corruptedのエラーが発生する

# はじめに
Niantic Lightship ARDKのサンプルプロジェクトをビルド時に以下のエラーが発生し、ビルドすることができない状態に陥りましたので、解決策を記録します。

https://github.com/niantic-lightship/ardk-samples

```
* What went wrong:
Could not determine the dependencies of task ':launcher:compileReleaseJavaWithJavac'.
> Installed Build Tools revision **.*.* is corrupted. Remove and install again using the SDK Manager
```

# 原因
GradleバージョンがARDKのサンプルプロジェクトとビルドしようとしているプロジェクトのバージョンがことなるため、Gradleが破損していると誤認識していることが原因です。

# 解消方法
Gradleのバージョン指定を修正することでビルドできるようになります。
具体的には、ARDKのサンプルコードのリポジトリのUnityバージョンそのままでAndroidプラットフォームに切り替えると ビルドプロセスの設定ファイル`Assets/Plugins/Android/baseProjectTemplate.gradle` が生成されますが、Unityのバージョンを変更時、ここで定義されいてるGradleプラグインバージョンが自動で変更されないことが原因のようです。

```
dependencies {
    // If you are changing the Android Gradle Plugin version, make sure it is compatible with the Gradle version preinstalled with Unity
    // See which Gradle version is preinstalled with Unity here https://docs.unity3d.com/Manual/android-gradle-overview.html
    // See official Gradle and Android Gradle Plugin compatibility table here https://developer.android.com/studio/releases/gradle-plugin#updating-gradle
    // To specify a custom Gradle version in Unity, go do "Preferences > External Tools", uncheck "Gradle Installed with Unity (recommended)" and specify a path to a custom Gradle version
    classpath 'com.android.tools.build:gradle:4.2.0'

    **BUILD_SCRIPT_DEPS**
}
```
コメント部分翻訳版
```
// Android Gradleプラグインのバージョンを変更する場合は、それがUnityにプリインストールされているGradleバージョンと互換性があることを確認してください。
// UnityにプリインストールされているGradleバージョンを確認するには、こちらをご覧ください: https://docs.unity3d.com/Manual/android-gradle-overview.html
// 公式のGradleとAndroid Gradleプラグインの互換性表はこちらをご覧ください: https://developer.android.com/studio/releases/gradle-plugin#updating-gradle
// UnityでカスタムGradleバージョンを指定するには、「Preferences > External Tools」に移動し、「Gradle Installed with Unity (recommended)」のチェックを外して、カスタムGradleバージョンへのパスを指定します。
```
上記のコードの `4.2.0` の部分を自分の利用しているGradleプラグインバージョンに変更するとビルドが通るようになります。

なお、Unityバージョン毎のGradleバージョンはこちらに記載されています。

https://docs.unity3d.com/Manual/android-gradle-overview.html

2022.3の場合、デフォルトのGradle versionは7.2なので、Gradle Plug-in versionに記載されている	7.1.2を入力すると良いです。
SCRUM BOOT CAMPを読んだ

『SCRUM BOOT CAMP THE BOOK 増補改訂版』を読みました、という記事です笑

# 全体のまとめ

この本では以下のことが言いたいことなのかなあと思いました。

- いくら精密に見積もろうとしても、不確実性は存在する。不確実性を受け入れよう。
- 不確実な中でも、確実なものはある。それは今までの実績だ。できるだけ確実な見積もりをするには、実績を根拠にしよう。
- 不確実な部分から問題は発生してくる。問題をできるだけ早く見つけよう。
- 確実な実績を作る、できるだけ早く問題を見つける。そのためのフレームワークを提供するのがスクラム開発だ。

# 感想

以前スクラム開発を採用したPJにいた時は、なんとなーく形だけをなぞってやっているような状態でした。
フレームワークとしてある程度形を守るのは大切ですが、それが何のためにあるのか、**理由をしっかり考えないといけない**なと改めて感じました。

新たにスクラム開発に挑戦するチームには、是非最初に皆でこの本を読んで共通認識を作って欲しい！(作りたい！)と思います。
【JavaScript】テーブルの各行にあるボタンを押すとそのほかのボタンが非活性になるコード

## テーブルのDOM操作極めてますか？

よくあるのがテーブルの各行にボタンがあった時の操作です。
その時にDOMについて知らないと積みます。

## テーブルの中のボタンを取得しそのボタンを配列として処理、各ボタンにクリックイベントをバインディング

以下のソースコードをコピペすると各行にボタンが配置された表を表示します。
ボタンを押すとテーブルにあるそのほかのボタンが非活性になります。



```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Table with Edit Buttons</title>
    <style>
        table {
            border-collapse: collapse;
            width: 100%;
        }
        th, td {
            border: 1px solid black;
            padding: 8px;
            text-align: left;
        }
        th {
            background-color: #f2f2f2;
        }
    </style>
</head>
<body>
    <table id="myTable">
        <thead>
            <tr>
                <th>Column 1</th>
                <th>Column 2</th>
                <th>Column 3</th>
                <th>Column 4</th>
                <th>Action</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>Data 1</td>
                <td>Data 2</td>
                <td>Data 3</td>
                <td>Data 4</td>
                <td><button class="edit-btn">Edit</button></td>
            </tr>
            <tr>
                <td>Data 5</td>
                <td>Data 6</td>
                <td>Data 7</td>
                <td>Data 8</td>
                <td><button class="edit-btn">Edit</button></td>
            </tr>
            <tr>
                <td>Data 9</td>
                <td>Data 10</td>
                <td>Data 11</td>
                <td>Data 12</td>
                <td><button class="edit-btn">Edit</button></td>
            </tr>
            <tr>
                <td>Data 13</td>
                <td>Data 14</td>
                <td>Data 15</td>
                <td>Data 16</td>
                <td><button class="edit-btn">Edit</button></td>
            </tr>
        </tbody>
    </table>

    <script>
        document.addEventListener('DOMContentLoaded', function() {
            const table = document.getElementById('myTable');
            const editButtons = table.getElementsByClassName('edit-btn');

            Array.from(editButtons).forEach(button => {
                button.addEventListener('click', function() {
                    // Disable all edit buttons
                    Array.from(editButtons).forEach(btn => {
                        btn.disabled = true;
                    });

                    // Enable only the clicked button
                    this.disabled = false;

                    // You can add your edit functionality here
                    console.log('Edit button clicked for row:', this.closest('tr').rowIndex);
                });
            });
        });
    </script>
</body>
</html>

```

1番上のボタンをクリックすると(どこでもいいですが)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/e80a7713-b8d8-fb40-c429-46b1d5cc3813.png)

そのほかの行にあるボタンが非活性になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/1ae900c0-333f-1b2b-ffb1-094794875619.png)

## Q.これはいったい何に役立つんですか？

それはこの記事を読んだあなたの想像力にお任せします。
internationalesim.comの国際SIMカードの利点を探る

現代のつながりの強い世界では、海外旅行中も繋がりを保つことが重要です。国際SIMカードは、SIMカードを交換する手間や高額なローミング料金を気にすることなく、便利に通信を行うための解決策を提供します。ここでは、internationalesim.comが提供する国際SIMカードの利点と特徴について掘り下げます。

詳しくはウェブサイトをご覧ください： https://internationalesim.com

国際SIMカードとは？
国際SIMカードは、旅行者向けに設計されたカードで、複数の国で同じSIMカードを使用することができます。これらのカードはグローバルネットワークで動作し、さまざまな地域でカバレッジを提供し、接続問題を最小限に抑えます。

国境を超えたシームレスな接続
internationalesim.comのSIMカードの特長の一つは、複数の国で途切れることなく接続を提供する点です。ローカルSIMカードとは異なり、国際SIMカードは一貫したサービスを提供し、旅行者が電話をかけたり、テキストを送ったり、データを使用するのをシームレスに行えます。

経済的なコミュニケーションソリューション
伝統的なローミング料金は海外旅行中に急速に膨らむことがありますが、internationalesim.comの国際SIMカードは、通話、テキスト、データ使用に対して競争力のある料金を提供します。この経済性は、旅行者がコミュニケーション費用を効果的に管理するための魅力的な選択肢となっています。

カバレッジとプランの柔軟性
internationalesim.comでは、さまざまな旅行ニーズに対応したプランを提供しています。ヨーロッパ、アジア、アメリカなど、異なる地域での短期間の休暇から長期間の出張まで対応可能な柔軟なオプションがあります。ユーザーはデータ要件、滞在期間、または特定の地域カバレッジに基づいてプランを選択することができます。

ユーザーフレンドリーな機能とサービス
これらのSIMカードはユーザーの利便性を考慮して設計されています。設定手順が簡単に従えるように事前にアクティブ化されていることが多く、マルチ言語カスタマーサポート、バランス追跡のためのモバイルアプリ統合、旅行保険や割引サービスのオプション追加など、追加機能も提供されています。

高度なセキュリティとプライバシー
国際SIMカードの使用は、主要な番号を秘匿することでセキュリティを強化します。これは、個人の連絡先情報を公開せずに専門的なコミュニケーションチャネルを維持したいビジネス旅行者にとって特に有益です。

カスタマーサポートと信頼性
internationalesim.comは優れたカスタマーサポートを誇りとし、ユーザーが必要なときに助けを提供します。異なる地域で一貫したサービスを提供する信頼性は、全体的な顧客体験を向上させます。

詳しくはウェブサイトをご覧ください： https://internationalesim.com/esim-japan/

国際SIMカードは、internationalesim.comから提供される便利で経済的な解決策を提供し、海外旅行中の通信ニーズを簡素化します。シームレスな接続、柔軟なプラン、強化されたプライバシー機能を考慮すると、これらのカードは国境を超えた信頼できる通信オプションと言えるでしょう。

次回のバケーションやビジネス旅行を計画する際には、internationalesim.comの国際SIMカードの利点を考慮に入れてみてください。
pymongo: Docker上のMongoDBのデータを削除 (Delete)

## プログラム

```py:mongo_delete.py
#! /usr/bin/python
#
#	mongo_delete.py
#
#					Jun/26/2024
#
import	sys
import	string
import	pymongo
#
# -------------------------------------------------------------------
def	mongo_delete_proc (db_aa,collection,key_in):
	db_aa[collection].delete_one ({"key": key_in})
#
# -------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
key_in = sys.argv[1]
sys.stderr.write("%s\n" % key_in)
#
collection='saitama'
data_base='city'
client = pymongo.MongoClient('mongodb://localhost:27017/')
db = client[data_base]
#
mongo_delete_proc(db,collection,key_in)
#
sys.stderr.write("*** 終了 ***\n")
#
# -------------------------------------------------------------------
```

## 実行結果

```text
$ ./mongo_delete.py t1167
*** 開始 ***
t1167
*** 終了 ***
```
[解決済み]フラッシュメッセージの設定

[解決しました。](#解決20240629)

```:環境
Laravel 11.6.0
PHP 8.3.7
```

# 謎
教材通りに進めていたところ、フラッシュメッセージが出なくなってしまった。
コントローラー側の設定は以下の通りで、フォロー成功メッセージは表示されるが失敗メッセージが表示されない。
<details>
<summary>フォロー設定</summary>

```:FollowController.php
class FollowController extends Controller
{
    public function createFollow(User $user) {
        if ($user->id == auth()->user()->id) {
            return back()->with("failure", "自分自身をフォローすることはできません。");
        }

        $existCheck = Follow::where([["user_id", "=", auth()->user()->id], ["followeduser", "=", $user->id]])->exists();

        if ($existCheck) {
            return back()->with("failure", "このユーザーはすでにフォローされています。");
        }
        
        $newFollow = new Follow;
        $newFollow->user_id = auth()->user()->id;
        $newFollow->followeduser = $user->id;
        $newFollow->save();

        return back()->with("success", "正常にフォローしました。");
    }

    public function removeFollow() {

    }
}
```
</details>

出なくなったとは言ってもすでに出せるようにはなった。
GPT曰く「フロントエンド側でセッションメッセージの設定ができていない」とのことで提示された設定をコピペして事なきを得た。
```:セッションメッセージの設定
@if (session('failure'))
  <div class="alert alert-danger">
      {{ session('failure') }}
  </div>
@endif

@if (session('success'))
  <div class="alert alert-success">
      {{ session('success') }}
  </div>
@endif
```

しかしこここそが俺には理解できていない所で、教材ではフロントエンド側にそんなコードは無かったのにどうして正常にメッセージが出るのかさっぱりわからないのである…。
（ちなみに教材のLaravelバージョンは10）

それにフォロー成功メッセージは正常に出ていたのでもっとわからない………。

# 日記
まずい、金欠で次回のクレカ引き落としが間に合うかわからないのに2万円くらい課金してしまった…。しかも今後続けるかもわからないし始めたばかりのゲームに…。
この金使いの荒さは直さないといつか痛い目をと思う。

これは昔からで、時々「お金使いたい！！なにか買いたい！！」という衝動にかられることがある。
それが夜に襲ってくると大ピンチ。
夜は財布の紐がないようでポンと買ってしまう。
なので最近はよーーーく考えるようにしているものの、それでも買ってしまう時は買ってしまうし課金してしまう時はしてしまう。

今回は夜だったのと、課金したらしただけ有利に進められるソシャゲの魔力のダブルパンチで歯止めが効かなくなってしまった。

ちなみにminipeg48やPlanckを買ったのも衝動買い。

いつか直るだろうか…。

# 解決(2024/06/29)
セッションメッセージ（フラッシュメッセージ）のキーを間違えていた。

元々レイアウトファイルには`error`というキーで設定してあったが、教材では`failure`というキーでセッションメッセージを呼び出そうとしていたことでうまく出力されなかった。

フォロー成功メッセージだけ正常に出力されていたのも、`success`は合っていたからであった。

これを解決できたのは偶然だった。

教材を進めている間に、なぜかセッションメッセージが２つ出力されるしそれぞれ位置もちがう…。（前回GPTに書いてもらった方は位置が低い）
もしかしてと思いヘッダーやフッターが設定してあるレイアウトファイルを覗いたらセッションメッセージの設定がある！！
しかもキーがちがう！！これや！！！
ということで解決できたのでした。めでたしめでたし。
pymongo: Docker上のMongoDBのデータを更新 (Update)

## プログラム

```py:mongo_update.py
#! /usr/bin/python
#
#	mongo_update.py
#
#					Jun/26/2024
#
import	sys
import	pymongo
import	datetime
#
# -------------------------------------------------------------------
def	mongo_update_proc (db_aa,collection,key_in,population_in):
	date_mod = datetime.datetime.now ()
	db_aa[collection].update_one({"key": key_in},{"$set":{"population": population_in,"date_mod": '%s' % date_mod}})
#
# -------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
key_in = sys.argv[1]
population_in = int(sys.argv[2])
sys.stderr.write("%s\t%d\n" % (key_in, population_in))
#
collection='saitama'
data_base='city'
#
client = pymongo.MongoClient('mongodb://localhost:27017/')
db = client[data_base]
#
mongo_update_proc(db,collection,key_in,population_in)
#
sys.stderr.write("*** 終了 ***\n")
# -------------------------------------------------------------------
```

## 実行結果

```text
$ ./mongo_update.py t1163 459268700
*** 開始 ***
t1163	459268700
*** 終了 ***
```
pymongo: Docker上のMongoDBのデータを読む (Read)

## プログラム

```py:mongo_read.py
#! /usr/bin/python
#
#	mongo_read.py
#
#					Jun/26/2024
import sys
import pymongo
#
# -------------------------------------------------------------------
sys.stderr.write ("*** 開始 ***\n")
#
collection='saitama'
data_base='city'
#
client = pymongo.MongoClient('mongodb://localhost:27017/')
#
db = client[data_base]
collection = db[collection]
#
for data in collection.find():
#	print(data)
	str_out = data["key"] + "\t" + data["name"] + "\t"
	str_out += str(data["population"]) + "\t" + data["date_mod"]
	print(str_out)
#
sys.stderr.write ("*** 終了 ***\n")
# -------------------------------------------------------------------
```

## 実行結果

```text
$ ./mongo_read.py 
*** 開始 ***
t1161	さいたま	52913	2003-8-20
t1162	所沢	17465	2003-2-10
t1163	越谷	91654	2003-7-14
t1164	久喜	53672	2003-9-9
t1165	熊谷	42391	2003-8-4
t1166	秩父	35187	2003-1-21
t1167	川越	81946	2003-7-23
t1168	和光	29714	2003-10-16
t1169	新座	41823	2003-12-25
*** 終了 ***
```
pymongo: Docker上のMongoDBのデータを作成 (Create)

## プログラム

```py:mongo_create.py
#! /usr/bin/python
#
#	mongo_create.py
#
#					Jun/26/2024
#
# -------------------------------------------------------------
import sys
import pymongo
#
# -------------------------------------------------------------
def dict_to_mongo_proc(db_aa,collection,dict_aa):
#
#	db_aa[collection]
	db_aa[collection].drop()
#
	for key in dict_aa.keys():
		unit = dict_aa[key]
		db_aa[collection].insert_one({"key": key,"name": unit['name'],"population": unit['population'],"date_mod": unit['date_mod']})
#
# -------------------------------------------------------------
def dict_append_proc(dict_aa,key,name,population,date_mod):
	dict_aa[key] = {'name':name,'population':population,'date_mod':date_mod}
#
	return dict_aa
#
# -------------------------------------------------------------
def	data_prepare_proc():
	dict_aa = {} 
#
	dict_aa = dict_append_proc(dict_aa,'t1161','さいたま',52913,'2003-8-20')
	dict_aa = dict_append_proc(dict_aa,'t1162','所沢',17465,'2003-2-10')
	dict_aa = dict_append_proc(dict_aa,'t1163','越谷',91654,'2003-7-14')
	dict_aa = dict_append_proc(dict_aa,'t1164','久喜',53672,'2003-9-9')
	dict_aa = dict_append_proc(dict_aa,'t1165','熊谷',42391,'2003-8-4')
	dict_aa = dict_append_proc(dict_aa,'t1166','秩父',35187,'2003-1-21')
	dict_aa = dict_append_proc(dict_aa,'t1167','川越',81946,'2003-7-23')
	dict_aa = dict_append_proc(dict_aa,'t1168','和光',29714,'2003-10-16')
	dict_aa = dict_append_proc(dict_aa,'t1169','新座',41823,'2003-12-25')
#
	return	dict_aa
#
# -------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
dict_aa = data_prepare_proc()
#
try:
	client = pymongo.MongoClient('mongodb://localhost:27017/')
	data_base = 'city'
	collection='saitama'
	db = client[data_base]
#
	dict_to_mongo_proc(db,collection,dict_aa)
except Exception as ee:
	sys.stderr.write("*** error *** in MongoClient ***\n")
	sys.stderr.write(str(ee) + "\n")
#
sys.stderr.write("*** 終了 ***\n")
# -------------------------------------------------------------
```

## 実行結果

```text
$ ./mongo_create.py 
*** 開始 ***
*** 終了 ***
```
新しいAirbnbホストのための専門家のヒント

Airbnbホストとしての旅を始めることは、興奮と戸惑いの両方を伴うことがあります。予備の部屋を貸したり、複数の物件を管理したりする場合でも、基本を理解することが成功への大きな違いを生むことができます。ここでは、このダイナミックな業界で成功するための専門家のアドバイスをご紹介します。

[ManagedBnbs](https://managedbnbs.com.au/)のAirbnb管理で、あなたの物件を高リターンの投資に変えましょう。

快適な空間の作成
成功するAirbnbホストになるための最初のステップの一つは、ゲストにとって居心地の良い環境を作り出すことです。これには清潔さや快適さ以上のことが含まれます。以下に焦点を当てています：

1. インテリアデザインと快適さ
快適な寝具、質の高いリネン、地元の文化を反映した趣味の良い装飾に投資してください。新鮮な花や地元のアートなどの小さなタッチが大きな違いを生むことができます。

2. アメニティと必需品
トイレタリー、タオル、充実したキッチンなど、必要なアメニティを提供してください。Wi-Fiやストリーミングサービス、地元のおすすめ情報を掲載したガイドブックなどのエクストラも考慮して、ゲストの滞在を向上させましょう。

お問い合わせや価格設定
Maximize your rental income and enjoy stress-free property management with the expert services of ManagedBnbs Mornington Peninsula.

1. 清潔さとメンテナンス
高い清潔基準と定期的なメンテナンスを維持してください。問題が発生した場合は迅速に対応し、ゲストが快適に過ごせるようにしてください。

2. ゲストの体験とおもてなし
ゲストにとって忘れられない体験を作り出すことが、ポジティブなレビューと口コミでつながることがあります。以下を検討してください：

パーソナライズドタッチ
ゲストのニーズや好みに合わせたおもてなしを心がけてください。ウェルカムノート、地元のお菓子、またはローカルのおすすめを共有することで、印象を残すことができます。

地元の情報提供
地域のことをよく知っており、隠れた名所やレストラン、アクティビティをおすすめすることで、ゲストの滞在をより良いものにすることができます。

[ManagedBnbs Mornington Peninsula](https://managedbnbs.com.au/property-management-mornington-peninsula/)の専門家によるサービスで、賃貸収入を最大化し、ストレスのない不動産管理をお楽しみください。

Airbnbホストとしての成功は、細部への注意、ゲストの満足度への尽力、そして持続的な学びの過程が必要です。快適な環境の作成、競争力のある価格設定、リスティングの効果的な管理、そして卓越したおもてなしを提供することで、収益を最大化し、Airbnbコミュニティでトップのホストとしての評判を築いてください。
棒グラフからバランスノードを生成し不均衡データを補正する(SPSS Modeler データ加工逆引き10-21)

# 棒グラフからバランスノードを生成し不均衡データを補正する

![スクリーンショット 2024-06-19 14.08.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/3aac7c59-26c6-5e72-7c05-53ce13d770cf.png)

## 1.想定される利用目的

・予測対象が極端に不均衡な場合に起こる無意味なモデルの回避（全て0か1に予測を集中）

＊不正や故障は非常に頻度が少ないため全てのケースを「不正なし」や「故障なし」と予測すると見せかけの精度が向上する。例えば1％しか不正がない場合「不正なし」と全件予測すれば、業務上価値はないが予測精度は99％になる。

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/raw/main/bar_balance.str

## 3.サンプルストリームの説明

![スクリーンショット 2024-06-19 14.09.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/8325f6c3-8e5e-bddf-b78c-d4cbb1f7e81e.png)

a.入力するデータは次の通りです。

![スクリーンショット 2024-06-19 14.15.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/10c45e4a-8c07-cbca-5994-b0cd9c24798e.png)

#### 判定の不均衡を補正しないで予測する

b.[データ型]ノードを編集します。[判定]を予測対象に選択します。
![スクリーンショット 2024-06-19 14.15.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/68860de0-9ea6-5779-5fe0-50375a536237.png)

c.[データ区分]ノードを編集します。初期設定のまま5割を学習、５割を検証にしてランダムシードを固定します。

![スクリーンショット 2024-06-19 14.15.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f01a2d42-12c7-7c08-ecba-c99f348a285a.png)

d.[CHAID]ノードを[実行]します。

e.[CHAID]ナゲットが生成されます。

f.[精度分析]ノードを編集します。全てOKと予測して98%の精度（Accuracy）を確保しましたが、赤枠の検証の通りNG判定をひとつも検知できていません。

![スクリーンショット 2024-06-19 14.16.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/34299435-486f-e307-435a-d861b6fce693.png)

#### [棒グラフ]ノードから不均衡（アンバランス）を補正するバランスノードを生成する

g.[棒グラフ]ノードを実行します。

![スクリーンショット 2024-06-19 14.17.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/57cd6668-9d84-960d-4701-7bf09b85228c.png)

(生成)メニューから[バランスノード（減少）]を選択します。[バランス]ノードが自動生成されます。

![スクリーンショット 2024-06-19 14.17.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1d147648-7aea-6b11-6608-73d89bebdfb3.png)

h.[バランス]ノードを編集します。NGとOKがほぼ等しい数になるようにOKを自動サンプリングします。

![スクリーンショット 2024-06-19 14.18.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/3840a963-dea5-2fc4-6703-57c06991c093.png)

i.[棒グラフ]ノードを実行します。

![スクリーンショット 2024-06-19 14.18.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/0e927a24-dbc1-9e11-f226-7965bc15870a.png)

#### 生成された[バランス]ノードを利用してモデルを作り直す

j.cを複製しています。

k.hを複製しています。

l.dを複製しています。

m.lを[実行]して生成させます。

n.[精度分析]ノードを[実行]します。正誤行列が作られましたので適合率や再現率が計算・表示です。

![スクリーンショット 2024-06-19 14.19.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/fce8e6c9-e76c-8d18-9d87-d3f75c2ffa2d.png)

https://qiita.com/416nishimaki/items/52e5e324fb9ff7489db7

#### 注意事項

NGの個数が少ない場合にはバランスノードを増加させる方法を検討します。

https://qiita.com/416nishimaki/items/0baa6813a2739af15750

## 4.参考情報

#### 棒グラフのノードリファレンス

https://qiita.com/416nishimaki/items/8178b9565b8da1a794f1

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
CCNA受験レポート(2024/6/24)

皆さんこんにちは。Crane&I長谷川です。
先日CCNAを受験してきました！
私は二年前までサーバーをメインとして運用保守・監視業務を行っていましたが、二年ほど前からネットワークの運用保守・監視業務を行っており、自身のスキルアップを目指してCCNAを勉強しております。
さて、ここ数年で料金が上がったり、試験範囲が広がったりとちょこちょこマイナーチェンジが施されているCCNAですが、QiitaやGoogleで試験内容や体験レポートを探してもまちまちでしたので、私の体験記も書いておこうと思います。

# CCNAとは？
そもそもCCNAとは何ぞや？という方のためにCCNAのことを簡単に記載します。
CCNAとは、ルーターやスイッチでおなじみのベンダーである「シスコ・システムズ」が運営している資格試験です。
※ネットワークの内容やシスコ機器の扱い方などを問われます。

# 合格ライン
国家資格やLinucなどのベンダー資格では、Googleなどで探せば合格ライン(ボーダーライン)がわかるものが多いと思います。
但し、CCNAに関しては公式に合格ラインは発表されていません。
※以前は8割が目安と公式発表があったそうですが、体系が変わってからは公式発表されておりません。
→7割程度という噂もありますが、信じるかどうかは皆さん次第です。

# 試験問題の出され方
CCNAですが、一般的には120分で100問から102問出されるという情報でした。

しかし6/24に受験した際は、120分で88問が出されました。
問題の出され方としては以下の通り。
* 択一選択問題 ・・・ 複数の選択肢から1つの正解を選びます。
* 複数選択問題　・・・　複数の選択肢から複数の正解を選びます。
* ドラッグアンドドロップ　・・・　正しい答えを解答欄へドラッグアンドドロップします。
* シミュレーション問題 ・・・　シミュレーター上でシスコ機器を操作し正しい設定やコマンド入力を行います。

上記4種類の問題が出されました。
選択問題に関しては、Ping-tやUdemyの暗記(input)をして、問題を解く(output)をひたすら繰り返せば覚えられると思います。
※実際に私はUdemyの以下の模擬試験を購入して解いていましたが、本試験に近い状況で解くことができました。

以下、URLを記載します。
https://www.udemy.com/share/10bgF23@M28gfin3HIScFMax0Mf_s8eE2lJos0NZ0sWcaBkL9MtpKVHefhT7l0l1mTh43KijZQ==/

ドラッグアンドドロップ問題は全く対策しておりませんでしたが、プロトコルや設定などをしっかり覚えておけば問題なく解ける難易度でした。

シミュレーション問題。これが一番本試験で困りました。
事前に全く対策をしていなかった私が悪いのですが、一問目にしていきなりこの問題が出されたため、つまずきました。
→この問題に関しては、CiscoのPacket tracerで自分自身で構成を考えて設定をするか、Ping-Tにルーターやスイッチそれぞれで演習問題が用意されている為、それを使用して解いていく。といった対策をしておくことをお勧めします！
※ちなみに私は不合格だった為、現在上記の方法を利用して勉強しています。

その他にも空欄埋め問題やシナリオ問題に関しては出題されなかった為、Ping-tのコマ問などを使用して対策しておこうと思います。

それではまた。
Windows10はいつまで使える？サポート終了に向けた適切な対策を詳しく解説！–情報システム部門を刺激するメディア「情シスのじかん」より

「情シスのじかん」は、情報システム部門のプロフェッショナルを対象としたメディアです。実務に役立つノウハウや革新的なアイデアを提供し、学びとネットワーキングの場を提供することを目指しています。最新の技術動向やベストプラクティス、成功事例を通じて、情シス担当者のスキルアップをサポートします。

ここで、Qiitaの読者の皆様向けに、「情シスのじかん」で公開された記事をピックアップ＆サマリ紹介します！Qiitaは技術者向けの情報共有プラットフォームとして、より実践的で具体的な技術情報を提供する場です。情シスのじかんは、特に情報システム部門に特化した内容を中心にしていますが、両者の強みを活かして、プロフェッショナルの皆様に有益な情報をお届けします。

### Windows10はいつまで使える？サポート終了に向けた適切な対策を詳しく解説！
![IMG_6457.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816554/b982d5a1-3cf7-cf71-041f-15c57d06a719.jpeg)

使い慣れたWindows10のサポート終了期限が近づいています。しかし、Windows10は具体的にいつまで使えるのか、サポートが終了した場合にどのように対応すべきなのか把握できていない人も多いのではないでしょうか。本記事では、Windows10のサポート終了に向けた対策を4つ紹介します。また、Windows11へアップグレードするメリットや注意点も解説するため参考にしてください。

https://josys.wingarc.com/windows10-until-when

### 情報システム部門を刺激するメディア「情シスのじかん」とは？
![情シスのじかんbyWingArc1st (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816554/89afaa7e-b941-a10a-c813-8485daca4502.png)

初めまして、『情シスのじかん』です。
近日遂に、日本中の情シス部門のあなたを刺激するメディアが発足します！🚨
さぁ、テクノロジーを飼い慣らし、仕事や生活の質を向上させ、一緒に未来を切り拓きましょう。皆様の生活リズムに合わせた情報発信で、常に寄り添い、共に未来を切り拓くためのメディアです。

ぜひ、情報システム部門の皆様の活動の取材をさせてください。

https://josys.wingarc.com/
LIFF入門＆デバッグ環境構築の詰まったところまとめ

# はじめに
LIFFの開発環境作ってデバッグできるようにするまで対応したら二点詰まり（特にデバッグの方）、それについて発信している方がいなかったので作成しました。


短い内容ですが公開することに意味があると思っているので、同じような問題にあった人の助けになれば。

# スタックしたところ
## LIFF入門記事の動作環境
https://developers.line.biz/ja/docs/liff/trying-liff-app/

この記事通りに進めれば問題ないですが、記事内で指定されている動作環境のバージョンを抑えておくのが大切です。
私は横着して最新のLTSのNode.jsで動かそうとして失敗しました。

- Node.js
    - v16.13.1
- Yarn
    - v1.22.17
- Netlify-CLI
    - 9.16.3

# デバッグ環境構築
https://github.com/line/liff-inspector/blob/main/README_ja.md

"LIFF 実機　デバッグ"と調べてみるとトップに出てくるliff-inspectorですが、doc通りにやってもうまく動かず...
Xで調べると何人か同じように使えないと言っている方がいたのでやはりライブラリ自体が動かなくなってしまっているのではと思います。
（ちゃんと利用できている方がいれば教えていただきたいです！）

なので今回は、vConsoleを導入し、実機デバッグができるようにしました。

```
npm install vconsole
```
して、`src/vanilla`であれば直下のindex.jsを下記の様に変更します。

```javascript
import './index.css';
import liff from '@line/liff';
import VConsole from 'vconsole';

document.addEventListener("DOMContentLoaded", function() {
  // 実質的な追加はこの二行だけ（console.logも何ならいらないけど一応確認用に入れています）
  const vConsole = new VConsole();
  console.log('Hello world');

  liff
    .init({ liffId: process.env.LIFF_ID })
    .then(() => {
        console.log("Success! you can do something with LIFF API here.")
    })
    .catch((error) => {
        console.log(error)
    })
});
```

![Screenshot_20240626_164157_LINE.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303906/7dd751bd-260b-71af-c71b-97ef0de6c1c7.jpeg)

![Screenshot_20240626_164207_LINE.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303906/2a0f2692-0fac-bb61-67e0-983ece672fea.jpeg)

スマホの小さい画面だと見づらいので本当はliff-inspector使いたかったのですが、これでデバッグできるようになりました。
MongoDB: Docker 上の MongoDB に pymongo で接続

## pymongo のインストール

```bash
sudo apt install python3-pymongo
```

## Docker 上の　MongoDB のインストール

```bash
docker run --name my-mongo -d -p 27017:27017 mongo:latest
```

動いていることを確認

```text
$ docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS          PORTS                                           NAMES
df5f71e30ee8   mongo:latest   "docker-entrypoint.s…"   17 minutes ago   Up 16 minutes   0.0.0.0:27017->27017/tcp, :::27017->27017/tcp   my-mongo
```

## Python のプログラム

```py:create_authors.py
#! /usr/bin/python

from pymongo import MongoClient

# MongoDB コンテナに接続
client = MongoClient('mongodb://localhost:27017/')

# データベースの選択
db = client['my_database']

# コレクションの選択
collection = db['my_collection']

# データの挿入
data = {'name': '森鴎外', 'birth': 1862}
collection.insert_one(data)
data = {'name': '夏目漱石', 'birth': 1867}
collection.insert_one(data)
data = {'name': '島崎藤村', 'birth': 1872}
collection.insert_one(data)

# データの取得
results = collection.find()
for unit in results:
	print(unit)
```

実行結果

```text
$ ./create_authors.py 
{'_id': ObjectId('667bc79bed08fc9849ad4941'), 'name': '森鴎外', 'birth': 1862}
{'_id': ObjectId('667bc79bed08fc9849ad4942'), 'name': '夏目漱石', 'birth': 1867}
{'_id': ObjectId('667bc79bed08fc9849ad4943'), 'name': '島崎藤村', 'birth': 1872}
```

## mongosh で確認

```text
$ docker exec -it my-mongo bash
root@df5f71e30ee8:/# mongosh
（省略）
test>
```

```text
test> show dbs
admin         40.00 KiB
config       108.00 KiB
local         40.00 KiB
my_database   40.00 KiB
test> use my_database
switched to db my_database
my_database> show collections
my_collection
my_database> db.my_collection.find()
[
  {
    _id: ObjectId('667bc79bed08fc9849ad4941'),
    name: '森鴎外',
    birth: 1862
  },
  {
    _id: ObjectId('667bc79bed08fc9849ad4942'),
    name: '夏目漱石',
    birth: 1867
  },
  {
    _id: ObjectId('667bc79bed08fc9849ad4943'),
    name: '島崎藤村',
    birth: 1872
  }
]
my_database>
```

## コンテナーの起動

コンテナーの名前をしらべる

```bash
docker container ls -a
```

コンテナの起動

```bash
docker start my-mongo
```

起動していることを確認

```bash
docker ps
```
ITパスポート ネットワークセキュリティ

・ファイアウォール
インターネットと内部ネットワークの境界に配置し、外部からの不正なアクセスを遮断する仕組み
・UTM
ファイアウォールの機能に加え、ウイルス対策や侵入検知などを連携させ、複数のセキュリティ機能を１台の筐体に統合して管理する装置

・パケットフィルタリング
ファイアウォールを通過するパケットのヘッダ情報（送信元のIPアドレスやポート番号、送信先のIPアドレスやポート番号など）を解析し、許可されたパケットだけを通過させる機能

・コンテンツフィルタリング
Webページの内容（コンテンツ）で判断し、有害サイトや子供にとって不適切なサイトなどをブロックする機能

・WAF（ワフ）
Webアプリケーションに起因する脆弱性への攻撃を遮断するファイアウォール

・VPN
インターネットなどの公衆回線をあたかも専用回線のように利用する技術
インターネットVPN（インターネットを使用する）
IP-VPN、広域イーサネット（通信事業者と契約した者だけが使える閉域網を使用する）

・DMZ
インターネットと内部ネットワークの両方から隔離されたネットワーク領域
公開したサーバに不正なアクセスがあったとしても、内部ネットワークまで被害を及ぼさないようにする仕組み

・ペネトレーションテスト
システムを実際に攻撃して、セキュリティの弱点を発見するためのテスト