OmniAICreator/Qiita-1.07M huggingface dataset:
GROWI 7.0.13リリースノート

[オープンソースのWikiであるGROWI](https://growi.org/ja/)の最新版、7.0.13がリリースされました。大きな変更点はありませんが、リリースノートとして主な変更点を紹介します。

## 主な変更点

### エディターを最新の本文に同期する機能の改善

エディターに入力中のドラフトデータを削除して、最新の本文を同期する機能を改善しました。

## その他の変更点

その他、細かな修正点です。

- nodemailerのバージョンアップ（6.6.2 → 6.9.14）
- ファビコンを更新しました
- MongoDBのヘルスチェック機能の改善

また、不具合修正と各種メンテナンスも行われています。詳細は[Release v7.0.13 · weseek/growi](https://github.com/weseek/growi/releases/tag/v7.0.13)を参照してください。

## まとめ

GROWIはオープンソース、かつDocker composeなどで手軽に導入できます。ぜひ社内・研究室・自宅などで利用してみてください。
#4 リモートで削除済みのローカルブランチを削除する

# はじめに

`git pull`した際、「error: cannot lock ref 'refs/remotes/origin/main':～」というエラーが発生して失敗しました。再度pullしたところ問題なく最新が取得できたようでしたが、なにか対応が必要かと思い調べてみました。

# 原因

リモートで削除されたブランチがローカルブランチに残っていることで発生するようです。ただ、そういった状況は普通に起こりそうなので、その上でなにか問題がありそうですが…。（調査中）

# 解決方法

`git remote`コマンドに`prune`というオプションを付与して実行すると、リモートで削除済みのローカルブランチが削除できます。

```console
git remote prune origin
```

以下のコマンドでも同じです。

```console
git fetch --prune
git pull --prune
```

また、`--dry-run`オプションをつけると削除対象のブランチを確認できます。ブランチの削除は行われません。
```console
git remote prune --dry-run origin
```

`git fetch`や`git pull`で`--prune`オプションをデフォルトにすることも可能です。

```console
git config remote.origin.prune true
```

# まとめ

`git pull`時に「error: cannot lock ref 'refs/remotes/origin/main':～」エラーになってしまった場合の対処について調べてみました。

`git remote prune origin`コマンドで、リモートから削除されたローカルブランチを削除するのが有効なようです。

以上
githubに久々にアクセスしようとしたらうまくいかない…。

# 前置き
二段階認証が追加/アカウントの変更、など諸々あって暫くWebしかアクセスしていなかったんだが、いよいよVSCodeのTerminalからアクセスしなければならずさてやるかと思ったら、最初のgit cloneの時点で`remote: Repository not found.`が出て全く上手くいかない。
認証系が不味いのはわかっていて、巷ではgit for windowsを入れてcredencial helperを使えみたいな話ばかり出てくるのだが、私はWSLから`sudo apt install git`でインストールしているので、git for windowsなんて使いたくなかったんだよ。
あとSSHも諸事情により使えないのでhttpsでなんとかするのを考えなければならない。
というわけで数日方式を探っていた。

# 対応案
https://qiita.com/ponsuke0531/items/4fe191b7bed03342cff2

```
git clone https://{ユーザ名}:{トークン}@github.com/ponsuke/repository.git
```
これだねー。私の探し方がまずかったのか全然見つからないんだけど。
というわけで満を持してトライしてみる。

尚、この際に必要となる個人用アクセストークンの払い出しはこちら。
https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens

# 試してみた。
```
hogehoge@TAB:~/git$ git clone https://{user}:{token}@github.com/{organization}/tekitou-app.git
Cloning into 'tekitou-app'...
remote: The '{organization}' organization has enabled or enforced SAML SSO.
remote: To access this repository, visit https://github.com/enterprises/{organization}/sso?authorization_request=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX and try your request again.
fatal: unable to access 'https://github.com/{organization}/tekitou-app.git/': The requested URL returned error: 403
```
ここで、アクセスしろと言われたgithubのWebにアクセスし、二段階認証を実施する。
そしてCloneしてみると…。
```
hogehoge@TAB:~/git$ git clone https://{user}:{token}@github.com/{organization}/tekitou-app.git
Cloning into 'tekitou-app'...
remote: Enumerating objects: 8201, done.
remote: Counting objects: 100% (2585/2585), done.
remote: Compressing objects: 100% (363/363), done.
remote: Total 8201 (delta 2443), reused 2291 (delta 2222), pack-reused 5616
Receiving objects: 100% (8201/8201), 3.86 MiB | 2.84 MiB/s, done.
Resolving deltas: 100% (6068/6068), done.
```

やったね！
PyTorchをインストールする際のPythonのバージョンについて

PyTorchをインストールしようとした際にうまくできなかったので記事にしました。

もともと仮想環境内のPythonのバージョンが3.8くらいでその状態で仮想環境内にPyTorchをインストールしようとしたらうまくいきませんでした。

結論として、私の場合はPythonのバージョンをアップデートしたらうまくインストールできました。

初めにコマンドプロンプトなどで仮想環境内のPythonのバージョンを確認しましょう
コマンドプロンプトではPython -Vで確認できます。

私の場合はこのバージョンが3.8とかでした。


次にもしPythonの新しいバージョンをダウンロードしていなければ下記のURLからダウンロードしましょう。
私は3.11.7をダウンロードしました。

URL : https://www.python.org/downloads/


最後に仮想環境内のPythonのバージョンをアップデートしましょう。

ダウンロードしただけでは仮想環境内のPythonのバージョンは変わりません。

仮想環境内に入り次のコマンドを打ちましょう

py -3.11 -m venv --upgrade venv

これで仮想環境内のPythonがアップデートされるはずです。
一応　Python -V　でPythonのアップデートができたか確認しておきましょう。

この状態でPyTorchのインストールを実行して私はうまくいきました。

PyTorchのインストールは下記のURLから自分に合ったコマンドを選び実行してください。

URL : https://pytorch.org/
そろそろネットワークの基礎知識をしよぜ

# はじめに
「ネットワークの基本」という本を読んで、TCP/IPの立ち位置や概要が、すっきりした気がするのでアウトプットとしてまとめ記事を書くことにした。

# ネットワークの基礎知識
まずはコンピュータネットワークを学んでいく上で重要な概念や、ネットワークの全体像について抑えていく
## そもそもネットワークってなに？

# TCP/IPの基礎知識
TCP/IPはインターネット環境の通信を実現するための最も有名なプロトコルと言える
プロトコルとはコンピュータとコンピュータがネットワークを利用して通信するために決められた**約束ごと**である

これからその全容と各層の役割について詳しく見ていく。
## レイヤー構成
TCP/IPは4層のモデルに基づいて構成されている。
下から、ネットワークインタフェース層、インターネット層、トランスポート層、アプリケーション層と積み上げられる。
- ネットワークインタフェース層：直接繋がった相手と通信する機能を実現する
    - 具体的なプロトコル：
        - イーサネット
        - ARP/RARP など
- インターネット層：中継などにより任意の機器同士の通信を実現する
    - 具体的なプロトコル：
        - IP
        - ICMP など
- トランスポート層：高信頼性など目的に応じた通信品質を実現する
    - 具体的なプロトコル：
        - TCP
        - UDP など
- アプリケーション層：具体的な通信サービスを実現する（メール、Web)
    - 具体的なプロトコル：
        - HTTP
        - SMTP
        - POP3 など

アプリは各層のプロトコルを用途によって組み合わせて使う。

## OSI参照モデルとの対応
- OSI参照モデルとは
    - 通信に必要な機能を7つの階層に分け、機能を分割することで、複雑なネットワークプロトコルを単純にしたモデルである
    - 各階層は、下位層から特定のサービスを受け、上位層に特定のサービスを提供する
    - 上位層と下位層の間でサービスのやり取りをするときの約束ごとを「インターフェース」と呼び、通信相手の同じ階層とやり取りするときの約束ごとを「プロトコル」と呼ぶ
    - 多くの通信プロトコルは、OSI参照モデルの7階層のうちのどこかの層に当てはめることができる
        
![TCP-IP Chapter 01-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422821/1f39ed26-6bdd-6135-0e5a-6391003c46ee.png)
## ネットワークインタフェース層
ネットワークのハードウェアで直接つながっているコンピュータ同士が、相互に通信できるようにするための機能を実現する。
原始的でシンプルな最低限の通信機能をもたらす層。
主なプロトコルとしては以下。
### イーサネット
有線LANで最も主流なネットワークの規格。

### Wi-Fi
無線を使ってLANに接続するための規格。

### PPPoE
イーサネットを使って1対1の接続を作り出すプロトコル。
インターネット接続サービスの利用者認証に使われる。

### ARP/RARP
IPアドレスとMACアドレスを相互に変換するためのプロトコル。
イーサネットやWi-Fiの上で使われる。

## インターネット層
複数のネットワークを繋いで、相互にパケットをやり取りする機能を実現する。
直接つながらないネットワークの間でデータを中継する。
インターネット層が加わることで直接つながっていないコンピュータ同士でも相互に通信できるようになる。

この層で大きな役割を果たすのがパケットの中継機能。
パケットを中継して所定の方向に転送することをルーティングと呼ぶ。これによってネットワークインタフェース層だけでは届けることができない任意の相手にデータを送り届けることが可能になる。

そして、もう一つ重要なのが、接続するコンピュータを識別するためのアドレスを付与すること。

代表的なプロトコルは以下。
### IP（Internet Protocol）
直接つながっていないネットワーク間で、パケットをルーティングする機能を提供するプロトコル。

これによって直接つながっているかどうかを問わず、任意のコンピュータと通信ができるようになる。
ネットワーク全般にわたってコンピュータを一つ一つ識別するためのアドレスとしてIPアドレスを用いる。

IPアドレスはネットワークインタフェース層のプロトコルに何が使われていても影響しないようにMACアドレス（ハードウェアアドレス）とは無関係で、かつ、接続するネットワーク全体でコンピューターを一つ一つ識別できるもの。

IPアドレスにはいま主に用いられているIPv4とこれから普及が進むと見られるIPv6がある。
### ICMP
IPの働きを補助するための特殊な機能を持つプロトコル。
任意の相手に到達できるかの検査、到達できない場合の理由の通知などに使われる。
## トランスポート層
インターネット層が作り出す任意のコンピューター同士の通信機能をベースにして、ネットワークの使用目的に応じた特性を持つ通信を実現する。

より信頼性の高い通信を可能にしたり、知らんせいは低くてもすばやくパケットを送れるようにしたりする。

主なプロトコルは以下。
### TCP
信頼性の高い通信を実現するプロトコル。
通信を始めるにあたって、まず相手との間で「接続」を作る。そして通信が終わるときに接続を切る。
再送や順序の入れ替えをするので、リアルタイム性には欠ける。

信頼性の高さは大部分の通信で有用なため、WebのためのHTTP,メール受信のためのSMTPなどインターネットアプリケーションで幅広く用いられている。

### UDP
インターネット層の機能をほぼそのまま使い、事前準備が不要で身軽な通信を実現するプロトコル。
必要な時にすぐ相手にデータを送れ、到着したデータはすぐにアプリケーションに届く。

音声や動画のストリーミング、インターネット電話などに使われる。
事前の接続が不要な特性を活かしてDNSやNTPなど、サーバーへ頻繁に問い合わせをする用途にも用いられる。

## アプリケーション層
個別のアプリケーションが持つ機能を実現する層。
下位にあるトランスポート層が作り出す「目的に応じた通信機能」の中からアプリケーションに適したものを選び、それを使ってアプリケーションプログラム同士がデータをやり取りする。

特に重要で幅広く使われているプロトコルを挙げる。
### HTTP
Webへアクセスする。モバイルアプリの通信などにも使う。

### SMTP
メールの送信やサーバー間の転送をする。
### POP3
メールボックスからメールを取り出す。

### IMAP4
メールボックスのメールを読む。
### FTP
ファイルを転送する。
### SSH
文字ベースでサーバーなどにコマンドを送り結果を見る

### DNS
ドメイン名とIPアドレスを相互に変換する

### NTP
コンピューターの時計を合わせる
DevToys作者がリリースした「CtrlHelp」でキーボードショートカットを覚えて生産性を爆上げしよう

先日DevToys 2.0の紹介記事を書かせていただきました。

https://qiita.com/danishi/items/a75ab904da66cecc71b4

そのDevToysの作者がまた生産性を上げてくれそうなツールをリリースしていましたので紹介します🚀

https://x.com/VelerSoftware/status/1813203819955954133

# CtrlHelpとは

https://github.com/veler/CtrlHelpApp

CtrlHelpは80種類以上の対応アプリのキーボードショートカットを覚えるための練習モードとショートカットのチートシート機能を備えたWindowsアプリです。

実際に見てみないとよくわからないと思うので使い方を紹介していきます。

# インストール

https://apps.microsoft.com/detail/9mvpjxnskdrr?mode=full&hl=ja-jp&gl=JP

Microsoft Storeからインストールができます。
有償アプリですが、数日間は無料でお試しすることもできます。

# ショートカットの学習と練習

アプリを立ち上げるとこのようなUIになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/9d6fb41f-26e4-4c8e-5450-c4898928b159.png)

ここでは80以上の対応アプリを選んでキーボードショートカットの練習ができます。

例えばSlackを選択してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/07802eba-42e4-0e3d-1828-48d651767f03.png)

ショートカットの分類とマスターしたかの進捗が表示されています。
「Switch workspace」について練習してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/1448a531-540a-2730-ce94-98730f58e7e0.png)

このようにショートカットの機能と対応キーが示されるので実際にそれを押して進めていきます。
覚えたあとはキーが隠された確認モードになり、実際に覚えてマスターできたかを確認できます。

# インスタントチートシート

アプリはバックグラウンドでも起動していて、対応アプリを開いている時にキーボードショートカットのチートシートを開くことができます。

デフォルトではCtrlキーを2秒間長押しすることで起動します、例えば今まさに記事を書いているChromeで起動すると。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/0d21c14f-5c74-03d6-aa70-88543ac6c7cf.png)

このようにChromeキーボードショートカットのチートシートがフォアグラウンドで立ち上がってくれます。
検索ボックスもついているので対応のショートカットをすぐに調べることもできそうです。

---

このようにCtrlHelpは練習と実践を組み合わせることでキーボードショートカットを覚えることができるアプリです。
まだリリースしたてなので日本語対応はしておらず、Windows限定のアプリではありますが、DevToysと同じように人気が出れば多言語対応やMac対応も行われるのではないでしょうか。

作者がこのアプリを作成したきっかけが、キーボードの達人の友人の生産性がマウスとキーボードを組み合わせてる自分よりもはるかに勝っていることと、操作をマウスに依存しているせいでAge of Empiresが上達しないためとXで語られています（そのため対応アプリにAge of Empiresが入っています）。

Windows OS自体やエクスプローラー、ExcelなどのWindowsユーザー必須事務ツールもばっちり対応しているので、Windowsをよく使うユーザーが効率よくキーボードショートカットを覚えて生産性アップにつなげられるツールだと思いました。
Arm64 Windows11でのHyper-V　仮想マシン作成

### はじめに
Snapdragon X Eliteが搭載され、Arm64版のWindows11が動作するパソコンを購入した。
購入したものは下記のメモリ32GBのモデル。

https://www.asus.com/jp/laptops/for-home/vivobook/asus-vivobook-s-15-s5507/

自宅では、Microsoft365 Business Premiumを使用しているため、Windows11 Proへアップグレードした。

### 仮想マシンの作成
Windows11 Proにすることで、Hyper-Vを用いた仮想マシンの作成ができる。
Arm64マシンでのHyper-Vがどのような動きなのか、検証してみる。

まず、Windows11を仮想マシンとして作成するシナリオを考えた。
通常のx64向けのインストールイメージを利用して仮想マシンを作成、起動させると以下の表示となり、インストールが進行しない。仮想のTPM（トラステッドプラットフォームモジュール）をオンにしても同様。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/1e5b3cda-4e98-0c41-6499-6e9e03915781.png)

仮想マシンのアーキテクチャもArm64でなければならないと仮定して、Arm64のWindows11インストールイメージを用意することを考えた。

### Windows11 Arm64版インストールイメージの準備

googleで検索してみたところ、「Windows Insider Preview ダウンロードから Arm Insider Preview VHDX に Windows 11 をダウンロード」して動作させることができる、と記載がある。

https://learn.microsoft.com/ja-jp/windows/arm/faq

Windows Insider Previewへ加入して、リンクを押してみたが、イメージをダウンロードできるサイトへのリンクは存在しなかった。

## Arm64版のインストールイメージがダウンロードできるUUP Dump

https://uupdump.net/

上記のサイトでは、Windows Updateサーバーからファイルをダウンロードしてインストールイメージを構築できるようだ。試してみた。
まず検索窓にWindows 11と入力する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/1463746c-8408-5302-2ce5-2b4eeb758d99.png)

Arm64の正式リリースで一番新しいものを選択した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/fd2cb705-c5e8-c94d-e82d-3ef054c05b7f.png)

「日本語」を選択して、「次へ」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/d3331715-f3d9-8cd2-fa5d-7c1cfd218f88.png)

「Windows Pro」のみを選択して、「次へ」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/f1073fb2-7cd3-2985-4554-3fdd6cbecf62.png)

選択肢は何も変更せず「ダウンロードパッケージの作成」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/6e35570a-3b07-ea19-29be-e860d60598df.png)

すると、小さなサイズのスクリプトの入ったzipファイルがダウンロードされるので解凍する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/a6c5856f-50a8-1456-2ec2-ee92e2b27051.png)

下記赤枠のスクリプトをコマンドプロンプトで実行する。
すると、数十分ほどかかって、同フォルダ内に6GBのISOファイルが作成される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/afd6726b-51e8-61e3-dc47-8af79bd317d7.png)

### Hyper-V仮想マシンの作成

Windows 11 ProでHyper-Vを有効にする方法は、通常のx64版と同様。下記などが参考になる。

https://qiita.com/mmake/items/cd96a0c59226e8460af6

Hyper-V上で新規に仮想マシンを作成する。上記で作成されたISOファイルをインストールイメージとして指定する。起動する前に、設定画面でTPMを有効にする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/21a2fe19-d733-cf6b-04ad-eede5ed0e699.png)

うまくいくと、下記画面が仮想マシンに表示され、Windows11インストールを進めることができる。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/9f3f1061-7173-2bc8-f3a6-adbfd1fdd72a.png)

インストールが完了したところ。仮想マシンのCPUには6コアを割り当てた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/8ddaf41d-16e8-cbce-5991-f4ae5ec7bcb0.png)
【Claude 3.5 Sonnet】低スキルエンジニア(俺)の終焉が始まっている。【えぐすぎる新機能】

## Claude 3.5 Sonnetのリリース
2024年6月末にClaude 3.5 Sonnetが登場しました。
値段はClaude3 Opusよりも安く処理速度が2倍
注目すべき目玉機能と言ってもいいのは、Artifact機能
要するに、「〇〇の機能を持つwebアプリを作成して」って言ったらプレビューを表示しながらコーディングしてくれる機能みたいです


## えぐすぎる新機能 Artifact
ええ、早速使ってみました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527006/817f6d43-bc18-a511-1898-a270ab90ad19.png)
こんな単純な命令で作れるのか怪しいものですよね。
ええ、正直疑ってましたよ。
作れるわけないってね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527006/95295cad-d66f-9174-742c-e39cf7b54471.png)
え？


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527006/d00cf902-4d31-62ed-fdb9-eff57bafb887.png)
えええ？
画面上で操作まで出来る。プルダウンメニューもちゃんと効いてる

あかんほんま
凄すぎてえぐい
こんなんAIの成長速度が速すぎて低スキルの俺は一瞬で用済みやん

それでも着実に積み上げていくしかないんだよなあ
コツコツが勝つコツ
なんてね
Unity6 の batchmode で BuildProfile を切り替えてビルドする

https://qiita.com/OnederAppli/items/cb8b56cac3f322dd30b0

先日こちらの記事で書いた通り、
Unity6から同じプラットフォームでもBuildProfileを複数用意して、ビルド時の設定を簡単に切り替えられるようになっていました。

JenkinsなどCIツールで batchmode でビルドする際に ``BuildProfile`` を切り替えられると便利そうなので、そのサンプルです。

### ビルド用のプログラム準備

```Assets/Editor/Build.cs
using UnityEngine;
using UnityEditor;
using UnityEditor.Build.Profile;

public class Build {
	[MenuItem("Appli/Build")]
	public static void Execute() {
		// コマンドライン引数からBuildProfle名を取得
		string buildProfileName = GetBuildProfileName();

		// BuildProfileを読み込み
		string profilePath = $"Assets/Settings/Build Profiles/{buildProfileName}.asset";
		BuildProfile buildProfile = AssetDatabase.LoadAssetAtPath<BuildProfile>(profilePath);

		// ビルドオプション設定
		BuildPlayerWithProfileOptions buildPlayerWithProfileOptions = new BuildPlayerWithProfileOptions {
			buildProfile = buildProfile,
			locationPathName = "Build/iOS"
		};

		// アプリビルド実行
		BuildPipeline.BuildPlayer(buildPlayerWithProfileOptions);
	}

	/// <summary>
	/// コマンドライン引数から-buildProfileオプションを取得
	/// </summary>
	private static string GetBuildProfileName() {
		string[] args = System.Environment.GetCommandLineArgs();
		string buildProfile = null;

		for (int i = 0; i < args.Length; i++) {
			if (args[i] == "-buildProfile" && i + 1 < args.Length) {
				buildProfile = args[i + 1];
				break;
			}
		}

		if (string.IsNullOrEmpty(buildProfile)) {
			Debug.LogError("Build profile is not specified.");
		}

		return buildProfile;
	}
}
```

### batchmodeでビルド実行

実行コマンド例

```
/Applications/Unity/Hub/Editor/6000.0.10f1/Unity.app/Contents/MacOS/Unity -quit -projectPath /Users/username/Unity/Unity_6_test -batchmode -executeMethod Build.Execute -buildProfile "iOS Profile Production"
```

``-buildProfile "iOS Profile Production"`` の部分で使用するBuildProfileを指定
TypeScriptといふものを知る（ざっくり知る話）

# 前置き
ご覧いただきありがとうございます。
Web制作会社で主にHTML・CSS・JavaScriptを書いているマークアップコーダーです。
いわゆるレガシーな環境で、未経験で入社しもう3年ほど従事していますが、
そろそろモダンなフロントエンド技術を身に着けたいと思い、
手探りに色々と勉強中です。
（JavaScript（Vanilla）も基礎が全然なのでまずはそこからですが、、）

今までいくつか書籍などで勉強しましたが、
読んで終わり、コードを写経して（ちょっとだけ変えたりして）終わりで、
「これだけでは良くないな〜」と思い、まずはざっくりですが学んだことや気になったことを記事にしようと思いました。

## ※注
基礎もまだまだの状況ですが、とりあえず「こんな感じなんだ〜」的なことを本当にざっくり書くだけです。
誰かのためになるわけでもわかりやすいわけでもない記事です。

# TypeScriptってなんだ？
今回は「**TypeScript**」です。

## 知る前のイメージ
名前はめちゃくちゃ聞いたことがあり、
「JavaScriptの上位互換」「JavaScriptに型をつけたもの」とだけは知っていました。
「JavaScriptの変数とかに予め型指定しとくくらいかな〜」とも思っていました。

## 実態
**上位互換過ぎる。**
上位互換というかスーパーセットか。型を指定するだけでここまで安全性が担保されるか。
というか便利機能がすごいし、めちゃくちゃ注意してくれる。

## 機能と感想
### エラー
まず機能どうこうというより、エラーがすごい。
筆者はVS Codeを使用していますが、少しでも適切でなければエディタ内ですぐにエラーが表示されることに驚きました（しかも日本語で！）。
Linterとかをあまり活用できていないので特に・・
実装するまでにエラーをなくしていかないといけない（というよりエラーが潰せる）ので、たしかにこれは安全性が非常に高まると思いました。

ただその分、TypeScriptはもちろんJavaScriptの知識が乏しい場合は、慣れたり覚えたりするまでは実装にかなり時間がかかるという印象もあります。
（とはいえそれは悪いことではなく良いことだとも思います。早く実装できても堅牢でなければ意味がない。）

### 型注釈・型推論
TypeScriptのメインの機能で、変数や関数に予め型を明示すること（**型注釈**）で、
その変数や関数ではその型以外の値が入るとエラーが起きます。
また型を指定せずとも、例えばある変数に値を代入した際に、代入された値から型を推測し、再代入の際は同じ型のみ可、という「**型推論**」という機能もあります。

これらの機能で、予期せぬ、想定外の値が入るのを未然に防げるので安全性が高まりますね。

また実装上の安全性のみでなく、
型注釈によって、開発者目線でも（コメントがなくても）コードの意図がわかりやすく、特に複数人での開発の効率が上がるというメリットもあります。
※一人での開発だとしても、過去の自分はもはや別の自分なのである意味「複数人開発」となりメリットがありますね。

型注釈で指定する型は、通常のstringやnamberの他に、
より限定的な「**リテラル型**」、
より柔軟性を上げるために、いくつかの型を許容する「**ユニオン型**」、
より堅牢にするために、複数の指定した型のみを許容する「**インターセクション型**」、
配列をより限定的に指定できる「**タブル型**」、
などがあります。
他にも「any」、「unknown」、関数の戻り値に指定する「void」、「never」があります。

### 型エイリアス
エイリアス、つまり他で使い回すようなイメージです。
同じ型注釈を色んな変数などで使いたい場合、毎回書くのは面倒でミスも起こるかもなので、
エイリアスを設定して、そのエイリアスを型として指定できます。
利便性がぐっと上がる、かつ見やすいコードが書けるようになる印象です。

### インターフェイス
オブジェクトの型を予め定義し使い回せます。
型エイリアスと同様ですが、インターフェイスはオブジェクトに特化しており、メソッド（引数や戻り値）の型も定義できます。

インターフェイスはclassのように extends で継承（拡張）したり、定義したインターフェイスに後で構造を追加（マージ）したりもできます。こちらも利便性が上がるし、とにかく柔軟性がすごい。

### 型アサーション
特定の変数で、開発者側がTypeScriptの型推論より詳細な型情報を持っている場合、型を明示できる機能です。
個人的には、主にDOM操作で使用するイメージを持っています。
DOMで引っ張ってきた要素はTypeScriptではどの型に当てはまるか推論できないので、
より厳格にするために開発者側で型を明示する、ということが多いようです。

### ジェネリクス
ややこしくなってきました、、
ざっくりいうと「型を抽象化して再利用する」機能で、その抽象的な型を「ジェネリック型」と呼びます。
（薬などの「ジェネリック」と由来は同じようです）

エイリアスやインターフェイスなど、型を使いまわしできる機能はありましたが、どちらも具体的に型を指定しており、使い回す場面は限定されていました（それでも柔軟性は十分にあります）。
ジェネリクスは、（日本語がおかしいですが）抽象的に型を定義することで、使い回す場面を限定せず色んな場所で使用できるという仕組みです。
これでもかというほど効率性を上げてきますね。

このあたりになると、プログラミングの知識が乏しい筆者にとっては「便利そうだけど使い方が難しい、、」と感じてしまっているので、色々試してみて掴んでいきたいと思います。

### tsconfig.jsonによる設定
TypeScriptをJavaScriptにコンパイルする際に、tsconfig.jsonにJavaScriptのバージョンを指定しておくと、任意のバージョンにコンパイルできます。
プロジェクトによって流動的に変更できるので、オプション的な機能ですがかゆい所に手が届く印象です。
tsconfig.jsonには、他にもコンパイル先のディレクトリやモジュールシステムの指定など様々な設定が行えます。

## まとめ
詰まるところ、主な機能はイメージ通り「JavaScriptに型をつけたもの」ではありますが、その機能のそもそもの安全性が高く、またより効率性と利便性を上げる機能がパッキングされた「すごい技術」であるな〜と感じました（語彙）。
まだまだ身に付いてはいませんが、そりゃフロントエンドでは必須と呼ばれるくらいだと思います。

今回はTypeScriptについてざっくり知りました。
ある程度どんなものかはわかったので、手を動かしてより深く身に付けていきたいと思います。
読んでいただきありがとうございました！
Databricksのホームページやナビゲーションがリニューアルしました！

:::note info
**プレビュー**
本機能は[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。
:::

:::note warn
[プレビュー機能の有効化](https://docs.databricks.com/ja/admin/workspace-settings/manage-previews.html)はワークスペース管理者あるいはアカウント管理者のみが行えます。ワークスペース管理者が有効化した場合、当該ワークスペース全体で機能が有効化され、アカウント管理者がアカウントコンソールから機能を有効化した場合には、アカウント全体で機能が有効化されます。
:::


全体的に白を基調としたテイストに変更されます。

**Before**
![Screenshot 2024-07-18 at 8.48.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6cce95db-96f2-8bf6-11cc-1d22b2747b4c.png)

**After**
![Screenshot 2024-07-18 at 8.49.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b51000d3-63e7-a80d-4b45-00e6e23a0a6b.png)

ダークモードの場合はこのようになります。
![Screenshot 2024-07-18 at 8.51.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/afddc94e-4731-5e48-8045-4ff710b93551.png)

画面右上のユーザーアイコンをクリックし、**プレビュー**を選択します。**Improved Navigation and Homepage**をオンにします。
![Screenshot 2024-07-18 at 8.40.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5839d1c2-175a-7f52-a6c1-a71d377b5a1b.png)

1分くらい待ってから画面をリフレッシュすると設定が反映されます。また、ナビゲーション(サイドメニュー)の表示、非表示の方法が変更されています。左上の三本線アイコンで表示、非表示を切り替えることができます。
![Screenshot 2024-07-18 at 8.42.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7cadf9ab-813b-aa72-03a3-da891e26f881.png)

いろいろ探索してみてください！
![Screenshot 2024-07-18 at 8.42.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/fd3d12dc-f4b6-c6e2-3e28-719a937fd098.png)


### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
【転職体験記】医療機器メーカーの導入SEという仕事について

#### はじめに
転職体験記では、私は23で就職してから7年間で3つの会社を経験してきました。その中で気づいたことをつらつらと書いていきます。
今回はその一社目、日系の医療機器メーカーの導入SEです。私はその中でもPACSというシステムの導入を担当していました。
その時のことを色々書いていきます。
PACSというとFujifilm、コニカ、GE、PSPあたりがメジャーですね。どこかはご想像にお任せします。

## ワークスタイル
#### お盆、GW、年末年始は基本仕事
医療業界で仕事をする以上、外来診療のない日にシステムの導入をするのが基本です。そのため、大型連休は基本的にはありませんでした。会社としてはズラして取るのを推奨されてましたが、システム稼働前後は何かと色々あるので、、、

#### 出張が多い
エリアや会社にもよりますが、私の場合は3県跨いで担当していたのもあり月の半分は出張してました。

#### 残業時間は45h以上
出張や休日出勤が多い分、残業時間も増えます。私の場合、毎月の平均は60h程度です。多い月は100hを超えることもしばしば。特に残業時間に個人差はなく、組織全体でそんな感じでした。

## 給与
#### 基本給は安い
医療業界という目線では標準、IT企業のSEという目線では低めの給与になってます。

#### 残業代、ボーナスは多め
残業多い部分、残業代はとてもたくさんもらいました。給与より残業代のほうが多いこともありました。ボーナスも売上に左右されますが、とてもたくさんもらえました。

## 使用する技術分野
#### マネージメント
私の時は、一年目からサーバーの導入計画の作成が求められました。ただし、ここではあくまで、医療系システム導入のPLPMとしての技術だということはお忘れなく。

#### サーバー設計
当時、基本的に院内のシステムは物理サーバーでした。なので、以下のような設計が多かったです。
+ サーバーラックの設計・設置
+ 電源設計
+ 物理スイッチの設計・設定

#### OS、MWの設計設定
サーバー導入するMWやOSを決めて、物理サーバーが現地に届いたら、それらをインストールしたり設定していくのもSEの仕事です。
+ OSの設計・設定(ADやポリシー、FW、BIOS等)
+ MW(Oracle、IIS等)の設計・設定

#### データベース操作技術(SQL)
医療系システムの移行などにおいては何万件というデータの突き合わせをしたり、値を変えたりという作業が多いです。その中で、巧みなSQLを扱います。

#### 低レイヤーのネットワーク知識
院内にはたくさんの物理NW機器や物理サーバーがあります。大体の課題は、ネットワーク系のトラブルです。Pingやtraceroutを飛ばしてひたすらトラブルシューティングしたり、WireSharkで通信をキャプチャして分析したりは日常茶飯事でした。

#### 自社製品の知識
医療業界では基本的に法的な認可のおりている製品しか販売できないため、SI開発というのがなく原則パッケージを導入し、法に触れない範囲でカスタマイズしていきます。そのため、自社のパッケージ製品の知識もとても必要となります。

#### 業界独自の知見
病院内の業務や業界独自の通信規格もよく理解しておく必要がありました。DICOMの何番の値がCTの向きを示すだとか、このオーダーはHL7で電子カルテから連携されてるとか、このピクセルサイズのマンモグラフィの容量はいくらだとかで色々使います。
+ DICOM規格の知見
+ HL7規格の知見
+ 病院内業務とシステムの知見
+ 医療機器の知見
+ レントゲンやCT、MRの見方

## キャリアパス
#### 出世頭は営業
私のいた会社では、SEでの出世は事実上厳しく感じました。パッケージ導入の会社という性質上、出世は数字で成績が出る営業が優位でした。SEは安定稼働できて当たり前で、評価基準も定量的なものは少なかったです。
事実、その後に転職した会社と比較して、敏腕な営業マンが多いように思いました。

#### 目指すはPM
導入SEとして、一番多いキャリアパスはPMでした。技術よりもマネージメントの勉強をして目指していく感じです。

#### 開発チームもある
開発チームもありました。その中での出世の道はせいぜい開発部長ぐらいで特にその先はありません。

#### IT営業という道も
導入SEと言ってもプリセールスのような業務も多かったです。IT営業としてプリセールスを中心にするチームもあり、SEからそういった道へ駒を進める社員もいました。どんどん進んでいきたいならこれが一番いいかも。

## 業界事情
#### お医者様は神
私の時代はお客様の中でも、特にお医者様は抗えぬ存在でした。プロ意識の強い方が多いので、こちらもシステムのプロとして対応することを求められます。
無茶な要望は他の業界と比較して多くありました。多くの人がストレスになりやすい要素となります。

#### システム障害は即人命に関わる
医療業界のシステムは一つのシステム障害がすぐに人命にかかわります。想像してみてください、カテーテルを入れるような手術中に急に画像が見れなくなったりしたら、大惨事ですよね。実際にそんな事故も何度か見聞きしました。日々そんなプレッシャーと隣り合わせです。

#### 社外の人付き合い
私の会社では看護師さんとは接点なく仲良くなることはなかったですが、検査技師や放射線技師の方と仲良くなったり飲みに行くことは多かったです。実際に、医療従事者と結婚している先輩社員もいました。

## あとがき
私は仕事スタイルが肌に合わず、転職をしてしまいましたが皆さんはどうでしょうか。
興味のある方はお声掛けいただければいろいろと実情をお伝えすることはできます。
python import 自作モジュール  相対パスの不可解

my_package/
├── __init__.py
├── mod.py
├── sub_package
   ├── __init__.py
   └── sub_mod.py


sub_modからmodを呼び出す

sub_mod.py
from .. import mod

sub_mod.pyを単体で動かすとエラーになる事がある


対策
root dirに移動してパッケージで実行（my_packageの上に移動）
python -m my_package.sub_package.sub_mod

または、PYTHONPATHを設定 $env:PYTHONPATH="C:\user\xxx\my_package" 
sub_mod.py
import mod

とする。
フロー内の「ファイルのアップロード」


+ [フロー内での自動名前付け（+i を使用）ファイルアップロード](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A8SXrSAN)

私の理解では、現在、フロー内の「ファイルのアップロード」からのファイル名の変更はサポートされていません。

入力セクションの「アップロードされたファイル名」はテキストコレクション変数を受け入れますが、ファイル名は設定しません。

出力セクションの「アップロードされたファイル名」を使用して、アップロードされたファイルの名前を保持できます。

参考までに下のスクリーンショットを確認してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/1de88ce7-2f2e-e564-aac1-c7e9788e4169.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ab430514-cd22-ea45-2a57-d42136b9e0ed.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/b7a9f514-aa45-c469-1194-a79702be2ee9.png)


フェッチおよび更新レコード コンポーネントを使用してファイルの名前を変更することはできますが、その名前に増分番号も追加する必要があります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3c31d162-8faf-3e84-fa36-54db2e5ddf02.png)


# アイデア

+ [ファイルアップロード画面コンポーネントでファイルのアップロード後にファイル名を表示する](https://ideas.salesforce.com/s/idea/a0B8W00000OTYPUUA5/display-file-name-after-file-upload-in-file-upload-screen-component)

# ゲストユーザだとエラーになる

+ [Upload File Screen Flow component: changing filename of uploaded file](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cmNpKSAU)

:::note alert
INSUFFICIENT_ACCESS_OR_READONLY
:::

+ [ゲスト ユーザーはフローからファイルをアップロードできません](https://salesforce.stackexchange.com/questions/396284/guest-user-unable-to-upload-file-from-flow)

:::note
2

問題は、バックエンドでの関連付けが原因で、同じトランザクション内で documentID が何らかの理由で null になり、contentdocumentlink がそのレコードを作成しようとするとエラーがスローされることです。

解決方法: 関連レコード ID フィールドがあるフローでは、アカウント ID、ケース ID などのレコード ID を関連付けないでください。空白のままにしておきます。ユーザーはファイルをアップロードしますが、関連付けは行われません。この関連付けは、1 つの割り当て (テキスト コレクション) を作成し、ファイルのアップロードからすべてのコンテンツ バージョン ID を保存することで実現できます。それらをループしてすべての contentdocumentIds を取得し、別のコレクションに保存します。次に、contentdocumentIds をループして ContentDocumentLink レコードを作成します。ここで、linkedentityid は、このファイルが関連付けられるオブジェクト ID (アカウント ID など) であり、contentdocumentId は contentdocumentIds コレクションからの ID になります。次に、オブジェクト ContentDocumentLink の「要素の作成」を 1 つ作成し、レコードを 1 回で作成します。すべてのファイルが正しくアップロードされ、マップされます。
:::
検索システムにおけるKandaSearchのポジション

Apache SolrのSaaSである KandaSearch を使って検索システムを構築する場合は、一般的には、KandaSearchに加えて、次のようなコンポーネントが必要です。

これらは、1つのコンポーネントについて1台のサーバーを用意するという場合があるかもしれません。また、1つのサーバーに複数のコンポーネントを同居させてもよいですし、サーバーレスなクラウドサービスを利用することも考えられます。
なお、検索システムの規模や用途により不要なコンポーネントもあります。

- **データ収集ツール**
Webスクレイパーやデータベースコネクタ、カスタムツールを使用して、インターネットやデータベース、共有ファイルサーバーなどからデータを収集します。

- **データクレンジングと正規化**
収集したデータを整形し、不要な情報を削除したり分割したりして、構造化データに変換します。

- **インデクシング**
KandaSearchのインデクシング機能を利用してインデックスを作成（インデクシング用のApache SolrのAPIをコール）します。

- **データベース**
検索対象となる構造化データを保存するためのデータベース（例：MySQL、PostgreSQL、クラウド型RDSなど）。一時的なデータの保管場所として利用します。インデックスのことではありません。

- **バックアップシステム**
データの損失を防ぐためのバックアップ機構。

- **認証エージェント**
ユーザーの認証および権限管理を行うシステム。

- **フロントエンドユーザーインターフェース**
Webアプリケーションの形態をとることが多いです。ユーザーが検索を行い、結果を表示するためのインターフェースを有します。モバイルアプリによる実装も考えられます。

- **ログとモニタリング**
検索クエリやシステムイベントを記録するためのログ管理システムと、システムのパフォーマンスや稼働状況を監視するためのツール。

- **スケーラビリティとパフォーマンス最適化**
高負荷時にトラフィックを分散させるためのロードバランサーや、検索結果を一時的に保存して、高速にアクセスできるようにするキャッシングシステム。

- **セキュリティ対策**
SSL/TLSによる通信の暗号化や、不正アクセスや攻撃からシステムを保護するためのファイアウォールとDDoS対策。

- **テストとデプロイメント**
 継続的インテグレーションとデプロイメントのためのパイプラインや、システム全体の品質を保つためのテストスイート。

これらのコンポーネントを統合することで、KandaSearchを中心とした強力な検索システムを構築することができます。

KandaSearchは検索システムの中核をなす「検索エンジン」というポジションのサービスです。
[https://kandasearch.com/](https://kandasearch.com/)
windowsの味方、WSL2について

## WSL2とは
windows system for Linuxの意で、Windows上で動作するLinuxの実行環境のこと
Windows上でLinuxのコマンド・ツール・アプリケーション等を直接実行可能

**wsl2を使うの何が変わる？**
macOSと違い、今まではwindowsと別にLinuxを起動する必要があった
↓wsl2を使うと
windowsの中ある一つのソフトウェアのようにLinuxを使用することができ、使い勝手が良い

## WSL2を使うための要件
WSL2が使えるバージョンはWindows10（64bit版）以降。32bit版では、WSL2を利用できない。
↓加えて
* x64システムの場合：バージョン 1903 以降、ビルド 18362 以上
* ARM64システムの場合：バージョン 2004 以降、ビルド 19041 以上
>Windowsのバージョン・ビルドは、Windows画面左下の「スタートボタン」から「設定」→「システム」と移動した先にある「詳細情報」にて確認できます。

* PCのハードウェアがHyper-Vに対応している

## インストール手順について
https://and-engineer.com/articles/YfEnlBEAACMAm3GD

### 参考
https://www.kagoya.jp/howto/it-glossary/develop/wsl2_linux/
robloxでassistant その132

# 概要
robloxでassistantやってみた。
ウィルス調べてみた。

# 想定される脅威

|想定される脅威|実現性|コメント
|:-|:-|:-|
|OSへの攻撃|無いと思う|Luaのsand boxから出れないから|
|robloxのIDとpassの奪取|無いと思う|Luaのsand boxから出れないから|
|game内の操作権の奪取|有ると思う|怪しいLuaスクリプトを実行させられたら|
|game内の得点の奪取|有ると思う|怪しいLuaスクリプトを実行させられたら|
|どのgameも動かない|有ると思う|怪しいLuaスクリプトを実行させられたら|
|他のgameにテレポートされる|有ると思う|怪しいLuaスクリプトを実行させられたら|
|GUIを利用した各種ポップアップメッセージを表示する|有ると思う|怪しいLuaスクリプトを実行させられたら|
|意図しない動作をする|有ると思う|怪しいLuaスクリプトを実行させられたら|

# 想定される侵入経路

ツールボックスから、プラグインやモデルをインポートする。

# 対策

ツールボックスから、プラグインやモデルをインポートしない。
ツールボックスから読み込んだモデルに怪しいスクリプトファイルはないかを慎重に検査した後、ゲームに入れる。



以上。
セレクトボックス

```tsx
import React, { useState } from 'react';
import Autocomplete from '@mui/material/Autocomplete';
import TextField from '@mui/material/TextField';

interface OptionType {
  option: string;
  value: string;
}

const data: OptionType[] = [
  { option: 'Option1', value: 'Value1' },
  { option: 'Option2', value: 'Value2' },
  { option: 'Option3', value: 'Value3' },
  { option: 'Option4', value: 'Value4' },
];

const SelectBox: React.FC = () => {
  const [selectedValue, setSelectedValue] = useState<string | null>(null);

  const handleChange = (event: React.SyntheticEvent, newValue: OptionType | null) => {
    if (newValue) {
      setSelectedValue(newValue.value);
    } else {
      setSelectedValue(null);
    }
  };

  return (
    <div>
      <Autocomplete
        options={data}
        getOptionLabel={(option) => option.option}
        renderInput={(params) => <TextField {...params} label="Select an option" />}
        onChange={handleChange}
      />
      <div>
        Selected Value: {selectedValue}
      </div>
    </div>
  );
};

export default SelectBox;

```
へクス五目に関する考察

先日，へクス五目の実装に関する記事を執筆しました．

https://qiita.com/tomtkg/items/a39894f789ffb2a55b19

ここでは，へクス五目というゲームについて，考察します．
ヘクス五目は以下から遊べます．

https://tomtkg.github.io/Hex-Gomoku/

# 一手目
まず，先手がどこでも良いの✖を打ちます．
このとき，五目並べでは，8方向に✖を繋げることができます．
一方，へクス5目では，6方向にしか✖を繋げることができません．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308259/8f3892c5-3d16-9d0b-11f2-6c060719c8b5.png)

# 二手目
五目並べ・連珠において，二手目は一手目と隣接するマスに打たなければならない，
隣接するマスに打たないと不利になる，という文言が散見されました．
その文言に従うと，五目並べの取りうるパターンは2通りになります．

一方，へクス五目では，取りうるパターンは1通りです．
（回転・反転によって出現する盤面は，同じパターンと見做します）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308259/18379966-f6c6-5a01-b7d7-bb7c7b8c0c17.png)

# 三手目
連珠において，始めの三手までの型のことを珠型・基本珠型と言い，全部で
$2\times13=26$パターンあるそうです．
基本珠型では，一手目を中心とした$5\times5$の25マスのどこかに✖を打ちます．

ヘクス五目において，一手目を中心とした19マスのどこかに✖を打つとすると，
その数は全10パターンになります．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308259/69243d1d-056f-850d-92a2-ebe711a74a9a.png)
少し検討した限りでは，10パターンで先攻後攻の大きな有利不利は分かりませんでした．

# 四手目以降
四手目以降は，盤面のパターンが指数的に大きくなります．
連珠の禁じ手である**三三禁**，**四四禁**，**長連**を積極的に狙う戦略が有効だと考えられます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308259/60d4afd8-108c-1dee-8ce6-ee1698fd9312.png)

また，**四三**，**釘折れ**，**櫓・鞍型**など連珠で有効な形は，ヘクス五目でも有効だと考えられます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308259/c22160b1-21e6-e5d8-0e47-2124f86c62f6.png)

# 七マスのパターン
七マスに注目して○と✖が取りうるパターンを考えると，全部で13パターンありました．
（○と✖の入れ替え，回転・反転によって出現する盤面は，同じパターンと見做します）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308259/cf0e22a5-511d-dd5a-73ba-44e42c1b119c.png)

このうち，1~6番目の盤面では，必ず✖が勝ちます．
✖が作る三三の形を○のプレイヤーは止める術がありません．
一方，7~13の盤面では，必ず✖が勝つとは判断できません．
次の手番が○で最善手を打つと仮定すると，少なくとも十数手以内で✖が必ず勝つ状況を見つけられませんでした．

最も興味深いのは，黒枠で囲った7番目の盤面です．
7マスの内5個が✖であるにも関わらず，✖が必ず勝つと言えません．
例えは，✖の三連と四連を止めるように○を打っていくと，以下の盤面が現れます．

<img width=300 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308259/6cbf1457-8de8-e0a9-da54-6b1da08b5dd7.png">

元の盤面の✖を2個以上含む四連はすべて○に止められていて，✖のプレイヤーは両側に空きのある三連が作れない状況になっています．

同じ盤面を連珠で考えた場合，禁じ手が無いと必ず✖が勝ちます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308259/c8cf8006-1db8-ec67-973b-158ad3bdc96f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308259/be1b3be9-5708-fc96-8b4e-bf43bc833ebd.png)

ヘクス五目の7マスから連珠の$3*3=9$マスへの変形として6通りの方法を検討しましたが，いずれの盤面でも✖が勝つことが確認できます．

# 事実と予想
五目並べとそこから幾つかの先手の禁じ手を導入した連珠は，お互いに最善手を打つと必ず先手が勝つことが知られています．
一方，**ヘクス五目はお互いに最善手を打つと必ず引き分けになる**と予想しています．

これは，以下の2つの事実を根拠とした予想です．
* ヘクス五目は1つのマスと隣接するマスが6マスしかない
* 7マスの内5個が✖であるようなケースにおいても，✖の短手数での勝利を阻止できるケースがある

普通に遊んでいる場合でも，お互いに手詰まりの状況になりやすいことも予想を後押ししています．
ヘクス五目は，守りが連珠よりも簡単で，攻めが困難に感じています．
相手の動きに対して，打たれたマスから6方向を注意すればよいので，連珠よりも見落としが起きにくいと感じています．

パソコンで上手いこと計算すれば証明できそうな気がしますが，ここでは手検討による予想だけ書いて終わります．

# 終わりに
遊んでいてマスが足りないなと思って331マスまでヘクス五目の盤面を拡大しましたが，
慣れてくるとそれでも足りない=引き分けに終わるケースが多かったです．
今回，改めて検討してみて，最善手が引き分けに終わりそうだと判明できて良かったです．
DTSA 5003 統計的推論と仮説検定

学習した内容を深めるために、アウトプットするのが一番良い手段です。もし他人の参考にもなれば、最高です。
そのため、こちらのコース[DTSA 5003 Statistical Inference and Hypothesis Testing in Data Science Applications](https://www.colorado.edu/program/data-science/coursera/curriculum/dtsa5003)から重要なポイントを抜粋し、自分なりの解釈を加えてこちらに残しています。

# 全体概要

このコースでは、主に以下の六つを紹介しています。
	1.	仮説検定の基本概念
	2.	複合検定、力関数、およびP値
	3.	t検定と二標本検定
	4.	正規性を超えて
	5.	尤度比検定とカイ二乗検定
DTSA 5002 データサイエンスにおける推定のための統計的推論

学習した内容を深めるために、アウトプットするのが一番良い手段です。もし他人の参考にもなれば、最高です。
そのため、こちらのコース[DTSA 5002 Statistical Inference for Estimation in Data Science](https://www.colorado.edu/program/data-science/coursera/curriculum/dtsa5002)から重要なポイントを抜粋し、自分なりの解釈を加えてこちらに残しています。

# 全体概要

このコースでは、主に以下の六つを紹介しています。
	1.	点推定
	2.	最尤推定
	3.	最尤推定量の大標本性質
	4.	正規分布に関わる信頼区間
	5.	正規性を超えて：解き放たれた信頼区間！

#
Javaで「引数に配列やクラスオブジェクトを渡す」の動作を確認してみた

# 概要

Javaで「引数に配列やクラスオブジェクトを渡す」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/method/index4.html

# 実装

以下のファイルを作成しました。
```JSample4_1.java
class JSample4_1{
  public static void main(String args[]){
    int num = 8;
    int array[] = {10, 4};

    System.out.println("num = " + num);
    System.out.println("array[0] = " + array[0]);

    henkou(num, array);

    System.out.println("num = " + num);
    System.out.println("array[0] = " + array[0]);
  }

  private static void henkou(int num, int array[]){
    num = 5;
    array[0] = 12;
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample4_1.java 
$ java JSample4_1 
num = 8
array[0] = 10
num = 8
array[0] = 12
```

# まとめ

何かの役に立てばと。
ガンマラカントゥスキトデルモガンマルス・ロリカトバイカレンシスでもわかるLinuxコマンド

##  :white_sun_small_cloud::cow:はじめに.. :lemon::tangerine:

みなさん、おはようございます！
こんにちは！こんばんは！
新卒１年目の大澤です！
数ある記事の中からこの記事を開いていただけたこと、とっても嬉しいです！
ありがとうございます！

私は、7月より音声系アプリの保守運用の現場に参画いたしました！
業務の中では、主にLinuxのコマンドを使用しており、日々Linuxのコマンド操作やオプションについて学んでいます。また、LPICという資格試験の合格に向けて日々勉強しています！
今回は、みなさんと一緒にLinuxのコマンドについて勉強したいと思います！

それでは、さっそくLinuxのコマンドの勉強タイムに入ります！
本日もよろしくおねがいします！

##  :gift_heart::cake: このコマンドたちはなんだろう..？:fork_and_knife:
## :fork_and_knife: 　 cd 　 ディレクトリ名
これは、ディレクトリを移動することができるコマンドです！



## :fork_and_knife:  　pwd
これは、カレントディレクトリの確認をすることができるコマンドです！





## :fork_and_knife:　chmod777　アクセス権　ファイル名
これは、指定したファイルのアクセス権を変更することができるコマンドです！

## :fork_and_knife:　rm ファイル名
これは、指定したファイルを削除することができるコマンドです！



## :fork_and_knife: 　  ls -l 　ディレクトリ名
これは、指定したディレクトリ内のファイルの詳細な情報を表示することができるコマンドです！

## :fork_and_knife:　vi ファイル名
これは、viエディタを起動させるコマンドです！


## :fork_and_knife:　:q
これは、viエディタを終了させるコマンドです！

## :fork_and_knife:　:wq
これは、ファイルを保存して終了させるコマンドです！


## :cherry_blossom::hamster:さいごに..?:revolving_hearts:
これにて、Linuxのコマンド学習を終わります！
みなさん、いかがでしたか～？？
ぜひ、みなさんがこの記事を読んでLinuxのコマンドについて少しでも興味を持ったり、理解することができていたら幸いです！
これまで拙い文章を読んでいただきありがとうございました！！
では、また次回の記事でお会いしましょう～
AWS DEAに合格しました

# はじめに
AWS認定4回目です。
行った学習内容等を備忘録として残しておきます。

# AWS認定とは？
Amazon Web Service(AWS)が主催する、AWSサービスを主軸としたクラウドサービスに関する知識やスキルを認定する資格です。
各資格についての説明は[公式サイト](https://aws.amazon.com/jp/certification/)から確認可能です。

AWS認定には、習熟度及び難易度別にFOUNDATIONAL、ASSOCIATE、PROFESSIONALの3カテゴリと、専門性に特化した知識を必要とするSPECIALITYの1つのカテゴリがあり、4つのカテゴリに分かれています。SPECIALITYの難易度は分類上はPROFESSIONALと同列です。
2024年7月現在、基礎知識やアーキテクチャ、データ分析など種類別に全10種類の資格が存在します。

## AWS DEAとは？
正式名称はAWS Certified Data Engineer - Associateです。
主にAWSを利用したデータ分析の手法やサービス、データレイクやDWHなどのデータ基盤の構築と活用など、データエンジニアリングに関する知識を問う資格です。
難易度としてはAssociateレベルのため、2番目の難易度にあたります。

# 受験の感想と結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748131/f2d5e616-844b-dbc2-d052-52736ec1b0b5.png)

受験結果ですが、合格点720点に対して741点でした。ギリギリ。
感想としては、使ったことどころかコンソールで開いたことすらないサービスが大半だったので、難しい…というより未だにしっくり来てません。たまたま合格点超えたけど上振れっぽい感じがします。
あと、DEAは今年の3月に開始された資格なのでまだそこまで情報やら模擬問題やらも多くないため、その辺がちょっと厳しいかもしれません。とはいえ4か月も経ってるのである程度充実してきているとは思います。

# やったこと
- 模擬問題を解く(10h程度)
→内容としては、いつも通りUdemyの模擬問題を解き、わからない点や説明できない点などを調べて理解する形式で学習を行いました。
今回は新しめの資格ってのもあり模擬問題が100題程度で、問題文や設問で出てくる範囲だけだと知識的には網羅できないかな…？という感じがしました。
必要に応じて別媒体や解説動画等も利用した方が良かったかなと思います。

# 利用した教材

[【DEA-C01対応】AWS認定 データエンジニア アソシエイト 模擬問題集＋詳解](https://www.udemy.com/course/dea-c01aws/?couponCode=KEEPLEARNING)

いつも通りという感じになりますが、模擬問題です。
学習方法としては、
1. とりあえず解く
1. 正解/不正解に関わらず選択肢のどこが誤っているかを説明できないサービスや設定について、解説や公式ドキュメント、個人ブログなどを調べ理解する
1. 後ほど解き直す

ということをしています。

最近割と毎回Cloud Studies JPの模擬問題を使っていますが、コレはちょっとイマイチだったかもしれません。怪しい解答が多い気がします。
あまり調べてないのでわかりませんが、他に良さげなものがあればそちらの方がいいかもしれません？

# 受験費用
- 受験料 11,000円 (半額バウチャー利用)
- Udemy 1,800円

計 12,800円

# 今後受験する人へ
- データエンジニアリングに慣れてる(orDASとかやってた)人は割と簡単に受かりそうです
- 知識無しスタートの場合、実サービスを触ってみた方がいいと思います。ボクはやりませんでしたが
- 模擬問題がイマイチ信用できないので解説読んだうえで怪しそうなら自分で調べてみる方がいいかもしれません。ここは教材によるかも
- 難易度自体はそこまで高くない印象です

# 今後の予定

Associate終わったので次は8月SAPです。
【Flutter】層別アーキテクチャ + RiverPodメモ


■層別アーキテクチャ
- オニオンアーキテクチャ
- クリーンアーキテクチャ

■オニオンアーキテクチャ
ドメインモデルが得たい結果。外側の層から内側に向かって進んでいく

- ドメインモデル層
->ビジネスエンティティとそれに密接に関連するクラスを扱う

- ドメインサービス層
->複雑なビジネスロジックとワークフローを扱う

- アプリケーションサービス層
->ユースケース（アプリケーション固有のロジック）

- UI/DB/テストなど周辺的な関心ごと
->外部要素、インフラ、デバイスとのインターフェースを提供

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136142/ea777447-6eb9-1daf-f5db-9f154aa39092.png)


■クリーンアーキテクチャ
オニオンアーキテクチャのように、外側の層から内側に向かって進んでいく
オニオンアーキテクチャとは各層での役割が若干異なる

- エンティティーズ
->エンティティとプラットフォーム共通のビジネスロジック

- ユースケース
->アプリ固有のロジック

- インターフェイスアダプター
->↑と↓へのデータ変換

- フレームワークとドライバー
->DB、フレームワーク、ツールなど

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136142/ea3c3dd9-35e7-ff4d-f58f-d5fe031bba36.png)

参考：
https://syobochim.hatenablog.com/entry/2022/06/06/125359

■層別アーキテクチャにおける依存性の注入とは
「依存する構造にする」ということ。（実装クラスに対する抽象クラスを使う）
外側は内側に依存する（どのメソッドを使うか興味がある）
内側は外に依存しない（どのメソッドから呼ばれたか興味がない）

＜メリット＞
抽象クラスを継承し、ダミーの動きをするモッククラスを実装することで、ユースケース単体でのテストが可能。
- モック=ダミーの動きをさせる仕組み。スタブを提供する
- スタブ=ダミーのエンティティを返却する機能

■層別アーキテクチャのディレクトリ構成
ディレクトリを見るだけで目的がわかる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136142/2aaa9a3b-66ea-5944-66b2-550174e28b35.png)
【Swift】バックグラウンドスレッドの番号の謎

# 🤔 メイン(UI)スレッド

なんとなくの知識。

```swift
print(Thread.current)
```

```
<_NSMainThread: 0x104606660>{number = 1, name = main}
```

「メインスレッド」は「1番」で一つだけ。

# 🤔 バックグラウンドスレッド

バックグラウンドは、

スレッドが複数プールされ(てい)る。

という認識でいるのですが。

以下コード。

```swift
@ModelActor
actor DataSource {
  nonisolated(unsafe) private(set) static var shared: DataSource!

//  static func createInstance(modelContainer: ModelContainer) {
//    print("createInstance()", Thread.current) // main
//    shared = DataSource(modelContainer: modelContainer)
//  }

  static func createInstance(modelContainer: ModelContainer) async {
    print("createInstance()", Thread.current) // not main
    shared = DataSource(modelContainer: modelContainer)
  }


  func fetch() async -> [Item] {
    print("fetch()", Thread.current) // depends on creating instance
    do {
      let items = try modelContext.fetch(FetchDescriptor<Item>())
      // ...      
 ```
https://android.benigumo.com/20240717/background-modelactor/

ログは以下。
 
```
createInstance() <NSThread: 0x105a25030>{number = 6, name = (null)}
fetch() <NSThread: 0x10370bac0>{number = 8, name = (null)}
```

スレッドのIDらしきも違えば、number も違う。

同じインスタンスのはずなのに。

# 🤔 謎

これはどういうことなの?

どう考えたらいいの?
Codestral Mamba：実践ガイド

## はじめに

Codestral Mambaは、Mamba2アーキテクチャをベースにした革新的なコード生成モデルです。この記事では、Codestral Mambaの実践的な使用方法について、初心者の方にも分かりやすく解説していきます。

https://hamaruki.com/codestral-mamba-next-gen-high-performance-language-model/

## 環境設定

まずは、Google Colabの新しいノートブックを開いて、必要なライブラリをインストールしましょう。

```python
# 必要なライブラリをインストール
!pip install mistral_inference>=1 mamba-ssm causal-conv1d
!pip install huggingface_hub
```

このコードブロックでは、Codestral Mambaの使用に必要なライブラリをインストールしています。`mistral_inference`はMistral AIが提供する推論ツールキット、`mamba-ssm`と`causal-conv1d`はMambaモデルの核となるライブラリ、`huggingface_hub`はモデルのダウンロードに使用します。

## Codestral Mambaのインストール

次に、Codestral Mambaをインストールします。

```python
# Codestral Mambaのインストール
!pip install mistral_inference>=1 mamba-ssm causal-conv1d
```

このコードは先ほどのインストールと重複しているように見えますが、確実にインストールを行うために再度実行しています。

## モデルのダウンロード

Codestral Mambaモデルをダウンロードしましょう。

```python
from huggingface_hub import snapshot_download
from pathlib import Path
import os

# Google Colabの一時ディレクトリにモデルをダウンロード
model_path = Path('/tmp/mistral_models/mamba-codestral-7B-v0.1')
model_path.mkdir(parents=True, exist_ok=True)

# モデルファイルをダウンロード
snapshot_download(
    repo_id="mistralai/mamba-codestral-7B-v0.1",
    allow_patterns=["params.json", "consolidated.safetensors", "tokenizer.model.v3"],
    local_dir=model_path
)

print(f"モデルは {model_path} にダウンロードされました。")
```

このコードブロックでは、Hugging Faceのリポジトリから Codestral Mambaモデルをダウンロードしています。Google Colabの一時ディレクトリ（`/tmp`）にモデルを保存することで、セッション終了後に自動的に削除され、ストレージを節約できます。

## Codestral Mambaの使用方法

Codestral Mambaを使用してコード生成を行ってみましょう。

```python
# Codestral Mambaを使用してコード生成
!mistral-chat /tmp/mistral_models/mamba-codestral-7B-v0.1 --instruct --max_tokens 256
```

```bash
Prompt: Pythonで1から10までの数字を出力するプログラムを書いてください。
Pythonで1から10までの数字を出力するプログラムを書くには、以下のようにforループを使用します。
```

<!-- #region -->
このコードブロックでは、`mistral-chat`コマンドを使用してCodestral Mambaモデルと対話しています。`--instruct`オプションは指示に従うモードを有効にし、`--max_tokens 256`は出力の最大トークン数を設定しています。

実行結果は以下のようになるはずです：

```python
for i in range(1, 11):
    print(i)
```
<!-- #endregion -->


<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">mamba-codestral-7B-v0.1がGoogleColab L4で動いた！！ <a href="https://t.co/LKxQo1a8aQ">https://t.co/LKxQo1a8aQ</a> <a href="https://t.co/gI1mFPpCaQ">pic.twitter.com/gI1mFPpCaQ</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1813589164736360670?ref_src=twsrc%5Etfw">July 17, 2024</a></blockquote> 


## まとめ

この記事では、Codestral Mambaの実践的な使用方法について解説しました。環境設定からモデルのインストール、使用方法、そして性能評価まで、初心者の方でも理解しやすいように段階的に説明しました。

Codestral Mambaは、特にコード生成タスクにおいて優れた性能を発揮します。他のモデルと比較しても、多くのベンチマークで優れた結果を示しています。

今後のAI開発やプログラミング支援ツールとして、Codestral Mambaの活用が期待されます。ぜひ、実際に使ってみて、その性能を体験してみてください。


## 📒GoogleColabノートブック

https://colab.research.google.com/drive/1385YVTJCWxKLKtBNFJ9aa8ikYkg6NkxG?usp=sharing

<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
投稿 17 ブリッジ 2024/07/17

本日の勉強時間　2H

データリンク層は、ネットワーク上でのデータの送受信を可能にする重要な層です。MACアドレスを使用してネットワークデバイスを識別し、フレームベースの通信を行います。しかし、複数のデバイスが同時にデータを送信しようとすると、衝突が発生する可能性があるため、適切な衝突検出と再送制御が重要です。
辛かった過去を思い出の彼方にできる、下剋上エンジニアライフプラン

あなたは父親、母親、学校の先生、生徒のなかに **「復讐したい」** そのくらい憎い人はいますか？

もしそうならば、エンジニアというキャリアやライフプランが近道になるのではと感じ、ご覧の皆様の参考になればと思い書きました。

# なぜ私がそのことを書くか？について

私は2009年からWEBに携わるエンジニアとして約15年努めてきました。しかもそのほとんどは上流でもなければ下流でもなく「PCのことなら何でもできるんでしょ？」と思われ開発よりも介護が求められる、ITとは程遠いアナログな業界でした。

そんな私が何をもってキャリアライフプランを語るのか？

それはエンジニアに比較的向いている性格タイプの強みと弱みがあること、

そしてライフステージの変化で直面する壁と乗り越える方法があること、

この2つについて解説していきます。


# 下剋上、そして復讐を果たすためのステップ

そのステップは大きく3つのステップがあります。

## 1、エンジニアとして業績を出しつつ、収入の一部をメンタルの回復・向上に再投資する

過去に家族や人との関係で辛い経験があり（虐待やイジメなど）その逆境を生きのびようとしてきた人のことをアダルトチルドレンと呼びます。性格タイプは内向型かつ能動型、戦略的思考型、他人を頼らない、などの特徴をもつ人が多いといわれています。

とりわけエンジニア関連職は、アダルトチルドレンを克服しなくても成果をあげられる数少ない自己完結型職業のひとつです。

このような職種はほかに漫画家・職人などがありますが、種類が少ないです。

しかもエンジニアとしてのキャリアは2024年においても収入が上がりやすく、費用対効果も高いのではないでしょうか。

注意点として、増えた収入で単に生活水準やPCのスペックを上げるのではなく、メンタルの回復や向上に再投資することが重要となります。

目に見えない心身の傷はストレスや依存症の原因になり、穴の空いたバケツのようにお金を浪費する原因にもなりかねません。


## 2、これまでの自分と同じタイプの人を受容する覚悟を決める

下剋上、といっても他人にマウンティングすることではありません。

メンタル回復と向上を行い、視座を高め、自己完結型以外の仕事でも成果をあげていくことです。

そのとき問題になるのが、まるで自分の弱みや性格の悪さをもっているような人と一緒になる機会が多いことです（同族嫌悪とも呼びます）

かくいう私も、ときには宇宙人や動物のような人と根気強くコミュニケーションする場面もあります。

この不快感を許容できるか否かが、下剋上のポイントになると私は解釈しています。


## 3、辛かった過去を思い出の彼方にする

メンタル向上を続けることで、辛かった過去が五感でよみがえってくる現象（フラッシュバック）や刺激に即反応するくせを減らすことができます。

その頃には、あの憎い人々が記憶や夢の中であなたを苦しめる日々は終わっていることでしょう。

当の本人たちに傷をつけなくても復讐することはできるし、エンジニアの経験も増えて一石二鳥なのでは？


## 最後に

もしあなたが「現場仕事が苦手」「協調性に欠ける」「発達障害あるか診断したら」と言われたら弱みだけを気にするのではなく、強みをもとにエンジニアライフプランを追求する方法もあると私は考えています。

これを「辛かった過去を思い出の彼方にできる、下剋上エンジニアライフプラン」として今回提案いたします。
【CSS】画像を指定した比率で切り取る方法


`img`要素に`aspect-ratio`と`object-fit: cover`を指定することで`aspect-ratio`の比率で画像をトリミングできます。

```css
img {
    aspect-ratio: 1 / 1;
    object-fit: cover;
}
```

https://developer.mozilla.org/ja/docs/Web/CSS/aspect-ratio

https://developer.mozilla.org/ja/docs/Web/CSS/object-fit
1on1をする前にアンケートを取るようにしたらなんか捗ったよという話


最近はメンバーのマネジメント的な業務も出てきておりまして、「やっぱ 1on1 とかやらんとなー」と思っておりました。

どうやればいいんだろう？といろいろ調べていて、個人的に理解しやすかったのが ↓ の記事でした。

https://www.kaonavi.jp/dictionary/telework_1on1/

> 1on1 の主役はあくまでも話をする側、部下側です。部下の現状や悩みに寄り添いながら本人の能力を引き出すこと、管理することではなく本人の成長を助けることが 1on1 の目的です。

あくまで**話をする側が主役**だよ、ってことですね。聞く側が主動で話してしまったらそれは「伝達行為」に近くなってしまいますし、なんかもったいないなと思っていたのでこれはとても参考になりました。

が、意図としてはその通りだと思うものの、実際に 1on1 をしてみると話が続かず、結局こちらから聞くことが多くなってました。

そんな中で見つけたのが下の記事でした。

https://tech.mobilefactory.jp/entry/2024/04/09/160000

> **体調**
> 最も大事なセクションだと思っており 1on1 に外せません。仕事 < 健康です。

これもステキな文ですね。早速聞いてみることにしました。
まず調子を聞いてみると、そこから話が広がったりするので 1on1 が深まるようになりました。
毎回変わり映えのない人でも、「なぜ変わらないか」の理由は変わったりするのも面白いです。

ただこれも、毎回コッチから「今回の調子はどう？」とか聞くのが大変になってきまして。

いろいろ考えた結果、**アンケートフォームを作ること**にしました。

![アンケートフォーム](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1553291/f4a3ae60-3d14-1fc4-812f-6e91fef3818d.png)

チームメンバーの名前と調子（1 ～ 10）と、ついでに「なんか話したいことがあったら教えて」的な記入欄を作ることに。

アンケートフォームは Google Forms でも Microsoft Forms でもなんでもよいと思います。
私はそこから DB に流し込むようにし、1on1 の時にすぐ見られるようにしてますが、集計用スプレッドシートを加工するのでもよいでしょうね。

で、アンケートに答えてもらってから 1on1 をするようになったら、**皆さん言いたいことがいろいろあることが判明**しました。

そりゃそうです、1on1 の日に「これをアイツに言ってやろう！」とか「聞かれたらこの話をしよう」とか思うくらいなら、**事前にアンケートに書いてしまえばいい**。断然ラクですもんね。

6 月からアンケートをはじめまして、体感でも「いろいろ話してくれてるかも！」という気はしてみたので集計してみました。

![話した数と聞いた数の月別比較](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1553291/54afd3ed-dedb-14ac-388a-ea2646379b14.png)

1on1 をやりながら、「相手が話したこと」「相手に聞いたこと」をメモっていたグラフが ↑ になります。

月によって人数も回数も違うので山は気にする必要がありませんが、注目すべきは「相手が話したこと（青い棒グラフ）」が「相手に聞いたこと（赤い棒グラフ）」より**上回っている**のです！

内容も、最近会得したコーディング技術とか自分の体験に関するレポートとかガジェット情報とかお店情報とか、いろいろありますが自分の考えを言語化する場としても 1on1 が活用されているようで楽しいです。

私がやっている 1on1 自体は、できるだけメンバーの主体性に依存したく、打ち合わせ時刻もメンバーが選べるようにしてます（曜日は固定ですが）。
その辺の私なりのやり方もいずれ紹介したいですね。

まずは**聞きたいなと思ったら最初から募っちゃえば捗るかも！** ってな事例紹介でした。
【Laravel】メソッドインジェクションを利用してCookieの値を偽装する

:::note
引き続きLaravel v8 を使っています。化石を使っています。
:::

前回の続きです。

https://qiita.com/KyongminS/items/c9be3334cc8a6189f25e

今回紹介するユースケースとしては、

**テストしたいCookie処理を含むサービス存在しており、そのメソッド使用しているcontrollerのURLを呼ぶと色々副作用がありそうで面倒くさそうなので、そのメソッド単体を呼び出せるようにしてテストしたい**

というケースです。

Cookie関連の処理を含むメソッドは、Cookieの特性上、URLリクエストを通してテストする必要があります。

この方法で取得されるCookieは暗号化されているので、暗号化処理のミドルウェアを無効にします。use で WithoutMiddleware をインポートすると他のミドルウェアも無効になってしまうので、以下の記述を対象のテストケースの先頭に書きます。

```php
$this->WithoutMiddleware(\App\Http\Middleware\EncryptCookies::class);
```

テストしたいメソッドは以下です。`Cookie::queue()` メソッドが含まれている処理です。

```php:ArticleService.php（とします）
public static function refresh_cookie () {
    $cookie = Cookie::get("cookie1");
    if ($cookie) {
        return $cookie;
    }

    $cookieList = ['A', 'B', 'C'];
    $newCookie = $cookieList[array_rand($cookieList)]; 
    Cookie::queue("test", $newCookie, '30');
    return $newCookie;
}
```
次に、対象メソッドを呼び出すテスト用のパスを作っちゃいましょう。

# routes/web.php
```php
Route::get('/test-cookie', function () {
    $newCookie = ArticleService::refresh_cookie();
    $cookie = cookie('cookie1', $newCookie, 60);
    return response('Cookie has been set')->cookie($cookie);
});
```
`Cookie::queue()` は、リクエストの終了後にクッキーを設定する非同期関数なので、リクエストを走らせてレスポンスを取得する必要があります。

そのために、テストリクエスト用のパスを作る必要があるということですね。そしてレスポンスにメソッドで取得したクッキーをセットする必要もあります。

こうして環境構築をして、出来上がったテストコードは以下のようになります。
```php
public function test_refresh_cookie__クッキーが設定されているか(): void
{
    // Cookieの暗号化を無効にする
    $this->WithoutMiddleware(\App\Http\Middleware\EncryptCookies::class);
    
    $cookies = ['cookie1' => null];
    $response = $this->call('GET', '/test-aaa', $cookies);

    $cookie = $response->headers->getCookies()[0];
    $this->assertContains($cookie->getValue(), ["A", "B", "C"]);
    # -> OK
}
```

ところで、公式のCookie偽装方法は、`withCookie` , `withCookies` を使用してGETリクエストを送信しています。 

```php
$response = $this->withCookie('cookie1', 'A')->get('/');
```

しかしこのメソッドではミドルウェアを無効にしても暗号化がされたものが取得されます。
なので以下をミドルウェアの無効化の記述の下に挿入します。
```php
$this->WithoutMiddleware(\App\Http\Middleware\EncryptCookies::class);
$this->disableCookieEncryption();
```
この場合の完成系は以下になります。
```php
public function test_refresh_cookie__クッキーが設定されているか(): void
{
    // Cookieの暗号化を無効にする 
    $this->WithoutMiddleware(\App\Http\Middleware\EncryptCookies::class);
    $this->disableCookieEncryption();

    $cookies = ['cookie1' => null];
    $response = $this->withCookies($cookies)->get('/test-cookie');

    $cookie = $response->headers->getCookies()[0];
    $this->assertContains($cookie->getValue(), ["A", "B", "C"]);
    # -> OK
}
```

Cookieをランダムに返しているため、`assertion`は `assertContains` を利用していますが、取得できるCookieが自明の場合なら、`assertCookie` や `assertPlainCookie` でアサーションしましょう。

こうしてCookieの処理を持つ関数を他に影響を及ぼすことなく/考慮することなく、テストが出来ます。