OmniAICreator/Qiita-1.07M huggingface dataset:
軽深演習 # 21 アイデア

### 軽深（かるしん　なんちゃって圏論） Advent Calendar 2023 21日目の記事です。

演習形式をとっているので、ぜひ　回答を試みてください。

### 前提知識　アイデアはきっかけがあって思いつく

アイデアは出すのなかなか難しいとよくいわれていました。今まではそういったことがあったかもしれませんが。今は生成AI全盛です。与えられた課題に対してとりあえずアイディア出しをすることは非常に簡単になっています。ただ残念なことに、状況を的確に把握した質の高いアイデアを生成AIが出してくれることは稀です。生成AI以上のさらに質のよいアイデアを出すのはどうしたらいいのでしょうか？
アイデア課題を図式で書くと、こんな感じですね。
```mermaid
flowchart LR
A[アイデア課題]-->B[生成AI]-->C[とりあえず回答]
A[アイデア課題]-->D[生成AI以上の回答]-->E[?????]
```

それで世の中を変えたアイデアが実際にどこからきたのかみてみましょう。宅急便の事例です。
[昌男はある日、息子のお古の洋服を、離れたところで暮らす甥に送ろうとして、あることに気がついた。便利に送る手段がないのだ](https://www.yamato-hd.co.jp/100th-anniversary/commemorative/16-21.html)

要するに日常生活での気づきからです。きっかけは、意識していない日常の気づきからのことが多いです。勿論、課題は、頭の中にずっと居座った状態であることは必要です。

```mermaid
flowchart LR
A[運輸業のアイディア課題]-->B[日常生活での気づき]-->C[宅急便]
```

アイデア出しのために、日常生活を送っているわけではないですが、少し意識してアイデア出しに役立つ日常生活を送るのもいいでしょう。

### 演習 普段日常的にみているテレビ番組からアイデアを得るのはどうでしょうか？　カンブリア宮殿とか、ガイアの夜明けは役立ちます。他にはどんな番組をみるのが役立ちそうだと思われますか？

番組の内容は、あなたが抱えている課題とは、かなり異なるものでしょう。でも、ポアンカレの言葉を思い出してください。違うものを同じものとみなすことができれば、番組が役立つ可能性は、ぐっと高くなります。**きっかけ**、**もっと前**、**もっと先**、**最高到達点**といった図式にすると同じとみなせる可能性は広がります。このぐらい簡単な図式だと脳内シミュレーションは、簡単に即座に実行可能です。軽深（かるしん　なんちゃって圏論）というレベルでも役に立ちそうな気はしませんか？
【TIPS】幾つかのElixir関数はErlangにインライン展開される

この記事は、[Elixir Advent Calendar 2023 シリーズ14](https://qiita.com/advent-calendar/2023/elixir) の19日目です

---

【本コラムは、2分で読め、2分で試せます】

[piacere](https://twitter.com/piacere_ex) です、ご覧いただいてありがとございます :bow:

Elixirの幾つかの関数って、Erlangモジュール関数にインライン展開されるってご存じですか？

# `Kernel` モジュールの関数（演算子含む）

`Kernel` モジュール関数の幾つかは、Erlang関数にインライン展開されるのですが、これは `&` とアリティを付けることで確認できます

```elixir
iex> &Kernel.hd/1     
&:erlang.hd/1
iex> &Kernel.tl/1
&:erlang.tl/1
iex> &Kernel.length/1
&:erlang.length/1
```

演算子も、Erlang関数にインライン展開されます

```elixir
iex> &+/1            
&:erlang.+/1
iex> &*/2
&:erlang.*/2
```

別コラムで紹介したサイズ取得や型チェックも、Erlang関数にインライン展開されます

```elixir
iex> &byte_size/1
&:erlang.byte_size/1
iex> &bit_size/1 
&:erlang.bit_size/1
iex> &map_size/1
&:erlang.byte_size/1
iex> &tuple_size/1
&:erlang.bit_size/1
iex> &is_binary/1
&:erlang.is_binary/1
iex> &is_list/1
&:erlang.is_list/1
iex> &is_tuple/1
&:erlang.is_tuple/1
iex> &is_number/1
&:erlang.is_number/1
```

# `Kernel` モジュール以外にもあります

`Atom` モジュールや `String` モジュール、`List` モジュール、`Map` モジュール、`Tuple` モジュールなどの型変換も、Erlang関数へのインライン展開で処理されているようです

```elixir
iex> &Atom.to_string/1
&:erlang.atom_to_binary/1
iex> &String.to_integer/1
&:erlang.binary_to_integer/1
iex> &String.to_float/1
&:erlang.binary_to_float/1
iex> &List.to_float/1
&:erlang.list_to_float/1
iex> &Map.to_list/1
&:maps.to_list/1
iex> &Tuple.to_list/1
&:erlang.tuple_to_list/1
```

一方、`Enum` モジュールや `Range` モジュール、`Date` モジュール、`DateTime` モジュールは違うようです

```elixir
iex> &Enum.to_float/1
&Enum.to_float/1
iex> &Range.to_list/1
&Range.to_list/1
iex> &Date.to_string/1
&Date.to_string/1
iex> &DateTime.to_string/1
&DateTime.to_string/1
```

# 実は…

下記にドキュメント化されています

https://hexdocs.pm/elixir/Kernel.html#module-inlining
Rocky Linux9 (RHEL9）でqcow2形式のディスクイメージをマウントして中のファイルを操作したい

# どういう状況？
CentOS7のkvm上で動かしていたVM（qcow2イメージ）をRocky9にマイグレーションしたら、NIC周りが変わってIPが割り当てられない。Ubuntu18.04なのでserialも繋がらないので、/etc/netplan以下のファイルを　書き換える必要が出た。

# やり方（qcow2の中味がraw installedな場合）
```
(以下全部rootでのコマンド）
# nbdのカーネルモジュールをロード（たぶん明示的に淹れなくても入ってる）
% modprobe nbd max_part=8

# qemu-nbdで接続
% qemu-nbd --connect=/dev/nbd0 [マウントしたいqcow2のパス]

# ブロックデバイスのパーティションを確認、LVMじゃないならLinuxとか出るはず
% fdisk /dev/nbd0 -l
(省略）

#普通にマウントすればよい
% mount /dev/nbd0p2  /mnt/hoge

# ここから後処理、必ずやること。でないとqcow2がロックされたままになる
% umount /mnt/hoge
% qemu-nbd -d /dev/nbd0
/dev/nbd0 disconnected
```

# やり方(qcow2の中味がLVM Partitionな場合）
```
(以下全部rootでのコマンド）
# nbdのカーネルモジュールをロード（たぶん明示的に淹れなくても入ってる）
% modprobe nbd max_part=8

# qemu-nbdで接続
% qemu-nbd --connect=/dev/nbd0 [マウントしたいqcow2のパス]

# ブロックデバイスのパーティションを確認、LVMならLinux LVMっていうPartition Typeになってる
% fdisk /dev/nbd0 -l
Disk /dev/nbd0: 200 GiB, 214748364800 bytes, 419430400 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x390c36ae

Device      Boot Start       End   Sectors  Size Id Type
/dev/nbd0p1 *     2048 419428351 419426304  200G 8e Linux LVM

# 重要。RHEL7や8だと勝手にlvm　にdetectされたけど、9は明示的にこうしないとダメぽい。
% lvmdevices --adddev /dev/nbd0p1

# LVMの管理下になったので、vgscanで状況の確認
% vgscan
  Devices file /dev/nbd0 is excluded: device is partitioned.
  Found volume group "rl" using metadata type lvm2
  Found volume group "ubuntu1804golden-vg" using metadata type lvm2
  
# vgchangeで論理ボリュームをアクティブにする
% vgchange -ay ubuntu1804golden-vg
  Devices file /dev/nbd0 is excluded: device is partitioned.
  2 logical volume(s) in volume group "ubuntu1804golden-vg" now active
  
# /dev/mapper以下にLVMの中味のパーティションが出てくる。この例だとubuntu1804golden-root
% ls /dev/mapper
control  rl-home  rl-root  rl-swap  ubuntu1804golden--vg-root  ubuntu1804golden--vg-swap_1

# hogeにマウント。hogeはお好きなディレクトリに。ubuntu1804golden--vg-rootもインストールしたときの命名で変わるから注意ね
% mount /dev/mapper/ubuntu1804golden--vg-root /mnt/hoge

# ここから後処理、必ずやること。でないとqcow2がロックされたままになる
% umount /mnt/hoge
% vgchange -an ubuntu1804golden-vg
  0 logical volume(s) in volume group "ubuntu1804golden-vg" now active
% qemu-nbd -d /dev/nbd0
/dev/nbd0 disconnected
```
M5StickV開発環境（Arduino IDE）

# はじめに

Kendryte K210 MPUの開発環境はいくつかありますが、[Kendryte K210 standalone SDK](https://github.com/kendryte/kendryte-standalone-sdk) など長らくメンテナンスされておらず、MaixPyを除きオワコンかなとも思っていましたが、[Arduino core for K210](https://github.com/kendryte/arduino-k210) というものを見つけたので、M5StickVで活用させていただくことにしました。

# インストール方法

- Arduino IDE 2.x をインストールします
- 以下の方法で、Arduino IDE に [Arduino core for K210](https://github.com/kendryte/arduino-k210) を追加します
    - Preference の Additional boards manager URLs に https://github.com/fukuen/arduino-k210/releases/download/0.1.1/package_k210_index.json を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555397/fe102561-936c-ea3c-b344-014bcea393a2.png)

- BOARDS MANAGER で K210 を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555397/f13710bd-eb70-c318-6160-1c3fac770365.png)

# サンプル実行

サンプルのスケッチは [こちら](https://github.com/fukuen/arduino-examples) です

# まとめ

しばらく M5StickV で遊べそうです。M5SticV の他、MaixCube、MaixDuino、MaixGo でも動作確認してます。
Linuxの基礎コマンドについてまとめる

## ディレクトリにまつわる用語
| 用語 | 説明 |
|:-:|:-:|
| ディレクトリ  |  Linuxにおけるフォルダのこと |
| カレントディレクトリ  |  今自分がいるディレクトリのこと |
| ルートディレクトリ  | 一番上の階層のディレクトリのこと  |
| ホームディレクトリ  | ログインしたユーザが最初に開くディレクトリのこと  |

## cd
ディレクトリ間を移動するために使用するコマンド

## pwd
カレントディレクトリのルートディレクトリからのパス(絶対パス)を確認するコマンド

## ls
カレントディレクトリ内のファイルやディレクトリを確認するコマンド

## mkdir
ディレクトリを作成するためのコマンド

## rmdir
ディレクトリを削除するためのコマンド

## cat
ファイルの中身を見るためのコマンド

## less
ファイルの中身を1行ずつ見るためのコマンド

## tail
ファイルの最終行から見るためのコマンド

## touch
ファイルを作成するためのコマンド

## rm
ファイルを削除するためのコマンド

## mv
ファイルやディレクトリを別のディレクトリに移動するためのコマンド

## cp
ファイルやディレクトリを別のディレクトリにコピーするためのコマンド

## ln
ファイルやディレクトリへのリンクを作成するためのコマンド
ショートカットみたいなやつ

## find
ファイルやディレクトリの検索を行うためのコマンド

## chmod
ファイルやディレクトリのアクセス権限を変更するためのコマンド

## chown
ファイルやディレクトリの所有者を変更するためのコマンド

## ps
実行しているプロセスやその状態を表示するためのコマンド
プロセスとは、メモリ上にある実行中のひとつひとつのプログラムのこと

## kill
プロセスを終了させるためのコマンド
GitHub Actions上で定期実行させ続けるためのTips


## GitHub ActionsはPublicであればずっと動いてくれる

そのうち制限かかりそうな気もしますが、現時点では無料です。

> https://github.co.jp/features/actions
> ![スクリーンショット 2023-12-24 20.49.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/66e27454-42e7-9430-1185-6c0a5d68b5e0.png "スクリーンショット 2023-12-24 20.49.34.png")


## とはいえ止まってしまう時

### 容量で止まった時があった

Artifactとlogの保存期限を短くしておけば今の所僕が使う範疇だと問題なく動いてくれます。

https://blog.beachside.dev/entry/2022/08/19/224500

> ![スクリーンショット 2023-12-24 20.51.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/5264c2f2-3ab2-55a6-8f20-ff1253f8ab2d.png "スクリーンショット 2023-12-24 20.51.18.png")

#### キャッシュ問題

キャッシュで容量がいっぱいになるのは無いかもですが、こちらを利用して削除できました。

https://zenn.dev/hkusu/articles/88c45be74ae8a6

### 更新がずっと無い場合 60日

更新がずっと無い場合も止まってしまいます。確か60日です。

https://qiita.com/n0bisuke/items/86d3443cb7cfe05f62d6


`Process completed with exit code 128.`というエラーが出て止まっていました。
いつからか設定が必要になっていた模様です。前は権限付けいらなかったような...?

> ![スクリーンショット 2023-12-24 20.44.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/7669bf75-665c-2799-c7ca-a2a77592fd72.png "スクリーンショット 2023-12-24 20.44.34.png")
> 参考: https://ayousanz.hatenadiary.jp/entry/GitHub_Actions%E3%81%8B%E3%82%89push%E3%81%99%E3%82%8B%E9%9A%9B%E3%81%AB%E6%A8%A9%E9%99%90%E3%81%A7%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E5%87%BA%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AB%E7%A2%BA%E8%AA%8D%E3%81%99

## 現状の.github/workflows/node.js.yml


```yml
name: 定期実行+GitPushごとに実行

on:
  push:
    branches: [ "main" ]
  schedule:
    - cron:  '0 12,23 * * *'

jobs:
  build:

    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [21.x]
        # See supported Node.js release schedule at https://nodejs.org/en/about/releases/

    steps:
    - uses: actions/checkout@v3
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v3
      with:
        node-version: ${{ matrix.node-version }}
        cache: 'npm'

    # キャッシュ
    - name: Cache dependencies
      uses: actions/cache@v3
      with:
        path: ~/.npm
        key: npm-${{ hashFiles('package-lock.json') }} 
        restore-keys: npm-

    # インストール
    - name: npm install command
      run: npm install
    
    # 実際のコマンド
    - name: main action...
      run: > 
        NOTION_TOKEN=${{secrets.NOTION_TOKEN}}
        npm run main

    - name: Log action...
      run: > 
        npm run log

    - name: git commit & push
      run: |
        git config core.filemode false
        if ! git diff --exit-code --quiet
        then
          git add --update
          git config user.name github-actions
          git config user.email action@github.com
          git commit -m "Commit by github-actions"
          git push https://${{github.actor}}:${{secrets.GITHUB_TOKEN}}@github.com/${{github.repository}}.git HEAD:${{github.ref}}
        fi
```


## VS CodeがCron読み上げてくれるの地味に嬉しい

いつからか読み上げてくれるように

> ![スクリーンショット 2023-12-24 20.54.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/9491610d-e898-4727-679d-cc55175fe8fa.png "スクリーンショット 2023-12-24 20.54.44.png")
MFC Paint alike application

## MFC building "*Paint*" alike application
I realize that MFC makes it possible to build up the software, which exactly resemble *Paint* on Windows, so let me explain how to expand own your *Paint* alike application in this article.

These following enviroments are on what i verified a successful debugging and execution.

* Visual Studio 2022 Community
* MFC Dialog
* C++

## 01; Add Windows-Message functions

To handle movement of mouse, these 4 functions are prerequisites:
you can add from above menus;

* OnPaint()
* OnMouseMove()
* OnLButtonDown()
* OnLButtonUp()
<img width="600" height="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3660829/65e2ee89-094d-56c8-eaa5-ec02026b7658.png">

## 02; The flowchart

To make it clear how processes go on, here's flowchart.
<img height="400" width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3660829/ef1cd169-7e3c-b72f-0ba3-27d5cbafa3ea.png"> 

## 03; Programs

Since the entire programs are too long, i only extracate important parts.
![04. OnPaint1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3660829/9769018e-b86f-6219-9b40-b124c0be6abd.png)
![05. OnLButtonDown.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3660829/35109d25-0708-1a32-696d-b15f09c3d638.png)
![06. OnMouseMove.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3660829/f594b28d-d178-f268-87ac-a4bb60b17b0f.png)
![07. OnPaint2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3660829/5e8e0bf9-6542-6f48-7d3e-a781e8461795.png)
![08. OnLButtonUp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3660829/60a373a4-8144-c701-5bd5-097726726da3.png)

## 04; Let do yourself
GitHub ActionsでPullRequestの変更差分を取得する方法

# GitHub Actionsで差分に対してのみ処理を行う
GitHub ActionsはGitHubのサーバー上でPull Requestに応じたアクションを行えるなど大変便利な機能です。
これにより、例えばマージ前にコードチェックや自動テストを行い、成功した場合だけマージを許可といった事が可能になります。

しかしながら、プロジェクトが大きくなってくると、プロジェクト全体に対して毎回コードチェックや自動テストを行うのは時間やコストがかかりすぎてしまいます。

PullRequestで変更されたファイルのみコードチェックや自動テストを行うようにすることでアクションの時間を短縮しコストを節約することができます。

ここではPullRequest内で変更されたファイル一覧を取得して、ファイルに対してアクションを行う方法を紹介します。

# マージ前とマージ後
Pull Requestでの差分を取得する前に、ブランチをマージ前の状態で差分を取得するか、マージ後の状態で差分を取得するかを考える必要があります。

例えば新たに変更された内容についてテストを行い、テストに失敗した場合はマージ出来ないようにする場合はマージ前の差分を取得する必要があります。

一方で、マージ後の最新状態を使用しデプロイを行う場合など、他のブランチで行われた変更内容作業内容を含めて最新の状態で作業する場合はマージ後に差分を取得する必要があります。

# マージ前に差分を取得する方法
マージ前に差分を取得するには、マージ先ブランチと現ブランチの差分を取得します。

actions/checkoutでマージ先ブランチと現ブランチの最新を取得します。
git diff に `--name-only` をつけてブランチで変更されたファイルのリストを取得します。
ファイルのリストを`tr '\n' ' '` でスペース区切りにすることでforでファイルをループしやすくしています。

```yaml
name: check_before_merge

on:
  pull_request:
    types: [opened, synchronize]

jobs:
  check_before_merge:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        name: checkout "${{ github.base_ref }}"
        with:
          fetch-depth: 1
          ref: ${{ github.base_ref }}
      - uses: actions/checkout@v4
        name: checkout "${{ github.head_ref }}"
        with:
          fetch-depth: 1
          ref: ${{ github.head_ref}}
      - name: check_diff
        shell: bash
        run: |
          files=(`git diff origin/${{ github.base_ref }} --name-only|tr '\n' ' ' `)
          for file in ${files[@]}; do
            echo ${file}
          done

```

# マージ後に差分を取得する方法

マージ後に差分を取得する場合、上記の方法ではすでにmainブランチにfeatureブランチの変更が取り込まれているため差分がなくなってしまいます。

そこで、マージコミット前後での変化を比較します。
この方法はマージコミットを利用するため `Create a merge commit`あるいは`Squasy and merge`でマージした場合に利用可能です。

```yaml
name: check_after_merge

on:
  push:
    branches:
      - 'main'

jobs:
  check_after_merge:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        name: checkout
        with:
          fetch-depth: 2
      - name: check_diff
        shell: bash
        run: |
          files=(`git diff HEAD^ --name-only|tr '\n' ' ' `)
          for file in ${files[@]}; do
            echo ${file}
          done

```
この方法の注意点はすでにマージされているため、仮に処理の途中でエラーとなってもマージされた状態となってしまいます。

エラーの場合はRevertを行うようにしたりSlackで通知を行うようにすると親切かと思います。

# まとめ
今回はPull Request時に差分を取得する方法を紹介しました。
差分ファイルに応じた処理を行うことでアクションに必要な時間を省略したりコストを抑えることもできます。
Scrumはじめて30スプリント経ったチームがあらためてScrumガイド(2020)を読んでみたら8時間かかった話。

この記事はZOZOアドベントカレンダーSeries２の最終日２５日目の記事です。

# Scrumガイドを理解するのは難しい？

Scrumガイドを読まずしてScrumをするべきではないと誰が言ったかはわかりませんが、Scrumガイドには 

*「スクラムの⼀部だけを導⼊することも可能だが、それはスクラムとは⾔えない。すべてを備えたものがスクラムであり、その他の技法・⽅法論・プラク ティスの⼊れ物として機能するものである。」* 

とあります。さらに 

*「スクラムガイドにはスクラムの定義が含まれている。」*

とあるので、経験によって変えていくことは良しとしてもガイドから外れる場合は要注意ということになります。

Scrumガイドは上記のことを最低限理解できるようにするため、分厚いガイドではなく、わずか18ページという薄さで説明されています。よって誰でも理解しやすい内容となっています。

なっています。なっています？本当でしょうか？

自分たちのチームでもScrum導入前にガイドを読んでみましたが、なかなか内容を理解するのが難しい。ガイドの通りやっていくことも難しい。。。という状況からスタートしました。

今考えてもガイドを読んでうまくScrumが回るとはとても思えない。。。

# そして３０スプリントへ

さて、そうした中で、30スプリントが過ぎました。
このあたりでもう一度全員でScrumガイドを読んでみる会を実施しました。

実施したところ、驚くべきことに盛り上がりすぎてわずか18ページのガイドを読むのに8時間を要する事態に。

あらためて読んでみると気づきが本当に沢山挙がり、議論が盛り上がるに盛り上がるという。

この場では少しだけ議論に上がったものを紹介していきましょう。

# 30スプリントまわしたからわかるScrumガイド

経験主義の柱：

- スクラムチームに対しての透明性は確保できつつあるが、ステークホルダに対してはどうだろう？
- リリースまでの検査はできているが、その後の検査・評価はどうだろう？

スクラムの価値基準：

- スプリントゴール達成が微妙、ギリギリというときに言える勇気はあるか？
- スプリント以外の業務がおおくて集中できていないこともあるのでは？

プロダクトオーナー：

- プロダクトゴールがきちんと存在していて、ゴールに向かっているだろうか？
- プロダクトオーナー委員会になりがちな問題をどうするか？

スプリント：

- スプリントゴールの達成を危険にさらすような変更やってない？ついつい他のことに手を付けたり。

プランニング：

- もっとプロダクトバックログアイテムを分解したほうがいいかも
- なぜこのスプリントに価値があるのかもプランニングで議論されてもいい

などなどどう考えてもスタート時には出てこないような気づきが多くあるので、慣れた頃にScrumガイドを読むのをおすすめします。

最後にどのように会を進行したかのアドバイスを。。。

# Scrumガイドを読む会のおすすめ進行方法

ただガイドを読んで意見・感想を求めるだけではなかなかこういった有用な意見は出てきません。

こんな工夫を凝らしました。ご参考まで。

- 1つのトピックを読んだら、感想戦をする。「今できていること、やっていることと」、「取り入れたいこと」、「やっぱりいらないんじゃないか」を分けて付箋を出す。
- 感想戦の前に「やっている度」を10段階で各自数字を挙げてみる。８であれば８の分の「今できていること、やっていること」２の「取り入れたいこと」、「やっぱりいらないんじゃないか」を挙げていく。
- 各項目で「取り入れたいこと」に対してチームに実際に取り入れるたいものをドット投票する。

ちなみに全て読んでいて「やっぱりいらないんじゃないか」の欄にはひとつも付箋が貼られませんでした。

２０２３年ももう終わりですね。一年の最後にみんなでScrumガイドを読んで見るというのもまた一興。ぜひお試しください。

Merry Christmas&良いお年を！
エンジニアが転職前に考えておくべき３つのメリットと３つの手続き

## 対象者
- 転職を考えている方
- 転職の可能性がある方
- フリーランスになりたい方

## 話さないこと
- 転職を推奨する
- 転職を引き止める
- 転職の是非

転職の考え方は人それぞれ。

## 今の会社から転職するということ
まず、転職する場合は

- 次の案件が決まってから
  - 大幅な報酬アップ
  - 超短期的なスキルアップ方針切り替え
  - 長期休暇が欲しい
- 無職含む非エンジニア路線
  - クレジットカード契約
  - 社保の場合、延長/脱退手続き（脱退の場合は国保になる）
  - 失業保険（手当）関連の知識

を考えておこう。
残念ながら筆者に知見がないため、非エンジニア路線については詳しく書けないため本稿では扱わないが、項目自体は一部フリーランスエンジニアも含むため、会社員→フリーランスという意味で書ける部分は書いていく。

まずはメリット部分について言及していくが、リスクがある事も認識したい。

### 大幅な報酬アップ
:::note
エンジニア業界あるあるだが、転職した方が給与が上がる事がある。
:::
（※ソースは他業種の転職者からの又聞き情報）他業種だと勤続年数の評価の割合が大きいため、転職自体がリスクである風潮が強いようだ。
が、エンジニア職の場合はシンプルに技術や経験、業種により知名度（SNSフォロワーや有力企業や団体との人脈）でのスカウトがあるので、個人活動だからといって決して侮る事はできない。

:::note alert
転職は失敗する可能性もある。
:::
たとえば急な内定取り消し、または内定辞退を余儀なくされるケース。
また、転職したからといって必ずしも報酬があがるわけでもなく、下がる可能性もある事は認識しておきたい。

### 超短期的なスキルアップ方針切り替え
:::note
自分でその時にやりたい案件に挑戦しやすい
:::

最近、スキルアップ方針について上長と相談する事ができる機会が多くなってきたようだ。
特にSES企業に多い傾向に感じる。
が、企業に依存すると案件ごとになってしまうため、自身で案件を勝ち取ってのスキルアップができるとより早い成長機会を構築する事ができる。

:::note alert
やりたい案件とあなたのスキルセット次第では案件獲得が難しい可能性がある
:::
安定感は企業の営業担当が持ってきた案件の方が良い可能性もあるため、案件を自分で獲得するか社内の営業担当に依頼するかの違いになるだろう。
単純にスキルアップ方針の切り替えが目的である場合、転職するより先に相談してみて、ダメそうなら選択肢に上げてみよう。

### 長期休暇が欲しい
:::note
ほぼ確定で休みを取得できる
:::
次期案件の期間を、たとえば来年4月にしておくなどというケースを想定すると、執筆時点で退職する想定にすると3月まで自由時間が作れる、と考える事ができる。
特に炎上案件を渡り歩く方などは休暇を満足に得られない（土日祝が消えるのは当然として、GWもSWもお盆や年末年始すらない事もある）傾向があり、まとまった休みが欲しくなるのも当然だろう。
特に昨今はライフワークバランスを重視するため、長連勤には長休暇が取得できるべきであるが、実態として案件ごとの稼働になるとなかなかうまく解決できないのが実情であろうか。

:::note alert
休暇中の収支バランスはしっかり管理しよう。また、給与や報酬は企業ごとに支払サイトが異なる事も留意しよう
:::

これは厳密に言うと転職というよりは退職のメリットになるのだが、この問題を一気に解決できるメソッドであることは確かである。
特にやらかしがちなのは支払サイトが違うことで、例えば翌月末翌々月末払いという極端に支払日が遅い会社もあれば、末締め翌数営業日払いという迅速な会社もある。
また、会社によっては報酬の支払いを渋ったり減額されるリスクも考慮すべきである。

### その他、注意・留意事項
多くのケースに共通する事項として３ケースを取り上げた。
クレジットカードと保険、失業手当であるが、ケースバイケースでその他重要事項などがあるかもしれない。
若手だとこのタイミングでLINEブロックや着信拒否をする事もあるらしいが、大体の場合連絡は掛かってこないはずだ。
よほど重要事項でもない限り連絡しないのだが、もし連絡があったとしても退職日を過ぎた場合は業務命令については対応する必要はないため安心してほしい。
ただし、社保の保険証などはきちんと返却する事を忘れないようにしよう。
Google Career Certificatesを受けてみる

## Google Career Certificates とは
Xで見て面白そうだけど怪しいと思って調べてみた。GoogleといえばGCPの資格のイメージだが...
キャリアアップにつながる Google の認定資格プログラム らしい
[Googleより](https://grow.google/intl/ALL_jp/certificates/)
うん、大丈夫そうである。

## どんな資格なんだ
* サイバーセキュリティプロフェッショナル
* データアナリティクスプロフェッショナル

二種類あるらしい。
セキュリティは週7時間で6か月
データアナリティクスは週10時間で6か月
で修了できる。おおよそ。
多少触れたことがあるかないかくらいでもOK的なことが書かれているので、初心者でもOKということだろう。ある程度触れていればもっと早く修了することも可能かもしれない。
リスキリング・コンソーシアムで無料でアカウントが提供されることがあるということは一般社会人のあまりセキュリティやデータアナリティクスに触れたことのない人が取り、小さめのコミュニティでそのスキルを発揮することがイメージなんだろう。

# 受けてみる
日本リスキリング・コンソーシアムで無料アカウントが提供されていたので申し込んでみた。結構あるよう。
【TIPS】Erlang文字列とリストが同じってご存じ？

この記事は、[Elixir Advent Calendar 2023 シリーズ14](https://qiita.com/advent-calendar/2023/elixir) の20日目です

---

【本コラムは、5分で読め、5分で試せます】

[piacere](https://twitter.com/piacere_ex) です、ご覧いただいてありがとございます :bow:

下記Erlangモジュール関数を使うと出てくる `~c` 文字列って、Elixirのダブルクォート文字列とだいぶ仕様が異なります

https://www.erlang.org/doc/man/string

今回、それを見分けたり、使い分けるTIPSをまとめておきました

# 定義

Erlang文字列は、`'～'` ないしは `~c"～"` で定義できます

```elixir
iex> 'abc'
~c"abc"
iex> ~c"abc"
~c"abc"
```

実は、`~c'～'` でも定義できてしまいますw

```elixir
iex> ~c'abc'
~c"abc"
```

# Elixirのダブルクォート文字列とは別の型

一致しません

```elixir
iex> 'abc' == "ABC"
false
```

一致させるには、型変換が必要です

```elixir
iex> 'abc' == String.to_charlist("abc")
true
iex> List.to_string('abc') == "abc"
true
```

# 型チェック

上記 `String.to_charlist` の関数名通り、Erlang文字列の実体はリストです

```elixir
iex> "abc" |> is_binary
true
iex> "abc" |> is_list
false
iex> 'abc' |> is_binary
false
iex> 'abc' |> is_list
true
```

Erlang文字列がリストなのは、実は関数型ならではの理由があり、Haskellなどの他関数型言語も文字列はリストで定義されており、Erlangもその流儀に則っているだけです

これにより、リスト処理と文字列処理を共通化させるジェネリックなプログラミングが可能となります

しかし、リストは効率性に課題を抱えることが多いため、Elixirでは、敢えてリストを止めて、ビットストリングベースの文字列としています

# Erlang文字列はリスト処理できる

ということは、Erlang文字列はリスト処理できるということですね

```elixir
iex> 'abc' |> hd
97
iex>  <<'abc' |> hd>>
"a"
iex> 'abc' |> Enum.split(2)  
{~c"ab", ~c"c"}
iex> Enum.zip('abc', 'xyz')
[{97, 120}, {98, 121}, {99, 122}]
iex> Enum.zip('abc', 'xyz') |> Enum.map(fn {a, b} -> {<<a>>, <<b>>} end)
[{"a", "x"}, {"b", "y"}, {"c", "z"}]
```

# 最近のErlang関数事情

以前は、Erlang関数はErlang文字列（つまりリスト）のみ対応していました

```elixir
iex> 'abc' |> :string.split('b')
[~c"a", ~c"c"]
```

それが最近は、Elixir文字列（つまりビットストリング）も使えるようになっているし、アレコレ混ぜても動きます

```elixir
iex> "abc" |> :string.split("b")
["a", "c"]
iex> "abc" |> :string.split('b')
["a", "c"]
iex> 'abc' |> :string.split("b")
[~c"a", ~c"c"]
```

とは言え、Elixirの `String` モジュールが充分便利なので、Erlangモジュールを使う機会はあまり無いと思います
「$data->recipient->name」と「$data['recipient']->name」の違い

## はじめに
Bladeファイル内で連想配列にアクセスしようとしたところ、上手くいかなかったので色々調べていました。

どうやら配列に対するアクセス方法は、オブジェクトに対するそれと異なることを理解していなかったようです。

## 環境
Laravel 9.52.16

## 問題
DM機能実装に際しメッセージルーム一覧を表示するために、やり取りをしている相手（recipient）の名前を取得しようとしていました。


```php: index.blade.php（一部のみ抜き出し, 失敗例）
<th>相手</th>

@foreach ($messageRoomsData as $data)
    <td>{{ $data->recipient->name }}</td>
@endforeach
```

すると、以下のようなエラーが出ました。

```vb
Error: Trying to get property 'name' of non-object
```

参考までに、$messageRoomsDataはコントローラ内で次のように定義されています。


```php: MessageRoomsController.php
public function index()
{
    $user = Auth::user();
    $message_rooms = $user->message_rooms;

    $messageRoomsData = $message_rooms->map(function ($message_room) use ($user)
    {
        $recipient = $message_room->users()->firstWhere('id', '!=', $user->id);
        $lastMessage = $message_room->messages()->sortbyDesc('created_at')->first();

        return [
            'recipient' => $recipient,
            'lastMessage' => $lastMessage,
        ];
    });

    return view('message_rooms.index', [
        'user' => $user,
        'message_rooms' => $message_rooms,
        'messageRoomsData' => $messageRoomsData,
    ]);
        
}

```

## 解決策
まず、エラーには「非オブジェクトのnameプロパティを取得しようとしています」とあります。

コントローラ内で元の変数ははreturn[]の形をとっているので、$messageRoomsDataはオブジェクトではなく連想配列だということが分かります。

```php: MessageRoomsController.php（一部）
$messageRoomsData = $message_rooms()->map(function ($message_room) use ($users)
{
    $recipient = $message_room->users()->firstWhere('id', '!=', $user->id);
    
    return [
        'recipient' => $recipient,
        'lastMessage' => $lastMessage,
    ];
}
```

そんな連想配列内のキーに対しては、以下のように「配列アクセス構文」と「オブジェクトアクセス構文」を組み合わせてアクセスする必要があります。

```php: index.blade.php（一部のみ抜き出し, 解決例）
<th>相手</th>

@foreach ($messageRoomsData as $data)
    <td>{{ $data['recipient']->name }}</td>
@endforeach
```

ややこしいと思うので、両方の構文について補足します。

### 配列アクセス構文
$dataが配列、そしてそのキーであるrecipientの値自体も配列の場合、次のようにアクセスします。

```php
$data = [
    'recipient' => [
        'name' => 'Eula',
        'age' => '23'
    ]

// アクセス方法
echo $data['recipient']['name'] // 出力結果：Eula
```

### オブジェクトアクセス構文
$dataがオブジェクト、そしてそのプロパティであるrecipient自体もオブジェクトの場合、次のようにアクセスします。

```php
$data = new Data();
$data->recipient = new Recipient();
$data->recipient->name = 'Eula'

// アクセス方法
echo $data->recipient->name; // 出力結果：Eula
```

### 先ほどの解決策について
今回は$dataが配列だったので、まず配列へのアクセス方法を取ります。

そして配列内のキーであるrecipientの値は$recipient（Userモデルインスタンス）です。

今回は$recipientのnameプロパティを取得したいので、オブジェクトへのアクセス方法を取ります。

そのため、両方の方法を使ってnameプロパティにアクセスするのが正解だということですね。

```php: index.blade.php（一部のみ抜き出し, 解決例）
<th>相手</th>

@foreach ($messageRoomsData as $data)
    <td>{{ $data['recipient']->name }}</td>
@endforeach
```

## まとめ
変数がオブジェクトではなく配列の場合、$data->recipient->nameといったアクセスはできません。

$data['recipient']->nameというように、配列に対するアクセス方法を選ぶ必要があります。
HTTP ってなに？

## HTTP[^HTTP]とは？

Webクライアント(Chromeなど)とWebサーバの間でデータの送受信を行うためのTCP/IPのアプリケーション層のプロトコル[^プロトコル]
HTMLファイル、スタイルシート、スクリプト、画像などを送受信できる

WebクライアントからWebサーバへデータを送信し要求することを**HTTPリクエスト**
WebサーバからWebクライアントへの返答を**HTTPレスポンス**という

[^HTTP]: Hypertext Transfer Protocolの略
[^プロトコル]: 通信規約、通信機器同士が通信を行うためのルール

## HTTPリクエスト
WebクライアントからWebサーバへデータを送信し要求すること

## HTTPレスポンス
HTTPリクエストに対する返答のこと

### リクエストメッセージ
HTTPリクエストを投げる際に送信される情報のことで以下の３つで構成されている
- **リクエストライン**
- **HTTPヘッダ**
- **メッセージボディ**

#### リクエストライン
以下の３つで構成されている
- メソッド
- リクエストURI
- HTTPのバージョン

#### メソッド
メソッドは５種類存在する

| GET | POST | PUT| PATCH | DELETE |
|:-:|:-:|:-:|:-:|:-:|
| データの取得  | データの送信（新規）  | データの送信（更新）  | データの送信（付与）  | データの削除  |

### HTTPヘッダ
クライアントの情報やリクエストの内容や形式などが含まれている
大量にあるのでこちらを参照してください

https://apidog.com/jp/blog/http-request-headers-summary/

### メッセージボディ
GET, HEAD, DELETE, OPTIONSの場合は基本的に含まれていないことが多い
POSTの場合は、受け渡されるパラメータが含まれている

## ステータスコード

| 100-199 | 200–299 | 300–399| 400–499 | 500–599 |
|:-:|:-:|:-:|:-:|:-:|
| 処理が継続  | リクエストが成功  | 他のリソースへのリダイレクト  | クライアントエラー  | サーバーエラー  |

## HTTPはステートレスである
HTTPはWebクライアントとWebサーバの間でデータの送受信を行いますが、サーバは多くのクライアントの通信を保持してしまうとサーバー負担が大きくなってしまう為、クライアントのアプリケーション状態を保持していません。
これをステートレスといいます。

しかし、ステートレスだとWEBが進化するにつれて不都合が出てきてしまいました。
それを解消する為に使用されたのが **cookieとsession**です

https://qiita.com/k-o-u/items/4637a4a32a2d32190a57
「プログラマー脳」から学ぶコードを読むときの混乱とその原因

# はじめに
この記事では、「プログラマー脳 ～優れたプログラマーになるための認知科学に基づくアプローチ」に記載されているコードを読むときに発生する3つの混乱とコードを読むことに影響を与える3つの認知プロセスについて、紹介していく

https://www.shuwasystem.co.jp/book/9784798068534.html

# コードを読むときに発生する3つの混乱
見慣れないコードや久しぶりに書いたコードを読むと、混乱する（コードが何をするか、なぜそのように書かれているか理解できない）ことがあり、その種類は3つに分類できる

```mermaid
graph TD;
    混乱([混乱])-->1.知識不足
    混乱-->2.情報不足
    混乱-->3.処理能力不足
```

# 具体例で確認
与えられた数値 N または n を二進数表現に変換するコード

## 1. 知識不足
APLでの二進数表現変換コード

```apl
2 2 2 2 2 T n
```

=>演算子 T が何をするのかわからない

## 2. 情報不足
Javaでの二進数表現変換コード

```java
public class BinaryCalculator {
    public static void main(Integer n) {
        System.out.println(Integer.toBinaryString(n));
    }
}
```

=>toBinaryString() の内部でどうゆう処理が行われているのかわからない
（toBinaryString() の定義を見つけて読む必要がある、情報がすぐに得られない）

## 3. 処理能力不足
BASICでの二進数表現変換コード

```bas
LET N2 = ABS ( INT( N ) )
LET B$ = ""
FOR N1 = N2 TO 0 STEP 0
    LET N2 = INT ( N1 / 2 )
    LET B$ = STR$ (N1-N2*2) + B$
    LET N1 = N2
NEXT N1
PRINT B$
RETURN
```

=>実行される処理のすべてを脳内で追いかけることはできない（メモしないとわからない）

# コードを読むことに影響を与える3つの認知プロセス

```mermaid
graph TD;
    混乱([混乱])-->1.知識不足
    混乱-->2.情報不足
    混乱-->3.処理能力不足
    1.知識不足-->1.長期記憶
    2.情報不足-->2.短期記憶
    3.処理能力不足-->3.ワーキングメモリ
```

## 1. 長期記憶
- **永続的に**保存される記憶装置

cf. ハードディスク

## 2. 短期記憶
- **一時的**に保存される記憶装置
- 目の前の問題が解決されると削除される

cf. RAM、キャッシュ

## 3. ワーキングメモリ
- **問題の処理**に用いられる短期記憶
- 実際の思考が行われる
- 新しい考えやアイデア、問題の解決方法が形成される

cf. プロセッサ

## 短期記憶とワーキングメモリの具体例
- 短期記憶：電話番号を一時的に記憶
- ワーキングメモリ：計算処理

## 3つの認知プロセスのまとめ
1. 長期記憶：長期間覚えておきたい情報を保持
1. 短期記憶：読み聞きしたばかりの情報を一時的に保持
1. ワーキングメモリ：上記の情報を処理して、新しい思考を形作る

# 3つの認知プロセスの相互作用
コードを読んでいるときは、3つの認知プロセスが相互作用しながらすべて働いている

<img width="800" alt="image.png (65.7 kB)" src="https://img.esa.io/uploads/production/attachments/6651/2023/12/12/142741/5f3ac97d-ed44-4669-b6c4-b6a27fc5c5b6.png">[^1]

[^1]: elienne Hermans 著、水野貴明 訳、水野いずみ 監訳「プログラマー脳 ～優れたプログラマーになるための認知科学に基づくアプローチ」秀和システム、2023、P11

# まとめ
コードを読むときの混乱は3種類に分類でき、それぞれ認知プロセスの影響を受けている

```mermaid
graph TD;
    混乱([混乱])-->1.知識不足
    混乱-->2.情報不足
    混乱-->3.処理能力不足
    1.知識不足-->1.長期記憶
    2.情報不足-->2.短期記憶
    3.処理能力不足-->3.ワーキングメモリ
```

:::note
今回紹介した混乱に対する対処法も「プログラマー脳」内で紹介されています。
:::

# 参考文献
- 	Felienne Hermans 著、水野貴明 訳、水野いずみ 監訳「プログラマー脳 ～優れたプログラマーになるための認知科学に基づくアプローチ」秀和システム、2023
Mac上とGitHub Actions上でのファイル名解決問題で詰まった


ローカル開発では問題なく、GitHub Actions上でだけトラブルが発生

> GitHub Actions上
> ![スクリーンショット 2023-12-24 20.14.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/4896dad5-42da-71df-17d7-df64de2fa9bd.png "スクリーンショット 2023-12-24 20.14.36.png")

なんだろうと思ってキャッシュクリアしたり、フォルダ階層いじったり色々してみてました。


## 何回か試してたらVSCodeがエラーを出してくれた

`Already included file name~~`といった内容です。

> ![スクリーンショット 2023-12-24 20.13.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/bb167614-fb88-25f5-8866-19c9ee333a27.png "スクリーンショット 2023-12-24 20.13.52.png")

GPTに聞いてみたら、`getHWInfo.js と getHwInfo.js という2つのファイルが存在する~`的な回答

> ![スクリーンショット 2023-12-24 20.16.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/9a35b500-aa03-575c-333d-860ee8ccf0dd.png "スクリーンショット 2023-12-24 20.16.09.png")

## Wが大文字か小文字か問題だった

`getHwInfo.js`というファイル名に対して`getHWInfo.js`を呼び出そうとしてました。

## ローカル(Mac)では動いてしまっていた

エラーにならずに動いてたことで気づけなかった事象ですね...
登壇のすゝめ　～　イベント初登壇をした人がふりかえってみた

## まとめ
### Developors CAREER Boost 2023に登壇しました

https://event.shoeisha.jp/devboost/20231209

こういったイベントに登壇することが初めてだったので、あったことを書き残しておきます。
今後同じように初めて登壇する人たちのためになればよいなと思っています。
内容は登壇スライドなどを見ていただいて、登壇するためになにをやったかという視点で書いていきます。

### 結論
みんな登壇しましょう！
それなりに時間はかかるし、プレッシャーもあるけど、いい経験になります！
頻繁にあるわけではないので、チャンスがあったらどんどん行きましょう！

## 序
### 登壇することになったきっかけ
弊社WHI([Works Human Intelligence](https://www.works-hi.co.jp/))はDevelopers Summitなどのイベントのスポンサーになっています。
イベントの少し前になると「登壇しませんか～」と募集が流れてきて、割と気楽に手を挙げました。
**深く考えずに手をあげちゃえ**がよいと思います！

### さて、何を話そう
イベントの趣旨に沿って自分が話せる内容を選びます。
初めての登壇の場合は、イベントの趣旨とちょっとずれていたとしても、自分が話しやすい内容にした方がよいかと思います。

ちなみに今回のイベントは**「エンジニアの“キャリア”にフォーカスしたカンファレンス」**でした。
2年ほど取り組んできたオンボーディング制度の構築がある程度形になってきたので、どこかで発表をしたいなとはうっすらと考えていました
オンボーディングそのものだと少し軸がずれている感がありましたので、新卒エンジニアが入社～オンボーディング～現場配属を経て、どのようにキャリアを描く手助けをしているかという内容にしました。

## 準備
### 一人で出るのか。誰かと出るのか。
話すのが苦ではない人は一人で出てもいいと思います。
緊張しやすいとか、人前で話すことに慣れていない人は他の人を誘って出るのがよいです。

今回は「入社～オンボーディング～現場配属」という内容だったので、新卒1年目2年目の若手に声をかけて3人で登壇することにしました。

本番前の控室とか緊張してましたが、話をしていたりすることで緊張しすぎることはなかった気がします。

### 資料を作ろう
#### 形式は作成する前に確認しましょう！
イベントによって投影用資料の詳細な指定があります。
また、聴く方が手元で資料を見られないことが多いので注意が必要です。

#### 確認しておくこと
1. 共有形式（PDF、Google Slide等）
1. 画角（16：9とか指定があったりします）

#### 資料作成時に気を付けること
1. 文字サイズ（最小24ptくらいがいいと思います）

#### どの程度まで作成するか
1. 投影用資料を作りましょう
1. 目安：1分1枚
1. **【重要】スピーカーノートに話す内容まで書いておきましょう。**

本番はテンパって頭が真っ白になります。
また、資料の文字を大きくすると話すこと全てを書いておくことができません。
なので、スピーカーノートを書いておくとかなり助けられます。

### リハーサル
事前に必ずリハーサルをやりましょう。今回はリハーサルを2回やりました。
できれば話す内容を知らない人にまっさらな状態で聞いてもらいましょう。
一人でやってもいいのですが、どうしても途中で止めてしまったりするので誰かに手伝ってもらえるとよいです。

1. 資料作成完了
    1. できた気になっています。できているのは気だけです。
1. **リハーサル**
    1. 持ち時間内に収まるか
    1. 前後のつながりが不自然ではないか
1. 資料修正
1. **リハーサル**
1. 資料修正
1. **本番**

ちなみに今回は資料を私が作成したので、1回目のリハーサルでは私がほとんどしゃべっていて他の2人が話す場所がほとんどありませんでした。
実際にやってみると資料作成時点では気付かなかったことが次から次へと出てきます。

## いざスタジオへ
ということで準備万端にしたら登壇当日です。

### 集合時間
運営側から指定された1時間前には近くにいましょう。
電車が遅れたり、忘れ物したり、トラブルは必ず起きます！
近くの喫茶店とかで最終確認をしたり、コーヒーブレイクでもしながらゆったり過ごしましょう。

ちなみに今回も新幹線が遅れていましたが集合を早めにしたことで余裕をもって受付できました。

### 本番直前
今回は現地来場が無くオンラインのみの開催だったため、スタジオでの配信となりました。
ディレクターさんがついて色々と確認していただけるため、流れに身を任せるだけで大丈夫です。
諸々の確認が終わるとあとは本番を待つばかりなのですが…緊張します。
緊張したときの状態は個々人で違うので、自分に合った緊張の対処法を用意しておきましょう。

1. 飴が置かれていたのは助かった
1. 飲み物必須
1. 身体症状出る人は落ち着くためにも事前に飲んでおく

### いよいよ本番！
本番はここまでちゃんと準備して来たらしゃべるだけです。
頑張りましょう。

1. 会社の広報等で使うと思うので、写真は撮っておきましょう！

## 終わった…
### 先生から一言
家に帰るまでが登壇です。
打ち上げやったりもいいと思いますが気を付けて帰りましょう。

### 最後にやること
1. 資料公開（することがあります）
1. X(旧Twitter)などをエゴサしてコメント見てニヤニヤします。（必要に応じてコメント返しましょう）
web技術についてまとめる

## ステートフル
- サーバがクライアントのセッション状態を保持している
- これまでの情報を保持した状態で、やり取りできる状態

## ステートレス
- ステートフルの対義
- サーバがクライアントのセッション状態を保持していない
- 手早くたくさんの情報を処理できる

### ステートフルとステートレスの比較は、美容室の例がわかりやすかった
1カット1000円の美容室では、どんなお客さんがいつ来店したのかを記録していない。
そのため、毎回どんな髪型にするか聞かれる
**これがステートレス**

1カット10000円の美容室では、お客さんごとに来店日やどんな髪型にしたのかを記録している。
この前と同じ髪型で といえば、それが伝わる。
前回の情報を踏まえた上で、処理してくれるから
**これがステートフル**

## リクエスト
サーバに対して、情報を要求すること

## レスポンス
リクエストに対して返ってくる情報のこと

## クッキー(Cookie)
ステートレスであるHTTPの問題を解決するために、開発された
webサーバからレスポンスが返ってくるとき、Cookieが含まれていることがあります。
このCookieを含むリクエストを送ることで、webサーバ側で、リクエストの相手を識別することができる
Cookieには、ユーザIDやパスワードを入れることが一般的
クライアント側で保存する(ブラウザなど)

## プロトコル
サーバとクライアントが通信を行う際のルール

モールス信号がわからない人に、モールス信号の光を見せても、ただ光が点滅しているだけにしか見えない
モールス信号が分かる人には、この光の点滅が、文字に変換されて伝わる
これは、光の点滅がどの文字であるかというプロトコルが、お互いの中にあるから成り立つものである
同様にして、インターネット通信の間でもプロトコルが定められている

webの場合は、HTTPというプロトコルに従って、通信している

## ポート番号
リクエストを受け取るアプリケーションごとの番号のこと

リクエストとして受け取った情報(パケット)を、サーバ内のどんなアプリケーションに渡せば良いのかを指定するためのもの
受け取った情報のプロトコルやどんなアプリケーションが処理するべきかを、サーバは判断することができない
サーバ内でどのプロトコルのリクエストが、どの番号のアプリケーションで処理するかを決めておく
この番号のことを、ポート番号と呼ぶ
サーバは、リクエストのプロトコルによって、どのポート番号に情報を渡すのか判断する

どのプロトコルがどのポート番号になるのかは、おおよそ決まっている
HTTPリクエストの場合は、80番ポートになることが一般的である


### 参考記事
https://amzn.asia/d/3sIELUt
https://qiita.com/s_ryota/items/98726b246cbf57a2f143
AWS LambdaとDynamoDBを使ってWordPressの表示を切り替える方法

## AWS LambdaとDynamoDBを使ってWordPressの表示を切り替える方法

AWS Lambdaを活用して、WordPressの表示を定期的に切り替える方法を紹介します。これにより、簡単かつ効果的にバッチ処理を実行し、DynamoDBのデータに基づいてWordPressのブラウザ表示を管理できます。
例えばメンテナンス中などに切り替えるときなどに使うケースかと思います。

### 準備作業

1. **Lambda関数の作成**: AWS LambdaでPython 3を使用して、DynamoDBのデータを更新するカスタム関数を作成します。

```python
# Lambda関数のコード例
def lambda_handler(event, context):
    # DynamoDBのデータを更新するロジックを実装
    # WordPressの表示を切り替える処理
    pass
```

2. **CloudWatch Eventsのルール設定**: CloudWatch Eventsを使用してLambda関数を定期的にトリガーするためのルールを設定します。

```markdown
# CloudWatch Eventsのルール例
- スケジュール式: cron(0 12 * * ? *)  # 毎日12時に実行
- ターゲット: 先ほど作成したLambda関数
```

### WordPressへの反映

WordPress側では、Lambda関数によって更新されたDynamoDBのデータを監視し、表示を切り替えるプラグインやカスタムコードを導入します。

```php
// WordPressの表示切り替えロジック
if (dynamodb_data == 0) {
    // メンテナンス中の表示をする処理
    echo "サイトメンテナンス中";
} else {
    // 通常の表示をする処理
    // WordPressテーマの表示コード
}
```

これで、AWS LambdaとDynamoDBを使用してWordPressの表示を効果的に切り替える仕組みが完成しました。定期的なバッチ処理によってサイトの管理がスムーズに行えます。
【TIPS】ビットストリングのカウントが無い…

この記事は、[Elixir Advent Calendar 2023 シリーズ14](https://qiita.com/advent-calendar/2023/elixir) の14日目です

---

【本コラムは、2分で読め、2分で試せます】

[piacere](https://twitter.com/piacere_ex) です、ご覧いただいてありがとございます :bow:

Elixirのビットストリングって、バイナリデータを扱う際に便利ですが、「データのサイズ」をカウントする関数が、`Bitwise` モジュールにありません
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/eafe867f-9bd0-683f-90f9-8998ee507453.png)

また、ビットストリングは `Enumerable` プロトコルの実装では無いため、`Enum` モジュールも使えません

```elixir
iex> <<1, 2, 3>> |> Enum.count
** (Protocol.UndefinedError) protocol Enumerable not implemented for <<1, 2, 3>> of type BitString
    (elixir 1.16.0) lib/enum.ex:1: Enumerable.impl_for!/1
    (elixir 1.16.0) lib/enum.ex:178: Enumerable.count/1
    (elixir 1.16.0) lib/enum.ex:702: Enum.count/1
    iex:18: (file)
```

今回、その解決＋αをTIPSとしてまとめておきました

# ビットストリングのカウント

ビットストリングのカウントは、`Kernel` モジュールの下記でできます

```elixir
iex> <<1, 2, 3>> |> byte_size 
3
```

なおビットストリングは、ダブルクォートで囲まれた文字列と互換性があるため、`String` モジュールを使うこともできます

```elixir
iex> <<1, 2, 3>> |> String.length
3
```

逆も然りです

```elixir
iex> "Xmasケーキ" |> byte_size 
13
```

なおバイトサイズでは無く、ビットサイズを取得することもできます

```elixir
iex> <<1, 2, 3>> |> bit_size 
24
```

マルチバイト文字列だと、1文字3バイト使うので、4 x 8 + 3 x 3 x 8で104ビットとなります

```elixir
iex> "Xmasケーキ" |> bit_size 
104
```

型を指定すると、バイトサイズ／ビットサイズが変わります

```elixir
iex> <<1::big-integer-size(64), 2::big-integer-size(128)>> |> byte_size
24
iex> _ |> bit_size
192
```
VisualStudioで使用する静的解析ツールはどれを使えば良いのか



## 採用したもの

結果としては、`StyleCop.Analyzers` + α を採用しました。
まず導入の過程として、コーディング規約レベルの指摘を減らし、本来確認したいコード全体の一貫性や、共通関数群を使わず勝手に独自実装していないかなどの確認に時間を割きたかった という思いがあった為、
今回の選定の判断基準としては、プロジェクトのコーディング規約(主にコードのスタイル面)をどこまでカバーできるか です。

ただ`StyleCop.Analyzers`は日本語に対応していませんので、指摘メッセージが英語で出てきてしまいます。
英語だとメンバーが読まずにスルーしてしまう事が多いため、選定時も日本語であることが重要視されていました。
そこで一部メッセージを日本語化したものを自分のリポジトリに作成し、そちらを使用しています。

https://github.com/MURAMASA2470/StyleCopAnalyzers

## 静的解析ツールとは

動的解析ツールとは異なり、ソースコードを実行することなく、静的な状態で分析し、潜在的なバグやセキュリティの問題、コーディング規約の違反などを検出するツールです。
JavaScriptでコードの品質を担保する為に使われる`ESLint`も、これに該当します。

## 静的解析ツールの導入により改善出来ること

- 目視ではなく機械的なチェックを行うことでコーディング規約レベルの問題点は、レビュー前にほぼ気付くことが出来る
- 分析ツールからの指摘や修正提案によって、開発者のスキルが向上する
- 確認時間の短縮や開発効率を上げる事で、機械的に判断できない部分の確認に時間を割ける


## ツールの種類

### 静的解析ツール

コードの規則や複雑性に基づいて分析し、警告やエラーを表示可能
今回主に紹介するツール

### 動的解析ツール

主にテストツール。実際にパラメーターを入れた際の挙動などの分析が可能
テストコードを書く必要はあるが、単体テストレベルの確認ができる

### 整形ツール

ある規則に基づいて、コードの自動整形が可能
VisualStudioでは編集タブまたは「Shift+Alt+F」などで実行する


## VisualStudioに標準搭載されている機能

実はVisualStudioには標準でこんな機能が付いています。

### ドキュメントフォーマット機能

ルールに沿ったソースの自動整形ができる(書式ルールは設定から変更可能) インデント崩れや余白位置の誤りなどは、この機能でほとんど修正可能。

### コードメトリクス分析機能

保守のしやすさ(保守容易性指数)をサイクロマティック複雑度、継承の深さ、コードの行数などを元に、ファイル、メソッド単位などで算出してくれる読みづらいソースやバグを生みやすいソースなどを数値的に可視化してくれるので、設計の見直しなどに役立つ。

### アナライザー機能

VisualStudio 2015からは コード分析の機能が標準で搭載されており、コーディング中にリアルタイムでエラーや警告を表示してくれる。

## 主な静的解析ツール

### VisualStudio標準の分析ツール

`Microsoft.CodeAnalysis.CSharp.*`と言う名前のやつ。
VisualStudio 2015以降から標準で搭載されている。
標準機能だが、これでかなりの範囲をカバー可能。

### .NetAnalyzers(旧FxCopAnalyzers)

Microsoft公式のアナライザー。
.NET 5から標準で搭載されており、日本語にも対応している。
コードの複雑さや、セキュリティ面での分析が可能。

https://github.com/dotnet/roslyn-analyzers

https://www.nuget.org/packages/Microsoft.CodeAnalysis.NetAnalyzers/

### StyleCop.Analyzers

今回採用したもの。
他のツールよりスペースの位置、可読性などの見た目部分に特化している。
日本語に対応していない。

https://github.com/DotNetAnalyzers/StyleCopAnalyzers

https://www.nuget.org/packages/StyleCop.Analyzers

### Roslynator

Microsoft公式のアナライザー。
CLIからの操作に対応 (バッチから操作したりと応用が利く。)
日本語に対応していない。

https://github.com/dotnet/roslynator

https://www.nuget.org/packages/Roslynator.Analyzers

### NetFabric.Hyperlinq.Analyzer

Enumerator関連、主にLINQのことを指摘してくれます。

https://github.com/NetFabric/NetFabric.Hyperlinq.Analyzer

https://www.nuget.org/packages/NetFabric.Hyperlinq.Analyzer


### Meziantou.Analyzer

非同期、引数名違い、正規表現関連の指摘などをしてくれます。
少し口うるさいアナライザーです。
全て有効にするのではなく、好きなものを部分的に有効にする方法をおすすめします。

https://github.com/meziantou/Meziantou.Analyzer

https://www.nuget.org/packages/Meziantou.Analyzer
【TIPS】タプルのカウントが無い…

この記事は、[Elixir Advent Calendar 2023 シリーズ14](https://qiita.com/advent-calendar/2023/elixir) の15日目です

---

【本コラムは、2分で読め、1分で試せます】

[piacere](https://twitter.com/piacere_ex) です、ご覧いただいてありがとございます :bow:

Elixirのタプルって、アレコレ便利ですが、唯一、マップやリストと異なり、「データのサイズ」をカウントする関数が、`Tuple` モジュールにありません
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/c147b6ed-b838-26a4-c102-0e79511a62cf.png)

また、タプルは `Enumerable` プロトコルの実装では無いため、`Enum` モジュールも使えません

```elixir
iex> {1, 2, 3} |> Enum.count
** (Protocol.UndefinedError) protocol Enumerable not implemented for {1, 2, 3} of type Tuple
    (elixir 1.16.0) lib/enum.ex:1: Enumerable.impl_for!/1
    (elixir 1.16.0) lib/enum.ex:178: Enumerable.count/1
    (elixir 1.16.0) lib/enum.ex:702: Enum.count/1
    iex:16: (file)
```

今回、その解決＋αをTIPSとしてまとめておきました

# タプルのカウント

タプルのカウントは、`Kernel` モジュールの下記でできます

```elixir
iex> {1, 2, 3} |> tuple_size
3
```

# ちなみにマップのカウントは？

実は、マップのためのカウントも、`Kernel` モジュールにはあります

```elixir
iex> %{a: 1, b: 2, c: 3} |> map_size
3
```

ただ、マップは `Enumerable` プロトコルの実装なので、`Enum` モジュールでもカウントが取れます

```elixir
%{a: 1, b: 2, c: 3} |> Enum.count
3
```
サーブレットとは　#JSP #Tomcat

JavaでWEBアプリを作ろうとした時に、避けては通れない用語として、「Java Servlet（サーブレット）」があります。

# Java Servlet（サーブレット）とは
### 概要
サーブレットとは、簡単にいうと「WEBアプリを開発するために作られたプログラムの部品」のことです。WEBサーバー上で動作し、WEBアプリの中心を担う機能をもっています。

### WEBサーバー上で動くJavaプログラム
サーブレットは、WEBサーバー上でお仕事をするプログラムです。
ただ、サーブレット自体は、WEBページをはじめとし**画面に関する処理はいっさい行わず、WEBブラウザからの要求に応えたり、送られてきたデータを処理したりする役割をしています**。
サーブレット単独では、WEBアプリ作成するための機能が不十分なので、後述する「JSP」や「Tomcat」と呼ばれる他のプログラムと連携してアプリを作る必要があります。

### サーブレットの特徴
- ライフサイクルを管理
処理が始まってから終了するまでの一連の流れ（ライフサイクル）を管理します。これにより、2回目以降の処理速度が速くなります。

- マルチスレッドに対応
同時に複数の処理を行うことができます。これにより、複数のユーザーから同時にアクセスがある場合でも、効率良く処理が行えます。

- プラットフォームに依存しない
Javaで書かれているため、Windows、macOS、LinuxなどのOSに依存せずに動作します。

# サーブレットを利用した技術
### JSP
「JSP」は、HTML内にJavaのコードを埋め込み、動的にWEBページを生成する技術のことです。**サーブレットはWEBアプリ内部の処理を担当していますが、JSPは主にWEBページを担当しています**。

**サーブレットとJSPが連携することで、動的にWEBページを作ることが可能になります**。

※動的にWEBページを作成するというのは、特定のユーザー情報を画面に表示したり、ログインしているかいないかで表示する画面の内容を変えたりすることを指します。

動的にWEBページを作成することで、WEBアプリを実現することが可能となるのです。

### Tomcat
Tomcatは、無料で使えるWebサーバーであり、サーブレットを動かすソフトの1つです。サーブレットはあくまで部品に過ぎないので、サーブレット単独ではプログラムを動作させることができません。
Tomcatはサーブレットを動かすエンジンの役割をしていて、必要に応じて命令を出してサーブレットを動かしてくれます。
組み込みエンジニアがwebサービスを開発してみた

はじめまして。初投稿なので、お見苦しい部分があったら申し訳ありません。
## 　自己紹介
普段は都内のメーカで、エンジニアとしてサービスよりのプロトタイプの開発や生成AIを活用した新規事業の立ち上げに携わっています。
2023年夏頃までは、製品の組み込み開発とソフトウェアの開発マネジメント業務に従事していました。

## 　プロダクトの概要
世の中の議論を可視化する事と完全匿名で議論できるサービス「議論.com」をリリースしました。
https://www.web-giron.com/

## 　開発のきっかけ
今回のプロジェクトを始めたきっかけは、以下の3つの要因によります。
### 　①Web技術の習得への意欲
これまで画像解析や数値処理の開発を手がけてきましたが、Web技術の知識はほとんどありませんでした。
Web技術は非常に広範囲にわたり、技術書を読みながらの学習は普段の業務と並行して行うにはあまりにもハードルが高い状態だと感じ、一歩を踏み出せずにいました。
2023年初頭にChat GPTがリリースされ実際に自分で触った時、「GPTを副操縦士にwebサービスの開発をすれば技術書を買いあさる必要がないじゃないか？」と考え、開発に踏み切りました。
GPTは優秀な副操縦士で、フロントエンドやバックエンドの知見がなくとも、GPTとの問答を繰り返すことで必要な知識を身につけ、３か月程で今回のプロダクトを完成させることが出来ました。
### 　②ニュースの表現への疑問
コロナ禍以降、ニュースでよく見かける「●●について賛否両論」や「●●に批判殺到」という表現に疑問を抱いています。
記事の内容を詳細に拝見すると、少数の否定的意見が際立っているだけで、実際には大多数が賛成しているケースもあります。
ニュースサイトとしては、こうしたセンセーショナルなタイトルがView数の増加に繋がると考えるのは理解できますが、1人のユーザーとしては、そうした表現に一面性や物足りなさを感じていました。
また、エンジニアの性として、実際に世間の賛否の数を集計し、その実態を可視化することに対して強い興味がありました。
### 　③匿名での健全な議論の場の欲求
個人的に、現代のSNSではフォローワーとの関係性を考慮しながらコメントする必要があり、ネット特有の匿名性のメリットが失われつつあると感じています。
一方で、5chのような完全匿名のプラットフォームは、攻撃的な言動や悪意のある連投が問題となっています。
そこで、既存のSNSの良い点と5chの匿名性の良い点を組み合わせたようなサービスを開発することにしました。

## 　使い方
登録はGoogleアカウントかXのアカウントで登録する事が出来ます。
![スクリーンショット 2023-12-24 190820.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3660665/ab9e909c-69e3-ec68-18b9-d644fb89dcf0.png)

ログイン完了後、スレッドの作成や記事に対するリアクション、コメントが可能になります。

![スクリーンショット 2023-12-24 191304.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3660665/5284c0c2-cab2-5144-d4b9-21753e1ea15c.png)

記事に対するリアクションは、「賛成ボタン」「反対ボタン」「高評価ボタン」があり、記事に対して簡易的にリアクションを起こすことが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3660665/883326c3-cdc0-d279-dffe-6950626ee95a.png)

## 　リリースに対しての所感
このプロジェクトを通じて、フロントエンドやバックエンドの知識、さらにネットワークに関するノウハウを学ぶ良い機会となりました。
技術書を読むだけでは得られない深い理解や、実際にデータベースを構築し、サービスを運営する際に考慮すべき多くの点について考察することができたのは、非常に有意義な経験でした。
また、実際にアプリケーションを開発するハードルが低くなったと感じています。
職場や友人との会話の中で「こんなアプリがあったら面白いかもー」というアイデアが出たとき、以前よりも具体的な実装のイメージが浮かぶようになりました。

## 　今後の方針
今後の開発の方針としては、さらなる機能の追加と本サービスの人口が増えるように努めていこうかなと思います。
出来れば来年の2月までにマネタイズまで行きたい。。。

## 　最後に
今回、完全匿名で議論・投票が出来るプラットフォーム「議論.com」を開発しました。
まだまだ、発展途中のプロダクトですので、使いづらい点やエラーが発生するかもしれません。
その際は、コメントやXまでご連絡ください。
皆様からの貴重なフィードバックは、サービスの改善に大いに役立ちます。
実際にご利用いただいた感想もお聞かせいただけると大変嬉しいです。

X : https://twitter.com/hei_gironcom

最後まで、読んで頂きありがとうございました。
stimulus.jsからのturbo_frameリクエストを送信する方法



# はじめに
JavaScriptでTurboFrameリクエストを行う方法がわかったので共有します。

# 問題
'modal'という名のturbo_frame_tagにJavaScriptで'/modals/pop_ups'というリクエストを行いたい場合は通常のlink_toタグなどでのリクエスト送信ができない。

# 解決方法
``` js
sendTurboRequestToPopUpModal = () => {
    // turbo_frame_tag 'modal'を示している
    // turbo_frame_tagは指定した属性と同名のidが付与されるため
    const frame = document.getElementById('modal')
    // turbo_frame_tagはsrc属性を付与するだけでその部分を指定のURLに置換する原理があるため、この処理だけでmodalが開く
    frame.src = '/modals/pop_ups'
  }
```
turbo_frame_tagはsrc属性に設定されたURLに中身を書き換えるという特性を持つ。
そのためsrc属性にリクエストを付与するだけでリクエストを送信することができる。

# おわりに
この特性を活かせばtubo_frame_tagの使用方法の自由度が上がるので、turbo_frameでよく開発する私にとっては有益な情報でした。
同じようにRails7のHotwireで開発している方にとって有益な情報になれば幸いです。
本当に正しいか疑われる問題解決方法

# 最初に
開発の質問に答えている時に、そんな場当たり的な解決じゃなくて知識教えて欲しいと!!みたいなこと言われてちょっと改めて考えてみました。
結論、知識とか問題の原因を理解することは大切ですが、実務ではむしろ知識とかで解決できない場合にどうするか?みたいなところもエンジニアとして大切なんですよね。

ただ、自分でもその手段を人に伝えらえるほど具体的に考えているわけじゃないので、
それを改めて言語化してみようと思います。

良さそうなアイディアがあったらコメントいただけると嬉しいです。

## 動かない時にPC/インスタンス再起動

アプリが動かない、xcodeでうまくビルドができない、なんかPCが重たい、画面が開かない、、、そういう時には再起動しましょう。
理由を調べることはできますが、問題を解決することだけが目的であれば再起動はありです。

今後二度と起きないようにするためにはもちろん調べた方が良いですが、その場合でも問題解決した後に調べるとかでよかったりします。
時間は無限ではないので時には諦めて再起動しましょう。

また、再起動とか試す前に先輩とかに質問すると怒られることもあるかもですね。
なんかよくわからないけど治ったものを出すのはプロとしてどうなんだってところはありますが、時と場合によっては出さなければいけないこともあるので選択肢には入れておきましょう。


## バグをバグのまま放置する。問題を捨てる。

バグがゼロになることなどあり得ないので、優先順位をつけたり影響範囲がデカすぎた場合にやります。
あまりにも使いすぎると後で困ったりしますが、最善の結果になるようにうまく調整していきたいですね。
ただ、見つけた際に報告しないこととは違うので、勝手に判断しないように注意しましょう。


## とりあえず最初から作り直す

作ったものが動かなかった時、なぜか作り直したらうまくいくことはあります。
良い方法ではないですが、完成させることが目的であれば何時間も問題の箇所探すよりもよかったりします。

また、AWSで何かしらのサービスを使う時、作ったインスタンスとかちゃんと動かないこととかは割とあります。
その場合にはこっちでは判断がつかなくて、AWSのサービスに問い合わせとかしないといけないので、作り直すのも立派な解決方法です。
もちろんすでに動作しているものに関しては簡単に使える方法ではないですが、こちらも選択肢から除外するべきではないですね。


## 問題のことを忘れて寝かせる

1時間、2時間、3時間とかけて解決しなかった問題が、お風呂入った瞬間とか次の日の出社直後に考えたら普通に解決することがあります。
もちろん解決しないこともありますが、このパターンで解決した時は脳汁が出るのでとても気持ちよく、その後忘れることも基本ありません。

ただ、闇雲にこれをやればいいわけではなく、全力で考えた後に神様が与えてくれるプレゼント的なものなので、全力で考えて考え尽くした後にやるようにしましょう。


## 別のツール、サービス、解決方法を使う

そのツール自体を使うことが目的になってしまっているエンジニアの人は結構見かけます。
大体そういう人は仕事の出来が微妙ですね。
新しいものを使いたいのは悪いことではないですが。

サービスを使うのは何かしらを解決することが目的なので、その目的が達成できるのであれば、どんなツール、サービスだろうが問題ないのに、永遠に最初決めたものに思考が囚われてしまったりするのはすごく勿体無いです。
オーバースペックなものを入れたりとかも同様です。
うまく目的が達成できない時には、他のツールを探して使ってみるのも検討しましょう。


## 最後に
改めて言語化すると、逃げるは恥だが役にたつって感じですね。

あんまりこの記事は有用なものになっているかはわかりませんが、
数人のためにでも役に立つと嬉しいです。
GCP資格「Associate Cloud Enginner」合格体験記

## 前提
私は、新卒２年目のエンジニアです。
AWS歴は2年ほどで、GCPの経験は3ヶ月ほどでした。

## 1. 資格取得の動機
- **データ民主化プロジェクトへの取り組み**: Google Cloudに関する専門知識の獲得を目指した。
- **社内のニーズ**: 社内にGCPに関する知見が不足していたため、そのギャップを埋める必要があった。
- **キャリアの基盤**: データエンジニアとしてのキャリアを構築するための基礎を築くことを目指した。

## 2. 勉強方法と資料
- **勉強方法**: 模擬テストを解き、答えを詳細に分析。公式ドキュメントを精読。
- **使用した資料**: Udemyの模擬テスト、Google Cloudの公式模擬テスト、Google Cloud Platformの公式ドキュメント。

## 3. 学習スケジュール
- **合計期間**: 1ヶ月
- **総勉強時間**: 約30時間
- **平日**: 1日につき約1時間
- **休日**: 1日につき約3時間

## 4. 直面した課題と解決策
- **困難だった点**: KubernetesやVPCなど、専門性の高い分野を基礎から学ぶ必要があった。
- **解決策**: 基本的な概念の理解、追加資料の活用、実践的なアプローチ。

## 5. 試験の体験
- **試験当日の感想**: 模擬試験は本番の試験よりも難しいと感じられたため、本番では迷う問題が少なかった。
- **十分な準備**: 模擬試験と公式ドキュメントを2回繰り返すことで、合格ラインに十分に達することができた。

## 6. 資格取得後の変化
- **知識の網羅性と体系性**: Google Cloudに関する包括的な知識を身につけることで、クラウドサービスに対する不安が解消された。
- **マルチクラウドへの応用**: Google Cloudの学習を通じて、AWSとの比較を行うことで、AWSに対する理解も深まった。

## 7. 同じ資格を目指す人へのアドバイス
1. **模擬試験の重要性**: 模擬試験は本番の試験に向けての良い準備となる。繰り返し解いて、理解を深めること。
2. **公式ドキュメントの活用**: 公式ドキュメントは貴重なリソースであり、詳細な情報が含まれている。徹底的に精読すること。
3. **マルチクラウドの視点**: 一つのクラウドサービスだけでなく、他のクラウドサービスとの比較も行い、広い視野を持つこと。
ブロックエレベーターに使われている歯車等の寸法を書いてみた

# はじめに
ブロックエレベーターを作っている　熊秀創吉です。
いままで、エレベーターの構成図や図面などを書いてきました。
そこで今回はエレベーターに使われている歯車等の部品の寸法を書いてみました。
ここに書いた寸法は組立図を書く時に使ったものです。
作図に使ったのはJW_CADです。
この寸法は個人で測ったもので多少の誤差があります。
実際の幅は0.2mm程度小さいと思われます。
ノギスでは測れない（先端が大きく膨らんでいたり幅が厚いので）寸法がありました。そこは感で書きました。


### 寸法図


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/91451300-1f71-0255-ba7d-2f8c5e0bb79b.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/9d6f0d0f-556f-0b20-6eff-8dffa8d7140c.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/08b342cc-c184-d6f3-18d1-d6c371c7633a.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/c27e9972-f8b8-bef8-bc41-a7bd9a7efcbe.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/30e0fe24-9dae-5574-5a09-0951ddc2a976.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/e2b9a512-eaca-71ed-5213-bfe0b2c2ff00.png)
CGI ディバッグ(debug)xampp 参考python

プログラムミスは、書いていれば、誰でも、たいていは起こすものだと思っています。
いかにして、対処するかが、解決の早道になるかを、cgiのpythonを使ったときに起きたのを、参考として載せます。pythonが、特別な訳では無く、ruby,perlなどでも、起こします。だから、pytonが特別とかは言いません。
対処の参考として、載せたまでである。pytonには、お気の毒なのですが、明日は直っているかも知れないので、それが起きるとは限りません。

参考1
![スクリーンショット 2023-12-24 180616.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/0c10ed16-f615-1189-4e7e-8ffb5f413cfb.png)
正常に動いている図

参考2
![スクリーンショット 2023-12-24 180849.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/2a95b9dc-7238-df72-57e6-a571756fc1a2.png)
わざと、間違えて起きるのをこれから

参考3
![スクリーンショット 2023-12-24 180924.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/4680638f-15ab-d5e8-db6a-8d3fdedcab69.png)
んー。。翻訳機が英文を直してくれています。500を覚えておいてください。

参考4
![スクリーンショット 2023-12-24 181013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/f00497e2-505a-8270-75f4-cf388a42c000.png)
VSCoodにErrorを表示させている(error.log)さっきの場所を示している。

参考5
![スクリーンショット 2023-12-24 181221.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/2a0b1d35-41c0-9b75-2c4d-4d33943f5c86.png)
違うErrorを出してみる。表示が違いますが、処置を知らないだけです。直ります。

参考6
![スクリーンショット 2023-12-24 181318.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/4f2a0e43-d709-e447-77a7-3ef44c3c8514.png)
最後まで表示が出なくて止まります。一見Errorとは分かりません。

参考7
![スクリーンショット 2023-12-24 181414.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/f8dabfb5-0d1e-4b0d-d0b5-4f9074523714.png)
内部エラーがいっぱい出ています。私は内部を触れませんので別の書き方を探します。下の# urllibはErrorにはなりません。

参考8
![スクリーンショット 2023-12-24 181519.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/984fc4e2-4af5-d99a-bc98-8b9942b5c5b0.png)
xamppの「logs」からメモ帳を開いてすべて選択して、消す前の所。

参考9
![スクリーンショット 2023-12-24 181548.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/9e80a916-c021-c46b-4cee-c7531c7f0568.png)
こんなポップアップが出ます。vscoodではすべてを選択がありませんので、これで。

参考10
![スクリーンショット 2023-12-24 181659.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/41cda63b-baa2-d564-2a68-99bb8f1fb09f.png)
アクセスログ　最後のが200で終わっていますそれがさっきの、特徴。


これがすべてではありません。ファイルがない404とか書込み禁止とか。
今回はpythonに出てもらいましたが、エラーとは上手に付き合いましょう。書式を変えたら直ったりしますので、Copilot(何かは言わない検索して)などと、上手な付き合いをしましょう。
参考までにVB2022はフィードバック送信で、コミュニティのサポートを受けられます。蛇足ですが。
何でもかんでも「コンソールでやってみない？」4日目


# なぜArduinoIDEはダメ？（脱線）
なぜ今回ArduinoCLIを紹介しているのかというと、ArduinoIDEがかゆいところに手が届かないからです。

## 遅い...
WiFiを使用したWebServerのプログラムを書いてそれをコンパイルしたのですが、ArduinoIDEではコンパイルに40秒(キャッシュありで16秒)ほど、対してWSLでのArduinoCLIではコンパイルに14秒(キャッシュありで5秒)ほどでした。
このように、プログラムによってはコンパイル時間にかなりの差が出てしまいます。
また、ボードへの転送の際にも必ずコンパイルを行うため、無駄に時間がかかってしまいます。

## なんか使いにくい...
私だけじゃないと思うのですが、やっぱり使い慣れたエディタを使ってプログラムは書きたいですよね。
（もちろん外部のエディタを使うという機能はあるのですが！）

## じゃあArduinoCLIはどうなの？
ArduinoCLIは、ArduinoIDEからコンパイル機能を持ってきただけのCLIプログラムみたいな感じなのに、あまりにもコンパイル時間が早くなっており、上記の問題を抱えてる方にはかなりオススメなのです。

# 最後の仕上げ

前回までで、プログラムのコンパイルは終わりました。
というわけでボードに対してアップロードしていきたいと思います。

といっても簡単です。
```sh
$ arduino-cli upload -b esp32:esp32:esp32 esp32_ledtest -p シリアルポート
```
だけです。

シリアルポートは、`arduino-cli board list`で調べることができます。

```sh
$ arduino-cli upload -b esp32:esp32:esp32 -p シリアルポート -i XXXXX.zip
```

また、このようにすると、すでにコンパイルされた`.zip`ファイルを転送することができます。

これをうまく使えば、複数ボードへの転送も簡単に行えます。

# まとめ

実をいうと、あと30時間しか時間がなくて焦っています。
ただ、WSLからUSBのバインド・アタッチができず、.NETと格闘してました。（結局わかんなかったです。）

さぁ、現実に戻りましょう。

というわけで、「コンソールでやってみない？」