OmniAICreator/Qiita-1.07M huggingface dataset:
MarkdownをMACで簡単プレビュー！mdviewのインストールと使い方

# MacでMarkdownを簡単にプレビュー！`mdview`の使い方

こんにちは、しゅんです！数時間前にUbuntu対応の記事を書きましたが、今回は実際にMacで試してみた結果、うまくいったので、その手順や使い方を共有します！
少しでもお役に立てれば幸いです。

---

## **1. `mdview`をインストールする**

Macでは`mdview`をインストールするのに少し準備が必要です。以下の手順で環境を構築します。

### **ステップ1: HomebrewでGoをインストール**
まず、`mdview`のビルドに必要なGoをインストールします。ターミナルで以下を実行してください：

```bash
brew install go
```

### **ステップ2: `mdview`をインストール**
次に、以下のコマンドを使って`mdview`をインストールします：

```bash
go install github.com/mapitman/mdview@latest
```

これで、`mdview`の実行ファイルが`$(go env GOPATH)/bin`にインストールされます。

### **ステップ3: PATHを設定**
`mdview`をコマンドとして使えるようにするため、PATHを設定します：

```bash
export PATH=$PATH:$(go env GOPATH)/bin
```

これを永続化するため、以下を実行してください：

```bash
echo 'export PATH=$PATH:$(go env GOPATH)/bin' >> ~/.zshrc
source ~/.zshrc
```

## **2. 基本的な使い方**

### **Markdownファイルをプレビュー**
インストールが完了したら、ターミナルで以下のコマンドを実行するだけでMarkdownファイルをプレビューできます。

```bash
mdview <Markdownファイルのパス>
```

例：
```bash
mdview ~/Documents/sample.md
```

これで、デフォルトのブラウザ（Safariなど）でMarkdownファイルがHTMLとして表示されます！

---

## **3. 本題のダブルクリックでMarkdownを開く**

Macでは、Ubuntuのように簡単にはファイルマネージャーから直接開けませんが、**Automator**を使えば対応できます。

### **Automatorを使った設定手順**
1. **Automatorを起動**  
   「アプリケーション」フォルダから`Automator`を開きます。

2. **新規書類を作成**  
   「アプリケーション」を選択して「選択」をクリック。

3. **シェルスクリプトを追加**  
   左の検索バー（変数の隣）に「シェル」と入力し、「シェルスクリプトを実行」をダブルクリックして追加。
   画像も置きます。
   
   ![スクリーンショット 2024-11-20 0.18.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3506235/6767cc8d-07d6-8518-6043-f4ea7408b536.png)


4. **スクリプトを記述**  
   以下のコードをペーストします：
   usernameは自分のusername に置き換えで下さい
   ```bash
   #!/bin/zsh
   export PATH=$PATH:/Users/username/go/bin
   for f in "$@"; do
       mdview "$f"
   done
   ```

5. **入力引渡し方法を設定**  
   ウィンドウ上部の「入力引渡し方法」を「引数として」に設定。

6. **保存**  
   メニューから「保存」をクリックし、「Markdown Viewer」などの名前で保存。

7. **アプリケーションを割り当て**  
   Finderで任意のMarkdownファイルを右クリック → 「情報を見る」 → 「このアプリケーションで開く」に保存したAutomatorアプリを選択。

8. **設定を適用**  
   「すべてをこのアプリケーションで開く」をクリック。

これで、Markdownファイルをダブルクリックするだけでブラウザでプレビューできるようになります！

---


## **4. デモ動画**

以下の動画で、`mdview`の使用方法を詳しく説明しています：

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

---

## **まとめ**

`mdview`を使えば、以下のようなメリットがあります：
- コマンド一つでMarkdownファイルをプレビュー可能
- Automatorを使えば、ダブルクリックでMarkdownを開ける
- スタイルなしのHTML表示や、カスタマイズも可能

MacユーザーでMarkdownを日常的に使う方にはぜひ試してほしいツールです！  
記事に関する質問や改善案があれば、気軽にコメントしてくださいね。
Excel ラムダ関数を使ってテストケースのパターン表を作る

# はじめに
デシジョンテーブルの例がそもそもおかしいので鋭意修正中

# 目的
- Excel上で全パターンを網羅する●×の表を一瞬で作ること
- 新関数のLambda関数の練習
- 業務の備忘録

# 実現方法
二進数の仕組みを利用する
分からない人は毒入りのワインの話等でググってもらいたい

# 結論
キャプチャのD2セルに下記コードを設定する
``` code: ExcelFunction
=SUBSTITUTE(
    SUBSTITUTE(
        LET(
            _Radix,TAKE($A$2#,-1)
            ,_BinLen,LEN(DEC2BIN(_Radix))
            ,MAKEARRAY(_Radix,_BinLen
                ,LAMBDA(r,c,MID(TEXT(DEC2BIN(r),REPT(0,_BinLen)),c,1))
            )
        )
    ,1,"●")
,0,"×")
```
キャプチャ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2450027/d1a34290-8609-7ef4-d6c4-828a8b15d467.png)

# 制約等
- 行数は511行までしか対応していない(DEC2BIN関数の引数が511までしか対応していないため)
-
Advent of code 2015 Day 5 Part 1 & Part 2 を Livebook で楽しむ

## はじめに

Advent of code 2024 の準備として、過去回の Advent of code 2015 を Livebook で楽しみます

本記事では Day 5 の Part 1 と Part 2 を解きます

問題文はこちら

https://adventofcode.com/2015/day/5

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/aoc/2015/2015_day5_part1.livemd

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/aoc/2015/2015_day5_part2.livemd

## セットアップ

Kino AOC をインストールします

```elixir
Mix.install([
  {:kino_aoc, "~> 0.1"}
])
```

Kino AOC の使い方はこちらを参照

https://qiita.com/RyoWakabayashi/items/3d3abcf9134cee4dff05

## 入力の取得

"Advent of Code Helper" スマートセルを追加し、 Day 5 の入力を取得します

![スクリーンショット 2024-11-19 23.57.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/1335a977-32f0-3ff4-dd25-bab2be518a10.png)

## 私の答え

私の答えです。
折りたたんでおきます。
▶を押して開いてください。

### Part 1

<details><summary>回答</summary>

条件を実装しやすい内容に読み替えます

- 母音を3文字以上含むか: 各文字のうち、母音であるものの数が 2 を超えているか
- 繰り返しを含むか: 正規表現で `(.)\1` （何らかの文字の直後に同じ文字がある）に該当する部分があるか
- NGワードを含んでいないか: 各 NG ワードについて含んでいる回数が 0 になっているか

```elixir
puzzle_input
|> String.split("\n")
|> Enum.count(fn word ->
  has_three_vowels =
    word
    |> String.codepoints()
    |> Enum.map(fn char ->
      ["a", "e", "i", "o", "u"]
      |> Enum.count(&(&1 == char))
    end)
    |> Enum.sum()
    |> Kernel.>(2)

  has_twice =
    Regex.run(~r/(.)\1/, word)
    |> then(&!is_nil(&1))

  no_ng =
    ["ab", "cd", "pq", "xy"]
    |> Enum.count(fn ng -> String.contains?(word, ng) end)
    |> Kernel.==(0)

  (has_three_vowels and has_twice and no_ng)
end)
```

</details>

### Part 2

<details><summary>回答</summary>

正規表現の問題です

- `(.{2,}).*\1`: 2文字以上の文字列が繰り返されている

- `(.).{1}\1`: 同じ文字の間に違う文字が1文字ある

```elixir
puzzle_input
|> String.split("\n")
|> Enum.count(fn word ->
  has_repeat =
    Regex.run(~r/(.{2,}).*\1/, word)
    |> then(&!is_nil(&1))

  has_between =
    Regex.run(~r/(.).{1}\1/, word)
    |> then(&!is_nil(&1))

  (has_repeat and has_between)
end)
```

</details>

## まとめ

問題文から ChatGPT に画像を生成してもらいました

![nice.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/b070b4a1-4221-8fe5-94a0-28d071388fe5.jpeg)

以前、 [AtCoder](https://atcoder.jp/) でやった問題と似ていたのですんなり解けました

https://qiita.com/RyoWakabayashi/items/fe5e6947d5c22c87a69a#abc043d-%E5%85%A5%E5%87%BA%E5%8A%9B%E4%BE%8B

やはり正規表現はしっかり習得しておかないといけませんね
Windows に VSCode をインストールする

　この記事では VScode を Windows にインストールする方法を解説します。この記事を作成するために用意した私の Windows 環境は以下の通りです。

 <img src='https://i.imgur.com/qCpnHYT.jpeg'/>

|||
|:---:|:---:|
|OS|Windows 11 Pro|
|バージョン|23H2|

::: note
お使いの Windows が Windows10、あるいは Home エディションの場合でも VScode は正常にインストールすることができます。
:::

## VScode をダウンロードする
　インストールするにはインストーラーをダウンロードしなければなりません。こちらのサイトにアクセスして VScode をダウンロードします。以下のサイトの<font color='blue'>Windows</font>をクリックしてください。
 <img width=10%/><img width=80% src='https://i.imgur.com/bhXoglV.jpeg'/>

https://code.visualstudio.com/download

## VScode をインストールする
　<font color="orange">**ファイルエクスプローラー**</font> を開いて、**ダウンロード** フォルダにダウンロードされている **`VSCodeUserSetup-x64-1.93.1.exe`** をダブルクリックして VScode インストーラーを起動してください。
<img src="https://i.imgur.com/Px1LZiq.png" />
　すると画像のようなインストーラーが起動します。
　このとき、***「次へ」*** をクリックする前に <font color="red">***「同意する」*** をクリックしてください。</font>
<img width=25% /><img width=50% src="https://i.imgur.com/ImmtIJy.png" />

　***「次へ」*** をクリックしたらこのような確認を促されるので、ここも ***「次へ」*** をクリックしてください。
<img width=25% /><img width=50% src="https://i.imgur.com/uCS1H4z.png" />
　今度は **スタートメニュー** の設定です。ここも特に触れる必要はありません。***「次へ」*** をクリックしてください。
<img width=25% /><img width=50% src="https://i.imgur.com/Z64D0Kn.png" />
　次は追加オプションの設定です。おすすめとして、赤枠のチェックボックス２つにチェックを入れると、右の図のようにエクスプローラ上から選択したファイルやフォルダを指定して VScode を起動することができるようになるので、効率的に開発することができます。
<img width=5% /><img width=42.5% src="https://i.imgur.com/AYQPTqS.png" /><img width=5% /><img width=42.5% src="https://i.imgur.com/dyZbVU2.png
" /><img width=5% />

　最後に左の図の画面が表示されるので、***「インストール」*** をクリックしてください。すると **VScode** がインストールされ、中央の図の画面が表示されます。インストールが終了すると右の図の画面が表示されるので、***「終了する」*** をクリックしてください。
<img width=2.5% /><img width=30% src="https://i.imgur.com/1zYyLpO.png" /><img width=2.5% /><img width=30% src="https://i.imgur.com/FX9vt7D.png
" /><img width=2.5% /><img width=30% src="https://i.imgur.com/3QcP7Hh.png
" /><img width=2.5% />

インストーラが閉じると、このように <font color="blue">**VScode**</font> が起動します。
<img src="https://i.imgur.com/V416wqQ.png" />

## VScode を日本語にする
　まず、VScode の ***View*** をクリックして <font color="blue">***Command Palette ...***</font> をクリックして、***「コマンドパレット」*** を起動します。

> キーボードショートカットキーで **「Control + Shift + P」** をすることで素早くコマンドパレットを開くことができます。
<img src="https://i.imgur.com/1d99Beo.png" />

パレット上に **`Display`** と入力すると、
```
Configure Display Language
```
という項目が表示されるので、ここをクリックしてください。
<img src="https://i.imgur.com/Xq4ASqY.png" />

すると言語を選択する項目が表示されるので、**日本語** をクリックしてください。
<img src="https://i.imgur.com/ILsn5jp.png" />

すると画面に <font color="blue">再起動後 VScode のデフォルト言語を日本語にするか</font> と聞かれるので ***「Restart」*** をクリックして VSCode を再起動してください。
<img src="https://i.imgur.com/qdesHq1.png" />

再起動後 VSCode の言語が日本語になります。
<img src="https://i.imgur.com/nqqcULk.png" />

---

これで Windows に VScode をインストールすることができました。プログラミングを楽しんでください！
NGINXのlimit_req_zoneディレクティブにおけるzone値

NGINXの`limit_req_zone`ディレクティブにおける`zone`の値は、リクエストレート制限のための共有メモリゾーンを定義する部分です。このゾーンは、制限を適用するデータを保持するために使われます。

### `zone`の構成

`zone`の値は以下の形式で指定します：

```
zone=<name>:<size>;
```

- `<name>`: ゾーンの名前。識別用の任意の名前を指定します。
- `<size>`: ゾーンのサイズ（メモリの容量）。共有メモリに割り当てる容量を指定します。

---

### 各パラメータの詳細

#### 1. `<name>`**: ゾーン名**

- 複数の制限ルールを管理する場合に、それぞれ異なるゾーン名を付けて識別します。
- ゾーン名はユニークである必要があります。
- 例:
  ```
  limit_req_zone $binary_remote_addr zone=my_zone:10m rate=1r/s;
  ```

#### 2. `<size>`**: ゾーンサイズ**

- ゾーンに割り当てる共有メモリの容量をバイト単位（k, m, gの接尾辞で指定可能）で定義します。
- 必要なサイズは、制限するキーの種類と数に応じて変わります。
  - 1つのキー（たとえばIPアドレス）には約64バイトが必要。
  - したがって、10MBのゾーンは約160,000のキーを保持できます。

---

### 使用可能な変数

`zone`に設定されるデータは、リクエストキー（制限の基準）に基づきます。このキーとして使用できるNGINX変数の例：

1. `$binary_remote_addr`:
   - クライアントのIPアドレス（効率化のためバイナリ形式で保存）。
   - 主にIPごとのリクエスト制限に使用。
   - 例:
     ```
     limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=1r/s;
     ```
     ‌
2. `$remote_addr`:
   - クライアントのIPアドレス（テキスト形式）。
   - バイナリ形式に比べて効率が劣るため、通常は`$binary_remote_addr`を使用するのが推奨されます。
3. `$server_name`:
   - サーバー名ごとにリクエスト制限を適用。
   - 例:
     ```
     limit_req_zone $server_name zone=server_limit:10m rate=10r/s;
     ```
     ‌
4. **カスタムキー（複合キー）**:
   - 変数を組み合わせてカスタムキーを作成可能。
   - 例: IPアドレスとURIを組み合わせた制限。
     ```
     limit_req_zone $binary_remote_addr$request_uri zone=custom_limit:20m rate=5r/s;
     ```

---

### メモリサイズの設定例

- **小規模サイト**:
  ```
  limit_req_zone $binary_remote_addr zone=small_site:1m rate=10r/s;
  ```
  - 1MBのメモリで約16,000キーを保持可能。
- **大規模サイト**:
  ```
  limit_req_zone $binary_remote_addr zone=large_site:100m rate=100r/s;
  ```
  - 100MBのメモリで約1,600,000キーを保持可能。

---

### 注意点

1. メモリサイズが不足すると、新しいエントリが追加できず、既存のエントリが上書きされる可能性があります。
2. 過剰に大きなメモリサイズを指定すると、無駄なリソース消費につながるため、トラフィック量に応じた適切なサイズを設定してください。

`limit_req_zone`のゾーン設定は、トラフィック制御の基盤となるため、環境や要件に合わせた計画的な構成が重要です。
データベース設計の2つのアプローチ

## はじめに

こんにちは！今日は、データベース設計を進める際によく言及される「トップダウンアプローチ」と「ボトムアップアプローチ」について簡単にまとめます。データベース設計は、要件定義からスキーマ構築まで多くの工程があり、アプローチを理解しておくとより理論的・効率的な設計が可能になります。

## 本文

### トップダウンアプローチ

トップダウンアプローチは、全体像から細部へ向かって設計を行う方法です。

#### 特徴

- カーディナリティ（1対1、1対多、多対多など）の関係性を明示的に検討します
- 多対多（M:N）リレーションシップが存在する場合は関連エンティティを導入して、1対多（1:N）リレーションに変換します
- 要件定義段階で全体像が比較的明確な場合や、上位概念（エンティティ群）から整然と整理していきたい場合に有効です

#### 手順

1. **E-R図（Entity-Relationship図）の作成**: 業務要件を整理し、エンティティやリレーションシップ、カーディナリティを洗い出してER図を描きます
2. **属性の定義**: エンティティごとに必要な属性を決定し、詳細なデータ要件を詰めていきます
3. **正規化**: データの冗長性や更新異常を防ぐため、1NF→2NF→3NFと正規化を行い、スキーマを整えます

#### ユースケース

新たな業務システムの設計時に、まず事業領域（顧客、商品、受注など）の全体像を捉え、そこからエンティティとリレーションシップを明確にしつつ詳細化したい場合、トップダウンアプローチは効果的です。全体の業務フローを把握しやすく、大枠から細部へスムーズに落とし込めます。

### ボトムアップアプローチ

ボトムアップアプローチは、細部から全体へ組み上げていく方法です。

#### 特徴

- 正規化を進めると、最終的に1対多（1:N）のリレーションのみで構成され、シンプルかつ整然とした構造になります
- 当初から具体的なデータ項目（属性）が判明している場合に有効です
- 拡張や再構築が柔軟で、小規模なデータ項目集合から徐々に全体像を作り上げる際に役立ちます

#### 手順

1. **属性の整理**: 業務で必要なデータ項目（属性）をまずリストアップします
2. **正規化**: リストアップした属性間の関係性を考え、正規化を行いながらエンティティ候補をまとめていきます
3. **E-R図化**: 最後に、洗練されたエンティティや関連をER図として表し、全体像を明確にします

#### ユースケース

新規の概念が少なく、具体的なデータフィールドが先行してわかっているときは、ボトムアップが適しています。

## まとめ

データベース設計は、トップダウンアプローチとボトムアップアプローチのどちらを用いても、最終的にはエンティティや属性、リレーションシップを明確にし、正規化を通じて健全なスキーマを構築することが目標です。実務では、両方の手法を柔軟に取り入れたり、反復的なプロセスで精度を高めることも多いです。状況や要件に合ったアプローチを選びましょう！明日はデータベース設計を深掘ります！
【備忘録】ADの信頼関係


# はじめに
Azure上でADサーバ構築をしながら、信頼関係について勉強する機会がありましたので備忘録として残します。
構築手順などは一切なく、概念の理解が中心となります。

# 信頼関係

ADサーバを構築し、ドメインが複数できあがると信頼関係を結ばないといけないことがあります。
※ADサーバや、各ADサーバ関係の用語については以下で説明しています。

https://qiita.com/yuyanz/items/f1e1e80025eaf58cbad2

信頼関係とは、信頼先のドメインからのアクセスを信頼元に許可するようなイメージです。
信頼の方向は双方向か、片方向かはユーザが選択可能です。

https://learn.microsoft.com/ja-jp/entra/identity/domain-services/concepts-forest-trust

信頼関係を結ぶと具体的にどういう動作をするのか確認したことをまとめました。

# 信頼先⇒信頼元へのアクセス

信頼元「A.local」
信頼先「B.local」だとすると

B⇒Aには「B.local」配下のドメイン情報（ユーザID/PASS)さえ知っていればAへログイン可能となります。便利。

#### 注意する点

ただし、ファイルサーバなどでアクセス制御をしている場合は話が少し違います。
通常ファイルサーバでは例えば

・X部署のOUはX部署用のフォルダのみアクセス可能
・Y部署のOUはY部署用のフォルダのみアクセス可能

という制御をしているケースが多いかと思います。

この場合、Bドメインの情報だけでAドメインで制御しているファイルサーバにはアクセスできません。
Aドメインのアクセス制御にて、Bドメイン情報が見えますので適切に許可してあげる必要があります。

例：AドメインのX部署用OUにBドメインのX部署OUに所属してよいユーザ情報を追加する

# その他

信頼関係を構築する際には
「ドメイン全体の認証」と「認証の選択」を選ぶことが可能です。
「ドメイン全体の認証」は信頼先のドメインにすぐにアクセスできますが、「認証の選択」にすると認証画面がでてきます。

また、信頼関係を相互にすることも可能です。
（AからもBからもお互いにアクセス可能とできる）

制御がやや複雑になるため、信頼関係を構築する際は何かドキュメントにまとめるのがよさそうですね。

# まとめ

信頼関係について書いてみました。
間違えがあれば優しく教えていただけると嬉しいです。
【Mac】ターミナルでプレビュー付きの短縮URLを生成する方法


以下のコマンドを実行するとv.gdを使用してプレビューページありの短縮URLを生成できます。

```terminal
curl "https://v.gd/create.php?format=simple&url=http://example.com"
```

短縮URLをクリックするとリダイレクト前に以下のようなプレビューページが表示されます。

![スクリーンショット 2024-09-07 23.48.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/9d3fd2f7-b2da-6acb-0a99-d1c1270c75dd.png)

https://v.gd/apishorteningreference.php
テスト自動化って何が大変？やっぱりメンテナンスだよね～ / What's so hard about test automation? It's maintenance, after all! (日本語 / 英語)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1812041/1ca9110c-4f8e-9a25-fbe2-fc2ed4c3055e.png)
# 日本語
こんばんわ！
「Advent Calendar 2024」の9日目ということで、「テスト自動化あるある言いたい by T-DASH Advent Calendar 2024」の記事を書いていこうと思います。

### テスト自動化の経験
私は前職でシステムテストの会社に勤めていました。
そこでテスト自動化の運用で、UIPATHというサービスとSeleniumでリグレッションテストの自動化の運用を行っていました。運用といっても、それらを実施したり、ちょっとした修正を行うというものでした。

### 大変だったこと
その経験からテスト自動化ではメンテナンス作業が本当に大変でした。
サイトのデザインが変わるなんてざらなことですよね。それらによって色々変えなければならないことが多々あり、自分にとっては苦痛でした。
さらに大変だったのが、実施途中でエラーを吐いて止まることです。「あれ？止まってる！どこまで進んだんだっけ？」とすごく非効率なことも多々ありました！

### 最後に言いたいこと
結局経験してきて思うことが、テスト自動化って作成することやエラーを直すメンテナンス作業が一番大変だなと思います！ただ、このような経験がなければ、テスト自動化って素敵！とポジティブな面しか見られないと思うので経験的によかったなと思ってます！

とこんな感じです。
ここまで読んでいただきありがとうございました！

# ENGLISH
Good evening!
As this is the 9th day of “Advent Calendar 2024”, I would like to write an article on “I would like to say that I have test automation experience by T-DASH Advent Calendar 2024”.

### Test Automation Experience
I worked for a system testing company in my previous job.
There, I was in charge of test automation operations, using the UIPATH service and Selenium to automate regression testing. I was in charge of running the test automation operation, using the UIPATH service and Selenium to automate regression tests.

### What was difficult
From my experience, I found that the maintenance work was really hard in test automation.
It is very common for the design of a site to change. I had to change a lot of things depending on those changes, which was a pain for me.
What was even more difficult was that the test would stop in the middle of implementation, throwing up an error. It was like, “Oh, no! It's stopped! Where was the progress? I was often very inefficient!

### Final remarks
After all, I think that the hardest part of test automation is the creation and maintenance work to fix errors! However, if I didn't have this experience, I would only see the positive side of test automation! I think it was a good experience for me!

And that's about it.
Thank you for reading this far!
pythonのclass variableに納得いかなかった話

　愚痴です。それがpythonの思想だと言われればそれまでなんですけど……

# 他言語の例
　例えばC++。クラス変数というからにはこういうイメージでした。
```C++
#include <cassert>

class Foo{
public:
    static int value;
};

int Foo::value = 1;

int main(){
    Foo foo1 = Foo();
    Foo foo2 = Foo();
    
    assert(Foo::value == 1);    // クラスから値を取得
    assert(foo1.value == 1);    // インスタンスから値を取得
    
    Foo::value = 2;             // クラスから値を設定
    assert(Foo::value == 2);
    assert(foo1.value == 2);

    foo2.value = 3;             // インスタンスから値を設定
    assert(Foo::value == 3);
    assert(foo1.value == 3);
}
```
　pythonに明るい皆さんにおかれましては、もうオチが見えたことでしょう。

# pythonの場合
　同じようにやってみます。
```python
class Foo(object):
    value: int = 1                              # クラス変数
    
foo1 = Foo()
foo2 = Foo()

assert Foo.value == 1, f'{Foo.value=}'          # クラスから値を取得
assert foo1.value == 1, f'{foo1.value=}'        # インスタンスから値を取得

Foo.value = 2                                   # クラスから値を設定
assert Foo.value == 2, f'{Foo.value=}'
assert foo1.value == 2, f'{foo1.value=}'
```

　うんうん、良さそうですね。するとこれも、
```python
foo2.value = 3                                  # インスタンスから値を設定
assert Foo.value == 3, f'{Foo.value=}'
assert foo1.value == 3, f'{foo1.value=}'
```
```python
AssertionError                            Traceback (most recent call last)
Cell In[2], line 2
      1 foo2.value = 3                              # インスタンスから値を設定
----> 2 assert Foo.value == 3, f'{Foo.value=}'
      3 assert foo1.value == 3, f'{foo1.value=}'

AssertionError: Foo.value=2
```
えっ

## 何が起きている
　`value`はクラス変数なのでインスタンスの中にはない筈ですが、覗いてみるとなにやら`foo2`は`value`を持っています。
```python
print(vars(foo1))   # {}
print(vars(foo2))   # {'value': 3}
```
　それもそのはず、実はこの行はクラス変数を書き換えているのではなく***同名のインスタンス変数`value`を新規に設定している***んですね。
```python
foo2.value = 3      
```

## 何が嫌
いや、だって凄く紛らわしくないですか……？
```python
Foo.value           # クラス変数へのアクセス
Foo.value = 2       # クラス変数へのアクセス
foo2.value          # クラス変数へのアクセス
foo2.value = 3      # インスタンス変数へのアクセス
foo2.value          # インスタンス変数へのアクセス
```
　どうしてこんな設計なのかとCopilotに訊くと、意図せず（インスタンス変数のつもりで）クラス変数を書き換えたりしないよう、安全策でこうなっているという説明。でもWe are all consenting adults hereだというなら、触ろうとしているのがクラス変数なのかインスタンス変数なのは理解している筈で、そんな安全策を設ける必要はないのではという気もします。
　また、その割にインスタンスからのクラス変数の取得は許しているのも一貫性がないような。これだって、迂闊にインスタンス変数のつもりでクラス変数を読んだりなんかしていたら、思わぬところで値が書き換わっていて……となりそうなものですけれど。
　個人的には、それならインスタンスを経由したクラス変数へのアクセスは読み書きともに禁止した方が良かったのではないかと思ってしまいます。型アノテーションでクラス名は分かるし、というのは近年のpythonに染まった考え方かもしれませんが、そうでなくとも```type(instance).class_var```とかすればいいわけですし。
　……なんて言っている間に手を動かしてコードを書いていればいずれ慣れて気にならなくなるんでしょうけどね。どっとはらい。
Android/Pixelで、着信音が小さく始まる（ステップアップする）

忘れそうなのでメモ・・・

> Android「設定」>「着信音とバイブレーション」>「バイブレーションとハプティクス」>「バイブレーションから着信音」のスイッチをオフ（左側へ）
> [着信音がステップアップになっていて、最初から音量大にしたい。](https://support.google.com/pixelphone/thread/200354223/%E7%9D%80%E4%BF%A1%E9%9F%B3%E3%81%8C%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%82%A2%E3%83%83%E3%83%97%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%81%A6%E3%80%81%E6%9C%80%E5%88%9D%E3%81%8B%E3%82%89%E9%9F%B3%E9%87%8F%E5%A4%A7%E3%81%AB%E3%81%97%E3%81%9F%E3%81%84%E3%80%82?hl=ja)

デフォルトでオンになっている。

Android 9辺りにはなかったと思う。。
Sequence MakerとTeamsを組み合わせてリモート監視👀する

## はじめに
Sequence MakerはExcelから測定器を制御可能にするアドインです。Sequence MakerはPC上のExcelで動作させるものですが、長期試験の時などは時々ちゃんと動いているか確認したくなるものです。実際に試験をしている現場で確認できれば良いのですが、時には離れた場所やリモートから確認したい場合もあるものです。PCからであればリモートデスクトップでログインして動作状況を確認できますが、今回はTeamsのファイル共有機能を組み合わせて、スマホから確認してみます。なお、Sequence Makerについての詳細は以下の記事を参照ください。

https://qiita.com/sequencemaker/items/8e6a370ab0a793a06a3b

:::note warn
***お断り***
本記事の内容はSequence Maker開発元の公式見解ではなく、あくまでも個人が趣味の範囲内で執筆しているものです。記事の内容について開発元へ問い合わせることはお控えください。ご質問・要望などは各記事のコメント欄へお願いいたします。
:::

## TeamsでExcelファイルを準備
ファイル画面で「新規」⇒「Excelブック」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/cb1e983a-e6e5-2287-7cfd-afee470061cc.png)

適当にExcelのファイル名を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/02770b15-918d-0db0-56f0-d64041698efc.png)

新規のExcelブックができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/49c9b4e2-f3d5-686a-7354-0ab11b82fab4.png)

:::note
既存のExcelファイルをドラッグ＆ドロップで共有するのでもOKです。
:::

このブックを「…」⇒「開く」⇒「アプリで開く」でデスクトップのExcelで開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/5eafb4c4-4823-8965-9038-14caa5e5d277.png)

そして、Excelファイルにいつものように通信コマンドを入力していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/acb5e63c-5d93-2d1a-c957-511799535106.png)

この状態で「コマンド送受信」ボタンを押してシーケンスを開始します。今回は連続試験っぽい感じにするため「繰り返し回数」を「0」にして、停止ボタンが押されるまで繰り返す状態にしています。

## 📱スマホから様子を👀見てみる

スマホでTeamsにログインし、先ほどのExcelファイルをアプリで開いてみます。ちゃんとデータが見えていますね。

![IMG_6545.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/4a76e30b-5f08-c7bb-efdb-85e1facc4d3c.jpeg)

スマホの画面でも、試験の状態が動いているのが確認できます。いい感じ。これでどこにいても試験の様子を監視できます！

![IMG_6544.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/205f52bb-2362-3ad6-4eb8-203741107241.gif)

## ちなみに
共有しているExcelファイルは自動バックアップ機能が働くため、定期的に自動保存されます。そのため、万が一試験中にトラブルがあってシーケンスが停止してしまった…（涙）というような場合でも、全データの損失は防げます。
ただし、自動保存のタイミングで一瞬シーケンスが止まるので、測定時間にシビアな環境では自動保存が邪魔をするかもしれません。そんな時は自動保存を「OFF」にしておきましょう。

## まとめ
今回はSequence MakerとTeamsを組み合わせてリモート監視する方法を試してみました。難しい設定をしなくても、ExcelファイルをTeamsで共有するだけで実現できるので、とても便利です。複数人で共有することももちろん可能です。カメラ画像を取り込む機能なんかを組み合わせて、遠隔監視することもできそうです。
【AWS】API Gateway + Lambda + ACM + Route53で、任意のドメイン名と紐づける

# 概要
API Gateway + LambdaでAPI Gatewayのドメイン名をRoute53で紐付ける方法を紹介します。

API Gateway + Lambdaの構築は以下の記事で紹介しましたので、この記事ではそこからRoute53を使ってAPI Gatewayのドメイン名の向き先の紐づけ手順を紹介します。

https://qiita.com/Ryo-0131/items/f1a771570b7dc610a14d

### 前提
- Route53でドメインは取得済みとします
- ACMでSSL証明書も取得済みとします

# 手順
- ①カスタムドメイン名を作成する
- ②API マッピングを行う
- ③Route53で紐付ける


## ①カスタムドメイン名を作成する
- API Gateway -> 「カスタムドメイン名」 -> 「ドメイン名を追加」
    - ドメイン名を入力
    - 「ACM 証明書」に該当の証明書を選択

※API GatewayではHTTPS エンドポイントのみ対応しているので、ACMの紐付けが必要になります

> Amazon API Gateway で作成された API は、HTTPS エンドポイントのみ公開します。API Gateway は非暗号化 (HTTP) エンドポイントをサポートしません。
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/data-protection-encryption.html

## ②API マッピングを行う
- API Gateway -> 「カスタムドメイン名」 -> 上記で作成したドメインを選択 -> 「API マッピング」を設定
    - 該当API、ステージ、パス（空のまま）を選択して保存
- 「API Gateway ドメイン名」が生成されたことを確認します

※デプロイ直後だとステージがプルダウンに表示されないのでその場合は数分待ちます

## ③Route53で紐付ける
AWS Route53で上記ドメイン名を紐付けします (もちろん「お名前.com」とか他でも可能)。

- Route53 -> ホストゾーン -> 該当ドメイン選択 -> レコードを作成
    - レコードタイプA
    - エイリアスは「API Gateway API へのエイリアス」を選択
    - 先ほど作成したAPI Gateway ドメイン名を選択して、レコード作成

※他で同じドメインに紐付けている既存のレコードが残っている場合は、まずはそれを削除してから行います（重複登録エラーになるため）

以上で、少し待つと無事に反映されました！
スキル作成に役立つ？！「AIに考えさせる」機能のご紹介

# はじめに

本記事では、[satto](https://satto.me)でより便利なスキルを作成できる(であろう)機能 **インプットノード「AIに考えさせる」** のご紹介をします！

また、機能紹介とともに本機能を活用したスキルの例も合わせて紹介します。
この記事を通じて、「こんな使い方ができるんだ！」「自分の業務でも応用できそう！」と、皆さんの新しいスキル作成のヒントになればと思います。

## 対象読者
- sattoで一度でもスキルを作成したことがある人
- sattoでどんなスキルを作成すればいいか迷っている人

## インプットノードの「AIに考えさせる」とは？

#### **一言でメリットを言うと：** 
「スキル実行がよりスマートに！」

#### **機能の詳細**：
インプットパラメータはご存知でしょうか？
（スキル選択後に出てくる入力窓です↓）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949465/160088e5-859c-f7aa-c8c5-c3226ea3151d.gif" width=30%>


こちらのパラメータ(入力窓)、本機能を利用すると手打ちしなくてもAIに入力をお任せすることが可能です。
百聞は一見にしかずということで、「AIに考えさせる」を利用したスキルをご覧ください！
⬇️⬇️⬇️⬇️⬇️
![AIに考えさせる実例.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949465/60f0ed04-ef56-77b0-26ea-28b6b4c97364.gif)

このように選択した文章をもとに、AIが自動でパラメータの内容を入力してくれます！
※その場でAIの入力を修正することも可能です。

#### **何に使えるの？**：
- **ケース１：カレンダーに予定を追加**
上記でも見て頂いたように**Webサイトに掲載されているイベントの日程**や**チャットで忘年会の日程連絡が来た際**などテキストから予定を追加する際に有効です。
日時の決定連絡が来たら忘れないうちにサッとカレンダーへ予定を追加しちゃいましょう！

 - **ケース２：タスクの追加**
議事録にまとめられたネクストアクションや、チャットでタスクが飛んできた際にも文章を選択するだけで簡単にタスク追加ができます。
![タス追加.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949465/5071ba16-b4a5-cdf0-8004-31e617019801.gif)

<br>

#### **設定方法**： 

**（新規にパラメータを作成する場合)**：
スキル作成画面の最も左にある「インプット」ノードの「パラメータを追加」を押下

**（既存のパラメータを編集したい場合)**：
編集したいパラメータの「鉛筆マーク」を押下

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949465/b83af420-8d66-1a23-1317-20ce080728f1.png" width=40%>


その後、パラメータ設定画面の最下部 **「初期値オプション」** のプルダウンで **「AIに考えさせる」** を選択し、**「パラメータの説明」** を記載するだけで設定可能です。

「パラメータの説明」の内容に沿ってAIがパラメータの入力を行うので、説明を工夫して書くことが本機能のポイントです！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949465/3c566356-ab36-1a2b-fdb2-4f0d5ef6edde.png" width=50%>

以上で設定は終わりです！意外と簡単だったのではないでしょうか？
簡単に設定できるのでぜひ利用してみてください！


# おわりに

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

インプットノードの **「AIに考えさせる」** は皆さんに伝わりましたでしょうか？
この記事をきっかけにより良いスキルを作成できるヒントになれば幸いです。

ぜひ作成したスキルがあればXで #satto_skill をつけて投稿してください！
Redmineのテスト・デモデータ管理にRailsのフィクスチャ(fixture)を利用してみる

この記事は、[Redmine Advent Calendar 2024](https://adventar.org/calendars/10311) の9日目の内容になります。

# はじめに

Redmineでは運用時のデフォルトデータの読み込みに `load_default_data` タスク、開発時のテストデータの読み込みにはRailsの `db:fixtures:load` タスクを利用することが多いと思います。

ただ、Redmineでテスト・デモ用に個別にカスタマイズしたデータを保存・復元できると、間違った操作を行ってしまった場合も簡単に元の状態に復元でき、YAML形式のフィクスチャファイルの編集・コード管理もできて便利なように思いましたので、少し調べてみました。

# データベースの内容をフィクスチャ(fixture)に保存する

最初は以下のStack Overflow記事を参考に、モデルベースで進めようとしてましたが、
* [ruby on rails - How to generate fixtures based on my development database? - Stack Overflow](https://stackoverflow.com/questions/6591722/how-to-generate-fixtures-based-on-my-development-database)

Active Recordの [`has_and_belongs_to_many` (多対多)関連付け](https://railsguides.jp/v7.2/association_basics.html#has-and-belongs-to-many%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91)となっているテーブル(`projects_trackers` など、`rake db:migrate` 後の `db/schema.rb` 内で `id: false` のもの)の保存に対応できず、断念しました...。

どうしたものかと考えていたところ、Redmineの `lib/tasks` フォルダ内に `extract_fixtures.rake` という古いタスクがあり、データベース内のテーブルベースで上記の多対多関連付けテーブルも問題なさそうでしたので、こちらを新しいRailsでも動作するよう修正してみました。

* [Patch #41954: Update extract_fixtures task with configurable output directory - Redmine](https://www.redmine.org/issues/41954)

1つ目のパッチがメインの修正で、ヘッダのライセンスコメントを除くコード部分は以下となります。

```ruby:lib/tasks/extract_fixtures.rake
desc 'Create YAML test fixtures from data in an existing database.
Defaults to development database. Set RAILS_ENV to override.'

task :extract_fixtures => :environment do
  dir = ENV['DIR'] || './tmp/fixtures'
  FileUtils.mkdir_p(dir)

  sql = "SELECT * FROM %s"
  skip_tables = ["schema_migrations", "ar_internal_metadata"]
  ActiveRecord::Base.establish_connection
  (ActiveRecord::Base.connection.tables - skip_tables).each do |table_name|
    i = "000"
    File.open(File.join(dir, "#{table_name}.yml"), 'w') do |file|
      data = ActiveRecord::Base.connection.select_all(sql % table_name)
      file.write data.inject({}) { |hash, record|
        # cast extracted values
        ActiveRecord::Base.connection.columns(table_name).each { |col|
          record[col.name] = ActiveRecord::Type.lookup(col.type).deserialize(record[col.name]) if record[col.name]
        }
        hash["#{table_name}_#{i.succ!}"] = record
        hash
      }.to_yaml
    end
  end
end
```

上記のコードをコピーして、Redmineの `lib/tasks/extract_fixtures.rake` ファイルのコード部分に上書きすれば、以下のようにコマンドを実行することで、データベースの内容をフィクスチャに保存することができます。
```bash
bundle exec rake extract_fixtures DIR=(保存先ディレクトリ (デフォルト: ./tmp/fixtures))
```

# 保存したフィクスチャを読み込む

保存したフィクスチャを読み込むには以下を実行します。
```shell
bundle exec rake db:fixtures:load FIXTURES_PATH=(保存先ディレクトリ)
```

なお、フィクスチャの読み込み時には、データベース内のテーブル内容が削除されますので、間違って本番環境データを削除したりすることがないよう、十分注意してください。

## 参考リンク

* [db:fixtures:loadをspec/fixtures以下のファイルを見るようにする - miyohide's blog](https://miyohide.hatenablog.com/entry/20120531/1338462541)
* [Fixture はどのようにデータをロードしているか | hidakatsuya.dev](https://hidakatsuya.dev/2024/12/09/how-the-fixtures-work.html)

# 注意事項

* 上述のパッチですが、まだ提案段階なので、今後レビューなどで仕様が変わるかもしれません :bow:
* テスト・デモ用の軽めのデータ量を想定しています。大量のデータが含まれる場合は、YAML形式ではファイル容量が増大するので、CSV形式など、別のファイル形式に保存・復元するrakeタスク作成が必要かもしれません
【Git】「チーム開発用GitHubFlowの手順」と「個人開発(1人)でGitHubを使用する手順」の備忘録

今回は
①「チーム開発用のGithub-Flowの手順」
②「個人開発(1人)でGitHubを使用する手順」
についての備忘録です。

みなさんGitやGitHubは簡単に使いこなせていますか？自分も独学でGitを学んできましたが、慣れれば慣れるほど簡単ではなく奥が深いなぁと思います。

・GitHub-flowを使用すると、プルリクエスト(チームメンバーにコードレビューのお願い)でリポジトリのmerge作業を行うし、
・個人開発で行うならプルリクエストのmerge作業は省けます。

混乱してしまわないようにまとめていきたいと思います。

<br>


# 1: 「チーム開発用GitHubFlow」
■GitHubFlowとは？
・GitHub社のワークフロー。その開発の流れのことです。
<br>

■なぜGitHubFlowを実践すると良いのか？
・開発Flowをシンプルに保てる。
誰でも簡単にチーム開発にジョインできる！シンプルなやり方です。

・mainブランチにmergeしたら「すぐデプロイできる」からです。
今なにをリリースしているのかすぐに分かります。
<br>


## GitHubFlowの手順
・mainブランチは「既にリモートリポジトリに存在している」とします。
・そのリモートリポジトリのmainブランチには「他のチームメンバーがプッシュして作業していた状況」と仮定します。

<br>

1: ローカルのmainブランチを「チームメンバーが更新したリモートリポジトリの最新」に更新。
「$ git pull origin main」を使ってリモートリポジトリの最新をプルする。

```git:git
git pull origin main

```
<br>

__2: 開発用ブランチ、例としてfeatureブランチを新規作成する。__
(git checkout -bで”feature”ブランチを「新規作成して、その新規ブランチに切り替える」コマンド)
```git:git
git checkout -b feature

```
<br>

__3: ファイルを変更する。__
Vs Codeでindex.htmlを変更する。
<br>

__4: index.htmlを「add,commit」していく。__
```git:git
git add index.html

```
```git:git
git commit

```
<br>

__5: GitHubへ、featureブランチをpushする。__
```git:git
git push origin feature

```
<br>

__6: プルリクエストを作成する。__
GitHubを開き、プルリクエストボタンで、プルリクエストを作成する。
<br>

__7: コードレビューでOKが出たら、「OKが出たfeatureブランチを、リモートリポジトリmainブランチにマージ統合」する。__
「merge featureボタン」を押す。
・mainにfeatureがマージ統合される。
<br>

__8: リモートリポジトリのmainブランチを「デプロイ」する。__
・デプロイとは「リリース）」できる状態にする。
⭕️デプロイ方法は、主に「Netlifyなどのホスティングサービス」が良いかもしれませんね。
<br>

__9: リモートリポジトリのfeatureブランチを削除する。__
GitHubプルリクエストページ右側に「delete branchボタン」があるので、
それを押して”featureブランチ”を削除する。
<br>

__10: ローカルのfeatureブランチはもう必要ないので「削除」する。__
```git:git
git branch -d feature

```
<br>

__11: ローカルのmainブランチに「リモートリポジトリにマージしたorigin/mainブランチ」を「ローカルmainブランチにfetchかpullで取り込む。」__
```git:git
git pull origin main

```
<br>

__12: 手順2〜11を繰り返す。__
⭕️1:の「$ git pull origin main」を使ってリモートリポジトリの最新をプルして来る。」ことを忘れずに！




<br>

# 2:「個人開発(1人)でGitHubを使用する」

■そのままの意味で「1人でGitHubの機能を使いながら、開発をしていく」作業です。

■⭕️(ここ大事)チーム開発用GitHubFlowと違う点は「プルリクエストをする必要がない」(1人で開発しているから)です。

■「GitHubFlow」じゃ駄目なの？
ダメではないと思います。ただ、
・【1人で開発する時に「いちいちpushしてプルリクエストしてリモートリポジトリでmergeボタンでmergeする必要性はないかな、と思います。」】

<br>


## 個人開発Flowの手順
<br>

__1: featureブランチを新規作成する。__
featureブランチを新規作成する。
```git:
git branch feature

```
<br>

__2:featureブランチでindex2.htmlを作成したら「addとcommit」をする。__
```git: index2.htmlをaddする
git add index2.html

```
```git: commitする
git commit

```
<br>

__3:mainブランチに切り替える。__
```git: git checkout main
git checkout main

```
<br>

__4:(⭕️ここ大事)mainブランチにfeatureブランチをマージする。__
```git: 現在はmainブランチにいる。featureブランチをマージして取り込み。
git merge feature

```
<br>

__5: (⭕️ここ大事)リモートリポジトリに「ローカルのmainブランチをpushする。」__
```git: リモートリポジトリoriginにローカルのmainブランチをpush
git push origin main

```
<br>

__6: ローカルのfeatureブランチを削除する__
・ローカルのfeatureブランチは、役目を終えたので「削除する。」
```git: ローカルのfeatureブランチを削除
git branch -d feature

```
<br>

__7:(⭕️ここ大事)「mainブランチにいる状態で、新規開発用ブランチfeatureを切る（作成する。）」__
```git: mainブランチにいる状態で、featureブランチを新規作成する。
git branch feature

```
<br>


__8: 7まで作業したら【2〜7を繰り返します。】__

### 「git status」や「git log」で状況を確認することも忘れずに！


「チーム開発用Github-Flowの手順」と「個人開発(1人)でGitHubを使用する手順」の備忘録でした。
論文が読み終わらない...そうだ、ChatGPTを使おう！

# はじめに
皆さん、論文は読んでますか？
最近、私は院試用の小論文に書く研究テーマを見つけるために、いろいろと論文を読んでいます。

そして、論文を常日頃読んでいる皆さんも抱いているであろう悩みを私も抱いています。
そう... **論文が全く読み終わらない！！**

今回は、そんな私が出来るだけ効率的に論文を読むために編み出した論文読破術を紹介したいと思います。
（初投稿なので、優しい生暖かい目で見てくれると嬉しいな）

::: note info
* この記事を書いているのは、しがない21歳高専生です。
* 我流なので、プロンプトや、論文のまとめ方に問題があるかもしれません。（その時は教えてください！！）
:::

# 読破術の概要
軽く、私の論文読破術をまとめてみます。
* [落合論文要約フォーマット](https://www.slideshare.net/slideshow/1-ftma15/47697911)を使用する
* 読む順番は、
    * Abstract（その分野をよく知らない場合は、次にIntroductionを読む）
    * Conclusion
    * Method
    * Experiments & Results
    * Rerated Works
* ChatGPTに内容を突っ込んで翻訳 & 要約
* NotionのDBで管理する

Notionでの管理については次回詳しく書こうと思います。
本記事では、特に生成AIでの翻訳 & 要約について詳しく説明していきます。

# ChatGPTでの翻訳 & 要約
私は、上記で記載した読む順番ごとに文章をChatGPTに入力して、内容の翻訳と要約を行っています。

## 1. プロンプト文の入力
論文の内容を入力する前に、まず以下のプロンプト文を入力します。
```
# 命令文
あなたは、一流の｛分野｝研究者です。これから入力する論文の内容について、## タスクを常に実行して

## タスク
- ### 翻訳条件に沿って内容を翻訳
- ### 要約条件に沿って内容を要約

### 翻訳条件
- 内容を日本語に翻訳すること。
- 翻訳する際、内容の要約は一切行わないこと。
- 翻訳する際、論文の文脈に沿った翻訳を行うこと。
- 翻訳を行った後の文章は、一度見直しを行うこと。

### 要約条件
- 対象は、これから論文に関連する内容について研究しようとしている学部3年生
- 要約で用いた専門用語について、解説を適宜入れること。
- 見やすいレイアウトを意識して要約すること。
- 要約を行う際、要約内容に間違いがないかを一度見直すこと。
```
入力する際には、２行目の{分野}のところに読みたい論文の分野を入れてください。
* 例：画像処理、AR、機械学習、etc..

このプロンプト文のポイントは、
* マークダウン記法を使用して、プロンプト文を構造化
* ChatGPTに与える役割を明示する（一流の~です）
* それぞれのタスクごとに、実行してほしい内容をしっかりと明示する
* 要約を行うレベル感を学部３年生対象にする

です。

特に、ChatGPTに実行してほしい内容をしっかりと明示する点はこだわっています。
やはり、人間と同じで抽象的すぎる指示では、ChatGPTも上手くタスクを行うことが出来ません。
そして、学部3年生と入力することで、ChatGPTが分かりやす~く要約を行ってくれます。（割と重要）
プロンプトが入力できたら、次はどんどん論文の内容をChatGPTに突っ込んでいきます。

## ２．論文の内容を突っ込む
論文の内容を突っ込むコツですが、
**文章が長い場合は、しっかりと節の終わりなどで区切ってChatGPTに突っ込む**
です。
* 例："2.1 How to summarize the journals の内容"みたいな感じ

こうすることで、ChatGPTも理解しやすく、私たち人間にも理解しやすくなると思ってます。（素人の勝手な考察）

ChatGPTの出力を効果的に読む方法ですが、まず翻訳された内容に目を通し、次に要約と解説を読みます。
ここで重要なのが、**なるほどと思った点や気になる点はしっかり元の論文に目を通す**です。
やはり、生成AIですので、間違った内容を出力することが多々あります。そこで、論文の要点についてはしっかりと元の論文を読むことが重要になります。

そして、読む順番に従って論文を突っ込み終えたら、次は、落合式の要約フォーマットにまとめていきます。

## ３．読んだ論文をまとめる
まとめについては、最初のほうで紹介したとおり、[落合論文要約フォーマット](https://www.slideshare.net/slideshow/1-ftma15/47697911)でまとめています。

まとめる際は、Notionにテンプレートを作成しているので、そこにまとめています。（これについては、次回の記事で詳しく！）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894422/3e90d726-1e66-4b96-fb23-ee34c2f7a90e.png" width="50%">

落合式での論文要約については、以下の記事が参考になります。
https://qiita.com/lotushk95/items/e2f5489ed51a7dd6a1af

# 最後に
私の日頃実践している論文読破術をざっくりと説明してみましたが、どうだったでしょうか？
私にとって、この記事が初めての記事なので、拡散してもらえるとすごく嬉しいです笑
これからもいろいろと記事を投稿していくのでよろしくお願いします
『吾輩は猫である』をプログラム構造にしてみる〜前編〜｜文章題で身に付くプログラミング思考入門️（10/25）

## はじめに

あなたは、『吾輩は猫である』の猫の名前を知っていますか？

小説は、最も想像力が掻き立てられるコンテンツなのではないかと思っています。
そして、小説ほどの余白がある情報をプログラムに起こせたら、この先どんなプログラムでも書けるのではないかと。

『文章題で身に付くプログラミング思考入門️』は、日常や文章問題からプログラミング思考を身に付けていく、簡単で身近で、あなたをちょっと輝かせてくれるシリーズです。

今回は、『吾輩は猫である』を題材に文章の構造をプログラムにしてみます。

## これまでのまとめ

https://qiita.com/advent-calendar/2024/thewaggle

## 対象者
- プログラミングの考え方を学びたい人
- プログラミングに挫折したことのある人
- 論理的思考を鍛えたい人
- 文系の人
- エンジニアの思考を理解したい人

## 概要
早速やっていきましょう。
[『吾輩は猫である』夏目漱石（青空文庫）](https://www.aozora.gr.jp/cards/000148/files/789_14547.html)から借りてきました。

> 吾輩は猫である。
> 名前はまだ無い。
> どこで生れたかとんと見当がつかぬ。
> 何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。
> 吾輩はここで始めて人間というものを見た。
> しかもあとで聞くとそれは書生という人間中で一番どうだかこうだか分からない種族であったそうだ。
> この書生というのは時々我々を捕えて煮て食うという話である。
> しかしその当時は何という考もなかったから別段恐しいとも思わなかった。

一行ずつ分解します。

> 吾輩は猫である。
```
【猫】
一人称：吾輩
```

ここで、主従を間違えてはいけません。
プログラム上では「吾輩（主）が猫（従）である」のではなく、「猫（主）である吾輩（従）が存在している」です。
こうすると今後、また別の猫が出てきたとしても「猫」の概念を一つのデータ型として、つまり同じ情報の種類として使いまわすことができます。
神の目線で考えましょう。

> 名前はまだ無い。
```
【猫】
一人称：吾輩
名前：（まだ無い）
```
うーん、困りましたね。
プログラム上では名前がないと呼び出せないので、この主人公の猫に名前をつける必要があります。
「吾輩猫」とでも付けましょうか。同じ名前は使えないので、2度出てこないような名前を選びましょう。

```
【猫】
名前：吾輩猫
一人称：吾輩
```

> どこで生れたかとんと見当がつかぬ。
```
【猫】
名前：吾輩猫
一人称：吾輩
生まれ：見当がつかない場所
```
生まれているからには必ずどこかの場所で生まれているので、一旦「見当がつかない場所」にしておきましょうか。
吾輩猫の情報がどんどん追加されていきますね。次にいきましょう。

> 何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。

```
【猫：データ】
名前：吾輩猫
一人称：吾輩
生まれ：見当がつかない場所
鳴き声：ニャーニャー

【猫：行動】
- 泣く
```

行動が出てきましたね。「泣く」という行動は猫に共通するものでしょう。
そして「泣く」ときには鳴き声「ニャーニャー」を使います。
`行動`の対比として、行動以外の情報を`データ`として括っておきましょう。

そして、「泣いていた事」を「記憶している」とのことなので、「記憶する」という行動も取れるということがわかりますね。

```
【猫：データ】
名前：吾輩猫
一人称：吾輩
生まれ：見当がつかない場所
鳴き声：ニャーニャー

【猫：行動】
- 泣く
- 記憶する（泣いていた事）
```

次に進みましょうか。

> 吾輩はここで始めて人間というものを見た。

なるほど、「猫」と言うデータ型の他に「人間」と言うデータ型が存在するということですね。

> しかもあとで聞くとそれは書生という人間中で一番どうだかこうだか分からない種族であったそうだ。

なるほど、「人間」を分類すると「書生」という種類があるんですね。

> この書生というのは時々我々を捕えて煮て食うという話である。

よし、この辺りで「書生」について一気に分解しましょうか。
困ったことにこの書生にも名前がないので、「初エンカ書生」にしましょう。

```
【書生：データ】
名前：初エンカ書生

【書生：行動】
- 捕える（猫を）
- 煮る（猫を）
- 食う（猫を）
```

こうしてみると、書生が捕えたり煮たり食ったりするのは猫だけか？と言う疑問が湧いてきましたね。
捕えるのは生物、煮るのは食材、食うのは食べ物、が妥当な気がしますね。
ちょっと疑問を残したまま次へ進みましょう。

> しかしその当時は何という考もなかったから別段恐しいとも思わなかった。

この文章は主語が抜けているようです。誰が「別段恐しいとも思わなかった」んでしょうか？
あなたなら、文脈から自然と主語を理解できるかもしれませんね。でもコンピュータは理解してくれませんから、コンピュータに寄り添って一緒に紐解いていきましょう。

それでは、文章自体を分解して紐付けてみましょう。

```
しかし/その当時は/何という考もなかったから/別段/恐しいとも/思わなかった。

その当時は → 思わなかった。
何という考もなかったから → 思わなかった。
別段 → 思わなかった。
恐しいとも → 思わなかった。
```

やはり主語がないですね。
主語を特定するために、文章を少し遡って探してみましょうか。

...と、ここで一旦今回の記事は切りましょう。
続きは明日。
「別段恐ろしいとも思わなかった」の主語を、感覚ではなく文章の分解から導いていきます。

こちら↓

https://qiita.com/yuki_thewaggle/items/6feafe1a6a5d71c30d3c

### 最後に
ここまで読んでくださってありがとうございます！
よかったらぜひ「いいね」をください。続ける励みになります！
LinuxのFindの使い方 あなたは知っていましたか。


 一般的なコマンドを使わずにプログラムから、それにあった機能を使っているのでオプションまで含めては知らないことが多いです。いざ使おうとして結局使いこなせなかったことも多いです 。

## 環境
Ubuntu 24.04.1 LTS

## パターン
次のパターン、カレントディレクトリは~/Downloadsです。
```
~/Downloads/mcman.txt
~/Downloads/01/mcman.txt
~/Downloads/01/mcman.docx
```
これで探してみます。

* オプション無し,名前あり

```
bomiura@spq45:~$ cd ~/Downloads/
bomiura@spq45:~/Downloads$ find mcman.txt
mcman.txt
```
サブディレクトリがでてきません。オプションをつけみます。

* オプション -name , .＊

```
bomiura@spq45:~/Downloads$ find -name mcman.*
./mcman.txt
```
やっぱりでてきません。
検索単語を短くしてみます。
* オプション -name 

```
bomiura@spq45:~/Downloads$ find -name *mcm*
./mcman.txt
./01/mcman.txt
```
ようやくでました。
検索単語を短くしたので、もうひとつでないといけません。
考えてから ” でくくりました。ようやくできた。

* オプション -name 

```
bomiura@spq45:~/Downloads$ find -name "*mcm*"
./mcman.txt
./01/mcman.txt
./01/mcman.docx
```

ー以上ー
目標設定作りのために調べてみた課題発見力について、エンジニア目線で解説してみる👀

この記事は [ex-crowdworks Advent Calendar 2024](https://qiita.com/advent-calendar/2024/ex-cw)の10日目の記事です。

# はじめに
今年、株式会社クラウドワークスを退職した@nisyuuです。そろそろアドカレネタがなくなってきました。誰か書いてください。元クラの人。
エンジニアとしてクラウドワークステック（旧クラウドテック）というフリーランスと企業をマッチングするエージェントサービスを開発していました。

エンジニアやビジネスパーソンとして日々業務に携わる中で、目の前の課題を解決する「問題解決力」は欠かせないスキルです。
そして、「問題解決力」とは別に「課題発見力」というものもあります。
課題発見力とは、現状を正しく把握し潜在的な問題や改善点を見出す力のことです。
過去に課題発見力について調べ、目標設定の際に役に立った経験から、将来有望な未来ある皆様にも役立つよう課題発見力についてエンジニア目線で解説します。エンジニア目線と書いていますが、エンジニア以外の方にもお読みいただけます。
課題発見力は汎用的な力でもあると思っているので、目標設定以外にも有効なのではないかと思います。
また、問題解決力との違いや、課題発見力を高めるためのヒントも整理していきます。

# 3つの問題タイプ

課題発見力を鍛えるためには、まず問題のタイプを整理して理解する必要があります。

## 1. 発生型の問題
すでに表面化しており、誰の目にも明確に見える問題です。
たとえば、サービスの障害や顧客クレームなどが該当します。

## 2. 設定型の問題
目標を設定し、その達成過程で生じる問題です。
たとえば、新しい機能の開発を進める中でリソースが不足する、といったケースが当てはまります。

## 3. 潜在型の問題
まだ明確には表れていないものの、将来的に顕在化する可能性のある問題です。
課題発見力のメリットは、このような問題を先んじて見つけ出すところにあります。

# 問題解決力と課題発見力の違い
問題解決力と課題解決力を、例を交えて解説します。

## 問題解決力
すでに明確化している、あるいは今後明確になるであろう阻害要因へ対処する力です。言い換えると、目前に存在する「できていないこと」をどのように片付けるかに焦点が当たります

## 課題発見力
いま達成している目標や現状の業務プロセスをさらに改善するために、まだ顕在化していない課題や効率化の余地を探る力です。すでにノルマを達成している状況から、「もっと生産性を高めるには何ができるか？」「より効率的なプロセス構築の余地はないか？」など、理想とのギャップを見つけ出します。

## 問題解決力と課題解決力の具体例
たとえば、あなたの開発チームが「月ごとにコードカバレッジ90%以上を維持し、重大なバグは0件に抑える」という品質目標を掲げているとします。

**問題解決力：**
万が一、コードカバレッジが90%を下回った場合や、重大なバグが月末近くに残っている場合にどう対応するかを考えられる力です。
具体的には、テストケースを増やしたり、自動テストツールを導入したり、バグ原因を追跡してリファクタリングやデバッグを行うなど、「目の前の障害」を取り除くための施策を打つことに焦点が当たります。

**課題発見力：**
一方、カバレッジ90%や重大バグ0件はすでに安定的に達成できている状況を想定しましょう。この場合、「より高い品質やパフォーマンスを目指すために何ができるか？」を考えるのが課題発見力です。
たとえば、

- カバレッジ95%に引き上げるには、どのような部分がテストされていないか？テストしにくい箇所を改善できるか？
- バグはないが、ビルドやデプロイに時間がかかっていないか？CI/CDパイプラインを改善して生産性を高められないか？
- コードの複雑さを減らし、将来の拡張性や保守性を高めるにはどうしたら良いか？

# なぜ課題発見力が必要なのか？

課題発見力がないと、現状維持や目先の問題対応に追われるばかりで、長期的な成長や改善が難しくなります。
課題発見力を身につければ、将来起こり得る問題や改善の余地を見抜き、最適な打ち手を講じることで、組織やプロジェクトの生産性・競争力を高めることができます。


# 課題発見力を高める3つの方法

1. **ゼロベース思考**  
   前提や常識を一度リセットし、目的から逆算して考える訓練をします。  
   - 前提を疑う：既存の選択肢以外の可能性を模索する  
   - 目的に戻る：本来のゴールや論点を見失わない  
   - 森を見る：議論全体の構造を把握し、要素のつながりを意識する

2. **クリティカルシンキング**  
   先入観を排し、客観的なデータや論理的思考に基づいて状況を分析します。自らの考えを疑い、より妥当な説明や解決策を模索します

3. **未来志向**  
   未来を常に視野に入れた上で現状を評価することで、後手に回らず、潜在的なチャンスやリスクに先手を打つことができます

# おわりに

課題発見力は、問題解決力を補完し、長期的な成長や持続的な改善を可能にする重要なスキルです。問題が起きてから対応するだけでなく、将来的な変化や進化の余地を先読みして動くことで、より高い成果を目指せます。
ぜひ、日々の業務やプロジェクト推進の中で、この課題発見力を意識してみてください。

# 参考

https://qiita.com/nisyuu/items/d9b04abe65e394b32634
【DVA-C02】AWS-DVAに合格できたのでやったことを書いてみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194659/de76aa1c-23ef-d62b-8d80-93ebb9e2fc0e.png)

DVAに無事合格できたので、勉強方法や感想を述べていこうと思います。

[1.筆者スペック](#1-筆者スペック)
[2.学習に使用したもの](#2-学習に使用したもの)
[3.学習方法](#3-学習方法)
[4.感想](#4-感想)

# 1. 筆者スペック
4年目に突入したシステムエンジニア
AWSの実務経験無し

# 2.学習に使用したもの
CloudLicenseのみ：https://cloud-license.com

# 3.学習方法
前提としてSAA未取得の方は、先にそちらを取得した方がいいかなと思います

### 1週間目
答えを見ながらCloudLicense#1~64を1周して確認する

### 2週間目以降
答えを見ずに問題を解く　→　不正解した箇所を再度解く…これを繰り返して行きます。
全体の正答率9割を超えたら申込みます。模試は受けませんでした。

# 4.受けてみた感想
SAAなど取得してから受けたからだと思いますが、個人的にはDVAが一番簡単に感じました。
AWS実務経験が無い方でも、コード管理（SVNやGit）を実務で触ったことがある方や、CI/CDについて多少知識があれば理解しやすいように思います。
pyenvを使ってPythonのバージョンを管理する(mac)

## はじめに
pyenvを使ってから、勉強会やハッカソン等でPythonの環境を合わせるのが楽になったので、pyenvのインストールや使い方をまとめました。
Waffleアドベントカレンダー9日目の記事です。

## 環境
・mac (Sequoia 15.0.1)

## pyenvとは？
pyenvとはPythonのバージョン管理ができるコマンドラインツールです。
通常、pythonをインストールすると、1つのバージョンしか扱うことができません。pyenvを用いることで、複数のPythonのバージョンを管理することができ、必要に応じてPythonのバージョンを切り替えることができます。

## pyenvの使い方
### 1. pyenvのインストール
pyenvをインストールする際は、Homebrewを使います。

```
brew install pyenv
```

インストールできているか確認

```
pyenv -v
```
ここで、pyenvのバージョンが出てきたら、成功です。

### 2. pyenvの初期設定
pyenvの初期設定を行なっていきます。

```
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
```

以下のコマンドを実行し、.zshrcファイルの設定を反映させます。
```
source ~/.zshrc
```

### 3. Pythonのインストール
pyenvを使って、Pythonをインストールしていきます。
まず、インストールできるPythonのバージョンを確認します。
```
pyenv install --list
```
このコマンドを実行すると、以下のように、インストールできるPythonのバージョンの一覧が出てきます。(一部抜粋)

```
  3.12.5
  3.12.6
  3.12.7
  3.13.0
  3.13.0t
  3.13-dev
  3.13t-dev
  3.14.0a1
  3.14.0a1t
  3.14-dev
  3.14t-dev
```

次に、Pythonをインストールします。例として、3.12.1をインストールします。
```
pyenv install 3.12.1
```

次に、インストールされたPythonのバージョンを確認します。
```
pyenv versions
```
すると、以下のような結果が出力されます。
```
* system (set by /Users/username/.pyenv/version)
  3.12.1
```

まだこの状態では 3.12.1 を使用できません。もし、Macに元々Pythonをインストールしている場合、そのバージョンのPythonを使用おり、インストールされていない場合もまだ使用することができません。 今回インストールしたバージョンのPythonに変更します。バージョンの切り替えには、globalコマンドを用いるか、localコマンドを用いるか2パターンあります。

**●globalコマンドとlocalコマンドの違い**
・globalコマンド：どのフォルダでも、指定したPythonのバージョンを使用することができる。
・localコマンド：実行したディレクトリ内だけで、指定したPythonのバージョンを使用することができる。

```
# globalで、Pythonのバージョンを変更
pyenv global 3.12.1

# localで、Pythonのバージョンを変更
pyenv local 3.12.1
```

以下のコマンドを実行して、pythonのバージョンを確認します。
```
python --version
```
結果として、Python 3.12.1が出力されていれば、大丈夫です。

## 補足
Pythonのバージョンを切り替えるごとに、必要に応じてパッケージを一からインストールする必要があります。
通常以下のコマンドでパッケージをインストールします。
```
pip install [package名]
```

例として、numpyをインストールする際は、以下のコマンドで行います。
```
pip install numpy
```

もし、ハッカソン等で、他の方に自分の環境に合わせてもらう、あるいは合わせる場合、以下のコードを実行すると、インストールの作業が楽になります。
```
# 自分の環境でインストールされているパッケージをrequirements.txtに書き出す
pip freeze > requirements.txt

# 書き出したパッケージを一気にインストールする
pip install -r requirements.txt
```

## おわりに
今回、pyenvを用いて、Pythonのバージョンを管理しました。pyenvを用いることで、パッケージとの互換性の問題の解消に繋がったり、各プロジェクトにあったバージョンに簡単に変更することが出来る点が、とても便利だなと感じました。pyenv以外にも、Pythonのバージョンを管理するツールはいっぱいあります。自分でどの仮想環境を構築するツールを使うか調べてみるのも面白そうだなと思います。
ローカル公開ツールngrokについて

## ngrok(エングロック)とは
ローカル上で実行しているwebサーバーを、一時的にインターネット上でアクセス可能にすることができる、いわゆる「トンネリングツール」の一種。
使用例としてlocalhostのweb画面等を簡単に外部の誰かに共有することができる。

## 導入
#### ・アカウント作成
[ngrok公式サイト](https://dashboard.ngrok.com/signup "ngrok")にて行う。
GitHubアカウント、Googleアカウントでも作成できる。

#### ・インストール
Setup & Installationからツールのダウンロードを行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629528/e24f8dab-0eb8-2d89-2528-90f92be09b18.png)

Agentsから利用するOSを選択し、インストール方法を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629528/02a48109-50fc-6499-6e1e-59fa3d9c2bbd.png)

ダウンロードしたngrok.exeを実行し、「Run the following command to add your authtoken to the default ngrok.yml configuration file.」部に表示されている下記コマンドを実行する。
```
ngrok config add-authtoken ****
```
## 公開

ローカル上で実行しているwebサーバーのポートを下記形式で実行(deploy)することで、
外部公開用のURLが払い出される。
```
ngrok http 8080
```

実行例
```
ngrok                                                                               (Ctrl+C to quit)

?Found a bug? Let us know: https://github.com/ngrok/ngrok                                         

Session Status                online                                                                
Account                       XXXXXXXX  (Plan: Free)                                      
Version                       3.18.4                                                                
Region                        Japan (jp)                                                            
Latency                       27ms                                                                 
Web Interface                 http://127.0.0.1:4040                                                 
Forwarding                    https://XXXX-XX-XX-XXX-XX.ngrok-free.app -> http://localhost:8080    
Connections                   ttl     opn     rt1     rt5     p50     p90                            
                              0       0       0.00    0.00    0.00    0.00                            
```

上記のForwardingに表示されているhttps://XXXX-XX-XX-XXX-XX.ngrok-free.app 部が外部アクセス用のURLになる。

外部アクセス用のURLはランダムな一時的なURLとなるので、deploy毎に変わる。

## オプション
#### パスワード設定
authオプションでbasic認証を設定することができる。
```
ngrok http 8080 --basic-auth ユーザー名:8文字以上のパスワード
```

## 余談
ngrokを知った経緯は自宅のネットワーク環境だとポート開放しての外部公開が不可能だった為、ツールを使用しての共有法を模索している際に知り、手軽に公開できるという点で利用した。
ターミナル環境を語る@2024

## TR;DL

現在のターミナル環境についてダラダラ語る

## はじめに

私のターミナル環境は日々変化しています。

## シェル

bash -> zsh -> fish -> zsh

以上のように推移してました。
zshは去年の記事でも書いたように見た目を良くしたいがためにインストール
その後拡張性などの観点からfishに移動
結局zshのほうが設定が書きやすいのもあってzshに里帰り

シェル選びはむずい

## ターミナルエミュレータ

Wezterm一択の一年でしたね
一回、konsoleとか使いましたけど
来年からは別なのに乗り換えるかも?????

## ターミナルツール

### eza

lsの置き換えコマンド
見た目が良くなるので好き

### ripgrep

grepの置き換え
nvimのリアルタイム検索にも使われているのでそのまま利用

### pingu

pingをするとピングーが現れるジョークコマンド
可愛いから常用している

## エディタ

エディタには様々な宗派がありまして...

- [Neo]Vim
- VSCode
- IntelliJ

が今年のメインのエディタでした。
圧倒的にNeoVimが多いかも。

## 今後について

今年から来年にかけてNixOSの勉強を始めるので環境がガラッと変わる予定です。
きりが良いところで記事をかけたらなと思うます。

## さいごに

皆さんの今年一年の環境はどのように変化しましたか？
１年前の設定を見ると面白かったりしますよ！
ではでは～
Devcontainer で Qiita CLI を利用しようと思ったらちょっと詰まった話


# はじめに

少し前から [Qiita CLI](https://github.com/increments/qiita-cli) を利用して、Qiita 記事の管理を始めました。
最近 Docker 関連の勉強をしていて、 Devcontainer を知ったので Qiita 執筆環境に利用してみることに。
その際に、コンテナ内で`npx qiita preview` を実行したあと、ローカル環境からページが表示されない状況になったので備忘録として残しておこうと思います。

# 環境

- macOS: `M1 15.1.1`
- Docker: `27.3.1`
- vscode: `1.95.3`

# Devcontainer での Qiita CLI 環境構築

以下の記事で詳しくまとめられていたので、参考にさせていただきました。
コンテナ内で認証トークンを参照できなくなる問題(credential.json)の対処法についても記載があったので、助かりました。。

https://qiita.com/hyga2c/items/8618027fe771855debb4

# 発生した問題

Devcontainer の周りの設定は、スムーズに完了し、コンテナ内部で `npx qiita preview` を実行したところ、
ローカルのブラウザが立ち上がりますが、ページにアクセスできない状況になりました。

- Safari：(私の環境のデフォルトブラウザ)
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513223/a26b3a6e-b071-624c-0e3f-ec3a4fe1c575.png)

## 原因

コンテナ内部で`localhost`で起動していたことが原因でき s た。
`localhost`でリッスンしていると、ローカル環境からアクセスできなくなるようです。

https://qiita.com/amuyikam/items/01a8c16e3ddbcc734a46

## 対処法

コンテナ内部で `0.0.0.0` で起動すれば良いみたいです。
Qiita CLI のホストを指定している、`qiita.config.json`を下記のように変更したらうまくいきました。

```json: qiita.config.json
{
  "includePrivate": false,
  "host": "0.0.0.0", // localhost から変更
  "port": 8888
}
```

ただこれだと、ローカルで起動したときに逆にアクセスできなくなるので別途`qiita.config.devcontainer.json`を用意して、ボリュームマウントすることで対応しました。
（もっといい方法あるかもですが。）

```docker: docker-compose.yml
# 該当部分だけ抜粋
volumes:
  - ../:/workspace:delegated
  - ../credentials.json:/root/.config/qiita-cli/credentials.json
  - ../qiita.config.devcontainer.json:/workspace/qiita.config.json
```

# さいごに

Devcontainer を利用した Qiita CLI の環境を整えることができました。
これで執筆が捗るかな？

# 参考

https://qiita.com/hyga2c/items/8618027fe771855debb4

https://qiita.com/amuyikam/items/01a8c16e3ddbcc734a46
PowerAutomateDesktop: Power Fx なら、月末日取得が楽々になってる

# 背景

月末日計算で、面倒なことをしてる人が昔々存在していた。

例えば、長月・短月を考えて、月末日出したり、とか。
でまぁ、当然そんな面倒なことしなくても、DateTime 型持ってるなら、以下で簡単に出来る

- 翌月一日 - 1 day = 月末日

なんだけど、Power Fx だったら、[EOMonth](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-edate-eomonth) で一発じゃんって話だったので、その備忘録

Power Fx については以下

https://learn.microsoft.com/ja-jp/power-automate/desktop-flows/power-fx

で、Fx のリファレンス

https://learn.microsoft.com/ja-jp/power-platform/power-fx/formula-reference-desktop-flows

# 実際の月末日計算フロー例

- 変数の設定に以下を書くだけ

```powerfx: EndOfMonth
=Text(EOMonth(Today(), 0), "yyyy-MM-dd")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/73bf6f77-9744-9419-2987-49b30bca01ab.png)

# あとがき

Power Fx は Microsoft 365 全体で使えるようになっていくだろうから、必要に応じて覚えていく必要がありそうかなぁ :thinking:
インターネットの仕組み、歴史について

# 1番身近で1番知らなかった仕組み
IT業界で働き始めて約2年が経ちました。
この業界で働く前、もっと言えば学生のころから1番身近にあったインターネットについて、しっかり勉強する機会にようやく出会えばので簡単に記事にまとめてみます。

:::note warn
本記事は誤りが多い可能性大です。
気になる部分があればご指摘いただけると幸いです
:::

# はじめは電話回線を使っていた
インターネットのそもそもの起源を辿ると、モールス信号のための電信網が整備され～といったところから話をしないといけないです。
それだとちょっと長くなるので現代と紐付しやすい＝イメージしやすい部分だけを抜粋してご紹介します。

### 通信確立の起源は1950年代
初めてコンピューター同士の通信が確立されました。
元々は人より優れた計算機として使われていたコンピューター同士を繋げ、2文字の送受信を行われました。
この通信を**インターネット**と名づけられました。
通信手段としてはコンピューター同士を電話回線＝銅線で繋いで通信が行われたそうです。

### ちょっと進んで1970年大
コンピューター同士文章のやりとりができるようになります。
これが**メール**の誕生です。
この時からメールアドレスには「＠」が使われていて、現代まで普及し続けています。

### 1990年代
時代が進み、1990年代には世界中でインターネットの普及が急速に進みます。
コンピューターを持つ家庭が増え、電信柱に敷設された電話回線を用いた通信網が作られます。(ダイヤルアップ接続)
この時のインターネットは端末同士の1対1でのやり取りしかできませんでした。
更に、インターネット同士のやり取りで電話回線が占有され、電話など他の用途に使うことができません。

同年代で少し経ったころ、<b>www(World Wide Web)</b>という技術が作られます。
このwwwというのは接続先の事を指し、端末同士のやりとりを1対1で行うのではなく、
端末からあるサイトに接続し、サイト内の目的の場所にアクセスをするという接続方法となります。

現実のイメージでざっくり説明すると、
都市の中に様々な建物(=サイト)が存在し、目的の場所(アドレス)を訪問するような感じです。

![サイバー都市.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2014007/61750623-3999-bee5-488e-e0cb9f466b98.jpeg)


# 通信世代の発展
これまでにまとめた通信技術は電話回線=銅線を用いて行われていました。
銅線内を通る電子の流れを使って通信をするのですが、電子は距離や障害等による干渉を受けやすく、
通信先が遠ければ遠いほど衰退しその分遅延が発生します。

そこで電子に変わる通信手段として、光子による通信規格が作られます。
**光回線**の登場です。

この世で1番速い光を使う事で通信速度が速くなる事は当然なのですが、
原子が電子から光子になる事で、銅線ではなく干渉を受けにくくなる光ファイバーによる通信が可能となりました。
(衛星を使った無線通信の手段もありますが当時は物理的距離による遅延が凄かったらしいです)

世界中の通信を確立するため海中には光ファイバーケーブルが世界約3周分も敷設されています。
普段私たちが使っている端末から近くの基地局に繋がり、電信柱を通ったり接続先によっては海中ケーブルを通り目的のサイトにアクセスをするといった流れになります。
　→この辺のスケールが大きくなる感じは私の感動ポイントでした

 # 終わりに
本当にかなりざっくりですが、インターネットの仕組みや歴史についてまとめてみました。
 実際にはIPアドレスについて等重要な部分がたくさんあるのですが今回はこの辺で一旦投稿させていただきます。