OmniAICreator/Qiita-1.07M huggingface dataset:
スティッキーズを表示するだけのシンプルなAppleScript

# どういうものか
実行するとスティッキーズを起動し、
もし付箋がなければ新しく右上に作成するだけの簡単なAppleScriptです。

# コード
```AppleScript
-- スティッキーズアプリケーションを起動
tell application "Stickies"
	activate
end tell

tell application "System Events" to tell process "Stickies"
	-- 前面に出す
	set frontmost to true
	
	-- stickyが一つもない時の処理
	if (count of windows) = 0 then
		-- メニューを叩いて新しいstickyを作成する
		tell menu item 1 of menu 3 of menu bar 1 to click
		-- 画面左上に移動する
		set size of window 1 to {350, 220}
		set position of window 1 to {50, 50}
	end if
end tell
```
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（47/100）

≪問題47≫
あなたの会社では製造プロセスごとに仕様が異なる品目を製造しています。この情報をロジスティクスのすべての領域で使用/追跡できるようにするには、SAPS/4HANAで以下のどのアプリケーションを使用する必要がありますか。
□設計変更管理
□プロセス指図管理
□品質管理
□ロット管理

≪解答≫
□設計変更管理
□プロセス指図管理
□品質管理
■ロット管理

≪解説≫
◆業種（特にプロセス産業）によっては、品目や製品の同種のサブセット、つまり会社のサプライチェーン全体に沿ったロット（品目のロット番号）を使用する必要がございます。
◆ロット管理は、SAP S/4HANAのアプリケーションと統合されており、会社のビジネスプロセス内のロットを管理し、処理するのに役立ちます。特に、サプライチェーンマネジメント（SCM）にロット管理が使用されます。ロットは、原材料のエントリから最終製品の生産、得意先への販売と出荷に至るまで、サプライチェーン全体で追跡することができます。
◆サプライチェーンのさまざまな場所でロットを品目に割り当てるには、ロットマスタレコードを登録する必要がございます。例えば、ロット管理が適用される品目のサブセットが特定の規格を使用して製造プロセス（プロセス指図）を終了すると、ロット番号とともに在庫に転記されるため、明確に識別することができます。
Docker、AKS（kubenet／Azure CNI）ネットワークモデルの比較まとめ

# はじめに
4回に分けてDockerとAzure Kubernetes Service（以下、AKS）の内部ネットワーク構造に注目し、深堀りしていきます。最終回では、両者を比較し共通点・相違点についてまとめます。

最終回は、Dockerのbridgeネットワークモデル、AKSのkubenetネットワークモデル、Azure CNIネットワークモデルにおける内部構造について比較した結果をまとめます。
なお、検証環境は以下の通りです。

### 検証環境（Azure VM）
OS：Linux (ubuntu 20.04)
Size：Standard D2s v3 (2 vcpus, 8 GiB memory)

### 前回の記事

https://qiita.com/maplejava/items/a70ef1a4e62b73085aa1

https://qiita.com/maplejava/items/a821fca27aa2e9e5d94e

https://qiita.com/maplejava/items/7c207e9192d811d5e194

### 注意点
この記事の検証時点でのAKSのネットワークモデルは「kubenet」と「Azure CNI」の2つでしたが、それぞれ2024年6月頃に名称が変更になり技術要素も（微妙に）変わりました。それぞれ現在では「Azure CNIオーバーレイ」と「フラットネットワーク」という名前になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/b83d197e-b784-d1ce-20b5-8a6017f0a05a.png)

よって「kubenet」「Azure CNI」ネットワークモデルはレガシなモードとなりましたが、根本的な考え方は同じですし、Dockerとの比較という意味で検証内容自体は参考になると思いますので、以下に整理していきます。

参考

https://learn.microsoft.com/ja-jp/azure/aks/concepts-network-cni-overview

# Dockerとは
- アプリケーションとその依存関係を”コンテナ”と呼ばれる包装にパッケージ化できるプラットフォーム
- HyperVisorによるゲストOS仮想化と比べると、軽量でリソース効率的と言われている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/acb33bed-d56b-0012-18e6-a16cdcc537f3.png)

インストール方法やコマンド等は以下の記事を参考にして下さい。

https://qiita.com/maplejava/items/7429dfe7c8f33fa7f8eb

# Kubernetesとは
- コンテナ化されたアプリケーションのデプロイメント、スケーリング、および管理を自動化するオープンソースのコンテナオーケストレーションプラットフォームです。以下、k8sと記載します。
- クラウドではサーバ機器や回線など物理的な要素が抽象化されていますが、kubernetesでは負荷分散やIaaSとしてのサーバ、ルーティングテーブルなどのコンポーネントが抽象化されています（ServiceやNode、Podなど）。
- AKSの裏ではAzure Load Balancer、仮想マシンスケールセット（VMSS）、OSのiptablesなどのコンポーネントが組み合わさってk8sの機能が実装されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/79035826-00fc-d3db-1289-80130522c66f.png)

詳しくは以下の以前の記事を参考にしてください。

https://qiita.com/maplejava/items/d56983a194c2448952c3

# AKSとは
AKSはフルマネージドKubernetesサービスです。AKSは、Kubernetesクラスタのデプロイ、管理、スケーリングを簡素化することを目的としています。

詳しくは以下の以前の記事を参考にしてください。

https://qiita.com/maplejava/items/f5e9ce8ba21afeb02d4b

# 整理結果
### bridgeとNAT
Docker、kubenet、Azure CNIのbridgeモード全てにおいて仮想ブリッジが作成され、コンテナ（もしくはPod）間の通信はこのbridgeを経由して行われます。また、基本的にはコンテナ（もしくはPod）からホスト（もしくはNode）への通信はブリッジにてNATされます。
しかし、kubenetにおいてAKSクラスタ内のNodeに対する通信は例外で、UDRによってIPフォワーディングされる仕様となっています。

また、Azure CNIのtransparentモードにおいては仮想ブリッジは作成されず、SDNの世界でL3ルーティングされます。

### ネットワーク名前空間
どのネットワークモデルにおいて、コンテナ（もしくはPod）ごとに一つのネットワーク名前空間が与えられることで、これにより、コンテナ（もしくはPod）間やコンテナ-ホスト間（もしくはPod‐Node間）のネットワークを隔離しています。

### サブネット
コンテナ（もしくはPod）のサブネットと、ホスト（もしくはNode）のサブネットは基本的には異なります。
しかし、Azure CNIにおいてはPodとNodeのサブネットが同じで、Podが直接VNetに接続されているイメージとなっています。

# まとめ
上記をまとめると以下の表になります。
bridge、ネットワーク名前空間、サブネット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/ea8ea7e6-cb9f-06f3-fbb5-a86631599fea.png)
ホスト間（Node間）通信
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/5a9fcb34-0ebb-3470-8ebf-2533eefe54d7.png)
【新入社員必見】Windows標準機能以外のスクリーンショットのオススメレポート

# 概要
先日、以下の記事でWindowsOS標準のスクリーンショットについて、記載いたしました。

https://qiita.com/kyuu2197/items/4a07cbf813fc3f5df7c5

今回はWindows標準ではない、スクリーンショットを御紹介いたします。

# スクロールを伴う画面キャプチャーを撮りたい時
スクリーンショットを撮りたい対象がインターネットとなると、スクロールを伴うスクリーンショットを撮りたい場面がきっとあるはずです。
今回は２つのやり方を御紹介致します。

## ➀、FireShot
１つ目は『FireShot』というChormeの拡張機能です。
こちらは１度インストールしてしまえば、次回から面倒な手順が必要ないので、大変重宝しております。

### 導入方法
➀、以下のリンクから『Chromeウェブストア』にアクセスする。
https://chromewebstore.google.com/?hl=ja

➁、「FireShot」を検索し、検索結果から『FireShot』を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/f739f624-afac-ecdc-fc92-5c820e3a2654.png)
上手くいかなかった場合、以下のリンクから遷移も可能

https://chromewebstore.google.com/detail/%E3%82%A6%E3%82%A7%E3%83%96%E3%83%9A%E3%83%BC%E3%82%B8%E5%85%A8%E4%BD%93%E3%82%92%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-firesh/mcbpblocgmgfnpjjppndjkmgjaogfceg?hl=ja


➂、『Chromeに追加』を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/47b1fbfa-8e22-69d8-9a1d-4e31c09a1449.png)


➃、『機能拡張を追加』をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/3b0524a4-3560-022e-5a0c-8fdc6e64f1f3.png)


５、設定完了
以下の画面が表示されたら、設定完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/ec4e71fb-8445-73d8-4b4d-afad164748eb.png)

### スクリーンショットの種類
FireShotには以下のスクリーンショットの種類があります。

* ページ全体をキャプチャ（[Ctrl]＋[Shift]＋[S]キー or [Shift]＋[Alt]＋[1]キー）
* 表示部分をキャプチャ（[Shift]＋[Alt]＋[3]キー）
* 選択範囲をキャプチャ（[Shift]＋[Alt]＋[4]キー）

### 保存方法
FireShotの保存はファイル保存、クリップボードへの保存が選ぶことができます。
以下、FireShotのアクションです。

* 画像として保存
* PDFとして保存
* Email
* クリップボードにコピー
* 印刷

使いたい用途に併せて、使用しましょう！！


## ➁、Developerツール
ChormeのDeveloperツールを使うことで、スクロールを伴うChromeの画面も撮ることが出来ます。
ただし、Developerツールを使うと画面がタブレット表示になったりするので、➀での取得を検討し、保険的な立ち位置が良いと思う。

### やり方
➀、［F12］キーまたは［Ctrl］＋［Shift］＋［I］キーを押下し、Developerツールを開く。

➁、赤枠をクリックします。（青くなったことを確認します。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/893f1649-90a8-e0e1-d140-f9b5a66f4ab7.png)

➂、以下の赤枠をクリックし「フルサイズのスクリーンショットをキャプチャー」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618971/1c62d956-9952-73a0-b91b-11f1b4e3dcc8.png)

➃ダウンロードフォルダにファイル保存される
ダウンロードフォルダ「C:\Users\[ユーザ名]\Downloads」配下にファイル保存される。


# 最後に
はい、ということで今回はWindows標準以外のスクリーンショットをレポートしました。
最近のホームページは１ページが長いものが増えておりますので、今回の記事は大変重宝しますので、是非「いいね」や「ブックマーク」をお願い致します。

最後になりますが、この記事が皆さんの成長の少しでも手助けになることを祈って、この記事を閉めたいと思います。
最後までお読みいただきありがとうございました。
新人エンジニアが知っておくべき色の使い方

## はじめに
ソフトウェア開発において、コードの品質や機能だけでなく、見た目やユーザーエクスペリエンスも非常に重要です。特にフロントエンド開発やUI/UXデザインでは、色の使い方が大きな役割を果たします。しかし、新人エンジニアにとっては、どのように色を選び、どのように組み合わせるべきかが分からないことが多いでしょう。

そんな新人エンジニア向けにお勧めのサイトを紹介します。
※結局、普段の業務で一番参考にしているものは、作成しているサイトと類似している既存のwebサイトのカラーコードを確認してみることです。

## デジタル庁

https://design.digital.go.jp/foundations/color/?tab=overview

このサイトは無料で、色の使い方について教えてくれます。
変な参考資料にお金を払うより、初めにこのサイトを見たほうがためになりました。
このサイトが社会人一年目で一番お世話になりました。

※なんと、このサイトでは見やすさを追求して黒も #000ではないのです。

## 原色大辞典
https://www.colordic.org/

webのカラーコードを色と合わせて確認できる。
配色コードも乗っているので、迷ったときにはそのまま使うこともできるのでお勧め。

## Color Lisa

https://colorlisa.com/

色彩について勉強していなくても、感覚で配色パターンを選ぶことができるサイト。
選んだ後は、選んだ配色のコードを利用してサイトの配色をつけるだけ。



## 最後に
新人エンジニアにとって、色の使い方を理解することはプロジェクトの成功に繋がる重要なステップです。この記事で紹介した基本的な色の理論や配色のコツを活用し、より効果的なデザインを作成するための基礎を築いてください。

色の選び方や組み合わせ方を意識することで、ユーザーにとって使いやすく魅力的なアプリケーションを提供することができます。さらに、色の使い方を工夫することで、自分のプロジェクトに個性を持たせることもできます。

最後に、色の使い方は実践と経験が大切です。さまざまなプロジェクトで試行錯誤しながら、自分なりのスタイルを見つけていくことが成長への近道です。ぜひ、このガイドを参考にして、素晴らしいデザインを作り上げてください。
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（46/100）

【46日目】
トピック 5：SAPS/4HANAでのプロセス指図（3/6）

≪問題46≫
GMP（適正製造基準Good Manufacturing Practice）に準拠する製造プロセスをどのようにしてサポートしますか。 
（３つ選択）
□デジタル署名
□承認済リソース
□バッチ製造記録
□レシピ承認
□GMP準拠フラグ

≪解答≫
■デジタル署名
□承認済リソース
■バッチ製造記録
■レシピ承認
□GMP準拠フラグ

≪解説≫
◆米国が定めたGMP（Good Manufacturing Practices）に関するガイドラインは、プロセス産業の多くの領域で国際標準となっており、特に製薬業のプロセスで考慮される必要があります。
◆SAP S/4HANAにおけるGMP準拠の生産機能は、製薬業の特別な要件（安全な生産、製造物責任、関係文書の作成義務）を満たしており、以下のような機能が提供されています。
（1）承認されたレシピが存在する場合にのみプロセス指図を登録できるように指定することができます。
（2）品目ID機能を使用して、プロセス指図に対してピッキングされた品目が生産ラインで完全に利用可能であり、正しい順序で使用されるかどうかをチェックすることができます。
（3）生産プラントと研究室または品質保証システムの間で、製品品質に関する情報を交換することができます。（品質管理システム）
（4）品目調整機能を使用して、製造プロセス終了時の出庫および入庫転記の数量を分析および確認することができます。
（5）製造物責任に関して、ロットレコードにはロットの製造プロセスのすべての計画データと実績データが含まれます。
（6）デジタル署名機能を有効化して、特定のビジネスプロセスの実行をチェックおよび文書化することができます。
（7）バッチ製造記録によって、バッチの生産に関するすべての品質関連の計画データと実績データを含む記録が、偽造できない光学アーカイブに保存され、デジタル署名を使用して承認されます。
【Swift】@Observable に @MainActor つけてその親 View にも @MainActor をつける件


https://qiita.com/chanzmao/items/34bc283b9ff575099ce6

こうなりますよね。

![sc 2024-07-07 at 20.28.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588914/95ce8a29-6645-8ddf-c81d-fa3abdcaf3bc.png)



# 🧑🏻‍💻 参考

https://x.com/maochanz/status/1809917293201387994
Laravelのキャッシュ機能について

# はじめに
Laravelには、キャッシュ管理のためにいくつかの機能があります。
キャッシュを使用することで、データベースクエリの結果や計算結果などの一時的なデータを保存することができます。
Laravelのキャッシュ機能について、データがどこに保存されるか、どのように使用するかについてまとめました。

## キャッシュの保存場所
データベースキャッシュ: キャッシュデータをデータベーステーブルに保存します。cacheというテーブルを作成して利用します。

ファイルキャッシュ: デフォルトで、キャッシュはファイルシステムに保存されます。storage/framework/cacheディレクトリ内に保存されます。

キャッシュ設定は、config/cache.phpファイルで行います。このファイルで、デフォルトのキャッシュドライバや各ドライバの設定を定義します。

## キャッシュの使用方法
例えば、キャッシュにデータを保存するには、Cache::putメソッドを使用します。
またファサードを使う以外にヘルパ関数として、cache()->put()という書き方もできます。
内部的にはファサードを使用しているのと同じことをしています。

## キャッシュは有効期限も設定できる
今回自分が使って一番便利だったのが、有効期限を設定できるところです。
Cookieやローカルストレージなどとにたことをしたいけど、ブラウザ側にデータを持つのではなくあくまで、バックエンドでデータを持たせたい時に重宝すると感じました。
Azure Pipelines: Service Connection 作成時、Microsoft.Resources/subscriptions/read 不足なら、Role を割り当てる

# 背景

はじめて Service Connection を作ったころに嵌った記録

# 現象

- ARM で Service connection が作成出来ない。verify error になって、以下のえらーとなる。
   - ARM: Azure Resource Manager

> Failed to query service connection API: 'https://management.azure.com/subscriptions/{subscription id}?api-version=2016-06-01 '. Status Code: 'Forbidden', Response from server: '{"error":{"code":"AuthorizationFailed","message":"The client '{client id}' with object id '{object id}' does not have authorization to perform action 'Microsoft.Resources/subscriptions/read' over scope '/subscriptions/{subscription id}' or the scope is invalid. If access was recently granted, please refresh your credentials."}}'
ActivityId: {activity id}

# 原因

上記文章に書かれている通り、<code>Microsoft.Resources/subscriptions/read</code> が無い。

ということで、Azure Portal 側で、割り当てようとしてた Service Principal に対して、<code>Microsoft.Resources/subscriptions/read</code> を持つ Role を割り当ててやればよい。

https://learn.microsoft.com/ja-jp/azure/role-based-access-control/built-in-roles

もちろん、カスタムロールを作成してもOK

https://learn.microsoft.com/ja-jp/azure/role-based-access-control/custom-roles

# あとがき

RBAC すらもまだ理解していなかった頃であり
- アクセス権が無い＝アプリ登録時になにか設定不足だった？

と考えて詰まっていた。

というのも、会社でやろうとしていて、アプリ登録は書類申請だった為に、試行錯誤の前に調べないとダメだったから、非常に悩んだ思い出・・。
理解する為にも、試行環境が欲しいなぁと、思っていた。今は VS Subscription の環境があるので助かる
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（45/100）

【45日目】
トピック 5：SAPS/4HANAでのプロセス指図（2/6）

≪問題45≫
プロセス指図に対する構成品目の出庫転記に使用できる手法はどれですか。
（２つ選択）
□ピッキングリスト
□かんばん生産管理
□転送規則
□バックフラッシュ

≪解答≫
■ピッキングリスト
□かんばん生産管理
□転送規則
■バックフラッシュ

≪解説≫
◆指図が登録されると、構成品目の出庫保管場所が決定されます。要件に応じて、適切な方法を使用して、出庫保管場所で必要な品目数量を提供します。その後、構成品目の出庫が転記されます。
◆プロセス指図の出庫転記には、いくつかの方法があります。
（1）ピッキングリスト：ピッキング機能を使用して、ピッキングリストを登録および印刷し、品目払出を転記することができます。
（2）在庫管理での在庫移動：在庫移動アプリや在庫管理のトランザクションを使用して、出庫を転記することができます。
（3）バックフラッシュ：フェーズまたは指図の確認時に、構成品目引落を自動的に転記（バックフラッシュ）することができます。これは、同期的、または非同期的に行われます。特定の指図に対して品目を供給しない場合は、常にバックフラッシュを使用する必要があります。
Rubyでデザインパターン (7) Builderパターン

## この記事は何
デザインパターンについて、Rubyでどのような使い方ができるかをまとめた記事です。
デザインパターン自体の解説は詳しく行いません。

## Builerパターンとは
Builderパターンとは、生成するインスタンスへ渡すパラメータを段階的に組み立てることで、複雑なオブジェクトの生成を容易にするデザインパターンです。
詳しくはこちらをご覧ください。

https://qiita.com/takutotacos/items/33cfda205ab30a43b0b1

## Rubyでのコード例
以下のように、生成したいクラスの定義と、そのクラスを生成するBuilderクラスの実装を行います。
それぞれのメソッドで`self`を返すようにすることで、メソッドチェーンでメソッドを書けるようにすることも可能です。

```rb
class Computer
  def initialize(cpu:, ram:, storage:)
    @cpu = cpu
    @ram = ram
    @storage = storage
  end

  def to_s
    "CPU: #{@cpu}, RAM: #{@ram}, Storage: #{@storage}"
  end
end

class ComputerBuilder
  def initialize
    @cpu = ''
    @ram = ''
    @storage = ''
  end

  def add_cpu(cpu)
    @cpu = cpu
    self
  end

  def add_ram(ram)
    @ram = ram
    self
  end

  def add_storage(storage)
    @storage = storage
    self
  end

  def build
    Computer.new(cpu: @cpu, ram: @ram, storage: @storage)
  end
end

builder = ComputerBuilder.new
computer = builder.add_cpu('Intel i9')
                .add_ram('32GB')
                .add_storage('1TB SSD')
                .build

puts computer
```

```:実行結果
CPU: Intel i9, RAM: 32GB, Storage: 1TB SSD
```

## どのような時に使えるか
以下のようなときにBuilderパターンは便利です。
- コンストラクタの種類が多く、コンストラクタに渡す値自体の計算が複雑な場合
- 最終的に生成するオブジェクトを不変にしたい場合

例えば、以下のように与えられた辺の長さを元に、表面積や体積などの値を保持したデータオブジェクトを生成する場合などにBuilderパターンは有効に活用できます。

```rb
class Box
  attr_reader :length, :width, :height, :volume, :surface_area

  def initialize(length:, width:, height:, volume:, surface_area:)
    @length = length
    @width = width
    @height = height
    @volume = volume
    @surface_area = surface_area
  end

  def to_s
    "Length: #{@length}, Width: #{@width}, Height: #{@height}, Volume: #{@volume}, Surface Area: #{@surface_area}"
  end
end

class BoxBuilder
  def initialize
    @length = 0
    @width = 0
    @height = 0
  end

  def set_length(length)
    @length = length
    self
  end

  def set_width(width)
    @width = width
    self
  end

  def set_height(height)
    @height = height
    self
  end

  def calculate_volume
    @length * @width * @height
  end

  def calculate_surface_area
    2 * (@length * @width + @width * @height + @height * @length)
  end

  def build
    volume = calculate_volume
    surface_area = calculate_surface_area
    Box.new(length: @length, width: @width, height: @height, volume: volume, surface_area: surface_area)
  end
end

builder = BoxBuilder.new
box = builder.set_length(10)
            .set_width(5)
            .set_height(2)
            .build

puts box
```

```:実行結果
Length: 10, Width: 5, Height: 2, Volume: 100, Surface Area: 160
```
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（44/100）

【44日目】
トピック 5：SAPS/4HANAでのプロセス指図（1/6）

≪問題44≫
現在のプロジェクトでは、液体化学製品の生産のためにプロセス指図を使用しています。物理的に接続された適切なタンクでのみ生産フローを発生させるには、以下のどれを定義できますか。
（２つ選択）
□資源選択
□資源マトリクス
□資源ネットワーク
□資源階層

≪解答≫
■資源選択
□資源マトリクス
■資源ネットワーク
□資源階層

≪解説≫
◆プロセス生産環境においては、資源選択機能を使用して、作業の実行に適した資源を検索およびチェックすることができます。
◆資源選択では、更新された作業と個別の生産資源に対して更新された値が比較され、正しいリソースを特定することができます。
◆さらに、リソースの物理的な接続を表す資源ネットワークが資源選択で考慮されます。プロセス指図では、指図に割り当てられた資源ネットワークの資源のみを使用することができますが、これらのリソースはリソース選択条件を満たしている必要があります。
CEL(Common Expression Language)でGo言語の構造体を処理

式言語 [CEL（Common Expression Language）](https://github.com/google/cel-spec) の Go 言語用ライブラリとして [cel-go](https://github.com/google/cel-go) があります。

[cel-go](https://github.com/google/cel-go) では、一般的なプリミティブ型に加えて list, map, JSON, Protocol Buffers の型に対応していますが、ソースコードを見る限り Go の構造体も処理できそうだったので試してみました。

# はじめに

基本的に、cel-go は以下の流れで実装します。

1. Environment のセットアップ
    * NewEnv の実行
2. CEL式のパースとチェック
    * Compile の実行
    * Program の実行
3. 評価
    * Eval の実行

```NewEnv``` で使用する変数や追加の型を定義し、CEL式を ```Compile``` と ```Program``` で処理して、```Eval``` へ変数の値を渡すとCEL式を評価した結果が得られます。

例えば、```name``` という変数を使って ```size(name) > 3``` （name 変数値の文字数が 3より大きいかどうか）というCEL式を評価する処理は以下のようになります。（エラー処理は適当です）

```go:sample.go
package main

import (
	"fmt"
	"log"
	"os"

	"github.com/google/cel-go/cel"
)

func main() {
	name := os.Args[1]
    // 1. Environment のセットアップ
	env, err := cel.NewEnv(cel.Variable("name", cel.StringType))

	if err != nil {
		log.Fatal(err)
	}
    // 2. パースとチェック
	ast, iss := env.Compile("size(name) > 3")

	if iss.Err() != nil {
		log.Fatal(iss.Err())
	}

	prg, err := env.Program(ast)

	if err != nil {
		log.Fatal(err)
	}
    // 3. 評価
	out, _, err := prg.Eval(map[string]any{
		"name": name,
	})

	if err != nil {
		log.Fatal(err)
	}

	fmt.Println(out)
	fmt.Printf("type=%v, value=%v \n", out.Type(), out.Value())
}
```

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

```sh:実行例1
$ go run sample.go abc
false
type=bool, value=false
```

```sh:実行例2
$ go run sample.go abcd
true
type=bool, value=true
```

# 構造体の処理

それでは、本題の構造体です。

正式な実装方法に関しては記載が無くて分からなかったのですが、とりあえず NewEnv で以下のようにすれば実現できました。

* ```ext.NativeTypes``` で Go の構造体を定義
* 変数の型指定で ObjectType を使って、構造体の型名（```package名.構造体名```）を文字列で指定

とりあえず、ext.NativeTypes の引数としては ```reflect.Type``` で良さそうだったので、```reflect.TypeFor``` の戻り値を使っています。

また、以下では main パッケージ内で構造体 Data を定義しているので、ObjectType の引数は ```main.Data``` になります。

処理するCEL式は、Data 構造体の ID や Value の値を文字列として連結するだけのものですが、int 型の値を文字列と ```+``` で直接連結できなかったので ```string(intの値)``` を使って文字列化しています。

```go:main.go
package main

import (
	"fmt"
	"log"
	"reflect"

	"github.com/google/cel-go/cel"
	"github.com/google/cel-go/ext"
)

type Data struct {
	ID    string
	Value int
}

func main() {
	env, err := cel.NewEnv(
		cel.Variable("data", cel.ObjectType("main.Data")), // 変数の型に Data 構造体を使用
		ext.NativeTypes(reflect.TypeFor[Data]()), // Data 構造体を使用するための型設定
	)

	if err != nil {
		log.Fatal(err)
	}

	ast, iss := env.Compile(`"id=" + data.ID + ", value=" + string(data.Value)`)

	if iss.Err() != nil {
		log.Fatal(iss.Err())
	}

	prg, err := env.Program(ast)

	if err != nil {
		log.Fatal(err)
	}

	d := Data{"d-1", 1000}

	out, _, err := prg.Eval(map[string]any{
		"data": d,
	})

	if err != nil {
		log.Fatal(err)
	}

	fmt.Println(out)
}
```

実行結果はこのようになり、構造体を処理できました。

```sh:実行結果
$ go run main.go
id=d-1, value=1000
```
組み合わせテストとは

## 組み合わせテストとは
組み合わせテストは、ソフトウェアテストの一手法で、複数の入力パラメータや条件の組み合わせを網羅的にテストする方法です。このテスト手法を用いることで、異なるパラメータの組み合わせによるシステムの動作を確認し、潜在的な不具合やバグを検出することができます。
組み合わせテストは、システムが複数の入力パラメータを持ち、それぞれが多くの値を取る場合や、異なるパラメータの組み合わせによってシステムの挙動が変わる場合に有効です。

**単一の条件では発生しないが、複数の条件が組み合わさった際に発生するバグを見つける際に有効です。**

### 組み合わせテストの目的
- パラメータ間の相互作用によって引き起こされる不具合の検出
- テストカバレッジの向上
- 効率的なテストケースの設計


### 組み合わせテストのメリットとデメリット
#### メリット
- **高いカバレッジ**
多くのパラメータの組み合わせをテストすることで、潜在的な不具合を検出しやすくなる。
　
- **効率的なテストケース作成**
組み合わせを体系的に生成することで、無駄のないテストケースを作成できる。
　
- **不具合の早期発見**
パラメータ間の相互作用による不具合を早期に発見できる。

#### デメリット
- **テストケースの膨大な量**
全ての組み合わせをテストする場合、テストケースの数が膨大になる可能性がある。
　
- **テストの実行コスト**
多くのテストケースを実行するためのリソースや時間が必要になる。
　
## 2因子間網羅 (ペアワイズテスト)とは
2因子間網羅 (ペアワイズテスト)は、ソフトウェアテストの一手法で、複数の入力パラメータのうち、2つのパラメータの全ての組み合わせをテストする方法です。この手法は、全てのパラメータの全ての組み合わせをテストすることなく、多くのバグを検出するための効果的な方法として広く使われています。

### 因子と水準について
**因子とは、テストの対象となる機能名や設定項目のことです。** システムやプロセスに影響を与える要素を指します。

**水準とは、各因子が取り得る具体的な値や設定のことです。** 各因子には複数の水準があり、それぞれが異なる条件や設定を表します。

### 2因子間網羅における因子と水準の例
例えば、ウェブアプリケーションのログイン機能をテストする場合、次のような因子と水準が考えられます。組み合わせテストを有効に用いるには、因子と水準を的確に抽出する必要があります。

1. **因子と水準を抽出する**
    - **因子1**: ブラウザ
        - 水準: Chrome, Firefox, Edge
        　
    - **因子2**: OS
        - 水準: Windows, macOS, Linux
        　
    - **因子3**: 接続タイプ
        - 水準: 有線, 無線
　
1. **2因子間網羅の生成**
次に、各因子の水準の全てのペアをカバーするようにテストケースを生成した結果を示します。これにより、全ての因子のペアが少なくとも一度はテストされるようになります。
　
    2因子間網羅のテストケース ↓
    | テストケース | ブラウザ (Browser) | OS | 接続タイプ (Connection Type) |
    | --- | --- | --- | --- |
    | 1 | Chrome | Windows | Wired |
    | 2 | Chrome | macOS | Wireless |
    | 3 | Chrome | Linux | Wired |
    | 4 | Firefox | Windows | Wireless |
    | 5 | Firefox | macOS | Wired |
    | 6 | Firefox | Linux | Wireless |
    | 7 | Edge | Windows | Wired |
    | 8 | Edge | macOS | Wireless |
    | 9 | Edge | Linux | Wired |

このようにして、2因子間網羅を適用することで、効率的かつ効果的に多くのバグを検出することができます。

　
### 2因子間網羅だけで本当に大丈夫なのか
2因子間網羅は、多くの場合に効果的で効率的なテスト手法ですが、すべてのシナリオにおいて十分であるとは限りません。

#### 2因子間網羅の利点
1. **効率性**
全ての因子の全組み合わせをテストするのではなく、2つの因子のペアの組み合わせだけをテストするため、テストケースの数を大幅に減らせます。
　
2. **効果的**
多くのバグは2つのパラメータの相互作用に起因するため、ペアワイズテストでも多くのバグを検出できます。
　
3. **シンプルさ**
テストケースの数が少ないため、設計、実行、メンテナンスが容易です。

　
#### 2因子間網羅の限界
1. **高次元の相互作用の無視**
ペアワイズテストは2つの因子の相互作用をカバーしますが、3つ以上の因子の相互作用によるバグは検出できない可能性があります。
　
2. **特定のシナリオにおける不十分さ**
システムやアプリケーションの複雑さに応じて、2因子だけでは不十分な場合があります。例えば、非常に複雑なシステムでは、3因子や4因子以上の相互作用が重要な場合があります。

　
2因子間網羅は多くのシナリオで効果的な手法ですが、システムの複雑さや要求に応じて3因子間網羅やそれ以上の高次元の組み合わせテストを検討することが重要です。適切なテストアプローチを選択することで、効率的かつ効果的にバグを検出し、システムの品質を向上させることができます。
【Python】tkinterを使用してText領域に縦スクロールバーを表示する方法

## はじめに

tkinterにてText領域に縦スクロールバーを表示する方法を紹介します。
また、縦スクロールバーをマウスでつかんで上下に動かす方法もあわせて紹介しています。
Text領域に縦スクロールバーを表示する際の参考になれば幸いです。

#### 開発環境
・WSL2/Ubuntu環境
・Python: 3.10.12

## Text領域で縦スクロールバーを表示する方法

```sample_bar_vertical_scroll.py:
import tkinter as tk
from tkinter import Text


# configure root
root = tk.Tk()
root.title("Sample_Bar_Vertical_Scroll")
root.geometry("800x600")

# display bar_vertical_scroll
bar_vertical_scroll = tk.Scrollbar(root, orient=tk.VERTICAL)
bar_vertical_scroll.pack(side=tk.RIGHT, fill=tk.Y)

# make text
area_text = Text(root, wrap="word", undo=True, yscrollcommand=bar_vertical_scroll.set)
area_text.pack(fill="both", expand=True)

# configure bar_vertical_scroll
bar_vertical_scroll.config(command=area_text.yview)

# display window
root.mainloop()


```

#### プログラムの動作
　# display bar_vertical_scroll
tk.Scrollbarでスクロールバーを作成し、side=tk.RIGHTで縦スクロールバーを右側に配置しています。

　# make text
Text領域を作成し、yscrollcommand=bar_vertical_scroll.setにてText領域がスクロールされた際に、縦スクロールバーの位置を更新します。この設定だけでもText領域を十字キーで上下に動くと、縦スクロールバーも上下に動きます。ただ、マウスで縦スクロールバーを動かしてもText領域は上下に動きません。

　# configure bar_vertical_scroll
縦スクロールバーが上下に動いた際、Text領域の表示位置を更新します。この設定を含めることで、マウスで縦スクロールバーを動かすとText領域も上下に動きます。

## 参考文献
本記事は以下情報を参考にして執筆しました。

https://qiita.com/thruaxle/items/0fc3e89bd15e3d2f79a1
Webpackにおけるローダー（loader）とは

# はじめに
Webpackにおける**ローダー（loader）**は、モジュールの内容を変換するためのプログラムです。
ローダーは特定のファイルタイプに対して実行され、ファイルを変換して、アプリケーションの依存関係として使用できる形式にします。
ローダーを使用することで、JavaScript以外のリソース（CSS、画像、HTMLテンプレートなど）をバンドルに含めることができる。


## ローダーの役割
ローダーは、ソースコードをWebpackが理解できるモジュールに変換する役割を担う。

JavaScriptのトランスパイル：ES6やTypeScriptのコードを、古いブラウザでも動作するようにES5に変換する。
CSSの処理：SassやLESSのようなプリプロセッサのコードを標準的なCSSに変換する。
画像やフォントの処理：画像やフォントファイルを適切なURLに変換し、アプリケーションで使用できるようにする。

## 主要なローダーの例

### Babel Loader
Babelは、最新のJavaScriptコードを後方互換性のあるバージョンに変換するためのツールです。Babel Loaderは、WebpackとBabelを連携させるために使用されます。
```js
{
  test: /\.(js|jsx)$/i,
  loader: "babel-loader",
}
```

### CSS Loader と Style Loader
CSS Loaderは、CSSファイルをJavaScriptモジュールとしてインポートできるようにします。
Style Loaderは、インポートされたCSSをHTMLのstyleタグに注入します。
```js
{
  test: /\.css$/i,
  use: ["style-loader", "css-loader"],
}
```

### Vue Loader
Vue Loaderは、.vueファイル（シングルファイルコンポーネント）を処理するためのローダーです。これにより、HTML、JavaScript、CSSを一つのファイルにまとめて使用できます。
```js
{
  test: /\.vue$/,
  loader: "vue-loader",
}
```

### Sass Loader
Sass Loaderは、Sass/SCSSファイルをCSSに変換するローダーです。sass-loaderの他にcss-loaderとstyle-loaderも使用されます。
```js
{
  test: /\.s[ac]ss$/i,
  use: [
    "style-loader",
    "css-loader",
    "sass-loader",
    {
      loader: "sass-resources-loader",
      options: {
        resources: [path.resolve(__dirname, "./src/scss/mixin.scss")],
      },
    },
  ],
}
```

### File Loader
File Loaderは、画像やフォントなどのファイルを処理し、適切なURLに変換します。
```js
{
  test: /\.(png|jpe?g|gif)$/i,
  use: [
    {
      loader: "file-loader",
    },
  ],
}
```

## ローダーの設定方法
ローダーは、Webpackの設定ファイル（webpack.config.js）のmodule.rulesセクションに定義します。各ローダーは、処理するファイルタイプ（test）と使用するローダー（loaderまたはuse）を指定します。

## まとめ
ローダーは、Webpackが様々なファイルタイプを処理し、アプリケーションに統合できるようにするための重要な機能です。
これにより、開発者は最新のJavaScript機能やスタイルプリプロセッサを利用しつつ、ブラウザ互換性やパフォーマンスを確保できます。
Error: Invalid project selection, please verify project *** exists and you have access.

# はじめに

GithubActionsでfirebaseのプロジェクトをデプロイしようとするとエラーが出ました。

# 問題

エラーの内容は以下です。
```
Error: Invalid project selection, please verify project *** exists and you have access.
```
プロジェクトへのアクセスがあるか確認してくださいと出てきます。

プロジェクトはGoogleアカウントで作成をしていました。

# 解決方法

プロジェクトのGoogleアカウントが普段アクセスをしているGoogleアカウントではなかったため、認証部分でうまくいっていなかったようでした。

firebaseのプロジェクトに普段からアクセスしているGoogleアカウントを追加し、オーナーの権利を共有する状態にすると、エラーが無事に消えました。

### 設定方法

- firebaseのプロジェクトの設定から「ユーザーと権限」をクリック
- 「メンバーの追加」ボタンをクリックし、権限を渡したいメールアドレスを記入します

- ロール部分を選択することで権限の範囲を選べます

- 全て入力したら追加完了

# おわりに

今回はいつも使用していないGoogleアカウントでプロジェクトを紐づけてしまったので一手間かかってしまいました。

ユーザーを追加することで解決できたので、同じような問題がある方の参考になれば幸いです！
markdown AIを使ってみた

## markdown AIとは
Webサイト作成を簡素化するツールです。

## 簡単な操作を実践してみた
### まずはサイトにアクセス
https://mdown.ai/

１．Googleで認証してログイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605103/a92aab4b-6dea-da6a-7994-039e51e70e61.png)

２．記述及びView
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605103/bc4aaf42-c2a5-d7a5-6727-b3d0a2022b29.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605103/fd5775e5-fdec-8dd2-7f1c-e871a9444770.png)

３．新しいページ作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605103/39747259-4910-20aa-0d16-9f3600d621d0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605103/5575e022-993d-eea2-e660-531ed9743c55.png)

４．ページの削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605103/b6834def-a7e0-da0b-8dd5-8656ab58edd7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605103/a90935eb-6188-1cdc-e098-79c4b7035e15.png)

## まとめ
結構簡単に操作できました。瞬時にHTML変換してくれて自分でカスタマイズも自由です。さらにレスポンシブ対応及びSEO対策も対応しているらしいです。今回は簡単な操作のみになりますが、とても操作性も良く将来性を感じました。
AWSのIAMについてのまとめ

# はじめに
AWS IAM（Identity and Access Management）は、AWSリソースへのアクセスを管理するためのサービスです。
IAMを使用すると、ユーザーとグループを作成し、AWSリソースへのアクセスを細かく制御できます。
IAMの基本概念、主要な機能についてまとめます。

## IAMとは
AWS IAMは、AWSアカウント内のリソースへのアクセスを制御するためのサービスです。
これにより、ユーザーが特定のリソースに対して実行できる操作を制限することができます。

### 主な要素
**ユーザー**: 
個々のユーザーアカウント。各ユーザーには独自の認証情報（アクセスキー、パスワード）が与えられます。

**グループ**: 
ユーザーをまとめるための論理的なグループ。
グループに付与された権限は、グループ内のすべてのユーザーに適用されます。

**ロール**: 
AWSリソースにアクセスするための一時的な権限を付与するメカニズム。
ロールは他のAWSサービスや認証された外部ユーザーにも使用されます。

**ポリシー**: 
ユーザー、グループ、ロールに適用される権限の集合。
ポリシーはJSON形式で定義されます。


## IAMの主要な機能
### ユーザーとグループの管理
IAMでは、個々のユーザーアカウントを作成し、ユーザーごとに異なるアクセス権を設定できます。また、ユーザーをグループにまとめ、グループ単位でのアクセス制御も可能です。

### ロールの使用
IAMロールは、特定のタスクを実行するための一時的な権限を付与します。
これにより、EC2インスタンスやLambda関数などのAWSリソースが他のリソースにアクセスできるようになります。

### ポリシーの適用
ポリシーは、ユーザー、グループ、ロールに対して適用される権限を定義します。ポリシーはJSON形式で記述され、許可される操作やリソースを指定します。

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::example-bucket"
    }
  ]
}
```

## IAMのベストプラクティス
### 最小権限の原則
ユーザーやロールには、必要最低限の権限のみを付与することが重要です。これにより、セキュリティリスクを最小限に抑えることができます。

### MFAの有効化
重要なユーザーアカウントには必ずMFAを有効にします。これにより、不正アクセスからアカウントを保護できます。

## まとめ
AWS IAMは、AWSリソースへのアクセスを管理するためのサービスです。
ユーザー、グループ、ロール、ポリシーを適切に設定し、セキュアで効率的なアクセス管理を実現できます。
IAMを正しく活用することで、AWS環境のセキュリティを大幅に向上させることができます。
EC2のポート開放設定の方法について（セキュリティグループ）

# はじめに
EC2インスタンスを使用する際、特定のポートを開放して外部からアクセスできるようにすることが一般的です。
EC2インスタンスのポート開放設定方法について詳しくまとめます。

### 1. セキュリティグループとは
セキュリティグループは、EC2インスタンスの仮想ファイアウォールとして機能し、インバウンドおよびアウトバウンドトラフィックを制御します。
セキュリティグループのルールを設定することで、特定のIPアドレスやポートに対するアクセスを許可または拒否できます。

### 2. セキュリティグループの作成と設定
セキュリティグループの作成
AWSマネジメントコンソールにログイン。
EC2ダッシュボードに移動。
左側のメニューから「セキュリティグループ」を選択。
「セキュリティグループの作成」をクリック。
名前と説明を入力し、VPCを選択。
「セキュリティグループの作成」をクリックして作成。
インバウンドルールの設定
作成したセキュリティグループを選択し、「インバウンドルール」タブをクリック。
「インバウンドルールの編集」をクリック。
「ルールの追加」をクリック。
プロトコル（TCP/UDPなど）、ポート範囲（例：80、443など）、ソース（例：0.0.0.0/0または特定のIPアドレス）を設定。
「ルールの保存」をクリック。

### 3. 既存のセキュリティグループにルールを追加
EC2ダッシュボードに移動。
左側のメニューから「セキュリティグループ」を選択。
既存のセキュリティグループを選択し、「インバウンドルール」タブをクリック。
「インバウンドルールの編集」をクリック。
「ルールの追加」をクリック。
必要なプロトコル、ポート範囲、ソースを設定し、「ルールの保存」をクリック。

### 4. EC2インスタンスへのセキュリティグループの適用
EC2ダッシュボードに移動。
左側のメニューから「インスタンス」を選択。
対象のインスタンスを選択し、上部メニューの「アクション」をクリック。
「セキュリティ」 > 「セキュリティグループの変更」を選択。
新しいセキュリティグループを選択し、「保存」をクリック。

### 5. トラブルシューティング
ルールが正しく設定されているか確認：ポート番号、プロトコル、ソースIPアドレスが正しいことを確認します。
セキュリティグループがインスタンスに適用されているか確認：適用したセキュリティグループが正しいインスタンスに割り当てられているか確認します。
ネットワークACLの確認：VPCのネットワークACLが通信をブロックしていないか確認します。

### 6. ベストプラクティス
最小権限の原則：必要最低限のポートのみを開放し、不要なポートは閉じる。
特定のIPアドレスに制限：アクセス元IPアドレスを特定の範囲に限定することで、セキュリティを強化。
定期的な監査：セキュリティグループの設定を定期的に見直し、不必要なルールを削除する。

## まとめ
AWS EC2のポート開放設定は、セキュリティグループを使用して簡単に行うことができます。適切なルールを設定し、必要なポートだけを開放することで、セキュアな環境を維持できます。
ざっくりgoroutine

# Goroutineの説明

## はじめに
Goroutineは、Go言語における軽量な並行処理の単位です。Goroutineを使用することで、効率的に並行処理を実装することができます。この記事では、Goroutineの基本的な概念、使い方、利点、注意点について説明します。

## 目次
1. [Goroutineとは](#goroutineとは)
2. [Goroutineの使い方](#goroutineの使い方)
3. [Goroutineの利点](#goroutineの利点)
4. [Goroutineの注意点](#goroutineの注意点)
5. [まとめ](#まとめ)

## Goroutineとは
Goroutineは、Go言語における並行処理のための軽量なスレッドのようなものです。Goroutineは非常に軽量であり、数千から数百万のGoroutineを同時に実行することができます。Goroutineは、Goランタイムによって管理され、必要に応じてスケジューリングされます。

## Goroutineの使い方
Goroutineを使用するには、関数呼び出しの前に `go` キーワードを付けるだけです。以下に、Goroutineの基本的な使い方を示します。

### 例: Goroutineの基本的な使い方
```go:例
package main

import (
	"fmt"
	"time"
)

func say(s string) {
	for i := 0; i < 5; i++ {
		fmt.Println(s)
		time.Sleep(100 * time.Millisecond)
	}
}

func main() {
	go say("Hello") // Goroutineを開始
	say("World")    // メインのGoroutineで実行
}
```


この例では、`say` 関数が2つのGoroutineで並行して実行されます。1つは `go say("Hello")` によって開始され、もう1つはメインのGoroutineで `say("World")` が実行されます。

## Goroutineの利点
- **軽量**: Goroutineは非常に軽量であり、数千から数百万のGoroutineを同時に実行することができます。
- **簡単な並行処理**: `go` キーワードを使用するだけで簡単に並行処理を実装できます。
- **効率的なスケジューリング**: GoランタイムがGoroutineのスケジューリングを効率的に管理します。
- **シンプルな構文**: 複雑なスレッド管理やロック機構を使用せずに並行処理を実装できます。

## Goroutineの注意点
- **共有メモリの競合**: 複数のGoroutineが同じメモリ領域にアクセスする場合、データ競合が発生する可能性があります。これを防ぐために、チャネルや同期プリミティブ（例: `sync.Mutex`）を使用する必要があります。
- **リソースの管理**: Goroutineは軽量ですが、無制限に作成するとメモリやCPUリソースを消費します。適切に管理することが重要です。
- **終了の管理**: Goroutineの終了を適切に管理しないと、プログラムが予期せず終了することがあります。`sync.WaitGroup` や `context` パッケージを使用してGoroutineの終了を管理することが推奨されます。

### 例: チャネルを使用したGoroutineの同期
```go:例
package main

import (
	"fmt"
)

func sum(a []int, c chan int) {
	total := 0
	for _, v := range a {
		total += v
	}
	c <- total // チャネルに結果を送信
}

func main() {
	a := []int{1, 2, 3, 4, 5}
	c := make(chan int)
	go sum(a, c) // Goroutineを開始
	result := <-c // チャネルから結果を受信
	fmt.Println(result)
}
```

この例では、チャネルを使用してGoroutine間でデータを同期しています。

## まとめ
Goroutineは、Go言語における軽量な並行処理の単位であり、効率的に並行処理を実装するための強力なツールです。Goroutineを使用することで、シンプルな構文で並行処理を実現し、高いパフォーマンスを得ることができます。ただし、共有メモリの競合やリソースの管理には注意が必要。
historyコマンドをまとめてみました

## はじめに

historyコマンドを使用する機会が多いので、基本的な使い方やおすすめ設定などを
まとめてみました。historyコマンドを使用する際の参考になれば幸いです。

### 開発環境
・WSL2/Ubuntu環境

## historyコマンドの基本的な使い方

まずはhistoryコマンドの基本的な使い方から紹介します。

オプションをつけずにコマンド：「history」を実行すると、実行した過去のコマンド履歴を
一覧表示します。補足ですが、コマンド：「history」を実行した際に表示される内容は「~/.bash_historyファイル」に記載されています。

```
$ history
```

```:コマンド結果
　・・・（省略）
  990  ls
  991  vim .bashrc
  992  history
  993  cd ..
  994  ls
  995  history
```

historyコマンドをオプションなしで実行すると、大量に過去のコマンドが表示されます。

表示する個数を絞ってhistoryコマンドを実行したい場合は、「history 3」のように個数を指定します。「history 3」の場合は最後に実行したコマンドを含めた2つ前のコマンドまでを表示します。

```
$ history　3
```

```:コマンド結果
  994  ls
  995  history
  996  history 3
```

## historyコマンドでよく使うコマンドの組み合わせ

次に、historyコマンドを使う際一緒に使うコマンドの組み合わせを紹介します。

historyコマンドで過去実行した大量のコマンドをパイプで渡し、grepコマンドで探したいコマンドや単語で絞ると、過去実行した大量のコマンドから探したい単語やコマンドを簡単に見つけることが出来るので便利です。以下の例では過去実行したコマンド一覧の中からtouchコマンドを探しています。

```
$ history | grep touch
```

```:コマンド結果
 1000  touch qiita_example
 1001  touch qiita_example1
 1003  history | grep touch
```

## おすすめのhistoryの設定

デフォルトの設定では、historyコマンドはコマンドを実行した日時が表示されません。
ただ、historyコマンドを実行した際に「このコマンドはいつ実行したのかという情報」が必要な場合も多々あります。そのため、「コマンドを実行した日時」を「history」に追加する以下の設定を.bashrcに追記するのがおすすめです。

```.bashrc
HISTTIMEFORMAT='%F %T '
```

「デフォルト設定のままの場合」と「設定を行った場合」の表示の違いを、
以下に掲載します。
```:デフォルト設定のままの場合
 1011  cd ..
 1012  ls -a
 1013  less .bash_history
 1014  history
```

```:設定を行った場合
 1016  2024-07-07 21:07:24 cd ..
 1017  2024-07-07 21:07:29 ls -a
 1018  2024-07-07 21:07:36 less .bash_history
 1019  2024-07-07 21:07:45 history
```


## 参考文献

本記事は以下情報を参考にして執筆しました。

https://qiita.com/bezeklik/items/56a597acc2eb568860d7
【PageSpeedInsights】「リンクに識別可能な名前が指定されていません」と指摘を受けた時

# はじめに
今回はPageSpeed Insightsの指摘の1つである「リンクに識別可能な名前が指定されていません」の改善方法について紹介しようと思います。

# 対策
aタグにaria-label属性を付与することで解消する。




# まとめ
設定するのをつい忘れてしますので気をつけたいと思います。

# 参考
https://dequeuniversity.com/rules/axe/4.4/link-name
git push で毎回ログインするわずらわしさを解決する方法

## はじめに
gitでpushする度にユーザー情報の確認をされます

```sh
$ git push origin HEAD
Username for 'https://github.com':
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282722/5522e0a2-cef8-fadc-5e37-f7a9ff8791e6.png)

毎回確認されるのは面倒なのでこれを省略させます

## ユーザーの認証方法
ユーザーの認証さえできれば省略可能と考え、下記のページを参考にしました、

https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/about-authentication-to-github

一番楽そうな

> GitHub Desktop で認証する

で認証するようにしました

## Github Desktopのインストール
下記からダウンロードできます

https://docs.github.com/ja/desktop/installing-and-authenticating-to-github-desktop/installing-github-desktop

## Github Desktopでのログイン
インストールし、起動してください
インストーラーが起動したら`Sign in to Github.com`をクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282722/20c4b36e-4dbe-9151-f281-6ed85d394ba5.png)
（[こちら](https://www.kagoya.jp/howto/it-glossary/develop/githubdesktop/)より引用
ログイン後、この画面には戻れません）

クリックするとログイン画面が表示されるので、Githubアカウントのログイン情報を入力し、サインインしてください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282722/0190b0d7-eefc-ef54-6704-8878028da5d0.png)
（同じく[こちら](https://www.kagoya.jp/howto/it-glossary/develop/githubdesktop/)より引用）

Github Desktopへの利用を承認するか否かの画面が出てきます
`Authorize Desktop`をクリックして承認させましょう！

その後に出てくるダイアログボックスからGithub Desktopを立ち上げましょう

## Github Desktopからpushする
起動し、変更内容をcommitすると`1件のcommitをpushできますよ`といった趣旨のボタンが見えます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282722/0e57338f-fb70-5324-60a9-4bcc59dac5bc.png)

これをクリックすればpushできるようになります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282722/8436c75a-7532-c8f9-3abd-cdae49b71fc4.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282722/c4de7869-d23b-9adb-b64e-0016ea083142.png)

## SSHによる認証
Github Desktopのほかに`SSH`による認証方法があり、どうやらこちらがメジャーな方法みたいですね
下記の記事が参考になりました

https://qiita.com/non0311/items/03e3e7a042f70f072286

https://zenn.dev/marigotten/articles/e8d675c5117b26

## おわりに
今回は僕の中で簡単な方法での認証でしたが、`SSH`の認証も魅力的で、一度設定すればそのリポジトリでの作業効率が向上します
どちらの方法も認証はされるはずなのでお好みの方法でお試しください

なお、今回はタイトルの課題に対して自分なりに調査しながら試した結果ですので、もし「出来なかった」、「間違っている」などのご意見があればコメントしていただけると嬉しいです！
【Git】Switchコマンドのいろは

`git switch`コマンド使っていますか？

比較的新しく搭載されたコマンドですので、知らない人も多いかも。
と、思って今回は基本的な操作と便利なオプションまとめてみました。

## なにができるの？
`git checkout`をベースに実装されたコマンド。
ブランチの「切り替え・作成」ができます。

## いつから？使えるバージョンは？

バージョン2.23系から搭載されたようです。（2019年8月リリースみたいですね）

※ 現在の最新バージョンは`2.45.2` （2024/07/06時点）

## 今後の動きは？

> THIS COMMAND IS EXPERIMENTAL. THE BEHAVIOR MAY CHANGE.
> 

試験的なのかな…？
結構普及してそうですので、大きな変更は考えにくいですがわかんないですね。

## 使い方です
### ブランチの切り替え
```bash
git switch <branch名>
```
- `git checkout <branch名>` と同じ
- vscodeのgit graphでブランチをダブルクリックするのと同じ

### ブランチの作成
#### 普通に作成
現在のブランチから派生させて、新しいブランチを作ります。
```bash
git switch -c <新ブランチ名>
```

#### 派生元を指定
```bash
git switch -c <新ブランチ名> develop
```

developブランチを派生元として、新しいブランチを作ります。

### コミットをめがけて移動
指定のコミットに移動できます。
```bash
git switch --detach <コミットハッシュ>
git switch -d <コミットハッシュ>
```
なにかと便利です。

不具合の犯人探しに最適です。
（だめです。犯人探しはよくないです。みんなで不具合の原因を探りましょう。）

このオプションがあるって理由だけで、コミットの粒度を気にする人もいるレベルだと思います。そんくらい強力。
### 筆者はあまり使わないですが...。
今回の記事をきっかけにPoCをしてみました。
#### 派生元を変更
```bash
git switch -C <ブランチ名> <派生元>
git switch --force-create <ブランチ名>　<派生元>
```
既に存在するブランチを強制的に、`<派生元>`に切り替えます。
Rebaseに近い感じ？ですかね。（あんま使わない。`force`って言葉がつくと怖いです。）

#### 変更差分を無視
```bash
git switch --discard-changes <ブランチ名>
```
ブランチ切替時に、ローカルの変更を破棄します。
#### マージ系
```bash
git switch -m <ブランチ名>
git --conflict=<"merge", "diff3", "zdiff3"> <ブランチ名>
```
標準挙動では、ブランチ切替時の競合が発生した場合、切り替えが拒否されます。
このオプションを使った場合、マージ時の制御を指定することができます。
（筆者はこれ使わない。GUIでやっちゃいます。）

## めんどくさがり屋なあなたに…
こう呼び出せたら便利ですよね。
```bash
git sw <branch名>
```

`git switch` を打つのすら、だるいってときありませんか？

以下でエイリアスを設定できます。

```bash
git config --global alias.sw switch
```
※ 特定のリポジトリのみで設定したい場合は`—global`を外してね。

## 参考

https://git-scm.com/docs/git-switch

https://zenn.dev/gmomedia/articles/d9366fa84aadfd
Cloudflare WorkerとHonoで3分でAPIサーバーを構築する方法

# Cloudflare WorkerとHonoで3分でAPIサーバーを構築する方法

## はじめに

APIサーバーを手軽にデプロイしたいと思ったことはありませんか？他のツールを使うと設定が面倒だったり、デプロイに時間がかかったりすることがありますよね。今回は、Cloudflare WorkerとHonoを使って、たったの3分でAPIサーバーを構築する方法をご紹介します。

### 使用ツール/技術

- Cloudflare Worker
- Hono

### 手順

1. プロジェクトの作成
    ```bash
    bun create hono@latest my-app
    ```
    
    :::note warn
    筆者はbunを使っているので、使っていない方は`npm`に置き換えてください。`my-app`はプロジェクト名なので、適宜変更してください。
       :::
    ![Screenshot 2024-07-07 at 18.40.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946561/8a184674-1e05-9e31-bdd0-4a2fa374cd4c.png)
    こんな感じでプロジェクトが作成されます。



2. プロジェクトのディレクトリに移動し、デプロイ
    ```bash
    bun run deploy
    ```
:::note warn
Cloudflareのアカウントは作成しておいてください。
:::

![Screenshot 2024-07-07 at 18.55.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946561/dae0848f-e1cc-fc36-b4d0-6e8a0f0b760c.png)



これでデプロイも終わりです。笑

> むしろ慣れている人なら1分で終わるかも...w



## 総括と結論

Cloudflare WorkerとHonoを使えば、APIサーバーのデプロイが非常に簡単かつ迅速に行えます。ぜひ試してみて、手軽さと効率性を実感してください。

## 参考記事

- [Cloudflare Workers Documentation](https://developers.cloudflare.com/workers/)
- [Hono GitHub Repository](https://github.com/honojs/hono)

---

この記事を参考に、あなたも手軽にAPIサーバーをデプロイしてみましょう！
【Drupal】ダミーデータ作成テクニック ~ MBTIのデータ登録

## はじめに
以前、こちらの記事内でMBTIデータをTaxonomyTermで登録するスクリプトについて触れました。

https://qiita.com/umekikazuya/items/520efa0cd8689c0f3d8b

16個もGUIで作ってられないですよね。
その時に使用したMBTIデータ登録スクリプトを紹介します。

## サンプルデータ
以下のフォーマットの配列を用意します。
```php
$data = [
  ['name' => 'ISTJ','vid' => 'mbti'],
  ['name' => 'ISFJ','vid' => 'mbti'],
  ['name' => 'INFJ','vid' => 'mbti'],
  ['name' => 'INTJ','vid' => 'mbti'],
  ['name' => 'ISTP','vid' => 'mbti'],
  ['name' => 'ISFP','vid' => 'mbti'],
  ['name' => 'INFP','vid' => 'mbti'],
  ['name' => 'INTP','vid' => 'mbti'],
  ['name' => 'ESTP','vid' => 'mbti'],
  ['name' => 'ESFP','vid' => 'mbti'],
  ['name' => 'ENFP','vid' => 'mbti'],
  ['name' => 'ENTP','vid' => 'mbti'],
  ['name' => 'ESTJ','vid' => 'mbti'],
  ['name' => 'ESFJ','vid' => 'mbti'],
  ['name' => 'ENFJ','vid' => 'mbti'],
  ['name' => 'ENTJ','vid' => 'mbti'],
];
```

## スクリプト
```php
/** @var \Drupal\taxonomy\TermStorageInterface $storage  */
$storage = \Drupal::entityTypeManager()->getStorage('taxonomy_term');

foreach ($data as $item) {
  try {
    $entity = $storage->create($item);
    $entity->save();
    echo 'Term作成成功. ID:' . $entity->id() . ".\r\n";
  }
  catch (EntityStorageException $e) {
    echo $e->getMessage();
  }
}
```
`TermStorage`が用意している`Create`メソッドを使用します。

## 実行
Drush に搭載されているスクリプト実行コマンドを利用しましょう。
```bash
drush php:script <ファイル名>
```

## まとめ
サンプルデータを作成する時に、覚えておくと役立ちそうですね。

16個であればデータの作成を手動ですることもあるかもしれませんが、この程度でのスクリプトであれば時間もかからないし使いまわせそうなので実装してもいいかもですね。
Node.js(Express)のAPIをJestでテストする準備

## **導入方法**

必要なパッケージのインストール

```tsx
npm install --save-dev jest ts-jest @types/jest @types/supertest
```

初期化

```tsx
npx ts-jest config:init
```

```jsx
The following questions will help Jest to create a suitable configuration for your project

√ Would you like to use Typescript for the configuration file? ... yes
√ Choose the test environment that will be used for testing » node
√ Do you want Jest to add coverage reports? ... yes
√ Which provider should be used to instrument code for coverage? » v8
√ Automatically clear mock calls, instances, contexts and results before every test? ... yes
```

Node.jsの機能をテストする場合`jest.config.ts` ファイルを変更

```tsx
 testEnvironment: "node",
```

`package.json` ファイルに追加

```tsx
  "scripts": {
    "test": "jest"
```

describe、itなどのJestのグローバル関数をTypeScriptで使用するにはTypeScriptコンパイラがJestのグローバル関数を認識するようにします。

`tsconfig.json` ファイルに追加

```tsx
{
  "compilerOptions": {
    "types": ["jest", "node"]
  }
}
```

## npm run test したがエラー


    Cannot find module '@/app/XXXX/page' from 'src/**tests**/components.test.tsx'
Jestが`@/app/XXXX/page`モジュールを見つけることができませんというエラーが発生。これは、モジュールエイリアスが正しく設定されていないために発生することが多いです。

`jest.config.ts`で下記追加

```tsx
  moduleNameMapper: {
    '^@/(.*)$': '<rootDir>/src/$1',
  },
```

これでrootディレクトリ直下の中に入っている`src`フォルダ配下のファイル全てを正しく認識します。

## 次はテスト終わらない問題

Jest did not exit one second after the test run has completed.

'This usually means that there are asynchronous operations that weren't stopped in your tests. Consider running Jest with --detectOpenHandles to troubleshoot this issue.

https://qiita.com/yuta-katayama-23/items/29b91fed629fe758a42d

こちらの記事の通りサーバー立ち上げを `app.ts` から別の新しいファイルに切り出すと解消しました。

`package.json` の `"dev":` の設定も変える

## カバレッジレポートを見る

初期化の際にカバレッジレポートを選んでいれば勝手に`coverages/`というディレクトリが生成されているが選べていなかったらコマンドを叩くようです。

```tsx
npm test -- --coverage
```

ディレクトリから `index.html`を見つけてブラウザで開くとわかりやすく表示される

![スクリーンショット 2024-07-04 231619.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809438/5ba0bd15-10c8-07c0-55f3-861b6ef5e786.png)
ABC329Dを解いた


筆者はレート600前後の茶色コーダ

7月4日に開催されたADTで登場した以下の問題を解いていく

https://atcoder.jp/contests/abc329/tasks/abc329_d

ADTのページ(ALL)

https://atcoder.jp/contests/adt_all_20240704_2/tasks/abc329_d


# 実装コード

解説をみずにとりあえず、セグ木を実装し、候補者番号と票数を載せて値更新を回した
値更新するたびに全区間の集計を入れて表示したらACした。

セグ木の実装は以下を使用した
- [shakayami/ACL-for-python](https://github.com/shakayami/ACL-for-python)

```python
from collections import defaultdict
import sys
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
def err(*args): print(*args, file=sys.stderr)


class segtree():
    # 略


def segfunc(a,b):
    if a[1] > b[1]:
        return a
    elif a[1] < b[1]:
        return b
    elif a[0] < b[0]:
        return a
    else:
        return b

def main():
    N, M = rLI()
    A = rLI()
    
    e = (N+1,0)
    
    G = segtree([e for _ in range(N+1)],segfunc,e)
    
    d = defaultdict(lambda: -1)
    c = 0
    
    for a in A:
        if d[a] == -1:
            d[a] = c
            c += 1
            G.set(c,(a,0))
        else:
            i = d[a]
            _, n = G.get(i)
            n += 1
            G.set(i,(a,n))
        m, _ = G.all_prod()
        print(m)
        
if __name__ == '__main__':
    main()

```


ここで解説をみたが、最大値の番号と各候補者の票数だけを管理すればよかったようだ。

```python
from collections import defaultdict
import sys
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
def err(*args): print(*args, file=sys.stderr)

def main():
    N, M = rLI()
    A = rLI()
    
    d = defaultdict(lambda: 0)
    m = A[0]
    for a in A:
        d[a] += 1
        if d[a] > d[m] : m = a
        elif d[a] == d[m] : m = min(m,a)
        print(m)
        
if __name__ == '__main__':
    main()

```


# まとめ

ABC329Dを解いた、解法にはセグ木を使用した方法と
最大値の番号と各候補者の票数だけ管理した方法で解いた

# 感想

解説を見ずに問題を解くことができたのは満足だが、この問題の処理にセグ木は過剰装備だった。
必要最低限のラインを見極めるようにするのが今後の課題である。
runc install

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680051/6988d03c-ec2b-8330-3b9c-5fce82ea9eb0.png)

## はじめに

## 参考サイト
GitHub
[GitHub runc](https://github.com/opencontainers/runc)


## runc install
まず、こちらが完了していることが条件となる。
[必要なパッケージ](https://qiita.com/haru_yama/items/67241d0b202c76c1e350#cri-o-runc%E3%81%A8containers-common-%E3%82%92%E3%81%AF%E3%81%98%E3%82%81%E3%81%A8%E3%81%97%E3%81%9F%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680051/17142349-e297-f080-1e86-4a5fe8917773.png)

```
[実行コマンド]
git clone https://github.com/opencontainers/runc

[結果]
Cloning into 'runc'...
remote: Enumerating objects: 43105, done.
remote: Counting objects: 100% (690/690), done.
remote: Compressing objects: 100% (424/424), done.
remote: Total 43105 (delta 340), reused 547 (delta 260), pack-reused 42415
Receiving objects: 100% (43105/43105), 20.87 MiB | 7.66 MiB/s, done.
Resolving deltas: 100% (28300/28300), done.
```
ディレクトリを移動する。
```
[実行コマンド]
cd runc
```

ビルドする。
```
[実行コマンド]
make

[結果]
rm -f libcontainer/dmz/binary/runc-dmz
go generate -tags "seccomp urfave_cli_no_docs " ./libcontainer/dmz
make[1]: Entering directory '/home/mainte/runc/libcontainer/dmz'
gcc -fno-asynchronous-unwind-tables -fno-ident -s -Os -nostdlib -lgcc -static -o binary/runc-dmz _dmz.c
strip -gs binary/runc-dmz
make[1]: Leaving directory '/home/mainte/runc/libcontainer/dmz'
go build -trimpath "-buildmode=pie"  -tags "seccomp urfave_cli_no_docs " -ldflags "-X main.gitCommit=v1.2.0-rc.2-18-g8a324d67 -X main.version=1.2.0-rc.2+dev " -o runc .
```

```
[実行コマンド]
sudo make install

[結果]
/bin/bash: line 1: go: command not found
/bin/bash: line 1: go: command not found
/bin/bash: line 1: go: command not found
install -D -m0755 runc /usr/local/sbin/runc
```

最後にinstallと出ているので成功していると思う。
versionを確認する。
```
[実行コマンド]
/usr/local/sbin/runc --version

[結果]
runc version 1.2.0-rc.2+dev
commit: v1.2.0-rc.2-18-g8a324d67
spec: 1.2.0
go: go1.22.5
libseccomp: 2.5.3
```
## トラブルシュート
goが無いエラー。以下を参照してインストールを行う。
[go install](https://qiita.com/haru_yama/items/67241d0b202c76c1e350#go-install)

gccが認識されないエラー
```
[実行コマンド]
sudo apt install gcc
```
Calamares のカスタマイズ

「Calamares を試してみる」
https://qiita.com/nanbuwks/items/d68f8e78a87426d3f7c6

の続きです。
外観をカスタマイズして、こんな感じにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/512b3e0a-d20d-e379-5faa-a8cbe6440b15.png)


# 環境

「Debian Testing (Debian 13 ： 2024/07/07 時点 )

# 準備

```
# apt install calamares-settings-debian
```
# 作業


`/etc/calamares/settings.conf`

を書き換えます。omcuss ブランドにしたいと思ったので、以下のようにしました。

```
branding: debian
```
↓

```
# branding: debian
branding: omcuss
```

次に、
`/etc/calamares/branding/debian` を `/etc/calamares/branding/omcuss` にコピーし、`branding.desc` の以下の部分を書き換えます。
```
componentName:   omcuss
```

あとは `/etc/calamares/branding/omcuss/branding.desc` を適当に書き換えてきます。

それに伴って、/etc/calamares/branding/omcuss/ 内に  png ファイルを配置します。

ちなみに、元々の debian 用に使われていたファイルは以下のサイズでしたので大体それに合わせてみました。

- logo は 256x256 pixel
- slide1.png は800x480 pixel (使用していないようです)
- welcome.png は457x300 pixel 


# おまけ

苦労のあとです。
元々このような表示だったので、Debian のマークなどがどこにあるのか調べましたが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/5eb749ce-55d4-e856-283a-5e93a4e2ee3f.png)

https://github.com/calamares/calamares/blob/calamares/src/branding/default/branding.desc
ドキュメントを読んでも、よくわからなかったので、 debian のディストリビューションパッケージのソースファイルをダウンロードしてみました。

```
# apt install dpkg-dev
```

```
$ mkdir rebuild
$ cd rebuild
$ apt source calamares
```
しかしながら先の記事
「Calamares を試してみる」
https://qiita.com/nanbuwks/items/d68f8e78a87426d3f7c6
では、 calamares ではなく calaamares-settings-debian をインストールしてましたね。



```
$ ls -alh
合計 4.6M
drwxrwxr-x  3 nanbuwks nanbuwks 4.0K  7月  7 18:58 .
drwx------ 17 nanbuwks nanbuwks 4.0K  7月  7 18:57 ..
drwxrwxr-x 13 nanbuwks nanbuwks 4.0K  7月  7 18:58 calamares-3.3.7
-rw-r--r--  1 nanbuwks nanbuwks 8.9K  6月 22 22:45 calamares_3.3.7-1.debian.tar.xz
-rw-r--r--  1 nanbuwks nanbuwks 2.5K  6月 22 22:45 calamares_3.3.7-1.dsc
-rw-r--r--  1 nanbuwks nanbuwks 4.6M  6月 22 22:45 calamares_3.3.7.orig.tar.gz
```
calamares パッケージ中にも calamares_3.3.7-1.debian.tar.xz なんかがあり、てっきり debian 用のカスタマイズが入っていると思ってました。


```
$ cd calamares-3.3.7/
$ ls
3rdparty        CONTRIBUTING.md           ci                                     lang
AUTHORS         CalamaresConfig.cmake.in  cmake_uninstall.cmake.in               man
CHANGES-3.2     LICENSES                  com.github.calamares.calamares.policy  settings.conf
CHANGES-3.3     README.md                 data                                   src
CMakeLists.txt  calamares.desktop         debian
CMakeModules    calamares.desktop.in      io.calamares.calamares.appdata.xml
```
いくら探しても calamares のソースファイル中で該当のものがなくて、おかしーなーと数時間悩みました。

## トラブル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/fb698b20-7f5c-6bc8-1a81-9956f2b4f9c4.png)
わかりやすくしたもの

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/f2d19727-b8d0-386a-8246-6f92c00454c2.png)