OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonにおけるダックタイピングの理解と実用例

### はじめに
Pythonは動的型付け言語であり、その柔軟な型システムを活かしたプログラミングスタイルが可能です。特に「ダックタイピング」はPythonの強力な特徴の一つで、この記事ではダックタイピングの概念と実際のコード例を通じてその理解を深めていきます。

### ダックタイピングとは？
ダックタイピングは、「もしもそれがアヒルのように見え、アヒルのように泳ぎ、アヒルのように鳴くなら、それはおそらくアヒルだろう」ということわざに由来します。Pythonにおけるダックタイピングは、オブジェクトの型そのものよりも、その振る舞いや持つメソッドに注目するプログラミングスタイルを指します。

### ダックタイピングの利点
ダックタイピングを利用することで、異なるクラスのオブジェクトでも共通のインターフェース（メソッドなど）を持つ場合に、同じように扱うことができます。これにより、コードの柔軟性が高まり、異なる型のオブジェクト間での再利用が容易になります。

### 実用例１：異なるクラスのオブジェクトを同一視する

```python
class Duck:
    def sound(self):
        print("Quack!")  # アヒルの鳴き声を出力

class Person:
    def sound(self):
        print("I'm quacking like a duck!")  # 人間がアヒルのように鳴く

def make_it_sound(obj):
    obj.sound()  # 引数として渡されたオブジェクトのsoundメソッドを呼び出す

# Duckクラスを使用
duck = Duck()
make_it_sound(duck)  # 出力: Quack!

# Personクラスを使用
person = Person()
make_it_sound(person)  # 出力: I'm quacking like a duck!
```
この例では、`Duck`と`Person`の二つのクラスがありますが、どちらも`sound`メソッドを実装しているため、`make_it_sound`関数で同じように扱うことができます。

### 実用例２：異なる形状の面積を計算する

```python
class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height  # 長方形の面積を計算

class Circle:
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return 3.14 * self.radius ** 2  # 円の面積を計算

class Triangle:
    def __init__(self, base, height):
        self.base = base
        self.height = height

    def area(self):
        return 0.5 * self.base * self.height  # 三角形の面積を計算

def print_areas(shapes):
    for shape in shapes:
        print(f"形状 {shape.name} の面積: {shape.area()}")

shapes = [Rectangle(3, 4), Circle(5), Triangle(6, 7)]
print_areas(shapes)
```
この例では、形状に関わらず`area`メソッドを持つオブジェクトを扱っています。このようにダックタイピングを用いることで、異なるクラスのオブジェクトでも共通の操作を一括で行うことが可能になります。

### まとめ
ダックタイピングは、Pythonの動的な特性を生かした非常に強力なツールです。しかし、実行時エラーのリスクも伴うため、使用する際には適切なテストとドキュメントが必要です。開発効率とエラーのリスクのトレードオフ関係、どう考えたらいいんだろうか。

### 参考記事
https://www.kdnuggets.com/duck-duck-code-an-introduction-to-pythons-duck-typing
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（51/100）

【51日目】
トピック 6：SAPS/4HANAの需要管理（2/5）

≪問題51≫
最終製品に対して受注生産計画シナリオを設定しようとしています。部品表/配合表には2つの構成品目が含まれています。1つは受注ごとに個別に調達する必要があり、もう1つはすべての独立所要量に対してまとめて調達する必要があります。最終製品の需要予測は実行できません。これを実現する設定として、正しいものはどれですか。
□計画方針50（最終組立なしの計画）および対応する二重MRP区分を選択する。
□計画方針20（受注生産）および対応する二重MRP区分を選択する。
□計画方針20（受注生産）および対応する個別/包括区分を選択する。
□計画方針50（最終組立なしの計画）および対応する個別/包括区分を選択する。

≪解答≫
□計画方針50（最終組立なしの計画）および対応する二重MRP区分を選択する。
□計画方針20（受注生産）および対応する二重MRP区分を選択する。
■計画方針20（受注生産）および対応する個別/包括区分を選択する。
□計画方針50（最終組立なしの計画）および対応する個別/包括区分を選択する。

≪解説≫
◆受注生産において、構成品目の品目マスタ内の個別/包括所要量区分によって、特定の得意先所要量に対して構成品目が個別セグメント内で調達されるかどうかが決まります。
1. 個別/包括所要量区分=1（個別所要量）この区分は、品目が受注に対して特別に製造または調達されることを意味します。所要量ごとに特別に個別セグメントが登録されます。個別所要量は、上位レベルの品目によって包括所要量が生成されない場合にのみ登録されます。
2. 個別/包括所要量区分=2（包括所要量）この区分は、品目がさまざまな所要量に対して生産または調達されることを意味します。所要量は、正味所要量セグメントに含まれています。
3. 個別/包括所要量区分=空白区分を空のままにすると、構成品目は上位レベルの組立品目と同じ方法で計画されます。受注生産方式で最終製品の場合は、個別所要量を意味する1に置き換えられます。

◆計画方針20は、純粋な受注生産（組立品目または構成品目の計画なし）ですが、計画方針50は、最終製品の受注の受入前に、特定の組立品目を生産または調達する方式です。受注に依存しない計画は、計画独立所要量を使用して行われ、これらの計画独立所要量は、需要予測に基づいて最終製品に対して登録されます。
【Eclipse/Git】EGitでのadd、commit、pushを覚える

EclipseでJavaプロジェクトを作成する際、EGitを使ってGitを管理したり、add、commit、pushする操作を覚えるための自分用メモです。

# 使用環境
PC：MacBook Air 2018
OS：macOS Sonoma 14.3.1
IDE：Eclipse 2023

# Gitとは？
Gitは、ディレクトリやファイルの変更履歴を保存できる、分散型バージョン管理システムです。
Javaプロジェクトを作成する際、Eclipse(Pleiades)にはEGitプラグインが含まれているので、EclipseからGitの操作ができます。

## GitとSSHキーを準備する
MacBookでGitとGitHubとの連携に必要なSSHキーを準備する方法は、以下の記事を参考にしました（PATHは/usr/bin/git、/usr/bin/ssh-keygen）。
https://prog-8.com/docs/git-env

## GitHubのアカウントを作成する
GitHubのアカウントを持っていない場合は、アカウントを作成します。
アカウントを作成したら、先ほどの記事を参考にSSHキー（公開鍵）をコピーしてGitHubの設定からアカウントに追加します。

# GitHubでリモートリポジトリを作成する
GitHubの「Repositories」のNewからリモートリポジトリを作成します。
「Add a README file」にチェックを入れれば、同時にREADMEファイルを作成できます（自分はチェックを入れませんでした）。

# Eclipseでプロジェクトとローカルリポジトリを作成する
Eclipseで、リモートリポジトリにcommitをpushするプロジェクトを作成します。
作成したプロジェクトを右クリックして、「チーム」→「プロジェクトの共用」からcommitするローカルリポジトリを作成します。
（ローカルリポジトリを作成する際は、「デフォルト・ブランチ名」をmasterからmainに変更しました。）

作成が完了すると、プロジェクトフォルダがworkspaceからローカルリポジトリのルートに移動します。
（Macの場合、```Command```+```Shift```+```.```で隠しファイルを見ると、ルートに.gitフォルダが確認できます。）
また、移動した後にプロジェクトを右クリックして、「リファクタリング」→「名前の変更」からプロジェクト名を変更してもプロジェクトのフォルダ名には反映されませんでした。

***追記***
上記の方法だとローカルリポジトリのルートディレクトリとプロジェクトのディレクトリが分かれてしまうので、ローカルリポジトリのルートにプロジェクトのファイルを配置する方法を以下の記事にまとめました。

https://qiita.com/miya71/items/9483e7c780aa2ec01ec9

# .gitignoreファイルやREADMEファイルを準備する
プロジェクトフォルダ内に.gitignoreファイルが自動で作成されますが、追跡したくないファイル名を記述してもローカルリポジトリのルートの.DS_Storeが追跡されるため、.gitignoreファイルはローカルリポジトリのルートに移動させました。

ちなみに、.gitignoreファイルにはMacの.DS_Storeの他、隠しファイルの.classpathと.project、.settingsフォルダ、binフォルダを追加しました。
```.gitignore
# Mac
.DS_Store

# Eclipse
.classpath
.project
.settings
bin
```
また、README.mdも合わせて、ローカルリポジトリのルートに追加しました。

# Eclipseでadd、commit、pushをする
Eclipseでパースペクティブを「Git」にして、「Gitステージング」でcommitするファイルを「ステージされていない変更」から「ステージされた変更」に追加（add）して、コミット・メッセージを入力したら「コミット」からcommitできます。

プロジェクト名を右クリックして、「チーム」→「ブランチのプッシュ」からリモートリポジトリを指定してブランチにpushできます。
ハッキングされたときに素人でもできる対処法


# ハッキングされたときの、とりあえずの対処法
#### まずGoogleアカウントが取られるときの話です。
私が出会ったのは電波系のハッカーのようで、サイドチャンネル攻撃やテンペストが主な技のようでした。普通になりすましサイトとかも入れてパスワード盗んだりもしてきます。
Googleアカウントは２段階認証など色々とセキュリティが強いです。ただ、Google以外の部分が弱いと意味がないです。例えば二段階認証に電話のSMSを使っている場合は偽の基地局を立てられて認証用のメッセージが盗まれます。基本的には複数人のおじさんと若者らがリアルにつきまとってきます。そのうち気づくので時々笑えるくらいわかりやすいです。なんでかしらんけどタイにもいましたｗ。ついて来たときはiPhoneがやられて位置情報が把握されていたようです。
ここにある対策はWebの専門知識がなくても、個人でできる対策ばかりです。普段から注意していると良いかもしれません。

# 最低限の対策
まずは基本的なネットワーク機能が使えるように、Googleアカウントと端末の確保が必要になります。とりあえず使えるようにするためのベストな組み合わせは

### ・Chromebook(最新のがベスト、必ずBluetooth とWiFiは使わずにUSB有線LANアダプタを使うのがベスト)
### ・Google Titan Security Key（**物理キー**）で二段階認証をする（必須）。予備キーもあると安全。
### ・Google Pixcel 7以降（セキュリティIC搭載を歌った商品が必要。)
(最近はセキュリティソフトだけでは防ぎにくいです。セキュリティが強くても、WiFiとBluetoothは使わないように。ちなみにiPhone（ios16）はやられました）

### ・画面のキータッチのアニメーション表示をOFFにする。
PINなどいれるときに画面のアニメーション表示があると何が起きているかが見れれてしまいます。生体認証などで防ぐのもよいのですが、生体認証自体を無効化して侵入しようとするので注意しましょう。生体認証の様子がおかしいときはオフラインにしてから設定を見直してみましょう。オンラインで再起動してからPINを入れないようにすると効果的です。

最低限、物理キーがあればメールやチャット、その他の連絡や他社サービを使うことができます。パスワードなど入れるときにパスワードが見える状態で入力や確認をしないでください。常に見られていると思ったほうが無難です。

# テンペスト対策
市販のair spyなど使うと近くのモニターが簡単に見えます（なんで市販してるんだろ？）
対策は色々ありますが、この攻撃は家にいるときなど特定の場所にいるときにやられます。対策はChromebookの解像度をよくわからんような値にしておくことや、ノイズを発生させる（電気の小さなスパークや回転している小さなDCモーター等をモニターに近づけるなど）。

# DNSリーク対策
ブラウザのセキュリティレベルを上げて、DNS設定はGoogle public DNSを使いましょう。


# VPNを使う

VPNにはGoogleアカウントでログインするタイプの物が良いです。Chromebookのブラウザ拡張機能のNord VPNを使います。Androidアプリも入りますが、Androidアプリが有効だと別の侵入方法を与えてしまうかもしれません。

# トラベルSIMを使う
特定の電話番号のSIMを使っていると、端末を変えても入ってこれるようです。（通信会社はここの対策してるんでしょうか…？）そこでトラベルSIMしか使わない端末を用意して、SIMからの侵入を防ぎます。電話番号が特定できないと入ることは難しいようです。使っていた電話番号のSIMは通話専用にして、データ通信はOFFにしておきましょう。開けた場所で、LTE回線が突然３Gばかりになったりするときは注意しましょう。また、ネットワーク設定で2Gを不許可にしておきましょう。

https://togetter.com/li/2537666?fbclid=IwY2xjawJqpFlleHRuA2FlbQIxMQABHm70ktEHJUUblK2GWFsQjeYL8ipJG_Gx_PVjBP6HIPrcj-oNxSxf6VSOVTLI_aem_6X2URWFFATLhTNSuaW34ow

# Windowsを使う
やはりWindowsが使いたい場合はクラウドのWindows365を使いましょう。マイクロソフトアカウントが非常に取られやすいので、Googleアカウントで保護するか、別でセキュリティ用の物理キー(Windows端末でしか使えないようなのでどうにかしてほしい)を使いましょう。googleのセキュリティキーとは別のマイクロソフトアカウント対応の物を用意してください。マイクロソフトアカウントを取られると端末の居場所がわかるので注意してください。またiCloudも取られると同じようなことになります。

# SNSを使う
FACEBOOKなど使う場合アカウントが取られているとIPがバレます。物理キーなどを設定できるので、物理キーで保護しましょう。その他物理キー対応のSNSを使ったほうが無難です。

# その他の対策
ローカルのWindowsのセキュリテイは非常に弱いので、使うなら特にやられても良いアカウントで使いましょう。ウィルスバスターやノートンを入れると良いと思います。また、指紋認証などを使って都度パスワードを入れるのはやめましょう。マイクロソフトアカウントに入らないでセットアップする方法もあるので、マイクロソフトアカウントがやられている危険性があるときはそういった対策をすると良いと思います。

基本的な攻撃としてはDifenderなどを無効にしてAdminのパスワードを盗もうとしてきますので、ユーザーアカウントを作って、そちらで普段は使うほうが良いです。ユーザーアカウントでもインストールのときなどにA生体認証を無効化してdminのパスワードを盗み見ようとするので注意してください。
【Salesforce】【資格】Salesforce 認定 Data Cloud コンサルタント 合格までのあれこれ

当記事は受験体験記です。
※2024年7月（Summer ’24）時点の情報です。
※あくまでもぴえさん個人の考えです。

# Salesforce 認定 Data Cloud コンサルタント とは　（ざっくり）
・データ戦略およびデータモデリングに機能の活用に関する資格
・受験資格：なし
・Data Cloudの機能について出題
・受験料：税込22,000円
・105分60問（合格基準は62％以上）
・選択式
・試験終了後、即座に合否がわかる

# ぴえさんの受験記録
【受験日程とバージョン】
日時：2024/7/7
受験方法：オンサイト受験
バージョン：Summer ’24

【受験データ】
ウェブアセッサーのスクショ↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/29e3d2ce-1220-753c-65fa-337dbe1ad023.png)

分かりにくいので表にしました↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/0a7da13a-1ddd-e1f6-9668-ecbd54b4192c.png)

【感想】
・DataCloudがアツいということで受けなきゃと思っていたところ
　土日の予定がなくなったので急遽受けてきました。
・Trailheadは事前にやっていましたが
　26時間前に申し込みしてそこから勉強始めてもわりと余裕ありました。
・前回の受験からだいぶ間が空いた気がします、
　オンサイト会場は部屋も変わって綺麗になっていました。
・過去問そのまま出たものが多かったので高得点になったかと思います。

# 勉強方法

１．受験ガイドを読む
　　　[資格一覧ページ](https://tandc.salesforce.com/credentials)から確認できます。模擬問題で試験の雰囲気をつかみます。
２．Trailheadで学習する
機能概要と用語を簡単に押さえる程度でOK

https://trailhead.salesforce.com/ja/users/strailhead/trailmixes/unlock-your-data-with-data-cloud
  
  
３．個人が出している練習問題や過去問を解く
JPN試験の41問、freecramの41問、FREE-BRAINDUMPSの56問（p15まで無料）を繰り返しました。被りも多いのでそこまで多くないかと思います。
後ろ２つはブラウザの翻訳ONにして日本語で進めます。実際の出題と翻訳が違う用語も多いのと誤答には気を付けて、完答できるように仕上げればOKです。

https://www.jpnshiken.com/exam/Salesforce-Data-Cloud-JPN-salesforce-data-cloud-accredited-professional-salesforce-data-cloud%E6%97%A5%E6%9C%AC%E8%AA%9E%E7%89%88-15916.html#google_vignette

https://www.freecram.net/exam/Data-Cloud-Consultant-salesforce-certified-data-cloud-consultant-e15621.html

https://free-braindumps.com/salesforce/free-data-cloud-consultant-braindumps.html?p=2

４．２～３で分からない単語や疑問点を、ヘルプを読んで確実に解消する

https://help.salesforce.com/s/articleView?id=sf.c360_a_data_cloud.htm&type=5


以上です(\*'ω'*)

**Salesforceの他資格についてはこちらの記事にまとめています↓**

https://qiita.com/piepie1231/items/78a0dd6bdfa2c64568cd
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（50/100）

【50日目】
トピック 6：SAPS/4HANAの需要管理（1/5）

≪問題50≫
あなたの会社は予測に基づいて最終製品を生産しており、得意先からの注文時に最終製品の在庫があることを想定しています。得意先が予測数量よりも多くの数量を注文した場合でも、その状況が生産プログラムに影響を与えることがあってはなりません。以下のどの計画方針を採用しますか。
□見込生産（10）
□最終組立なしの計画（50）
□受注生産（20）
□最終組立ありの計画（40）

≪解答≫
□見込生産（10）
□最終組立なしの計画（50）
□受注生産（20）
■最終組立ありの計画（40）

≪解説≫
◆受注に関係なく在庫を生産し、後でその在庫から得意先に商品を供給する場合は、見込生産を使用いたします。将来の需要が見込まれる場合、受注がなくても商品を生産することが可能です。
◆見込生産の中の「最終組立ありの計画（計画方針40）」を使用することで、得意先需要に柔軟かつ迅速に対応することに重点を置きながら、円滑な生産プロセスを目指すことができます。計画方針40の特徴は以下のとおりです。
1. 受注を処理する前に、計画独立所要量によって、すべての構成品目および組立品目の調達と生産をトリガーする必要があります。
2. 計画独立所要量は、需要管理で最終製品に対して設定し、受注伝票によってこれらの計画独立所要量が消費されます。
3. 消費されなかった計画独立所要量は、定期的な間隔でゼロに設定することが可能です。
4. 得意先所要量が計画独立所要量を上回る場合、次回のMRP実行で、その受注（つまり、所要量に影響する受注）に対する計画手配が計画外数量を考慮して自動的に登録されます。
【Figma Plugins】ノードを検索する

## はじめに
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/063183f2-18b4-3666-101d-18a2ed4183ea.png)
FigmaのPluginを開発する際、Figmaのノードを検索したいと思ったことはありますか？

この記事では、ノードを検索する方法を解説します。

## すべてのノード検索する
```ts
findAll(callback?: (node: SceneNode) => boolean): SceneNode[]
```

サブツリーすべてを検索したい場合は、`findAll（）`関数を使うことで、検索することができます。
コールバック関数を記述することで、 コールバック関数が`true`を返した、ノードすべてを返します。

`manifest.json` に `"documentAccess"："dynamic-page"` が含まれ、nodeにPageNodeである場合、`findAll()`を使うなら、最初にloadAsyncを呼び出す必要があります

```ts
// nodeの名前が "Frame" であるノードを検索する
const Frame = figma.currentPage.findAll(node => node.name === "Frame")
```

:::note warn
Figmaファイルが多くなると、検索に時間がかかるので、注意が必要です!
できるだけ、時間をかけないように、別の関数や検索範囲を絞る必要があります。
:::

## 条件付きですべてのノードを検索する
```ts
findAllWithCriteria<T extends NodeType[]>(
  criteria: FindAllCriteria<T>
): Array<{ type: T[number] } & SceneNode>
```

このサブツリー全体（このノードの子、その子の子など）を検索します。
指定されたすべての条件を満たすすべてのノードを返します。

`manifest.json` に `"documentAccess"："dynamic-page"` が含まれ、nodeにPageNodeである場合、`findAll()`を使うなら、最初にloadAsyncを呼び出す必要があります。

検索の条件でサポートされているのは、以下の通りです。

+ 特定の型を持つノード
+ SharedPluginDataを名前空間とキーで持つノード
+ キーによってPluginDataを持つノード

```ts
//component・component　set ノードを検索する
const node = figma.currentPage.findAllWithCriteria({
  types: ['COMPONENT', 'COMPONENT_SET']
})

// key が　a　b の　plugin data を持っているノードを検索する
const node = figma.currentPage.findAllWithCriteria({
  pluginData: {
    keys: ["a", "b"]
  }
})

// namespace が hoge で key が　a　b のSharedPluginDataを持っているノードを検索する
const node = figma.currentPage.findAllWithCriteria({
  sharedPluginData: {
    namespace: "hoge",
    keys: ["a", "b"]
  }
})
```

## 子要素の最初のノードを検索する
```ts
findChild(callback: (node: SceneNode) => boolean): SceneNode | null
```

このノードの直接の子（子の子は含まれない）を検索し、子要素の最初の要素を返します。

```ts
// currentPageの子要素でnodeの名前が "Frame" である最初のノードを検索する
const child = figma.currentPage.findChild((node => node.name === "Frame")
```

## 子要素を検索する
```ts
findChildren(callback: (node: SceneNode) => boolean): SceneNode | null
```

このノードの直接の子（子の子は含まれない）を検索し、子要素の最初の要素を返します。

```ts
// currentPageの子要素でnodeの名前が "Frame" であるノードを検索する
const child = figma.currentPage.findChildren((node => node.name === "Frame")
```

## このサブツリー全体の最初のノードを検索する

```ts
findOne(callback: (node: SceneNode) => boolean): SceneNode | null
```

このサブツリー全体を検索し、子要素の最初の要素を返します。

```ts
// currentPageの子孫で要素でnodeの名前が "Frame" である最初のノードを検索する
const child = figma.currentPage.findOne((node => node.name === "Frame")
```

## まとめ
この記事では、Figma Pluginsでノードを検索する方法を解説しました、

ぜひこの記事を参考に、Figmaでノードを検索してみてください！

---

最後まで読んでくださってありがとうございます！

普段はデザインやフロントエンドを中心にQiitaで記事を投稿しているので、ぜひQiitaのフォローとX(Twitter)のフォローをお願いします。

https://twitter.com/degudegu2510
Slackの重要ショートカット ( Mac版 )

本当に、これが手に慣れると使いやすくなるはず

# 重要

- ワークスペースを切り替える (  `Command + 数字キー`  )
- チャンネルなどを進む・戻る ( `Command + 左右キー` )
- 未読チャンネルに移動する ( `Option + Shift + 上下キー` )
- チャンネルを上下に移動する ( `Option + 上下キー` )

# ちょっと役立つ

- スレッドの右側のサイドバーを開閉する ( Command + . )
- サイドバーの「スレッド」 を開く Command + Shift + T


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
SESから未経験Webエンジニアに転職後の1年を振り返って

### 自己紹介
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3078679/8ab6b1ba-f21a-22c7-f33b-1aba2405fc87.png)

「KoeTomo」という音声SNSアプリを開発・運営している、Meetscomの中川です。

前職では都内のSES企業でPMOや開発の業務を経験し、その後現職の企業でサーバーサイドのシステムエンジニアとして採用いただき、未経験からプログラマとしてお仕事をさせていただいています。


### SESでの経験について思うこと
自分はプログラミングスクールを修了して求人に応募する段階で、SESについて**否定的な意見**を多く見つけました。

当時の自分は、「入社前にしっかり何をやらせてもらえそうなのか情報収集をすれば大丈夫だろう」というような気持ちで、転職活動を行いましたが、結果やらせてもらえた業務は、SIerさんでの**Officeソフトを使ったプロジェクト管理業務**と、**レガシーなシステムの流用新規開発**の業務でした。

正直、常駐先を教えていただいて業務に就いて、何をやるのか知った時少なからず**後悔**しました。

#### 当時後悔したこと
以下のような点で後悔しました。
- 業務がアルバイトでもできるような内容で**スキルが身に付かず焦りを覚える**。もっとよく考えて転職すればよかった
- 案件の**スパンも長そう**な企業だったので、このまま惰性で働き続けることになるのか、抜け出せるのかという気持ち
- 周りの協力会社の要員に**厳しい人**が多く、人間関係にも神経を使う

#### 今振り返ってみて
働いている時は分かりませんでしたが、現在別の企業で働かせていただいてからは、正直にいうとSESでの仕事は**良い経験になった**と感じています。上記の後悔したことが以下のように変わりました。
- Officeツールを使った作業は、Webエンジニアになった時も**十分に使用するスキル**だったこと。また、上流工程を経験できたことによりある程度**開発業務への視座を高める**ことができたこと
- 1年という長い期間似たような業務にあたったことによって、自分がどのくらいの期間でどのくらいのことを覚えられるのか、どの程度時間をかければ作業を終えられるかという感覚を身につけることができた
- 厳しい人に見えたが、今思えばその人の仕事への向き合い方だと理解できた。やれば誰でもできる内容を、**簡単には真似できないクオリティでこなす**ことは稀有なスキルで、そこで学べたことは幸運だった

要は**ビジネススキルを身につけることができた**と解釈しています。

### 未経験からWebエンジニアになってみて
Meetscomにサーバーサイドエンジニアとして入社してからの業務は、Railsでのサーバーサイドの実装、テスト作業や、AWSのリソースの運用。また最近では受託の作業でWebアプリケーションの監視実装や自分で立ち上げたプロジェクトで、生成AIを利用した機能の実装などを行なっています。

SESで働いていた当時に**やりたかったことがそのままやれている**ように思いますし、何より身につけたスキルが今後もさらに自分を高いところまで連れて行ってくれる、そういった気持ちで働けており、充実しています。

そんな中で、SESで働いた経験は決して無駄にはなっていないと考えています。

なぜなら、
- 楽ではない環境で身につけたことは**印象強く自分の中に刻み込まれ**ていて、問題が発生しそうなところで不思議と思い出され、役に立ってくれる
- 当たり前のことを当たり前にこなすというだけで、評価を得ることができる
- 自分のやりたいことをやらせてもらえていることの、**ありがたさ**がわかる。それは十分に金銭や待遇より重要なことだと思えている

これは自分の場合では正しくSESを経験したからこそ今持てている考えだと思います。


### まとめ
プログラマになりたい、在宅勤務と併せて仕事をしていきたい、現在の業務で成長が頭打ちになっていて焦っている。
こういった感情を持ってSESで働いている人の気持ち、痛いほど分かります。
でも、目の前のことからネガティブな理由で逃げても、正直いつかまた自分のメンタルが脚を引っ張ると思います。

現在の自分のいる場所が、**過去の選択の結果**だということを受け止めて、今の行動を変えて過去の自分の選択を正当化するということは可能だと思います。

あまり取り止めのない文章になってしまいましたが、自分の経験談がどなたかの参考になればいいなと思っています。

今後はWebエンジニア転職や未経験1年目で苦労したことなどを記事にしていきたいと考えています！

### 最後に
Meetscom株式会社では、やる気やモチベーション、世の中に影響を与えられるようなサービスを一緒に作りたい、そういった気持ちを持った仲間を探しています。
エンジニアでも複数ポジション募集しておりますし、未経験でも開発経験があればエントリー可能ですので是非お見知り置きください。
開発時におけるお香が開発生産性を上げている気しかしない

# 開発時におけるお香が開発生産性を上げている気しかしない

## はじめに

みなさん、エンジニアとしての生産性向上に悩んでいませんか？効率的に仕事を進めるためのツールや方法は数多く存在しますが、最近私はお香を使って生産性を上げる方法を見つけました。本記事では、お香がどのように開発中の集中力と生産性に影響を与えるかについて紹介します。

:::note warn
あくまで自分の主観が強いです。科学的根拠のない話なので気を付けてください
:::


## お香を使い始めたきっかけ

最近、友達がお香にハマっているという話を聞いて、一緒にお香を買いに行ったことがきっかけで、自分もお香を試してみることにしました。最初はリラックスするために焚いていたのですが、だんだんと開発中にも焚くようになりました。

## お香が開発生産性を上げていると感じる理由

### リラックス効果と集中力の向上

お香を焚くとリラックスできる香りが広がり、心が落ち着きます。このリラックス効果が集中力を高め、開発に没頭できるようになります。実際、リラックスできる香りは生産性を向上させることがあるという研究結果もある、らしい？

:::note info
実際焚いてみると気分が上がります。不思議。
:::


### 私の具体例

アマゾンプライムを見ながらお香を焚いていたところ、その香りにすっかりハマってしまいました。そこから、開発中にもお香を焚くようになり、結果的に集中力が高まり、生産性が上がったと感じています。

### これが最近買ったお香

私が最近買ったお香の一部を紹介します。これは特にリラックス効果が高く、おすすめです。

![IMG_6868.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946561/03e2c459-ae92-e64d-b4d4-4c25e946c029.jpeg)


> 無印のやつ。香りがめっちゃいい。
## 注意
:::note warn


- **香りの好み**: 人によっては香りが苦手な場合があるかも。（線香の香りが苦手だと合わないかも..?）
:::

## まとめ

お香を焚きながらの開発は、リラックス効果によって集中力を高め、生産性を向上させる一つの手段です。ぜひ一度試してみて、あなた自身の生産性向上に役立ててください。

## 関連リンク

- [無印良品お香ページ](https://www.muji.com/jp/ja/store/search/cmdty/%E3%81%8A%E9%A6%99)
【データベース設計】概念設計、論理設計、物理設計の違い。

# 一言で説明すると？
## 概念設計
システムが扱うべきデータの種類と、それらのデータがどのように関連しているかを明確にする。
## 論理設計
データの整合性を保つための制約やルールを定義する。
## 物理設計
実際のDBMSが理解できる形にする。

# 概念設計、論理設計、物理設計の違い。

| 設計ステップ   | 目的                                                                                         | 内容                                                                                                    | 出力                                           |
|----------------|----------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------|------------------------------------------------|
| **概念設計**   | データベースの基本的な構造を定義します。どのようなデータを保持するべきか、そのデータの種類や関係性を考えること。 | エンティティ（テーブル）を定義し、それぞれのエンティティが持つ属性（フィールド）を決定。エンティティ間の関係性（リレーションシップ）を定義。 | ER図（エンティティ-リレーションシップ図）、概念データモデル |
| **論理設計**   | 概念設計で定義されたデータベースの構造をより詳細に設計。データの整合性を保つための制約やその他のルールを設定。 | 正規化の一環として、データの冗長性を減らすためにテーブル間の依存関係を調整。ER図の作成でデータベースの構造を視覚的に表現。 | 論理データモデル、テーブルスキーマ、キー定義、正規化されたスキーマ |
| **物理設計**   | 論理設計で定義されたデータベースの構造を実際のDBMSが理解できる形式に変換。パフォーマンスと効率を最適化するための設定。 | テーブル定義を行い、DBMS上にテーブルを構築。インデックスの設計を行い、特定のクエリを高速化。 | 物理データモデル、インデックス設計、ストレージ仕様 |

# 主な違いのまとめ

| 観点         | 概念設計                  | 論理設計                         | 物理設計                     |
|--------------|---------------------------|----------------------------------|------------------------------|
| **抽象度**   | 高                        | 中                               | 低                           |
| **目的**     | 基本的なデータ構造と関係性の定義 | データ構造の詳細化とデータ整合性の確保 | 実際のDBMSへの実装とパフォーマンス最適化 |
| **内容**     | エンティティ、属性、リレーションシップの定義 | テーブル設計、キー定義、正規化          | テーブル構築、インデックス設計、ストレージ仕様 |
| **出力**     | ER図、概念データモデル     | 論理データモデル、テーブルスキーマ、キー定義 | 物理データモデル、インデックス設計、ストレージ仕様 |

これらの設計ステップを順に進めることで、効率的で信頼性の高いデータベースを設計・実装できる。
【PowerShell 5.1】バッチから実行する方法（実行ポリシー変更不要）

# はじめに
## 前提
下記環境での動作を前提としている。
PowerShell 5.1
## 本記事について
実行ポリシーを変更せずに、PowerShellスクリプトをバッチから実行する方法を示す。
# 実行する方法
結論から申し上げると、下記方法で、実行ポリシーを変更せずに、バッチからPowerShellスクリプトを実行できる。
1. PowerShellスクリプト（.ps1）をワンラインにする。
1. PowerShellの起動引数にワンラインにしたPowerShellスクリプトを指定する。
1. 保存したバッチを実行する。
``` bat:PowerShell実行.bat
PowerShell -c  "$msg = 'これはテストです。';Write-Host $msg; Get-ChildItem | %% {  Write-Host $_.FullName };"
```
## PowerShellの引数する方法
「変換前.ps1」のスクリプトなら、「変換後.bat」に書き換える。
``` PowerShell:変換前.ps1
$msg = "これはテストです。"
Write-Host $msg
Get-ChildItem | % {  Write-Host $_.FullName }
```
``` bat:変換後.bat
PowerShell -c  "$msg = 'これはテストです。';Write-Host $msg; Get-ChildItem | %% {  Write-Host $_.FullName };"
```
### 注意事項
#### 「"」を含む場合
「"」（ダブルクォーテーション）は、「'」（シングルクォーテーション）にする。
#### 「%」を含む場合
「%」は、2つにする。
バッチにした際、「%」が1つの場合は「%」が消えてしまう。
（「%」が消える理由は、調査中である。）
# おわりに
下記方法でバッチからPowerShellスクリプトを実行する方法を紹介した。
1. PowerShellスクリプトをワンラインにする。
1. PowerShellの「-c」オプションに、ワンラインにしたPowerShellスクリプトを指定する。
1. 保存したバッチを実行する。

※ 本記事は、実行ポリシーの回避を推奨するものではない。
bunのキャッシュに疑いを持ったほうがいいという話

# bunのキャッシュに疑いを持ったほうがいいという話

## 読者の問題提起と解決策の提案

みなさん、JavaScriptやTypeScriptのプロジェクトでbunを使ったことがありますか？bunは非常に高速で便利なツールですが、キャッシュに関して注意すべき点があります。本記事では、bunのキャッシュによる問題とその解決方法について詳しく説明します。

## bunとは？

まず、bunについて簡単に説明しましょう。bunは、JavaScript/TypeScriptのランタイムとツールチェーンを統合した新しいツールです。その特徴は、従来のツールよりも高速であり、さまざまな機能が一体化していることです。

### bunが早い理由

bunが高速である理由の一つに、キャッシュ機能があります。このキャッシュ機能により、依存関係のインストールやビルドが劇的に速くなります。しかし、キャッシュには一部注意が必要な点もあります。

## 問題提起

bunを使っていると、たまにプロジェクトの`node_modules`フォルダに関するエラーが発生することがあります。この問題は、通常の方法で`node_modules`を再インストールしても解決しません。

### キャッシュの問題

このエラーの原因は、実はbunのキャッシュにあることが多いのです。bunは依存関係を効率的に管理するためにキャッシュを利用していますが、このキャッシュが古くなったり、不整合が生じたりすることがあります。

### 解決方法

幸いなことに、この問題は簡単に解決できます。以下のコマンドを実行することで、bunのキャッシュをクリアすることができます。

```bash
bun pm cache rm
```

このコマンドを実行することで、キャッシュがクリアされ、再度依存関係をインストールする際に新しいキャッシュが作成されます。

また、以下のようなエラーが発生した場合にこのコマンドを試してみてください。

```bash
Error: Cannot find module 'some-module'
```
## まとめ

bunは非常に便利で高速なツールですが、キャッシュ機能には注意が必要です。キャッシュが原因で発生するエラーを解決するためには、`bun pm cache rm`コマンドを使用してキャッシュをクリアすることが効果的です。これにより、再度新しいキャッシュが作成され、問題が解決することが期待できます。

## 参考記事

- [公式ドキュメント](https://bun.sh/docs)
- [GitHubリポジトリ](https://github.com/oven-sh/bun)
【Laravel11】Roach PHPでjQuery のようなセレクタからxpathで記述するよう修正

# はじめに

こんにちは、エンジニアのkeitaMaxです。

前回作成したスクレイピングのサンプルをxpathで記述しようと思います。

前回の記事

https://qiita.com/keitaMax/items/f2abb408a8a2fbc9a988

# xpathとは

>XPathとは、データを収集する際に要素や属性を指定して、情報を取得するための言語です。
(引用：https://pig-data.jp/blog_news/blog/scraping-crawling/xpath/)

CSSセレクタのようにHTMLなどの要素や属性を指定することで情報を取得することができるもののようです。

# 前回の記述

下記のようにjQuery のようなセレクタを使用して書いていました。

```
$subtitle = $response
            ->filter('main > div:nth-child(2) p:first-of-type')
            ->text();
```

これをxpathで書いてみようと思います。

# 修正結果

修正結果は以下のようになります。

```
$subtitle = $response
    ->filterXPath('descendant-or-self::main/div[2]//p[1]')
    ->text();
```

実際に実行してみると同じように取得できていることがわかります。


# おわりに

どっちも記述のやり方自体は同じような書き心地でした。

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！

# 参考

https://pig-data.jp/blog_news/blog/scraping-crawling/xpath/
スクラム開発でネットワークセキュリティを強化する方法


## はじめに
スクラム開発を行う際、ネットワークセキュリティは非常に重要な要素です。特にクラウドベースのサービスを活用する場合、セキュリティの強化は避けて通れません。この記事では、ネットワークセキュリティを強化するための具体的な方法について解説します。

## 1. セキュリティグループとネットワークACLの活用
クラウドベンダーが提供するセキュリティグループやネットワークACL（アクセスコントロールリスト）は、ネットワークトラフィックを制御するための強力なツールです。これらを適切に設定することで、不要なトラフィックをブロックし、システムを保護することができます。

### セキュリティグループの設定
セキュリティグループは、インスタンスレベルでトラフィックを制御します。例えば、AWSでは以下のように設定します。

```yaml
# AWSのセキュリティグループ設定例
SecurityGroup:
  Type: AWS::EC2::SecurityGroup
  Properties:
    GroupDescription: "Allow SSH and HTTP"
    SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 22
        ToPort: 22
        CidrIp: 0.0.0.0/0
      - IpProtocol: tcp
        FromPort: 80
        ToPort: 80
        CidrIp: 0.0.0.0/0
```

### ネットワークACLの設定
ネットワークACLは、サブネットレベルでトラフィックを制御します。これにより、より広範囲なトラフィック制御が可能です。

```yaml
# AWSのネットワークACL設定例
NetworkAcl:
  Type: AWS::EC2::NetworkAcl
  Properties:
    VpcId: !Ref VPC
    Tags:
      - Key: Name
        Value: "MyNetworkAcl"
    Entries:
      - CidrBlock: 0.0.0.0/0
        Egress: true
        Protocol: -1
        RuleAction: allow
        RuleNumber: 100
      - CidrBlock: 0.0.0.0/0
        Egress: false
        Protocol: -1
        RuleAction: allow
        RuleNumber: 100
```

## 2. VPNと専用線の利用
クラウド環境とオンプレミス環境を安全に接続するために、VPN（仮想プライベートネットワーク）や専用線を利用することが推奨されます。これにより、データの盗聴や改ざんを防ぐことができます。

### VPNの設定
例えば、AWSでは以下のようにVPNを設定します。

```yaml
# AWSのVPN設定例
VPNConnection:
  Type: AWS::EC2::VPNConnection
  Properties:
    Type: ipsec.1
    CustomerGatewayId: !Ref CustomerGateway
    VpnGatewayId: !Ref VpnGateway
    StaticRoutesOnly: true
```

## 3. IAMポリシーの適切な設定
IAM（Identity and Access Management）ポリシーを適切に設定することで、ユーザーやサービスのアクセス権限を細かく制御できます。これにより、不要なアクセスを防ぎ、セキュリティを強化することができます。

### IAMポリシーの設定
例えば、AWSでは以下のようにIAMポリシーを設定します。

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::example_bucket"
    },
    {
      "Effect": "Allow",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::example_bucket/*"
    }
  ]
}
```

## 4. ログとモニタリングの強化
セキュリティインシデントを早期に検知するためには、ログとモニタリングの強化が不可欠です。クラウドベンダーが提供するログサービスやモニタリングツールを活用しましょう。

### ログの設定
例えば、AWSではCloudTrailを利用してAPIコールのログを取得できます。

```yaml
# AWSのCloudTrail設定例
CloudTrail:
  Type: AWS::CloudTrail::Trail
  Properties:
    S3BucketName: !Ref LogBucket
    IncludeGlobalServiceEvents: true
    IsMultiRegionTrail: true
    EnableLogFileValidation: true
```

### モニタリングの設定
例えば、AWSではCloudWatchを利用してリソースのモニタリングが可能です。

```yaml
# AWSのCloudWatch設定例
Alarm:
  Type: AWS::CloudWatch::Alarm
  Properties:
    AlarmDescription: "Alarm if CPU exceeds 80%"
    Namespace: "AWS/EC2"
    MetricName: "CPUUtilization"
    Dimensions:
      - Name: InstanceId
        Value: !Ref EC2Instance
    Statistic: Average
    Period: 300
    EvaluationPeriods: 1
    Threshold: 80
    ComparisonOperator: GreaterThanThreshold
    AlarmActions:
      - !Ref AlarmTopic
```

## まとめ
ネットワークセキュリティを強化するためには、セキュリティグループやネットワークACLの適切な設定、VPNや専用線の利用、IAMポリシーの適切な設定、そしてログとモニタリングの強化が重要です。これらの方法を組み合わせることで、クラウド環境におけるセキュリティを大幅に向上させることができます。

皆さんもぜひ、これらの方法を取り入れて、より安全なクラウド環境を構築してください。
【Go】既存のメソッドを追加、変更する方法(Decoratorパターン)

# はじめに
* Decoraterパターンは、オブジェクトの振る舞いを追加 / 変更するための非常に強力なデザインパターンです
* Goには直接的なサポートはありませんが、インタフェースと関数を使うことで、このパターンを実装することができます
* 本記事では、GoでDecoratorパターンを実装する手法の非常にシンプルな例として、メソッドの出力前後に固定のメッセージを追加するデコレータを紹介します

# 対象読者
* Goの関数、メソッド、インタフェースの基礎を理解されている方

# Decoratorパターンとは
* GoFによって定義されたデザインパターンの一つです
* 既存のメソッドを変更せずに、オブジェクトの振る舞いを追加 / 変更することが可能です

https://www.techscore.com/tech/DesignPattern/Decorator

# ステップ1：インタフェース定義
以下のようなPrinterインタフェースと、それを実装するMyPrinter型を定義します。
```main.go
package main

import "fmt"

// Printerインタフェースの定義
type Printer interface {
    Print()
}

// プリンターの実装
type MyPrinter struct{}
func (mp MyPrinter) Print() {
	fmt.Println("hogehoge")
}

func main() {
	myPrinter := MyPrinter{}
    myPrinter.Print()
}
```

実行結果
```
hogehoge
```
# ステップ2：Decorator用の構造体を定義する
Printerを属性として持つ構造体「DecoratedPrinter」を定義します。DecoratedPrinterのPrintメソッドは、引数で受け取ったPrinter.Printメソッド出力前後に固定文字「start」と「end」を出力します。
```go
// Printerを属性として持つ構造体
type DecoratedPrinter struct {
    wrapped Printer
}
func (dp DecoratedPrinter) Print() {
    fmt.Println("start")
    dp.wrapped.Print()
    fmt.Println("end")
}
```
# ステップ3：Decoratorの定義
今回の目玉であるインタフェースをラップする関数「Decorate」の定義です。シグネチャはPrinterを受け取り、Printerを返すというシンプルなものですが、実際にreturnしているのはPrinterではなく、DecoratedPrinterです。

Printerはインタフェース、そして、DecoratedPrinterはPrintメソッドを持っている為、Printerインタフェースを実装しています。Goではこの場合、DecoratedPrinterをPrinterに代入可能です。
```go
// Printerインタフェースをラップする
func Decorate(p Printer) Printer {
    return DecoratedPrinter{wrapped: p}
}
```
# ステップ4：Decoratorを適用する
元のMyPrinterをデコレートします。
```go
func main() {
	printer := Decorate(MyPrinter{})
	printer.Print()
}
```
# 完成したソースコード
MyPrinterがデコレートされていることが確認できました。めでたしめでたし。
```main.go
package main

import "fmt"

// Printerインタフェースの定義
type Printer interface {
	Print()
}

// プリンターの実装
type MyPrinter struct{}

func (mp MyPrinter) Print() {
	fmt.Println("hogehoge")
}

// Printerを属性として持つ構造体
type DecoratedPrinter struct {
	wrapped Printer
}

func (dp DecoratedPrinter) Print() {
	fmt.Println("start")
	dp.wrapped.Print()
	fmt.Println("end")
}

// Printerインタフェースをラップする
func Decorate(p Printer) Printer {
	return DecoratedPrinter{wrapped: p}
}

func main() {
	printer := Decorate(MyPrinter{})
	printer.Print()
}
```

実行結果
```
start
hogehoge
end
```
スクラム開発でのリーンプロビジョニング実践ガイド


## はじめに

こんにちは、皆さん！今日はスクラム開発における「リーンプロビジョニング」についてお話ししたいと思います。クラウドベンダーの多様なサービスを活用しながら、効率的にプロダクトを開発する方法を探っていきましょう。

## リーンプロビジョニングとは？

リーンプロビジョニングは、必要なリソースを必要なときにだけ提供することで、無駄を最小限に抑える手法です。これにより、コスト削減や迅速なデリバリーが可能になります。特にクラウド環境では、このアプローチが非常に効果的です。

## なぜスクラム開発にリーンプロビジョニングが重要なのか？

スクラム開発は短期間での反復的な開発を重視します。そのため、リソースの無駄を最小限に抑え、迅速に環境を整えることが求められます。リーンプロビジョニングを実践することで、以下のようなメリットがあります。

1. **コスト効率**: 必要なリソースだけを使用するため、無駄なコストが発生しません。
2. **迅速なデリバリー**: 環境のセットアップが迅速に行えるため、開発スピードが向上します。
3. **スケーラビリティ**: 必要に応じてリソースをスケールアップ/ダウンできるため、柔軟な対応が可能です。

## リーンプロビジョニングの実践方法

### 1. インフラストラクチャー・アズ・コード（IaC）の活用

IaCを活用することで、インフラのセットアップを自動化し、迅速かつ一貫性のある環境を提供できます。TerraformやAWS CloudFormationなどのツールを使用すると良いでしょう。

### 2. オートスケーリングの設定

クラウドベンダーが提供するオートスケーリング機能を活用することで、トラフィックの増減に応じて自動的にリソースを調整できます。これにより、過剰なリソースを避け、コストを最適化できます。

### 3. サーバーレスアーキテクチャの採用

サーバーレスアーキテクチャを採用することで、リソースの管理をクラウドベンダーに任せることができます。AWS LambdaやAzure Functionsなどを活用すると、必要なときにだけリソースが消費されるため、非常に効率的です。

### 4. モニタリングとアラートの設定

適切なモニタリングとアラートを設定することで、リソースの使用状況をリアルタイムで把握し、必要に応じて迅速に対応できます。CloudWatchやPrometheusなどのツールを活用すると良いでしょう。

## 実際の事例

私が関わったプロジェクトでは、リーンプロビジョニングを実践することで、以下のような成果を上げることができました。

- **コスト削減**: 月間のクラウドコストを30%削減
- **デリバリー速度の向上**: 新機能のリリースサイクルを2週間から1週間に短縮
- **システムの安定性向上**: オートスケーリングにより、ピーク時のパフォーマンス問題を解消

## まとめ

リーンプロビジョニングは、スクラム開発において非常に有効な手法です。クラウドベンダーの多様なサービスを活用し、無駄を最小限に抑えながら効率的にプロダクトを開発することができます。ぜひ、皆さんもこのアプローチを試してみてください！
Linuxのディレクトリ構造を解説した面白い記事を見つけたのでMacバージョンを作ってみた

先日、以下の面白いWebページを見つけました。Linuxのファイルシステムを図示しており、ルートディレクトリ配下の構造と各ディレクトリの役割が非常によく分かります。macOS版の同様の図が有ると比較出来て良いなと思ったのですが、今の所、作られていない様です。よって、作ってみることにしました。

https://forest.watch.impress.co.jp/docs/serial/yajiuma/1601513.html

# Linuxのファイルシステム構造チャート

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/4661ae09-c174-6ff0-f08a-2b9a320e3efd.png)

# 作成したmacOSのファイルシステム構造チャート
作成したmacOS版のファイルシステム構造チャートは以下です。画像として貼付すると、文字サイズが少し小さくなってしまいました。:scream: :scream_cat: もう少し文字サイズを調整して読み易くするのが今後の課題です。

![macOS File Systems.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/246a94d5-88cc-1a3b-b1d8-b190c9635856.png)

# Reference
https://gihyo.jp/book/2020/978-4-297-11225-7
話しやすいチームづくりを目指そう

# はじめに
こちらのタイトルについて考えてみます。
チームのタスクを個人レベルに落とし込んで仕事をするとどうしてもコミュニケーションが増えたり、認識のずれを埋めるコストがかかります。
「コミュニケーションの負担が減れば仕事も回しやすいはず」と思い、僕が心掛けていることを記載していきます！

https://qiita.com/official-events/640648f4dc7d69b3d830

# コミュニケーションで心掛けていること
### 1.レベルの低いと思われそうな質問や相談を歓迎し、解決策も教えよう
「こんなことを言ったらレベル低いって言われそう・・・」
って思うこともあるかも知れませんが最初の頃は皆同じくらいのレベルかと思います。
忙しい時は難しいですがなるべく歓迎しましょう！
また、そこで、ただ答えを教えるだけだと質問者は次回も同じところでつまづいてしまいます。
必ずその質問の根本的な問題とどういう過程を経て解決するか・したかを教えてあげましょう。

### ２.個人間のチャットや通話より全体でオープンに話そう
一人が悩んでいることは、他のチームメンバーも同じように悩む時があります。
もしくは、一度悩んだが解決しているメンバーもいるので全体チャットで発信してみんなで解決しましょう。

### ３.お菓子を配ろう
話のきっかけになります。仕事をしていると気が張り詰めるていることも多いです。
お菓子で一息ついて、雑談することでいい気分転換にもなります。
※食べ過ぎには注意

### ４.出社している時は通話ではなく会話で会議をしよう
通話だと相手の顔が見えず、話が一方的になる時もあります。
会話だと相手が何に困っているかも見えるので、なるべく相手の忙しさを気にかけながら話しかけにいきましょう。

### ５.大切な話はチャットやドキュメントに残そう
会話ベースで指示を出した場合、すれ違いでミスが発生すると言った言わないの状況になります。
そうなると表面上、軋轢がなくても心のどこかで「言ったんだけどな〜」となってしまうこともあります。
指示や決定した事項については改めてチャットに残すかドキュメントとして文字にしましょう。
相手に改めて見てもらうことで認識相違がないことを確定できます。

### ６.相手の考えになぜの質問をしよう
相手の説明に疑問を感じたら質問しましょう。疑問があるまま作業をすると気持ちよくできません。
質問してみると「そういうことか」と思う時もあれば「考慮が抜けていました！」と質問が活きる時があります。
気にかかることは質問して気持ちよく作業しましょう

### ７.相手が求めていることを仮定・推測しよう
話を聞いている時に次に自分がやるべきことを考えながら聞きましょう。
「自分でもしやるのであれば〜」と考えることにより具体的な作業を考えられるようになり、
依頼された時に作業内容の認識合わせがすぐに行うことができます。

# 終わりに
みんなで楽しく効率よく成果を上げられたら素敵ですよね！
無料で手軽にNeo4j aura で Graph DBを使ってみる

RAG で Graph DBを使ってみようと思い、Neo4jを触りました。そのときの簡単なメモです。無料枠でクラウドのNeo4jを使っています。
アカウント登録やインスタンス作成時のメモは無いのですが、苦労した記憶がないので問題起きにくいはずです。
GraphDB初心者が書いているので間違いなどあるかもしれません。

## 1. インスタンスコンソール選択
[neo4j aura](https://console.neo4j.io/)のページから対象のインスタンスで「Open」ボタンを押して該当のインスタンスの画面を開きます。どのくらいの期間かはわかりませんが、触っていないと自動的に停止するみたいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/bbb5bdd0-89b3-b3f1-1218-0601c72850d4.png)

次画面で接続情報を入力して、「Connect」ボタンを押します。

## 2. データ登録
最初はこんな画面です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/40196a7f-be31-16b2-5cfd-8e23fb7ad667.png)

右上のクエリ入力欄にサンプルのクエリを入力してデータ登録してみます。RDBMSのSQLと大きく異なり新鮮です。

```cypher
CREATE 
  (木の葉隠れ:Organization {name: '木の葉隠れ'}),
  (砂隠れ:Organization {name: '砂隠れ'}),
 
  (ナルト:Person {name: 'ナルト', 技: '螺旋がん'}),
  (チョウジ:Person {name: 'チョウジ', 技: '倍化の術'}),
  (我愛羅:Person {name: '我愛羅', 技: '砂しぐれ'}),
  
  (ナルト)-[:友人]->(チョウジ),
  (ナルト)-[:敵]->(我愛羅),
  
  (ナルト)-[:WORKS_IN]->(木の葉隠れ),
  (チョウジ)-[:WORKS_IN]->(木の葉隠れ),
  (我愛羅)-[:WORKS_IN]->(砂隠れ);
```

間違ったときなど、消すには以下のCyperです。

```cyper
MATCH (n) DETACH DELETE n
```

# 3. 登録データ確認
上メニューで「Explore」を選択し「Show me a graph」と入力・実行し、データを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/0ea447b7-d64d-4e2d-24d1-ab6ae416b899.png)

「ナルト」をダブルクリックするとPropertyなど確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/686a1c60-61d5-27a6-280c-c395c1a538a4.png)

# 4. Cypyer 実行
同様にQueryでも確認

```cypher
MATCH (s)-[r:!MENTIONS]->(t) RETURN s,r,t
```

Graph形式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/bdc5ae41-2c40-eb2b-1384-c6987fb67ac9.png)

Table形式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/18be7128-59a9-6c2a-0061-1f8134d06b98.png)

Raw形式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/b1b97254-eb2e-f219-1cc6-46404d7e0025.png)
就労継続支援事業所で学習するプログラミング言語

# はじめに
収録継続支援事業所で学習するプログラミング言語について記事にします。

## 就労継続支援事業所とは?

>障害者手帳を持つ方の就労の機会の提供、生産活動の機会の提供する事業所
>現時点で一般企業への就職が不安、あるいは困難な方
>を対象にしています。

ソース
https://works.litalico.jp/syuro_shien/ikou_keizoku/

## 就労継続支援事業所で取り扱うプログラミング言語
JavaScript
PHP
HTML/CSS
VBA

 ## 解説
 就労継続支援事業所でITの仕事を取り扱う場合、ホームページの作成が主となるためJavaScript、PHP、HTML/CSSを使うのがメインのようです。
 VBAは勤怠管理に使うケースが多いようです。

 # 最後に
 就労移行と違って短時間勤務の問題があるため、プログラミング言語は検定されるのかなと思います。
「Web API: The Good Parts」の Good Parts

[O'Reilly Japan - Web API: The Good Parts](https://www.oreilly.co.jp/books/9784873116860/) の読書メモです。

![](https://www.oreilly.co.jp/books/images/picture_large978-4-87311-686-0.jpeg)


日本語に準拠しているというか、日本語にも親切だなと読んでいたら著者は日本の方 水野 貴明 さんという方であった。
[プログラミング歴40年 ソフトウェア開発者 水野さんの仕事の流儀 - Tech Team Journal](https://ttj.paiza.jp/archives/2023/04/25/5518/)
[mizuno_takaakiの日記](https://takaaki.hatenablog.com/)

端的には:
- 初めて Web API の設計をするなら読んでおくと良し
- 初めて Web API を扱うならその流儀を知るために読んでおくと良し

と思いました。

### 第1章 Web APIとは何か
- Web APIを公開していないなら、すぐにその公開を検討しよう
- Web APIを美しく設計しよう
- RESTという言葉にこだわりすぎないようにしよう

### 第2章 エンドポイントの設計とリクエストの形式
- 覚えやすく、どんな機能を持つかがひと目でわかるエンドポイントにしよう
- 適切な HTTP メソッドを利用しよう
- 適切な英単語を利用し、単数形、複数形にも注意しよう
- 認証には OAuth 2.0 を使おう

### 第3章 レスポンスデータの設計
- 多くのAPIで同じ意味に利用されている一般的な単語を用いよう
- なるべく少ない単語数で表現しよう
- 複数の単語を連結する場合、その連結方法はAPI全体を通して統一しよう
- 変な省略形は極力利用しないようにしよう
- 単数形／複数形に気をつけよう
- JSON、あるいは目的に応じたデータ形式を採用しよう
- データを不要なエンベロープで包まないようにしよう
- レスポンスをできるかぎりフラットな構造にしよう
- 各データの名前を簡潔で理解しやすくし、適切な単数複数を用いよう
- エラーの形式を統一し、クライアント側でエラー詳細を機械的に理解可能にしよう

### 第4章 HTTPの仕様を最大限利用する
- HTTPの仕様を最大限利用し、独自仕様の利用を最低限にとどめよう
- 適切なステータスコードを用いよう
- 適切な、なるべく一般的なメディアタイプを返そう
- クライアントが適切なキャッシュを行えるように情報を返そう

### 第5章 設計変更をしやすいWeb APIを作る
- API のバージョンの更新は最低限にとどめ、後方互換性にも注意しよう
- API のバージョンはメジャーバージョンを URI に含めよう
- API の提供終了時はすぐに終了するのではなく最低 6 ヶ月公開を続けよう


### 第6章 堅牢なWeb APIを作る
- 個人情報など特定のユーザー以外に漏洩したくない情報がある場合はHTTPSを使おう
- XSS、XSRF など通常のウェブと同様のセキュリティだけでなくJSONハイジャックなどAPI特有の脆弱性に気を配ろう
- セキュリティ強化につながる HTTP ヘッダをきちんと付けよう
- レートリミットを設けることで一部のユーザーによる過度のアクセスによる負荷を防ごう

### その他
- https://apiblueprint.org/


## 参考

[Web API: The Good Partsを読んだまとめ #設計 - Qiita](https://qiita.com/mitsuya/items/e33d5ac202b41447cfec)
[Web API The Good Partsを読んだのでまとめる #設計 - Qiita](https://qiita.com/ryosuk/items/36d5b5e0d1c03d099193)
[【Oreilly】Web API The Good Parts](https://zenn.dev/aew2sbee/articles/oreilly-web-api-the-good-parts)
[Web API The Good Partsを読んだ感想 | フューチャー技術ブログ](https://future-architect.github.io/articles/20221110a/)


以上です～
どうしてあなたのアラートは見られないのか？：実践編

# はじめに
本記事はQmonus Value Streamの投稿キャンペーン記事です。

目次はこちら

https://qiita.com/wolfmagnate/items/6e71ad452a836ba24e25

この連載では、指標一般についての性質について解説してきました。
実践編では、実務上で現れる様々な指標に対して、それをどう扱うのが良いのかのヒントを説明します。
[概要編](https://qiita.com/wolfmagnate/items/f1557bbb70f412565a40)で述べた通り、個々の指標の特性とその活用方法については、既に多くの情報があります。
そこで、この記事では、理論編で説明した指標の性質の観点から、個別の指標について知られているベストプラクティスを捉えなおすことで、より高い次元での理解を目指します。

**いいね、ストックをよろしくお願いします！**

# 目次

指標は幅広く使われているので、個別のトピックごとに解説しています。

## オブザーバビリティと補助的な指標
補助的な指標は、正確性が欠けており、ソフトウェアの品質判定をするうえで厄介な存在です。そんな補助的な指標を、最近急速に発展しているオブザーバビリティの側面から解き明かし、開発を効率化します。

https://qiita.com/wolfmagnate/items/61214a072811563d4750


## テストカバレッジとTDD
テストカバレッジは、テストスイートの品質を判断するうえで広く使われている指標です。
しかし、カバレッジが100%を目指したところで役立たないというのは有名な教訓でしょう。
そこで、テストをどうして実施するのかという本質的な疑問に立ち返り、カバレッジの指標としての役割を解き明かします。

https://qiita.com/wolfmagnate/items/f237a7fc174dbe5c989e
[備忘録]　IT用語について分かったことをまとめてみた ~ver.5

# はじめに
こんにちは，Umamusume22です．今回もIT用語について分かったことをまとめてアウトプットしていきます．

# 備忘録
#### ガーベジコレクタ[1,2]
- 使っていないメモリを解放すること
- メモリの上を綺麗にしてくれる
- ガーベジコレクタをがやる仕事をガーベジコレクションと呼ぶ
    - ガーベジコレクションは清掃員に該当する
    - メモリ管理のためのコードを書かなくてもこの領域の要否を自動的に判断する


#### 排他制御[3]
- ダブルブッキングしないように制御すること
- 「順番に並んで一人ずつ使ってね」を実現する仕組みのこと
- 「誰かが使っているときは使ったらダメよ」を実現する仕組み
    - 複数の人やプログラムで共有されるデータを扱うときに必要なこと

# 最後に
今回も記事の内容が短くて申し訳ありません．
引き続きIT用語について分かったことをアウトプットしていきます
読んでいただきありがとございました!

※ウマ娘の声をフーリエ変換した記事や水栓の開閉判定をLineに通知する記事も書いています．suzuが私です．興味がある方はぜひご覧ください！
https://vigne-cla.com/31-1/#toc5

※noteも始めました．
https://note.com/madoka235/n/nbba2153326e1

ぜひフォローよろしくお願いします!

# 参考文献
[1] “「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典”
https://wa3.i-3-i.info/word110347.html

[2] "5分で分かるガベージコレクションの仕組み"
https://geechs-job.com/tips/details/35

[3] “「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典”
https://wa3.i-3-i.info/word11316.html
画像認識について

はじめまして。「まっちゃ。」です。
今回、初投稿になります。

## 投稿のきっかけ
　元々画像処理に興味があり学んでいる中で、画像認識の技術を知りました。そこから画像認識について本やコードを読み、インプットを行っています。
　しかしながら、インプットするだけでは自分に不足している点が分からないと感じていました。そこで、インプットした情報を自分で言語化してアウトプットすることで、技術に対する理解を深めたいといった理由で投稿するに至りました。
　また、投稿する中でフィードバックをもらい、他者とつながりをもつことも目的として進めていきます。

<br>
　ここでは、画像認識の概要と活用事例の紹介をします。
以降、Unsplashからダウンロードした、以下の画像を用いて例示していきます。

https://unsplash.com/ja

使用する画像
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673789/14d7d32e-c99d-26ad-5b20-3ee8da01f81a.jpeg" width=35%>
[Alec Favale撮影](https://unsplash.com/ja/%E5%86%99%E7%9C%9F/%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%B3%E3%83%BC%E3%83%88%E3%81%AE%E7%99%BD%E3%81%A8%E8%8C%B6%E8%89%B2%E3%81%AE%E5%AD%90%E7%8A%AC-Ivzo69e18nk)

## 画像認識とは
　画像認識とは、文字通り「画像を認識する」ことであり、**画像中のある物体やその位置などの特徴を検出・識別すること**です。
　文字だけだと把握しずらいので、後ほど例を示します。

## 画像処理と画像認識の違い
　混同することがありますが、2つは異なる技術です。

- 画像処理
画像に変更を加える技術
**コントラスト変更、グレースケール、反転、回転、クロッピング**　などの処理
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673789/874597d3-f2f8-114b-02c2-7640b2ca03f0.jpeg" width=80%>

 
- 画像認識
画像中のある物体やその位置などの特徴を検出・識別する技術

<br>
前処理として画像処理で画像に変更を加えて画像認識の精度を向上させる、や<br>
画像認識で識別された情報の一部に対して画像処理で変更を加える、<br>
といった使い方があります。

## 画像認識の種類
　画像認識は主に3つの種類があります。
- 画像分類
- 物体検出
- セグメンテーション（領域検出）

それぞれ、説明していきます。

- 画像分類
画像内に何が写っているかを識別
ここでは、「犬種が何であるか」を識別
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673789/9fb3b457-842a-9cc0-74c6-05a5f05ebf5b.jpeg" width=35%>

- 物体検出
物体がどこに写っているかを検出
検出時は、矩形単位でラベル付け
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673789/3d85ce22-bdf3-a77f-06e8-12ddb86723f8.jpeg" width=35%>

- セグメンテーション
物体ごとにそれが写っている領域を検出
検出時は、画素領域で分けて画素単位でラベル付け

<br>
　また、セグメンテーションは、大別すると2つに分けられます。
<br>

- セマンティックセグメンテーション
同じラベルの物体はまとめる
- インスタンスセグメンテーション
同じラベルの物体でも個体ごとに識別

　ここでは、セマンティックセグメンテーションの例を示します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673789/74ce7d7b-4926-3c98-2c17-1bedb5713c70.jpeg" width=35%>

## 画像認識の活用事例
　上記の画像認識技術は、様々な分野で活用されています。
　ここでは、主な活用事例を5つ紹介します。

- 物体認識：物体の特徴を検出
例）人数カウント、無人レジ
<br>

- 異常検知：正常とは異なる特徴をもつデータを抽出
例）製造業における製品のキズや汚れといった不良品を判定
<br>

- 顔認識：人の顔を認識して、個人を特定
例）出退勤管理や決済システム、マーケティング分析
<br>

- 文字認識：画像中の文字を認識し、抽出
例）手書き文字を認識して、システムに入力
<br>

- 自動運転：運転者が操作することなく、自動車が自走

## まとめ
　画像認識の概要と活用事例に関して、紹介しました。1人でも多くの方に画像認識に対して興味をもっていただければ幸いです。
　投稿するうえで、技術に関する情報を整理して曖昧だった部分を学び直すことができたのは、大きな収穫になりました。
 
　これからも投稿を通じて、画像認識の技術について理解を深めていきます。

### 参考
https://qiita.com/iitachi_tdse/items/90435aef7c8d5ee1a78a

https://aismiley.co.jp/ai_news/what-is-image-recognition/
自然数から偶数を取り出す確率は何？


## 前書き

* 自然数は0を含めないとする
* 測度論は今さっき知ったレベル

## 高校数学の知識では無理そう

自然数から偶数を取り出す確率は何か？

直感的に考えれば1/2だろう。

しかし、偶数も自然数も可算無限である。
無限/無限 = ？となり確率が定義できないように思える。

どうなのか？

## 測度論的確率論

調べると無限集合でも確率を定義できる測度論というものがあるらしい。

0.01%程度しか理解していないが、これを使って自然数の偶数の確率を考えていきたい。

## 考える

次のサイトを大いに参考にした。

https://manabitimes.jp/math/986

確率空間$(\Omega, \mathcal{F}, P)$を考える。

### 標本空間

標本空間は
$\Omega = \mathbb{N}$

### 事象の集合

事象の集合は
$\mathcal{F} = \\{\mathbb{N}上のボレル集合\\}$

ボレル集合が何なのかはよく分かっていないが、とりあえずヤバくない集合だという認識。

### 確率測度

メインディッシュ
これが知りたい。

確率測度$P$が存在するならば、以下が満たされている必要がある。

$P(\Omega) = P(\mathbb{N}) = 1 \quad \text{(1)}$

$P(\mathbb{N}) = P(\\{1\\} \cup \\{2\\} \cup \\{3\\} \cup \cdots) = P(\\{1\\}) + P(\\{2\\}) + P(\\{3\\}) + \cdots \quad \text{(2)}$

$\text{(1)}\text{(2)}$より

$P(\\{1\\}) + P(\\{2\\}) + P(\\{3\\}) + \cdots = 1 \quad \text{(3)}$

が成立する必要がある。

## 確率測度は存在するか？

一応存在する。

$P(\\{1\\}) = 1, \quad P(\mathbb{N} \setminus \\{1\\}) = 0$

これなら$\text{(3)}$は満たされる。

この確率空間の場合、「自然数から偶数を取り出す確率」は0となる。

## は？

と、思われるだろう。
しかし$P(\{\\{x\\} \mid x \in \mathbb{N}\})$を「同様に確からしい」確率にすることはできない。

何故なら$\text{(3)}$の左辺が発散してしまうからだ。

## 結論

「自然数から偶数を取り出す確率」は確率測度$P$に依存するため一概に答えられない。

ただ、みんなが想像するであろう一様分布となる確率分布は存在しないため直感的な1/2にはならない。

確率測度$P$の定義次第で強引に1/2にはできるが…それは一様分布ではない。

終わり。

初心者なので間違ってたらごめんちゃい。
createrepo_c と RHEL9

こちらの記事 [createrepo_c と RHEL8](https://qiita.com/JS_icraft/items/57115f9e6a7ca3265d72) では

> とりあえず結論、というか注意点だけ先に書いておくと、
「createrepo_c コマンドで作成された RHEL8 のリポジトリーミラーは、モジュール情報を正しく処理しません。」
つまりRHEL8で下手に createrepo_c を使ったら面倒なことになるので注意、というお話です。

とのことですが、上手？に使えば、Modularity 対応は可能です。

[[RHEL 9] 独自の dnf リポジトリーを建てる](http://blog.livedoor.jp/aspplus/archives/51970701.html)

Boot ISO からのインストールにも対応可能なミラーです。
Javaで「文字列の最後に別の文字列を連結する」の動作を確認してみた

# 概要

Javaで「文字列の最後に別の文字列を連結する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/string/index15.html

# 実装

以下のファイルを作成しました。
```JSample15_1.java
class JSample15_1{
  public static void main(String[] args){
    String str = "東京都";

    System.out.println(str.concat("港区赤坂"));
    System.out.println(str + "港区赤坂");
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample15_1.java 
$ java JSample15_1 
東京都港区赤坂
東京都港区赤坂
```

# まとめ

何かの役に立てばと。
【Rails】一つのモデルに対して複数の意味を持たせたい（class_name, inverse_of ）

# 実現させたいこと
例えばユーザー(User)と本（Book)のモデルが存在している時
Userに二つの意味を持たせたいことがある
- 本を所有しているユーザー（User)
- 本の著者(Author)

```rb
book.author
# => 本の著者を取得
book.user
# => 本の所有者を取得
```

同じUserモデルを使って、author、userをそれぞれ取得できる

# モデル作成
マイグレーションファイルは以下のようにBookに外部キーとして
- user_id
- author_id

を持たせます
```rb
class CreateBooks < ActiveRecord::Migration[7.1]
  def change
    create_table :books do |t|
      t.belongs_to :user, null: false
      t.belongs_to :author, null: false

      t.timestamps
    end
  end
end

```

モデルは下記のように`class_name`オプションを指定。
```rb
# ユーザーモデル
class User < ApplicationRecord
  has_many :books, inverse_of: :author
end

# 本モデル
class Book < ApplicationRecord
  # 本の所有者
  belongs_to :user
  # 本の著者
  belongs_to :author, foreign_key: "author_id", class_name: "User", inverse_of: :books
end
```

上記を設定することで、
`book.user`で本の所有者を取得できるのはもちろん、
`book.author`で本の著者を取得できるようになる。

# inverse_ofについて
この時登場するのが**双方向関連付け**を宣言するための `inverse_of`です。

railsでは元々何もしなくても双方向関連付けが設定されていますが、
今回のようにUserモデルに別の意味を持たせるよう変更を加えた場合、別途指定が必要になります。

# 双方向関連付け確認方法
**双方向関連付けとは**・・・
二つのモデル間でお互いのデータを参照したり、更新したりするとき、データの齟齬が起こらない。
別のテーブル経由で値を参照しても同じ結果が得られる。
（例えば user.name == book.author.name）
（例えば book.title == user.books.first.title）

双方向関連付けを行なっていないと、
更新したはずのUserの情報が更新されていないみたいなことが起こります。

### 👇関連付けできていない例
```rb
user = User.first
book = user.books.first

user.name
# => "ユーザー１"
book.author.name
# => "ユーザー１"

user.name = "ユーザー2" # userオブジェクトのnameを変更

user.name
# => "ユーザー２"
book.author.name 
# => "ユーザー１" （←ユーザー２の出力されるはず？？？？）
```

原因としては、`user.name` と `book.author.name` で取得できるオブジェクトは一見同じように見えるが、
実は異なるオブジェクト

```rb
user.object_id
# => 11111
book.author.object_id
# => 12121
```
実はオブジェクトidが異なる

### 👇関連付け成功例
```rb
user = User.first
book = user.books.first

# オブジェクトidが一致している
user.object_id # => 1234
book.object_id # => 1234

user.name = 'ユーザー１'

user.name
# => 'ユーザー１'
book.author.name
# => 'ユーザー１'

# user.name と book.author.name が一致していればOK
```

# 参考
https://railsguides.jp/association_basics.html#%E5%8F%8C%E6%96%B9%E5%90%91%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91

https://zenn.dev/igaiga/books/rails-practice-note/viewer/ar_inverse_of
Rocky Linux 9 MySql

## 目的
* Rocky Linux 9 に mysql 8 をインストールする
* 開発環境向けの mysql のセットアップをする

## 手順

## mysqlインストールとサービス設定
```console
// インストール
[root@momonga ~]# dnf install mysql-server

// サービス開始
[root@momonga ~]# systemctl start mysqld.service

// サービス状態確認
[root@momonga ~]# systemctl status mysqld.service

// サービスの自動起動設定
[root@momonga ~]# systemctl enable mysqld.service
Created symlink /etc/systemd/system/multi-user.target.wants/mysqld.service → /usr/lib/systemd/system/mysqld.service.

// サービスの自動起動確認
[root@momonga ~]# systemctl is-enabled mysqld.service
enabled
```
## mysqlの初期設定
```console
[root@momonga ~]# mysql_secure_installation
パスワード以外はデフォルト値（Enter)でOK

// ログイン確認
[root@momonga ~]# mysql -u root -p
Enter password: (設定したパスワード）
mysql> quit
```
## ポート開放
```console
// 開放ポートにサービス名を追加
[root@momonga ~]# firewall-cmd --add-service=mysql --zone=public --permanent
success

// リロード
[root@momonga ~]# firewall-cmd --reload
success

// 確認 mysql があればOK
[root@momonga ~]# firewall-cmd --list-all | grep service
  services: cockpit dhcpv6-client http https mysql ssh
````
## リモートアクセス設定
mysqlにログインして作業
```sql
-- 現状確認
mysql> select user, host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
4 rows in set (0.00 sec)

-- リモートユーザー追加
mysql> create user 'root'@'%' identified by 'H7a)vm%F';
Query OK, 0 rows affected (0.01 sec)

-- 追加ユーザー確認
mysql> select user, host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| root             | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)

-- 権限付与
mysql> grant all on *.* to 'root'@'%';
Query OK, 0 rows affected (0.01 sec)

-- 権限確認
mysql> show grants for 'root'@'%';

-- 終了
mysql> quit
```
## 一般ログの出力設定
```console
// 設定ファイルバックアップ
[root@momonga ~]# cp /etc/my.cnf.d/mysql-server.cnf /etc/my.cnf.d/mysql-server.cnf-

// 設定ファイル編集
[root@momonga ~]# vi /etc/my.cnf.d/mysql-server.cnf

// 編集内容
[root@momonga my.cnf.d]# diff mysql-server.cnf mysql-server.cnf-
19,21d18
< general_log=1
< log_output=FILE
< general_log_file=/var/log/mysql/general.log

// サービス再起動
[root@momonga ~]# systemctl restart mysqld.service

// コネクションを張りなおしてSQLを実行 /var/log/mysql/general.log が出力されていればOK
```

## PHPのモジュールインストール
```console
[root@momonga ~]# dnf install php-mysqlnd
```
Pytorchの推論を爆速化【torch_tensorrt】

# めちゃくちゃ速くなるんでだまされたと思ってやってみて

シンプルに画像分類モデルでやってみましょう。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/7badba1b-76af-b298-7e64-660c89347cd0.jpeg width=200>

結論から言うと、

|runtime|time(sec)|
|----|----|
|torch|0.009|
|torchscript|0.003|
|**torch_tensorrt**|**0.001**|

outputは全部同じで
class: 'tiger cat' 
confidence: 35.1

# 使用方法

### インストール torch-tensorrt

```shell
pip install torch-tensorrt
```

### モデルの変換

```python
import torch
import torchvision.models as models
import torch_tensorrt

model = models.resnet18(pretrained=True)
model.eval().cuda()
example_input = torch.randn(1, 3, 224, 224).cuda()
optimized_model = torch.compile(model, backend="tensorrt")
```

### 推論

```python
with torch.no_grad():
    output = optimized_model(batch_t)
```

１回目は遅くて、２回目から高速です。

# 入力の前処理

```python
import torch
from torchvision import transforms
from PIL import Image

transform = transforms.Compose([
 transforms.Resize(224),
 transforms.ToTensor(),
 transforms.Normalize(
 mean=[0.485, 0.456, 0.406],
 std=[0.229, 0.224, 0.225]
 )])

img = Image.open("cat.jpg")
img_t = transform(img)
batch_t = torch.unsqueeze(img_t, 0).cuda()
```

# 結果の後処理

```python
import urllib
label_url = 'https://storage.googleapis.com/download.tensorflow.org/data/ImageNetLabels.txt'
class_labels = urllib.request.urlopen(label_url).read().splitlines()
class_labels = class_labels[1:] # remove the first class which is background

_, index = torch.max(output, 1)
percentage = torch.nn.functional.softmax(output, dim=1)[0] * 100


print(class_labels[index[0]], percentage[index[0]].item())
```

🐣

フリーランスエンジニアです。
AIについて色々記事を書いていますのでよかったらプロフィールを見てみてください。

もし以下のようなご要望をお持ちでしたらお気軽にご相談ください。
AIサービスを開発したい、ビジネスにAIを組み込んで効率化したい、AIを使ったスマホアプリを開発したい、
ARを使ったアプリケーションを作りたい、スマホアプリを作りたいけどどこに相談したらいいかわからない…

いずれも中間コストを省いたリーズナブルな価格でお請けできます。

お仕事のご相談はこちらまで
rockyshikoku@gmail.com

機械学習やAR技術を使ったアプリケーションを作っています。
機械学習／AR関連の情報を発信しています。

[X](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)