OmniAICreator/Qiita-1.07M huggingface dataset:
日本のサマータイムにハマった話

# はじめに
日本にもかつてサマータイムがあったという事を皆さんはご存じですか？
私はこの問題に直面するまで知りませんでした。。
実は過去に日本でもサマータイムが導入された時期があり、サマータイム開始日の0時～1時をPHPのCarbonライブラリで扱う場合は注意が必要です。

# 発生したトラブル
ある日、担当しているプロジェクトで「特定の日付で絞込検索しても対象のデータがヒットしない」と言われ調べてみたところ、なぜか発行されたSQLの日時が期待値とズレていました。

``` '1948-05-02 00:00:00' ``` を期待していたところ、 ``` '1948-05-02 01:00:00' ``` と、1時間ずれていたために0時のデータが取得できない状態になっていました。

タイムゾーンの設定も問題なく、色々調べたところ、受け取った日付パラメータをCarbonに渡してインスタンス生成したタイミングで時間がずれている事がわかりました。
何故そんな事が起こっているのかまったく分からず、すがる思いでその日付をそのままGoogle先生にお聞きしたところ「サマータイム」の文字が・・・。

# 日本のサマータイムとCarbon
過去、日本でもサマータイムが採用されていたタイミングが4年間だけ存在し、以下の日付の0時になる瞬間に1時間調整される制度があったようです。

* 1948-05-02 00:00:00 -> 1948-05-02 01:00:00
* 1949-04-03 00:00:00 -> 1949-04-03 01:00:00
* 1950-05-07 00:00:00 -> 1950-05-07 01:00:00
* 1951-05-06 00:00:00 -> 1951-05-06 01:00:00

そのため、「1948-05-02 00:00:00 ～ 1948-05-02 00:59:59 」は存在しない時間となり、Carbonでは強制的に「+1h」されるようです。

## 試してみた
サマータイム開始日の日付だけを渡すと「01:00:00」になる。
```
$date = new Carbon('1948-5-2');
echo $date;
---
=> 1948-05-02 01:00:00
```

時間「00:00:00」を指定しても「01:00:00」になる
```
$date = new Carbon('1948-5-2 00:00:00');
echo $date;
---
=> 1948-05-02 01:00:00
```

時間「00:59:59」を渡しても +1h される
```
$date = new Carbon('1948-5-2 00:59:59');
echo $date;
---
=> 1948-05-02 01:59:59
```

# 最後に
これまでサマータイムを意識した開発をしたことが無かったため、今回かなりハマってしまいました。
皆様もお気をつけ下さいませ。
軽深演習 #14 最高到達点（絶対）

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

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


### 前提知識　最高到達点（絶対）
[軽深演習 #5 最高到達点(相対的)](https://qiita.com/zanjibar/items/252b7cb94e6ecd145e4a)は、敵に負けないぞという相対的なものでしたが。
今回は最高到達点（絶対）という、絶対的な制約のある最高到達点です。例えば。光の速度は光速度が限界とかがその代表です

コンピューターも消費電力も、[ランダウアーの原理](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%B3%E3%83%80%E3%82%A6%E3%82%A2%E3%83%BC%E3%81%AE%E5%8E%9F%E7%90%86)に従えば、ほぼゼロ近くまで可能になります。
厳密な理論的最高到達点は非現実的なことが多いですが。日本全体で太陽光発電の可能量ははどのくらいが上限などは、現実的に意味があります。
上限以上には発電することができないということになります。現時点でどのくらい発電しているのかが分かれば、上限までどのくらい達成しているかが分かります。

太陽光発電に関しては、大雑把な試算はいくつかありますが、おおよそ日本の総電力需要の数倍はあるだろうと言われています。

図式では


```mermaid
flowchart TD
A[現在の発電量]-->B[近い将来の発電量]-->C[背伸びした発電量]-->D[最大限可能な発電量:絶対的な最高到達点]
```

前回のアドベントカレンダーでは、図式では**もっと前**でしたが、今回は**もっと先**になります。

```mermaid
flowchart TD
A[今の状態]-->B[近い将来]-->C[もう少し先]-->D[もっと先:絶対的な最高到達点]
```

どの図式にもが**もっと先**がありますね。それで、**もっと先**があると考えるとどんないいことがあるのでしょうか？
**もっと先**が見えてくると見通しはよくなりませんか？　太陽光発電の例では、明るい見通しが見えてきます。
トヨタは、太陽光発電だけで、実用的な太陽光発電のEVを目指して開発しています。絶対的な最高到達点を意識することは、長期的な開発では重要でしょう。
[次世代太陽電池、30年EV搭載へ　トヨタ･京大発新興組む](https://www.nikkei.com/article/DGXZQOUF2365T0T20C23A6000000/)


### 演習　空間の面積や体積は、絶対的な最高到達点の一つです。住んでいる部屋の面積、体積は把握しているでしょうか？　周りの人に日本の面積を聞いてみましょう。意外と知らないものです。自分の部屋でも正確に把握していないのではないでしょうか？　それで演習です。すぐにできる部屋の空間の有効活用を考えてみましょう

圏論って面白いんじゃないかとなんとなく思えるようになりませんか？
単純な**もっと先**でなく、絶対的な最高到達点を意識することは大きいビジネスにとっては重要なことでしょう。少なくともトヨタは行っています。
Windows でのパッケージ管理は Scoop が便利


# やりたいこと

最近、Windows 上で Powershell を使ってちょっとした開発を行った際に、Powershell のコマンド分からん…! となっていたんですが、`Scoop` というパッケージマネージャーを使って Linux 系のコマンドだったりパッケージをインストールすることで開発しやすくなりました。その内容を記事にしてみます。

# Scoop とは？

Windows で動くパッケージマネージャー。コマンドプロンプトや Powershell で使用できる。
Windows でのパッケージマネージャーといえば、[`winget`](https://learn.microsoft.com/ja-jp/windows/package-manager/winget/) や [`chocolatey`](https://chocolatey.org/) が有名ですが、Scoop はよりデベロッパーフレンドリーなんだとか。
また、`winget` だとコマンドでインストールしたもの以外も管理下に置かれますが、`scoop` だと `scoop` でインストールしたもののみを管理できます (この点は、`chocolaty` と同様かもしれません)。

https://scoop.sh/

例えば、Git for Windows をインストールする場合、インストーラーをダウンロードして実行して Next ボタンをポチポチして… みたいな形ですが、Scoop だと `scoop install git` コマンドで一発。アンインストールする際も同様にコマンドだけで完結できます。

# インストール方法

上記リンク先の、Quickstart に従って、Powershell でコマンドを実行するだけ。それだけ。

# 使い方

上でもちょっと書きましたが、何かインストールする際には以下コマンド。

```sh
scoop install {package_name}
```

アンインストールは以下。

```sh
scoop uninstall {package_name}
```

他のオプションは以下の通り。

```sh
>scoop -h
Usage: scoop <command> [<args>]

Available commands are listed below.

Type 'scoop help <command>' to get more help for a specific command.

Command    Summary
-------    -------
alias      Manage scoop aliases
bucket     Manage Scoop buckets
cache      Show or clear the download cache
cat        Show content of specified manifest.
checkup    Check for potential problems
cleanup    Cleanup apps by removing old versions
config     Get or set configuration values
create     Create a custom app manifest
depends    List dependencies for an app, in the order they'll be installed
download   Download apps in the cache folder and verify hashes
export     Exports installed apps, buckets (and optionally configs) in JSON format
help       Show help for a command
hold       Hold an app to disable updates
home       Opens the app homepage
import     Imports apps, buckets and configs from a Scoopfile in JSON format
info       Display information about an app
install    Install apps
list       List installed apps
prefix     Returns the path to the specified app
reset      Reset an app to resolve conflicts
search     Search available apps
shim       Manipulate Scoop shims
status     Show status and check for new app versions
unhold     Unhold an app to enable updates
uninstall  Uninstall an app
update     Update apps, or Scoop itself
virustotal Look for app's hash or url on virustotal.com
which      Locate a shim/executable (similar to 'which' on Linux)
```

# ということで

Windows 向けのパッケージマネージャーである Scoop を紹介しました。
今まで、基本的に WSL を使って開発していたので Powershell 使いづらいなーという感覚が一気に無くなりました。GUI ポチポチもしなくて済みますし。
プロジェクトによって様々な環境で開発する必要が出てくるので、普段使わない環境でもこういったツールを使って少しでも開発しやすくしていきたいですね！

以上です。
【Vuetify3】v-dialogの開閉状態をpiniaで管理する方法

# 背景
- 複数の箇所で使用されるダイアログがあったのでコンポーネント化することにした
- ただし、ダイアログを呼び出すリンクやボタンは使用箇所によって異なるので呼び出し元はコンポーネントに含めたくない
- 上記を満たすためにはコンポーネントの呼び出し側とコンポーネント本体双方で開閉状態を操作できる必要があったため、piniaで状態管理をすることにした（emitを使う案もあったが、pinia使った方がわかりいいだろうと判断）

## 最終的なコード
```javascript
<template>
    <v-dialog :model-value="store.isShowDialog" @click:outside="store.toggleDialog()">
        <v-card>
            <v-card-title>
                <div>
                    <span @click="store.toggleDialog()">×</span>
                </div>
            </v-card-title>
            <v-card-text>
            </v-card-text>
        </v-card>
    </v-dialog>
</template>

<script setup>
const store = useXXXStore();
</script>
```
```javascript
import { defineStore } from "pinia";

export const useXXXStore = defineStore("xxx", () => {
    const showDialog = ref(false);

    const toggLpDialog = () => {
        showDialog.value = !showDialog.value;
    }

    const isShowDialog = computed(() => {
        return showDialog.value;
    });

    return {toggleDialog, isShowDialog };
});
```

## 最初のコード

```javascript
<template>
    <v-dialog v-model="store.showDialog">
        <v-card>
            <v-card-title>
                <div>
                    <span @click="store.toggleDialog()">×</span>
                </div>
            </v-card-title>
            <v-card-text>
            </v-card-text>
        </v-card>
    </v-dialog>
</template>

<script setup>
const store = useXXXStore();
</script>
```
```javascript
import { defineStore } from "pinia";

export const useXXXStore = defineStore("xxx", () => {
    const showDialog = ref(false);

    const toggLpDialog = () => {
        showDialog.value = !showDialog.value;
    }

    return {showDialog,toggLpDialog };
});
```

当初は上記のようにstateをそのまま公開していた。
これでも意図した動作になるが、カプセル化の観点から直接公開を避けて開閉状態の操作はActionを通して行い、開閉状態の取得はgetterを通して行いたかった。

## うまくいかなかったコード

```javascript
<template>
    <v-dialog v-model="store.isShowDialog">
        <v-card>
            <v-card-title>
                <div>
                    <span @click="store.toggleDialog()">×</span>
                </div>
            </v-card-title>
            <v-card-text>
            </v-card-text>
        </v-card>
    </v-dialog>
</template>

<script setup>
const store = useXXXStore();
</script>
```
```javascript
import { defineStore } from "pinia";

export const useXXXStore = defineStore("xxx", () => {
    const showDialog = ref(false);

    const toggLpDialog = () => {
        showDialog.value = !showDialog.value;
    }

    const isShowDialog = computed(() => {
        return showDialog.value;
    });

    return {toggleDialog, isShowDialog };
});
```
stateのカプセル化はできているが、このコードのようにv-modelにgetterを指定するとダイアログ外を閉じた時にエラーが発生してダイアログが閉じないといった不具合が発生する。

## 最終的なコードのポイント

- v-modelではなく、:model-valueにgetterを指定する。こうしておくと、getterは状態参照でしか使用されないのでエラーがでなくなる
- :model-valueにgetterを指定するだけだとダイアログ外をクリックした時に何も起きないので@click:outsideにActionを設定しておくことでダイアログが閉じるようになる
Teams内でダウンロード禁止フォルダを作成したい


職場でTeams内で扱うフォルダにダウンロード禁止にさせたいとの相談が
ありました。
Sharepoint内のファイルだから制限簡単にかけられるでしょ？
と思い対応したのですが、意外に情報がなく苦慮したので
情報共有することにしました。

はじめに検索して見つけたのはこちらの情報です。

Microsoft Teamsでファイルのダウンロードを禁止する
https://qiita.com/kazute75/items/554a34e67e934d9a30de

しかし、内容を見たところ組織内で管理されたデバイスでの方法でした。
これだと条件を満たせません。

つぎに見つけたのがこちら
あ、制限つきビューにすればいいのか　という気づきをもらいました。

https://deepcom.co.jp/sharepoint_document_viewonly/

しかし設定したものの、Teams上ではダウンロードが普通にできてしまいます。

その後いろいろと設定を試すものの、ダウンロードはできてしまう。
しかし、自分は方法を見つけました。
----------------------------------------------------

下記のように設定してみてください。

1.Teams内にフォルダを作成する。

2.フォルダの・・・をクリックし、アクセス許可の設定をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953003/162b389f-271f-e521-f12e-218d38319092.png)

3.Teamのメンバーの権限が　編集可能になっているので　
読み取り専用に変更する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953003/ed9fb4f3-bab3-14d7-223a-06b22c03454b.png)


4.フォルダ→・・・をクリックし、アクセス許可をクリックする。右上の・・・をクリックし、詳細設定を押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953003/87f5d798-886b-70f7-e03b-5906c5c91dbd.png)

5.メンバーを選択し、ユーザー権限の編集をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953003/fd5eb395-12f1-7c50-3f92-3708f39187dd.png)

6.閲覧から制限付きビューに変更する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953003/0e568efd-439b-da0b-f8db-ec877c9d92eb.png)

7.チームの　閲覧者に対しても　同様に制限つきビューに変更してください。
（この変更が重要でポイントでした。）

上記の操作にて、Teams内のフォルダにて、ダウンロードができないビューが適応されます。
mysql-apt-configでNO_PUBKEY

## 事象
- 2023-12-18の朝にDockerをビルドしたら、`mysql-apt-config`のインストールに失敗した。よく見たら、`NO_PUBKEY`になっている。

```bash
4.163 Hit:1 http://deb.debian.org/debian bookworm InRelease
4.163 Hit:2 http://deb.debian.org/debian bookworm-updates InRelease
4.163 Hit:3 http://deb.debian.org/debian-security bookworm-security InRelease
4.593 Get:4 http://repo.mysql.com/apt/debian bookworm InRelease [17.9 kB]
6.473 Err:4 http://repo.mysql.com/apt/debian bookworm InRelease
6.473   The following signatures couldn't be verified because the public key is not available: NO_PUBKEY B7B3B788A8D3785C
6.514 Reading package lists...
7.081 W: GPG error: http://repo.mysql.com/apt/debian bookworm InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY B7B3B788A8D3785C
7.081 E: The repository 'http://repo.mysql.com/apt/debian bookworm InRelease' is not signed.
------
Dockerfile:19
--------------------
  18 |     RUN apt purge -y mariadb*
  19 | >>> RUN wget https://dev.mysql.com/get/mysql-apt-config_0.8.26-1_all.deb \
  20 | >>>   && apt-get install -y ./mysql-apt-config_0.8.26-1_all.deb \
  21 | >>>   && apt-get update \
  22 | >>>   && apt-get install -y mysql-client
  23 |     
--------------------
ERROR: failed to solve: process "/bin/sh -c wget https://dev.mysql.com/get/mysql-apt-config_0.8.26-1_all.deb   && apt-get install -y ./mysql-apt-config_0.8.26-1_all.deb   && apt-get update   && apt-get install -y mysql-client" did not complete successfully: exit code: 100
```

## 原因と対応
- `mysql-apt-config_0.8.26-1_all.deb`が古かったらしい。最新の`mysql-apt-config_0.8.2９-1_all.deb`にしたらビルドが成功した！
書籍「伝わる・揺さぶる！文章を書く」に揺さぶられたはなし

これは、[ちゅらデータ Advent Calendar 2023 シリーズ２](https://qiita.com/advent-calendar/2023/churadata) 18日目の記事です。（担当の遠藤です）

何となく手に取った本がめちゃくちゃよかった、という話です。

きっかけ
---
ふとした時に過去の自分の文章を読むと、「何て読みづらいんだ！、あとつまらん、、」とがっかりすることが多く、自分の書いたものは見て見ぬふりをしてきました。

そんなある日、ネットで紹介されていたこの本

[「伝わる・揺さぶる! 文章を書く（山田 ズーニー  著)」](https://www.amazon.co.jp/%E4%BC%9D%E3%82%8F%E3%82%8B%E3%83%BB%E6%8F%BA%E3%81%95%E3%81%B6%E3%82%8B-%E6%96%87%E7%AB%A0%E3%82%92%E6%9B%B8%E3%81%8F-PHP%E6%96%B0%E6%9B%B8-%E5%B1%B1%E7%94%B0-%E3%82%BA%E3%83%BC%E3%83%8B%E3%83%BC/dp/4569617360)

が目に留まり、なんとなくポチって読んでみたところ、思いがけず激アツな内容で「これ国語の教科書に採用すべき！」と、ひとり盛り上がっていたのですが（正確には、家族には伝えたが無視されていた状態）、この機会にぜひみなさんにお伝えしたく記事にいたしました。

どんな本？
---
鑑賞ではなく、機能する文章を書く、というのがこの本のテーマです。

世の中ではお詫びやお願い、宣伝、募集など、さまざまな実用文書を書く機会がありますが、学校で習う詩や小説などの授業は作者の気持ちを予想してばかりで役に立ちません。

この本では自分の想いを表現するだけでなく、相手の心を動かして望む結果をだす、機能する文章の書き方を紹介する、というのがテーマです。

ただこれでは、じゃあ読んでみよう、とはならないと思うので他のhow to本とは違うところをいくつかあげてみます。
- **表紙に「編集者が選んだ名著」と書いてある**
    - 読む前からすでに名著であることが確定していてお得感あり
	- さも自分で見つけた風に書いてますが、この本かなり有名なようです、あとあと恥ずかしい思いをしそうな予感。
<p></p>

- **単なるhow to本ではなくタイトル通り揺さぶる文章で語りかけてくる**
	- あなたはhow to本で泣いたことがあるだろうか？私はあります。
<p></p>

- **著者の名前がいい**
	- ズーニー

ここが熱い！
---
この本の熱いポイントは「文章を書くには、書き手の根本思想、価値観、生き方と言ったものが大事」と著者が考えている点です。
（思想とか、生き方とか、スピリチュアルかよと警戒されるかもしれませんが大丈夫、そういうのではないです）

書き手の根本思想というのは自分自身でも気づくことが簡単ではなく、さまざまなエピソードで自身の根本思想を発見する方法が書かれています。

僕が特に気にっているエピソードをいくつかあげます。
（具体的な内容はぜひ読んでくださいませ）

- **プロローグ、ある高校生の小論文**
	- あなたはプロローグで泣いたことがあるだろうか？私はあります（しつこい）
<p></p>

- **ひと言でいうと何？要約により根本思想に気づく**
	- この手の質問する上司ウザかったけどいま自分がしてる
	- 「長いラブレターも結局は『すき』の2文字に要約されるのです」（ロマンチック要約！）
<p></p>

- **受験生からの小論文対策の質問「カギカッコでひとマス使ってもよいのか？」**
	- こんな質問への回答にも思想が？あるんです。
<p></p>

- **正直という戦略**
	- 「クライアントへの主張は通った、信頼は得た、結果は出た、でも翌日私はその仕事への興味や意欲を失っている自分に気づいた、生きるエネルギーみたいなものがしぼんでしまったような気がした」と始まるエピソード。
	- how to本でありながら「生きるエネルギーみたいなものがしぼんでしまったような気がした」って村上春樹か、とつっこみつつもエピソードは熱い！

おわりに
---
この他にもまだまだいい話がてんこ盛りです。
気が向いたらぜひ手に取ってみてください。

この文章をいつか振り返って読んだ時に自分がどう思うか、、そっと削除している可能性もありますがご容赦くださいませ

ちなみに僕には、もう一つバイブルとしている本

[「妻のトリセツ（黒川 伊保子  著)」](https://www.amazon.co.jp/%E5%A6%BB%E3%81%AE%E3%83%88%E3%83%AA%E3%82%BB%E3%83%84-%E8%AC%9B%E8%AB%87%E7%A4%BE-%CE%B1%E6%96%B0%E6%9B%B8-%E9%BB%92%E5%B7%9D-%E4%BC%8A%E4%BF%9D%E5%AD%90/dp/4065133394)

があるのですが、それはまた今度どこかで。
Runtime User Connections設定方法

# はじめに

Workatoでは、レシピ実行時に設定しているConnectionの認証情報に従ってアクションが実行されます。例えば、Slackにメッセージを投稿する際に自身の認証情報でConnectionを設定していると自身がSlackにメッセージを投稿した事になります。
しかし、「**Runtime User Connections**」という機能を使用することでレシピ実行中にConnectionの認証情報を動的に切り替えてアクションを行うことが可能です。
今回は、この機能について設定方法を説明します。

# Runtime User Connections設定方法
前提として、[「Recipe function by Workato 」](https://docs.workato.com/ja/connectors/recipe-functions.html)コネクターを使用します。
以下の図で説明します。

①呼び出す先のレシピ(子）作成後、編集画面にて「Settings」タブをクリックします。

![子レシピ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574070/f8b875d9-f2ba-8ef5-477e-a9898b538c61.png)


②「General」タブをクリックします。

![子レシピ3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574070/aba96a19-c1a8-db9c-24f0-839f7173cf89.png)


③Runtime user Connectionsにて「ONの状態」にします。

![ONOFF切り替え1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574070/6ab61b62-5240-62d5-bd03-d81a94b7e2e4.png)


④呼び出す元のレシピ(親)を作成します。

![親レシピ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574070/acd8734b-3983-ffe9-56ee-e397c536c623.png)

⑤レシピ(親)内でレシピ（子）を呼ぶ際に、「Connection overrides」の設定をします。

![オーバーライド.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574070/bcf5bbb5-f2c8-1b1f-4e35-a277e9eb769d.png)

レシピ(親)ワークフロー画面にて、「Recipe function by Workato 」コネクターを利用し、レシピ(子)を呼びます。呼ぶ際の設定にて「Connection overrides」フィールドにレシピ(子)のSlackでメッセージ投稿したいユーザーのConnectionIDを設定します。
以上で設定は完了です。

**※子レシピ自体に何か変更がかかるわけではなく、子レシピを呼び出して発生したJOBについては、その時指定した認証を使って振る舞うことができる。**

# おわりに
今回は、Runtime User Connectionsの設定方法について説明しました。
シンプルで分かりやすい機能かと思います。
ぜひお試しください。
次回は、使用場面の記事を書こうと思います。


[弊社の概要と記事一覧はこちらからどうぞ](https://qiita.com/organizations/bstylevt/profile)
AWSIM1.2.0を動かしてみたかったが動かなかった記事

# 概要
この間AWSIM 1.2.0がリリースされていたので動かしてみました。
が、タイトルの通り私のPCではうまくシミュレーターが動作しませんでした。

# 開発環境
・CPU:Ryzen 5600G
・GPU:RTX 3090
・OS:Ubuntu 22.04

# 環境構築手順
以下に記載の手順の通り

https://tier4.github.io/AWSIM/GettingStarted/UsingOpenSCENARIO/

# 環境構築の補足

1.Clone RobotecAI's Autoware and move to the directory.
で、
cd autoware
とありましたが
cd autoware-1でした。

3.Configure the environment. (Skip if Autoware environment has been configured before)
./setup-dev-env.sh
を実行しましたが依存関係の影響等々ですんなりいかず、半日ほどハマりました。
人によってはすんなりかもしれません。

1.Download AWSIM_v1.2.0_ss2.zip & Run
のRunは、
AWSIM_v1.2.0_ss2/AWSIM_v1.2.0_ss2.x86_64
を実行すれば良いと思います

# 実行
AutowareとAWSIMを実行してみます。
Autowareがすんなり立ち上がらず1分ほど立って立ち上がってきました。
自動運転が開始するはずなのですが実行されず。。。
今回はここまでです。

こんな感じ
![Screenshot from 2023-12-18 09-16-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3154772/61aeef6b-e069-0a35-2277-cce0a67fa84c.png)




スペックが足りていないと怒られていたのでそこが関係しているのかもしれません。
[ServiceNow]ユーザコミュニティで登壇してみた

# はじめに
この記事は[TDCソフト株式会社Advent Calendar](https://qiita.com/advent-calendar/2023/tdc)の21日目の記事です。

12/14に行われたServiceNowユーザコミュニティイベントに参加してみた内容とその背景を記載しています。
コミュニティイベントの詳細等に関しては、[ServiceNow Advent Calendar 2023](https://qiita.com/advent-calendar/2023/servicenow)をご覧ください。

# 初のユーザコミュニティイベントにして初登壇
今回、私はユーザコミュニティイベントに初参加させていただきました。
その中の企画のひとつ、アドベントカレンダーライトニングトークへの登壇というなかなかに勇気のいる決断を行いました。

## きっかけ
私は2020年から毎年個人的にServiceNowアドベントカレンダーを立ち上げていました。
始めたきっかけはもはや覚えていないくらいなんですが、当時ServiceNowの技術情報を調べようとすると、コミュニティ(全英語)、Docsくらいの情報しかなく、英語が不得意ということもあり、欲しい情報に辿りつくのになかなか苦労していました。
そこで、せっかくなので日本語で引っかかるような記事を書いておけば自分の備忘にもなるし、いいのでは？と思い、技術ブログならQiitaだろ→QiitaといえばAdvent Calendarじゃね？というような軽いノリで非公式でAdvent Calendarを行っていました。

毎年立ち上げはするものの、公にしているわけでも宣伝をしているわけでもないので、数名の有志のもと知る人ぞ知る的な感じで2022年まで毎年記事を書いていたんですが、なかなか時間が取れないという言い訳のもと例年記事が減っていき今年に至りました。
(毎年少なくて申し訳ないなぁ・・って気持ちでした！)

そして、今年もAdvent Calendarの季節が近づき、例年の実績を踏まえ、今年のカレンダー立ち上げるかどうしようか迷っていた最中に事件が起きます。

今年11/18に行われたServiceNow Innovation summitでの出来事です。
Advent Calendarの企画が発表され、ついに公式が始めた！とビビりました。
それとともに、過去のカレンダー晒さないで！！ってなったのも事実(笑)

それに加え、アドベントカレンダーの内容でのライトニングトークの実施ということも発表され、これはもう参加するしかないのでは？となったわけです。

しかし如何せんネタが無い！新機能を触れているわけでもないし、話せることないんじゃないのってとこで、二の足を踏んでいました。

そんな時、企画頂いている方からメッセージをいただき、より一層<strike>逃げられない</strike>やる気になったので、登壇を決めました。
そこからはネタを収集しつつ、昔からあるけど意外と知られてなさそう、でも知ってると便利なものについて話をするようにしました。
詳細については[[ServiceNow]今すぐ使える小ネタ集](https://qiita.com/tnow043/items/f257a85d3e2758ed7c3c)をご確認ください。

## LT大会の振り返り
当日は、6分間の枠で、3~40名(くらいかな？)の前でお話をさせていただきました。
やはり、同規模でも社内で話すのと勝手が違いすぎました。
ただ、初めてには規模感含めちょうどいい感じはしました。
はじめに、タイマーが動いてなかったプチトラブル(?)もありましたがなんとか時間内に終えることができたので、とりあえずは良かったです。
終わった後は、こう話せばよかった、この話仕損ねた！みたいなところがあったので、もう少し外向けに話をする機会を増やさないとなぁって感じです。次回以降に繋げられるようにしていきたい。
他の方のLTを聞いても上手に話をされている方たちばかりだったので、色々と勉強させていただきました。

# まとめ
初参加・初登壇とかなりレアなケースでしたが、登壇させてもらって非常にいい経験になりました。
やりやすい環境ではあるので、初めてにはうってつけかと思います。
ServiceNow界隈の方、悩んでいるならこの記事をきっかけにぜひ登壇を考えてみてください！
mindの研究 その44

# 概要
mindが、謎なので調べてみた。
練習問題、やってみた。

# 練習問題
mindでwindows10で、文字を赤くせよ。

# サンプルコード

```


バイト化とは
　変換後は　文字列実体
　数１は　変数
　数１に　入れ
　変換後を　クリア
　数１を　０ＦＦＨと　ANDし　変換後に　一文字追加し
　変換後を　返すこと
。

メインとは
　結果は　変数
　ターゲットは　変数
　結果xは　変数
　結果yは　変数

　-11をつみ
　"kernel32"と　"GetStdHandle"で　ＡＰＩ呼出し１　結果に　入れ
　エラー？
　ならば
　　エラー文字列を　一行表示し　終り
　つぎに
　結果を　ターゲットに　入れ
　結果を　数値表示し　改行し

　ターゲットをつみ
　結果xの　アドレスをつみ
　"kernel32"と　"GetConsoleMode"で　ＡＰＩ呼出し２　結果に　入れ
　エラー？
　ならば
　　エラー文字列を　一行表示し　終り
　つぎに
　結果xを　００４Ｈと　ORし　結果xに　入れ
　結果xを　数値表示し　改行し


　ターゲットをつみ
　結果xをつみ
　"kernel32"と　"SetConsoleMode"で　ＡＰＩ呼出し２　結果に　入れ
　エラー？
　ならば
　　エラー文字列を　一行表示し　終り
　つぎに

　27を　バイト化し　表示し
「[31mred text」を　表示し
。






```

以上。
Laravel9でつぶやきサイトを作ってみる。

# はじめに

naritomoと申します。

本職はインフラエンジニアを行っています。
Laravel9つぶやきサイトについてテスト公開してみたので、
ソースも公開したいと思います。

[つぶやきアプリ](https://www.naritomo.site/tweet/)
＊開発中のため予告なしに内容の消去、公開停止を実施いたします。

いろいろアドバイスいただけると嬉しいです。

## 立ち上げ概要

Laravel9tubuyakisaitoソースを入手し、
ローカル環境でデプロイするものとなります。

必要なソースは以下にまとめてあります。

dockerソース

https://github.com/naritomo08/laravel_docker

つぶやきサイトソース

https://github.com/naritomo08/laravel9tubu

## 参考書籍

[プロフェッショナルWebプログラミング　Laravel](https://www.amazon.co.jp/gp/product/B09WMN18TR/ref=ppx_yo_dt_b_d_asin_title_351_o03?ie=UTF8&psc=1)

## 事前準備

mac+DockerCompose+vscode+gitでの環境を構築してること。
*Windowsでもwsl2＋Ubuntuで実施可能。

## 環境構築手順

### ベースリポジトリをクローンする。

```bash
$ git clone -b php8.2 https://github.com/naritomo08/laravel_docker.git laraveldocker
$ cd laraveldocker
$ rm -rf .git
$ git clone https://github.com/naritomo08/laravel9tubu.git backend
$ cd backend
$ rm -rf .git

* devlopブランチにmix化、breeze導入、tailwindcss導入しただけのまっさらなのも用意しています。
　　　以下のコマンドで導入可能。

git clone -b devlop https://github.com/naritomo08/laravel9tubu.git backend
```

最後の.git削除コマンドについて、
別途devlopブランチに元のLaravel9から以下の
対応をしたソースを置いています。

* Laravel MIX化
* breeze(認証機能)導入
* TailwindCSS 導入

これを元に新たに開発いただいても構いません。

このブランチを使用して新規開発したい場合、以下のコマンドを入力してから.gitを削除してください。
```bash
$ git checkout -b develop remotes/origin/develop
```

### .env.exampleファイルを編集する。

```bash
$ cd ../
$ vi .env.example

以下の内容に編集を行う。

APP_DEBUG = false
QUEUE_CONNECTION=database
```

### 環境構築用のシェルスクリプトを実行する。

```bash
$ chmod u+x build_env.sh && ./build_env.sh
```

### ファイルパーミッションを更新する。

```bash
$ chmod u+x set_permission.sh &&  ./set_permission.sh
```

### サイト設定を行う。

```bash
PHPコンテナログイン
$ docker-compose exec laravel_php /bin/bash
$ cd project

$ php artisan migrate

*パブリック画面ファイル作成初回時以下のコマンドを実施
$ chmod -R a+x node_modules

パブリック画面ファイル作成
$ npm run prod
つぶやき機能投稿画像参照リンク作成（新たに開発する場合は必要なし）
$ php artisan storage:link
Laracvelキャッシュクリア
$ php artisan cache:clear
$ php artisan config:clear
$ php artisan route:clear
$ php artisan view:clear
変更ファイル戻し
$ git checkout .
```

### 各種サイト確認する。

## サイトURL

### laravel

http://127.0.0.1:8080/tweet

### adminer(DB管理ツール)

http://127.0.0.1:8081


* ログイン情報
  - サーバ: laravel_db
  - ユーザ名: laravel
  - パスワード: password
  - データベース: laravel

### mailhog(メールサーバ)

http://127.0.0.1:8025


## コンテナ起動する方法

`docker-compose.yml`が存在するフォルダーで以下のコマンドを実行する。

```bash
$ docker-compose up -d
```

## コンテナ停止する方法

`docker-compose.yml`が存在するフォルダーで以下のコマンドを実行する。

```bash
$ docker-compose stop
```

## コンテナ削除する方法

`docker-compose.yml`が存在するフォルダーで以下のコマンドを実行する。

```bash
$ docker-compose down
```

## 起動中のコンテナに入る

### PHPコンテナ

```bash
$ docker-compose exec laravel_php /bin/bash
```

### DBコンテナ

```bash
$ docker-compose exec laravel_db /bin/bash
```

## その他

開発中に以下のコマンドを実行してください。

```bash
$ docker-compose exec laravel_php /bin/bash
$ cd project

$ npm run watch
```

#### npm run watchコマンドとは

npm run watchコマンドはターミナルで実行し続け、関連ファイル全部の変更を監視します。
Webpackは変更を感知すると、アセットを自動的に再コンパイルします。

## このソースをAWS(ECS)に展開したい場合

backendフォルダに展開されているソースについて、
以下のページを参考にAWS(ECS)へ展開することもできます。

https://qiita.com/naritomo08/items/6e38955145d80c1435bd


# おわりに

これが他のLaravel9を扱う方の助けになればと思います。
フロントの変更が画面に反映されない！？

# はじめに

いつものようにsls deployを行ってフロントの変更を確認しようとしたところ、変更が反映されていないことがありました。

# フロントの変更が画面に反映されない！？

serverless.ymlに以下のように記載をすることで解決できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889192/276aff87-14da-7cb2-ac94-0538f072e7f2.png)

公式ドキュメントに推奨オプションと記載がありました。

https://www.serverless.com/framework/docs/providers/aws/guide/deploying


# おわりに
最初からでなく急に反映されなくなったのが気になります。
DockerとLaravelを使ったhttpsのlocal環境構築

# はじめに
こんにちは、オールアバウトエンジニアの@monpei68です。
[本記事はAll About Group（株式会社オールアバウト） Advent Calendar 2023](https://qiita.com/advent-calendar/2023/allabout)の20日目の記事です。

普段の業務ではLaravelを使ったアプリケーションの開発をしております。
業務の中でhttps化したlocal環境で動作検証したいことがあり、環境構築をしました。
今回は、その構築の仕方ついて紹介できればと思います。

# 環境
- OS：`Mac`
- Dockerイメージ：`php:8.2.8-apache-bullseye`

# 証明書に関して

Homebrewを使ってmkcertをインストールします。
（mkcert以外にも証明書を作成する方法は色々ありますが、一番お手軽にできそうなmkcertがおすすめかなと思います。）

```
brew install mkcert
```

mkcertインストールできましたら、証明書の発行をします。

```
mkcert localhost
```

上記コマンドを実行すると下記のファイルが作成されます。
- `localhost.pem`
- `localhost-key.pem`

作成されたファイルの置き場所は、後述する「ディレクトリ構成」を参考にしてください。

## 備考
- [mkcert](https://github.com/FiloSottile/mkcert)に関して
- Homebrewをインストールしていない場合は、[こちら](https://brew.sh/ja/)からインストールできます。


# ディレクトリ構成

今回は下記のようなディレクトリ構成で作成しました。
```
# ディレクトリとファイル構成

├── docker-compose.yml
└── docker
    └── web
        └──Dockerfile
        └──default-ssl.conf
        └──app.conf
        └──certs
            └──localhost-key.pem
            └──localhost.pem
        
```
では、それぞれのファイルで追加したコードについて説明します。

# 各ファイルについて
## docker-compose
```docker
web:
 build: docker/web
 ports:
  - "8443:443"
 volumes:
  - ./docker/web/default-ssl.conf:/etc/apache2/sites-available/default-ssl.conf
```
docker-composeの`ports`にhttps通信のための443を指定します。

## Dockerfile
HTTPS通信に必要なApacheのモジュールの有効化と、default-ssl.confの有効化を行います。

```
FROM php:8.2.8-apache-bullseye

# 省略
COPY ./app.conf /etc/apache2/sites-available/app.conf
RUN a2enmod rewrite && a2enmod ssl && a2enmod socache_shmcb
COPY ./certs/*.pem /etc/apache2/ssl/
RUN a2ensite default-ssl
＃ 省略

```


## default-ssl.confの作成

default-ssl.confを下記のexampleをコピーして作成します。

https://gist.github.com/devlim/5b7e09ba17f2ee2abcfcd80d69cb19eb#file-default-ssl-conf

コピー後、一部コードの変更をします。

```
# 32行目
SSLCertificateFile /etc/apache2/ssl/localhost.pem
# 33行目
SSLCertificateKeyFile /etc/apache2/ssl/localhost-key.pem
```

サーバ証明書と秘密鍵のファイルパスの指定を、mkcertで作成した証明書を参照するように変更します。

## app.conf
最後にアプリのconfigファイルのコードを下記に変更します。

```
<VirtualHost *:443>
  ServerName localhost
  DocumentRoot /app/web/public

  SSLEngine on
  SSLCertificateFile /etc/apache2/ssl/localhost.pem
  SSLCertificateKeyFile /etc/apache2/ssl/localhost-key.pem

  <Directory /app/web/public>
    Options +FollowSymLinks

    AllowOverride All
    Require all granted
  </Directory>

</VirtualHost>
```
各ファイルの変更は以上になります。
コンテナを起動して確認してください。

# 最後に
今回はhttps化したlocal環境の構築について紹介しました。
この記事がどなたかのお役にたてれば嬉しいです。
社内ギルド活動を通じて学んだこと

:::note info
[atama plus Advent Calendar 2023](https://qiita.com/advent-calendar/2023/atamaplus) 20日目です。
:::

こんにちは！atama plusのigawyです。
本記事ではatama plusのエンジニア横断組織であるギルドの紹介と、ギルド活動を通じて学んだことを書いていきます。
組織横断課題に対する体制面からのアプローチの一つとして参考になれば幸いです。

## ギルドとは？

atama plusにおけるギルドは、以下のコンセプトを持つ組織体です。
- 特定テーマに関して、必要な観点を網羅したメンバーが合議を行う
- 特定テーマに関する定点観測と方向づけ、優先順位判定を行う

ギルドの活動は目的によって様々ではありますが、Spotifyモデルにおけるギルドと近しいものになっています。

## ギルド発足の背景
atama plusでは、開発の規模が大きくなり複雑性が増していく中で、組織横断的な課題が表出してきました。これらの課題は、課題の性質上開発チーム単独では取り組みにくく、解決へのアプローチに工夫が必要になっていました。
そこで、このような課題に対応することを目的としてギルドが発足しました。

発足当初はエンジニアのみでギルドを運営していましたが、現在では他の職種もメンバーに加わり、ギルドの数もかなり増えてきました。この記事を執筆している時点では社内に11のギルドがあり、エンジニアだけでなくQA、UXデザイナー等が関心のあるギルドに参加しています。

なお、発足当初はこの組織体のことを「委員会」と呼んでいましたが、後にギルドという名前に変更しています。atama plusはゲーム好きな社員が多いため、とても好評です。

さて、以降ではギルドの一例として、私が所属している自動テスト推進ギルドの活動について紹介します。

## 自動テスト推進ギルドの活動

### ギルドの目的
自動テスト推進ギルドは、自動テストの重要性と保守性を組織・チームが理解し、改善努力を継続的に行える文化を醸成するための体制を整えることを目的として活動しています。
atama plusでは用途に合わせてテストフレームワークを使い分けています。そこで、テストフレームワークごとの知見を溜めつつ、品質の高いプロダクトを提供していくためにatama plusとしてどのようなテスト文化を醸成していくかを議論しています。

### 体制
先ほど述べた通り、社内では複数のテストフレームワークを扱っているため、フレームワークごとにギルドの分科会的位置付けであるパーティーを組成しています(パーティーの有無はギルドによって異なります)。本ギルドでは、Playwrightパーティー、Jestパーティー、pytestパーティーという３つのパーティーが活動をしています。また、ギルド/パーティーにはエンジニアだけでなくQAも参画しています。
（Playwrightの記事は21日目にギルドメンバーの@ikegagagamiが、Jestの記事は24日目に同じくギルドメンバーの@pandineerが執筆予定です。お楽しみに！）

### 活動内容
ギルドの活動内容の一部を紹介します。
1. テストに関する全体方針の議論
社内プロダクトにおけるテストの種類や前提となる考え方を合わせるところから始めました。前提知識を揃えた上で、社内のテスト状況を把握しながら、今後の方針について議論しています。
1. コードカバレッジの収集と活用方法の検討
現在はCodecovを利用して、週次でカバレッジを収集しています。品質の高いプロダクト開発をするためのデータの一つとして、カバレッジをどう活用していくか検討を進めています。
1. テストに関する知見や取り組み共有
テスト作成者向けのドキュメントが充実しているパーティーの取り組みや、良い取り組みをしているチーム活動の共有をして知見を溜めています。また、Playwrightを使ったE2EテストはQAが先行してテストを作成してきたため、エンジニアにも広げるための勉強会を企画しています。

## ギルド活動を振り返って

これまでのギルド活動を振り返ってみて、良かったこと、これからの課題を述べていきます。
### 良かったこと
- 大きめの課題の相談先がわかりやすくなった
ギルド全般に関して、チームで知見がないトピックや詳しい人に聞きたいことがあった場合に、相談を投げ込みやすくなったと感じています。誤解のないよう補足しておくと、atama plusのエンジニアは誰かが困っているとすぐにサポートしてくれるので、すごいスピードで課題が解決していきます。ただ、根本的な課題の検討や施策の実施が必要な場合は、このような組織があることで議論しやすくなっていると感じています。


- テストを書くことに対する機運が高まった
これは自動テスト推進ギルドの振り返りです。もともとテストに対してネガティブなイメージはありませんでしたが、ギルドメンバーによる布教活動により、これまでテストがなかった部分にもテストが書かれるなど、良い影響が出てきています（弊社ではテストを書かないと@t_wadaさんのライオンではなくパンダ（@pandineer）が登場します）。


- （良い意味で）競争心が生まれ、課題を解決したことも
atama plusではCIで自動テストを実行していますが、時間のかかるテストがありました。一時期、Jestとpytestでテスト実行時間削減の~~煽り合い~~競争が発生し、その結果、それぞれのテスト実行時間が半分以下になりました。
これまでは、テスト実行時間が長いという課題があった場合、エンジニア全体での課題認識はされますが、具体の検討は該当するテストをかいた人やスポットでの取り組みとなることが多かったと思います。ギルドやパーティーができたことにより、このような課題に取り組みやすくなったと感じています。

### これからの課題
これまで知見の共有が中心になっていましたが、テスト戦略についてはまだまだ議論ができておらず、目的に掲げたテスト文化醸成まで至ってません。今後も継続して議論していきたいです。

## まとめ

本記事ではatama plusのエンジニア横断組織である社内ギルド制度について紹介しました。自分のチーム以外のメンバーとの交流も楽しいので、ギルド活動を今後も継続していきたいと思っています。
この記事が組織横断課題へのアプローチの一つとして参考になれば幸いです。
明日は@ikegagagamiさんよる「開発プロセスでPlaywrightを活用して自動化を進めている話」です。
自動テスト推進ギルドでもホットな活動をしているPlaywrightに関する記事です。ぜひご覧ください！
iPhoneで動物を検出する

iPhoneやiPadのカメラ、画像から犬と猫を検出できます。
![inu.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/a740a9a5-aef9-01a5-8e68-7f4c92d763a5.jpeg)

```swift
let request = VNRecognizeAnimalsRequest()
let handler = VNImageRequestHandler(cgImage: cgImage)
do {
    try handler.perform([animalRequest])
    guard let results = animalRequest.results else { return }
    for result in results {
        let label = result.labels.first?.identifier // "Dog" or "Cat"
        let box = result.boundingBox // normalized box
        let flippedBox = CGRect(x: result.boundingBox.minX, y: 1 - result.boundingBox.maxY, width: result.boundingBox.width, height: result.boundingBox.height) // flip top bottom because observatios's min_y is bottom.
        let boxInImage = VNImageRectForNormalizedRect(flippedBox, Int(image.size.width), Int(image.size.height)) // denormalize to image coords.
    }
} catch let error {
    print(error)
}
```

結果のボックスは上下逆になっているため、ひっくり返す必要があります。
また、0~1の座標に正規化されているため、画像やviewのサイズに戻します。

🐣
****
フリーランスエンジニアです。
AIについて色々記事を書いていますのでよかったらプロフィールを見てみてください。

もし以下のようなご要望をお持ちでしたらお気軽にご相談ください。
AIサービスを開発したい、ビジネスにAIを組み込んで効率化したい、AIを使ったスマホアプリを開発したい、
ARを使ったアプリケーションを作りたい、スマホアプリを作りたいけどどこに相談したらいいかわからない…

いずれも中間コストを省いたリーズナブルな価格でお請けできます。

お仕事のご相談はこちらまで
rockyshikoku@gmail.com

機械学習やAR技術を使ったアプリケーションを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
未経験時代からUdemyさんに助けられてきた私のおすすめ講座

### はじめに

「Udemyオススメ講座をシェアしよう！ by Udemy Advent Calendar 2023」の18日目の記事です。

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

未経験の時代から今でもUdemy使わせてもらってます！！

買ってやってない講座もたくさんあります！！！←😤ﾄﾞﾔw
（セール中に気になる講座、ついついたくさん買ってしまう・・）



ということで、今までやった講座の中で「購入して良かった、やって良かった」[Udemy講座](https://www.udemy.com/)紹介して行きます:raised_hand:

https://www.udemy.com/

### おすすめUdemy講座

#### Git編

https://www.udemy.com/course/unscared_git/

Gitでやらかして一度は「怖い〜」と思ったことありませんか？:frowning2:私はあります。
山浦さんのGit講座はGitコマンドや使い方だけでなく、Git自体の仕組みを図解で丁寧にわかりやすく説明してくれていておすすめです！

#### Java/SpringBoot編

javaの学習してた時はあまりUdemyの日本語教材なくてウズウズさんの動画にはお世話になりました！
あと、YouTubeもめっちゃわかりやすくてよく見てました。
初学者さんにもおすすめなんですが、セールで値引きはされないのがショックです。w
でも元値もそこまで高くないので買っては損はないかと。

https://www.udemy.com/course/youtubejava5-web/

今いる会社に転職したとき、前の会社の環境がとてもレガシーだったのでInteliJの使い方や
OpenAPIでの開発の勉強にとても役立ちました！
Java以上にSpringbootは日本語教材が少ないのでこうゆう動画を作ってくださるのはありがたいです・・:cry:

https://www.udemy.com/course/poco-tech-spring-boot-web-api/

https://www.udemy.com/course/poco-tech-intellij/

テストコードを書いたことがなかったときに英語教材ですが、字幕をつけて学習しました。
テストのやり方、書き方をとても丁寧に解説しているので翻訳でもわかりやすく初学者にもおすすめです。

https://www.udemy.com/course/testing-java-code-with-junit-5-and-mockito/

上記の動画で学習した時に書いたQiitaもあるので良かったら参考にしてください:relaxed:

https://qiita.com/annayamamoto/items/cf16379067c5a6297e67




#### アジャイル開発編

アジャイルで開発したことがなかった時にこの動画を見ました！
酒井さんはシリコンバレーでアジャイルの開発経験がありYouTubeにも動画を出しています。

アジャイル開発って何、何すんねんって人におすすめです。アジャイル、スクラムの知識や
使うツールなどアメリカと日本の違いとかもお話しされていて面白いです！
個人的にコーヒーブレイクのシリコンバレーのオフィス街の動画が一番好きです:angel_tone1:（そこかい）

https://www.udemy.com/course/ajail-scrum/

この動画を参考にして書いた記事もあります！

https://qiita.com/annayamamoto/items/469959e210d8b7eadd36


#### figma編

figmaでUIデザインやってみたい方におすすめです！
基本的なことから応用、プロトタイプ作成までこれ一つで結構使えるようになる:v_tone2:

https://www.udemy.com/course/figma-app-design/

#### flutter編

flutterラボさんの動画もわかりやすくていいのですが、
一つ一つの講座が短いのでflutterラボでに入って見放題の方がいいのではと思ったので
Udemy講座はあまり買ったことがないです:santa_tone1:

個人的にflutterでめっちゃわかりやすくて勉強にもなったなと思ったのは
さくしんの講座です！riverpodでの状態管理やテストまで紹介されています。バージョンは少し古いですがわかりやすくおすすめです。

https://www.udemy.com/course/riverpod/

ちなみにUdemyではないけどYouTubeに動画出してる[ルビーDog](https://www.youtube.com/results?search_query=%E3%83%AB%E3%83%93%E3%83%BCDog)さんの動画は
めちゃくちゃわかりやすくてよく見てます。普通に有料級ではと思うくらいわかりやすくて好きです


### やってないけど気なってるUdemy講座

figmaのwebサイトデザイン講座。最高評価なので気になる・・

https://www.udemy.com/course/figmabeginner/

書籍ではよくこうゆうの見るけど、動画教材もあるんだ。。と思ったので気になる・・

https://www.udemy.com/course/clean-code-tutorial/

なんかみのるコーチさんが出してる動画めっちゃ高評価やから気になる・・

https://www.udemy.com/course/java-obj-basic/


### さいごに

最後まで、ご覧いただきありがとうございました！:santa::clap:
改めて自分が何をUdemyで学習してきたのか振り返りになったし、

自分が学習していた時にはなかった、もっと良さそうな講座がたくさんあって
良い教材が増えているのはすごくいいなあと思いました:relaxed:

これからもUdemy愛用します:v:
Pythonのstatsmodesの重回帰分析の回帰係数が摩訶不思議な値になる問題の原因と対策

# 概要

- Pythonの統計解析statsmodelsで重回帰分析を行っていたら，あるサンプル数以上から回帰係数が正しく出力されないという現象に出会ったので，その原因と対策について共有します．
- 結論をざっくりいうと，原因は（たぶん）因子であるカテゴリ変数をOne-Hotエンコーディングをしていたことで，対策は因子ごとのダミー変数を1つずつ抜くことです．

# 起こった問題

A, B, C, D, 4つの因子に対してそれぞれa, b, cという水準(値)を取りうるデータとその評価点（1から7の数値）があるデータに対し, 各因子の値を説明変数，評価点を目的変数としてPythonのstatsmodeslで重回帰分析をすることで，各因子の値が評価点にどのように影響を与えるかを分析していました．（抽象的でスイマセン...．要は得点評価法を用いたコンジョイント分析です）

下記のような感じでカテゴリ変数である因子A, B, C, Dを0または1の値を取るダミー変数(A_a, A_b,...)に置き換えました．いわゆるOne-Hotエンコーディングというものです[参考2]．

 
    df_x2 = pd.get_dummies(df_x[['A','B','C','D']])
 

置き換えたデータに対して，次のように最小二乗法による重回帰分析を実行した結果, あるサンプル数まではそれっぽい結果を出すのですが，それを超えると不可思議な結果を出すようになりました．

    
    model= sm.OLS(df_y, sm.add_constant(df_x2))
    result = model.fit()
    result.summary()
   
サンプル数が842まではこんな感じなのですが...


![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2706299/802a3ef6-18d7-6e09-e37b-e62300309347.png)


サンプル数が843を超えると...

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2706299/968110e8-08c6-4f8d-3bec-4ba2c13cbfda.png)



こんな感じで, 1サンプル増えただけなのに回帰係数が大きく変わって，しかも同じ因子から作ったダミー変数の回帰係数がまったく同じ値になるという謎現象が起こりました（涙）．この謎の閾値はデータの値によって違いましたが，データ数が増えると似たような現象が起こることは同様でした．

# 原因と対策

どうにも問題が解決しなかったので，Rの方で同様の重回帰分析を行った結果，次のようになりました．

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2706299/0f489825-0f4a-a505-34d3-5df27d19ea79.png)

"NA"という値が含まれていました．これはある説明変数が他の説明変数で完全に説明できることを意味しています[参考3]．重回帰分析では説明変数間に相関があると多重共線性により正しい結果が出ないため，説明変数から除く必要があります（...そうだった）．
※ これとは別に，各説明変数の多重共線性をチェックする必要があります[参考4]. いっぺんにやってくれてもいいのに．

このRが自動でやってくれている処理を手動でやってあげる（データから各因子ごとにダミー変数を1つずつ抜いてあげる）とstatsmodelsでもRと同じ結果を出力するようになりました．

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2706299/578f1603-a37d-f456-891e-668f2ce1e384.png)

回帰係数が最初の図とずいぶんと変わったように感じるかもしれませんが，これは各説明変数の意味が変わるからです．

今回の教訓は"One-Hotエンコーディングしたデータを，そのまま重回帰分析に喰わすな"ということでした．

# おまけ

statsmodesのGithubのissue，なんと2.5k（2500件！？）ありました@@;．Tensorflowをはじめとした最新の機械学習のライブラリを使うならPythonが超絶便利ですが，クラシックな統計解析は，昔からあるRなどの統計解析ソフトを使う方が動作が安定していてよいのかな～と思いました．どなたかのご参考になれば幸いです．

今回はコンジョイント分析のやり方自体は説明しませんでしたが，次回はコンジョイント分析のやり方についてまとめて書いてみようと思います♪

# 参考

以下のサイトを参考にさせて頂きました．ありがとうございます．

- 参考1: GitHub - statsmodels/statsmodels: Statsmodels: statistical modeling and econometrics in Python
    - https://github.com/statsmodels/statsmodels
- 参考2: ダミー変数（One-Hotエンコーディング）とは？実装コードを交えて徹底解説
    -　https://www.codexa.net/get_dummies/
- 参考3: r - Rで重回帰分析を行った際のNA値について - スタック・オーバーフロー
    - https://ja.stackoverflow.com/questions/35536/r%E3%81%A7%E9%87%8D%E5%9B%9E%E5%B8%B0%E5%88%86%E6%9E%90%E3%82%92%E8%A1%8C%E3%81%A3%E3%81%9F%E9%9A%9B%E3%81%AEna%E5%80%A4%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6
- 参考4: 多重共線性をRでチェックする ― RでVIFを計算するには？ - 統計ER
    - https://toukeier.hatenablog.com/entry/how-to-calculate-vif-by-r/
文庫版小説同人誌をRe:VIEWで作る

# はじめに

[「るいざ・しゃーろっと」というバーチャルの人格](https://vrchat.com/home/user/usr_fff0928f-5117-41de-ba4d-99280cd9a8c7)で小説を書いているIosifです。  
だいたい井の頭公園駅を舞台とした小説を書いており、以下のような作品を作っております。

https://huidetang.booth.pm/items/5003660

https://huidetang.booth.pm/items/5249081


なぜここが舞台なのかはこの記事に書いてあります。

https://note.com/louisa_charlotte/n/n239ae52311a0

それで、今回はこの小説同人誌をなぜRe:VIEWで書いたのか紹介します。

## 行っていること

基本的に以下の記事で紹介したテンプレートを使っています。

https://qiita.com/huideyeren/items/15649b076782813975c1

基本的にはこのテンプレートでGitHub ActionsとRe:VIEWを使って本を作れる状態にはなります。

しかし、今回、作るのは文庫本です。なので、次のような設定変更が必要になりました。

### 小説本に索引は不要

このテンプレートは評論本で使うために作られたものですが、小説本には索引は不要ということで索引を消しています。基本的には `catalog.yml` で索引の指定を消し、 `config.yml` で設定をオフにしています。

### 本文モノクロ対応の方式を変更

私が作っている[anshitsu](https://github.com/huideyeren/anshitsu)というライブラリで色を変換することにしています。これによって簡易的なコントラストの変更が可能になりました。

### 文庫版に合わせる対応

文庫版はA6判なのですが、かなり小さいです。紙用は以下のような前提で組み直しています。

- フォントは8ポイントを基準とする
- 1カラム構成

なお、電子版には制約がないのでA5版で組んでいます。本体はEPUBも付けたかったのですが、うまくいきませんでしたので電子版の頒布はPDFのみとなっています。

また、扉の表示を調整して文庫サイズに収まるようにになっています。

## 完成した本

ほぼ完売状態の第2巻のリポジトリを貼り付けておきますので、ご参考にどうぞ。

https://github.com/huidetang/LouisaCompleteWorksVol2

他にも改変したところはいろいろありますが、次の作品では分量もさることながら執筆方法や組版方法もいろいろ改善し、よりよい作品作りができればと思います。
シングルサインオンは、Keycloakで解決！

既に普及済みですが、シングルサインオンにKeycloakを使う方法について整理しました。
![名称未設定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/127e7a6c-593c-a6ec-a444-27624c4e64e8.jpeg)

# Keycloakとは

Keycloakは、Red Hatが開発・提供するオープンソースのIDaaS（Identity as a Service）です。IDaaSとは、ID管理やアクセス制御などの機能をクラウドサービスとして提供するものです。

Keycloakの主な機能は、以下のとおりです。

* シングルサインオン（SSO）：複数のアプリケーションやサービスに、1つのIDとパスワードでアクセスできるようにする機能です。
* 多要素認証（MFA）：IDとパスワードに加えて、別の要素（例えば、ワンタイムパスワードや指紋認証など）を組み合わせて認証する機能です。
* アクセス制御：ユーザーやグループごとに、アプリケーションやリソースへのアクセス権限を定義する機能です。
* ユーザー管理：ユーザーの登録や削除、パスワードの変更などの管理を行う機能です。

Keycloakは、オープンソースで提供されているため、コストを抑えて導入・運用することができます。また、柔軟なカスタマイズが可能で、企業のニーズに合わせた環境を構築することができます。

## Keycloakの特徴

Keycloakの特徴は、以下のとおりです。

* オープンソースで提供されている
* 柔軟なカスタマイズが可能
* 標準的な認証プロトコルに対応している

## Keycloakの導入・運用

Keycloakの導入・運用の流れは、以下のとおりです。

1. Keycloakをインストールします。
2. ユーザーやグループを作成します。
3. アプリケーションやサービスをKeycloakに登録します。
4. ユーザーにIDとパスワードを配布します。

Keycloakの導入・運用に関する情報は、公式ドキュメントやオンラインコミュニティなどで公開されています。

## Keycloakの導入を検討する際に考慮すべき点

Keycloakの導入を検討する際には、以下の点を考慮するとよいでしょう。

* 利用環境：オンプレミス環境で利用するのか、クラウド環境で利用するのかを検討します。
* 機能要件：必要な機能を明確にします。
* コスト：コストを抑えるために、OSS版と商用版のどちらを利用するかを検討します。

## Keycloakでは、認証トークンチェック
Keycloakでは、認証トークンを使用して、クライアントアプリケーションからリソースへのアクセスを制御します。認証トークンチェックとは、クライアントアプリケーションから渡された認証トークンの有効性を確認する処理です。

Keycloakで認証トークンチェックを行うには、以下の手順が必要です。

1. Keycloakの管理コンソールから、トークンエンドポイントのURLを取得します。
2. 認証トークンを取得します。
3. 取得した認証トークンを、トークンエンドポイントにリクエストします。
4. Keycloakから返されたレスポンスで、トークンの有効性を確認します。

具体的な手順は、以下のとおりです。

1. Keycloakの管理コンソールから、トークンエンドポイントのURLを取得します。

管理コンソールの左側のメニューから、「Security」→「Tokens」→「Token Endpoint」を選択します。

「Token Endpoint URL」の値が、トークンエンドポイントのURLです。

2. 認証トークンを取得します。

クライアントアプリケーションから、Keycloakに認証を行い、アクセストークンを取得します。

3. 取得した認証トークンを、トークンエンドポイントにリクエストします。

HTTPクライアントを使用して、トークンエンドポイントにリクエストを送信します。

リクエストのメソッドは、POSTです。

リクエストのヘッダーに、Authorizationヘッダーを設定します。

Authorizationヘッダーの値は、bearerトークン形式で、取得した認証トークンを指定します。

```
Authorization: Bearer <アクセストークン>
```

4. Keycloakから返されたレスポンスで、トークンの有効性を確認します。

Keycloakから返されたレスポンスのステータスコードが200の場合、トークンは有効です。

レスポンスの本文には、トークンの有効期限などの情報が含まれます。

トークンの有効期限が切れている場合は、トークンを更新する必要があります。

また、トークンが不正である場合は、トークンを拒否します。


## Bearerトークン形式について

Bearerトークン形式は、認証・認可に使用されるトークンの形式の1つです。Bearerトークンとは、トークンを保持している者に対してアクセス権限を与えるトークンのことです。

Bearerトークン形式は、Authorizationヘッダーにトークンを指定することで使用します。Authorizationヘッダーの値は、以下のとおりです。

```
Authorization: Bearer <トークン>
```

<トークン>には、Bearerトークンの値を指定します。Bearerトークンは、通常、Base64でエンコードされた文字列です。

Bearerトークン形式は、以下の利点があります。

* トークンを保持している者に対してアクセス権限を与えるため、トークンの所有者を特定する必要がありません。
* トークンをHTTPヘッダーに指定するため、リクエストボディにトークンを含める必要がありません。

Bearerトークン形式は、OAuth 2.0やOpenID Connectなどの認証プロトコルで使用されています。

Bearerトークン形式の具体的な使用例としては、以下のようなものが挙げられます。

* アプリケーションへのアクセス制御
* APIの呼び出し
* ファイルのダウンロード

Bearerトークン形式を使用する際には、以下の点に注意する必要があります。

* Bearerトークンは、第三者に盗まれた場合、悪意のある第三者による不正アクセスにつながる可能性があります。
* Bearerトークンの有効期限を設定することで、トークンが有効期限切れになった場合に、不正アクセスを防ぐことができます。

## Keycloakのまとめ

Keycloakは、柔軟性と拡張性に優れたIDaaSです。自社のニーズに合った環境を構築することで、セキュリティの強化や利便性の向上を実現することができます。
Keycloakは、Red Hatが開発・提供するオープンソースのIDaaSです。IDaaSとは、ID管理やアクセス制御などの機能をクラウドサービスとして提供できます。

# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
IT エンジニアとそれ以外の人達は違う人種なのか【改訂版】

 「なぜエンジニア組織をうまくマネジメントできないのか」という記事が人気になっていました。個人的に ITエンジニアの人間性の違いというより、ITエンジニアを取り巻く環境が少し特殊だと感じています。ここではITエンジニアが置かれている環境と、ITエンジニアの振る舞いについて説明します。

# ITエンジニアが置かれている環境
## IT 環境は数カ月ごとに更新される→頻繁に道具を更新している
iPhone は毎年新モデルが発売されます。Windows は2年に１回大規模バージョンアップが行われます。人気のプログラミング言語の Python は毎年1回バージョンアップします。マイクロソフト社のプログラミング言語の TypeScript は毎日リリースされます。

ITエンジニアは周囲の人から「パソコンの先生」として期待されることもあり、最新技術の習得に熱心です。一般の人から見ると、機器を数カ月ごとに買い替えるのは、子供がおもちゃに飽きて捨てているのと同じように見えるかもしれませんが、本人はスキルアップのための必要投資として仕方なくやっている面もあります。

## プログラム言語には哲学がある→ITエンジニア同士で宗教論争をしている
現在、プログラミング言語は200種類から300種類あると言われています。ひとくくりに、ITエンジニアといっても扱えるプログラミング言語は様々です。

ビジネス誌の日経クロステックが実施しているアンケートによると、「基幹系システムは Java言語が多い」「組み込み系システムは C言語の割合が70%を超える」「AI系システムはPythonが80%を超える」「Webフロントエンドは群雄割拠」となっています。

[開発対象システム別の利用言語の比率](https://qiita.com/mmake/items/68cc8f07331e0ef8ce50#%E9%96%8B%E7%99%BA%E5%AF%BE%E8%B1%A1%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E5%88%A5%E3%81%AE%E5%88%A9%E7%94%A8%E8%A8%80%E8%AA%9E%E3%81%AE%E6%AF%94%E7%8E%87)
![56_NikkeiXtech.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/775e6497-85c1-3179-2692-490599993f63.png)

また、Paiza によるとプログラミング学習者・転職希望者の内、最も習得割合が多いのは Java で 33% になります。
[プログラミング言語の基礎知識保有者の割合](https://qiita.com/mmake/items/68cc8f07331e0ef8ce50#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98%E4%BF%9D%E6%9C%89%E8%80%85%E3%81%AE%E5%89%B2%E5%90%88)
![64_paiza.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/7b20597a-828e-0138-a5aa-db0c2129befc.png)

プログラム言語によって記述法や設計手法、使えるライブラリが変わります。各言語コミュニティでは他のプログラム言語より生産性が高い事を売りにし、互いに切磋琢磨しています。そのため若い情熱的なエンジニアほど、プログラム言語の好みがあり、それ以外の言語は触りたくない、という宗教の原理主義者のような感情になることがあります。

## IT 開発は分業制である→上流工程と下流工程でカースト制度がある
IPA の情報処理試験では、ITエンジニアを、プログラマ、プロジェクトマネージャ、ネットワークスペシャリスト、データベーススペシャリスト等に区分しています。近年のクラウド開発だとそれぞれのスキルが必要になります。

これは家を建てる時に、大工、左官職人、瓦職人、塗装職人、内装職人、防水工事、電気工事といった多くの職人が関わるのに似ています。

クラウド開発でも、各作業に上流と下流の関係があり、利害が対立する場合があます。誰かが仕様書をかくのをさぼると他の工程の検討が進められず、作業が遅延します。そのため上流工程と下流工程は敵対関係になりがちです。

# まとめ
ITエンジニアを取り巻く環境からくるITエンジニアの不思議な振る舞いや感情、人間関係について説明しました。

率直にいって、ITエンジニアは違う人種とまではいいませんが、異分子になると思います。そのときに ITエンジニアの意見を黙殺するのではなく、同じ目的を目指す仲間として受け入れる会社側の姿勢が大事だと思いまいます。

# 製造業でITエンジニアが活躍している実例

伝統的な製造業であるデンソーがアジャイル開発を始めた時の記事を紹介します。ITエンジニアの考えを理解した上で、働き方改革で IT エンジニア向けの環境を整えています。

https://biz.kddi.com/beconnected/feature/2018/181031/

https://thinkit.co.jp/article/12638
robot framework use multi devices tipcs

# Background

robotframework + appium で モバイルのテストを行う場合、複数端末を取り扱うすることがある。その時、デバイスを切り替えを簡単に行える工夫があると、開発・テストに効率が良い。
その時の工夫をメモとして残す


# yml

今回は、設定ファイルとしてyamlを使用する。
robotframeworkでyamlを読み込むライブラリを設定する


```
pip3 install pyyaml
```

https://github.com/yaml/pyyaml.org


尚、robot framework + appium 構築手順はこちらを参照
https://qiita.com/emurin/items/230e080bf3bd9a9f19d2

# sorce code sample

### setting.yml

yml fileに以下のように複数のデバイス情報を定義する

```
# setting.yml

device:
  iPhone01:
    udid: XXXXXXXX-XXXXXXXXXXXXXXXX
    platformVersion: '16'
    deviceName: iPhone13
    platformName: iOS
  iPhone02:
    udid: XXXXXXXX-XXXXXXXXXXXXXXXX
    platformVersion: '15'
    deviceName: iPhone12
    platformName: iOS
  iPhone03:
    udid: XXXXXXXX-XXXXXXXXXXXXXXXX
    platformVersion: '16'
    deviceName: iPhone11
    platformName: iOS
```
この例では、３つのiPhoneを定義している。
最低限、appiumへ渡すcapabilitiesとして以下を定義する
- udid
- platformVersion
- deviceName
- platformName

### main.robot

以下にmain codeを示す。
単純に、アプリを起動するだけのscriptである。

```
*** Settings ***

Library    openpyxl
Library    AppiumLibrary
Library    Process
Library    OperatingSystem
Library    yaml
Library    String

# ↓ 上記作成したsetting.ymlを読み出す
Variables    ../data/setting.yml

*** Variables ***
${APPIUM_SERVER}    http://localhost:4723   # appium server
${DEVICE_NO}    iPhone01  # default device
${app}  /Users/xxxxx/app/xxxxx.ipa     # テスト対象のiOS appのipa
${automationName}  XCUITest   # iOS APPの場合

*** Keywords ***

# APPを起動する処理
Launch_App
    Open Application    ${APPIUM_SERVER}
    ...    platformName=${device.${DEVICE_NO}.platformName}
    ...    app=${app}
    ...    automationName=${automationName}
    ...    udid=${device.${DEVICE_NO}.udid}
    ...    deviceName=${device.${DEVICE_NO}.deviceName}
    ...    platformVersion=${device.${DEVICE_NO}.platformVersion}

*** Test Cases ***

Show Settings
    Read Data From Yaml File

Open Mobile APP
    Launch_App

```
工夫点は、${device.${DEVICE_NO}.platformName}でdeviceのcapabilities情報を使用している点である。

### 実行

デバイスを切り替えるとき、以下のargumentを用いる。

variable : これを用いることで、Variablesの値を実行時に引数で指定することができる。

```
robot --variable DEVICE_NO:iPhone03 --pythonpath . --outputdir=./results/ testsuit/main.robot
```

上記のように、DEVICE_NOの値、iPhone01 ~ iPhone03 と簡単にデバイスを切り替えることができる。
Google ColaboratoryでGymnasiumの環境構築を行う（結果の描画まで）

# 概要
本記事では、強化学習のシミュレーション環境である「Gymnasium」をGoogle Colaboratory上で実装する方法について記載しました。

私はPythonを伴う勉強の際、Google Colabが手軽で個人的には好きなのですが、gymnasiumに関してはGoogle Colabでの実装例が少なく感じました。
また、Google Colabにおけるgymnasiumの出力結果の描画に少し手間取ったという点もあり、本記事を執筆しました。

似たような方々の参考になれば幸いです。


# Google Colaboratoryの利点
Google Colaboratoryは、ブラウザから直接Pythonを実行できるサービスです。
動作はJupyter Notebookに似ています。
anacondaなど自力で実行環境を構築せずともPythonコードを実行でき、GPUを無料で利用できるため、パパっと動作を確認したいときや、機械学習関連のコードを共有したときなどに便利です。

https://colab.research.google.com/


# Gymnasiumとは
Gymnasiumとは、すべての単一エージェントの強化学習環境にAPIを提供するプロジェクトであり、cartpole、pendulum、mountain-car、mujoco、atari などの一般的な環境の実装が含まれています。
一般的に、強化学習で利用する環境は、OpenAI Gymがよく使用されていました。しかし、下記の通り2021年にGymはGymnasiumに移行しました。

https://github.com/openai/gym#important-notice

そのため、現在は下記ドキュメンテーションを参照しながら強化学習環境を構築するのが良いと思います。

https://gymnasium.farama.org/

今回は、「gymnasium」の中でも特に「Box2D」の環境について記載します。
「Box2D」は、以下の3つのトイゲームをカバーしています。
1. Bipedal Walker（二足歩行器）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457621/2237592c-ecec-868d-059a-9f1280cc7ff7.png)

2. Car Racing（カーレース）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457621/91572b37-bd09-be04-a8e8-adb0b5857a54.png)

3. Lunar Lander（月面着陸）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457621/76c90cc3-e8ef-805c-4953-1046901b755e.png)


# 環境（出力の描画まで）の実装
それでは、実装についてみていきます。

## Box2Dのインストール
```
!pip install swig
!pip install gymnasium[box2d]
```
私はそもそもこのインストールで少し手間取りました。。
以下にエラー解決につながったissueを貼っておきますので、エラーが起きる方はご参照ください。

https://github.com/openai/gym/issues/3143

## 出力結果の描画
出力の描画については、以下の記事を参考にさせていただきました。

https://qiita.com/ymd_h/items/c393797deb72e1779269

これに倣い、Gym-Notebook-Wrapperライブラリを利用させていただきます。
```
# Gym-Notebook-Wrapperのインストール
!apt update && apt install xvfb
!pip install gym-notebook-wrapper
```

今回は「Car Racing」を実装していますが、`env`設定の部分を変えればほかの環境も実装できます。
また、ポリシーはランダムで設定しています。
```python
import gnwrapper
import gym

env = gnwrapper.Monitor(gym.make('CarRacing-v2'),directory="./") # 環境の作成

observation = env.reset()

for _ in range(1000):
    observation, reward, done, info = env.step(env.action_space.sample()) # ポリシーを記述
    if done:
        env.reset()

env.display() # 描画データの表示
```

結果は動画で確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457621/df2f297e-0ad1-1eb4-9a28-536ca4d060bb.png)

これをベースに強化学習や深層強化学習を実装していく流れになるかと思います。


# おわりに
今回は、Q学習やDQNについての実装には至りませんでしたので、そちらはまた今度実装したいと思います。
（個人的には「Car Racing」が面白そうなので、そちらに取り組みたいです。）
21年半勤めた会社を辞め40代半ばでの転職→意外と何とかなった

2023年の自分の中での一番のトピックは転職したことだろう。
年初のタイミングでは40代半ばで転職するとは思っていなかったが、思い切った行動をしたなと。

アドベントカレンダーでエンジニア転職というカレンダーを見つけたので、４０代なかばエンジニアである私の転職活動をこの記事で振り返ってみます。

## 転職のきっかけ
２０２１年末、その当時担当していたプロジェクトのリリースが終わりが見えてきたとき、次のプロジェクトについての希望を上司（会社）に伝えたが、ほぼ無視で自分が望まないポジションに異動することになった。１年頑張ってそのプロジェクトから２０２３年３月に移動することになったが、その頃には会社（当時いた担当）に自分が希望するポジション・案件がそもそもなくなっていたことでいよいよ転職しようかなってなった。

もちろん、当時いた会社はそれなりの規模であったので、担当ではなく部をまたいだ異動をすれば自分の望むようなポジションや案件もあったと思います。ただ、異動することになると評価もリセットされる、人間関係もほぼリセットされるとなると転職するのと大差ないという考えに至ったのも大きかったです。

## 転職活動について
### 転職活動の総括
転職活動自体は順調で新しい会社・プロジェクトも望んでいた内容であったので、活動結果自体には満足しています。

２０２３年４月に初めて、６月末には終わりました。１０社ぐらいにエントリーして最初に内定が出たところに決めました。２０〜３０社の募集を見て一番行ってみたいと思ったところだったので、結果としては満足しています。（給料も前職から少しアップ）

### 転職エージェントの利用
転職活動の際、転職エージェントを利用したのも良かったと思っています。自分が利用したところは専任のエージェントがついてくれます。スケジュール調整や相談も担当エージェントと直接やり取りできたのは良かったです。

### 転職先に求めていたもの
自分の経験・専門性を活かせるところを最優先にしていました。
経験がないこと、新しい言語、自分の専門性を活かせないなと思うプロジェクトは極力避けていました。もちろん自分としては新しい言語などやってみたいことは山ほどありますが、加入後すぐに結果を出すためにも自分の経験・専門性をそのまま活かせるところを優先していました。

給与・福利厚生・開発環境についても面接の中で段階を踏んで確認しています。これらも大事ですが最優先事項にはしなかったです。

### 転職先が求めていたもの
４０代半ばに求められることで必須と言っても過言ではないのは**マネジメント・育成**の２つ。
自分はスペシャリスト志望であったが、それだけではなかなか見向きしてもらえないとも理解していし、エージェントからも指摘がありました。業務経歴書や面談にはマネジメントや育成に係る内容を用意していました。（もちろん自分の経験したことを整理して話しています）

## 転職したあと
転職後働き始めて２ヶ月半。今のところ、転職してよかったなと。
プロジェクトやポジションは自分の想定とほぼあっており、入ってから短期間でチームにも馴染めたと思っています。
働く環境（開発環境）も前職からかなり改善したということもあり、先に書いたとおり、転職してよかったなというのが振り返りの結論です。



## 転職活動で感じたこと（記事で省略した）
転職活動・活動後に考えたこと、思ったことで上に書かなかったことで覚えていることをあげておきます。
+ 意外と４０代半ばでもなんとかなった。
+ 年齢で落とされたなと感じることも何度かあった
+ お祈りメールがくるとわかっていても凹む
+ 想定問答については準備必須
+ 自分の専門性の持ちネタは必須
+ 技術者が来る場合は、技術系の想定問答も
    + DBのトランザクションについてはよく聞かれた（ファントムとかダーティとか）
+ 年休消化は計画的に（自分は結構捨てることに）
+ ボーナスもらってからやめたら良かった
    + 冬のボーナスなかったので、今年の年収は結構減った
+ 前職の最後の給料振込タイミングを理解していなかった
    + 健康保険・年金だけ振込要請が来た
    + 住民税は普通徴収か特別徴収継続のどちらか
+ 引き止めなどはなかった（期待されていなかった？）