OmniAICreator/Qiita-1.07M huggingface dataset:
Qiita投稿の準備に！ターミナルで個人情報を簡単に非表示にする方法

# はじめに
- きっかけ
    - Qiitaの投稿を準備していて、ターミナルに個人情報が出ていることに気づく
    - コマンドの結果を貼り付けたときに、うっかり公開してしまう恐れがある
- 目的
    - Qiita投稿時の個人情報の漏洩リスクを低減したい
    - 通常時とQiita投稿準備中とで、ターミナルの表示を簡単に切り替えたい
- 作業環境
    ![Cursor_20241017_175545.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3909910/d8dfc2c6-9b3e-1fdb-cdf5-a3062ada93c0.png)
- 費用
    - 無料

# 完成したもの
```~/.zshrc
・・・ （中略）

setopt PROMPT_SUBST

# SHOW_USER_HOSTはターミナルの表示切り替え用のフラグです。0で個人情報を非表示、1で通常表示です
    
# SHOW_USER_HOSTが未定義または空なら、デフォルトで 1 に設定して環境変数としてエクスポート
# Qiita用設定を使わない時、通常のプロンプト表示に戻すために 1 をデフォルトにしています
export SHOW_USER_HOST="${SHOW_USER_HOST:=1}"

# SHOW_USER_HOSTが 0 ならQiita用表示。ユーザー名やホスト名は非表示になる
if [[ "$SHOW_USER_HOST" == "0" ]]; then
    PS1='%F{yellow}%D %*%f : %F{cyan}%~%f %F{red}$(__git_ps1 "(%s)")%f
\$ '
else
    PS1='%F{yellow}%D %*%f %F{green}%n@%m%f: %F{cyan}%d%f %F{red}$(__git_ps1 "(%s)")%f
\$ '
fi
```

# 切り替え前後のターミナルの表示
- 元々は、作業ログとしてユーザー名などを表示している
    ```
    現在時刻 ユーザー名@ホスト名 フルパスのカレントディレクトリ gitの情報 改行
    ```
- Qiita用では、ユーザー名、ホスト名などの表示はしない
    ```
    現在時刻 ホームからのカレントディレクトリ gitの情報 改行
    ```
![Cursor_と_export_SHOW_USER_HOST_0_source____zshrc_•_Untitled-1_—_google_ime_20241017_170234.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3909910/a3b1f4c4-4bb5-39db-fe69-fd9467faf6e6.png)


# 切り替えコマンド
- 環境変数で表示をオフにして、`~/.zshrc`を再読み込みする
- 再読み込みすることでプロンプトの表示設定が即座に反映されます
- Qiita投稿準備中では常に個人情報を非表示にできる
    ```
    export SHOW_USER_HOST=0;source ~/.zshrc
    ```
- 通常のプロンプト表示に戻したい場合は、再度`SHOW_USER_HOST=1`と設定してください
# 参考

- [zsh: 14 Expansion](https://zsh.sourceforge.io/Doc/Release/Expansion.html#Parameter-Expansion)
    > ${名前=単語}
    > ${名前:=単語}
    > ${名前::=単語}
    > 最初の形式では、nameが設定されていない場合はwordに設定し、2 番目の形式では、nameが設定されていないか null の場合はwordに設定し、3 番目の形式では無条件にname をwordに設定します。すべての形式で、パラメータの値が置き換えられます。

# さいごに
- ターミナルに表示される内容の設定方法を理解できた
- shの変数の初期化方法にはいくつも種類があることを知った
- この記事がQiita投稿時の個人情報漏洩に役立てれば幸いです
初心者プログラミングバイト生活七日目【シーン作成ムズっ！】

四日目から六日目ないやないか！そう思ったかい？

忙しくてここまで頭まわっってなかったわいね。

今日はねー研修のひと段落として、おもちゃのパッド内にミニゲームを作るという作業を始めたのね。

でまあ、ゲームに必要なオブジェクトとかを揃えて、ソースを読み込んだり、出力したりと書いたわけだが、まあああああああ画面は真っ黒。笑

正直、シーンを作るのが一番むずい。なんでかって言うと、GoToDefinitionで見回れる数の関数じゃないし、関数がわかんないから、どのどこで何をしてるのかよくわかんないんだよね笑

白紙から作るのが悪いんかな？？

もしかしたら来週はコピーしたシーンを改造してやるかもしれんなぁ

まあその前に正社員のプロの方に聞いてみるとする。

最近、英語を読むのが楽になってきたんだよね、日本語と同じ感じで読めるようになった。

というのも、プログラミングで英語記事を読む機会が増えたのもあるし、英語の授業でエッセイを書くための参考文献を漁りまくっったってのもある。

エッセイはSleepとBlueLightに関してのものを描いてるんだけど、まあ面白い。因果関係とかをまとめていくのがすごい楽しい。

ということで、今からリングフィットやります🤜

ちなみに一昨日、図書館に明らかに風症状もった咳をしてる人がいて、案の定昨日は熱でだるかった。9時間寝たら治ったSleep最強卍
サイバーエージェントのACEインターン体験記

## はじめに

2024年夏に、株式会社サイバーエージェントさんの「次世代トップエンジニア創出インターンシップ ACE」に参加しました！！

今回はインターンで得た学びや感想をブログにまとめておこうと思います。

## 概要

このインターンは、学生がチームに分かれて、与えられた仕様に沿ってプロダクトを開発するハッカソン形式のインターンです。
学生1人につき社員さんが1人メンターとしてついてくださり、技術的な相談などをさせていただきました。

### 日程

9/11 ~ 9/24 の2週間で行われました。

### チーム構成

チームはB, Cの2チームで、それぞれ5人ずつの学生で構成されていました。

私のチームでは、5人のうち3人がバックエンド、2人がフロントエンドを担当しました。

### プロジェクトテーマ

与えられたお題は「架空の動画配信サービス『あれまぁTV』の番組表を作成する」でした。

番組表には「マイリスト登録」機能があり、マイリストに登録した番組は「マイリスト」ページに表示されるようにします。

番組表という1ページの中に様々な情報が詰まっており、UIも複雑なため、パフォーマンス面での工夫が求められました。

## 9/11（水）~ 9/12（木）

はじめの2日間は現地で対面で行われました。チームのメンバーは全員が初対面だったため、全体オリエンテーションのあとはまずは自己紹介・談笑をして打ち解けることから始めました。

その後はバックエンドとフロントエンドで分かれて設計・開発を進めていきました。バックエンドは特にDB設計やAPI設計など、実装を始めるまでに決めることが多く、全然実装進んでなくて大丈夫か？という不安もありましたが、急がば廻れの精神で進めていきました。

また、朝会・昼会・夕会を設けてチーム全体で進捗を共有し合う会を設け、全体の進捗を把握すると共に、バックエンドとフロントエンドの間で認識の乖離が生まれないよう注意しました。

## 9/13（金）~ 9/21（土）

この期間はリモートでの作業となりました。チーム内でのコミュニケーションはSlackを使って行い、口頭で話したいことはMetafileを使って行いました。

はじめの2日間でしっかりチームビルディングをしておいたおかげで、オンラインになっても難なくコミュニケーションが取れたと感じています。

## 9/22（日）~ 9/24（火）

最後の3日間は対面での作業となりました。最後の大詰めです。私達のチームはバックエンドがMUST要件はすべて完成していたため、メンバー全員でフロントエンドの実装を進めていました。分野を跨いで連携ができたのも、チームビルディングがうまく行った成果だったと感じています。

## 技術面について

### 技術選定

使用技術は以下のとおりです。

- APIの通信プロトコル
  - REST API
- バックエンドサーバー
  - Go + Echo
- DBマイグレーション
  - Atlas

### スキーマ駆動開発

今回、開発期間が2週間と短く、フロントエンドのために早くAPIを提供する必要がありました。
そこで、API周りとDB周りについては、自動生成ツールを使ってスキーマ駆動開発を行いました。

API周り：oapi-codegen
DB周り：gorm_gen

これにより、バックエンドの実装工数を大幅に削減することができました。

APIスキーマの記述については、TypeSpecを使って記述しました。通常のyamlによるスキーマ記述は、保守コストが高くなりがちですが、TypeSpecを使うことで、TypeScriptのような記法でスキーマを記述することができ、保守性が向上しました。

### アーキテクチャ

アーキテクチャは以下のようなレイヤードアーキテクチャを採用しました。

- domain層
- usecase層
- infrastructure層←自動生成を多用
- presentation層←自動生成を多用

これにより、各層を疎結合にし、影響範囲を少なくすることができました。レイヤードアーキテクチャでは、似たようなモデルを各層で定義しなければならず、実装コストが高くなるというデメリットがありますが、自動生成を使うことで、このデメリットを解消することができました。

### パフォーマンスについて

番組表は1つのページに以下の情報が詰まっています。

- チャンネル名
- 番組名
- 番組がいつ放送されるのか

はじめはこれらの情報を別々のエンドポイントに分けて取得することも考えましたが、これでは1ページの表示に複数回のリクエストが必要になり、パフォーマンスが悪くなってしまいます。

そのため、パフォーマンスを優先して、これら3つの情報を1つのエンドポイントで取得することにしました。

日時の指定をクエリパラメータでするか否かについては、キャッシュヒットレートを上げるために、日時の指定はせずに2週間分の番組データをすべて返却することにしました。
当然データが大きくなってしまいますが、フロントエンドにNext.jsのApp Routerを採用していたため、通信はBackend Server・Frontend Server間でしか行われず、ユーザーの通信速度に依存しないため、問題ないと判断しました。

問題になるのはDBへの負荷です。これに対しては、DBのクエリ結果をキャッシュすることで対処しました。

### スケーラビリティ

ユーザー数が増えてもスケールできるようなDB設計を心がけました。

DBのスケーラビリティを考える上で、番組表データとマイリストデータでデータの性質が異なるという点に着目しました。

- 番組表データは、全ユーザー共通のデータ
  - キャッシュがしやすい
  - readが多い
- マイリストデータはユーザーに応じてデータが異なる
  - writeが多い
  - キャッシュが難しい

これらを踏まえて、番組表データはレプリケーションとキャッシュを活用し、マイリストデータはシャーディングを活用することで、スケーラビリティを確保しました。

## 反省点

- ペイロードを圧縮するべき（gzipなど）
- DBへのクエリでcontextの伝播ができてなかった
- gormに依存したコードがusecase層に漏れてしまっていた（エラーハンドリング周り）
- フロントエンドに責務が寄りすぎた
  - フロントエンドサーバーでデータを加工するのに時間がかかり、そこがボトルネックになってしまった
- 経験の差から、メンバー間で技術選定に対する理解の深さに差が生じてしまった
    - もっと丁寧に情報共有すべき

## まとめ

今回のインターンを通じて、スキーマ駆動開発やレイヤードアーキテクチャ、パフォーマンスチューニングなど、実務で使える技術を学ぶことができました。
また、学生同士でチームを組んでわいわい開発をできてとても楽しかったです。チームビルディングがうまくいったおかげで、技術的な議論もしやすく、より良いプロダクトを作ることができました。

株式会社サイバーエージェントではACEを含め様々なインターンシップを開催しているようなので、興味のある方はぜひ参加してみてください！

https://www.cyberagent.co.jp/careers/students/event/?contents_type=535
Salesforceでエージェントアクションの設定をしよう

本橋孝昭です

今回はエージェントアクションの設定を行います


今回の内容は動画でも解説しています

<iframe width="560" height="315" src="https://www.youtube.com/embed/2Kq0j9WT-64?si=bnuwpKwooINyHFtz" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

フローやエージェントアクションの詳細はこちら

https://qiita.com/Takaa/items/f9cfd5568267469686a0


「+新規エージェントアクション」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/49b9117e-da4c-09b1-bb5d-ab3e60a5a4d3.png)


事前の作成物を選択
（今回はフローを選びます）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/1dc86c03-e658-3c59-1c3d-a7f6e01e9b9b.png)

有効になっているフローを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/67b9fefe-d88f-0414-0823-9a1eccdb360f.png)


設定をして「完了」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/bd3bde39-3d6a-384b-2880-d81eff125bed.png)



エージェントアクションが新規作成されていることを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/7ce58847-0a65-2e59-a536-f29e8a40f613.png)


エージェントから「Einstein Copilot」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/646feeb2-6d34-0a61-d2ab-1a5fd6ca1043.png)

「ビルダーを開く」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/4f092111-aaf0-def4-9d76-46263599499d.png)



「有効化」の場合有効を無効に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/483be58c-a949-0fd5-83a5-543e4f3156b6.png)

MigrationDefaultTopic　をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/d5ce6777-19dd-ed3c-8bf2-d25f3b2e1013.png)

「アセットライブラリから追加」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/c2886561-055f-5641-9489-b507501ef208.png)


作成したアクションを選択し「完了」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/d9dd4c76-d9b9-315a-3978-bb9863031e43.png)


「有効化」に設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/16ff4c4b-1035-8112-98a8-eefe4f4f350f.png)
【Windows】Docker DesktopからRancher Desktopへ移行する

# 初めに
チームで使っているDocker Desktopがライセンス問題で課金されてしまうので、Rancher Desktopに切り替えるぞ！

# 環境
Windows 11 + WSL2(ubuntu 22.04)

# 手順
## Docker Desktopの削除
スタートボタンから「設定」→「アプリ」→「インストールされているアプリ」を選択。Docker Desktopを選択して削除する

:::note warn
保存しているContainerやImageは削除されてしまいます！十分注意してください
:::

## Rancher Desktopの設定
### インストール
https://docs.rancherdesktop.io/getting-started/installation/

上記のページからWindows版のインストーラーを見つけてダウンロードする。
kubernetesは今回使わないのでチェックボックスは外し、コンテナエンジンは`dockerd`を選択する


### Rancher Desktopの設定
WSL内でdockerコマンドが使えるようにPreferencesからWSLのIntegrationsのチェックボックスを入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2978104/b117dcc5-6e30-c3eb-8fa2-7b4fb614d12a.png)

Container Engineがdockerdになっていることを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2978104/b6ad1f1d-48d0-cbe5-29ff-d9d31d70394a.png)


### WSL内の設定
`~/.docker/config.json`の中の`credStore`の記述を削除します。この記述はDockerでの認証情報ストアの参照先でデフォルトだとDocker Desktopを見るようになっている模様

# 動作確認
自分は下記を確認しました！
- WSL上でdockerコマンドが使えるか
- WSL上でdocker composeコマンドが使えるか
- devcontainerが使えるか

# 所感
個人で使うなら高機能なDocker Desktopが良いと思いますが、課金の問題がなかなかシビアなのでチームで使用するならRancher Desktopはとても良い気がします！
他にもCLI、拡張機能、kubernetes機能など高機能そうなのでこれから試していきたいですね！

# 参考文献
- https://tech-lab.sios.jp/archives/33994#PC
- https://qiita.com/sohei56/items/e3a911b6104ca6a704b5
- https://docs.rancherdesktop.io/getting-started/installation/
- https://qiita.com/moritalous/items/14d4099023981dcf4fd2
【ネタ】プロジェクトの3日遅れは何か変えないと自力で挽回不可能説


こんにちは。Kaneyasuです。

後輩と飲んでいたら、昔唱えてた持論を思い出したので書いてみます。
タイトルの通り、システム開発のプロジェクトにおいて、3日遅れはスケジュールと人員とか何か変えないと自力で挽回は不可能なんじゃないかという説を書いています。

# 前提

本記事が想定しているプロジェクトは、一定期間中毎日フル稼働するプロジェクトです。
途中に期間が開くなどはないとします。

メンバーは案件掛け持ちをしておらず、1日8Hの労働時間を想定しています。

# 3日遅れを個人の遅れと仮定して真面目に考えてみる

まず、3日遅れを個人の遅れと仮定して真面目に考えてみます。
また、案件掛け持ちはなしで、ガントチャート上1日＝8Hで計算するとします。
この場合、3日遅れというのは、8H * 3 = 24Hの遅れです。

どこかの週で挽回するとします。
残業が許されるとしたら、1日2H残業するとして、月から金曜日で10H挽回できます。
その上で、土日も休日出勤するとして、土日で8H * 2 = 16H挽回できます。
これで、計26H、これなら3日遅れを挽回できる計算になります。

・・・厳しいですね。
特に、土日8H働くという仮定が無茶があります。
多分出ても8Hも働けないと思います。

何周かに分けて挽回するしかありませんね。

# 3日遅れをプロジェクト全体の遅れとして考える

3日遅れをプロジェクト全体の遅れとして考えると、さらに厳しいものが見えてきます。
先ほどと同じにように残業と休日出勤での挽回を考えてみます。
リーダー経験者ならわかると思いますが、メンバー全員がその方針に素直に従ってくれる絵があまり描けませんよね。
特に休日出勤は怪しい、朝から出勤をお願いしても、大体の人は昼ぐらいから出勤すると思います。

これもやっぱり何周かに分けて挽回するしかありませんね。
・・・何周かかけてるうちに他の問題が起きそうですが。

# EVM（Earned Value Management）のSPI（Schedule Performance Index）で考える

EVM（Earned Value Management）は、プロジェクトの進捗を数値化する手法です。
その中で、SPI（Schedule Performance Index）という指標があります。

これは、1より大きい場合は進捗が良い、1より小さい場合は進捗が悪いという指標です。

![参考書籍](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1959433/7aeec6c8-baa8-1ebb-aca9-596ae0b6f771.jpeg)

https://amzn.asia/d/1V2DeCe

こちらは私が昔からプロジェクト管理の際に参考にしている書籍です。
こちらにはSPIについて以下のように書かれています。

>米国防総省によると、SPIやCPIには「10％ルール」が存在するといわれています。10％以上の予実差異が生まれると、プロジェクトは自力でベースラインに回帰させることが困難であると意味しています。

そして、SPIについて以下のように表が載っています。

| 指数値 | 指数値の意味 | 予実差異の影響範囲 |
| --- | --- | --- |
| 1.0 | 計画（ベースライン）通り | 特に問題なし |
| 0.99 〜 0.95 | 許容水準 | プロジェクト内のチーム単位での対応 |
| 0.94 〜 0.90 | 要注意水準 | プロジェクト全体での対応 |
| 0.89 〜  | 危険水準（10％ルールを逸脱） | ユーザーを含めた対応 |

これによるとSPIの許容水準は0.99〜0.95となっています。
0.95ってどれぐらいかというと、プロジェクト開始後60日（月20日換算で3ヶ月）で3日遅れで、SPIが0.95になります。
60日時点から1日でも早い段階で3日遅れが発生すると、SPIが0.94台になります。
`要注意水準`に突入ですね。

0.94からの`要注意水準`における影響範囲はプロジェクト全体での対応となっています。
プロジェクト全体での対応というのは、ぱっと思いつくのは社内におけるスケジュール・人員の調整ですね。
ガントチャートの作り直しが発生そうです・・・。
0.94と言われると94点みたいでまだまだいけそうに見えますが、数字の耳障りとは裏腹に重い数字です。

# まとめ

ネタくさいですが、3日遅れはその響き以上に重い数字だということを書いてみました。
できれば3日も遅れる前に誰かに相談しましょう。
3日以上遅れちゃった場合、潔くスケジュールか何かを変えた方がいいですね。
ミノ駆動さんのデータ破壊駆動を防ぐ設計のセミナーレポート

# ミノ駆動さんのデータ破壊駆動を防ぐ設計のセミナーレポート
社内で展開するように書いてるので、文章ざっくり書いてます。
すいません
ミノ駆動さんが今伝えたいドメインモデリングの勘所 〜“想定外”を排するデータ破壊駆動設計とは？〜
https://findy.connpass.com/event/332976/
パワポはこちら
https://speakerdeck.com/minodriven/data-destroy-driven

# 参加理由
ミノ駆動さんの話は何度も聞いてるので、話される内容は自分が実践できるし、最近は新しい情報を知ったり、気づきがあることは減りました。
ただ、現場などで説明したり、説得したりする際に理解がまだ自分言葉で説明することができてません。
そのため、ミノ駆動さんの言葉を聞くことによって、自分の考えと合うところは同じ言葉を流用させていただいたり、話を聞く中で自分の経験と結びつき言語化ができたことは自分の言葉にしたりと伝えるための言葉を構築することがしたくて参加してました。

# セミナーの内容
## データ壊れて困ること
書籍『セキュア・バイ・デザイン』に記載の、マイナスの個数が設定されて、請求が減額してしまって、それを悪用されて損失が発生したエピソードを紹介。
負の値以外にも想定してないデータパターンが入ったことによって、意図しない処理になったり、データベース上のデータが壊れてしまい、そのデータを元にした障害が起きるってよく聞きますね。

データに不整合がなく、正常な状態を維持することをデータの完全性と言う。

この完全性を担保するためにカプセル化しよう。

## カプセル化できてないアンチパターン
例にあがった金額を例にします。
Javaで言うと、int型は負の値を含みます。Javaの型だけでは正の値が保証できません。
非Nullもライブラリなしでは保証できません。

よくみそうな金額に関するロジックはこんな感じかなと思います。

金額は額と貨幣単位を属性として持ち、制約は以下
* 金額は０円以上
* 貨幣単位は非null
* 金額、貨幣単位は不変

ダメな構造例
```java
public class Money{
  private int amount; //額
  private Currency currency: //貨幣単位

  //コンストラクタは割愛
  public static boolean validateAmount(){
    return amount > 0;
  }
}
```
validateを別のクラスに書くのは論外なので、割愛します。

このコードの問題は以下です。
* validateAmountメソッドを呼び出しFalseであれば、エラーにするなどの処理を書かないと負の金額が存在できてしまう
→最終的にマイナスの値がユーザ向けに発行されたり、データとして保存されてしまう
* 金額が可変可能なので、エラーロジックを通した後に不正な値で上書きされてしまう
→結果不正な値の影響が発生する

## あるべき
```java
public class Money{
  private final int amount; //額
  private final Currency currency: //貨幣単位

  public money(int money,Currency currency){
      if(amount < 0){
          thorw new IllegalArgumentException();
      }
      if(currency == null){
          thorw new IllegalArgumentException();
      }
      this.money = money;
      this.currency = currency;
  }
}
```

コンストラクタに制約を入れることによって、負の金額を持つMoneyが存在できない。
変数もイミュータブルなため、コンストラクタの制約を通ったMoneyの金額が不正な値に変更されることもない。
金額を変更する際は
```java
public Money changeAmount(int amount){
    return new Money(amount,this.currency);
}
```
同様にコンストラクタを通るため、負の金額が存在することはMoneyクラスが保護している。
金額の仕様、制約をMoneyクラス単体で保護していることになる。
カプセル化はprivate型にしてSetter、Getterを介して変数を触れるようにすることではない。
データの完全性を自分のクラスで保証するために、コンストラクタや値の変更のロジックをまとめることが必要になっている。

## 制約のための働きかけ
カプセル化を元に自分自身で制約を守りデータの完全性を保護します。
セミナーではなかったが、早期リターンを使って想定できるケースのみ、処理させる方法もあります。
制約を全部洗い出すことは難しいです。
で、その際DMMさんで実行していたことがチームの中で逆に今のモデルのデータを壊すにはどこを攻撃するか。クラッカーの立場になって考えることをしたそうです。
そうすると、攻撃方法の意見が多く上がり、その反転を制約としていくことによってモデルの制約を洗い出したそうです。
設計をする方法として逆の壊す方法の意見の方が出しやすいのかもしれない。
この設計のアプローチはどんな設計のやり方にも言えるのかなと思います。
windowsで他のユーザが開いている共有ファイルを強制的に切断させる

別のユーザが開いている共有ファイルをどうしても緊急で変更しなくてはいけなくなった場合の緊急対応法。

※ 共有フォルダが置かれているサーバにアクセスできることが前提となります。
※ 他のユーザ編集中の場合、トラブルとなる可能性がありますので、実際に対応される際には十分に気を付けて実施してください。

```
1.windowsの検索窓に「コンピューターの管理」と入力し「コンピューターの管理」を開く

2.「共有フォルダー」→「開いているファイル」を開く

3.該当するファイルを見つけたらカーソルを合わせて、マウスを右クリックし、「開いているファイルを閉じる」を選択する。
```

以上の対応で、他のユーザが開いている最中の共有ファイルを強制的に閉じることができます。
Python初心者向け：Djangoでローカル開発環境を構築するためのステップバイステップガイド

## はじめに
Djangoは、高速なWeb開発を可能にするフレームワークとして非常に人気があります。

この記事では、Djangoプロジェクトを簡単に作成し、localhostでアクセスできるようにする手順を詳しく説明します。

以前、ITスクールのハッカソンに参加した際に「Flask」を使ってWebアプリケーションを作成しましたが、今回は「Django」に初挑戦するため、自分への備忘録としても記録を残します。

## 知識整理
Djangoは、以下のような特長を持つフレームワークです。

:::note
**・MVCアーキテクチャ**: モデル（Model）、ビュー（View）、コントローラー（Controller）の役割を分離し、開発を効率化します。

**・豊富な機能**: 認証、管理パネル、データベース管理など、多くの機能が組み込まれています。
拡張性: プラグインやパッケージを利用することで、機能を簡単に追加できます。
:::

詳細に知りたい方は関連記事も参考にしてみてください。

https://udemy.benesse.co.jp/development/system/django.html

https://www.alobridge.com/blog/1650/

## 前提条件
Djangoを使用するためには、以下の前提条件を満たしている必要があります。

:::note warn
**・Pythonがインストールされていること（推奨バージョン：3.6以上）**
**・pipがインストールされていること**
:::

## 構築手順
以下の手順に従って、Djangoプロジェクトを作成します。

### 1.仮想環境の作成

Pythonの仮想環境を作成します。仮想環境を使うことで、プロジェクトごとに異なる依存関係を管理できます。

```bash
python -m venv myenv
```

ここで、``myenv``は仮想環境の名前です。好きな名前に変更できます。

### 2.仮想環境のアクティベート

作成した仮想環境をアクティベートします。

**Windowsの場合:**
```bash
myenv\Scripts\activate
```

**macOS/Linuxの場合:**

```bash
source myenv/bin/activate
```

仮想環境がアクティベートされると、プロンプトに環境名が表示されます。

ここでは、macOSからアクティベートした例を示しています。

![スクリーンショット 2024-10-25 20.05.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/f3291aa8-33d2-a574-e441-e8e4a8aac9fe.png)

### 3.Djangoのインストール

仮想環境がアクティベートされたら、Djangoをインストールします。
```bash
pip install django
```

### 4.Djangoプロジェクトの作成

Djangoプロジェクトを作成します。
```bash
django-admin startproject myproject
```

ここで、``myproject``はプロジェクトの名前です。好きな名前に変更できます。

### 5.プロジェクトディレクトリに移動

プロジェクトディレクトリに移動します。

```bash
cd myproject
```

``cd``コマンドで移動した際、確認のため``pwd``コマンドで自分のいるディレクトリを確認すると良いでしょう。

```bash
pwd
```

実際のターミナル画面になります。

![スクリーンショット 2024-10-25 20.08.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/93fb0648-fbcc-03f0-78af-7f2e16d20a7c.png)


### 6.開発用サーバーの起動

Djangoには開発用サーバーが用意されているので、以下のコマンドでサーバーを起動します。

```bash
python manage.py runserver
```

### 7.ブラウザでアクセス

ブラウザを開き、次のURLにアクセスします：

```bash
http://127.0.0.1:8000/
または
http://localhost:8000/
```

ブラウザにはDjangoのウェルカムページが表示され、ページをリロードするとサーバー側に「GET」リクエストが記録されていることが確認できます。

![スクリーンショット 2024-10-25 20.11.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/a20bb15a-8993-ce62-c2e6-1bed105002c4.png)


## まとめ
これで、Djangoプロジェクトが作成され、localhostでアクセスできる状態になります。ブラウザにはDjangoのウェルカムページが表示されるはずです。

この手順に従えば、Djangoのプロジェクトを簡単に立ち上げることができます。ぜひ試してみてください！

## 参考文献

https://qiita.com/South_/items/416b50a250fc1fe13df7

https://qiita.com/kkk777/items/555296a88a2b871b1403
[Go]Genericsを使ってWebアプリの共通処理をまとめて行う

最近、[Fiber](https://gofiber.io/)というWeb Application FrameworkでWebアプリを作っていますが、そこでGenericsを使ってWebリクエストを処理する「お約束」みたいな共通処理をまとめてやっています。

Fiberじゃなくても使えると思いますが、Fiberを例にしています。なお、Fiberは現在v3がベータ版ですが、以下はv2のコードです。

## リクエストごとに型を作る

最初にリクエストごとの型を作ります。

```go
type TestGetApiReq struct {
	Name string `json:"name" query:"name"`
}

type TestPostApiReq struct {
	Country string `json:"country"`
}
```

GETのほうは、QUERY_STRINGとして渡されることを想定しています(`json:"name"`は、レスポンスに使うためなので、普通は不要です)。POSTの方は、RequestBodyにJSONがくる想定です。
Fiberでは、`QueryParser`や`BodyParser`でパースするために必要なので、作るのに違和感はないと思います(他のWAFでも、似たようなことはするでしょう)。

## Requestの型がRequestWrapperというinterfaceを満たすようにする

RequestWrapperというinterfaceを作ります。以下のようなもので、特に何もしません。

```go
type RequestWrapper interface {
	CanWrap() 
}
```
先程の型に実装します。

```go
func (TestGetApiReq) CanWrap()  {}
func (TestPostApiReq) CanWrap() {}
```
これは、Genericsとして、Requestwrapperを渡したいだけなので、特に意味はないです。
CustomContextを実装するなどして、`Cc() *context.CustomContext` を返すようなものを作ると、より有意義かと思います。

## WrapGetRequest/WrapPostRequestという型を作る

`*fiber.Ctx` と `RequestWrpper` interfaceを満たしている型を受け取れる型です。

```go
type WrapGetRequest[T RequestWrapper] struct {
	c   *fiber.Ctx
	req *T
}

type WrapJsonRequest[T RequestWrapper] struct {
	c   *fiber.Ctx
	req *T
}
```
newも作りましょう。
```go
func NewWrapGetRequest[T RequestWrapper](c *fiber.Ctx, req *T) *WrapGetRequest[T] {
	return &WrapGetRequest[T]{c, req}
}

func NewWrapJsonRequest[T RequestWrapper](c *fiber.Ctx, req *T) *WrapJsonRequest[T] {
	return &WrapJsonRequest[T]{c, req}
}
```

## GET/POSTごとの共通処理をPreProcessに書く

GETの場合は、`QueryParser`でリクエストを処理します。POSTの場合は、`BodyParser`でリクエストを処理します。

今回のは、サンプルなので、それ以外何もしませんが、例えば、`WrapGetRequest`や`WrapPostRequest`にカスタムコンテキストを持たせたることもできるでしょうし、その他の共通処理を書くこともできます。

```go
func (w *WrapGetRequest[T]) PreProcess() (error, bool) {
	err := w.c.QueryParser(w.req)
	if err != nil {
		return  w.c.Status(400).SendString(err.Error()), false
	}

	return nil, true
}

func (w *WrapJsonRequest[T]) PreProcess() (error, bool) {
	err := w.c.BodyParser(w.req)
	if err != nil {
		return  w.c.Status(400).SendString(err.Error()), false
	}

	return nil, true
}
```

## 実際の処理を書く

サンプルなので、mainの中に実装しています。
GET/POSTの2つのAPIを作りましたが、リクエストでもらったものをJSONで返すだけです。

```go
func main() {
	// Initialize a new Fiber app
	app := fiber.New()

	// Define a route for the GET method on the root path '/'
	app.Get("/name", func(c *fiber.Ctx) error {
		req := new(TestGetApiReq)
		w := NewWrapGetRequest(c, req)
		err, ok := w.PreProcess()
		if !ok {
			return err
		}
		return c.JSON(req)
	})
	app.Post("/country", func(c *fiber.Ctx) error {
		req := new(TestPostApiReq)
		w := NewWrapJsonRequest(c, req)
		err, ok := w.PreProcess()
		if !ok {
			return err
		}
		return c.JSON(req)
	})

    app.Listen(":3000")
}
```

サーバ動かすと動作確認がめんどくさいので、テストでレスポンスを表示するものを書いたものを[Gist](https://gist.github.com/ktat/1f2f306ed15778e35eeb6e963356177d)においておきました。

動かすと、以下のような結果が出力されます。

```
2024/10/19 21:23:41 Status: 200 OK, Body:{"name":"ktat"}
2024/10/19 21:23:41 Status: 200 OK, Body:{"country":"Japan"}
2024/10/19 21:23:41 Status: 400 Bad Request, Body:unexpected end of JSON input
```
最後のは、壊れたJSONを送ったものです。

## 終わり

これで、Webにまつわるお約束みたいな前処理を共通処理できるようになりますね。
イベント参加報告：【ミートアップ】令和版！エンジニアのキャリア戦略を考えよう（10/24）


<!--

## イベント参加報告：【ミートアップ】令和版！エンジニアのキャリア戦略を考えよう（10/24）

最も伝えたいこと。
簡潔かつ分かりやすく過不足ないタイトルを考えましょう。

### 【 】(墨付き括弧)

- 【言語やサービス】
    - 例1.【Python】すぐにpytestで単体テストを実行するまでの手順
- 【言いたいこと】
    - 例1.【必見】Objectはどこに消えた？
- 【前提】
    - 例1.【個人開発】○○を○○できるサービスをリリースしました
    - 例2.【初心者向け】Reactとはそもそも何なのか説明します
- 【続き物の番号】
    - 例1.【2024年版】新入社員向け研修資料を公開します
    - 例2.【環境構築編】Windows11でPythonを実行するまで

【前提】詳しいタイトル【言語やサービス】のように、複数を併用するパターンもあります。

-->

## はじめに
[【ミートアップ】令和版！エンジニアのキャリア戦略を考えよう（10/24）](https://lion.connpass.com/event/333109/)のイベント参加報告の記事です。
「エンジニアのキャリア」というキーワードについて興味がある方向けに書きます。

### この記事でわかる・できること
- エンジニアが成長するために行うと良いこと
- エンジニアがアウトプットする際のスタンス


### この記事の対象者

- エンジニアであれば誰でも

## イベントの趣旨

「令和版！エンジニアのキャリア戦略を考えよう」と題し、ゲストに日本PostgreSQLユーザ会　理事長　喜田紘介 氏がキャリア戦略についてインタビュー形式で成功体験を教えてくれました！

### 学びになったこと

エンジニアが成長するために行うと良いこと
- エンジニアが学んだことは、気軽にアウトプット。まずは自分のまとめとして行うと気持ちが楽になる

エンジニアがアウトプットする際のスタンス
- 学んだことを気軽にアウトプットしてる人は意外と少ない。アウトプットしたら、色々な人が見てくれて自分のブランディングにもなる！ 

### 学びから解釈したこと

インプットしたことをアウトプットしたら、自分の学びの振り返りにもなるし、自分のブランディングにもなるし、良いことづくし！

### 今度、自分の行動にどう活かすか

最近、ブログのインプットをしてなかったので、インプットを再会しようと思えた！（なので、これを投稿 笑）

## 参考資料
[LinuC Open Network](https://linuc.community/)

## おわりに・まとめ
- 今後、エンジニアのキャリアという文脈で「価値観を言語化するイベントを開催したい！」と運営の方にお伝えしました。
- **価値観の言語化について気になる方は[こちら](https://sites.google.com/view/retryell2023/%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89/%E4%BE%A1%E5%80%A4%E8%A6%B3%E3%82%92%E7%89%B9%E5%AE%9A%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E6%89%8B%E9%A0%86?authuser=3)をご確認ください！**
キャッシュメモリの役割

## はじめに
1日1項目1時間学習の会
今回のテーマは**キャッシュメモリの役割について**です。

## キャッシュメモリとは
キャッシュメモリとは、CPUが頻繁にアクセスするデータや命令を一時的に保存しておく高速メモリのことです。
同じデータや命令を何度も利用する傾向があるため、それらをキャッシュメモリに一時的に保存し、CPUが素早くアクセスできるようにします。これにより、CPUがメインメモリに頻繁にアクセスすることを防ぎ、処理速度を向上させます。

## L1, L2, L3キャッシュの違い

キャッシュメモリは階層構造になっており、次キャッシュ（L1）、2次キャッシュ（L2）、3次キャッシュ（L3）があり、それぞれ異なる速度・容量の特徴があります。

### L1キャッシュ
- 場所: CPUコア内に存在
- 役割: 最も高速で、最初に参照されるキャッシュ
- 容量: 数十KB（例: 32KB～128KB程度）
- 速度: 非常に高速（CPUクロックに非常に近い速度で動作）
- 用途: 命令キャッシュ（Instruction Cache）とデータキャッシュ（Data Cache）に分かれ、よく使われる命令やデータを保持する


### L2キャッシュ
- 場所: CPUコア内またはその近く
- 役割: L1キャッシュにないデータを提供
- 容量: 数百KB～数MB（例: 256KB～2MB程度）
- 速度: L1より遅いがメインメモリより高速
- 用途: CPUごとに独立して割り当てられ、L1キャッシュのミス（データが見つからなかった場合）時に利用


### L3キャッシュ
- 場所: CPUのコア間で共有（マルチコアCPUの場合）
- 役割: 複数のコア間で共有され、L2キャッシュにないデータを提供
- 容量: 数MB～数十MB（例: 4MB～64MB程度）
- 速度: L2より遅いがメインメモリより高速
- 用途: コア間の協調とデータ共有を支援し、L2キャッシュのミスを補完

L2とL3はL1の補完的な役割

## キャッシュメモリの利点と課題

### 利点
- CPUの処理待ち時間を短縮し、システム全体のパフォーマンス向上
- 同じデータの再利用を促進

### 課題
- キャッシュミス（キャッシュにデータがない状態）が発生すると、逆に遅延が大きくなる
- 容量が大きいほど遅くなるため、各レベルのキャッシュは容量と速度のバランスが必要

## まとめ
キャッシュメモリは、高速アクセスが必要なデータや再計算コストの高いデータを保存するのに非常に有効です。

- 頻繁に利用されるが変化しにくいデータ（設定、SQL結果、APIレスポンス）
- 重い処理の結果（計算結果、予測データ）
- ユーザーの利便性を高めるデータ（セッション、入力内容）

## 参考
https://zisalog.com/cpu-cache-memory/

https://bto-mania.com/blog/2975

https://qiita.com/kikuchi-yzrh/items/56b2368e4473e19ec1d9
httpdからTomcatへプロキシした際に503エラーが返って来る

## 前提、事象
* OSはRHEL9系
* httpdからTomcat（SpringBoot組み込み）へリクエストをプロキシしようとしたが、503エラーが返って来る
```
<VirtualHost *:80>
    ServerName xxxx.com
    DocumentRoot /var/www/html
    ProxyPass "/" "http://localhost:8080/"
    ProxyPassReverse "/" "http://localhost:8080/"
    ErrorLog /var/log/httpd/error.log
</VirtualHost>
```

## 原因
SELinuxの機能により、httpdプロセスからTomcatへの通信がデフォルトでブロックされていた。

## 対応
SELinuxの設定を変更することで、Tomcat（外部リソース）への通信を許可する。
```
setsebool -P httpd_can_network_connect on
```

## 参考
https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/7/html/selinux_users_and_administrators_guide/sect-managing_confined_services-the_apache_http_server-booleans
ユーザー定義関数で共通モジュール化したリファクタリング


## 重複箇所を修正するためのリファクタリング

「終了」の確認部分を共通化するために、`check_exit(input_value)` という関数を作成します。この関数は、入力が「終了」であるかを判定し、「終了」であれば `True` を返します。メインのコードでは、この関数を使って「終了」の確認を行い、共通化された形にリファクタリングします。

---
## はじめに

HI Engineer Collegeでは、実務未経験のエンジニアの方や、エンジニアに興味がある方を募集したおります、まずはお気軽にお問い合わせください。

※ (株)G&T（【内々定まで最短2週間】ゼロからしっかりじっくり研修☆20代活躍中！）

https://gat-company.com/

※ HI Engineer Collegeに興味あがある方はこちら（プログラミングを学習したい方）

https://hiengineer.jp/



---

### エンジニア向けチャットルーム「TechTalk」参加者募集中！

プログラミングやITの話題を気軽に共有し、学び合えるエンジニアのためのチャットルーム「TechTalk」では、新たな参加者を募集中です！

**こんな方にオススメです**
- 最新技術の動向やトレンドを追いかけたい
- 日々の開発で生じる疑問を他のエンジニアに相談したい
- コードレビューの方法やデバッグのコツを知りたい
- 他のエンジニアと共に成長できる場を探している

**チャットルームで扱う主なトピック**
- **プログラミング**: JavaScript、Python、Javaなど、言語やフレームワークについて
- **開発ツール**: Git、Docker、CI/CD の自動化など
- **キャリア**: 転職やキャリアパス、業界動向
- **AI/機械学習**: モデルの開発やトレンド
- **Webセキュリティ**: セキュリティ対策や最新の脅威情報

**チャットルームの特徴**
- 他のエンジニアからリアルタイムでフィードバックがもらえます
- 勉強会やハンズオンセッションも定期開催
- 初心者から上級者まで、幅広いレベルのエンジニアが在籍
- リモートワーク時のちょっとした相談や雑談も大歓迎

**参加方法**
下記リンクから「TechTalk」へぜひご参加ください。

https://line.me/ti/g2/xRolADFbfopNo4vdgA9hmAlAlMgxvaIUSNDx8A?utm_source=invitation&utm_medium=link_copy&utm_campaign=default

---

### リファクタリング後のコード

```python
def check_exit(input_value):
    """入力が「終了」であれば True を返し、プログラムを終了するメッセージを表示"""
    if input_value == "終了":
        print("プログラムを終了します。")
        return True
    return False

while True: 
    # ユーザーに縦の長さを入力してもらう 
    height_input = input("長方形の縦の長さを入力してください（例: 5.0）または「終了」と入力して終了: ") 
     
    # 終了の確認
    if check_exit(height_input): 
        break 
 
    # ユーザーに横の長さを入力してもらう 
    width_input = input("長方形の横の長さを入力してください（例: 3.0）: ") 
 
    # 終了の確認
    if check_exit(width_input): 
        break
 
    try: 
        # 入力された値をfloatに変換 
        height = float(height_input) 
        width = float(width_input) 
 
        # 面積を計算 
        area = height * width 
 
        # 面積を表示する 
        print(f"長方形の面積は {area} です。") 
 
        # 面積が50以上かどうかを判断 
        if area >= 50: 
            print("大きい長方形です") 
        else: 
            print("小さい長方形です") 
 
    except ValueError: 
        # 数字以外が入力された場合 
        print("エラー: 数字を入力してください。")
```

---

### 変更点と説明

1. **`check_exit` 関数の作成**：
   - この関数は引数として `input_value` を受け取り、もし `input_value` が「終了」であれば、終了メッセージを表示し `True` を返します。
   - `False` が返された場合は、処理を続けます。

2. **共通化によるリファクタリング**：
   - `height_input` と `width_input` の両方で `check_exit` 関数を使うことで、同じ「終了」の確認コードを繰り返す必要がなくなり、可読性が向上しました。

---

このリファクタリングにより、コードがスッキリし、終了判定の処理を一箇所で管理できるようになりました。
初めてのソケット通信（概念のみ）

ソケット通信の仕組みについて整理します。

ソケット通信は双方向通信ができます。
ソケット通信は「サーバー」と「クライアント」で構成されます。
「サーバー」は常駐する方です。一方、「クライアント」は必要なときにサーバーへ接続します。

HTTPと同様、サーバーはクライアントからの要求に対して応答することができます。
クライアントはサーバーに処理を要求することができます。
一方、接続を確立すればサーバーからクライアントに対して通信を行うこともできます。

以下に、クライアントからの要求データ送信に対して応答データを送る手順を示します。

サーバーは次の手順で確立します。
・ソケットの作成
・ソケットとローカルアドレス・ポートのバインド（ソケットの確立）
・ソケットでリッスン（クライアントからの接続待ち）
・クライアントのアクセプト（クライアントからの接続を確立）
・クライアントからの要求データ受信
・クライアントへの応答データ送信
・ソケットのクローズ（ソケットを閉じる）

クライアントは次の手順で確立します。
・ソケットの作成
・サーバーへの接続（コネクト）
・サーバーへ要求データの送信
・サーバーからの返答を受信
・ソケットのクローズ

ソケットを閉じない限り、双方向でデータの送受信を行うことができます。

例えば製造現場ではPLCを介してこのようなシステムが組まれます。


[ソケットの仕組み](https://www.ibm.com/docs/ja/i/7.3?topic=programming-how-sockets-work)
人工知能は、アブラムシのどこを見てるんだろう

# はじめに
　こんにちは。大学で昆虫学を専攻していたものです。大学では、卒業論文で、YOLOv8を用いて、アブラムシの齢期を分類していました。今回は、大学の研究で得た人工知能を用いて、人工知能がアブラムシの「どこを、どう見たのか」を明らかにしていこうと思います。
# Grad-CAM解析：CNNの判断を可視化する

## はじめに

畳み込みニューラルネットワーク（CNN）は画像認識で高い性能を示していますが、「なぜそのような判断をしたのか」を理解するのは容易ではありません。そこで登場したのが**Grad-CAM（Gradient-weighted Class Activation Mapping）**です。

# Grad-CAMとは

Grad-CAMは、CNNが画像のどの部分に注目して判断を下したのかを可視化する手法です。特徴として：

- CNNの最終層の勾配を利用して重要な領域を特定
- クラス固有の視覚化が可能
- 直感的なヒートマップ形式で結果を表示

### Grad-CAMの発展形

Grad-CAMの基本的なアイデアを発展させた手法がいくつか提案されています：

#### 1. Faster Grad-CAM
- 計算効率を改善した手法
- 基本的なGrad-CAMと同等の精度を維持しながら、処理速度を向上

#### 2. Eigen-CAM
- 主成分分析（PCA）の考え方を取り入れた手法
- より安定した可視化結果が得られる
- クラス依存しない特徴マップの生成が可能

### Eigen-CAMの特徴

Eigen-CAMは以下のような特長を持っています：

- 勾配計算が不要
- 処理が高速
- モデルに依存しない汎用的な可視化が可能
- より安定した結果を得られる

Grad-CAM及びその派生技術は、ディープラーニングの判断過程を理解する上で非常に重要なツールとなっています。特にEigen-CAMは、その使いやすさと安定性から、実践的な場面での活用が期待されています。

# YOLOv5でまず、使ってみた。
使ったコード↓

https://jacobgil.github.io/pytorch-gradcam-book/EigenCAM%20for%20YOLO5.html

![Aphid_EligenGradCAM_YOLOv5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001770/b2ef52c2-fbe5-99ac-ce8e-f8a57463463d.png)

アブラムシの全体を見ていることが分かりますが、どこを見たのか分かりませんでした。

# YOLOv8で使ってみた。
使ったコード↓

https://github.com/rigvedrs/YOLO-V8-CAM/tree/main

![Aphid_EligenGradCAM_YOLOv8_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001770/2b8821c3-0425-a069-7c20-b04bfaa277dc.png)
![Aphid_EligenGradCAM_YOLOv8_2png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001770/c523b293-867c-5b77-e0c5-53b19817e6dd.png)

アブラムシの後ろ足に着目していることが分かります。

## Grad-CAM解析で大事なこと
Grad-CAM解析で大事なことは優秀なモデルの方が、GradCAM解析がうまくいくこと。ここで示したYOLOv5はYOLOv8より劣る。→YOLOv8の方が結果の信憑性が高い。

# 考察
前、論文でアブラムシの後ろ脚に着目して、齢期を診断したことが報告されていました。若干、後ろ足に着目してるかな？という印象ですから、一概には言えませんが、論文と一致します。

Grad-CAMは、どこを同定したらいいのかというインスピレーションを与えてくれる技術ですね。

# 将来的には
将来、医療現場でAIが使われるようになると思います。そこで、AIが診断した病気の判断根拠を提示することに貢献できるのではないでしょうか。


# 参考文献
- "Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization"
- "Eigen-CAM: Class Activation Map using Principal Components"
Delphi 12.2のスマート機能でCodeLlamaの日本語化されたモデルを試す

Delphi 12.2から利用できるようになったスマート支援機能ですがOllamaで公開されているcodeLlamaでは日本語で出力されませんでした。

https://qiita.com/p_kato/items/63615480249e85dc8f29

そこで，codeLlamaで日本語が使えるようにしたモデルがないか調べてたところELYZA-japanese-CodeLlama-7bを見つけました。

https://zenn.dev/elyza/articles/fcbf103e0a05b1

ELYZA-japanese-CodeLlama-7bは，ELYZA社が提供するcodeLlamaに日本語の追加学習をしたモデルで，ELYZA-japanese-CodeLlama-7b-instructは事後学習もしているそうです。Hugging Face https://huggingface.co/ で公開されていました。しかし，Ollamaですぐ使えるものは公開されていませんでした。
そこで，ELYZA社が提供するLlamaをOllamaで動かす手順を開設する記事を見つけ，ggufファイルがあれば可能なのではないかと思いつきました。

https://qiita.com/s3kzk/items/3cebb8d306fb46cabe9f

再度Hugging FaceでELYZA-japanese-CodeLlama-7bのggufファイルが提供されていないか調べたところ

https://huggingface.co/mmnga/ELYZA-japanese-CodeLlama-7b-instruct-gguf

を見つけました。Ollamaを使ってダウンロードし利用できるコマンドがそちらで公開されています。

いくつか量子化のバリエーションがあるので，どれを使えばよいか迷ったのですが，こちらの記事を参考に選択しました。

https://note.com/bakushu/n/n1badaf7a91a0

試すだけであればまずはQ2_Kでしょうか。試したのですがうまく動かず，Q5_K_Mで動作を確認しました。

https://qiita.com/p_kato/items/63615480249e85dc8f29

と同じようにOllamaのプラグインで指定するモデル名を
hf.co/mmnga/ELYZA-japanese-CodeLlama-7b-instruct-gguf:Q2_K
に変更すれば利用できます。

関数一つを対象にして試してみたところ，モデルはVRAMに収まっていたのですがcodeLlamaより処理に結構な時間がかかりました。出力された内容もちょっと怪しいです。
かなり長いプロンプトを処理を始める前に渡しているようで，日本語にはそれが反映されないのではないかと感じました。

日本語での運用にはまだ課題がありそうですが，別のLLMモデルを試すことができて興味深かったです。

皆様の参考になれば幸いです。使い方などで問題があればお知らせいただけるとありがたいです。
辞書（`dict`）、リスト（`list`）、タプル（`tuple`）、集合（`set`）の違い


---

### 1. **リスト（`list`）**

#### 特徴:
- **順序あり**: 要素が挿入された順番を保持します。つまり、インデックス番号を使って要素にアクセスできます。
- **可変**: リストの要素は追加、削除、変更が可能です。
- **重複を許可**: 同じ要素を何度でも追加できます。

#### 使い方:
```python
fruits = ["りんご", "みかん", "バナナ"]
```

#### 用途:
- 順序が重要なデータを扱いたい場合。
- データの追加や削除が頻繁に行われる場合。

#### 主な操作:
- 要素の追加: `append()`
- 要素の削除: `remove()`
- インデックスでのアクセス: `fruits[0]` など

---

### 2. **タプル（`tuple`）**

#### 特徴:
- **順序あり**: リストと同様に、順序が保持され、インデックス番号で要素にアクセスできます。
- **不変**: 一度作成したタプルは、要素の追加、削除、変更ができません。
- **重複を許可**: 同じ要素を複数回追加できます。

#### 使い方:
```python
vegetables = ("にんじん", "トマト", "キャベツ")
```

#### 用途:
- データの内容が変わらないことが保証されている場合（例: 座標、設定値など）。
- リストよりもメモリ効率がよいため、変更の必要がない固定データを扱う際に使います。

#### 主な操作:
- インデックスでのアクセス: `vegetables[1]` など
- 要素数の取得: `len(vegetables)`

---

### 3. **辞書（`dict`）**

#### 特徴:
- **キーと値のペア**: 辞書はキーと値の組み合わせでデータを格納します。キーを使って値にアクセスします。
- **順序あり（Python 3.7以降）**: 挿入順序を保持します。
- **可変**: キーと値のペアは追加、削除、変更が可能です。
- **キーは重複不可**: 同じキーを2つ持つことはできませんが、値は重複可能です。

#### 使い方:
```python
fruit_prices = {"りんご": 100, "みかん": 80, "バナナ": 120}
```

#### 用途:
- 各キーに関連する値を格納する場合（例: 商品とその価格、名前と年齢など）。
- キーを使って効率的にデータにアクセスする必要がある場合。

#### 主な操作:
- 値の取得: `fruit_prices["りんご"]`
- 新しいキーと値の追加: `fruit_prices["いちご"] = 300`
- キーの削除: `del fruit_prices["バナナ"]`

---

### 4. **集合（`set`）**

#### 特徴:
- **順序なし**: 集合は順序を保持しません。要素にインデックスでアクセスできません。
- **可変**: 要素の追加や削除が可能です。
- **重複不可**: 同じ要素を複数回持つことはできません。自動的に重複を排除します。

#### 使い方:
```python
fruit_set = {"りんご", "みかん", "バナナ"}
```

#### 用途:
- 重複する要素を排除したい場合（例: 一意なデータのコレクション）。
- 集合論的な操作（例: 積集合、和集合、差集合）を扱う場合。

#### 主な操作:
- 要素の追加: `fruit_set.add("ぶどう")`
- 要素の削除: `fruit_set.remove("りんご")`
- 和集合: `set1.union(set2)`
- 積集合: `set1.intersection(set2)`

---

### 違いのまとめ:

| 特徴           | リスト（`list`）       | タプル（`tuple`）      | 辞書（`dict`）           | 集合（`set`）             |
| -------------- | ---------------------- | ---------------------- | ------------------------ | ------------------------ |
| **順序**       | あり                   | あり                   | あり（Python 3.7以降）   | なし                     |
| **可変性**     | 可変                   | 不変                   | 可変                     | 可変                     |
| **重複**       | 許可                   | 許可                   | キーは不可、値は許可     | 不可                     |
| **データ構造** | 要素の集まり           | 要素の集まり           | キーと値のペア           | 要素の集まり             |
| **アクセス方法** | インデックス           | インデックス           | キー                     | 要素存在の確認のみ       |

---

### どのデータ型を使うべきかのポイント：

- **リスト**: 順序が重要で、データを頻繁に変更する必要がある場合に使います。
- **タプル**: 変更しないデータを効率的に保持する場合に使います。
- **辞書**: キーと値の対応関係を持つデータを管理したいときに使います。
- **集合**: 重複を許さない、順序が不要なデータを管理したいときに使います。
Differences between Drasi’s continuous query and Elasticsearch’s percolate query

# Motivation
When I saw this article, I thought the way Drasi's continuous query applies queries to events was similar to Elasticsearch's percolate query.

[Microsoft Introduces Drasi: Open-Source System for Real-Time Event Processing and Automation](https://www.infoq.com/news/2024/10/drasi-open-source-system/)

This article is the result of asking Gemini about it.


# Are they same?
While both Elasticsearch's percolate query and Drasi's continuous queries deal with matching incoming data against predefined queries, there are some key differences.

# Elasticsearch Percolate Query:
 * Focus: 
   * Primarily designed for indexing queries and then matching documents against those queries. It's like asking "Which of these registered queries does this document match?"
 * Mechanism: 
   * You register your queries in an Elasticsearch index. When you "percolate" a document, it's indexed into a temporary in-memory index and compared against the registered queries.
 * Use Cases: 
   * Alerting, classification, and real-time analytics based on matching documents to predefined criteria.

 # Drasi Continuous Query:
 * Focus: 
   * Geared towards real-time event processing and automation. It's like saying "Whenever an event happens that matches this condition, take this action."
 * Mechanism: 
   * Continuous queries are defined as part of a Drasi pipeline. Incoming events are evaluated against these queries, and matching events trigger actions (e.g., sending notifications, updating databases, or invoking other services).
 * Use Cases: 
   * Real-time monitoring, automated responses to events, and complex event processing in applications like IoT, fraud detection, and business process automation.

# Key Differences Summarized:
| Feature | Elasticsearch Percolate Query | Drasi Continuous Query |
|---|---|---|
| Primary Purpose | Match documents to queries | Trigger actions based on events |
| Scope | Primarily within Elasticsearch | Part of a larger event processing pipeline |
| Action Trigger | Matching a document | Matching an event |
| Typical Use Cases | Alerting, classification | Real-time monitoring, automation |

# In essence:
 * Percolate queries are about finding which queries a document matches.
 * Continuous queries are about taking actions when events match specific conditions.

While they share similarities in the concept of matching, their purpose and implementation within their respective systems are distinct.
【備忘録】Udemy講座まとめ JavaScript vol.4 if文 条件分岐

# if文

```JavaScript:JavaScript
if (true){
console.log("OK");
}

```
コンソールにはOKが出る
()の中が条件となり、trueだった場合、{}の中が実行される
falseには実行されない



# else文

```JavaScript:JavaScript
let ok =false;

if (ok){
console.log("OK");
}else{
  console.log("NO");
}
```

elseはif文の()がfalseだった場合、実行される
この場合は、NOが出る



# else if

```JavaScript:JavaScript
let ok =false;
let maybeOk =true;

if (ok){
console.log("OK");
}
else if(maybeOk){
  console.log("maybe Ok");
}
else{
  console.log("NO");
}
```
この場合、maybe Okがコンソールに出る
まずif文が、「false」なので、else ifに行き、else ifが「true」の為、実行される


# ===  や　!==

```JavaScript:JavaScript
let okk = 1 === 1;
console.log(okk);

let okkk = 1 !== 2;
console.log(okkk);
```
両方、「true」が出る
「===」は、同じ値か、「!==」は違う値であれば、trueが表示される
Linux mintでbeatorajaを遊ぶ

# 書いた日、使ったもののバージョン
2024/10/25
beatoraja0.8.8
Liberica JRE 21 Full

# beatoraja本体 
https://mocha-repository.info/download.php
リンクから最新のものをダウンロードしましょう。
今回はbeatoraja0.8.8-modernchicというものを選びます。
解凍して適当な場所に置いておきましょう。

# JRE (java runtime environment), javaFX
beatorajaを動かすにはjavaの実行環境、JREと、javaFXなるものが必要なようです。
JREには色々種類があるようで、本家oracleの提供するものやオープンソースのopenJDKなどが有名らしいです。今回はjavaFX同梱のものが欲しいので、bellsoftのLibericaJDKを選びました。
https://bell-sw.com/pages/repositories/#apt
上のリンクを参考にインストールしました。
```
wget -q -O - https://download.bell-sw.com/pki/GPG-KEY-bellsoft | sudo apt-key add -
echo "deb [arch=amd64] https://apt.bell-sw.com/ stable main" | sudo tee /etc/apt/sources.list.d/bellsoft.list
```
```
apt update
apt install bellsoft-java21-runtime-full
```

:::note info
インストール可能なバージョンは
```
apt search bellsoft
```
等で確認できます。今回はLTSのうちで最新(java21)、かつ実行環境のみ(runtime)で、javaFXも同梱(full)のjava21-runtime-fullを選びました。
:::

インストールが済んだらターミナルで
```
java -version
```
などとしてインストールが成功していることを確認しましょう。

# beatorajaの起動
端末を開き、beatoraja本体のあるディレクトリに行き、
```
./beatoraja-config.command
```
でbeatorajaの設定画面が起動すれば成功です。
ここまでくれば、遊び方や曲,難易度表の追加、スキンの変更方法等はOSに依らないので割愛します。

# 他のJREがある場合
すでに他のJREがインストールされている場合、そちらのJREが使われてしまって、バージョンが古いとか、javaFXがないとか言われるかもしれません。使うJREを指定する方法を2つ紹介します。

ひとつはupdate-alternativesを使う方法です。
```
sudo update-alternatives --config java
```
このコマンドを使うと、どのJREを優先的に使うかを選ぶことができます。
    この方法だと、普段他のJREを使っているという場合に切り替えが必要になり、面倒かもしれません。

もうひとつは、beatoraja-config.commandの中身を編集する方法です。
beatoraja-config.commandの中身を覗くと、色々と必要なオプションをつけてbeatoraja.jarを実行するという、単純なシェルスクリプトであることがわかります。
```beatoraja-config.command
#!/bin/bash
export _JAVA_OPTIONS='-Dsun.java2d.opengl=true -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel'
cd "$(dirname "$0")"
exec java -Xms1g -Xmx4g -jar beatoraja.jar
```
最後の行のjavaの部分を、使いたいJREの絶対パスに置き換えてあげればよさそうです。私の場合は
```beatoraja-config.sh
#!/bin/bash
export _JAVA_OPTIONS='-Dsun.java2d.opengl=true -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel'
JRE='/usr/lib/jvm/bellsoft-java21-runtime-full-amd64/bin/java'
cd "$(dirname "$0")"
exec $JRE -Xms1g -Xmx4g -jar beatoraja.jar
```
こんな風にして、beatoraja-config.shという別の名前のファイルを作りました。
JRE=の右辺は環境によって異なると思うので適宜確認して書き換えましょう。

# おわりに
私はjavaのことは何も知らないので、JREやjavaFX等のことに関して間違いやもっといい方法等あれば、コメントしていただければと思います。
自己紹介

# はじめに
初Qiita投稿失礼するゾ〜（謝罪）
プログラミングほぼ未経験なのでQiitaを通して学んでいけたらなと思います。
# 自己紹介
プログラミングほぼ未経験の中学3年生です。
淫夢厨です。
# これからしていきたいこと
・HTML,CSS,JavaScriptを用いたウェブページ制作
・Flutterでのモバイルアプリの制作
・Python,Node.js,C#,Java,などの言語も使っていきたいです。
・AIなどを使ったシステムも開発していきたです。
# 最後に
これら全てできるかわかりませんが、できるだけやっていこうと思います。
よろしくお願いします
```html:X
@mori1223_mania
```
業務効率化の鍵！ASTERIA Warpで始めるEAIの世界

はじめまして！[SCSK株式会社](https://www.scsk.jp/product/common/asteria/)です！

皆さん、<font color="red">EAIツール「ASTERIA Warp」</font>という製品をご存じですか？
そもそもEAIツールという言葉を初めて聞いたという方もいらっしゃるかもしれません。
今回は、企業のITインフラを支える存在、<font color="red">EAI</font>（Enterprise Application Integration）について、そして私たちがおすすめする「<font color="red">ASTERIA Warp</font>」というEAIツールをご紹介します。

https://www.scsk.jp/product/common/asteria/

# EAI（Enterprise Application Integration）とは？
EAIは、エンタープライズ・アプリケーション・インテグレーションの略で、企業内で使用される複数のアプリケーションやデータを連携・統合するソフトウェアソリューションです。
企業が使用するアプリケーションは、多くの場合、異なるベンダーから提供され、異なる技術スタックやプロトコルを使用しています。これらのアプリケーション間のデータ連携がスムーズでないと効率的な業務自動化やデータ活用が妨げられます。
ここで登場するのが<font color="red">EAI</font>です。

![EAIとは.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919043/c95ac3e8-1351-be4d-5587-de6f9ca9968b.png)


# なぜEAIが必要なのか？
企業が直面する主要な課題を、EAIは次のように解決します。
<dl>
  <dt>1.異なるシステム間のデータ連携</dt>
  <dd>ERP、CRM、SCMなどの異なるシステム間でデータ連携が容易になり、<font color="Blue">データの一貫性と正確性</font>を確保します。</dd>
</dl>
<dl>
<dt>2.業務プロセスの最適化</dt>
  <dd>異なるアプリケーション間で業務プロセスを連携し、<font color="Blue">業務全体の効率を向上</font>させます。例えば、受注管理システムと在庫管理システムを連携させることで、受注から出荷までのプロセスを自動化し、迅速かつ正確な対応が可能になります。</dd>
</dl>
<dl>
  <dt>3.コスト削減</dt>
  <dd>手作業によるシステム間のデータ入力やプロセスの連携が不要になり、人的ミスも減少。<font color="Blue">運用コストの削減</font>が期待できます。</dd>
</dl>
<dl>
  <dt>4.迅速なビジネス対応</dt>
  <dd>市場環境が急速に変化する中で、企業は迅速に新しいビジネス要件に対応する必要があります。EAIはシステム変更や新しいアプリケーション導入を容易にし、<font color="Blue">ビジネスの柔軟性と競争力</font>を高めます。</dd>
</dl>

# EAIツール【ASTERIA Warp】
数あるEAIツールの中で、私たちがおすすめするのが「<font color="Red">ASTERIA Warp</font>」です。

ASTERIA WarpはEAI/ESB市場シェア17年連続No.1のノーコードEAI製品（※）で、10,000社以上(2023年8月末時点)の企業での導入実績を誇るデータ連携ツールです。
アイコンのドラッグ＆ドロップとプロパティ設定で作成するフローによって、既存のデータベース、ファイルシステム、各種業務システム、各種クラウドサービスと簡単に接続、連携することができます。専門的な技術者向けではなく、より多くの人に使って頂くことを念頭に置いて設計されたASTERIA Warpは、ノン・プログラミング開発で幅広い業種の方々に最良の製品です。

※テクノ・システム・リサーチ「2023年ソフトウェアマーケティング総覧 EAI/ESB 市場編」より

![ASTERIA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919043/81743d75-35ac-b7e4-8400-8da38f2e9e5e.png)

# ASTERIA Warpの特徴
<dl>
  <dt>低コスト・短期開発を実現！</dt>
  <dd>「<font color="Blue">ノン・コーディング</font>」をコンセプトにGUIベースで提供される開発環境により、"開発期間の短縮" や "開発コストの大幅な削減" が実現できます。</dd>
</dl>
<dl>
  <dt>専門スキル不要！</dt>
  <dd>コンポーネント化された処理アイコンを並べて設定していくだけで開発が可能なため、システムの変更や追加など、開発後のメンテナンスも、特定のエンジニアのスキルに依存することなく容易に行なうことができます。</dd>
</dl>
<dl>
  <dt>日々の業務の「自動化」で業務効率を向上</dt>
  <dd>ASTERIA Warpは日々行なっている業務を自動化します。様々な日々のメールやExcelを使った定型業務を自動化することで<font color="Blue">作業コストの削減</font>だけでなく、必ず発生する<font color="Blue">人為的なミスの低減</font>にも貢献します。</dd>
</dl>

![フローデザイナー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919043/a2c01ff4-c27d-c826-08bf-743224790849.png)

# おわりに
今回は、EAIとASTERIA Warpの基本についてご説明しました。次回以降は、ASTERIA Warpの具体的な活用例や便利な機能をご紹介しながら、ASTERIA Warpの魅力をもっとお伝えいたします。

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


<font color="Blue">※SCSK株式会社はASTERIA Warpのマスターパートナーです。15年以上の販売実績および、様々な業種・業務での構築ノウハウによりお客様をサポート致します。
※SCSK株式会社では、EAIの導入支援や最適なソリューションの提供を通じて、企業のIT環境をサポートいたします。EAIに関するご相談や詳細については、ぜひお気軽にお問い合わせください。</font>

https://www.scsk.jp/product/common/asteria/
Rakeタスク．．．タスク（作業）の自動化について

# はじめに
この記事は、Ruby on rails 初心者が備忘録として作成したものです。なにか間違い等ありましたら、ご指摘よろしくお願いします。


# Rakeタスクとは？
- **Rubyコードでタスクとして作成し、必要なときに実行することができる**
　=> Rake は Ruby のビルドツールで、タスク（作業）を自動化
- **この時に実行する処理内容がrakeタスク**
　=>`Rakefile`に定義
- **Rake タスクの用途**
　=>データベースの初期化や更新
　  　定期的なデータのクリーンアップや集計
    　　 バッチ処理の実行
    　　 テストの実行や自動化されたタスクの実行　等々…

       
`要するに、定期的なメール送信、古いデータのクリーニング（例：ｘ日以上経ったログデータや不要なキャッシュを削除する処理）、記事等の自動公開が可能に。`

- **Rake と Whenever の連携**
Rakeタスクは単体では手動でコマンドを実行する必要がありますが、Wheneverを使うと、任意のタイミングで自動で実行できるようになる。
# Rakeタスクの作成
- **/lib/tasks  フォルダ配下に.rakeファイルを作成**
```
namespace :名前空間 do
  desc タスク説明
    task タスク名 do
      タスク本体
    end
end
```
# Wheneverの設定
- `gem 'whenever'`
  cronの設定を、rubyの簡単な文法で扱えるようにしたライブラリ
  cron = 定期的にコマンドを実行するためにメモリ場で常に命令を待機しているプロセス
  
詳細は以下の記事を参照ください
https://qiita.com/mmaumtjgj/items/19e866f31541abb6c614

-`config/schedule.rb`を開いて、以下を追加
```
every <頻度> do
  rake "<タスク名>"
end
```
例
```
job_type :rake, "cd :path && :environment_variable=:environment bundle exec rake :task --silent :output"

every 1.hour do
  rake "publish:change_status"
end
```
- <頻度>には`1.day` `1.week` `1.minute`  `1.month` `1.year`などの単位を指定できる
# Cronジョブの更新
- 設定が完了したら、以下のコマンドを実行してCronジョブを更新
```
whenever --update-crontab
```
- Cronジョブが正しく設定されているか確認するために、以下のコマンドを実行
```
crontab -l
```
# 参考
https://github.com/javan/whenever

https://medium.com/@hasnatraza.dev/rails-cron-jobs-task-scheduling-in-rails-f7662106feaa

https://qiita.com/mmaumtjgj/items/19e866f31541abb6c614

https://opiyotan.hatenablog.com/entry/rails-rake-task
Dockerで「no space left on device」エラーに対応する方法（MacOS）

## 背景
Dockerを使って開発をしていると、たまに「no space left on device」というエラーメッセージに遭遇することがあります。

これはディスク容量不足が原因で発生するエラーで、特に大規模なプロジェクトを扱っているときに発生しやすい問題です。

この記事では、実際に私が遭遇した問題を元に、ディスク容量不足の解消方法について解説します。

## エラーメッセージの概要
今回遭遇したエラーメッセージは次の通りです。

```zsh:zsh
compile: writing output: write $WORK/b568/_pkg_.a: no space left on device
Go
```

アプリケーションをDockerコンテナ内でビルド中に発生しました。
これは、「ディスクに書き込む際に空き容量が足りない」という意味です。
なので、早速、ディスクの使用状況を確認してみました。

## ディスクの使用状況を確認する
まず、ターミナルで df -h コマンドを実行して、システム全体のディスク使用状況を確認します。

```zsh:zsh
df -h
```

出力結果は次のようなものでした。

```zsh:zsh
Filesystem        Size    Used   Avail Capacity Mounted on
/dev/disk3s5     460Gi   431Gi    10Gi    98%   /
```

この結果から、`/` ディレクトリに割り当てられているディスク容量が 98% 使用されており、空き容量がほとんどないことがわかります。ディスク容量不足が原因でエラーが発生していたことが確認できました。

## ディスク容量を開放する方法

次に、ディスク容量を解放していくためにいくつかの手順を試しました。以下はその詳細です。

### 1. 不要なファイルを削除する
まずは、個人のホームディレクトリなどにある不要な大容量ファイルを削除しました。大きなファイルを確認するためには、次のコマンドが便利です。

```zsh:zsh
du -sh ~/* | sort -h
```

このコマンドを実行すると、ホームディレクトリ内の各ファイルやフォルダのサイズを確認でき、不要なファイルを見つけて削除できます。

### 2. 古いログファイルやキャッシュを削除する
システムやアプリケーションのキャッシュが大量に残っている場合があります。次のコマンドを使ってキャッシュを削除しました。

```zsh:zsh
rm -rf ~/Library/Caches/*
```

この操作でシステム全体のキャッシュファイルを削除でき、かなりのディスク容量を確保できました。


### 3. 不要なDockerイメージやコンテナの削除
Docker自体も、多くのイメージや停止中のコンテナ、ボリュームなどが溜まっていることがあります。これらは次のコマンドで一括削除できます。

```zsh:zsh
docker system prune -a --volumes
```
このコマンドを実行すると、使われていないイメージ、コンテナ、ネットワーク、ボリュームをすべて削除できます。

### 4. 一時ファイルのクリーンアップ
次に、`/tmp` ディレクトリにある一時ファイルを削除して、さらにディスク容量を開放しました。

```zsh:zsh
sudo rm -rf /tmp/*
```

### 5. ディスク使用状況の再確認
これらの手順を実施した後、もう一度 `df -h` を実行してディスクの空き容量を確認しました。

```zsh:zsh
df -h
```

出力結果が改善され、十分な空き容量が確保されていることを確認しました。

### 6. Dockerビルドの再試行
ディスク容量が確保できた後、再度Dockerコンテナのビルドを試みました。

```zsh:zsh
docker compose down
docker compose up --build
```

今度はエラーなくビルドが完了し、コンテナが正常に立ち上がりました。

## まとめ
Dockerで「no space left on device」というエラーが発生した場合、最も一般的な原因はディスク容量の不足です。
今回のケースでは、不要なファイルやキャッシュ、Dockerイメージを削除することで問題を解決できました。
最後に、以下のポイントを押さえておくと、同様の問題が再発したときに迅速に対応できるでしょう。

- ディスク容量を定期的に確認し、必要に応じてクリーンアップする
- Dockerのキャッシュや古いイメージ、コンテナを定期的に削除する
- 不要な一時ファイルやキャッシュを溜め込まないように注意する

これで、ディスク容量不足に起因するDockerの問題を回避できるはずです。

## 【追記】macOSのキャッシュフォルダーの整理について
macOSのキャッシュフォルダーにはシステムやアプリケーションが使用する一時的なファイルが保存されており、場合によっては削除することでディスクスペースを節約できますが、削除の際には注意が必要です。

私の場合は、かなり圧迫していましたので、対応しましたが、人によっては不要かもしれません。

以下に解説を付け足します。

### キャッシュの場所と役割
キャッシュフォルダーはシステムの一時ファイルを保存する場所であり、主に以下の3つのディレクトリに分かれています。

- /System/Library/Caches: システムが使用する小さなキャッシュが多く、基本的に役に立つため削除は推奨されません。
- /Library/Caches: より削除しやすいキャッシュが含まれており、頻繁に削除してもシステムには大きな影響がありません。
- ~/Library/Caches: ユーザーアカウント専用のキャッシュフォルダーで、多くのアプリケーションがキャッシュをここに保存します。このため、アプリの数に応じてサイズが大きくなる傾向があります。

### 削除の目安
/Library/Cachesのサイズが3GBを超える場合、キャッシュが過剰に蓄積されている可能性があり、一部のファイルを削除するとディスクスペースが空くことがあります。一般的にはサイズを基準に整理し、年数などの経過した時間は気にしなくてもよいとされています。

## お疲れ様でした。
わからないところ、間違っているところ、もっといい方法がある場合は、コメントでもDMでも教えてください。
【Jquery】【Javascript】hide showをまとめたい

# 従来のコード
```javascript
    $("h2.result").show();
    $("p.result").show();
    $("p.osusume-result").show();
    $(".result-link").show();
    $("p.one-more").show();
```

# まとめたやつ
```javascript
const elements = ["h2.result","p.result","p.osusume-result",".result-link","p.one-more"];
$(elements.join(", ")).show();
```


# これでもいける
```javascript
const elements = ["h2.result","p.result","p.osusume-result",".result-link","p.one-more"];
$(`${elements}`).show();
```
3Dスキャンモデルの寸法を簡単に取得する方法とコツ

**タイトル：3Dスキャンモデルの寸法を簡単に取得する方法とコツ**

3Dスキャナーでモデルを取得した後、正確な寸法を測定することはその後の応用で重要なステップとなります。製造業やデジタルツイン、3Dプリントのいずれの用途であっても、正確な寸法データは最終結果に直接影響を与えます。ここでは、3Dモデルの寸法を取得するための一般的な方法とツールを紹介し、簡単に測定できるようサポートします。

### 1. スキャナーの付属ソフトを使用する

多くの3Dスキャナーには基本的な測定ツールが搭載されています。スキャン完了後、ソフト内の測定ツールを選択することで、モデル上にマークを付けて寸法を取得できます。ただし、このようなソフトウェアの測定機能は単純なニーズに適しており、複雑な測定が必要な場合は、専門的なソフトウェアにエクスポートする必要があるかもしれません。
![23cd1b4789bfd348466270fcfd247b5a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/8d14cbcd-0e87-9a14-c0a4-176454ca0b00.png)

https://www.revopoint3d.jp/collections/3d-scanners

### 2. 3Dデザインソフトにエクスポートして測定する

精密な測定が必要な場合は、Blender、MeshLab、ZBrushなどの専門的な3Dデザインソフトに3Dスキャンファイルを取り込むのが有効です。これらのソフトウェアは正確な測定をサポートするだけでなく、モデルの編集や最適化も可能です。Blenderを例に取ると、ファイルをインポートした後に「計測」ツールで任意の2点間の距離をマークできます。また、ZBrushのようなツールでは、メッシュ編集機能を使用して、さらなる精細なデータを提供できます。
![4c5c591d85e0ea4546b1bcac7ac0a1e4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/1f309193-faf0-a278-7da3-ba1432e78277.png)

### 3. CADソフトを使用してさらに精密に測定する

3DモデルがCADデザインと組み合わせて使用される場合は、AutoCADやSolidWorksなどのCADソフトが最適です。これらのソフトは、正確な寸法測定やエンジニアリング図面の作成を可能にし、製造業や建築分野に適しています。スキャンモデルをインポート後、モデル上の寸法を直接マークしたり、構造解析や誤差校正を行うこともできます。
![6bf5894f11fce48de45ff40cc22c4dd6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/cbd63b00-e13a-8bd2-d50f-27c602ba7858.png)

### 4. オンライン測定ツールを利用する

複雑なソフト操作に慣れていないユーザーには、オンラインの3Dモデル測定ツールが便利な代替手段です。いくつかのオンラインプラットフォームでは、3Dファイルを直接アップロードして寸法を測定でき、ソフトウェアのインストールが不要です。例えば、Thangsなどのプラットフォームでは、簡単な寸法の確認機能を提供し、体積や面積などのパラメータも測定できるため、小規模なプロジェクトや迅速なニーズに最適です。

### まとめ

3Dスキャンモデルの寸法を取得することは、その後の用途で重要なステップです。以上の方法により、基本的なものから専門的な測定方法まで、様々な手段が提供されています。プロジェクトのニーズに応じて適切な測定方法を選ぶことで、データの正確性が確保され、作業効率も向上します。スキャナー付属ソフト、3Dデザインソフト、CADソフト、またはオンラインツールのいずれかを使用すれば、効率的な測定体験を得られるでしょう。