OmniAICreator/Qiita-1.07M huggingface dataset:
EditButtonで「完了」のみ太字にする方法(SwiftUI)

## はじめに

本記事は [SwiftWednesday Advent Calendar 2023](https://qiita.com/advent-calendar/2023/swift-wednesday) の9日目の記事です。
昨日も @uhooi で [ブラーでぼかすけど膨らませない方法(SwiftUI)](https://qiita.com/uhooi/items/68858c46214fe88983a7) でした。

SwiftUIの [`EditButton`](https://developer.apple.com/documentation/swiftui/editbutton) で「完了」のみ太字にする方法を紹介します。

## 環境

- OS：macOS Sonoma 14.0（23A344）
- Swift：5.9

## EditButtonのデフォルト

`EditButton` はデフォルトで「編集」も「完了」も太字ではありません。

|編集|完了|
|:--:|:--:|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/e504d220-7826-6ebb-57f5-f82b8969ea6f.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/a8b7821f-c749-a09a-e0e8-e0eaa88e424d.png)|

## 連絡先のEditButton

しかし連絡先の `EditButton` は「完了」が太字になります。

|編集|完了|
|:--:|:--:|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/d6301034-12dd-1f04-eb83-f80b3ea4c5cc.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/08c04c4a-52f7-55d6-424a-0d9cd95f5dc8.png)|

連絡先にかかわらず、Appleのアプリは「完了」が太字になっていることが多いです。

どうすれば `EditButton` で「完了」のみ太字にできるでしょうか？

## EditButtonで「完了」のみ太字にする方法

[`EditMode`](https://developer.apple.com/documentation/swiftui/editmode) を [`environment(_:_:)`](https://developer.apple.com/documentation/swiftui/view/environment(_:_:)) で渡し、 [`isEditing`](https://developer.apple.com/documentation/swiftui/editmode/isediting) 時のみ太字にすることで実現できます。

```diff_swift:ContentView.swift
struct ContentView: View {
+   @State private var editMode: EditMode = .inactive

    var body: some View {
        NavigationStack {
            Text("Foo")
                .toolbar {
                    ToolbarItem(placement: .topBarTrailing) {
                        EditButton()
+                           .bold(editMode.isEditing)
                    }
                }
+               .environment(\.editMode, $editMode)
        }
    }
}
```

|編集|完了|
|:--:|:--:|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/8de8f7a0-3cf0-5d21-b56c-d7bd8fcc1967.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/c435d45b-7f63-00ab-8552-c63a32f66aef.png)|

「完了」のみ太字になりました。

## おわりに

これでAppleのアプリにデザインを近づけることができました :relaxed:
もしもっと簡単に実現できる方法があれば、ぜひコメントなどで教えていただきたいです。

以上 [SwiftWednesday Advent Calendar 2023](https://qiita.com/advent-calendar/2023/swift-wednesday) の9日目の記事でした。
明日は @h1d3mun3 さんです。

## 参考リンク

- [Update toolbar by uhooi · Pull Request #211 · uhooi/Loki](https://github.com/uhooi/Loki/pull/211)
- [swift - How to check EditButton/EditMode state in SwiftUI - Stack Overflow](https://stackoverflow.com/questions/68104918/how-to-check-editbutton-editmode-state-in-swiftui)
paizaでのレーティングチェック（python3）【1724】

先月ぐらいからpaizaでレーティングチェックをしてきましたがこの辺りが今の限界かな。。
python3
![paiza.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638856/fa74764e-f7c3-8666-99f6-4ace0ecfaa6f.jpeg)
- Aランクの感想と気を付ける点
数学的、情報理論的基礎知識がちゃんと必要
やることさえ思いつけばコードは書けないことはないが
引き出しが少ないのでその思いつくが難しい
自分の数学知識は中学レベルも怪しいのでどうしても長考してしまうのと制限時間があるなかだとどうしてもあせっていい案が思い浮かばない
再挑戦で1週間ぐらい長考した問題もあった（やる気が少ないのもあるけど）

タイムアウトさせないため、効率的な処理をさせるためにどうするかとか
再帰関数を使用しているならちゃんと無限ループに陥らないようにするとか

- B,Cランク
やってやれないことはないけど
早解きが苦手、あとケアレミスが多い
例えば配列の中を2個づつ3個づつ見ていくみたいな処理をするときに
配列サイズ設定ミスで最後の要素を見逃していたとか
ちゃんと境界値のテストケースを自分で作ってテストすればミスに気が付いていたケースが多い

仕事でも動かなかったら修正すればいいやの精神でやってたのでいちいちテストケースなん用意してないからな...
ちゃんとこれは試験でやり直しがきかないって意思でやらないと取りこぼしまくる
日本語プログラミング言語をモデリング言語としてシステム開発上中流工程に導入する

# はじめに

日本語プログラミング言語をモデリング言語としてシステム開発上中流工程に導入した場合、そのメリット・デメリットについて考察します。本記事の内容はいくつかに分割されて記載されます。本記事中の「本記事」とは分割された内容の総体を指す場合があります。

https://qiita.com/advent-calendar/2023/remind

この記事は日本語構造化仕様記述言語 Re:Mind（リマインド）アドベントカレンダー2023の10日向けの記事です。

## 対象読者
とりあえずこの記事の想定読者はシステムエンジニアさんです。とくに日本語で要求仕様や内部設計資料を書いている方向けのお話です。

# 想定しているシステム開発フロー
オーソドックスなリレーショナルデータベースを使用している業務システムを想定しています。とりあえず国内案件として既定自然言語は日本語を想定していますが、自然言語記述の代わりに構造化されたモデリング言語を使用するという意味では日本語に限定されることはない要件です。

```mermaid
flowchart 
    subgraph sgA["上流工程"]
    A["ユビキタス言語</br>（日本語業務用語ディクショナリ）"] --> B["日本語モデリング言語"]
    A --> F["概念ER図"]
    style sgA width:500px
    end
    subgraph sgB["中流工程"]
    B --> C["日本語ロジック記述言語"]
    C --> D["日本語トランスコンパイラ言語"]
    F --> G["論理ER図"]
    G --> H["物理ER図"]
    style sgB width:500px
    end
    subgraph sgC["実現工程"]
    D --> E["実装言語（Java C＃ Ts Goなど）"]
    H --> I["実データベース"]
    style sgC width:500px
    end
```

右側のルートにリレーショナルデータベースの一般的な設計フェーズを併記しています。こちらのルートは各種ツールがデータベースベンダーやモデリングツールベンダーもしくはそれらを提供するOSSなどから豊富に出そろっています。

本記事の主題は左側のルートで、実装言語に至る設計フェーズでは、現状これといった有力なツールとしては、図系言語のUMLまたは数学的形式言語のVDM++などが想定されます。本記事ではそれらのツールとの対比で、日本語プログラミング言語を使用した場合のメリット・デメリットを考察します。

# 各工程の「完成」とは
前記のざっくりとしたシステム開発フロー図では、「実現工程」としてはテスト工程を含み、「実現工程」の「完成」とはシステムがソフトウェアとして正常に動作する状態を言います。（ここでは隠れたる瑕疵の存在はとりあえず考慮しません。）

しかし、「上流工程」「中流工程」の「完成」とはどういう状態として定義されていますでしょうか？

数学的形式言語のVDM++を導入している場合はでは、各工程の成果物に対して言語の検証ツールによるコンパイルが通過したことを持って「完成」とすることができますが、それ以外の場合はおおむね人間系のデザインレビューによる判定となるかと想定しています。

# この回のまとめ
本記事ではデザインレビューの判定基準が、各工程の成果物の書き味に立ち入らない場合は、往々にして日程消化の都合上不安定な成果物が後工程の「実現工程」に投入されることにより、「実現工程」の担当者に負荷のしわ寄せがおそいかかるという状況を避けられないものかという問題意識を含んでいます。

# 次回
~~各工程の詳細について検討してきます。~~
レイヤードアーキテクチャにふれます。
Milk-v duo用ビジュアルプログラミング環境を妄想してMind+を使ってみる。Arduino uno編

## はじめに
秋葉原ロボット部の有志で、milk-v duoを購入し、個々人が様々な実験を行って、勉強会内で報告しています。

Milk-v duoは9ドルのrisc-vコンピュータとして知られています。
ハードウェアは以下の通りです。

1. CPUはCVITEKのCV1800B (C906@1Ghz + C906@700MHz)
1. 最高1 GHzで動作するデュアルRV64コア
1. 64 MBのラム
1. オプションのアドオンボードを接続すると10/100Mbpsの速度でイーサーネットに接続可能

pinpongライブラリの情報を調べていると、ライブラリの対応しているボードのいくつかで、Mind+というビジュアルプログラミング環境でプログラム可能との情報を見かけるようになります。
Scratch3.0をベースに開発され、Python、CとC++のプログラム言語を利用可能です。
https://mindplus.cc/en.html
さらに、 StarFive JH710のCPUを搭載したボードで、pinpongライブラリを介して、Mind＋でビジュアルプログラミングが可能との記事を発見しました。
How to use the RISC-V development board to achieve automatic car patrol line driving?
https://community.dfrobot.com/makelog-312196.html
Milk-v duoでもMind＋が使えると、教育現場への普及も夢じゃないですね。

## ビジュアルプログラミング環境Mind+


## Windows上のMind＋からArduino unoにプログラムを転送
Mind＋のインストールの際、英語を選んでインストールしても、インストールのガイダンスが英語なだけで、起動時には中国語表示となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/fba30d68-3abd-2e97-ff57-be5476876840.png)
右上の歯車のアイコンをクリックすると、日本語が選べます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/571c087e-dd45-46f8-6073-72ea85b933b4.png)
プログラム環境には複数ありますが、ここでは、「Offline」が白地にオレンジ文字の状態を選択します。
次に、「デバイスを接続」から、Adruino unoのCOMポートを選択します。
さらに、右上の歯車の下の部分に「Arduino C」が選択されていることを確認します。
プログラムの作成は「制御」のウィンドウから部品を選んでLチカのプログラムを作成します。
左下のオレンジの四角をクリックして使用するボードを選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/5a43ac74-ef09-378b-075f-efc0e3332d4b.png)
今回はArduino unoを選択して、「戻る」を押して、「コード」の画面に戻ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/9f345859-dac7-c4b5-373c-e5d5ec2ac31a.png)
プログラムが終了したら、右上の「アップロード」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/a352dfb3-9509-6547-c683-a2902ed6366a.png)
右下の黒地の画面に、「正常にアップロードされました」が表示されると、Arduino uno上でLEDが点滅します。
「ChatGPT」から個人情報含む学習データの抽出に成功 を読んで

![アイキャッチ.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/2019b486-7dc6-7b60-f830-6d725103709b.jpeg)
### はじめに
最近のCNET Japanの記事によると、Google DeepMindの研究者がOpenAIのChatGPTから訓練データを抽出することに成功しました。

### 問題
この発見は、個人情報を含むデータの安全性に関する重要な問題を浮き彫りにしています。AIが予期せず訓練データを露呈するリスクがあることが明らかになりました。

### 原因
原因として、AIが特定のプロンプトに反応してプログラムされたアライメントから逸脱することが挙げられます。これは、AIの学習アルゴリズムやデータ管理の脆弱性を示唆しています。

### 解決方法
解決策としては、アルゴリズムの透明性の向上、継続的なセキュリティモニタリング、およびエンドユーザーへの責任あるコミュニケーションが必要です。これには、新しいセキュリティ脆弱性への対応とユーザーフィードバックに基づく改善が含まれます。

### おわりに
この事件は、AIとバックエンドシステムの安全性に対する新たな議論を促すものであり、私たちバックエンドエンジニアは、これらの課題を真摯に受け止め、より安全で信頼性の高いシステムを設計するために努力する必要があります。

### 参考
詳細は、CNET Japanの記事をご覧ください: [「ChatGPT」から個人情報含む学習データの抽出に成功--Google DeepMind研究者ら](https://japan.cnet.com/article/35212333/)
Elixir　Enum.zip VS 再帰関数　速度競争

# はじめに

Enum.zipを使ったコードが予想以上に遅かったことがあり、他の実装方法と比較してみます。

次の記事で作った、ABC242Cで比較してみます。

https://qiita.com/GeekMasahiro/private/14206275ed496fc14372

# 対策前
```Elixir
    def add_list_with_shift(l) do
        #   リストlの要素を以下のようにシフトして加算したリストを返す。
        # ret[i] = l[i-1] + l[i] + l[i+1]
        shift_left1 = Enum.drop(l++[0], 1)
        shift_right1 = Enum.take(l, length(l) - 1)
        shift_right1 = [0 | shift_right1]
        Enum.zip([shift_left1, l, shift_right1]) |> Enum.map(fn {x, y, z} -> rem(x + y + z, @mod) end)
    end
```

実行時間は、AtCoderのジャッジで1746msでした
 
# 再帰関数で実装

Enum.zipを再帰関数で実装してみます

```Elixir
    def add_list_with_shift(l) do
        #   リストlの要素を以下のようにシフトして加算したリストを返す。
        # ret[i] = l[i-1] + l[i] + l[i+1]
        shift_left1 = Enum.drop(l++[0], 1)
        shift_right1 = Enum.take(l, length(l) - 1)
        shift_right1 = [0 | shift_right1]
        zip_sum(shift_left1, l, shift_right1)
    end

    def zip_sum([a],[b],[c]), do: [rem(a+b+c, @mod)]
    def zip_sum([a|a_list],[b|b_list],[c|c_list]), do: [rem(a+b+c, @mod)| zip_sum(a_list,b_list,c_list)]
```

実行時間は、AtCoderのジャッジで1543msでした

200ms速くなりました。

AtCoderでは、200ms足りなくてTLEになるとかはあまりないと思いますが、Elixirの場合、適切なアルゴリズムでも、あと一歩間に合わない場合があるので、そんな時は役立つかもしれません。
StateとBindingがよく分かる資料をまとめた (SwiftUI)

# StateとBindingがよく分かる資料をまとめた (SwiftUI)

apple or swiftが公開している資料をまとめました。

[Property Wrapperの提案](https://github.com/apple/swift-evolution/blob/main/proposals/0258-property-wrappers.md)

Property Wrapperのユースケースが確認できるので、提案を読むのはお勧めです。

[Property wrapperの概要](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/properties#Property-Wrappers)
これを読めば使い方が分かります。

[StateとBindingの概要](https://developer.apple.com/documentation/swiftui/managing-user-interface-state)
`State`と`Binding`の概要が分かります。

[Stateの仕様](https://developer.apple.com/documentation/swiftui/state)
`State`の仕様が分かります。`projected value`の型が知りたいなどありましたら、仕様を読むといいかもです。

[Bindingの仕様](https://developer.apple.com/documentation/swiftui/binding)
`Binding`の仕様が分かります。

## 終わりに
自分なりの解説を追加するかもです。分かりやすい資料が他にもありましたら、コメント欄で教えてください。
PHP nullable な型、union 型について

# 本記事を書こうと思った動機
本記事では、
* **nullable な型**（データ型の前に **`?`** を付与）
* **union 型**（**`|`** で複数のデータ型を結合）

について紹介する。

ある時、有名なライブラリのコードを解析していて、上記 2 つを使用した部分をよく見かけた。私のように「ライブラリを提供する側ではなく、使用する側」の立場が多い人にとっては、使う場面が少なく新鮮なコードに見えた。**この機会を逃したら、おそらく勉強しないだろうと思った**ので、その意味をはっきりさせておきたかった。

# nullable な型
引数や戻り値の型宣言で、nullable 指定ができる。PHP マニュアルによると、
> PHP 7.0.x から PHP 7.1.x への移行

時の新機能のようだ。**データ型の前にクエスチョンマーク (`?`) を付与することで、指定したデータ型に加え、null も渡せるようになる**。下記に、引数に (`?`) を付与しない場合、付与する場合、戻り値に (`?`) を付与する場合を示す。
### 引数に (`?`) を付与しない場合
引数に null を渡すことによるエラーが発生。`setName()` はその名の通り、「名前」を設定するだけの関数。
```php:引数に (?) を付与しない場合
<?php
function setName(String $name) {
    var_dump($name);
}
setName(null);

/* 実行結果：
    PHP Fatal error:  Uncaught TypeError: setName(): Argument #1 ($name) must be of type string, null given
*/
```
### 引数に (`?`) を付与する場合
null を許容し、プログラムは正常終了。
```php:引数に (?) を付与する場合
<?php
function setName(?String $name) {
    var_dump($name);
}
setName('佐藤');
setName(null);

/* 実行結果：
    string(6) "佐藤"
    NULL
*/
```
### 戻り値に (`?`) を付与する場合
```php:戻り値に (?) を付与する場合（書き方のみ）
function setName(String $name): ?String {
```

# union 型
バージョン 8.0.0 より、union 型のサポートが追加されたようだ。**パイプ (`|`) を使用することで、複数の型を許容する引数や戻り値** などを定義できる。下記に、引数に (`|`) を使用しない場合、使用する場合、戻り値に (`|`) を使用する場合を示す。
### 引数に (`|`) を使用しない場合
`float` に文字列を渡すことによるエラーが発生。`setTax()` はその名の通り、「消費税率」を設定するだけの関数。
```php:引数に (|) を使用しない場合
<?php
function setTax(float $tax) {
    var_dump($tax);
}
setTax('佐藤');

/* 実行結果：
PHP Fatal error:  Uncaught TypeError: setTax(): Argument #1 ($tax) must be of type float, string given
*/
```
### 引数に (`|`) を使用する場合
複数のデータ型を許容し、プログラムは正常終了。
```php:引数に (|) を使用する場合
<?php
function setTax(String|float $tax) {
    var_dump($tax);
}
setTax('佐藤');
setTax(1.1);

/* 実行結果：
string(6) "佐藤"
float(1.1)
*/
```
### 戻り値に (`|`) を使用する場合
```php:戻り値に (|) を使用する場合（書き方のみ）
function setTax(String $tax): String|float {
```

# 最後に
union 型のところで、引数や戻り値 **「など」** と書きましたが、どうやらクラスの **メンバ変数** にも使えるようだ。使う機会があったら、ぜひ試してみたいと思います。
メール届かない系の問い合わせは調査用ダッシュボードで楽しよう

「メールが届かない！」
「購読解除したのにメールが来る！」


こういうお問合せをいただくことはありませんか？

そして、この調査、結構大変じゃありませんか…？

**調査用ダッシュボードを作るのはいかがでしょう？**


![スクリーンショット 2023-12-09 16.12.43のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107402/7b212338-dc06-0517-6d48-94aa83be5d9c.png)


通知が届かない原因は様々あり、その原因を特定するのは骨が折れることが多々あります。

そんな中、まず最初に調べることは大体決まっています。

例えば

- 購読状況はどうなっているか
- 送信履歴はある or ないのか
- 送信履歴がある場合、いつ・どんな通知が送られているか
- 送信先アドレスはお問合せユーザーと同一か
- 送信エラーになっていないか

これらは一次調査としてすぐに調べられると調査時間を短縮でき、回答までのリードタイムも短縮できます。
ユーザーIDと期間指定したら、購読状況や送信履歴が一発で表示されるような問い合わせ調査ダッシュボード、作ってみてはいかがでしょうか？

なお、サンプルはLooker Studio（旧データポータル）を利用しました。
https://cloud.google.com/looker-studio?hl=ja
Macで外部SSDなどのストレージをセキュリティーオプションで完全削除する方法 0埋め



以前はディスクーティリティーで外部ストレージの初期化の際に、セキュリティーオプションが選べましたが、現在は表示されなくなりました。
しかし、外部ディスプレイを売却する場合や、Macに暗号化をかけずに使っていた場合など、セキュリティー面で心配なことがあります。
何せ、そのまま初期化フォーマットしただけでは、フリーソフトでも簡単にデータの抽出ができてしまうからです。


やり方は簡単で、ターミナルでやります。


一回削除
```
diskutil randomdisk 1 /Volumes/SanDisk
```

このコマンドでできます。
ディスクの名前によって、コマンドを変えてください。上記の例は、外部ストレージの名前をSanDiskとしていた場合です。


複数0埋めをする場合は、
```
diskutil randomdisk 4 /Volumes/SanDisk
```


このように、数字の部分を変えます。

注意点ですが、外部ストレージをいくつか繋いでいる方や、Macの本体のSSDに間違えて実行しないようにしてください。

ディスク名は、/dev/---- のような形式でも削除可能らしいですが、試していません。

以上！


```bash
Mac:~ hogehoge$ diskutil randomdisk 1 /Volumes/SanDisk
Randomly erasing the disk 1 times
Started erase on disk15s2 (SanDisk)
Finished erase on disk15s2 (SanDisk)
```
【競プロ】DFS（深さ優先探索）をPythonで書く

## はじめに
AtCoderでは、よく木を使って解く問題が出題されます。
そこで、今回は深さ優先探索を用いて処理を行うときのコードをまとめました。

例えば以下のような問題です。

https://atcoder.jp/contests/typical90/tasks/typical90_c

https://atcoder.jp/contests/abc284/tasks/abc284_c

この記事が、
DFS（深さ優先探索）について理解する良い機会になると幸いです。

## そもそもDFSってなんだっけ

DFS（深さ優先探索）とは、木を探索する手法の一つです。

もう一つの方法に、BFS（幅優先探索）があります。

![DFS-BFS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3080550/ecdf0328-1129-e6f7-0682-f2aa4bda989c.png)

上の図は、深さ優先探索と幅優先探索で探索するときの順番です。

詳しい説明は省きますが、興味があれば調べてみてください。

２つの違いをざっくりと説明すると、

- とりあえず突き進みながら探索するのがDFS（深さ優先探索）
- 同じ深さのノードを順に探索するのがBFS（幅優先探索）

という感じです。
今回は二分木で表現していますが、二分木でなくても同じです。


## 実際のコード

では、ここではDFS（深さ優先探索）をPythonで実装してみます。

以下のコードは、「探索済みかどうか」というリストを作って実装していますが、
実際の問題では「各ノードの```start_node```からの距離を格納するリスト」など、
その場面に合わせたリストに変えて実装してみてください。

```py:dfs.py
def dfs(start_node :int, number_nodes :int, G :list):
    '''
    スタックを使って深さ優先探索
    G は二次元配列で、G[node]の中には nodeとつながっているnode が格納されている
    '''

    did = [0] * number_nodes # 探索済みかどうかを判定するリストを作成
    did[start_node] = 1 # start_node を探索済みにする
    stack = [start_node] # stack には探索したいノードを格納
    
    while (stack): # stack の中身がなくなったら探索終了
        parent_node = stack.pop() # stack からノードを一つ取り出してparent_nodeに格納
        for children_node in G[parent_node]: # parent_nodeと繋がっているchildren_nodeを探索
            if not did[children_node]: # children_node が未探索なら処理を行う
                stack.append(children_node)
                did[children_node] = 1
    
    return did
```
「そもそもDFSってなんだっけ」で例としてあげた深さ優先探索は、
左から順に探索するように表現してありますが、

このコードを実行すると 
（木のノード番号の付け方によって変わりますが、細かいことは置いといて...）
右から順に探索するようになっているはずです。

実際に簡単な木を書いて試してみてください。

## 最後に

今回はDFSをPythonで実装してみました。

私自身、DFSを使う問題はなんとなく苦手意識があるので、
これを気に徐々に慣れていきたいと思います。
やりたくない仕事をやらずに済む方法

# 結論

「やりたい仕事」をやりましょう。

## 正確には・・・

（やりたくない仕事よりも）**価値がある**「やりたい仕事」をやりましょう。

# 補足

## そもそも仕事をしたくない。

本記事の対象外ですが、不労収入を構築しましょう。

## やりたい仕事がない。

探してもないなら、異動もしくは転職しましょう。

## やりたい仕事はあるが・・・

### 時間がない。

交渉して、人員を確保しましょう。

## やらせてもらえない。

### 価値がないなら・・・

見切りをつけて、他の仕事を探しましょう。

### 価値があるなら・・・

諦めずに、上長と話しましょう。

#### 上長と折り合わないないなら・・・

深追いし過ぎず、異動もしくは転職しましょう。

# まとめ

「やりたい仕事」をするのも大変・・・。

## 最後に

最後まで読んで頂きありがとうございます。

ポエムを書いてみたかった気持ちが昇華できました。
【ブログ】私のSES(ネットワークエンジニアと開発)

私は現在SESでネットワークエンジニアとして働く40歳です。

>40歳にもなってまだネットワークのエンジニアやっているの？
SESで？

同じような不安を持つ方もいらっしゃるかと思います。
今は株式会社ダイヤモンドファンタジーという会社で
ネットワークのエンジニアをしています。

>開発エンジニアが9割、
ネットワークエンジニアが1割

SESの会社としては若く、長い歴史のない会社です。
日本は今経済危機や、税金に悩まされ裕福な生活が厳しく

> 新しい会社なんて不安しかない！

という方も多いと思います。

>エンジニアに未来はない！
若い方の活躍の場がない社会の構造は悪だ！

新しいことに取り組むことが大好きな私は
工場勤務や、ルーチンワークは苦手だったので、
革命を起こして活躍したかったのです。

そんな中、第三世代の活躍が社会を変える状況がＴＶ等で話題になり、
新しい社会を支える輝かしいに未来に向けて自分は、
橋渡しとなれる人になりたい。と考えたのです。

>今の日本は家庭も仕事も両立出来ないと駄目だ！
>若い人にもっと活躍できるよう会社側も変わらないと駄目だ！

というわがままな自分を押し通し、今にいたります。

元々、ネットワークエンジニアとして働いていた私は
SESという職業に出会います。
ネットワークエンジニアの年齢は年々、平均年齢が上がっており、若い力がないのです。

>どうするべきか。。。
エンジニアが安心して未来働ける会社はないのだろうか。

そんな中、福利厚生や会社の売上、社員を大事にする
株式会社ダイヤモンドファンタジーに辿り着きます。
最初はとても不安でしたが、すぐに不安は取れました。
若い意見や、知識を多く取り入れる社長

>この会社ならもしかしてネットワークと開発、両方に学べるかも？
私も開発エンジニア目指すことも出来そう！
若い人がネットワークエンジニアに興味があれば私も力になれるかも！

と考えました。これが今の私の始まりです。
最初は開発エンジニアの営業が多いため、営業と意見の食い違いあったりしました。
社長ともよく話をし、考え、意見を伝え、それが会社で変わっていく。

>新しい会社っていいな。
私も成長しないと。

と今でも思える会社に出会えてとてもよかったと思います。
今でもどんどん変わっている会社ですが、
そんな意見の通る会社、若い力が活躍できる会社
そんな新しい社会作りをこれからもやっていきたい。

そんなネットワークエンジニアの一人事でした。

ここまで読んでくれてありがとうございます。
気になったら私の会社も見てください。

https://diamond-f.co.jp/
コンテクストとストーリー：仕様を超えたエンジニアリング

# Abstract

:::note
主に自社サービスエンジニアを念頭に置いています
:::

- エンジニアも、施策のコンテクストとストーリーを把握しよう
- コードにおける機能の位置付けを把握してコード設計をしよう
- 時にはエンジニアからも代案を出そう

# はじめに

仕様の把握。これはエンジニア側にとっても、企画側にとっても大事です。

しかし仕様は、単に「作りたいもの」を示すに過ぎません。自社サービスのエンジニアという、同じコードベースで開発をし続ける立場としては、単に仕様を把握するだけでは、全くもって不十分です。

***「良いコード設計を行うには、施策の仕様だけでなく、その施策のコンテクストとストーリーを深く理解することが不可欠である。」***

今回はそんな話をします。

# コンテクストとストーリー

では、**コンテクスト**と**ストーリー**とは、一体何なのでしょうか。

### 施策のコンテクスト: 課題背景を把握する

**コンテクスト**とは、その施策が生まれた文脈や背景です。

施策を企画した人は、サービスに対して何かしらの課題感を抱いているはずです。あるいは、チームとして注力している課題があるかもしれません。

- どのような課題を解決したいのか
- どのような動機で、その課題を解決したいのか

などを理解し、「どのような背景でその施策が生まれたのか」を把握します。

### 施策のストーリー: 仮説を把握する

**ストーリー**とは、企画した人が考える、その施策の未来予想図です。

施策には、動かしたい数値というものがあります。また、成功や失敗があります。

- どの数値が、どれくらい動きそうか
- どれくらいポジティブ/ネガティブに動けば、成功/失敗なのか
- 施策が成功/失敗した場合、次のステップとして何を考えているのか

などを理解し、「今の施策や次の施策がどちらの方向に進んでいくか」を把握します。

# コードにおける機能の位置付け

コンテクストとストーリーを把握することで、サービス全体におけるその施策の位置付けが明確になります。

サービスにおける施策の位置付けが分かれば、コードにおけるその機能の位置付けも明確になります。これはコードの設計方針に大きく影響します。

### 高い位置付けの場合

コードにおける位置付けが高いと判断された場合、将来においても変更が容易な、**柔軟性の高い設計**にする必要があります。

 高い位置付けの機能は、今後も触られ続ける可能性が高いです。したがって、少しばかり工数が増えたとしても、将来を見据えた実装を優先する方が、サービスにとってプラスになるということです。場合によっては、関連するコードのリファクタリングまで検討してもよいかもしれません。

### 低い位置付けの場合

コードにおける位置付けが低いと判断された場合、**他への影響を最小化した設計**にする必要があります。

例えば、期間限定キャンペーン施策であれば、キャンペーン終了後は容易に元に戻せる形で作ります。確度の低い施策であれば、DBやAPIレスポンスに変更を加えるのは避け、既存のもので代用するか、あるいはハードコードで済ませます。

より高い位置付けのコードに影響することがないよう、できるだけ「そこだけに閉じ込める」気持ちで作ります。

# エンジニア側からの提案
時には、仕様通りに実装することが難しい場合もあります。

また、実装自体は可能だとしても、既存のコード設計と噛み合わない場合もあります。これをそのまま実装してしまうと、将来的に技術的負債になる可能性があります。

そのような場合は、**エンジニア側から仕様の代案を出す**ことが重要です。

その際に重要となるのが、**コンテクストとストーリーの理解**です。コンテクストとストーリーを把握することで、仕様の代案を検討する際に、より適切な案を提示することができます。ビジネスサイドとのコミュニケーションも円滑になります。

サービスを継続的に発展させるためには、技術的負債を回避し、コード設計を適切に行うことが重要です。そのためには、エンジニア側からの提案が不可欠です。

## 結論

効果的なコード設計には、単なる仕様の理解を超えた、施策の深い理解が求められます。

コンテクストやストーリーを理解し、よりよいエンジニアリングを目指しましょう。

***

ちなみに、「コンテクスト」や「ストーリー」という用語は、私が普段、便宜上使っているだけです。「課題背景」や「仮説」も同様です。あくまで頭の整理に便利なので、適当に名前を付けています。（字面の格好良さもあります。）

もし企画職の方がこれを読んでいて、「用語の使い方が違う」と思ったら、遠慮なくコメントしてください。
AWSでCentOSのEC2インスタンスを起動する


# はじめに
クラウドとサーバーの学習環境がほしいので、AWSでCentOS環境を構築することで一挙両得いたします。
<br>
<br>


# 1. EC2からCentOSのインスタンスを起動

AWSマネジメントコンソールを開き、画面上部の検索欄に「EC2」を入力し、EC2のページに移動します。
その後「インスタンスを起動」をクリックします・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629098/ad1052f5-5a7e-adeb-32a2-bdc555b97933.png)

<br>
Application and OS Images1に「Cent OS」と入力しEnterします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629098/3717dc7b-c654-fe62-83c2-907e738576d0.png)

<br>
<br>
今回は「CentOS 7 (x86_64) – with Updates HVM」を選択します。
このイメージは最小限のプロファイルで構築された公式CentOS 7 x86_64 HVMイメージで、HVMインスタンスタイプでの使用にのみ適しているとのこと。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629098/7dbaef3f-30c0-cdf2-b998-954faa5a83eb.png)

<br>
<br>
他キーペアの作成やネットワークの設定が完了したら画面右下の「インスタンスの起動」をクリックします。
今回の設定はデフォルトです。とくにいじらず。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629098/e3a4856d-e480-0e75-ff45-d12604072aa4.png)

<br>
<br>
作成が完了し、インスタンスの画面に戻ると先ほど作成したインスタンスがあることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629098/8e42e0f7-10f9-a6e0-cbb4-ef1de2ba7faf.png)




<br>
<br>


# 2. 起動したインスタンスに接続する


手順１で起動したインスタンスに接続します。今回使用するツールは自社で使い慣れている「Tera Term」です。以下の手順はTera Termがインストール済みであることを前提としています。
<br>

以下の手順はこちらの記事を参考に行っています。
https://qiita.com/Aichi_Lover/items/3471b1ba710e995ffd80
<br>
<br>
Tera Termを起動しホスト欄にEC2インスタンスのパブリックIPアドレスを入力し、OKをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629098/d68fc402-0b5c-6d29-fbb8-86b60559e025.png)
<br>
<br>
その後以下の画面で次のように入力します。
・ユーザ名：centos
・認証方式：「RSA/DSA…」を選択し手順１でローカルに保存した秘密鍵を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629098/a553bfea-ed16-1800-72aa-6690cb12ff44.png)


<br>
<br>
接続できた！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629098/834a4780-6b9e-1540-7ed8-8314e147eb37.png)


<br>
<br>
操作もできる！やったー！！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629098/1d1fe1f6-f2ad-8ad2-023c-8b65545bc1a9.png)

<br>
<br>

# 3. まとめ
AWS EC2からCentOSのインスタンス起動→任意の方法で起動したインスタンスに接続という簡単な方法で、CentOSの検証環境を準備することができました。

ひとつ、つまづいた点として「SSH認証」のユーザー名入力の際「centos」と入力しなければならないところで、普段のクセで『ec2-user』と入力してしまい、それが原因でSSH認証ができなかったことです。

↓参考

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/connect-to-linux-instance.html

ただそれさえなければ非常にスムーズに検証環境を準備することができたので、学習目的などでぜひ試してみてはいかがでしょうか。
WordEngineをDiscord Rich PresenceにChrome拡張機能とかで対応させてみた

本記事は、[めんどい太郎の Advent Calendar 2023](https://qiita.com/advent-calendar/2023/mendoitarou_first_calendar) 11日目の記事です。

# はじめに

この記事は初心者が書いています。

皆さんWordEngineってご存知ですか？

Wikipediaによると[^1]

>ワードエンジン（Word Engine）は、株式会社レキシカが運営する英語学習用ウェブサイトである。

ということで英語の学習サイトです。

私の通っている学校ではこのワードエンジンを授業に組み込んでおり、私も毎週決められた目標をクリアしています。

しかし....モチベーション維持がけっこう大変です。

忘れてたり、やる気が起きなかったりするわけですね。

そこでDiscord Rich Presenceに対応させてモチベをあげよう！ってことです。はい。

ちなみにモチベは上がりませんでした()

# やり方

ソースコードをGitHubで公開していますのでそちらを使用します。

https://github.com/mendoitarou/WordEngine_Discord_Rich_Presence_Extention

こちらのレポジトリをクローンするなりZipファイルでダウンロードするなりします。

## ライブラリインストール

次にライブラリをインストールします。

次のコマンドはLinux用です。

```Shell
python3 -m pip install xmltodict https://github.com/qwertyquerty/pypresence/archive/master.zip
python3 -m pip install flask flask_cors flask_jwt_extended
```

Windowsは``pip``から先でいいと思われます。

## クライアントID取得

[Discord Developer Portal](https://discord.com/developers/applications)にアクセスします。

右上にあるNew Applicationをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388444/e37819c1-2edd-dfa1-ec81-3854354bc4a4.png)

任意の名前をつけます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388444/b84bf912-c5dc-f59c-7c35-1e0087d69370.png)

OAuth2の項目を選択し、``CLIENT ID``の値をメモしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388444/4b987c6a-d130-10c5-ed65-876d18c0bc6f.png)

## 拡張機能インストール

[拡張機能のページ](chrome://extensions/)を開いて、``package``の中に入っている``chrome-extension.crx``をChromeのウィンドウにドラッグアンドドロップします。

インストールを許可するかどうか聞かれるので許可します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388444/e7b8565c-0fb4-b3f0-6e2a-93f60ca9953e.png)

## 実行

最後に``server``、``client``の中に入っているPythonファイルを実行します。

```Shell
cd server
python3 server.py
```

```Shell
cd client
python3 client.py
```

あとは拡張機能が有効になっている状態で、WordEngineのマイページにアクセスすればDiscordに表示されるはずです。

このように表示されると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388444/df07ea34-7f8d-f639-2f53-89556867b9aa.png)

次からは[実行](#実行)からやればOKです。

注意点としては、Web版Discordはだめです。

また、``client.py``を起動する前にDiscordが起動している必要があります。

# プログラム

[こちらの記事](https://qiita.com/okaits/items/384bceb2b5a08a4c0a6f)を参考に作成しました。

ほぼコピペです。

ですので...特に解説することがないです()

# 最後に

WordEngineのモチベーションをあげようと試みましたが結局モチベーションは上がりませんでした。

なんならこれを作ってたせいで週目標がクリアできなかったなんて自体になりました。

まぁ...使う人がいたら使ってみてください。

つくってみたよ！って記事でした。

[^1]:[ワードエンジン - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%AF%E3%83%BC%E3%83%89%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3)
C#（.NET）で Min-Max 正規化

# Min-Max 正規化
正規化とはデータのスケール（単位）を扱いやすいものに整えることである。
Min-Max 正規化とは最小値0~最大値1にスケーリングする処理である。

```math
x^i_{norm} = \frac{x^i - x_{min}}{x_{max} - x_{min}}
```

```code.cs
List<double> MinMaxNormalization(List<double> data)
{
    double max = data.Max();
    double min = data.Min();

    List<double> result = new();
    foreach (double d in data)
    {
        result.Add((d - min) / (max - min));
    }

    return result;
}
```

# 参考
- 正規化（Normalization）／標準化（Standardization）とは？

https://atmarkit.itmedia.co.jp/ait/articles/2110/07/news027.html

- 正規化・標準化を徹底解説 （Python 前処理 サンプルコード付き）

https://www.codexa.net/normalization-python/
自衛官からエンジニアへ Elixirから始める Web開発 Part9

この記事は「Elixir Advent Calendar 2023」9日目の記事です
東京にいるけどfukuokaexのYOSUKEです。

普段は 合同会社TheWaggle で教材開発・システム開発・研修講師などマルチに活動してます。

このシリーズでは、文系ですらない、体育会系でも始められるプログラミング学習　というテーマで元自衛官だった僕が
自衛官からエンジニアになってもらいたいという気持ちを込めて、普段は大人しいですが、このコラムシリーズでは、あえて、体育会系のノリで、貴様ら理屈で覚えるなら体で覚えろ！というノリで書いてみたいと思います。

なので、初学者向けですが、理論は後回し、まずは動かして体感しろってノリの第9回目です。

それでは、いくぞ！

## 連続して何かをさせるときに便利な技...とその前に。
いいか、貴様ら！
前回、貴様らに与えた銃を貴様らの持つ班員１０名にそれぞれ渡す方法を教えてやろう！
よし！ それでは今回は貴様らの班員 10名全員に一気にそれぞれ、銃を受け渡す方法を伝授しよう！

今、貴様らが持っている武器をそれぞれ、貴様らの班員達にも装備させる必要がある。
そこで、まずは武器の管理をしっかりするために名簿を作れ! わかったな！

* はい！

よーし、まずは田中班長！　貴様の隊員名簿を作れ！

はい、私の班員全 10名は以下の通りです！
```elixir
{ "松浦", "橋本", "鈴木", "後藤", "伊藤", "薪", "空", "峰", "桂", "早乙女" }
```

うむ、よろしい！
前回、tanakaに渡した武器はちゃんと、今も持っているな？

* はい、自分は２０式です！

```elixir
tanaka
%{ 
    "名称" => "20式5.56mm小銃" ,
    "種類" => "小銃" ,
    "製造国" =>  "日本" ,
    "口径" =>	"5.56 mm" ,
    "銃身長" => "330 mm" ,
    "使用弾薬" =>	"89式5.56mm普通弾" , 
    "装弾数" => "30発" ,
    "作動方式" => "ガス圧作動方式" ,
    "全長" =>	"851 mm (銃床最小 779 mm)" ,
    "重量" => "3.5 kg" ,
    "発射速度" =>	"650 – 850発/分" ,
    "有効射程" =>	"500 m以上"
}
```

よし、では、貴様の班の全員に貴様と同じ武器を装備させろ！

* はい！

```elixir
{ "松浦", "橋本", "鈴木", "後藤", "伊藤", "薪", "空", "峰", "桂", "早乙女" }
= 
{tanaka, tanaka, tanaka, tanaka, tanaka, tanaka, tanaka, tanaka, tanaka, tanaka }
```

* 教官！なぜか名前では渡せません！と怒られます。

馬鹿者ー！
もう忘れたのか、貴様の頭は鶏か！　貴様がやったことは名前に武器を渡してるようなものだ、名前が武器を装備できるのか！
プログラムの世界では、```" "```や```:```が先頭についてない１```半角英数```に直して装備させろと前回言っただろう！

* しかし、なぜ、そのようにしなければいけないのですか？

貴様にはその理屈を知るのはまだ早い！と何度も言っているだろう！
まずは、ルールを覚えろ！ルールを意識せずにできるまで体に染み込ませろ！

理解できないから覚えられないなどと甘ったれた事は言うな！
貴様らのような奴は、まずは行動しろ！
行動して失敗して、学べ！

貴様が理屈を学ぶのは、息を吸うように、意識しないでもルールが守れるようになってからだ！　わかったか！

* はい！

```elixir
{ matuura, hashimoto, suzuki, goto, ito, maki, sora, mine, katura, saotome }
=
{tanaka, tanaka, tanaka, tanaka, tanaka, tanaka, tanaka, tanaka, tanaka, tanaka }
```

* 装備完了です！

よーし、いいだろう！と言いたいところだが、これでは貴様が10人いることになる。
貴様が10人とかクローン部隊か！

今回は班員10人とわかっているが、この方法だと11人に増えた時どうする？
困るだろう！

それに、名前はどこに行った！ 名前も一緒にまとめておかなければ、後々困るだろう！
まずは、タプルにして、名前と装備でまとめるようにしておくように！わかったな！

* はい

```elixir
{name, soubi} = 
{ "松浦", 
    %{ 
        "名称" => "20式5.56mm小銃" ,
        "種類" => "小銃" ,
        "製造国" =>  "日本" ,
        "口径" =>	"5.56 mm" ,
        "銃身長" => "330 mm" ,
        "使用弾薬" =>	"89式5.56mm普通弾" , 
        "装弾数" => "30発" ,
        "作動方式" => "ガス圧作動方式" ,
        "全長" =>	"851 mm (銃床最小 779 mm)" ,
        "重量" => "3.5 kg" ,
        "発射速度" =>	"650 – 850発/分" ,
        "有効射程" =>	"500 m以上"
    } 
}
```

よし、いいだろう！これでいよいよ
「貴様らの班員 10名全員に一気にそれぞれ、銃を受け渡す方法を伝授しよう！」の伝授する準備ができた。

しかし！残念ながら、
話しが長くなるので、今日はここまで、それでは次回 Part10でまた会おう！
VueUseのonClickOutsideが便利

# 導入

今回の話題はVue3と一緒に使うと便利な[VueUse](https://vueuse.org/)についてです。
中でも[onClickOutside](https://vueuse.org/core/onClickOutside/#onclickoutside)が単純ながらも強力です。

:::note info
※ 私が株式会社愛宕 Advent Calendar 2023に書く記事は主に社内向けに共有しておきたいけど勉強会をするまでもないちょっとしたTipsにしたいと思います。
:::

VueUseは便利なユーティリティ集で、クリップボードやLocalStorageなどのWeb APIを生の値ではなくリアクティブな形にラップして使えます。

`onClickOutside`は主に開いているポップアップやダイアログの外側をクリックしたらそのダイアログの外側を閉じるという要件を実装するのに使えそうです。そのエレメントの内側をクリックしたときの処理を実装するのは簡単です。しかし、外側をクリックしたときの処理を実装するのはそれと同様にはいきません。

`onClickOutside`を使うとそれが簡単になります。

# 解決
実際の表示非表示は省略しています。`isDialogOpen`の値に従って適切に表示非表示を切り替えられるようにCSSが指定されているものとします。

```vue
<script setup lang="ts">
import { ref } from 'vue'
import { onClickOutside } from '@vueuse/core'

const isDialogOpen = ref(false)
const openDialog = () => isDialogOpen.value = true
const closeDialog = () => isDialogOpen.value = false

const dialogRef = ref(null) // onClickOutsideの第1引数に渡すテンプレート参照
onClickOutside(dialogRef, closeDialog) // 第2引数は外側をクリックしたときの処理
</script>

<template>
  <main>
    <button type="button" @click="openDialog">ダイアログを開く</button>
    <div ref="dialogRef"> <!-- テンプレート参照の設定が必要 -->
      <!-- ダイアログの中身は省略 -->
    </div>
    <div>
      <p>ここはダイアログとは関係なく表示されている部分です。</p>
      <p>ダイアログを閉じるボタンをクリックしなくてもここら辺を適当にクリックすることで閉じてほしい。</p>
    </div>
  </main>
</template>
```
Pythonを使用したAzure Functionsでサードパーティー製のライブラリ導入方法

# かけた時間の割にとてもシンプルだったので共有

まず、Pythonを使用したAzure Functionsの作成方法はMicrosoftのドキュメントを参照。

https://learn.microsoft.com/ja-jp/azure/azure-functions/create-first-function-vs-code-python

次に、生成されたファイルの **「requirements.txt」** の中に導入したいサードパーティー製のライブラリの名前を記載するだけ。

例：numpy と scikit-learn を追加
```requirements.txt
# DO NOT include azure-functions-worker in this file
# The Python Worker is managed by Azure Functions platform
# Manually managing azure-functions-worker may cause unexpected issues

azure-functions
numpy
scikit-learn
```

Pythonコードを書く function_app.py のところに import すれば OK

例：numpy と OneClassSVM を import
```function_app.py
import numpy as np
from sklearn.svm import OneClassSVM
```
サイトマップを超簡単に自動生成する方法(Ruby)

## 概要
サイトマップを超簡単に自動生成する方法を紹介

## 環境
Ruby

## 手順
1. gemのインストール
1. コード記述
    ```rb
    require 'sitemap_generator'
    SitemapGenerator::Sitemap.default_host = 'https://example.com'
    SitemapGenerator::Sitemap.public_path = "./" # sitemapを配置する場所(デフォルトはpublic配下)
    SitemapGenerator::Sitemap.compress = false #圧縮するかどうか
    
    SitemapGenerator::Sitemap.create do
      add '/article1.html' # ここに追加したいパスを追加していく
    end
    ```
3. 実行

## 結果
カレントディレクトリにsitemap.xmlが生成される
```xml
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"
    xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
    xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"
    xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"
    xmlns:news="http://www.google.com/schemas/sitemap-news/0.9"
    xmlns:mobile="http://www.google.com/schemas/sitemap-mobile/1.0"
    xmlns:pagemap="http://www.google.com/schemas/sitemap-pagemap/1.0"
    xmlns:xhtml="http://www.w3.org/1999/xhtml">
    <url>
        <loc>https://example.com</loc>
        <lastmod>2023-12-09T15:24:06+09:00</lastmod>
        <changefreq>weekly</changefreq>
        <priority>1.0</priority>
    </url>
    <url>
        <loc>https://example.com/article1.html</loc>
        <lastmod>2023-12-09T15:24:06+09:00</lastmod>
        <changefreq>weekly</changefreq>
        <priority>0.5</priority>
    </url>
</urlset>
```
Elixir AtCoder用テンプレート

AtCoderの問題を解くとき、入力の処理ってどうしてますか？

私は、定型のひな形を用意して使っています。

Pythonで解く場合に使っている、atcoder-toolsのテンプレートに同じような仕組みがあったので、Elixirでも実現してみました。
区切り文字まで読み込む部分は、再帰を使って、簡素に書けたので気に入ってます。

```Elixir
defmodule Main do
    import Bitwise
    def next_token(acc \\ "") do
        case IO.getn(:stdio, "", 1) do
          " " -> acc
          "\n" -> acc
          x -> next_token(acc <> x)
        end
    end
    def input(), do: IO.read(:line) |> String.trim()
    def ii(), do: next_token() |> String.to_integer()
    def li(), do: input() |> String.split(" ") |> Enum.map(&String.to_integer/1)
end    
```

# 使用例

例えばABC331Aの入力はこんな形式です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/1b32f415-fdc8-e748-960d-910467a06dc9.png)

この場合は、次のように、ii()を順に呼び出していけば値を取得できます。

```Elixir
    def main() do
        end_of_month = ii()
        end_of_day = ii()
        y = ii()
        m = ii()
        d = ii()
    end
```

C問題以降のデータ量の大きい問題では、読み込みだけでTLEになる可能性があるので、TLEになった時は、この部分も疑ってみてください。

[ElixirでAtCoder参加してみよう（atcoder-toolsの導入）](https://qiita.com/GeekMasahiro/items/0970d7300f2bfcb28464)に使用例などもあるので見てみてください。
Python 辞書の備忘録

## はじめに
辞書の備忘録です💁
初心者です😅
間違えてる部分多々あると思います。
もし見つけた場合、ツッコミいただけると助かります🙇

## 🦁 結論 🦁
:::note info
押さえておくべき点🧠
1. 辞書は基本、キーと値のペア
2. 辞書の中の値にリスト、辞書を入れることも可能
3. 辞書の中の特定のkeyの値を抽出することができる
4. 辞書の中身を確認するにはgetメソッド、ブラケット記法、for key, value in my_dict.items()、printこの4つで確認できる。
5. 辞書を新しく作成する場合は、空の辞書を作成して「辞書名[新しいキー] = 新しい値」で入力する
6. 空の辞書への追加方法は４つ
:::

:::note warn
注意点
* 同じkeyを追加した場合は上書き保存される
* 存在しないkeyにアクセスしようとすると「Key error」になる
:::

## 辞書の作成
### 基本構文
辞書名{} # 空の辞書
辞書名[新しいキー] = 新しい値

### update() メソッド
既存にあるkeyを更新するメソッド。
一度に複数の要素を辞書に追加することも可。

```python:sample.py
my_dict.update({'key3': 'value3', 'key4': 'value4'}) 

# もしくは　my_dict.update(key3='value3', key4='value4')
```

### 辞書内包表記
* 既存のイテラブル（リスト、タプル、別の辞書など）を基に新しい辞書を生成するのに便利。
```python:sample.py
my_dict = {'apple': 1, 'banana': 2, 'orange': 3}
new_dict = {k: v * 2 for k, v in my_dict.items()}

# {'apple': 2, 'banana': 4, 'orange': 6}
```
### setdefault() メソッド
* すでにある辞書、リストを使って新たな辞書を作成
* 既存のkeyがある場合は追加はしない

```python:sample.py
# 辞書の作成
my_dict = {'apple': 1, 'banana': 2, 'orange': 3}

# 既存のキー（値は変更されない）
my_dict.setdefault('apple', 100)

# 存在しないキー（新たに追加される）
my_dict.setdefault('grape', 4)

# 辞書の内容を表示
print(my_dict)
# {'apple': 1, 'banana': 2, 'orange': 3, 'grape': 4}
# appleは既存であるため値も更新されない。
```


## 辞書の中身を確認する方法
### 指定したkeyを探して値のみを表示
※なかった場合はnoneを返す
※keyが不確かな場合はこっちを使う

```python:sample.py
my_dict = {'apple': 1, 'banana': 2, 'orange': 3}
apple_count = my_dict.get('apple')
#  apple_count は 1 になる
```


### keyを指定して値のみを表示
※なかった場合はkeyErrorを返す
※keyがないときにエラーを出したい場合に使う
```python:sample.py
my_dict = {'apple': 1, 'banana': 2, 'orange': 3}

apple_count = my_dict['apple']  

# apple_count は 1 になる
```


### 辞書の中身を全て表示
※データを集計したりする時に使う
※データを更新したい時に使う
```python:sample.py
my_dict = {'apple': 1, 'banana': 2, 'orange': 3}

for key, value in my_dict.items():
    print(f"Key: {key}, Value: {value}")

# Key: apple, Value: 1
# Key: banana, Value: 2
# Key: orange, Value: 3
```

### 辞書全体を表示したい
※全体を見たい場合に使う
※辞書形式になってることを確認したい時
```python:sample.py
my_dict = {'apple': 1, 'banana': 2, 'orange': 3}

print(my_dict)

#  {'apple': 1, 'banana': 2, 'orange': 3}
```
ObservableでdidSetを使うとおかしくなる時の対処法 今回はUserDefaults

 結論から言うと、@ObservationIgnored を使います。
 ただし、これを使うと該当のプロパティが更新されてもViewは更新されなくなるので、Class内でしか使わないプロパティや、もしくはViewでの描画に使わないプロパティでしたらこのやり方でどうにかなるはずです。

正直こう言う仕様なのか、バグなのか私はわかりませんが、とりあえず下記のやり方で解決したので、このやり方で間に合う方はそれでいいでしょう。
 

おかしくなるコード
```Swift
    var second_interval: Int = 1{
        didSet {
           UserDefaults.standard.set(second_interval, forKey: "MyKey")
        }
    }
```


修正後
@ObservationIgnoredをつけてください。
```Swift
    @ObservationIgnored var second_interval: Int = 1{
        didSet {
            UserDefaults.standard.set(second_interval, forKey: "MyKey")
        }
    }
```
LeafletのGISを使おう!

# LeafletのGISを使う
Google Maps APIはGCPに登録していないと使えませんし、それにはクレカが必要です。yahoo! のマップのAPIも地味に発行がめんどくさいです。
手軽に使えるlefletのマップを使ってみるといいかもしれません。
# Leafletとは
web地図用のJSライブラリです。読み込むだけで使えます。ほとんどのプラットフォームに対応しています。
# 使ってみる
JSで読み込む
~~~JavaScript:road.js
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.3.0/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet@1.3.0/dist/leaflet.js"></script>
map = L.map('div id').setView([緯度,経度], ズーム);
          L.tileLayer('https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png', {
          attribution: "<a href='https://maps.gsi.go.jp/development/ichiran.html' target='_blank'>地理院タイル</a>"
}).addTo(map);
~~~
これだけで読み込めちゃいます。強くないですか？

# ピンを指してみる
~~~JavaScript:pin.js
map.on('click', function(e) {
            if(marker){
                map.removeLayer(marker);
            }
            marker = L.marker([緯度,経度]).bindPopup(L.popup({ maxWidth: 550 }).setContent("ピンのメッセージ")).addTo(map);
} );
~~~
これでピンもさせちゃいます。
これでDBとかと連携させたら簡易的なアプリすぐ作れる!!

すごく参考にさせてもらってます。もっと知りたい方は...
[Leafletの使い方](https://ktgis.net/service/leafletlearn/index.html)
趣味レベルでしかやってなかったのでポートフォリオが書けるようになりたい

来年の目標としてまともとなポートフォリオをかけるようになりたい。
そのために色々情報書き出し

【現状の経験】
仕事でプログラムを組むことはあるが本格的でない
Linux上での作業を楽にするためにバッチレベルではあるがプログラムを組んでいる。
Windows上では資料作成の効率化のためVBAマクロを組んだししている。
例：フォーマットの整形、入出力を整理して手作業だと何ステップも必要なことを1ステップで済むようにする、自動化効率化作業

【疑問】
これを実務経験と呼んでよいかわからないが
もし実務経験と呼ぶならこういった仕事のこと専門用語でなんというのだろうか？

【最終目標】
単発の副業で小金を稼ぐ・・前に
仕事を受けるための職務経歴書やポートフォリオを書けるようになる。

【課題】
自分のスキルレベルを測る
paizaやatcoderに登録してレーディングを測る。

過去に趣味でruby＋ruby/TKで作成したアプリを
JavaScriptやHTML（HTA？）で再作成する
そのためにJavaScriptをゼロから勉強

【個人的意見のたれ流し】
副業っていろいろ調べると週24時間からみたいなのあるけど、一日8時間だと考えれば3日分だ、それは副業ではなく兼業だと思うんだ

省略の美学って嫌いです、慣れてないとぱっと見何をしているのかわからないし、調べようにも省略されすぎて調べようがないっていうね
JOIに参加してみた

# JOIに参加してみた（参加記）
2023年度の情報オリンピックに参加してみたのでためになったことと感想とか載せておきます。
## JOI（情報オリンピック）とは
日本情報オリンピックで中学1年生から高校2年生が参加します。競技プログラミングで競います。
JOI公式では以下のように書かれています。
日本情報オリンピック（Japanese Olympiad in Informatics, JOI）は、日本の高校生以下の生徒の中から情報科学的な能力の豊かな生徒を見出し、その才能の育成を助けるとともに、国際情報オリンピック（International Olympiad in Informatics, IOI）に日本代表選手として派遣するために、一般社団法人 情報オリンピック日本委員会が主催している事業です。
[JOI公式](https://www.ioi-jp.org/joi?utm_source=google&utm_medium=cpc&gclid=CjwKCAiAmsurBhBvEiwA6e-WPFWdNkXat24PJ0VzYp4AozqpsWLYMTTsxHaLVjxMooAGdUnN72IPFRoCu7wQAvD_BwE)
## レベル感
一次予選はかなりやさしめで半分以上の人が通過するようです。3回ほど行われました。
二次予選はまだ参加していないのでわかりません。
## 参加するメリット
全国の同じような学生と競い合うことができる。AtcoderのAJL等もありますが、情報オリンピックに参加することでより本格的にほかの学生と競い合うことができ、競プロへのモチベが上がります。
## 競プロの目安
どこまで出場できるかである程度自分の実力がわかるのでいい。まあ、これはAtcoderのレートとかのほうが正確に出やすいかも。

がんばろう!!
Mac PATH解決

# はじめに
新しい言語やツールをインストールするたび、PATH解決で引っかかるので、調べたこと、記事をまとめておく。
PATH難しい、、、
インストールしたパッケージやコマンドが実行できなかったら、PATHがうまく設定できていないことを疑った方がいい。

# 基本
> 結論から言うとPATHを通すことで、どこのフォルダからでも実行したいファイルを呼ぶことができるということだ。

https://taidanahibi.com/unix/unix-path/

# 設定ファイル
デフォルトの設定ファイルは
``` - zshの場合 .zshrc  ```

### /usr/local/bin/zsh と /bin/zsh の違い
chatGPTによると
> /usr/local/bin/zsh: 通常、ここにはシステムの標準の外部プログラムやユーザーが手動でインストールしたプログラムが配置されます。ユーザーが手動でインストールしたZshの実行ファイルがここに存在する可能性があります。通常、このパスはシステムの標準の実行ファイルパスよりも優先されるため、手動でインストールしたプログラムが優先的に使用されます。

> /bin/zsh: 通常、システムの標準の実行ファイルパスにあるプログラムがここに配置されます。システムが提供するZshの実行ファイルがここに存在する可能性があります。

> これらのパスの違いは、ファイルの配置と優先順位に関係しています。一般的には、ユーザーが手動でインストールしたプログラムはシステムの標準のプログラムよりも優先されます。




https://qiita.com/k3ntar0/items/eb8cdbd8eba9da388def


パスを通したいときは、
/usr/local/bin/zshに書き込むようにするとよさそう。


# 設定方法

```
export PATH=(パス):$PATH 
```

以下で反映させる

```
source ~/.bash_profile
```

https://qiita.com/k3ntar0/items/eb8cdbd8eba9da388def



## 失敗したこと
### 失敗したこと1
echoでpathを通そうとしたた失敗して、vimなど使えてたコマンドが使えなくなった。

### 解決策 VScodeで編集する
「command」+「shift」+「.」 で、隠しファイルが表示されるので、Vscodeで開いてエラーが発生した原因と思われるものを削除すればいい。

原因は export path を複数宣言した、後者に宣言された PATH で更新されたため、既存のものが読み込まれなくなった。
PATHを編集するときは、コロン繋げることを注意する。
修正、ターミナルを再起動して、以下コマンドを打って解決。
``` source .zshrc```



https://tcd-theme.com/2022/12/mac-secret-file.html#:~:text=%E3%80%8Ccommand%E3%80%8D%2B%E3%80%8Cshift%E3%80%8D,%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82

https://zenn.dev/mo_ri_regen/articles/zsh-path-setting


### 失敗したこと2

VSCodeでPythonを実行したら、追加モジュールをimportできなかった。
調べてみたら、VSCodeのターミナルが普通のターミナルと別のPATHを見ていた。
ターミナルによってPythonの実行環境が異なることがあるらしい

### 解決策
` Code > Preferences > Setting `
で設定を開く

検索窓で
terminal.integrated.inheritEnvをを検索して、チェックボックスを外す。


![スクリーンショット 2023-12-09 14.33.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735531/fa12a143-432e-4096-33ce-7ed4d63b56b7.png)

すると、PATHがターミナルと統一される。

https://yuki.world/vscode-terminal-python/
Serverless as a Game Changer: How to Get the Most Out of the Cloud

サーバレスアーキテクチャに関して、技術的な側面はあまり詳細に立ち入らず、一応非エンジニアにもメリットが理解可能なように書かれた本です。あまり分量も多くありません。
<a href="https://www.amazon.co.jp/Serverless-Game-Changer-Addison-wesley-Signature/dp/0137392621/"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8475/ea8e0a3b-0bad-8c7a-26b1-653cba9df3cf.png" width="200" alt="Serverless as a Game Changer書影"/><a>

ソフトウェアエンジニアにとっては、今更なことが多いのですが、いくつか興味深い話が載っているので、そこを掘り下げます。

## ベンダロックインの評価フレームワーク

サーバレスへの異論として、ベンダロックインが挙げられており、本書ではその反論が書かれているのですが、その中で、Gregor Hohpeの記事がそのフレームワークとして引用されています。
https://martinfowler.com/articles/oss-lockin.html

Hohpeのロックインの分類を以下のようにマトリクスで整理しています。

![ロックインマトリックス](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8475/81810673-b1d1-2dbf-8ae3-2c88d1b17513.png)

* **使い捨て**: 独自の機能もなく、別のものに切り替えるのもさほど大変でない場合
* **ロックインを許容する**: 自前で構築しようにもコストがかかりすぎり、他に替えの効かないサービスである。BigQueryなど。
* **要注意**: ロックインされているが、別のサービスでも 他に替えが効くのが最も厄介で、慎重に選定、設計しなければならない。RDBMSはこの領域に入りがち。
* **理想的**: 独自の機能を活用できていて、他の代替手段にスイッチするのも比較的簡単なもの。AWS S3なんかが代表的な例。

![ロックインとスイッチの可能性](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8475/a1239929-774f-6bc8-a3a1-c87200ba1738.png)

スイッチングコストを考える上で、その発生確率も評価として加えなくてはなりません。これはほぼリスクマトリクスと同じです。俎上にあがりやすいのがRDBMSです。DBアクセスは抽象化レイヤを設けるのが、良い設計の定石として語られることが多いですが、RDBMSを乗り替えが発生した時の対応コストが、その理由の1つとして挙げられます。[^1]
実際にRDBMSを乗り替える可能性は、システムライフサイクルが数年規模ではまずゼロに等しいので、考慮の必要ありません。(一方で十年以上使うようなシステムでは、コードやSQLがぐちゃぐちゃになる前に切り替え戦略を練っておく必要があるでしょう)

この図、アジリティとギャンブルの対比も興味深く、Hohpeも「変化を受け入れ、それを実行するコストを低く抑えるようにシステムを設計したことになる。が、この象限は、多くの小さな変更がすぐに積み重なるにもかかわらず、左上の"ギャンブル"ほど注目されないことが多い。ありそうもないドラマの方が注目されるのだ！」と述べています。

## Wardleyのコンポーネント化

Wardley Mapsによって知られる[Simon Wardleyのブログ記事](https://blog.gardeviance.org/2013/01/evolution-begets-genesis-begets.html)を引用して、サーバレスアーキテクチャのコスト以外のメリットを正当化しています。

世の中の製品や技術は、コモディティ化して標準化するとそれらがコンポーネント解いて提供されるようになり、それを用いて構築されるシステムの変化、多様性、アジリティも高くなる、というイノベーションの理論でよく聞くような話です。『Serverless as a Game Changer』ではタイトル通り、サーバレスアーキテクチャが従来のサーバ技術の上にあるものとして、これを引用しているわけですが、元のWardleyの記事にはもう少し面白い考察がなされています。

「従来技術がコンポーネント化されると、単位価値は低下するが、その総価値がはその技術のライフサイクル上、最も高い傾向がある」というものです。過去、石炭や電力、近年では電子機器の部品など、それらを使った新しい製品・技術のために提供価格圧縮に圧力がかかるものの、それ以上に需要が高まるのでボリューム効果によってそれが相殺できるというものです。

これはクラウドベンダがサーバレスアーキテクチャを推す経済的な裏付けを説明しているように思いました。

[^1]: よく槍玉にあがるクリーンアーキテクチャは、抽象レベルの違うものは一緒にしてはいけない、詳細の変更がより抽象度の高いものに影響を与えないようにしておこう、というのが本線の目的なので、「RDBMSなんて乗り替えることはねぇよ」というツッコミは(クリーンアーキテクチャ本文にも一応書いてあるものの)ちょっとハズしているように思います。
アルファベットでセキュリティ

# アルファベットでセキュリティ
A ARP Spoofing
B Buffer overflow
C Clickjacking
D DDOS
E Emotet
F Fisshing
G GPKI
H Honeypot
I IP Spoofing
J JSON Injection
K Key Logger
L LDAP
M MITM Attck
N  Network Scan
O OS Command Injection
P Port Scan
Q Gumblar Attack
R Root Kit
S SQL Injection
T Typosquatting
U UDP Aood Attack
V Vishing
W Watering Hole Attack
X XSS
Z Zero-Day Attack

Yが抜けていることは気になさらず...
Windows版LINEのアップデート通知がしつこいし何なら勝手に更新するので止めてみた

Windows版LINEでは、アップデートの確認を適宜自動で行っているが、あまりに頻繁であり、その表示が常に最前面で嫌なので止めてみることにした。
通常通りチャットはできるのでご安心を。

やり方
Windows Defender ファイアーウォールの詳細設定から、
セキュリティが強化された～　の画面に入る。
送信の規則　から新しい規則を選択。

規制の種類　カスタム
プログラム　すべてのプログラム
プロトコルおよびポート　プロトコルの種類　が任意になっていることを確認したら後は触らない
スコープ　リモートIPアドレスのところで、これらのIPアドレスを選択
追加を押して「2404:a600:1:501:2020:9300:6:4124」を入力。OKを押す。
（Yahooが持ち主のアドレス。ここから更新のチェックや最新版のダウンロードを行っている）
操作　接続をブロックする
プロファイル　すべてにチェック
名前　お好きにどうぞ



実はアップデートの確認がしつこいだけでなく、初回起動時に最新版があれば裏で勝手にアップデートする。
さらに、数あるLINEのプログラムの中で更新を担うLineUpdater.exeというのがあるが、唯一隠しファイルに設定されており、自動更新を隠すかのようなやり方をしていて、これを削除するとアップデート確認のタイミングでダウンロードし復活させるのだ。
QRコードを生成したり読んだりしてみた

# はじめに
こんにちは、チョコレートの入っているアドベントカレンダーを12/1に完食したさこもなです！

# Wifi?Bluetooth? いいえ、カメラです
私がとある電子工作をしていた時、データを Raspberry Pi に送りたかったのですが、ラズパイにはカメラを接続していたので、それを活用できないかと考え、QRコードを利用することに決めました。
 
# QRコードについて
日常において、QRコードを見ないことはないのではしょうか。
そんなQRコードと聞いたら、皆さんは何を連想しますか？
一般的には「URL」を取得するイメージが強いと思います。
だがしかし！実はURL以外にもテキスト形式など様々なデータを設定することができるのです。
 
今回その際にQRコードの読み取りにつまづいたので、それをここにメモしていこうと思います。

 ちなみに、QRコードに埋め込める情報量は、バイナリだと約3000バイトほどだそうです(　-`ω-)✧

# Raspberry Pi でQRコードを読み取ってみる
サンプル用のQRコードを生成には「[QRのススメ](https://qr.quel.jp/url.php)」さんという素晴らしいサイトを利用させていただき無事成功したので、次は読み取りの実装をしていきます。
 
まずはじめにラズパイで書いていた言語、PythonのQRコードリーダーで有名なライブラリ、pyzberでやってみます。

```python:pyzber_test.py
import cv2
from PIL import Image
from pyzbar.pyzbar import decode

# QRコードデコード
img = Image.open('yahoo.png')
value = decode(img)

if value:
    for qrcode in value:
        print(qrcode)
```
```bash:結果
Decoded(data=b'https://www.yahoo.co.jp/', type='QRCODE', rect=Rect(left=25, top=25, width=198, height=198), polygon=[Point(x=25, y=25), Point(x=25, y=222), Point(x=223, y=223), Point(x=222, y=25)], quality=1, orientation='UP')
```


yahooのurlを埋め込んだQRコードは無事取れてることがわかりました！

続いて、[qrcode 7.4.2](https://pypi.org/project/qrcode/)というライブラリで作成したデータを埋め込んだQRコードで確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3190835/a8e700b1-819c-7dce-0bb3-1107ae17b4a5.png)

お！それっぽい！画面が出てきました！
結果を見る限りいけてそうなので、次は場所で分けてprintしていきます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3190835/c888247d-e55a-d58f-bbeb-03e0a49fa9a5.png)
するとこのような結果が。
正しく読まれていれば一番下の行は `/x00` ではなく、値を埋め込んでいたつもりなのですが、、、

あれ？QRコード生成に失敗してた、、？

よくわからずにもう一度QRコードをスマホで読み取ってみるものの、無事に入ってます。

 読み取りに失敗してたりする？？？
 
先輩と一緒にもう一度見比べてみるとなんと、本来NUMPYと書かれている場所が文字化けしているのを確認しました！！！！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3190835/54f457d0-a833-5414-7c6b-8cbd96a6b3cc.png)

　その後先輩と一緒に試行錯誤してみるも、うまく解決することができず、違うライブラリを使ってみることにしました。

# リトライ！

先輩が発見してくれたライブラリを使ってQRコードを読み取ってみます。

```python:pyquirc
from PIL import Image, ImageOps
import quirc

img = Image.open("QRCode1.png")
img = ImageOps.grayscale(img)
decoded_codes = quirc.decode(img)

for code, data in decoded_codes:
    # QRコードのタイプを取得
    qrcode_type = data.payload[0:1]
    if qrcode_type == b'A':
        print("登録成功！")
        print(f"QR_Type : {qrcode_type.decode('utf-8')}")

        # user_idを表示
        user_id = data.payload[1:33]
        print(f"user_id : {user_id.decode('utf-8')}")

        # display_nameを表示
        display_name = data.payload[33:53]
        print(f"display_name : {display_name.decode('utf-8')}")

        # 攻撃力を表示
        power = data.payload[53:55]
        power_int = int.from_bytes(power , "little")
        print(f"power : {power_int}")
        
        # numpyのファイスサイズを表示

        print(f"numpy {len(data.payload[55:])} bytes")
```

```bash:結果
登録成功！
QR_Type : A
user_id : monanosuke
display_name : さこもな
power : 2
numpy 640 bytes
```
無事値が取れてる！！！！！

今回使ったライブラリはこのpyquircというものです。quircではないので注意！

https://github.com/maxnoe/pyquirc/tree/main

# まとめ
pyzberがなぜ文字化けしてしまったかの調査は今後してみますが、電子工作は無事終えることができました！
今回QRコードの理解を深めるとともに、扱いについても学ぶことができました。
QRコードに対しての魅力を再発見できたのはよかったです。

皆さんもレッツQRコードライフ！！！！
AP取ります宣言

# AP(応用情報技術者試験)取ります宣言
応用情報技術者試験を2024年度の春季に受験したいと思います。なので調べた内容をまとめます。
## AP(応用情報技術者試験)とは
Applied Information Technology Engineer Examinationの略で応用情報技術者試験です。CBT化がされたFEと違い、年二回PBT方式で実施しています。
IPAによると ITを活用したサービス、製品、システム及びソフトウェアを作る人材に必要な応用的知識・技能をもち、高度IT人材としての方向性を確立した者 と書かれており、FEよりも応用的で構築から安定運用ができるということでしょう。
[IPA公式](https://www.ipa.go.jp/shiken/kubun/ap.html)

## 難易度
応用情報技術者試験はレベル3に位置付けられており、レベル4の高度試験に通じる試験として認識されているようです。合格後は高度試験の午前Ⅰが2年間免除されることから高度人材になるために取ると良い資格だとわかります。
[資格難易度ランキング](https://xn--nckg3oobb4031eg4kngetn8hqeva.jp/)によるとFEはSS50、APはSS65でかなりAPのほうが難しいということがわかります。

## 試験概要
#### 午前
試験時間
* 9:30～12:00(150分)
* 多肢選択式（四肢択一）
* 解答数：80問

#### 午後
試験時間
* 13:00～15:30(150分)
* 出題形式:記述式
* 解答数：5問/11問

## 勉強の仕方
### 参考書
[ニュースペックテキスト 応用情報技術者 2024年度](https://www.amazon.co.jp/%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9%E3%83%9A%E3%83%83%E3%82%AF%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-%E5%BF%9C%E7%94%A8%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-2024%E5%B9%B4%E5%BA%A6-%E3%82%B7%E3%83%A9%E3%83%90%E3%82%B9ver-6-3-TAC%E5%87%BA%E7%89%88/dp/4300109427)
インプットに使います。4周くらいします。
### 応用情報技術者試験ドットコム
[応用情報技術者試験ドットコム](https://www.ap-siken.com/)
アウトプットに使わせていただきます。

がんばります!!
Flutter 個体識別IDの取得方法 iOS/Android

# デバイスIDの取得方法

実務でデバイスの個別識別IDを取得する必要が生じたため、その方法を共有します。まず、`flutter pub add device_info`を実行して、`device_info`パッケージの依存関係をプロジェクトに追加します。

次に、このパッケージをインポートします。

```dart
import 'package:device_info/device_info.dart';
```
# AndroidでのdeviceID取得方法
AndroidデバイスのIDを取得するには、DeviceInfoPluginを使用します。以下はその例です。
```
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
print('Android Device ID: ${androidInfo.androidId}');
```
このコードは、非同期関数内で実行する必要があります。androidIdプロパティは、デバイスのユニークなIDを返します。

# iOSでのdeviceID取得方法
iOSデバイスのIDを取得する場合、プロセスは少し異なります。DeviceInfoPluginを使って、以下のようにiOSデバイスの情報を取得します。
```dart
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
IosDeviceInfo iosInfo = await deviceInfo.iosInfo;
print('iOS Device ID: ${iosInfo.identifierForVendor}');
```
ここでも、identifierForVendorはデバイスのユニークIDを表します。このIDは、アプリがアンインストールされた後に再インストールされると変更されることに注意してください。


:::note warn
警告
これらのコードスニペットは基本的なガイドとして機能しますが、デバイスIDを取り扱う際にはユーザーのプライバシーに注意することが重要です。
特にiOSでは、Appleのプライバシーポリシーにより、特定の使用方法が制限されている場合があります。
またアプリを削除すると個体識別IDが変更されるため考慮しなければなりません。
:::