OmniAICreator/Qiita-1.07M huggingface dataset:
最近使っているWeb開発ツールが便利すぎる！

最近、日常生活や仕事で使えるWebツールをいくつか見つけて、技術的な知識がなくても簡単に使えるツールがあると、結構愛用しています。



• 古い動画を高画質化に　https://easyvideo.app/ja

家にある昔の動画をきれいにしたいと思い、Easy VideoをGoogleからできました。先日、子供の頃の古いホームビデオを処理してみたところ、効果に大満足！ぼやけていた映像がくっきりと鮮明になり、懐かしい思い出がよみがえりました。

操作も直感的で、アップロードするだけで自動的に画質を向上させてくれるので、専門知識がなくても簡単に使えるのが魅力です。

• モチベーションを保つカウントダウン：新年まで何日？
https://happycountdown.com/ja/until/new-years-day

特別なイベントまでの残り日数をカウントダウンしてくれるシンプルなツールです。
「あと○○日で新年か！やるべきことを終わらせないと！」という気持ちになって、モチベーションアップにつながっています。デザインもおしゃれで、見ているだけで楽しくなります。

このように、ちょっとした日常の課題を解決してくれるWebツールを見つけると、生活が少し便利になりますね。みなさんも気になるツールがあれば、ぜひ試してみてください！
Pre/Post条件の実践：Safe_Divideから見る形式手法の力



> _"仕様とは希望ではなく、契約であり証明である。"_  

プログラムにおける正しさとは何か。  
「例外が起きない」ことではない。「なんとなく動いている」ことでもない。  
**あらゆる入力に対して、定められた動作が保証されること**——それが形式手法の定義する「正しさ」だ。

Ada、とりわけSPARKにおいて、その中核を成すのが**Pre/Post条件**である。

---

## Safe_Divide：小さな関数に宿る設計の緊張感

```ada
function Safe_Divide (X, Y : Integer) return Integer
  with
    Pre  => Y /= 0,
    Post => Safe_Divide'Result * Y = X;
```

一見シンプルなこの関数に、Adaは2つの「契約」を与える。

- **Pre（事前条件）**：除数が0であってはならない  
- **Post（事後条件）**：返却値に除数を掛ければ元の被除数になる

これにより、この関数は**自分が何を受け取り、何を返すべきか**を、構文的に保証する。

---

## Pre/Postで変わる設計思考

通常の言語では、以下のように書くことが多い：

```ada
function Divide (X, Y : Integer) return Integer is
begin
   if Y = 0 then
      raise Constraint_Error;
   end if;
   return X / Y;
end Divide;
```

これは「間違った呼び出し」に備えた実行時防御だが、  
SPARKでは「そもそも**そのように呼び出されること自体が設計違反**」として捉える。

---

## 契約を持つコードは検証可能である

GNATproveなどの検証ツールは、`Safe_Divide` を使う箇所が  
必ず `Y /= 0` を満たしているかを**静的に解析**する。

それにより、「例外が起きないこと」ではなく、**仕様が破綻しないこと**を保証する。

---

## 形式手法とは、「全体性」への設計

契約が1つあるとき、それを破る呼び出しは明確な**契約違反**となる。  
テストに頼らず、**言語レベルで設計者の意図を“義務化”する**この仕組みこそ、形式手法の本質である。

---

## 結語：正しさを語るとは、仕様を記述すること

仕様がなければ正しさは主張できない。  
設計意図をPre/Postという**形式化された記述で埋め込む**ことで、  
コードは「動く」から「保証された構造」
SPARK入門：数学的証明が現実を支える時



> _"設計に対する信頼は、証明によってしか成立しない。"_  

コードが「正しく動く」と言えるとき、私たちは何を根拠にしているのだろうか。  
単なるテストか？経験則か？ それとも「動いているから大丈夫だ」という幻想か？

SPARKはその問いに、静かにそして厳密に答える。  
**数学的証明をもって設計の正しさを保証する**——それがSPARK Adaという言語である。

---

## SPARKとは何か

SPARKは、Adaの厳格なサブセットにして、**証明可能なプログラミングを目的とした言語体系**である。  
すなわち、構文上許されたことしか書けない世界で、すべての仕様が証明される。

- 実行前提条件（Pre）
- 実行後保証条件（Post）
- 型不変式（Invariant）
- 副作用の制限（Global、Depends）

これらが**明示され、静的に検証可能な構造**としてコードに埋め込まれる。

---

## 証明されるコードとは

```ada
function Safe_Subtract (X, Y : Integer) return Integer
  with
    Pre  => X >= Y,
    Post => Safe_Subtract'Result = X - Y;
```

このコードに対し、SPARKのツールチェイン（GNATprove）は、  
呼び出し時にPreが満たされること、Postが常に成立することを**数学的に証明**する。

バグは、「実行して起きる」ものではなく、「証明時に弾かれる」ものとなる。

---

## SPARKの価値：ゼロバグという思想

- バグをテストで検出するのではない
- バグを**設計段階で排除する**
- それを機械的・数学的に証明する

これは、安全性が命に直結する航空宇宙・医療機器・防衛システムにおいて、  
**選ばれ続けてきた方法論**である。

---

## テストは反証でしかない

単体テストは「ある条件下で正しい」ことの確認に過ぎず、  
「すべての条件下で正しい」ことの保証にはならない。

SPARKはその限界を超え、**全入力に対して仕様が満たされることを示す**。

---

## 結語：数学は唯一の保証である

ソフトウェアに絶対的な安全性を求めるならば、  
設計と実装は「証明可能」でなければならない。

SPARKはその設計思想を言語構造にまで埋め込み、  
**コードを「計算対象」ではなく、「証明対象」として扱う未来**を提示する。

> _"証明できるコードだけが、正しさを主張できる。"_
入門者のためのPythonとPandas

みなさんこんばんは！韓国在住のsanaです！

今日はPythonとPandasを素早く習得できる無料講座を紹介します！

プログラミングに初めて触れると、学習量の多さに気が引けますよね…

入門者の立場では、高度な文法、細かいメソッドまで覚えて学習する必要はありません！まずコア中心に身をつけ、細かい技術はプロジェクトを通して試行錯誤を通じて学ぶのが効果的だと思います:point_up_tone1:


Pythonはオープンソースが多く、文法が比較的簡単なので、すぐに習得して書くのにとても良い言語です！

一度Pythonを覚えておけば、皆さんが作りたいプログラム制作に一歩近づけます!!


無料なのでぜひ試してみてください！！

https://u.inf.run/4cU1BBx

また明日もファイティン！！

sana人気記事:writing_hand:

https://qiita.com/sana89/items/9398c4873676d1a5a9a6


https://qiita.com/sana89/items/3fbb96b592f709e3e087
プログラムとは契約である：AdaのContract-Based Programming



> _"設計とは、未来の自分との契約である。"_  

関数は入力を受け取り、出力を返す。  
しかしその「期待される動作」が、**設計者の頭の中にしか存在しない**としたら、コードはいつか裏切る。

Adaは、設計意図を明示し、構文の中に取り込む。  
それが **Contract-Based Programming（契約によるプログラミング）** である。

---

## 契約とはなにか

契約とは、「この関数は、○○が成り立つ前提で呼ばれ、△△を必ず満たして終わる」という、**明示された前提と保証**のこと。

```ada
function Divide (A, B : Integer) return Integer
  with
    Pre  => B /= 0,
    Post => Divide'Result * B = A;
```

この構文が意味するのは：

- **Bが0でないことを前提とする**
- **返却値は、AをBで割った結果であることを保証する**

これが曖昧な言語設計との決定的な差である。

---

## Pre/Post条件の意義

- **Pre（事前条件）**：呼び出す側の責務  
- **Post（事後条件）**：実装する側の責務  

この分離によって、**「契約の破綻」がどこにあるのかを明確にできる**。

呼び出し側が契約違反をすれば、それは「仕様を守らなかった側の責任」になる。

---

## 契約とSPARK：証明可能性への拡張

SPARKでは、これらの契約を**数学的に証明可能な仕様**として定義できる。

```ada
function Abs (X : Integer) return Integer
  with
    Post => Abs'Result >= 0;
```

このPost条件は、`Abs` の結果が必ず非負であることを**証明可能な約束**として構文化している。

---

## 契約は「コメント」ではない

多くのプロジェクトでは、設計書にしか存在しない制約が、  
数か月後には開発者の記憶から消え、コードは仕様に反する形で改修される。

Adaの契約構文は、**設計意図を「構文」に変えることで、設計の寿命を延ばす**。

---

## 結語：信頼は、契約の上にしか成り立たない

契約なき関数は、使用者を裏切る可能性を常に持っている。  
信頼性の高いシステムを作るということは、**契約を明示し、それを破れないように縛る設計**をすることだ。

Adaはそのための言語である。

> _"仕様がコードに宿るとき、バグは構文エラーになる。"_
並行性と調和：AdaのTaskモデルとRendezvousの精神



> _"秩序なき並列は混沌でしかない。"_  

現代のソフトウェアは、並行性を前提として設計される。  
だが多くの言語における並行処理は、**制御構造の“後付け”**であり、整合性や同期において設計者の責任が重くのしかかる。

Adaは異なる。**並行性そのものが言語仕様の中心に位置づけられている**。

---

## 並列ではなく、調和を設計する

Adaは `task` と `rendezvous` という2つの中核構文によって、**並行するプロセス間の調和**を明示的に表現する。

```ada
task type Logger is
   entry Log_Message(M : String);
end Logger;
```

このような `entry` 宣言により、他のタスクからこのタスクへ**安全に制御を移譲する「約束の接点」**が生まれる。

---

## Rendezvous：同期とは契約である

Rendezvousとは、タスク間の通信を**手続き呼び出しのように設計する構造**である。  
非同期の中に**同期の約束**を設けることで、状態の不整合を構文レベルで防ぐ。

```ada
task body Logger is
begin
   loop
      accept Log_Message(M : String) do
         Put_Line("LOG: " & M);
      end Log_Message;
   end loop;
end Logger;
```

呼び出し側は以下のように書く：

```ada
L : Logger;
...
L.Log_Message("System started");
```

この設計により、**同期点を持つ非同期処理**が明確に記述され、**スレッド間の暗黙的バグ**を消し去る。

---

## 並行設計が初めて「構文」になる瞬間

多くの言語では、並行処理はライブラリで行われるが、Adaでは**言語構文そのもの**に取り込まれている。

- `task` はスレッド
- `entry` は同期インターフェース
- `accept` は待ち合わせと処理

これらが統一された構文で記述されることで、**抽象度と制御の一貫性**が保証される。

---

## 安全性とは、予測可能性である

リアルタイムシステムや制御系において、**非決定性は致命的なバグの温床**となる。  
Adaはタスクの挙動を**構文と仕様で縛ることで、非決定性を最小化する**。

---

## 結語：動きの中にある秩序を

並行処理は混乱ではない。  
適切な構文と契約の中に設計された並行性は、**全体として一つの秩序を形作る**。

Adaのタスクモデルは、「複数が動くこと」ではなく、**「複数が協調すること」**を目的としている。

> _"非同期の時代における設計とは、分裂ではなく調和を築くことだ。"_
制約がもたらす解放：サブタイプとレンジ型の真価



> _"自由は、制約を知って初めて成立する。"_

多くのプログラミング言語が「自由度」を求める中、Adaは「制約」を徹底する。  
とりわけその設計思想は、型に対する厳密な定義の中に最も端的に現れる。

本稿では、Adaにおけるサブタイプ（subtype）とレンジ型（range）の持つ哲学的・構造的意義を探る。

---

## 範囲を定めることで、誤りを定めない

プログラムの不具合の多くは、**「本来来ないはずの値」が来る**ことで発生する。  
Adaはこの問題に対して、設計時に「来るべき値」しか存在し得ない構造を作る。

```ada
subtype Score is Integer range 0 .. 100;
```

この一行で、0〜100以外の値を受け取る余地が、文法的に消える。  
不正な値が来る可能性そのものを、**構文段階で封じる**のだ。

---

## サブタイプは設計者の意志を表す構造

Adaにおけるsubtypeは、単なる型の再定義ではない。  
それは「文脈における有効値の定義」であり、**意味論的な明示**である。

```ada
type Temperature is range -273 .. 1000; -- 絶対零度を下回らない
subtype Celsius is Temperature range 0 .. 100;
subtype Kelvin is Temperature range 273 .. 373;
```

ここには、**物理法則への忠実さ**と**文脈ごとの値制限**が自然に反映される。

---

## 実行時ではなく設計時に「止まる」ことの美しさ

多くの言語では、制約は実行時の例外やエラーハンドリングで対応する。  
しかしAdaでは、「最初に止まる」ことが美徳である。

```ada
type Age is range 0 .. 120;
My_Age : Age := -3; -- コンパイル時に拒否
```

このようにして、設計の意図を**未来の実行ではなく、現在の構文**で語る。

---

## 設計は「意志の構文」である

Adaのsubtype/range構造は、設計者の意図を静的に定義し、文法上の保証へと昇華する。  
これは単なる「型の厳密さ」ではなく、**仕様書を書かずに設計思想を伝える手段**でもある。

---

## 結語：制約の先にある自由

自由とは、無制限ではない。  
設計された制限の中で初めて、コードは**意味を持った構造体として立ち上がる**。

Adaが語るのは、「すべてを許さないこと」ではない。  
むしろ、「意味を持つことしか許さない」という、**設計に対する誠実な態度**である。

> _"最も自由なコードは、最も厳格な制約の中に生まれる。"_
【kintoneノーコード開発】kintoneアプリのアクセス方法まとめてみました

# はじめに
こんにちは、現在kintoneノーコード開発で日々試行錯誤しているばんちゃん（[@Banchan_k12](https://x.com/Banchan_k12)）です。
今回は、kintoneの「アプリにアクセスする方法」は、実はいくつかパターンがあり、使うシーンによって使い分けることができますので整理してみました！

### 対象
- kintoneアプリが多くなり、ポータル画面の「アプリ一覧」から見つけづらくなっている方
- アプリアクセス方法にどんな方法があるか知りたい方

#### アクセス方法
##### 1. ポータル画面からアクセス
:tools: 方法
ログイン後の「ポータル（ホーム画面）」に表示されている「アプリ一覧」からアクセス
「最近使ったアプリ」や「お気に入りアプリ」もここに表示されます
![20250421_6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957411/c38ad4fa-665a-4aca-8429-a42b108b82a0.jpeg)

:dart: 特徴
標準的な使い方で、よく使うアプリを「お気に入り登録」しておくとさらに便利！
[参照：5. URL直打ち（ブックマーク）でアクセス](https://qiita.com/Banchan_k12/private/ba709c38ad9e7b36710f#5-url%E7%9B%B4%E6%89%93%E3%81%A1%E3%83%96%E3%83%83%E3%82%AF%E3%83%9E%E3%83%BC%E3%82%AF%E3%81%A7%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9)


##### 2. スペースからアクセス
:tools: 方法
スペースに参加している場合、そのスペース内に設置されたアプリからアクセス
![20250421_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957411/9387e709-dbb5-4115-8594-1b938ddeaf7f.jpeg)


:dart: 特徴
プロジェクトやチーム単位で管理しているアプリにすぐアクセスできる
スペースのスレッド、ファイル、アプリをまとめて管理できる


##### 3. グローバルナビゲーション（アプリ一覧）からアクセス
:tools: 方法
kintoneの画面上部にある「アプリ」メニューから、登録されているアプリの一覧を表示してアクセス
![20250421_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957411/10849d41-f7d1-4541-994f-600997d2435b.jpeg)

:dart: 特徴
全アプリから探したいときに便利
スペースに属していないアプリにもアクセスできる


##### 4. お知らせに設定したリンクからアクセス
:tools: 方法
お知らせ編集から、URLリンク設定、保存する
![20250421_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957411/04074824-a57f-4219-8f7e-c80fea1f2707.jpeg)

:dart: 特徴
わかりやすく、アイコンなどを使ってお知らせすることができる


##### 5. URL直打ち（ブックマーク）でアクセス
:tools: 方法
アプリに直接アクセスできるURLを知っていれば、そこに直接アクセス
よく使うアプリはブラウザにブックマークしておくとすぐ開けます
![20250421_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957411/e661e676-4ed2-47da-a41d-0e4ac5e6cd28.jpeg)

:dart: 特徴
いちいちポータルに戻らなくてOK
外出先やモバイルでもすぐアクセス可能


##### 6. モバイルアプリからアクセス
:tools: 方法
kintone公式のモバイルアプリ（iOS/Android）をインストールし、そこからアプリにアクセス
![20250421_7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957411/a716b80f-842e-443e-9b3e-a5938248c205.jpeg)

:dart: 特徴
外出先でもサクッと操作
モバイル専用ビューになるため、PCと画面構成が違う点には注意

#### 図解まとめ
<table>
  <thead>
    <tr>
      <th>方法</th> 
      <th>シチュエーション例</th> 
      <th>メリット</th>
    </tr>
  </thead>
    <tr>
<td> ポータル画面 </td>
<td> 毎日業務開始時に </td>
<td> すぐに最近使ったアプリに行ける </td>
  </tr>
  <tr>
<td> スペースから </td>
<td> プロジェクト単位で管理 </td>
<td> 関連情報もまとめて見れる </td>
  </tr>
      <tr>
<td> お知らせ設定から </td>
<td> お知らせで共有、周知に活用 </td>
<td> アイコン設定などで分かりやすい </td>
  </tr>
  <tr>
<td> グローバルナビから </td>
<td> どこにあるかわからないアプリを探すとき </td>
<td> 一覧から検索できる </td>
  </tr>
  <tr>
<td> URL直打ち・ブックマーク </td>	
<td> 特定アプリだけ頻繁に使う </td>
<td> 最短でたどり着ける </td>
  </tr>
    <tr>
<td> モバイルアプリ </td>
<td> 外出先、営業先で入力・確認 </td>
<td> スマホ対応ビューでスムーズ </td>
  </tr>
</table>

# まとめ
- 「日常業務」ならポータル or スペースからアクセス
- 「よく使うアプリ」はURLブックマークがおすすめ
- 「出先から」ならモバイルアプリが便利！
シチュエーションごとに色々なアクセス方法を設定しておくと、アプリを探す時間も短縮され、便利に素早くアクセスが可能になりますね。
正しさに支配される言語：Adaとは何か



> _"曖昧さを排せ。設計は理性の言語であるべきだ。"_

現代の多くのプログラミング言語は「迅速さ」や「柔軟性」を謳い文句にしている。
それらは開発者に自由を与えるが、同時に誤謬への扉を開いてしまう。

**Ada**はその対極に位置する。
自由を削ぎ落とし、**正しさという制約の中にこそ解放がある**と語る言語だ。

---

## 言語が設計者に問うもの

Adaは、米国国防総省が**1983年に標準化**し、以後航空宇宙・鉄道・医療といった、
**「一度の誤りも許されない」領域で生き残ってきた**。

なぜAdaが選ばれるのか。それは、以下の要素に凝縮される：

- **静的型付けの徹底**：あらゆる曖昧さの排除
- **事前定義の明示性**：変数、型、関数、契約——あらゆる要素が予測可能
- **並列・リアルタイム対応の堅牢な構文**：設計レベルで安全性が担保される

たとえば、以下のようなコードにおいても：

```ada
procedure Launch is
   subtype Percentage is Integer range 0 .. 100;
   Thrust : Percentage := 150; -- コンパイルエラー
begin
   null;
end Launch;
```

この「範囲を逸脱するだけで許されない」世界観が、設計ミスをコードの段階で封じる。

---

## CやPythonとの違いはどこにあるか

Cは力強い。Pythonは柔軟だ。
だがそれゆえに「何が起きてもおかしくない」余地がある。

Adaは**「何が起きるかを完全に定義せよ」**と開発者に迫る。
これは単なる仕様ではなく、**思想**であり、**設計に対する倫理的態度**である。

---

## Adaという言語が持つ思想的側面

Adaは無駄が多い。習得も容易ではない。
だが、**「設計者に誠実であることを強いる」**その性格は、むしろ現代においてこそ再評価されるべきである。

社会インフラにおいて、チャットボットやSNSとは異なる設計の重さがあるように、
**プログラムにも「重み」を設計に込める言語**が必要なのだ。

---

## 結語：言語の選択は倫理である

Adaを選ぶということは、**正しさを譲らない設計姿勢を選ぶこと**に等しい。
それは開発効率を多少犠牲にしてでも、安全性、信頼性、そして設計の透明性を守るという意志の表れである。

今日の開発現場に求められるのは、**単なるスピードや流行への迎合ではなく、設計の構造的誠実さ**である。
そしてそれを可能にする言語が、Adaなのだ。

> _"設計とは、自らの誤謬と戦うための構造である。"_
Adaという選択：制約こそが美学である



> _"What cannot be clearly said should not be said at all."_  
> — Ludwig Wittgenstein

現代のソフトウェア開発は「自由」の名のもとに無秩序を内包してきた。  
しかし、ある種の不自由、すなわち**制約による明示性**こそが、システムの完全性を担保し得るのではないか。  
この問いに真正面から応答するのが、「Ada」という言語である。

---

## なぜAdaか

Adaはその誕生以来、航空宇宙・防衛・交通といった**ミッションクリティカルな領域**において採用され続けてきた。  
その設計思想は明確である——**「曖昧さを許さず、すべてを明示せよ」**。

- 強力な**型システム**
- 明確な**同時並行性モデル（task / rendezvous）**
- **コンパイル時検証**の徹底
- 明示的な**契約記述（pre/post 条件）**

このような特性は、動的型言語やスクリプト言語の「柔軟性」に慣れた開発者にとっては、最初は「過剰」に映るかもしれない。  
だがその「過剰」が、安全性・可読性・再検証性を極限まで高める。

---

## Adaの哲学：言語に倫理を

Adaは単なるツールではない。  
それは**設計の意思をコードに強制的に反映させる機構**であり、誤謬を意識化させる**倫理的フレームワーク**でもある。

```ada
procedure Launch_Satellite is
begin
   Initialize_Thrusters;
   if not Check_All_Systems_Ready then
      raise Program_Error with "System check failed before launch.";
   end if;
   Execute_Launch;
end Launch_Satellite;
```

このように、シンプルな構文の背後には「人命にかかわる処理である」ことへの**自覚**が埋め込まれている。

---

## SPARK Ada：形式検証との融合

より厳格な保証を求めるなら、Adaのサブセットである**SPARK Ada**がある。  
これは「数学的証明可能性をコードに要求する」世界であり、いわば**プログラム＝証明**という構図を現実化する。

```ada
function Safe_Divide (X, Y : Integer) return Integer
   with Pre  => Y /= 0,
        Post => Safe_Divide'Result * Y = X;
```

このPre/Post条件により、**ゼロ除算を防ぐ保証**と**正しさの数学的帰結**が同時に導かれる。

---

## 結語：知的誠実さの象徴としてのAda

Adaを選ぶことは、流行とは逆行する選択かもしれない。  
しかしそれは**理性への信頼**であり、**設計の本質を問い続ける行為**である。

私たちが設計するのは、ただ動くプログラムではない。  
それは、人間の誤謬に抗い続けるための、**理性の構造物**である。

だからこそ、Adaは美しい。

> _"Correctness is not optional."_  
> — Ada/SPARK developers
【Claude 3.7sonnet】読書管理アプリ開発レポート!

## はじめに
こちらClaude入門アプリ開発体験レポート 第2弾となります
第一弾はこちら↓↓↓

https://qiita.com/shimizu_432/items/0c8a8e91365b79164e33

今回は読書管理アプリを作ります！
理由は…研修とかでつくりそうなアプリだからです
Claude入門なので良いでしょう

ということで早速作っていきます

## 読書管理アプリを作っていく！

プロンプトはこちら
```ruby:プロンプト
以下のアプリを作って
読書管理アプリ
　機能: 読書リストの作成、読書進捗の記録、レビューの投稿、読書目標の設定など。
　特徴: ユーザーが読書習慣を維持し、読書体験を共有できるようにします。
```

実は、この設定はChatGPTに作ってもらいました、、！
結果はこちら！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954326/ded5133b-ca0e-4e58-93f4-e54a309f0984.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954326/86c2914e-65a8-41cd-98df-5a0a61250174.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954326/2c357d63-0ec9-4285-88c0-1a25bf826197.png)

まさかの3画面もあるタイプ！

前回のタスク管理アプリが1画面だったので
1画面しか作れないのかと思い込んでいましたが、3画面なら作れるようです！

カスタムしていきます！見やすいものにしたい！

```ruby:プロンプト
ダッシュボードの方にもグラフなどを追加し、一見で色々と分かるようにして
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954326/463b54d5-c768-4958-9706-86824f7e1b7c.png)

円グラフとかついて色々見やすくなりました！
一見で分かるものの、縦長になりすぎましたね

```ruby:プロンプト
ダッシュボードをスクロールができるだけ少なくなるようなデザインにして
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954326/7068c755-543a-4463-b8b9-75f1a5b8f4a2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954326/07be9c7f-95b0-49f6-bd72-fbe3a2050323.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954326/9fccd64b-9779-4c20-9390-ea9d246bdc54.png)

こちらエラーが頻発し、シンプルな読書管理アプリに戻ってしましました、、、
戻ったというか、最初のよりもシンプルになってます

諦めずにカスタムしていきます
```ruby:プロンプト
書籍をジャンル分け出来るようにして。また、ダッシュボードを見やすいようにグラフなどを追加して
```

1回で2つも要望してしまいましたが、生成してくれるでしょうか
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954326/0a4c1856-7272-47ba-8800-7c704eaae302.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954326/3eee2ed8-8e44-46c7-8230-934db7b340f2.png)

何度かエラーは出ましたが、要望通りにしてくれました！

動作確認したところジャンル分けのところがおかしかったので、
そこを修正してもらいます。ついてにデザインも要望します

```ruby:プロンプト
ジャンル分けの部分が上手く行ってないみたい。直して
また、総冊数と読了、読書中、未読を横一列に書いてほしい
```
生成してくれたものの、デザインは変わらず、、、
再度、動作確認したところ保存の部分にも不備が見つかり、そこを優先的に直してもらうことに

```ruby:プロンプト
編集後の保存ボタンが動かない
```
こちら何度もお願いしても動きは治らずでした
ブラウザのコンソールにエラーが表示されていないかを確認する用に促されました

結果、保存されるようになりました！（デザインは変わらず）

## 今回の気づき
・配置的なデザイン面は苦手そう
・1度に複数お願いするとエラーがでやすそう
・3画面は作れる
・グラフも追加できる

## 最後に
今回は読書管理アプリを作成しました
まだまだ気づきがありそうなのでもう少しアプリを作ってみたいと思います！
プライベート認証局でCockpitにhttpsで接続する

自室サーバはLDAP認証を入れるまではとTLS化を後回しにしてきましたが、ようやくLDAP認証にできたので今度はシステム全体をTLS化していくことにしました。

まずは入り口のCockpitのTLS化を行いますが、もうあっちこっちでやり方が書かれているので自分用の備忘録だけ。

# RootCA証明書を作る
OSはFedora42でSELinuxは有効にしています。

ドメインも持っているしLet`s Encryptを使おうか、と一瞬思いましたがインターネットにつながってないと(やらかしてよくサーバ(=ルータ)が落ちる)認証が止まるので、無しの方向で……

というわけでオレオレ認証局でやることにしました。

## RootCAの秘密鍵の生成

サーバ証明書等に署名するためのオレオレRootCAの秘密鍵(rootCA.key)を作ります。

4096ビット長RSA鍵にしました。

```bash
$ openssl genrsa -out rootCA.key 4096
```

秘密鍵なのでしっかり管理しましょう。

## RootCAの自己署名証明書の作成

PCやブラウザに登録して **オレオレCAだけど信頼してやんよ** ってするための証明書です。

各クライアントに入れるメンドクサさはありますが、インターネット接続ができなくても使えるのが便利です。

```bash
$ openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -out rootCA.crt
...
入力していく(CommonName以外はあんまり重要じゃない)
```

証明書なのでコチラを各端末に配布します。

# Server証明書を作る

サービスするサーバー側の証明書です。クライアントはこの証明書を見て信頼できると判断したらTLSセッションを開始します。

実際に信頼できるかどうかはRootCA証明書と付き合わせて判断します。

## サーバー証明書の秘密鍵の生成

2048ビット長RSA鍵にしました。

```bash
$ openssl genrsa -out server.key 2048
```

こちらはサーバアプリケーションごとに置き場所が決まってたりするので、証明書を作った後で移動なりコピーなりします。これも秘密鍵なので漏らさないように工夫が必要なやつです。

## 証明書署名要求(CSR)の作成

RootCAに認証してもらうための情報ファイルを作ります。

SAN(SubjectAlternativeName)を使うと複数ドメイン、IP、ホストが設定できて便利よーとのことだったので、SAN形式を使います。

流石に０から作るのは面倒だったのでGeminiさんに作ってもらいました。

```san.cnf
[req]
req_extensions = v3_req
prompt = no
distinguished_name = req_distinguished_name

[req_distinguished_name]
C = JP
ST = Shimane
L = Masuda
O = MyHome
CN = minipc.home

[v3_req]
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1 = minipc.home
DNS.2 = localhost
IP.1 = fdxx:xxxx:xxxx::xxxx
```

先ほど作ったサーバ証明書用の秘密鍵を使ってサーバ証明書を作成します。

```bash
$ openssl req -new -key server.key -out server.csr -config san.cnf
```

## RootCAによるサーバー証明書への署名

いくらサーバが **俺を信じろ！** といったところでだれも信用してくれないので、信頼できるRootCAさんのお墨付き(署名)をもらいます。

```bash
$ openssl x509 -req -in server.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out server.crt -days 365 -sha256 -extfile san.cnf -extensions v3_req
```

CAcreateserialオプションはrootCA.srlというシリアル番号ファイルがあればその番号を使い署名後値を１増やします。ファイルが無ければ適当なシリアル番号が振られてファイルが作成されます。

署名のシリアル番号がかぶってはイケナイのでこのファイルもrootCA.keyと一緒に管理しろとのことです。

後のオプションはわりと見たまんまですね。

# Cockpitに署名を導入

デフォルトの設定では`/etc/cockpit/ws-certs.d`にサーバ証明(cert,key)を置けば自動で使ってくれるらしいのでコピーするだけです。

```bash
$ cp server.crt /etc/cockpit/ws-certs.d/0-server.cert
$ cp server.key /etc/cockpit/ws-certs.d/0-server.key
```

オーナーがroot、パーミッションがkeyは600、certが644以下になっていることを確認しておきます。

```bash
$ ls /etc/cockpit/ws-certs.d
...
-rw-r--r--. 1 root root 1749  0-server.cert
-rw-------. 1 root root 1704  0-server.key
```

再起動すれば反映されます

```bash
$ systemctl restart cockpit
```

# ブラウザの設定

ブラウザにrootCA.crtを設定してブラウザを再起動すれば鍵マークに警告がでなくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140718/f9c808c8-1821-4dd2-8dc7-ea213a8b741d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140718/a14632f3-78e1-4727-a1ea-20a85c809b51.png)
開発端末の入れ替え等で既存のexpoプロジェクトの開発環境を再構築した際に、Network request failedエラーが表示された場合の対処法

## 不具合内容
使用していたMacBookを買い替えた際に、その新しいMacBookに既存のexpoプロジェクトの再構築（XcodeにかかるiOSシミュレーターも含む）をし、シミュレーター起動後にAPI接続を必要とする処理を行ったところ、`TypeError: Network request failed`とシミュレーター画面上にエラーとして表示された。
## 試したこと
1. 使用ネットワークの不具合？
ルーターの再起動や、端末上のネットワーク接続が「自己割り当てip」になっていないか確認したが、異常は確認できなかった。
2. 端末におけるフィルタやファイアウォールが悪さをしている？
試しにフィルタやファイアウォールを無効化して再度処理を実行してみたが、エラー状態に変化はなかった。
3. プロジェクト内に設定している環境変数が間違えている？ 
こちらも各所からコピペして再度処理を実行してみたが、エラー状態に変化はなかった。
4. supabase側が不具合で接続できない状態になっている？
SNSや公式サイトにて確認したが、不具合などは報告されていなかった。
## 解決方法
**iOSシミュレーター上のExpo Goアプリをアンインストールし、再度インストールする**ことでエラーは解消された。

(参照記事)

https://github.com/supabase/supabase-js/issues/675#issuecomment-1804492750

以下は実際に行った対応フローです。
1. iOSシミュレーター上のExpo Goアプリをアンインストール
2. iOSシミュレーターを`cmd + Q`で終了
3. 起動しているexpoプロジェクトを終了
4. `npx expo start -c`でexpoプロジェクトを起動
5. `i`キーにてiOSシミュレーターを起動する（この時にExpo Goアプリがシミュレーター内に自動インストールされる）
6. iOSシミュレーター内でExpo Goアプリ起動後、エラーが表示された処理を再度実行する

## 余談
今回開発端末を新調したのですが、github上に環境変数を上げていないため、開発環境を再構築する際に色々とキーを取得・再生成するのが大変だった・・・。
（すでに前の端末は初期化していたため後の祭り）
【Teams電話】パーク保留を利用する方法

# はじめに

Teams のパーク保留を利用すると、保留された通話の番号を入力して、別のユーザーが保留解除して通話を引き継ぐことができます。パーク保留の設定方法についてまとめました。

# パーク保留とは？

パーク保留を利用すると、通話を保留した際に番号が発行され、その番号を使用してほかのユーザーが保留解除して通話を引き継ぐことができます。

::: note
パーク保留した通話を自分で異なるデバイスから保留解除する、という使い方もできます。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/3e22354a-ad12-432b-8e30-ab6375561a70.png)

(参考：コール パークを構成して取得する)
https://learn.microsoft.com/ja-jp/microsoftteams/call-park-and-retrieve

# 設定方法

## 1. パーク保留の有効化

パーク保留は既定で無効化されています。パーク保留を有効化するには、**[音声] - [コールパーク ポリシー]** から設定を変更します。

パーク保留を有効化するには、コールパーク ポリシーの **[コールパーク]** を **[オン]** に設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/fc704dfc-c4bf-439a-bc90-fd6c1905be32.png)

特定のユーザーのみパーク保留を有効化するには、**[+追加]** ボタンからポリシーを作成し、ユーザーに割り当てます。

::: note
グローバル ポリシーの [コールパーク] を [オン] に変更すると、テナント内の全ユーザーが既定でパーク保留が有効になります。
既定ではグローバル ポリシーの [コールパーク] は [オフ] です。
:::

## 2. コールパーク ポリシーのユーザーへの割り当て

コールパーク ポリシーをユーザーへ割り当てる方法は [他のポリシーと同様](https://qiita.com/atsmin77/private/e37498a5e02d07bc37af#2-%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%B8%E3%81%AE%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC%E3%81%AE%E5%89%B2%E3%82%8A%E5%BD%93%E3%81%A6) です。

::: note warn
パーク保留を行うユーザーと、保留解除するユーザーは同じコールパーク ポリシーが割り当てられている必要があります。
:::

# テスト

## 1. パーク保留を行う

パーク保留が有効になっている場合、通話中の画面で **[…(その他)] - [通話をパーク]** が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/62715c75-59ba-4617-a670-77c62f37b912.png)

[通話をパーク] をクリックすると、通話が保留になり、保留解除用の番号が発行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/899cf208-c036-4453-a85a-e8e3be802377.png)

## 2. パーク保留を解除する

パーク保留が有効になっている場合、**[通話]** タブに **[パークされた通話]** ボタンが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/a907f390-4ffb-4946-89ab-7593134cf436.png)

[パークされた通話] をクリックすると、番号を入力するダイアログが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/5858d1c9-cce1-4658-94f8-30d60c6dad42.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/055f5e88-19ce-4a5b-a673-70692d4aecd0.png)
ドメインか、リポジトリか──責務の境界で迷った開発メモ

# 問題

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3868342/d3e058b2-f604-41ea-ae64-9550455fe6f8.png)  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3868342/caccfdd3-31d2-4831-b85c-da35b10ab949.png)

上図のように、`UserPersona` エンティティと `UserPersonaRepositoryInterface` を定義した。

このとき私は、エンティティのドメインメソッドとリポジトリのメソッドを見比べて、「どちらも情報の取得や更新を行っており、責務が重なっているのでは？」という疑問を抱いた。

特に、以前の設計では `UpdatePersonalInfos(userID, infos []PersonalInfo)` のように、リポジトリがエンティティ内部の情報に直接アクセスして更新する設計となっており、「これはリポジトリが本来持つべき責務を超えていないか？」という違和感があった。


# 解決

ユースケース層の構造を見直すことで、それぞれの責務の違いが明確になった。

```go
// ユースケース層の例
persona := repo.FindByUserID("user-123")               // ← データ取得（リポジトリ）
persona.UpdatePersonaInfoByName("趣味", "サウナ")        // ← 状態変更（ドメインメソッド）
err := repo.Update(persona)                             // ← 永続化（リポジトリ）
```

- **リポジトリの責務**は、`UserPersona` 集約ルート全体を取り扱い、**エンティティ単位での取得・保存・削除**を担当する。
- 一方で、**ドメインメソッド**は `UserPersona` の内部状態（`personalInfos` など）に対する**業務ルールに基づく変更処理**を担う。

このように、責務を正しく分離することで、リポジトリがドメインの内部構造に介入することを防ぎ、ドメインモデルの保守性と一貫性を保つことができる。



# ✔ 教訓

> 「リポジトリが操作するのは、あくまで**集約ルート全体**である」  
> 「**状態を変更するのはドメインの責務、状態を保存するのはリポジトリの責務**」

当初は曖昧に感じた両者の役割も、Clean Architecture の原則を意識することで、明確に区別して設計できるようになった。
【Teams電話】通話中の着信を表示しない方法

# はじめに

Teams の通話ポリシーの設定によって、通話中に着信があった場合に着信を表示しないようにすることができます。設定方法についてまとめました。

# 設定方法

## 1. 通話ポリシーの設定

Teams 管理センターの **[音声] - [通話ポリシー]** から **通話ポリシー** で、ユーザーの通話に関する動作を制御することができます。

新規にポリシーを作成する場合は **[+追加]** ボタン、既存のポリシーを変更する場合はポリシー名をクリックします。

通話中に着信があった場合の動作は通話ポリシーの **[通話中は取り込み中]** から設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/95bec848-fc65-46f0-894d-5a0b5034e7f2.png)

::: note
[通話中は取り込み中] の設定を **Busy on busy** とも呼びます。
:::

[通話中は取り込み中] の設定は以下から選択します。

| 通話ポリシー | 説明 |
|:-:|:-:|
| オン | 通話中にあった着信は切断する |
| オフ | 通話中であっても着信する  |
| 未回答の設定を使用 | ユーザーの [通話に応答できない場合] の設定に従ってリダイレクトする | 
| ユーザーが決定できるようにする | Teams クライアントでユーザーが自由に設定できる | 

### [オン] にした場合

**[通話中は取り込み中]** を **[オン]** にすると、通話中であれば新たに着信しません。発信元のユーザーには以下のような画面が表示され、切断されます。

::: note
通話中にあった着信は、着信履歴に不在着信として表示されます。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/41672a7b-af06-41d0-af09-057fdf0d322f.png)

### [未回答の設定を使用] にした場合

通話中にあった着信は、ユーザーの **[設定] - [通話] - [通話に応答できない場合]** の設定に従ってリダイレクトされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/4d36462e-7c09-4443-87c4-ef02fa26fd55.png)

### [ユーザーが決定できるようにする] にした場合

ユーザーの Teams クライアントに **[設定] - [通話] - [通話中に別の通話を受信したとき]** の設定が表示され、ユーザーが自由に変更することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/05fac2f7-c6aa-4a72-a8ad-646955d968b0.png)

::: note info
通話ポリシーと Teams クライアントで設定項目の名前が異なります。
:::

| 通話ポリシー | Teams クライアント |
|:-:|:-:|
| オン | ビジーシグナルを再生する |
| オフ | 新しい通話を呼び出す |
| 未回答の設定を使用 | 通話に応答がないかのようにリダイレクトする |

## 2. ユーザーへのポリシーの割り当て

1 で設定したポリシーをユーザーに割り当てます。ポリシーのユーザーへの割り当ては **[ユーザー] - [ユーザーを管理] - [ポリシー]** タブから行います。

変更したいポリシーに ✅ を入れて、**[編集]** ボタンをクリックして、ユーザーに割り当てるポリシーを変更します。

::: note
ユーザーには既定で **グローバルポリシー** が割り当てられています。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/a03dd7ba-f13c-48bb-8c85-bc65fab95746.png)

## 補足

::: note warn
[通話中は取り込み中] の設定は、グループチャットから開始された通話や会議参加リクエストによる通知には適用されません。
:::

公開情報にはこの設定は "着信グループ通話" には適用されないと記載されています。

(参考：ビジー オプションを構成する)
https://learn.microsoft.com/ja-jp/MicrosoftTeams/inbound-call-routing#configure-busy-optionsｆ
>...この設定は、着信グループ通話や会議参加要求には適用されません。

試してみたところ、グループチャットから開始された通話の場合には、[通話中は取り込み中] の設定に関わらず通話中であっても着信しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/d401aa0d-8950-415c-acc3-605c5ff3269d.png)

通話グループや代理人機能による着信の場合、[通話中は取り込み中] がオンになっていると通話中は着信せず、[通話中は取り込み中] の設定が有効でした。

※ 関連記事

https://qiita.com/atsmin77/items/156c5bdc038f3b688a96

https://qiita.com/atsmin77/items/77f869629a2e660cd801
【Laravel】ナビゲーションリンクの日本語化

# 何をしたい？
「//views/layouts/navigation.blade.php」内のナビゲーションを日本語化したい。

↓ ゴール
通常画面サイズ時
![スクリーンショット 2025-04-23 18.04.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726068/5e60e6bc-ec76-4e27-9ae4-9955ce56620f.png)

スマホサイズ時
![スクリーンショット 2025-04-23 18.05.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726068/a2980833-3fb8-4df8-be42-0cbe74bdba08.png)



# 手順
/views/profile/edit.blade.php から順に解説していきます。

## ① 言語のデフォルトを ja に変更
これを設定しておけば、翻訳ファイルの /lang/ja を自動的に読み込みます。
```config/app.php
'locale' => 'ja',
```

## ② ファイル作成
「/lang/ja/navigation.php」を作成(まだなかったら)。
```bash
touch lang/ja/navigation.php
```

## ③ 翻訳作成
基本ルールとして、「lang/ja/navigation.php」のkeyは　「小文字」と「_」で作成する。
```lang/ja/navigation.php
<?php

return [

    'profile' => 'プロフィール',
    'log_out' => 'ログアウト',
];
```

## ④ navigation.php を編集
③で作成した翻訳のkeyを記載する。
そのkeyの前に翻訳が記載されているファイルであるauthをつける。

```/resources/views/layouts/navigation.blade.php
# 編集前
<x-dropdown-link :href="route('profile.edit')">
    {{ __('Profile') }}
</x-dropdown-link>
# 編集後
<x-dropdown-link :href="route('profile.edit')">
    {{ __('navigation.profile') }}
</x-dropdown-link>

# 編集前
<x-dropdown-link :href="route('logout')"
        onclick="event.preventDefault();
                    this.closest('form').submit();">
    {{ __('Log Out') }}
</x-dropdown-link>
# 編集後
<x-dropdown-link :href="route('logout')"
        onclick="event.preventDefault();
                    this.closest('form').submit();">
    {{ __('navigation.log_out') }}
</x-dropdown-link>

# 編集前
<x-responsive-nav-link :href="route('profile.edit')">
    {{ __('Profile') }}
</x-responsive-nav-link>
# 編集後
<x-responsive-nav-link :href="route('profile.edit')">
    {{ __('navigation.profile') }}
</x-responsive-nav-link>

# 編集前
<x-responsive-nav-link :href="route('logout')"
        onclick="event.preventDefault();
                    this.closest('form').submit();">
    {{ __('Log Out') }}
</x-responsive-nav-link>
# 編集後
<x-responsive-nav-link :href="route('logout')"
        onclick="event.preventDefault();
                    this.closest('form').submit();">
    {{ __('navigation.log_out') }}
</x-responsive-nav-link>
```



## 結果
通常画面サイズ時
![スクリーンショット 2025-04-23 18.04.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726068/5e60e6bc-ec76-4e27-9ae4-9955ce56620f.png)

スマホサイズ時
![スクリーンショット 2025-04-23 18.05.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726068/a2980833-3fb8-4df8-be42-0cbe74bdba08.png)



# 補足： auth認証の日本語化の手順
https://qiita.com/honaki/items/2906571f60a95c5b4f37#%E4%BD%95%E3%82%92%E3%81%97%E3%81%9F%E3%81%84

# 補足： プロフィールの日本語化の手順
https://qiita.com/honaki/items/7f171cd5dd3524d84190

# 補足： 
https://qiita.com/honaki/items/abb7a103eab411f2cc49
Go学習記録3日目　レスポンスタイムを計測するCLIツールの作成①

Go言語学習の3日目です。

今日はWebサービスのレスポンスタイムを計測するCLIツールを作成しました。

### 作った機能
go run main.go <URL>と叩くと、レスポンスのステータスやレスポンスが返ってくるまでの時間を表示する機能を作りました。また、結果をjsonファイルに保存できるようにしました。


### os.Argsによるコマンドライン引数の取得
前回Todoアプリを作成したときは、コマンドライン引数はflagパッケージで取得しました。今回は、os.Argsで取得しました。
想定では、go run main.go <URL>と叩いたとき、os.Args[0]で<URL>が取得できると考えていましたが、どうではありませんでした。
```
fmt.Printf("%v\n", os.Args) 
// go run main.go a b c
// 実行結果
// [C:\Users\R247E~1.SAD\AppData\Local\Temp\go-build1367157334\b001\exe\main.exe a b c]
```
go run main.goを実行した時、main.goを一時的なフォルダにビルドして、.exeを一時ファイルに出力、その.exeを即座に実行して、終わったら削除という流れになります。os.Args[0]はGoが一時的に作った.exeのパスになる（つまり、実行されたバイナリのパス）





### 作成したファイルと次回の課題
saveResultメソッドの条件分岐の書き方が適当になってしまった。あと、エラーメッセージをfmt.Errorfでラップしたい。また、ログファイルとしてログを出力させたい。
また、goroutineを使って、複数URLを並行チェックできるようにしたい。
```
package main

import (
	"encoding/json"
	"fmt"
	"io"
	"log"
	"net/http"
	"os"
	"time"
)

func main() {
	if len(os.Args) < 2 {
		fmt.Println("Usage: go run main.go <URL>")
		return
	}

	url := os.Args[1]
	start := time.Now()

	resp, err := http.Get(url)
	elapsed := time.Since(start)

	if err != nil {
		fmt.Printf("[×]%s - Error: %s\n", url, err)
		return
	}
	defer resp.Body.Close()

	result := Result{
		Url:          url,
		ResponseCode: resp.StatusCode,
		StatusText:   http.StatusText(resp.StatusCode),
		ResponseTime: elapsed.Milliseconds(),
	}
	if err := saveResult(result); err != nil {
		log.Printf("Failed to save result: %v\n", err)
	}

	fmt.Printf("[✓]%s -%d %s -%dms\n",
		url,
		resp.StatusCode,
		http.StatusText(resp.StatusCode),
		elapsed.Milliseconds(),
	)

}

type Result struct {
	Url          string
	ResponseCode int
	StatusText   string
	ResponseTime int64
}

func saveResult(NewResult Result) error {
	var results []Result

	file, err := os.Open("results.json")

	if err != nil && os.IsNotExist(err) {
		os.Create("results.json")
	} else if err != nil {
		return fmt.Errorf("read error: %w", err)
	} else {
		defer file.Close()

		byteValue, err := io.ReadAll(file)
		if err != nil {
			return err
		}

		err = json.Unmarshal(byteValue, &results)
		if err != nil {
			return err
		}
	}

	results = append(results, NewResult)

	file, err = os.Create("results.json")
	if err != nil {
		return err
	}

	encoder := json.NewEncoder(file)
	return encoder.Encode(results)
}

```
PowerShellで特定のピクセル以下の画像(.jpg)を判定する（備忘録）

```powershell

$path = "画像があるフォルダのpath"

#画像サイズを取得するためのAssembly
Add-Type -AssemblyName System.Drawing

#拡張子が.jpgのファイルのpathを再帰的に取得し$image_path_aryに入れる
$image_path_ary = Get-ChildItem -Path $path -Recurse -Include "*.jpg" | Select-Object -ExpandProperty FullName

#条件に当てはまる画像pathを入れる配列を定義
$err_images =@()

#forする
$image_path_ary | % {

    $tmp_Width = [Drawing.Image]::FromFile($_).Width
    $tmp_Height = [Drawing.Image]::FromFile($_).Height

#縦か横が640ピクセル以下の画像を判定し$err_imagesにいれる
    if($tmp_Width -le 640){
        $err_image += $_
    }elseif($tmp_Height -le 640){
       $err_image += $_ 
    }

}

#結果確認
$err_image.count
$err_image


```

$err_imageをMove-Itemして小さい画像のみフォルダへ

```powershell
Move-Item -Path "移動させるファイルのpath" -Destination "移動先のpath"
```
技術記事を書くことの効用〜これを読めばきっと書きたくなる〜

## はじめに
この記事は会社のSlackの個人チャンネルで「声を大にして言いたい」として、書き殴った内容を改めて文章として清書したものです。

私は記事を書くのも読むのも好きなので、これを読んで多くの人が技術記事の執筆に興味を持ってくれればいいなと思っています。

## 記事を書くことの効用
### 技術力の物差しになる
自分が何をどのくらいできるのかを測るのは簡単ではありません。

「あなたの得意なことはなんですか？」

と聞かれたときに「◯◯です。」と答えるのは簡単ですが、

「じゃあ、それを見せてください」

と言われると、ちょっと詰まってしまいます。

個人開発したアプリやWebサイトなどがあれば一番わかりやすいのかもしれませんが、少しハードルは高そうです。

そんなときに、技術記事は自分の技術力の一部を可視化してくれます。
内容は自分が学習したこと、解決したエラーなどさまざまですが、そのいずれも自分ができることが形になったものです。

ちょっとしたエラーの内容と解決方法をまとめるくらいなら、1時間くらいでかけてしまうかもしれません。

「未知のエラーにも臆することなく対処ができます」

と口頭で答えるだけよりも

「例えば、以前はこうやって解決しました」

と提示できれば説得力がありますし、わかりやすいです。

自分ができること、知っていること、やったことは形にすることで初めて他人から計測可能になります。
ちょっとしたことでも書いてみることをおすすめします。

### 外部記憶装置になる
一生懸命調べてなんとか実装したけど、あとから思い返したときにどうやったのか思い出せないことってありませんか？
私は割とよくあります。

普段あまり使わないライブラリの使い方とか、ググっても出てこないような独特な実装とか、あれだけやったはずのに時間が立つときれいさっぱり忘れてしまいます。

仮に忘れたとしても、その時の実装を記事としてまとめておけば、あとから見返せばいいだけなので以前ほどの時間がかかりません。
しかも、他人ではなく自分が書いた文章なので、自分にとって一番わかりやすい内容になっていてスッと理解できます。

私はLINE開発関連の記事をよく書いているのですが、そのおかげで過去の自分に何度も助けられています。
未来の自分のつまづきを解消すると思って、困ってることや頑張っていることを記事にしてみてはいかがでしょうか。

### 自分の「わかっていないこと」が明らかになる
わかっているつもりになっていることはよくあります。というより、世の中つもりだらけです。

花の「バラ」を漢字で書けますか？（書ける人はめっちゃすごい！）
おそらく大半の人は「あー、なんとなく頭には浮かぶんだけどな」という状態だと思います。

あのメソッドのオプションの指定の仕方、似ている機能の使い分け、滅多にやらない環境構築なども同じことです。
なんとなくわかってはいるけど、実際にやると細かいところの理解ができていないことは多くあります。

自分がよく知っていると思っていることでも、他人に説明するつもりで記事してみると自分が雰囲気で理解しているところが浮き彫りになります。
そこを改めて調べて自分の言葉で形にすることで、より深い理解に繋がり、実践的な知識として身につきます。

頭の中にあるものを形にすることで、客観的に見ることができるようになります。
自分がよく知っていることをあえて記事にしてみると、新たな発見があるかもしれません。

### モチベーションが上がる
人に褒められたり、認めてもらえたりするのは嬉しいものです。

記事を読んでもらえたり、いいねしてもらえたりすると単純にめちゃくちゃ嬉しいです。
それだけでなく、自分の書いた記事が誰かの役に立っていることがわかったときの喜びは、より一層大きなものになります。

私は以前、自分の記事が「参考になった」と会社のSlackで紹介していただいたことがありました。

<img width='80%' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251137/e5abc948-73f4-4758-80a1-72d883194bdd.png'>

このときはやる気がググっとアップしたのを覚えています。

じゃあ、誰にも読まれず、誰にも反応ももらえなかったらどうするのかという話になりますが、そうであっても問題ありません。
もちろん、一抹の寂しさはありますが、誰かの反応はあくまでも副産物です。

「技術記事を書いたほうがいいよなぁ」、「書いてみたいなぁ」
と思う人はたくさんいますが、実際に書いている人はそんなに多くありません。

そんな中、短くても、簡単でもいいのでなにか1つ形にしたときの達成感は、やった人にしか味わえません。

何かをやり切ったり、どんな形でもいいから成果を残すことは確実に自分の自信に繋がります。
まずは1つ、試しに何か書いてみませんか？

### 成長を実感できる
子どもの頃、「お、いま背が伸びているな？」と感じた人はほとんどいないと思います。
しかし、毎年の身体測定では確実に去年に比べて伸びていることがわかったのではないでしょうか。
日々の身長の伸びは目に見えては感じられませんが、測定することで過去との差分を取ることで、その成長の幅を知ることができます。

技術力も同じです。

新しくITエンジニアになった人は、日々の業務や覚えることに圧倒され、何もできていない無力さを感じているかもしれません。
長く業界に身を置いている人の中には、技術が伸び悩んでいるなと感じている人もいるでしょう。

記事は、その時の自分のスナップショットです。
あとから見返すことで、過去の自分との差分を実感できます。

あのときはこんな事もできていなかったのか
このときは、ここまでしか理解できていなかったけど、今はこの知識とも結びつけられるな

など過去と比べたとき、確実にできるようになっていることが増えています。

成長しているのかわからないなという人は、まずは今取り組んでいること、わかったことを記事にしてみてください。
あとから見返したときに、自分が前に進んでいることを知ることができます。

## まとめ
技術記事をかくとこんないいことがあるよ
というのを全部で5つあげてみました。

この中のどれか1つでも、読んでくれた方の心の何処かに刺さって、今すぐでなくてもいいので、技術記事を書くきっかけになってくれればいいなと思っています。

Qiitaはレベルが低くなったとかオワコンだとか言われていますが、私が観測する範囲では7年くらい前からずっと繰り返し蒸し返されている話なので、記事を書くのに恐れる必要はありません。

どんな形でもいいので、自分の力でまずは一本、ぜひ書いてみてください。
[Mac] Automatorとdisplayplacerコマンドを使ってディスプレイ解像度を切り替えるアプリケーションを作る

# はじめに

筆者は在宅勤務環境でUWQHD（解像度：3440×1440）のディスプレイを使用しています。ウィンドウを2つ並べても十分な表示領域を確保できて便利ですが、Web会議でこの解像度の画面を共有すると、横に長く小さく表示されてしまうという不便さもあります。
画面を共有するたびにMacのシステム設定から解像度を切り替えるのは非常に面倒なため、Automatorから displayplacerコマンドを実行して解像度を切り替えるアプリケーションを作成します。

# 前提
後述するShellスクリプトで使用するdisplayplacerとggrep（GNU grep）コマンドは、Macには標準で含まれていないため、事前にHomebrewなどでインストールしておく必要があります。

# Script
まずは、次のようなShellスクリプト（.shファイル）を作成し、動作を確認します。
解像度の切り替えは、3440×1440（アスペクト比21:9）と2560×1440（アスペクト比16:9）を交互に切り替える形式です。
この環境では、Homebrewをホームディレクトリ以下にインストールしています。そのため、displayplacerコマンドおよびggrepコマンドはフルパスで記述します。これは、brewのbin（実行ファイルフォルダ）にパスを通しても、Automatorに組み込んだ際に環境パスが反映されないためです。
なお、コマンドのフルパス、解像度、ディスプレイのUUIDなど、displayplacerの引数は各自の環境に合わせて適宜修正してください。ディスプレイのUUIDは、displayplacerをlistオプション付きで実行すれば確認できます。

```Script:sh
#!/bin/zsh

curres=$(/Users/username/.homebrew/bin/displayplacer list | grep 'current mode' | /Users/username/.homebrew/bin/ggrep -oP 'res:\K[^ ]+')

if [[ $curres == "3440x1440" ]] then
	/Users/username/.homebrew/bin/displayplacer "id:<UUID> res:2560x1440 hz:144 color_depth:8 enabled:true scaling:off origin:(0,0) degree:0"
else
    /Users/username/.homebrew/bin/displayplacer "id:<UUID> res:3440x1440 hz:144 color_depth:8 enabled:true scaling:off origin:(0,0) degree:0"
fi
```

# Automatorでアプリ化
Shellスクリプトが正常に動作したら、次はAutomatorを使ってアプリ化します。
まず、Automatorを起動して新規アプリケーションを作成し、アクションの種類として「シェルスクリプトを実行」を選択します。そこに、先ほど作成したShellスクリプトの内容を貼り付け、適当な名前を付けてアプリケーションとして保存します。

![Automator_SRapp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490802/b6d44f54-0b37-4da3-9a3f-74e26ddca0ba.png)

このアプリケーションをDockに登録しておけば、クリックするだけで瞬時に解像度を切り替えられるようになります。
[js]この要素は存在するか？変数まで！関数を作ったよ！

こんにちは。名無しのnです！今日はこの要素は存在するか確かめるプログラムを書きます！
解説ももちろんします！
## コード
```main.js
function check_get(name,eleclass) {
   let getele ;//変数定義
    if (name[1]=="#"||name[1]==".") {//要素か
        if (name[1]==".") {//クラスなら
            
        if (eleclass) {//存在するか(Eleclass)
            getele=document.querySelectorAll(name)[eleclass]///eleclassはx番目だからget
        }else{
            getele=document.querySelector(name) //classget!
        }
        }
        
        if (getele==undefined) {//idならです。
            getele=document.querySelector(name)//getで代入
        }
        if (!getele) {//geteleではない
            return false //要素が存在しない
        }
        return getele
    }else{
        if (! name) {
            return false
        }
        return name
    }
}
```
まずは,関数を定義します。名前はcheck_getにしました。
 let getele ;//変数定義で変数定義し,ほかもろもろは書いてありますw
 ちなみに別名Tomakareですw
 https://nanashinon-sample.glitch.me/scripts/check_get/index.js
 コード
PIEのWrite Up

# PIEとは
- Position-Independent Executableの頭文字をとったもの

- プログラムの実行ファイル自体を、メモリ内の任意のアドレスにロードできるようにコンパイルする技術

- **ASLR（Address Space Layout Randomization）** と組み合わせることでプログラムのメモリ空間を予測しにくくすることができ、セキュリティが向上する
	- ASLR:プログラムが起動するたびに、スタック、ヒープ、ライブラリなどの主要なメモリ領域のアドレスをランダムに配置する技術

# Write Up
![Pasted image 20250423174535.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754817/03b7b76a-0c2e-4e6f-a3e6-754c447f5c07.png)

- 問題の実行ファイルを起動するとmain関数のアドレス位置が与えられ、ジャンプ先のアドレスの入力を求められる

- PIEに対応した実行ファイルだった場合でも、プログラム内部のモジュール間の相対アドレスは変わらないのでローカルでデバッガを有効にして実行ファイルをデバッグする

- `print (*win - *main)`でmain関数から見たwin関数の相対位置を計算する
![Pasted image 20250423175256.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754817/1f86825c-65f8-444e-903c-d032daa89f0b.png)


- ncコマンドでサーバにアクセスして、表示されたmain関数のアドレス位置に対して上で計算したwin関数の相対位置を足してジャンプ先として入力するとフラグが手に入る
Windows 11 24H2のセーフガードホールド(Gatedblockid:54379386)を解消する

## なぜWindows11 24H2にアップデートされないか？
24H2がリリースされてからかなり立ちますが、家のWindows11をインストールしたPCには中々降りてきません。
暇を見て主導でWindows Updateを試みるのですが24H2になる気配がなかったので、いろいろと検索してみました。

いろいろと調べてみるとWindows11 24H2の既知の障害のためセーフガードホールドが適用されているようでした。

## セーフガードホールドの要因を探る
実際にセーフガードホールドが適用されているかはRegedit.exeを起動していただき以下のレジストリを確認してもらうことでわかります。

```:レジストリキー
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\TargetVersionUpgradeExperienceIndicators\GE24H2\GatedBlockID
```

自分の場合は、**54379386**という値が入っておりセーフガードホールドが適用されているのが明確でした。
このレジストリの値が**None**になっていると準備OKということで24H2にアップデートできるようになります。

ただ、54379386という値がなんの障害を表しているか公開されていないので手詰まり感がありました。

## 54379386が何者か調べてみる

とりあえず、Googleで、**gatedblockid**、**24h2**、**54379386**で検索してみると以下のページが検索されました。

同じような悩みの人が居たらしいです。

https://answers.microsoft.com/en-us/windows/forum/all/w11-24h2-blockedid-54379386/499c1078-7f59-4dfd-8a80-14db1c38344c

ブラウザに翻訳してもらうと以下のようなコメントがありました。

> どうやらこのBlockedIDホールドは、私の補助NVMeドライブ（WD SN580）の問題が原因で発生していたようです。このドライブは、特定の状況下で24H2でBSODを引き起こす可能性がありました。提供されたリンクからWDのWebサイトにアクセスし、既知の問題をファームウェアアップデートで修正できると説明されました。

## SSDのファームウェア更新

このコメントの下にSANDISKのサポートページURLが出ていました。

https://support-jp.sandisk.com/app/answers/detailweb/a_id/52288/initiator/user

自分のPCのSSDも **WD Blue SN580 NVMe SSD 2TB** だったので、上記のページにあるSanDiskダッシュボードをダウンロード＆インストールしてみました。

上記のページにスクリーンショット込みで説明が出ているので、ここでは省きますが自分のPCに使っているSSDも最新のファームウェアではなかったようで、ファームウェアの更新ができました。
更新後は以下のようになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/0f5c52dd-65f0-4b6c-92b8-773498eee8a7.png)

## 再度WindowsUpdateを実行
ファームウェアが最新になったのでワクワクしながらWindowsUpdateをしたのですが24H2は現れず…

ただし、解決方法が書かれていたページの最後のコメントの方で

> 自分の投稿に回答して報告すると、提案されたファームウェア更新を行ってから4日後、Windows UpdateでWindows 11バージョン24h2の更新を実行するように促すメッセージが表示されます。

とありましたので、それ以降毎日WindowsUpdateを実行していたら3日目にレジストリのGatedBlockIdがNoneになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/78f8b1b9-b5c7-4d07-90ca-9bd910e21192.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/37fa59e4-8d18-4c0d-87b1-d07c754414d9.png)

ということで、WindowsUpdateを実行したところ無事24H2が表れてアップデートが始まりました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/99623e30-ebf4-41b8-aeb2-f5b0485f001d.png)

いまは、快適にWindows11 24H2を使っています。
一時期は24H2にアップデートされない状態で、25H2がリリースしてしまうのではないかと心配しましたが、これで一安心です。
Vscode Live Serverの使い方

こんにちは。名無しのnです！
これ神拡張機能！おすすめですｗ
(Winで撮影中)
## インストール
### 使ってみよう！
vscodeで拡張機能からliveと入力し,live Serverを選択します。その後,インストールをクリックしてください。（僕はインストールしてあったのでこうです。)
![スクリーンショット 2025-04-23 171721.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4068427/c9aa753f-f262-42ae-8840-ab082e02da35.png)
(インストールは自己責任です）
その後,一旦アプリを終了（X）します。その後また開きましょう！
![スクリーンショット 2025-04-23 172050.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4068427/83a3bea2-12c2-4380-9fbe-ee77774133ea.png)
このようになっていると成功です！早速Go liveを押して,ブラウザを立ち上げましょう！
### よく使う設定
拡張機能 live Server=設定アイコン=設定をクリックします。
![スクリーンショット 2025-04-23 172219.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4068427/682ae3fa-251e-482e-8217-2fbe424787dc.png)
port:ポート。localhost:PORTになってるそこをかえる
useLocalIp : 共有するか。同じNetwork内で。これでもlcoalhostは生きてる！
(リンクス（Chromebook)では作動しませんでした）
##おすすめ
[無料Webホスティングサービスまとめ](https://qiita.com/Nanashinon/items/dfdd6733c37d23473c35)
[{js}この要素は存在するか？変数まで！関数を作ったよ！](https://qiita.com/Nanashinon/items/81c603eac38d2588ce96)
[最新のきじ](https://qiita.com/Nanashinon)
WEBで縦書き表示を実装する方法

# はじめに
WEBサイトで縦書き表示を実装する方法について調査しました。CSSの簡単な指定で実現できますが、半角文字や記号の表示には少し工夫が必要です。

# 基本：縦書き表示にする方法
縦書き表示は、CSSの`writing-mode`プロパティに`vertical-rl`を指定するだけで実現できます。

コーディング例：
~~~ruby:CSS
.vertical-text {
    writing-mode: vertical-rl;
}
~~~

~~~ruby:HTML
<div class="vertical-text">
   <p>あおうえお ＡＢＣＤＥＦ １２３４５ ＠（）「」＋－＊／”<br>ABCDEFG 12345 @()[]+-*/"</p>
</div>
~~~

Chromeでの表示：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659381/8256d24e-e7e8-449f-a44f-4b2f7d44b729.png)

上記のように、簡単に縦書き表示にすることができました。しかし、半角文字が横向きのままなので、縦に表示させたい場合があります。

# 応用：半角文字も縦書き表示にする方法
半角文字も縦に表示させるには、CSSに`text-orientation: upright;`を追加します。
コーディング例：
~~~ruby:CSS
.vertical-text {
    writing-mode: vertical-rl;
    text-orientation: upright; /*追加*/
}
~~~

~~~ruby:HTML
<div class="vertical-text">
   <p>あおうえお ＡＢＣＤＥＦ １２３４５ ＠（）「」＋－＊／”<br>ABCDEFG 12345 @()[]+-*/"</p>
</div>
~~~

Chromeで表示：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659381/bb4beae0-2166-42bf-aa9c-8dba58787667.png)

このように、半角文字も縦に表示することができました。しかし、よく見ると半角の特殊記号の向きが気になるかもしれません。

例えば、以下のような半角の括弧を含むテキストを縦書き表示してみます。

~~~ruby:HTML
   <p>(ABCDEFG)</p>
~~~
Chromeでの表示：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659381/ccc276fe-75d8-4f00-b92a-c9d66c5a3fd1.png)

括弧が横になったまま表示されてしまい、読みにくく感じる場合があります。

# 発展：一部の特殊記号だけ90度回転させる方法
このような場合、CSSの`transform`プロパティを利用して、特定の要素だけを回転させることができます。
~~~ruby:CSS
.rote {
    display:inline-block;
    transform:  rotate(90deg); 
}
~~~
回転させたい特殊記号を`<span>`タグで囲み、上記のCSSクラスを適用します。
~~~
<p><span class="rote">(</span>ABCDEF<span class="rote">)</span></p>
~~~
Chromeでの表示：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659381/3ff083f7-c0f7-4b90-a480-9111c3fb510a.png)

このように、一部の特殊記号だけを90度回転させることができました。

# まとめ
CSSの`writing-mode`プロパティを使うことで、簡単にWEBサイトを縦書き表示にすることができます。さらに、`text-orientation`プロパティを組み合わせることで、半角文字も縦に表示することが可能です。

しかし、半角の特殊記号の向きなど、細部まで調整しようとすると複雑になる場合があります。そのため、特別な理由がない限りは、`writing-mode: vertical-rl;`の基本的な設定で済ませることを推奨します。
カルタホールディングスの夏インターンの面接について

# 質問されたこと
## 1.リポジトリの中で力を入れたものについて
- これからの展望
- 技術選定
- 相談したか
- 共同開発する予定はあるか
- spabaseについて
- データベースのテーブルについて
- なんでこのページを作ろうとしたのか
- 各機能についてなんで追加したのか
- adminについて
- データベースはこれから何にしようとしているのk
- どうやってカレンダーのデータを取得してるのか
## 2.チーム開発について
- どういう経緯でそのアプリを開発しようとしたのか
- 対立はしたことあるのか
- 各担当はどうしているのか
- なんでそのUIにしようとしたのか
- 技術選定
【備忘録】ssh-agentでsshパスフレーズを省略

# 環境
Virtual Box
Rocky Linux

# スクリプト

```bash
# .bashrcに入る
vi .bashrc

# 以下のコードを貼り付ける
# Setup ssh-agent
if [ -f ~/.ssh-agent ]; then
    . ~/.ssh-agent
fi
if [ -z "$SSH_AGENT_PID" ] || ! kill -0 $SSH_AGENT_PID; then
    ssh-agent > ~/.ssh-agent
    . ~/.ssh-agent
fi
ssh-add -l >& /dev/null || ssh-add
```

# 参考
https://h2plus.biz/hiromitsu/entry/791

https://obel.hatenablog.jp/entry/20230204/1675450800
DB2 で圧縮されたCSVファイルへのエクスポート・インポートについて

# 概要
DB2 コマンドでエクスポートやインポートを行う際、CSVファイルをファイル名で指定する必要があり、パイプで受け渡すことができません。このため直接圧縮されたファイルを利用するためには一工夫が必要です。
具体的には FIFO を使うことで直接圧縮されたCSVファイルの読み書きを行うことができます。
# 記述
```ksh:EXPORT
mkfifo fifo
ksh -c "gzip < fifo > [圧縮して出力するCSVファイル名]" &
db2 "export to fifo of del select * from hoge"
rm fifo
```
```ksh:IMPORT
mkfifo fifo
ksh -c "gunzip < [圧縮された入力するCSVファイル名] > fifo" &
db2 "import from fifo of del insert into hoge"
rm fifo
```
# TIPS
データベースのコードページをIBM943で作成しており、UTF-8のCSVをインポートする場合、VARCHARやCHARに2バイト文字を含んでいると、以下のようにCODEPAGEを指定して取り込もうとすると、UTF-8は漢字や半角カタカナなどが3バイトで表現されるため、文字列の後半が欠落してしまいます。
```ksh:だめな例
db2 "import from [UTF-8なCSVファイル名] of del modified by codepage=1208 insert into hoge"
```
これを事前にエンコーディング変換してFIFO経由する方法で回避できます。
```ksh:FIFOを利用した例
mkfifo fifo
ksh -c "iconv -f UTF8 -t IBM943 < [UTF-8なCSVファイル名] > fifo" &
db2 "import from fifo of del modified by codepage=943 insert into hoge"
rm fifo
```
UTF-8のCSVを圧縮したものをIBM943なDBに取り込みたいならこんな感じ。
```ksh
mkfifo fifo
ksh -c "gunzip < [UTF-8な圧縮したCSVファイル名] | iconv -f UTF8 -t IBM943 > fifo" &
db2 "import from fifo of del modified by codepage=943 insert into hoge"
rm fifo
```
【Salesforce認定SalesCloudコンサルタント】やったこと

## この記事は
筆者が、2025年3月にSalesforce認定SalesCloudコンサルタントを取得した際に使用した教材などのまとめです。

### 筆者のスペック
+ エンジニア2年目
+ Salesforce実務未経験
+ これまでに認定アドミニストレーター、認定Platformデベロッパー、認定Platformアプリケーションビルダー、上級アドミニストレーターを取得
    + [【Salesforce認定アドミニストレーター】やったこと](https://qiita.com/shi-mashimashima/items/9217fa657897538b571f)
    + [【Salesforce認定Platformデベロッパー】やったこと](https://qiita.com/shi-mashimashima/items/d3f86fe1b6468b3a68c8)
    + [【Salesforce認定Platformアプリケーションビルダー】やったこと](https://qiita.com/shi-mashimashima/items/ad663a388592a0e01337)
    + [【Salesforce認定上級アドミニストレーター】やったこと](https://qiita.com/shi-mashimashima/items/edd5932dffd7607622fc)

### 認定SalesCloudコンサルタント資格概要
#### 試験の詳細
+ 多肢選択式の60問
+ 試験時間は105分
+ 合格点は69%
+ 受験料は30,000円（税抜）

#### 試験概要
+ セールスライフサイクル：23%
+ 実装戦略：15%
+ Sales Cloud 知識の実用的な応用：33%
+ コンサルティングプラクティス：14%
+ データマネジメント：15%

## 勉強の流れ
だいたい2週間くらいで取り組みました。

### Trailmix
認定資格用のTrailmixをこなしていきました。
コンサルタントとあってSalesforceの製品そのものというより、それをどのように活用するか、をざっくり勉強していく感じです。

https://trailhead.salesforce.com/ja/users/welcome4/trailmixes/certified-sales-cloud-consultant-ja

### 問題演習
問題集を周回していきます。
+ 1周目：初見の用語をスプレッドシートにまとめつつ解く
+ 2周目：復習しつつ解く
+ 3周目～：わからなかった問題をメインに解く

という流れで進めていきました。
今回は地道に周回ではなく空き時間にちょこちょこ解くという方式をとったので、
なんだかんだ3周以上はしているような気がします。

正解が間違っている、問題集によって正解がブレている、問題文の翻訳が変、などがあるので、ちょっとでもおかしいな？と思ったらググる・ヘルプ読む・実際に操作する・Copilotに投げるなど検証していました。

スプレッドシートにはこんな感じでまとめてます。
回答が間違ってるっぽい問題については、正答と根拠を書くようにしてました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978744/6b7ff45d-ce9b-42e2-b9fb-51ad2ea11bc7.png)

#### 使った問題集
##### note「Salesforce認定SalesCloudコンサルタント試験の対策講座」
https://note.com/salesforce777/n/n3d42cc5b2387

全180問。有料。
正答の画像入り解説付き。
自分が勉強した時は4択だったのですが、
現在は出題傾向・比率が変わった2025年版に対応した内容に更新されているようです。

##### JPN試験過去問
無料。
日付が最新の二つに取り組みました。
翻訳がゆるい&答えが間違っている割合高いので、noteの問題集を終えてから解きました。

+ 全79問

https://www.jpnshiken.com/shiken/Salesforce.Sales-Cloud-Consultant-JPN.v2024-12-12.q79.html

+ 全151問

https://www.jpnshiken.com/shiken/Salesforce.Sales-Cloud-Consultant-JPN.v2024-09-27.q151.html

## 受験
### 試験会場
+ 週末にオンサイト受験しました。
### 試験内容
+ 回答20分+見直し50分、で70分ほどで終わりました。
+ かなり難しかったです。丸覚えではなく道筋立てて考えないといけない問題が多い印象でした。
+ 参考：得点率（すれっすれですね…なぜ合格できたのか不思議です…）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978744/18768bf8-7849-46ff-9430-d2957cff656b.png)

## 終わりに
+ 次はService CloudコンサルタントかExperience Cloudコンサルタントを目指そうと思います。引き続き精進します。