OmniAICreator/Qiita-1.07M huggingface dataset:
リモートネイティブが実践するリモートで働く技術

この記事は**カオナビ AdventCalendar2023(シリーズ1)** 10日目です🎉

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

# はじめに

株式会社カオナビの渡辺です。
普段はWebサービスのバックエンド開発をしています🧑‍💻

私は新卒でエンジニアとして働き始めて以来、ずっとリモートワークの環境で働いています。そんな**リモートワークネイティブ**が実践している快適にリモートで働く方法を共有します！


# 私が考えるリモートワークの難しさ
それは<font color="red">**「コミュニケーション」**</font>です。

リモートワークで働く中で難しさを感じる場面は「コミュニケーション」だけでなく、さまざまな難しさがあります。それは、仕事とプライベートの境界の曖昧化、自己管理の難しさ、オンラインツール利用の難しさなど多岐にわたります。
しかし、私としては圧倒的に「コミュニケーション」に難しさを感じていますし、**仕事の生産性を下げる可能性を一番秘めている難しさ**ではないかと考えています。なので、この記事では「コミュニケーションの難しさ」とその対応策に焦点を当ててみたいと思います！


<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376004/90f77abd-0513-b371-ec25-33094eaa3345.png">

<font color="gray">（↑ チャット上でのやり取りに難しさを感じている人の絵：　ChatGPT DALL·Eで作成）</font>


# あるあるでわかるコミュニケーションの難しさ
リモートワークの環境では、**オフィスでやれていたような基本的なコミュニケーション**がさまざまな形で**妨げられる**ことがあります。


普段リモートワークで働くみなさんの中には、例えば以下のようなパターンで難しさを感じたことが**一度**はあるんじゃないでしょうか？

## ニュアンスが伝わらないパターン
「**それってどんな意図ですか**」とチャット上で端的に聞かれた時に、相手がどんなニュアンスで聞いてきているのかわからずに<font color="red">**何か地雷を踏んでしまったか**</font>と無駄にすごく焦る。

``` plain: チャット上にて
ぼく： 「△△の部分はxxで対応できると思うのですが、○○さんはどう思いますか？」  
○○さん：  「それってどんな意図ですか」
ぼく：  （...😰）
```

## リアクションがわからないパターン
「**これ重要な話なんだけどみんな話をちゃんと聞いてるのかな？**」 「**今どういう感情で聞いてくれてるんだろう？**」 だったり、オンラインMTG中に聞き手が<font color="red">**どんな反応をしているのか気になって**</font>自分の話しに集中できない。

## 自分を知ってもらえないパターン
「**自分のことを社内の人に知ってもらって、いろんな人とコミュニケーションを取りたい！ 仕事の機会を増やしたい！**」と思っているけど、そもそも<font color="red">**自分を知ってもらえる機会が少ない**</font>からどうしようもない。


# パターン別の難しさを解消するアクション

上記で挙げたあるあるパターンに対して、それぞれすぐに取り組みやすいアクションをピックアップしてみました！ 実際に自分が実践していて効果を実感しているものなのでとてもおすすめです。

## 「ニュアンスが伝わらないパターン」 に対するアクション
1. なるべく絵文字を使う
2. 文章でニュアンスが伝わらないと感じたら軽いMTGをお願いしてそこで議論する
3. 話す時よりも伝わりやすさを意識した文章を作る

特に、**2.がおすすめ**です。
チャット上で何往復かやり取りをしていくなかで「**これは細かいニュアンスまで伝えたほうがいいな**」と感じた場合は、すぐに軽いMTGをお願いして<font color="red">**口頭で伝える**</font>ことでチャットよりもスムーズに伝えることができます。もし、Skackを使っていれば**ハドル機能**を使うことをおすすめします。📞

## 「リアクションがわからないパターン」 に対するアクション
1. リアルの時よりもオーバーリアクションを意識する / してほしいと頼む
2. なるべく顔を映す / してもらうようにする

特に、**1.がおすすめ**です。
オンライン上では、みなさんが思っている以上に**自分のリアクションは相手に見えてない**です。そのため、自分が聞き手だった場合は、話し手のコミュニケーションは対面の時よりも<font color="red">**2倍以上の負担**</font>があると考えたほうがいいです。自分が話し手の時もそうです。なので、話し手に快適に話しを進めてもらうためには、聞き手側の努力が必要だと考えています。自分のリアクションが伝わりやすいように、<font color="red">**普段の2倍はオーバーにリアクション**</font>していくといいかもしれません！📢

## 「自分を知ってもらえないパターン」 に対するアクション
1. 社内SNSがあれば、頻繁に呟いて自分を知ってもらい、頻繁に覗いて他メンバーを知る
2. とあるスレッドに横から自分の意見を出してみる
3. 社内のオフラインイベントに参加する

特に、**3.がおすすめ**です。
普段リモートで働いている場合は、<font color="red">**オフラインでメンバーに会える機会はとても貴重**</font>だと思います。そんな貴重な機会を逃すと、参加した人としなかった人との差が圧倒的についてしまいます。もしあなたが上司だったら、オフラインで会って話したことのある人と、リモートでしかやり取りしていなかった人の2人がいる場合に、**どちらに仕事を任せたいでしょうか？** <font color="blue">私なら前者</font>です。
極端ですが**全てのオフラインイベントに参加する**つもりでいると、**参加しない人との差別化**ができて新たなチャンスに巡り会えるかもしれません🔥

# おわりに

リモートワークで働く中で「**コミュニケーション**」は誰しもが抱えている難しさだと思います。しかし、その難しさに対する**対策を知って実践**していくことで、リモートワークの超強力なメリットを享受しながら最高に生産性高く仕事ができるはずです！

今回紹介したアクションをぜひ取り入れて、素敵なリモートワークライフを楽しんで下さい！

それでは次回11日目の記事もお楽しみください！！👍

https://corp.kaonavi.jp/recruit/recruitment/
Azure Information Protection（AIP）のメール暗号化（転送不可）を検証してみた

Microsoft 365関連で調査、検証した内容をブログにしています。
今回はAIP（Azure Information Protection）についてです。

### ■はじめに
AIPでできることの1つとして、メールに秘密度ラベルを付与し、暗号化をすることが可能です。
今回、暗号化のオプションの1つである「転送不可」の動作について検証しました。

### ■検証環境
ライセンス：Microsoft 365 Business Premium
Officeエディション：Microsoft 365 Apps for Business


### ■転送不可の設定について
該当する設定値としては以下の赤枠部分です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618363/431f5a4d-237b-68f7-172a-de62e9395e58.png)

※補足として、本設定値は青枠部分の「ラベルを適用するときにユーザーがアクセス許可を割り当てられるようにする」を事前に選択した場合にのみ設定可能な項目になります。

どのような制御になるかは公開情報に記載されていますが、要約すると以下になります。
[電子メールの [転送不可] オプション](https://learn.microsoft.com/ja-jp/azure/information-protection/configure-usage-rights#do-not-forward-option-for-emails)

- 受信者側は、閲覧のために認証される必要がある
- 受信者側は、「転送」、「印刷」、「名前を付けて保存」ができない
- 受信者側は、メールを返信する際に宛先を変更することができない


### ■動作確認
上記の転送不可オプションを有効にしたラベルを新規で作成し、動作を確認していきます。


メールを新規作成し、ラベルを付与して送信します。
メールの宛先＝メールに対するアクセス許可を付与したいユーザーとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618363/ff3c2cad-4c47-19a9-a847-f23e24cd33ea.png)



受信側でメールを確認します。
メールアイテムに暗号化されていることを示す南京錠マークと、メール内容がプレビューされず資格情報が必要なメッセージが表示されていることが確認できます。
メールをダブルクリックして開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618363/3a047c99-7c37-02a2-24c7-0b1be0d290e7.png)

メールアイテムをダブルクリックして開こうとすると、IRMに関するダイアログが開きます。
ダイアログの表示後、メールが開かれる動作となることから、このタイミングで資格情報などを確認して認証を行っているものと思われます。
※公開情報に明確な記載がないため、ここの詳細については不明です。ご存じの方がいらっしゃいましたらコメントで補足いただけると嬉しいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618363/b2532681-a85a-8b37-e776-ccab40bb176a.png)


メールが開かれたので、諸々の動作確認を行います。
転送不可の設定にて操作が制御されている旨がメール内の赤枠部分に表示されていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618363/f9324fdb-1218-71b5-efac-1894131d4623.png)


メールの転送ができないか確認します。
「転送」ボタン自体がグレーアウトとなり、制御されていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618363/88d73cd0-4147-5e61-4dbd-b6340a65c04a.png)

また、メール本文のテキストもコピーができないように制御されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618363/cc01e72a-1d07-f18e-ab48-921d2ce7c642.png)


「印刷」、「名前を付けて保存」のボタンもグレーアウトで制御されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618363/ec6527e7-6390-1935-55af-3cda83dfdc56.png)


宛先が編集できないことも確認します。
画像ではわからないのですが、「宛先」、「CC」のボタンをクリックしても反応しないよう制御されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618363/44908335-9aee-923e-355c-e601618acf9b.png)


また、補足となりますがOotwでも同様に制御されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618363/35d936b8-5aff-66c3-5bdd-b5aa4e42360e.png)


### ■最後に
ラベルを付与するだけで、今回のような制御が手軽に行えるのは便利だと思いました。
メールの情報漏洩リスクとしてよくある宛先間違いについては、本機能を使うことで対策ができそうです。
添付ファイルを付けたい時もファイルにラベルを付与しておけばさらにセキュアにできそうですね。

本記事の内容が何かの参考になれば嬉しいです。
CoAPでバイナリデータを送信する（環境はGoogle Collaboratory）

CoAPサーバーを立てる機会があり、そのテスト用にCoAPクライアントを探していたのですが、なかなか見つからず、[aiocoap](https://aiocoap.readthedocs.io/en/latest/)というPython CoAPライブラリを使うことにしました。

## CoAPとは
GMOの開発者ページにはこのように書かれています。
>CoAPは[RFC 7252](https://datatracker.ietf.org/doc/html/rfc7252)で上がっている、UDPを使ったM2M向けのプロトコルです。マイコンのような低消費電力、ROM/RAMの容量をターゲットにしています。CoAPの特徴的なのはUDPを使ってHTTPを実装しているような仕組みになっている点です。

感じたのは、MQTTを実装するより簡単にサーバーは立てられるかなというところ。Pub/Subのしくみというより、RESTfulな感じです。

## Google Collaboratoryで
### ライブラリをインストール
```
!pip install aiocoap
!pip install nest-asyncio
```
aiocoapとnest-asyncioをインストールします。nest-asyncioは、Google Collaboratoryで非同期処理を実装する際の**おまじない**みたいなもので、非同期処理のasyncioをインポートする前に下記2行を入れるとよいそうです。
```おまじない.py
import nest_asyncio
nest_asyncio.apply()
```

### Googleドライブをマウント
今回は、CoAPプロトコルでバイナリデータを送信したく、そのバイナリデータをGoogleドライブ上に置いておきたかったので、マウントしました。
```mount.py
from google.colab import drive
drive.mount('/content/drive')
```

### CoAPで送信

```coap_post_binary.py
from aiocoap import *
import nest_asyncio
nest_asyncio.apply()
import asyncio

async def main():
  #foo.binファイルをGoogleドライブに入れておく
  file_path = '/content/drive/My Drive/Colab Notebooks/coap/foo.bin'
  # バイナリデータをファイルから読み込む
  with open(file_path, 'rb') as f:
    data = f.read()

  print('Request: \n%s'%(data))

  context = await Context.create_client_context()
  await asyncio.sleep(2)

  #メッセージを定義
  request = Message(code=POST, payload=data, uri="coap://[HOST_NAME]/[PATH]")
  response = await context.request(request).response
  print('Result: %s\n%r'%(response.code, response.payload))

if __name__ == "__main__":
  asyncio.run(main())
```
CoAP通信に成功すると、下記のように要求と応答ペイロードを確認することができます。
```
Request: 
b'\xbdW\x0e\x00\x00r\x08\x0e\x00\x00'
Result: 2.03 Valid
b'\xa62\xac]d\xa9\'\x06\xe9O\r\xa1\xa.....'
```
[Servicenow]Employee Centerを触ってみた

# Employee Centerの設定
Employee Centerを触ってみたので、やったことを簡単にまとめます。

## 環境
- Version：Tokyo

## 設定手順
OOTBのままだとこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/06d16400-f5bd-101a-f856-b52f9bd9f522.png)

Goalは、自分が作成したサービスカタログの表示までとします。
やることは以下です。

1. taxonomyの作成
https://qiita.com/tabuchi530/items/bbf865f473052d1716ec

2. topicsの作成
https://qiita.com/tabuchi530/items/16d463d86aa2d9b7c1d9


3. topicsとcontentの紐づけ
https://qiita.com/tabuchi530/items/b893a0c9ddfcadde0357

仕上がりはこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/32d47211-8c22-7258-45c7-d19644518176.png)



# 参考
- [Employee Center](https://www.servicenow.com/jp/products/employee-center.html?state=seamless)

- [Employee Center(Docs)](https://docs.servicenow.com/ja-JP/bundle/utah-employee-service-management/page/product/employee-center/concept/employee-center-landing-page.html)

- [Employee Center ポータルの構成(Docs)](https://docs.servicenow.com/ja-JP/bundle/utah-employee-service-management/page/product/employee-center/concept/configure-ec-portal.html)

- [taxonomy(Docs)](https://docs.servicenow.com/ja-JP/bundle/utah-employee-service-management/page/product/employee-center/concept/config-taxonomy.html)
MySQLのSELECT結果をExcelファイルに貼り付ける

記事化するのもちょっと恥ずかしいただのExcelの一機能、、、でもこれを発見したときちょっと感動してしまったでご紹介。

# Background

とあるシステムのデータベースをAmazon RDS for MySQLで構築・運用。
トラブルシューティングのための調査対応で、EC2インスタンスから `mysql` コマンドでDB接続しコマンドを実行。
記号と空白できれいに整形されたレコードセットは目で見る分には親切なものの・・・


```
+-------------------------------+-------------+-----------------+--------------+-----------+
| table_name                    | data_length | max_data_length | index_length | data_free |
+-------------------------------+-------------+-----------------+--------------+-----------+
| ar_internal_metadata          |       16384 |               0 |            0 |         0 |
| attachments                   |    74022912 |               0 |     36257792 |   7340032 |
| auth_sources                  |       16384 |               0 |        16384 |         0 |
| boards                        |       16384 |               0 |        32768 |         0 |
| changes                       |       16384 |               0 |        16384 |         0 |
| changeset_parents             |       16384 |               0 |        32768 |         0 |
...
```

# Problem

記号と空白できれいに整形されたレコードセットをExcelファイルに貼り付けたい。

* ふつうにコピー＆ペーストはもちろんNG。
* RDSはマネージドサービスなので `select into outfile`文によってサーバー上にファイルを書き出すわけにもいきません。
* `mysql`コマンドをバッチモードで利用して、SQL実行結果を含む標準出力を`sed`で加工しTAB区切りのテキストにしてからExcelに貼り付ける・・・ということも可能ですが、すでに目にしているものをすぐに利用できないのは悔しいです。
* 言うまでもないことですが、こうしたアドホックなクエリ実行の一々についてDatePipelineやAthenaなど構築にも運用にもコストがかかるものを使いたくないです。

# Solution

「テキストファイルウィザード」を利用する。

1. リボンの「ホーム」タブ→「貼り付け」→ __「テキストファイルウィザードを使用」__
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/ee819e74-07f3-43ef-dc49-f22ff872f28c.png)
   
2. ウィザード1/3で __「スペースによって右または左に揃えられた固定長フィールドのデータ」__ を選択
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/1472896b-682c-d9ec-3b50-d04e0fff4936.png)
   
2. ウィザード2/3で「データのプレビュー」を確認し、必要に応じて矢印を位置合わせ
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/ca0abc8b-8b0c-4362-51f8-777661679961.png)

2. ウィザード3/3で区切り文字など不要な列について「削除する」を選択
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/118954cb-66e4-e678-756a-35c06c9e87a9.png)

1. 横罫線に当たる部分は手作業で削除
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/6414bda7-e162-57e5-48a4-ceca0189d5d1.png)

以上で、簡単＆キレイにExcelのシートにクエリ実行結果が貼り付けられました🙌
AttributeError: partially initialized module 'cv2' has no attribute 'dnn'

MMAction2を使って研究を進めている中で、何度も掲題のエラーが発生したため、備忘録・困っている方のために投稿することにしました。

https://mmaction2.readthedocs.io/en/latest/get_started/overview.html

# 解決策
自分は以下サイトを参考に、`/Users/apple/[環境名]/lib/[pythonバージョン]/site-packages/cv2/typing/init .py`ファイルから 169 行目をコメントアウトすることで修正できました。

169 行目をコメントアウトします。
``` python:init.py
#  LayerId = cv2.dnn.DictValue
```

https://github.com/facebookresearch/nougat/issues/40#issuecomment-1737866321
Vivliostyle CLIのDockerコンテナからプレビューを表示する

[Vivliostyle CLI](https://github.com/vivliostyle/vivliostyle-cli)ではDockerコンテナを使ってPDFを出力できます。このコンテナからプレビューを表示させることも可能です。

コンテナは[ghcr.io/vivliostyle/cli](https://github.com/vivliostyle/vivliostyle-cli/pkgs/container/cli)に登録されており、[Dockerfile](https://github.com/vivliostyle/vivliostyle-cli/blob/main/Dockerfile)はリポジトリのルートに置かれています。

Vivliostyleに限らず、コンテナからGUIを表示させたい時はX Window Systemの設定を通してあげることになります（[参考](https://qiita.com/Spritaro/items/f907a9b52cb78e4fbec0)）。WSL2なら以下のようにします。Docker Desktopの`Settings > Resources > WSL integration > Enable integration with my default WSL distro`を有効にして、Linux側のシェルから起動する必要があることに注意してください。

```shell-session
$ mkdir workdir
$ cd workdir
$ echo -e "# これはサンプルの原稿\n\nこれはサンプルの本文。\n" > manuscript.md
$ tree
.
└── manuscript.md

0 directories, 1 file

$ docker run --interactive --tty --rm ghcr.io/vivliostyle/cli:8.6.0 --version
cli: 8.6.0
core: 2.25.9

$ docker run \
    --env "DISPLAY=${DISPLAY:-:0.0}" \
    --volume /mnt/wslg/.X11-unix/:/tmp/.X11-unix \
    --mount "type=bind,source=$PWD,target=/vivliostyle" \
    --workdir /vivliostyle \
    --interactive \
    --tty \
    --rm \
    ghcr.io/vivliostyle/cli:8.6.0 preview ./manuscript.md
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1550728/60d1bf03-fe2c-3c48-a74f-65bd3689371d.png)

「コンテナがWebサーバになってプレビューできたらいいのに」というコメントを以前見かけた気がします。Vivliostyleの出力結果はChromiumのレンダリングに依存する以上、Webサーバとして提供する＝表示するブラウザをユーザーに選択させるのではプレビューとして意味がない、という話なのかなと思います。
ローカルマシンにリモートリポジトリを立てたい！

こんにちは、tuna828です。
1人作業＋外部公開NGなのでgithubとかには上げれないけど
ソースコード管理したいなぁ。。
ということで、ローカルマシン上にリモートリポジトリを作ってみました。

### 前提条件
* OSはWindowsです
* gitインストール済みです
* ソースコード群既にあります

### やってみよう！
まず、リモートリポジトリ用のフォルダを作成！
```
> mkdir remote_repo
```
リモートリポジトリの設定！
```
> cd remote_repo
> git init
...
...
> git config --bool core.bare true
```

### 続いて、ローカルの作業ディレクトリも設定！
```
> cd work_dir
> git init
...
...
> git remote add origin "C:\...\...\remote_repo"
```
開発用のブランチを切る前に最初のコミットをしておきます。
```
> git add .
> git commit -m "Initial commit"
> git push origin master
```
これで最初の準備はOKです！
ブランチを切って、開発に入りましょう！

### 余談
5ファイルぐらいファイル名を間違えて作業してたのですが、
```
> git checkout -- "C:\...\...\間違えた作業のファイル.java"
```
これで一発で戻せたので本当にgit入れておいてよかったです。
朝の自分ありがとう。
php8のlaravelでもoptional()を使っていませんか

## 概要
laravelライフで、バージョン8までよくお世話になっていたへルパのoptional()

`optional`で囲った変数から動的メソッドなどを記述した際、
変数が`null`の場合にエラーを起こさずにnullを返却してくれるというものです。(参考に記載)


しかし、php8からヌルセーフ演算子というものが追加されました。
挙動としては`optional`と同じで、同じ効果かつ短く記述できます。
比較するとこんな感じです。

```php
//optionalへルパ
optional(optional($user)->getAddress())->getCity();

//ヌルセーフ演算子
$user?->getAddress()?->getCity();
```

簡潔に書けて良いですね

## 参考

https://readouble.com/laravel/8.x/ja/helpers.html#method-optional


https://www.php.net/manual/ja/migration80.new-features.php
【rpm,yum,npm,apt,dnf...】結局xxx install系のコマンドは何が正解なのか【パッケージ管理コマンド】

[CYBIRD Advent Calendar 2023](https://qiita.com/advent-calendar/2023/cybird) 14日目担当の @tomoko_ishizaka です。
13日目は @cy-seiyan さんの「タイムアウトが頻発して泣きを見た話」でした。
是非こちらも合わせてご覧ください

## 概要
パッケージ(追加機能)をインストールする際、よく`npm install xxx`や、`yum install xxx`のようなコマンドを実行します。
しかし、同様の使われ方をするコマンドとして`apt`や`dnf`などもよく見かける上、今回は何を使えばいいのか毎回不明瞭なまま(手順書に言われるがまま)私も実行していました。
そこで改めて、これらのコマンドへの理解を深めるため、違いを調べてみました。

## 結論
欲しいパッケージが、どのOS用なのか、もしくはどの言語用なのかによって、[適切なコマンド](https://qiita.com/tomoko_ishizaka/private/faea9a5d7ef99e58ee10#%E3%82%88%E3%81%8F%E4%BD%BF%E3%81%86%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E7%AE%A1%E7%90%86%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E4%B8%80%E8%A6%A7%E3%81%A8%E6%A6%82%E8%A6%81)を使い分ける。


## そもそもパッケージ管理コマンドとは
パッケージ管理コマンドとは、"実行ファイルや設定ファイルやライブラリを一括で管理するためのコマンド"です。
ライブラリ同士でバージョンの依存関係等がある場合、それらの整合性を保ちながらインストールやアップデートをする必要があり、それを簡単に実現するために、基本的にはパッケージ管理コマンドを使います。
参考：[【パッケージ管理システムとは？】Linuxでのパッケージ管理の使い方まとめました](https://eng-entrance.com/category/linux/linux-package)

`yum`を例に使い方と流れを説明しますと、
```
yum install xxx #指定したパッケージをインストール
yum list installed #インストールしたパッケージを一覧表示
yum update #アップデート可能なパッケージを全てアップデート
```
参考：[YUM コマンドチートシート for Red Hat Enterprise Linux](https://access.redhat.com/sites/default/files/attachments/rh_yum_cheatsheet_1214_jcs_print-ja.pdf)

このような感じで欲しいパッケージをインストールすることができます。
しかし、MacOSで上記を実行しようとすると、`command not found: yum` と出てしまいます。
これは、yumというパッケージ管理ソフトがMacOS用ではなく、標準では搭載されていないからです。
（後述しますが、MacOSではHomebrewというパッケージ管理ソフトの利用が一般的です）



## 不適切なものを使うとどうなるか
では、間違って不適切なコマンドでインストールしようとしてしまった場合はどうなるのでしょうか。
結論としては、『`command not found`』や、『`Could not find a matching version of package`』系のエラーが出てインストールできないため、間違いに気づくことができます。

#### エラーの詳しい解説
`command not found` -> コマンドが入っていないエラーです。インストールする必要があるか、そもそもOS的に別のコマンドが用意されている可能性があります。

`Could not find a matching version of package` -> インストールしたいパッケージがないエラーです。パッケージ名が間違っているか、バージョンが対応していないか、インストールコマンドが間違っている可能性が高いです。


## よく使うパッケージ管理コマンド一覧と概要
参考：[パッケージ管理ツールの紹介【OS/言語別】](https://ma-vericks.com/blog/package-manager/)
### Linux(Red Hat系)
rpm、yum、dnf
※Red Hat系のLinuxではPRMパッケージが使われており、その管理がrpmコマンド。ただし、RPMパッケージの依存関係等は解決してくれないため、それも含めた統合管理がyumコマンド。このyumの後継コマンドが、dnf。使い方はyumもdnfもほぼ同じです。

### Linux(Debian系)
dpkg、apt
※rpmとyumのように、dpkgがここのパッケージ管理、aptが統合管理を担います。

### Mac
Homebrew

### Windows	
Winget、Chocolatey
※wingetの方があたらしく、Windows 10だとこちらが正式版になったとのこと。

### JavaScript(Node.js)	
npm、yarn
※package.jsonの内容をnpmコマンドでインストールできます。yarnはnpmより厳密なバージョン指定やインストール速度の速さ等の利点があります。

### PHP	
Composer
### Python	
pip
### Ruby
gem

## おわりに
理解する前はブラックボックスでしたが、理解してみればシンプルでした。
何をインストールしているのか、どこからしているのか、コードと睨めっこしていると見失いがちですが、現実世界で考えれば、どこの店で買うのか、どの道を通っていくのか、と一緒だなと感じました。
今後も、ただ受動的に打っているコマンドの理解を少しずつ深めていきたいです。

[CYBIRD Advent Calendar 2023](https://qiita.com/advent-calendar/2023/cybird) 、15日目は@kyukkyu81さんの「AIにニュースをシニカルに伝えてもらったら意外と興味深かった件」です。
お楽しみに！
ログイン機能のあるサイトをスクレイピングする際に役立ったサイトまとめ

### 前提
Google Colabを使用しました。
seleniumを使用しています。
スクレイピング初心者がなんも知らん状態から調べながらやった際にお世話になったサイトをまとめているだけです。

### サイト一覧
https://zenn.dev/robes/articles/b0542824ec61a6

https://www.miracleave.co.jp/contents/1202/post-1202/

https://www.seleniumqref.com/api/python/element_get/Python_find_element_by_name.html

https://www.selenium.dev/ja/

#### おまけ・感想
初めてでわからないことに取り組むときは、
①自分の向き合っているタスクを明確にする
②同様なタスクに取り組んでいるサイトや記事を探してヒントを得る
③得たヒントを詳しく調べて知識を得る
④ヒントを生かして自分のタスクに取り組む
の4stepがいいなって思いました（）
味の素

# 味の素社長、半導体向け層間絶縁材で新たな生産拠点も視野
 味の素はパソコン向けシェアでほぼ100％を占める層間絶縁材で、現在の２つの国内拠点に加えて新たな生産設備も視野に入れている。同社が２桁成長を期待する市場で世界経済情勢を見据えながら確実な製品供給を目指す。
 　藤江太郎社長は12日のブルームバーグとのインタビューで、生産を強化することで「万が一の時に顧客にしっかり提供できる体制を作る」と語った。グローバルな政治・経済情勢に対応していくとして、海外生産の可能性にも含みを持たせた。
 味の素が生産するのはうま味調味料の副産物を使って開発した「味の素ビルドアップフィルム（ＡＢＦ）」という製品。パソコンの中央演算処理装置（ＣＰＵ）に従来使われていた層間絶縁材より加工しやすい点が特徴だ。高度な微細化が進む半導体の配線に有利とされている。
 半導体をめぐっては足元で世界的に厳しい状況が続いている。
 味の素も今年前半までの在庫調整はある程度想定したが、中長期的な成長見通しには変わりがないという。調査会社のＩＤＣによると、１－３月期の全パソコンメーカーの合計出荷台数は前年同期比29％減の5690万台となり、2019年初頭の水準を下回った。パソコンメーカーなどは在庫の高水準が７－９月期に入っても続く可能性があると予想しているという。足元で用途別の割合が拡大してきたハイエンドのサーバーやネットワークへの需要が今後も成長を続けると見込む。
 　　![800x-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636496/04fc1515-fd51-96ae-0fd0-70ff718fb1ee.jpeg)
　同社はＡＢＦを含むアミノサイエンス事業が売上高に占める割合を22年３月期の約３分の１から31年３月期までに半分に伸ばす目標だ。そのために、３月にＡＢＦに対する投資計画を従来の170億円から250億円に引き上げた。

　　藤江氏は生産強化について「経営会議でもテーマにしてしっかり議論していく」と述べ、決定までに数年もかからないとした。具体的な候補地や投資金額についてはコメントを控えた。

# まとめ
コロナ渦でリモートワークが増え、半導体がなくなり、需要が増えたことで、半導体がなくなった。これを防ぐために、いつでも半導体の生産ができるような体制をとることが大切だ。
# なんで調べようと思ったか
味の素が半導体の材料abfを作っていると知って、とても驚いたからだ。なぜなら味の素は今まで調味料の会社だと思っていたからだ。

# 見たほうがいい動画
https://www.youtube.com/watch?v=RYdjYrcMTnw
New RelicでQOL爆上げした陰でLambdaがタイムアウトしていた話

# はじめに
この記事は[ディップ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/dip-dev)の8日目の投稿です。

皆さんはNew Relicを使っていますか？
ディップでは各プロダクトへのNew Relic導入を進めています。
New Relicは開発から運用、またセキュリティといったアプリケーションに関わる各種メトリクスやパフォーマンスを確認することができる非常に便利なプラットフォームです。
特にダッシュボードは以下のように高い自由度で作り込めるので ~~気がついたら半日過ぎているなんてこともザラ~~ QOLが爆上がりします。

```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 17
}
</style>
footer 1リクエストあたりの処理時間や、SQSからのメッセージ受信数、モード毎の処理件数などいろいろ作り込める。楽しい。
title <img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386230/e0c97934-edd6-05a3-0571-44e87e064630.png>
@enduml
```

このようにとても便利なNew Relicですが、AWS Lambdaに統合した際にとある不具合に遭遇したため、その原因と対応方法を紹介したいと思います。

# 何が起きたのか
まず、不具合が発生した機能は以下のような構成でした。

![elastisearch更新バッチアーキテクチャ.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386230/dd29f486-81ef-292f-ab54-0590f5a8fc57.png)
SQSをトリガーにLambdaを起動するオーソドックスな構成で、
ざっくりとした仕様は以下のようになっています。
- SQS
    - 処理対象のIDをJSONのリストで受け取る
    - IDは最大1万件まで指定可能
- Lambda
    - アプリケーションはGoで実装
    - SQSから受け取ったIDでPostgreSQLを検索し、取得したデータをElasticsearchへ登録する
    - タイムアウトは最大値の15分に設定
    - NewRelicへの情報送信は[公式の拡張機能](https://github.com/newrelic/newrelic-lambda-extension/tree/main/examples/sam/go)をLambdaLayerに設定することで実現

## Lambdaがタイムアウトするようになった
LambdaにNew Relicを統合してしばらく経ったあと、SQSのキューにメッセージが溜まってしまっていることに気が付きます。
調査をしたところ、IDを1万件受け取った場合にLambdaがタイムアウトしていることが分かりました。

### しばらく気づけなかった
タイムアウトのログはアプリケーションの範囲外で出力されているためNew Relicへは送信されておらず[^1]、またアプリ自体は正常に終了していたため、発生にしばらく気がつけませんでした。

## 状況を整理すると
- IDを1万件受け取るとLambdaがタイムアウトする
- アプリ側で出力している終了ログは出ている
- Lambda側（アプリの範囲外）でタイムアウトログが出力される
- アプリ自体は正常に終了している
    - SQSのキューは減っていく
    - アプリでエラーが発生しないので通知が来ない
    - DLQも監視していたが、キュー自体は消費されるのでDLQが溜まらないため通知が来ない
- タイムアウトするまでキューが消費されないので効率が著しく悪化している
    - アプリ自体は数分で終了するものの、15分経過するまで次のメッセージを処理できない状態

# サポートケースの利用
New Relicは各種公式ドキュメントやサポートフォーラムなどトラブルシューティングに役立つリソースが充実しています。
契約にテクニカルサポートが含まれる場合はサポートケースを起票することでNew Relicのサポートエンジニアの方と直接やりとり[^2]をすることができます。

今回の不具合については5000件や7000件では再現しなかったため、どこかに閾値があってうっすらとデータ量が関連してそうな感じがしているところまでは分かりました。
しかし原因究明には至らなかったため、NewRelicのテクニカルサポートを受けることにしました。

# タイムアウトの原因
New Relicの方で調査いただいた結果、
New Relicへ送信するトランザクション情報に巨大なクエリを書き込み過ぎていたことが原因であることがわかりました。

アプリ内では複数テーブルに対してSQSから受けたIDをIN句に指定したSQLを発行しており、このクエリ文字列をNew Relicへ送信していたところ、New RelicのAgentが送信できるデータ量を超えてしまいLambda拡張機能がハングアップした、とのことでした。

# 対応
まず、アプリ側で以下対応を実施しました
- トランザクション情報にクエリを書き込むのをやめた[^3]
- Lambdaが一度に受け取れるIDの件数を5000件に変更[^4]
- Lambda拡張機能を最新化

また、New Relic側でLambda拡張機能がハングアップする事象について修正対応していただきました。

:::note info
NewRelicLambdaExtension（※1）のversion36以降で対応が反映されています
:::

:::note warn
また、ハングアップする問題は修正いただきましたが**送信できる容量は1MBまで**（それを超えるとNew Relicに情報は送られず破棄される）という制限(※2)がついたためご注意ください
:::


※1 東京リージョン（`ap-northeast-1`）のリソースです。
※2 version36時点の仕様です。最新仕様は公式を確認ください。
最新のバージョンは以下を参照してください。
https://layers.newrelic-external.com/



# さいごに
およそ3ヶ月にわたり丁寧にサポートしていただいたNew Relicテクニカルサポートチームの皆さま、本当にありがとうございました！
これからもNew Relicをガンガン使い倒してもっともっとQOLを上げていきたいと思います。

この記事がどこかで同じ事象に悩まれている方のお役に立てれば幸いです。

[^1]:CloudWatch logをサブスクリプションするLambdaを構築すればアプリ外で出力されたログもNew Relicへ送信可能
[^2]:しかも日本語でOK
[^3]:発行しているクエリはどれもシンプルなもので、かつ、リクエストで受けたIDはログに出しているため書き込みはそもそも不要という判断
[^4]:今後の修正によって閾値を超えることがないように。念の為。
文字列連結に「.」を使ってないかい？

## 概要

PHPの文字列結合でよく見かけるのが「.」を用いた連結

```php
$hoge = 'hoge';
$huga = 'huga';
echo $hoge.'and'.$huga.'GO';
//hogeandhugaGO
```

実はこういう書き方も出来ちゃうんです

```php
$hoge = 'hoge';
$huga = 'huga';
echo "{$hoge}and{$huga}GO";
//hogeandhugaGO
```

可読性が上がったかつ簡潔ですね。

https://www.php.net/manual/ja/language.operators.string.php#60035
windowsでiverilog その139

# 概要　
windowsでiverilogやってみた。
verilog見つけたので、テストベンチ書いてみた。

# 参考にしたページ。

https://www.zep.co.jp/nbeppu/article/mz-cpu1738-da6/

# サンプルコード

```
module test;
	reg clk,
		rst;
	wire state,
		halt;
	wire [3:0] a_reg_q,
		b_reg_q,
		out_reg_q;
	reg [3:0] in_d;
	CPU_4bit u(.clk(clk), .n_rst(rst), .state(state), .halt(halt), .a_reg_q(a_reg_q), .b_reg_q(b_reg_q), .out_reg_q(out_reg_q), .in_d(in_d));
	initial
	begin
		$display(" a b out");
		$monitor(" %b %b %b", a_reg_q, b_reg_q, out_reg_q);
		clk = 0;
		rst = 1;
		#2
			rst = 0;
		#2
			rst = 1;
		#80
			$finish;
	end
	always
		#1
			clk = ~clk;
endmodule


```

# 実行結果

```
>vvp a.out
 a b out
 xxxx xxxx xxxx
 0001 xxxx xxxx
 0001 xxxx 0001
 0011 xxxx 0001
 0011 xxxx 0011
 0110 xxxx 0011
 0110 xxxx 0110
 1010 xxxx 0110
 1010 xxxx 1010
 1111 xxxx 1010
 1111 xxxx 1111
 0000 xxxx 1111
 0000 xxxx 0000
 0001 xxxx 0000
 0001 xxxx 0001
 0011 xxxx 0001
 0011 xxxx 0011
cpu41.v:315: $finish called at 84 (1s)

```

以上。
拡散モデル（画像AI）で結晶を作れるか？

以下の駄文を読まずに、
https://www.microsoft.com/en-us/research/publication/mattergen-a-generative-model-for-inorganic-materials-design/
を見てください。十分な可能性が示せていると思います。
ただ検証のしかたなどあんまりよくわからなかったところも多いので勉強中です。

============================
拡散モデルで自由に画像が作れるようになってきた。一方、CODなどの結晶データベースもある。CODなりを学習させてそれなりにリアリスティックな結晶構造を作れるのではないか？というテーマが浮上する。最近、盛んになってきているようだ。作った仮想結晶が、局所的にもっともらしい構造を持つのであればそれなりに「存在可能性のある」構造であり得る。これはまさに画像AI（拡散モデル）に期待できるようなこと。指の数が増えたりする難点も結晶生成には悪くない。

いままでは遺伝アルゴリズムとかでいささかゴリ押し的に生成してきた候補になる仮想構造をもっとうまく作れるような気がする。NdFeB磁石は、Feの塊をNdBの平面で抑え込むような構造。似たような候補物質などAIで探せるのではないか？あるいは太陽電池やら固体電解質やら。。。

UnetなどのCNNは近傍情報、短距離秩序を学習する。拡散法はそれをバランスよくつなぎ合わせることを行っている。そして、全体的に整合性のある絵が形成される。「与えた周期的セルの中に、データベース中の結晶構造の持つ局所構造をもっともらしく結合したものを作成せよ」という課題なら解けるんじゃないかと思う。その局所構造をUnetで学習させるのには問題ない。生成時に周期性をもたせるのは簡単である（ラベルタイリング参照）。
中・長距離秩序はUnetに担わせてないでもっとウマい方法があるかも。マーデルング和みたいなことはヒントにならないか？

問題点は、
　1.３次元の周期系であること。ヘタにやるとデータが多すぎる。３次元のCNNを座標表現に適用するには？これには３Dの拡散モデルのアイデアが使えるのでは？
　2.セルサイズを可変にしたい。圧力に対応するものを入れるか？セルの可変性を要求することになるが、損失関数のセルサイズ依存性を問題にするなら可能なようにも思う。
　3.データが少なすぎるかもしれない。

 だろうか？
「現代数理統計学の基礎」演習問題解法メモ　第2章問12～18

第2章はこれで終わりです。(※)のついた問は行いませんでした。
![第2章問12　(1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/1fe52bc0-36fd-22ae-1c18-6f7fd9326e9b.jpeg)
![第2章問12　(2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/73a43783-eb2e-5940-c0f0-b0f9ed55eeb4.jpeg)
![第2章問12　(3).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/81916111-a0ae-0e7e-4f7d-dfe935988ebe.jpeg)
![第2章問12　(4).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/8e8de8d3-62cf-8d19-43a4-d20f171737ba.jpeg)
![第2章問13　(1)(2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/d1f0b55e-1575-89f4-851a-4e23a841b837.jpeg)
![第2章問13　(3).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/731c22d3-d283-0b6c-b430-647de8487f9f.jpeg)
![第2章問13 (4).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/74b05ecd-cb8e-7ac1-f8da-925a5db81807.jpeg)
![第2章問14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/3ca65e6e-c35d-9673-15a6-96e2b4e0944e.jpeg)
![第2章問15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/75f77ada-39d5-3a6e-e029-596e26af356f.jpeg)
![第2章問16　(1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/093e85c8-9b36-04bd-d195-47a78dd92754.jpeg)
![第2章問16　(2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/772e62f5-af50-8b03-f123-c10285198579.jpeg)
![第2章問17(1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/d5558969-86fd-6187-a5b2-c2b4c6bde7a6.jpeg)
![第2章問17(2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/c0537e8e-1846-c2eb-4ca4-d58a04522d78.jpeg)
![第2章問18　P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/66982a4a-d808-4236-0a9e-d28d1cd8a977.jpeg)
![第2章問18　P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/eaa630c5-f787-f54b-4ecc-8de2e9f891f8.jpeg)
GitHub で特定ブランチにマージされたブランチを自動削除したい

ブランチ戦略を用いて開発を行なっていると、すでに不要になったブランチが削除されずに放置され、気づくと膨大なブランチ数になっていたりします。かといって、手動で毎回消すのも面倒ですよね。

今回は、そんな放置ブランチ削除の自動化をGithub Actionsで実現する方法を記事にしました。

## GitHub 標準の自動機能
GitHub にはプルリクエストがリポジトリにマージされた際にブランチを自動的に削除する機能があります。
https://docs.github.com/ja/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-the-automatic-deletion-of-branches

しかし、こちらの機能では、マージ先がどのブランチであっても削除されてしまうため、１つのブランチを複数ブランチにマージするブランチ戦略を取った場合の運用には適していません。
そこで GitHub Actions を用いて、独自の自動削除を実現することにしました。

## 特定のブランチにマージされたブランチを自動削除
方法は、非常に単純で、以下のコマンドを Github Actions で実行するだけです。
```console
git branch -r --merged=main | grep -vE '^\s*origin/(main$|develop$|HEAD$)' | sed 's/origin\///' | xargs git push --delete origin
```
このコマンドでは、mainブランチにマージされたdevelop以外のブランチを全て削除します。
1. mainにマージされたブランチを取得
    `git branch -r --merged=main`
2.  削除しないブランチ（ここでは、main, develop）を除外
    `grep -vE '^\s*origin/(main$|develop$|HEAD$)'`
3.  取得したブランチ名から origin を削除 
    `sed 's/origin\///'`
4.  ３でフォーマットされたブランチ名に対応するブランチを全て削除
    `xargs git push --delete origin`

### Github Actions 定義
main ブランチへのプッシュ時にmainブランチにマージされたブランチを削除するGithub Actionsの実際の定義です。
```yml
name: "Delete Merged Main Branches"
on:
  push:
    branches:
      - main

jobs:
  delete:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout
      uses: actions/checkout@v4
      with:
        # 全てのブランチ一覧を取得
        fetch-depth: 0
    - name: Delete Branches
      run: |
        git branch -r --merged=main | grep -vE '^\s*origin/(main$|develop$|HEAD$)' | sed 's/origin\///' | xargs git push --delete origin
```

## 最後に
今回は、ブランチの自動削除を GitHub Actions で実現しました。実行するコマンドを修正すれば、さまざまな条件に対応できると思います。

GitHub Actionsを使えば、ブランチ操作や GitHub の面倒な作業を自動化できるので今後も積極的に使っていきたいですね。
docker compose up -d  した時に/host_mntがパスの前についてエラーが出る

# 環境
macOS Ventura version 13.2
Docker Desktop 4.16.2 

# トラブル
Githubでcloneしてコンテナを立ち上げようとしたらエラーが起こった。
```
docker compose up -d                                                                                                             ✘ 1 
[+] Running 0/1
 ⠋ Container e-ten-db  Creating                                                                                                                  0.1s
Error response from daemon: invalid mount config for type "bind": bind source path does not exist: /host_mnt/Users/fuuma/Dev/sisukai/e-ten/docker/db/init.sql
```
パスの前に/host_mntというパスがある...
もちろん自分の環境にはない

# 解決策
![Screenshot 2023-12-07 16.21.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084346/620a48fd-b1cd-4f30-f859-05d3c4531ce2.png)
<font color="red">gRPC FUSE</font> -> <font color="red">osxfs (Legacy)</font>にして<font color="red">Apply & restart</font>
再起度を待ち、その後 docker compose up -d すると動くようになった

https://github.com/docker/for-mac/issues/5390
新人テクニカルサポートの心得３選

本記事は[リンクアンドモチベーション Advent Calendar 2023](https://qiita.com/advent-calendar/2023/lmi)の13日目です。

# はじめに

はじめまして！株式会社リンクアンドモチベーションでCREエンジニアをしている築城です！
私は新卒、エンジニア未経験からCREエンジニアとして、顧客からの問い合わせに回答する、いわゆるテクニカルサポートをしてきました。

新卒でテクニカルサポートを始めてから、一つ一つのお問い合わせに答えることで精一杯で、失敗もたくさんしてきた私ですが、少しずつ顧客やカスタマーサポートの方から対応で感謝していただけるようになりました。

そこから得た学びを共有します。

# 新人テクニカルサポートの心得3選
### ①確証があることのみ述べるべし
#### 問い合わせ：この対応ってこの納期でできるの？
❌：(やったことないけど、いつもと同じだし)おそらくできます！
⭕️：(手順を具体的にイメージできないな...)一旦確認して、◯時までに折り返します。

不確定事項を会社の回答として回答していることが問題です。
特に納期遅れになってしまった場合、会社の信用にも関わります。
自分のみで判断できないことははっきりとわからないと伝えましょう。
間違った情報を伝えるリスクを排除できる上、先方も先輩も安心します。


### ②調査の前に共有してほしい情報はリクエストすべし
#### 問い合わせ：こちらのエラーの原因を調査してください
❌：はい！わかりました！やります！（脳筋）
⭕️：はい！調査にあたって、誰が、どの環境で、どの条件でエラーが起きていたか分かる範囲で教えていただけませんか？

調査を自分達側で閉じてやろうとしてしまっていることが問題です。
調査の助けとなる情報は、もしかするとカスタマーサポートの方が持っているかもしれないので、適切にリクエストしましょう。
作業効率が上がり、先輩にも頼りやすくなります。

### ③質問の裏にある本当にやりたいことを読み取るべし
#### 問い合わせ：こんなデータって用意できたりする？
❌：はい、こちらがデータになります。
⭕️：はい、お出しすることは可能ですが、こちらどのようにご使用になりますか？

質問の背景を理解せず、表層の質問にのみ答えていることが問題です。
質問を表層だけで受け取って回答していると、いつまで経っても顧客の課題を解決することができず、ラリー数が嵩んでしまいます。
顧客は何ができればゴールなのかを把握することで、適切な情報提供ができます。

# まとめ
人は失敗して学びます。❌のケースは全部私が通ってきた道です。
読んでくださっている方が、❌を通らずに済むことを祈っています。
Databricks SQLのクエリエディタでテーブル名をパラメータにしたい

表題の件、以前は「これはできないのかな」と思っていたらできました。

クエリーパラメータとは、SQLクエリーで`{{}}`を用いるとその部分をパラメータ化でき、ウィジェットから値を指定できるようになる機能です。

https://docs.databricks.com/ja/sql/user/queries/query-parameters.html

WHERE句で使う分には問題ないのですが、以下のようにテーブル名をパラメータにしようとすると、

```sql
SELECT
  *
FROM
  {{ tablename }}
```

以下のようにテーブル名の前後にクォーテーションが入ってしまい、パースエラーになってしまいます。

```
[PARSE_SYNTAX_ERROR] Syntax error at or near ''takaakiyayoi_catalog.japan_covid_analysis.covid_casesa''.line 4, pos 2
```

そこで登場するのがこちら。`IDENTIFIER`句です。文字列を受け取り、テーブル・ビュー、カラムなどとして解釈します。

https://docs.databricks.com/en/sql/language-manual/sql-ref-names-identifier-clause.html

クエリーをこのように変更します。

```sql
SELECT
  *
FROM
  IDENTIFIER({{ tablename }})
```

下にウィジェットが表示されるので、テーブル名を入力します。
![Screenshot 2023-12-07 at 16.23.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c4a73630-b546-13dc-78f5-5128e8d88d21.png)

![Screenshot 2023-12-07 at 16.24.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b9b0c0e8-3c9b-fad2-3c60-dfda1b4fb312.png)

動きました！
![Screenshot 2023-12-07 at 16.34.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1ba8a390-6477-3e71-12ab-43b3370c3aa5.png)

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

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


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
AppleIDが使えなくなってしまった話

はじめまして、新卒入社１年目の人です。
今回は、全盛期のイチロー選手の安打のごとく量産されていくミスのうち、ツーベースヒット級にまずいミスのお話をしていきます。
# どうやってもAppleIDが使えなくなってしまった
AppleIDとは、言うまでもなくApple製品を利用していく上では欠かせない存在です。
しかし、ある日登録したAppleIDでログインができなくなり、パスワードの変更、同一IDの取得まで封じられてしまいます。
これらの原因とAppleIDの再取得までの経過を反省文として描いていきたいと思います。

## 結論から
AppleIDなどのパスワード管理等では、不調をきたした時点で早期に対応を行うべき。
→パスワードのロック、IDの無効化など放置すればするほど永久に使えなくなってしまう場合もあるため。
同じメールアドレスを用いて登録したい場合はメール エイリアス(予備のメールアドレス)機能を利用する。
→ただし、hoge@gmail.comに、hoge+apple@gmail.comのエイリアスの割当では、同じメールアドレスと認識される。そこで、hoge-nakamu@gmail.comのような、別のメールアドレスをエイリアスとして割り当てる必要がある。

## 兆候
AppleIDを作成して、AppStoreでアプリを導入するができる状態でした。ここから２ヶ月後にまた、AppleIDが必要になりログインを行おうとしますが「AppleIDが無効」と怒られてしまいます。どうにも、AppleIDを利用できないようです。

登録する時点でも、AppStore経由だとどうにも怪しい挙動(たった今入力したパスワードを受け付けなかったり、AppleIDが無効だと言ったり)をしていて思い返せば色々と怪しい状況となっていました。

## AppleID再取得への手続き
まず、Appleの公式サイトからアカウントの復旧を試みました。具体的な手順は、Appleの公式サイトにアクセスし、「Apple IDアカウントページ」を開き、「Apple IDを忘れた場合」をクリックすれば回復するということでしたが、こちらもやはりAppleIDが無効とのこと…

次に、Appleサポートセンターに電話をかけて、サポートセンター側からパスワードのリセットの申請を行ってもらいましたが、「お客様のリクエストは、Apple IDを再度有効にするための条件を満たしていないと判断されました。」とメールを頂き、2ヶ月が経過してしまったことから最初に登録したIDはもう二度と使えないものとなっていました。
サポートセンターの方に、「不調が起きたら、早めに連絡してくださいね」と言われてしまいました(当然のことである)。

よって、私が取得したAppleID(hoge@gmail.com)はもう使えなくなっているので、AppleIDは以下のように取得するしかなくなった。
・hoge@gmail.comのメールエイリアスを作成して別のアカウントとして登録する。
・hoge@gmail.comを諦めて、example@gmail.comを新たに取得しこれをAppleIDとして申請する。
諸事情で後者の方法を実行することができなかったので、前者で解決を試みました。

## メールエイリアスでの解決
gmailをはじめとしたフリーメールサービスにはメールエイリアスというものが存在しています。
gmailでは、hoge@gmail.comに、example@gmail.comというエイリアスを割り当てることが可能になっている他に、お手軽にhoge@gmail.comに+0001と付け加えた、hoge+0001@gmail.comといったメールエイリアスが作成できます。
しかし、AppleIDでは、+で追加したメールエイリアスは登録を受け付けていないようでした。（同一のアカウントとみなされたため？）

hoge@gmail.comに、example@gmail.comというエイリアスを割り当てて、これをAppleIDの登録に用いることで再度AppleIDを取得する事ができました。トホホ…

## まとめ（反省文）
この文章から反省すべきことをまとめると、
・間違ったパスワードを何度も入力しない
・IDとパスワードの入力と、認証の結果に違和感があればサポートセンターに相談してみる
・違和感をそのまま2ヶ月も放置しない
という3点が挙げられます。これらは、本当に初歩的な問題なので、反省しています。
そして、今回のやらかしをサポートしてくださった全ての方に感謝をして今回の私の反省文を締めさせて頂きます。


#### 超余談…
今回の件で、メールエイリアスを色々な場面で活用することができました（検証に利用することから、私生活のメールの振り分けなども）。
また、Appleのサポートセンターにお電話をかけた際の保留音が結構独特で面白かったのでこれは聞いてほしいなと思っています。
[Ruby] ros-apartment と rails 7（と alias の仕様について）

## はじめに
弊プロダクトではマルチテナントを実現出来る [apartment gem](https://github.com/rails-on-services/apartment) を使っています（正確には本家は更新が止まっているので rails-on-services プロジェクトの ros-apartment）。
今回 apartment を 2.11.0、rails を 7.0.8 にアップデートした所遭遇したエラーとその対応について記します。

## TL;DR
apartment は master ブランチのリリースが止まっているので development ブランチを使用する（自己責任において）。


```ruby:Gemfile
gem 'ros-apartment', require: 'apartment', git: 'https://github.com/rails-on-services/apartment.git', branch: 'development'
```

## ros-apartment について
オリジナルの [apartment](https://github.com/influitive/apartment) は開発が止まっており、それを受けてフォークして作られたリポジトリです。尚こちらもリリースが滞り気味です。

rails と apartment をバージョンアップしたところ `` `connected_to': unknown keyword: :database (ArgumentError)`` エラーに遭遇しました。
調べてみると apartment が rails のメソッドに対して `alias` でパッチを当てている部分の rails 側の変更によるエラーのようで、すでに [PR](https://github.com/rails-on-services/apartment/pull/194) が出ているのでそれを参考に以下のようにパッチを当てて対処しようとしました。

```ruby:config/initializes/active_record/connection_handling.rb
module MyApp
  module ActiveRecord
    module ConnectionHandling
      def connected_to_with_tenant(role: nil, prevent_writes: false, &blk)
        current_tenant = Apartment::Tenant.current

        connected_to_without_tenant(role: role, prevent_writes: prevent_writes) do
          Apartment::Tenant.switch!(current_tenant)
          yield(blk)
        end
      end
      
      alias connected_to_without_tenant connected_to
      alias connected_to connected_to_with_tenant
    end
  end
end
```

しかしどうやっても新しく定義したメソッドが呼ばれず古いメソッドが呼ばれ続けてしまいました。


## `alias` で別名定義されたメソッドは上書きが出来ない
色々調べたところ、どうやら一度 `alias` によって別名をつけられたメソッドはその後オーバーライドをしても再定義が出来ないという仕様のようで、`alias` で別名が付けられたメソッドに対しては「別モジュールで同名メソッドを定義して `prepend` で上書き」という方法は使えないようでした。

**参考にさせていただいた記事**
https://www.xmisao.com/2014/09/12/ruby-alias-tips.html
https://r7kamura.com/articles/2018-04-02-alias-prepend-f376914c93fb

というわけで ros-apartment の対処については冒頭のとおりですが、それとは別に `alias` によって別名定義されたメソッドに関してはメソッド名自体を変更したり、呼び出し元をオーバーライドする必要があるという知見でした。
PhpStormにて、Eloquentのクエリ補完を効きやすく

## 概要
PhpStormにてEloquentのクエリ補完を効きやすくする方法はいくつかあります
- Laravel ideaプラグインを利用する（有料）
- query()メソッドからクエリ処理を記述する

私はlaravel ideaを使用していますが、今回プラグインをoffにして後者を紹介します。

## 内容

Storeモデルからwhereメソッドを生やそうとした時に、エディタで補完が効いてくれません。
> AIでの補完がうっすら効いてしまっていますがスルー

![スクリーンショット 2023-12-07 16.05.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282328/ceb548ac-76a0-c560-f823-c36981765f5c.png)


queryメソッドの補完は効いてくれます、まずqueryメソッドを記述して、そこからwhereメソッドを記述してみましょう
![スクリーンショット 2023-12-07 16.07.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282328/6367ac4b-0462-b758-c1b5-38b719fa3c80.png)


![スクリーンショット 2023-12-07 16.08.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282328/2dee4859-d80f-c53e-0dc5-d556521e96e7.png)

補完が効いてくれました！

laravel ideaを使用しない場合はquery()メソッドから記述を始めて補完を効かせて生産性を上げましょう！
リーダーシップ研修やってみた

## はじめに
この記事は[フリュー Advent Calendar 2023](https://qiita.com/advent-calendar/2023/furyu "フリュー Advent Calendar 2023")の9日目の記事となります。
エンジニア→エンジニアマネージャーを経て現在プロダクトオーナーをしています:hatching_chick:
今日はエンジニアマネージャーのときに実施したリーダーシップ研修について紹介します。

## リーダーシップとは

リーダーシップの話をすると、「リーダーに必要なスキル」と聞きますがリーダーのみに求められるスキルではありません。
リーダーシップの定義はいろいろありますが、私は "人に与える影響力" として定義し研修を作りました。

## 研修内容

月１ペースで実施しました。内容は現在のメンバーに合わせて作りましたがチームマネジメントからは参加者のリクエストにより実施

- 周囲との関係性と周囲からの期待
- 自己理解・他社理解
- チームマネジメント①1on1
- チームマネジメント②関係構築
- チームマネジメント③成長支援

その中で今回は <font color="#ff71a7">周囲との関係性と周囲からの期待</font> について少し紹介しようと思います。

## 周囲との関係性と周囲からの期待

[miro](https://miro.com/ja/)を使ってワークを行いました。

### :golf: ワークの狙い
- 視野を広げる(関係者は思っているよりたくさんいる)
- 視座を変える(役割を理解し、その立場に立って考える)
- 頭の中で考えていることを可視化、言語化し、認識を高める

### :golf: ワーク内容
:one: 以下の問いかけをし、付箋に書き出す。(実際は付箋ですが一部を紹介します)

#### ❓あなたはどんな人たちと働いていますか？
よく関わる人(例えばチームメンバーなど)には興味関心が高いと思いますが、仕事はたくさんの人たちで成り立っています。

:boy_tone3: < ◯◯チーム、▲▲チームと・・あとは上司もかな
:girl_tone2: < 事業部長とか部門長もか〜別の事業部の人も関わりあるなあ

#### ❓その関係者はどのような役割ですか？
組織名は言えても、役割までは言語化できないことってありますね。
どんなミッションで仕事をしているかを認識してみましょう。

:girl_tone2: < なんとなくイメージはあるんだけど言語化むずかしい・・
:boy_tone3: < 上司の:man_tone1:さんの役割ってなんだ？僕たちの育成とかかな？

#### ❓その関係者たちからどんな期待をされていますか？
上司なら1on1や目標面談などで直接話を聞いたりできていそうですね。
ではチームメンバー、他チームからはどんな期待をされているでしょうか。
その立場に立ってみてどんな期待をしているかを考えてみます。

:boy_tone3: < 上司からはこうかな！うーん、もしかしたらこれも期待されているかも・・
:girl_tone2: < その人になりきってみて考えてみたら結構でてくるね！

#### ❓それぞれの期待について応えることができていますか？
役割や期待を理解できているものは実行できていますね。また意識下にはなかったものもできているものもありそうです。
その立場にたってみて期待自体が意識配下になかったらそれに応えることもできないですよね。

:girl_tone2: < これはできてる！これはできてないな・・・
:boy_tone3: < 期待は「もっと早くリリースしてほしい」 期待値までいけてないなあ

#### 実際のワークイメージ
:beginner:ワークを実施するために例として私自身がワーク前に「磯野家のカツオ」として書いてみたものを紹介します
書いてみて思ったのがまず関係者がちゃんとかけない。(名前が出てこなかったり)
なにを期待されてるんだろう？も言語化するのは難しかったです。普段から怒られてたり言われてることだとわりと書きやすかったので、関係性が近いほど書きやすいのかな？とは感じました。

![スクリーンショット 2023-12-06 20.08.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173676/06f7d066-aa0c-4c33-5bc2-2694a0e5d770.png)

:two: 周囲の役割、関係性、期待を理解した上で「障害かも！？」が発生したときのフローを考えよう

だれがだれにどのようになにをするかのフローを考えてもらい、miroでフローを可視化してもらいました。
役割や関心事を知ることでどのように連携するとよいか考えやすくなりますね。
以下は実際に作ってもらったフローです。

![スクリーンショット 2023-12-08 10.09.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173676/a6e84b7d-552a-7ce0-1a77-bc7004d297b8.png)


### :golf:ワークを実施しての参加者の気づき

たくさんの気づき、素敵な感想をもらいました:sparkles:
- 各チームや部署など多くの関係者がいることを認識できた
→**視野が広がった:v:**
- チームへの期待と自分の現状を知ることができた
- 自分たちのチームが求められていることについて考えられたのがよかった
→**視座を変えて考えられるようになった:ok_hand:**
- チームでもこのワークを実施したい
- 自分が考える「リーダーシップ」について、ちゃんと言語化できるようになりたい
→**言語化、可視化の重要性がわかった:writing_hand:**

## さいごに

また機会があれば他の研修内容も紹介できればと思います！
JOBチェンジしたてなのでまた落ち着いたら研修の続きも実施できたらいいなと思っています。

### おまけ

５回の研修を終えた参加者にプレゼントしました:white_flower:

![検定.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173676/cb1c4089-94d5-8b9c-5f32-bdad0fe1d7ab.jpeg)
windowsのubuntuからcode.でVSコードが起動しない件。

ウィンドウズにDockerを入れて開発環境を整えたらcode.でvscodeが開きませんでした。
viでプログラミング的なことをできるほど出来る人ではないので
他のエディタを使いたいのでcode.できるようにしました。

# 対象となる人
・windowsユーザーかつlinux系の環境を入れた人
・viではなくvscodeを使いたい
・dockerの環境を整える上でcode.出てくるけど、実行できない人

環境
 windows 10 Pro
 

# code.コマンドを適用す手順
手順は以下を見たらOKですがメモを残します。

https://learn.microsoft.com/ja-jp/windows/wsl/tutorials/wsl-vscode

#### 1,vscodeにpathを通す
　VSコードを再インストール（すぐ終わるからこっちオススメ）。
　（環境設定のpathがつながっているか）
 　再インストール時は以下にチェック
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492033/beab6b15-a362-a704-da46-3af8523a06d3.png)

再インストール無駄と思う人は「ユーザー環境変数」をチェック
　つながってないなら、自力でつなげる。
 
 ``` :ユーザー環境変数のpathに追加
 C:\Users\<ユーザー名>\AppData\Local\Programs\Microsoft VS Code\bin
 システム環境変数（下）でなくユーザー側（上）に追加。

CLI
 cmd➡set %paht%➡set PATH=%PATH%;＜ディレクトリ＞
 ```
 　

#### 2,VScodeに「Remote Development 」をインストール
#### 3,パソコンを再起動（path通ってる場合不要）
#### 4,ubuntuを起動（path通ってる場合不要）

``` :ubuntuのターミナルで以下コマンドをコピペする。
sudo apt-get update
    ...コマンド適用中
sudo apt-get install wget ca-certificates
    ...コマンド適用中
code.
    ...コマンド適用中➡そのままvscodeが開く
```


以上でvscodeの設定は終わりです。


# まとめると
・ユーザー環境変数でpathを通す。
・vscodeに拡張機能「Remote Development 」をインストールして再起動
・ubuntuを起動してコマンドを3つ入力

で終わりです。簡単でしたね。

出来なかったらコメントで教えてください。




##### そのたつまづき
Dockerインストールで上手く動かないときは。
1，BIOSで仮想環境を実行できるようにする。
　➡BIOS起動➡Advanced➡Virtualization➡有効
 https://jp.minitool.com/news/enable-virtualization-windows-10.html

2、それでも仮想化が上手くいかない。とにかくダメなんだってさ。
そんなときはchatGPTに聞いたり以下URLを参照しよう

https://qiita.com/R_R/items/a09fab09ce9fa9e905c5


役立ちそうな奴。
・win⇔win for ubuntu間でファイル共有ってどうするんだっけ？
https://bootcamp.fjord.jp/articles/29
新卒エンジニアで輪読会をしている話

こんにちは。データソリューションスタジオの笠井です。

:::note warn
この記事は、[Supershipグループ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/supership)の9日目の記事になります。
:::

## はじめに
私は23新卒としてSuership株式会社に入社しました。

普段の開発業務の傍ら、23新卒のエンジニアで7月からほぼ毎週輪読会を開催しています。
今回は、読んでいる書籍や進め方、参加者の感想を紹介します。

## 輪読会を開催しようと思った経緯
今年の4月に入社し、2ヶ月間の研修を経た後、6月に配属がありました。
配属後は基本リモートワークなので、研修で毎日のように顔を合わせていた同期とも交流する機会が一気に減ってしまいました。
みんなでワイワイ話しながら、技術力向上や知識共有できる機会があれば良いなと思っていました。

そこで、7月から輪読会を開催することにしました。

## 輪読会で読んだ書籍
7月から現在まで読んでいる書籍2冊を紹介します。

### リーダブルコード

https://www.oreilly.co.jp/books/9784873115658/

私は以前読んだことがあるのですが、新社会人になったタイミングでもう一度読みたいと思い、選びました。
エンジニアであれば多くの方が、読んだことがある書籍だと思います。

読む人（自分も含め）にとって理解しやすいコードを書くためのテクニックが分かりやすくまとめられています。
IDEなどの機能が充実している、またLLMが発展している今、少し古いと感じる内容もありますが、それでもコーディング時に取り入れられるテクニックが多いと感じます。

### プログラマー脳

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

現在、輪読会で読んでいる書籍です。

「認知科学」に基づき、開発時の様々な作業を効率的に行う方法が書かれています。
コードリーディングや新しいプログラミング言語の習得などの、プログラミングに関する作業において脳がどのように働いているかも学ぶことができます。
普段意識せず行っているコードの読み方などが言語化されていて、とても興味深いです。

## 輪読会の進め方
輪読会をどのように進行しているか紹介します。

### リーダブルコード

10ページ前後で担当者を1人決め、担当箇所を要約して、スライドやドキュメントにまとめて発表する形式で進めていました。
この進め方にした理由は、本を持っていない/読んでいない人が飛び込みで参加しても分かるようにしたかったからです。

![スクリーンショット 2023-12-07 12.51.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620839/a43a8fc1-143f-b123-e8ec-230fcd41f22c.png)

発表や書籍に対する意見や質問をJamboardに書いていき、発表後に議論していました。

![スクリーンショット 2023-12-07 12.48.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620839/40f0ae26-345d-3ec3-2b53-7a8b33499ae9.png)

### プログラマー脳
前半は、リーダブルコードと同様の形式で進めていました。
しかし、以下のような意見がありました。

- リーダブルコードと比べて、内容が抽象的で解釈が難しく、1人で読むのが少ししんどい
- 忙しく、読まずに参加することあるが、発表者の解釈頼りになってしまう

そこで、輪読会内で10ページ前後読み、内容について議論する形式に変更しました。
節などで細かく分割して読み、「どんなことが書いてあったか」「解釈が合っているか」「意見」などを話し合いました。
進め方を変更したことで、事前準備が不要となり参加者の負担が減るとともに、内容の理解が容易になったと感じています。

![スクリーンショット 2023-12-07 14.13.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620839/34073be9-6f94-1389-ff32-74f16dff14b4.png)

## 参加者の感想
参加者の感想を集めたので紹介します。

### 全体を通して
- 配属後バラバラになった、他部署のメンバーと話せるいい時間
- 輪読会を機にKindleを使い始めたことで、私生活でも読書量が増えた
- あまりプレゼンをする機会はないので良い経験になった
- 一人だと絶対途中で読まなくなる技術本を読破できた
- 他の人の技術書の読み方を知ることができ、一人で読む時の参考になった
- 参加メンバーがそれぞれ業務やインターンで異なる経験があり、それらのエピソードを交えて議論するのが勉強になった
- みんな批評的に読んでいたので、時には本の内容に反対する意見が出ていたのが良かったと思う（内容が古く、現代の開発に即していない話など）
- 自分がモヤモヤしている箇所を議論・質問でき、多角的な意見をもらうことで考えを深めることができた

### リーダブルコード
- 全てが同意する書き方というわけではなかった
- 同期が所属するチームでのコーディング規約やルール等を知る機会を得れたのは輪読会のメリットだと感じた
- 内容は目新しい物では無かったが、1つ1つ整理して普段のコーディング時に心がける事で効果を発揮する本だと感じた
- (未経験の方)ある程度予備式を持った人が読むと参考になるかと思う(実装作業において、いくつかのチャプターを参考にした)

### プログラマー脳
- 普段無意識にやっていることを言語化している本だった。それらを意識的に行うことでより効率が良くなりそうな印象を受けた
- 抽象的な話が中心なので参加者から当てはまる具体例をいくつか聞く事でより理解が深まったのは輪読会の大きなメリットだと感じた
- リーダブルコードと合わせて読むことでより認知負荷の低いコードを書くことができると思う
- 本で言及されている内容を頭に置いておくことで、普段の業務で詰まった時に対策を取りやすくなった

## おわりに
業務の兼ね合いもありますが、読みたい書籍がたくさんあるので、みんなでワイワイ読んでいければなと思っています。
また、気軽に輪読会を開ける文化ができるといいなと思います。

:::note
**最後に宣伝です。**

Supershipではプロダクト開発やサービス開発に関わる人を絶賛募集しております。
ご興味がある方は以下リンクよりご確認ください。
[Supership 採用サイト](https://supership.jp/recruit/)
是非ともよろしくお願いします。
:::
Java Mapの使い方

# はじめに

PaizaでJavaの問題を解いて、解法にMapを使うあり、よく知らないので、Mapについての使い方メモ

# メソッド？データ型？
Rubyではmapというとメソッドを連想する。
```Ruby
array = [1, 2, 3]

array.map {|n| n * 3 }
=> [3, 6, 9]

```

JavaではMapというとデータ型を指す
いわゆる連想配列、辞書といわれるもので、
キーと値をセットで保持するデータ型のことを指す　
Rubyでいうハッシュのこと

## 使い方


**変数の宣言**
```Java
1. Map<キーの型, 値の型> 変数名 = new HashMap<>()
2. HashMap<キーの型, 値の型> 変数名 = new HashMap<>()
```

Mapインターフェースのが拡張性があり、
Mapインターフェースを継承しているのが、HashMap

**メソッド**

・get(key)：キーに紐付られた値を取り出す

・put(key, value)：キーに紐付けて値を格納する

```Java
 Map<Integer, Integer> a = new HashMap<>() {
            {
                for (int i = 0; i < 10; i++) {
                    put(i, 0);
                }
            }
        };

```

```Java
for (int i = 0; i < a.size ; i++) {
         a.get(i)// getの引数にキーを指定
        }
```

# おわりに
Mapについて実務で使う機会はどれぐらいあるのだろうと疑問が目覚めました。

# 参考
https://x-tech.pasona.co.jp/media/detail.html?p=9427
.DS_StoreをGitのバージョン管理対象から外したい

ファイル操作で作成された「.DS_Store」をgitのバージョン管理対象から外した時の備忘メモです。

「.DS_Store」ファイル・・・Mac OSのファイルシステムに関連する隠しファイル

# ルートディレクトリで.gitigonreファイルを作成する
```
touch .gitigonre
```
# .gitigonreファイルに.DS_Storeを追加する
```
.DS_Store
```
参考にさせていただいた記事
.gitignore の書き方
https://qiita.com/inabe49/items/16ee3d9d1ce68daa9fff

# 下記の場合、次のコマンドを実行する
```
git rm -r --cached .
```
1. **すでに追跡されているファイルを`.gitignore`に追加した場合**:
   - すでにGitの追跡対象になっているファイルを`.gitignore`に追加した場合、`.gitignore`に記載されているにも関わらず、そのファイルが変更されるたびにGitのステージングエリアに表示されることがある
   - この場合、`git rm -r --cached .`を実行して、すべてのファイルをステージングエリアから一度削除し、その後に`git add .`を使って再度ステージングすることで、`.gitignore`の設定が反映される

2. **変更前に`.gitignore`ファイルを追加した場合**:
   - まだGitに追跡されていない新規ファイルを`.gitignore`に追加した場合、そのファイルはステージングエリアに表示されることがある
   - この場合も、`git rm -r --cached .`を実行して、一度すべてのファイルをステージングエリアから削除し、その後に`git add .`を使って再度ステージングすることで、`.gitignore`の設定が反映される

```
git add .
git commit -m "Removed files/directories from version control"
```

#### git rm -r --cached .について
https://git-scm.com/docs/git-rm
```
-r: ディレクトリを再帰的に処理する。
--cached: インデックス（ステージングエリア）からのみ削除する。
```
ファイルやディレクトリは実際のファイルシステムから削除されるのではなく、Gitのインデックスから削除される。

# コミットする
```
git add .
git commit -m "Removed files/directories from version control"
```
【PySimpleGUI】タスクバーやタイトルバーのアイコンを、ソースコードへ埋め込んで設定する方法

PySimpleGUI、とても便利ですよね。まだ触りはじめて間もないですが、短いコードでGUIアプリケーションが作れるのでとても重宝しそうです。

# やりたいこと

アプリ実行時のタスクバーやタイトルバーのアイコンを、オリジナルのものへ変更したい。

# 背景

PySimpleGUIで作成したGUIアプリをPyInstallerで実行ファイル（.exe）化するには以下のようなコマンドを打てばよいですよね。

```shell
$ pyinstaller --onefile --noconsole --icon=icon32x32.ico hoge.py
```

このうち、`--icon`オプションによって、実行ファイルのファイルアイコンをオリジナルのものへ変更できます。

しかし、タスクバーやタイトルバーのアイコンはおなじみのヘビのマークのままです。これを変更したいなぁという話です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14157/2f41307c-aa41-0ac3-e833-f2d5f1e8bd8e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14157/458a270c-db8e-ef00-222e-c59eaffdadf0.png)

これを書いたあと改めて調べてみましたが、この件だけをまとめた記事はなさそうなので公開してみることにしました。

# ふたつのアプローチ

ググってみると、外部ファイルを読み込む方法[（例えばこちらのページで解説）](https://telecom-engineer.blog/blog/2023/02/19/pyinstaller/)が主流のようですが、他にもソースコードへ埋め込む方法があるようです。

僕の場合、なぜか外部ファイルの読み込がうまくいかなかったので、ソースコードへ埋め込む方法にてアイコンの変更を行いました。

# ソースコードへ埋め込む方法

事前準備として、画像ファイルをBase64エンコードする必要があるのですが、それにはまず以下のリポジトリにある`Base64_Image_Encoder.py`をローカルに配置します。

https://github.com/PySimpleGUI/PySimpleGUI-Base64-Encoder

で、PySimpleGUIがあるローカル環境でふつうに実行します。

```shell
$ python PySimpleGUI-Base64-Encoder.py
```

すると、PySimpleGUIで作られた見慣れたウィンドウが表示されるので、Base64エンコードをしたい画像が格納されているフォルダを選択します。

:::note info
ソースコードを読むかぎり`.ico`ファイルにも対応しているようですが、僕の場合はファイルの作り方が悪かったのか本番アプリ起動時に「画像が認識できない」旨の実行時エラーが出ました。`.png`だとうまくいきました。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14157/64c20b72-856e-c05c-ae32-5c76a928369f.png)

フォルダを選択するとエンコードが行われ、カレントフォルダに新たに`output.py`というファイルが出来上がっています。このファイルを開くと、エンコード後のバイト文字列が作成されているわけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14157/10f40182-36e2-dd51-b931-2efe343036e3.png)

あとは、本番アプリのソースコードにて、ウィンドウの作成時に引数として先ほどのバイト文字列を渡してやれば完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14157/d31bbf24-f405-1212-706a-80c149a79e2b.png)

こんな感じで表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14157/0472bdde-97f8-a5d2-3c78-2acab5386a35.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14157/090a69e9-4b95-764d-c17d-0f7b3047fddc.png)