OmniAICreator/Qiita-1.07M huggingface dataset:
私の2023年のUiPathな出来事３つ

# １．はじめに

みなさん、はじめまして！そして、メリークリスマス🎅🎄
12/15に開催されたUiPathFriendsに初参加し、アドカレ初挑戦の機会をいただきました。
ほかのユーザーさんたちから感じたUiPath熱🔥が冷めやらぬうちに投稿します！


# ２．自己紹介

* 名前：まき
* 好きな食べ物：餃子🥟
* 職業：「NPOを支えるNPO」のスタッフ🙋‍♀️
* RPA歴：他社製品3年→UiPath1.5年、Studio使ってます
（[DX Rocket Project](https://www.uipath.com/ja/newsroom/dx-rocket-project-2021-07-15) でUiPath社のみなさんにお力添えいただきました！）
* そのほか：アソシエイト持ってます。いまは応用情報技術者を目指してます。

# ３．私の2023年のUiPathな出来事３つ

**１）UiPathアソシエイト受験費用を職場が負担してくれた**

しょっぱなからお金の話でお恥ずかしい…という気持ちもありつつ、あえてこれを１つ目にしました。
というのも、私のUiPathへの関わり方はほぼ市民開発です。職場はなにせ少人数のNPO。日中は限られた時間でマルチタスクをこなし、業務時間後や土日に１人でこそっと開発するような感じです。
それでも職場で費用が認められたのには、私が作成したワークフローを通じて、UiPathがNPOに必要なテクノロジーだと認めてもらえたからではないかと思います。
ぱっと思いつくだけでも、
* コミュニティライセンスは無料ではじめられること
* アカデミーで体系的に学べること
* パッケージが豊富で日常業務にフィットしたワークフローが作れること

資金不足・人手不足・ITノウハウ不足になりがちなNPOに必要な要素が、こんなにもあります。
引き続き開発をつづけて、NPOでのUiPathの活躍の場を広げられるよう、頑張っていきたいと思います。
　　



**２）はじめて身近にUiPathユーザーがあらわれた**

私はこれまで自分以外のRPA開発者が職場にいる、という経験がありませんでした。なので前職ではつまずくと、ひたすらググるかFAQサイトへの投稿にレスがつくのを黙って待つ…、少しさびしい思い出です。

ですが今秋、パートナー（業務委託として一緒に働く方）のAさんとZoomで業務の相談をしたとき、AさんのデスクトップにUiPathのアイコンがあるのを見つけました！話の途中にも関わらず、UiPathユーザーなんですか！？と声をかけてAさんを少し困惑させてしまいましたが、「最近のアップデートで○○ができなくなっちゃって～」などと「あるある～」なお話をAさんと分かちあえて、安心した気持ちになりました。

UiPathFriendsもそうですが、同じ気持ちを共有するって大事ですね😊
　　

**３）UiPathFriendsに参加して、思いがけず感動した**

最後は12/15の感想です。いろんな場所、いろんな立場でUiPathに関わっているみなさんのお話はどれも興味深かったです✨

なかでもハシモさんの「[UiPath グローバルハッカソン参加してきた](https://qiita.com/Hash1mo/items/f6839b8b712f4db44529)」は、日本のNPOでのテクノロジー活用にもつながる気づきを得られました。具体的には、グローバルハッカソンのMVPのアイデアが、UiPath製品とAIを使って就職活動を支援するものだったという点です！

日本には、さまざまな理由で社会的に困難な状況に置かれている方の就職活動を支援するNPOが存在しています。ただ１）で書いたとおりリソース不足の傾向にあります。もし、MVPのアイデアがそういったNPOでも使えるようになれば、よりたくさんの方々がハッピーになれるのではと思います。

また、これまで私はNPOでテクノロジーを活用するのは、企業にも共通するバックオフィス業務が先だろうと考えていたので、事業活動（NPOの本来の活動）に関するアイデアを知って、より柔軟にテクノロジーの活用を考えるきっかけにもなりました。

ただ、同じく12/15にトマさんが「徹底解説！2024年のオートメーションとAIトレンドとは？」の中でAIの倫理的な考慮について触れていたように、AIには人を傷つけるリスクがあるという意識はつねに必要ですね。
　　
# ４．おわりに
つたない文章でしたが、最後まで読んでいただいた方はありがとうございました！
感想などコメントいただけるとうれしいです🌈さようなら！
ゲーム「Portal」の仕組みを簡単に解説してみた

こんにちは
この記事は KLab Engineer Advent Calendar 2023 の17日目の記事です。

## ゲーム「Portal」の仕組みについて
Valve社が開発した大ヒットパズルアクションゲーム「Portal」に登場するポータルガンの簡易的な解説になります。
あくまで個人で調査・実装したものであって実際の仕組みとは異なる箇所があると思いますのでご了承ください。
PortalはValve Corporationの商標または登録商標です。

## Portalとはどういうゲームなの？
ゲーム内に登場するポータルガンを駆使してパズルを解くゲームです。ポータルガンとは、異なる場所を繋げる二つのポータルを生成するデバイスで、この記事ではその仕組みについて触れようと思います。


## Portalの描画の仕組み
方法としてはレンダーテクスチャに書き込む方法とステンシルを使って描画する方法の２パターンがあります。（Portalではステンシルが使われているっぽい）
仮想カメラの位置は下のような式で計算できます（青のポータルを描画する例）
`playerCamera.localToWorldMatrix * bluePortal.worldToLocalMatrix * redPortal.localToWorldMatrix`

### レンダーテクスチャを使う場合
レンダーテクスチャは実装が楽だが複数のレンダーテクスチャを用意する分メモリーが増える、負荷もやや高め

描画手順

1. ポータルの視点からシーンを描画してテクスチャに書き込む
2. 1で書き込んだテクスチャをポータルに貼り付けて、ポータルも含めシーンを描画する
3. １-２をもう一つのポータルで繰り返す
4. １-３で出来上がったテクスチャをポータルに貼ってシーンを普通に描画する

### ステンシルで描画する場合
ステンシルはステンシルバッファーの管理がややこしいがテクスチャーが不要、負荷も低い

描画手順

1. ポータルをステンシルバッファのみに書き込む
2. デプスバッファをクリア
3. 1でステンシルに書き込んだ場所だけにポータルのViewとProjection行列でシーンをバックバッファに書き込む
4. ステンシルとデプスバッファをクリアして二つ目のポータルで１−２を繰り返す
5. 再度ステンシルとデプスバッファをクリアしてポータルをデプスバッファのみに書き出す（ここでポータルだけがバックバッファに描画されている状態）
6. シーンを普通に描画する（ポータル以外をデプスバッファに書き込む）



## ポータル間の移動
ポータル間の移動は内積の性質を利用して実現することができます。
ポータルの前方向ベクトルとポータルからプレイヤーの方向ベクトル（player.xyz - portal.xyz）の内積を計算して、マイナスであればポータルを通過している、つまり繋がっているポータルへワープさせてあげれば完成です。
ただ、このままではポータルを通過しようとしても壁の当たり判定にぶつかります。ポータル付近にいる際は周囲の壁の当たり判定をOFFにすることで解決できます。


## ポータルと仮想カメラの間に物があると写り込んでしまう
ポータルの中身は仮想カメラを適切な場所に移動して描画した物を表示する仕組みのため間に物があると写ってしまいます。
この問題を解決してくれるのが斜投影(Oblique Projection)という技術です。
斜投影はカメラのニアクリップをポータルの平面に移動して傾けてくれるので、ポータルから後ろにあるオブジェクトは全てカリングされます。
UnityではCamera.CalculateObliqueMatrixで取得できます。

## 終わりに
今回は座学中心の記事になりましたが、需要あればサンプルコードを含めた深掘りする記事も書いてみようと思います。
FrontFlow/BlueをUbuntu20.04にインストール

「革新的シミュレーションソフトウエアの研究開発」プロジェクトの一環として開発された、熱流体解析ソルバーであるFrontFlow/BlueをUbuntu20.04にインストールする方法を紹介します。

### FrontFlow/Blue
 FrontFlow/blue は非圧縮流体の非定常流動を高精度に予測可能なLarge Eddy Simulation(LES)に基づいた汎用流体解析コードで、有限要素法による離散化を採用しています。
 乱流現象（騒音、振動、非定常流体力、乱流熱輸送等）の高精度予測が可能で、PCクラスタから京まで、多様なマシンで高速に動作し1000億規模の大規模流体解析および1億規模の大規模音響解析およびこれらの連成解析が可能となっています。
 
http://www.ciss.iis.u-tokyo.ac.jp/software/#software

個人利用の範囲内においては、無償で利用できるフリーソフトウェアとして公開されており、以下のリンク先からソースコードがダウンロードできます。
http://www.ciss.iis.u-tokyo.ac.jp/dl/download/permission.php?group_id=7
ソースコードの中にインストール手順も記載してありますが、CentOS向けに作成されており、内容も古いもののため、Ubuntu20.04にインストールする手順を紹介します。

### 手順
#### 事前zyン美
コンパイラーとしてifortやiccなどを使用するため、intelのコンパイラーをインストールします。
GNU系のコンパイラーだといろいろと修正が必要になるためintelのコンパイラーを使用することをお勧めします。以下のスクリプトを実行します。
~~~.sh
echo "deb [signed-by=/usr/share/keyrings/oneapi-archive-keyring.gpg] https://apt.repos.intel.com/oneapi all main" | sudo tee /etc/apt/sources.list.d/oneAPI.list
sudo apt update
sudo apt install intel-basekit-2023.2.0
sudo apt install intel-hpckit-2023.2.0
~~~
また、ソースコードのmakeの実行スクリプトがCshell用に作成されているためcshellをインストールします。
~~~.sh
sudo apt install csh
~~~

#### ソースコードのダウンロード
以下のリンクからソースコードをインストールします。
http://www.ciss.iis.u-tokyo.ac.jp/dl/download/permission.php?group_id=7
今回は/optインストールしますので、ダウンロードしたファイルを/optに移動し、以下のスクリプトで解凍してください。その後、、解凍先のフォルダに移動します。
~~~.sh
tar -xzvf FrontFlow_blue.8.1.tar.gz
cd /opt/FFB8
~~~

http://www.ciss.iis.u-tokyo.ac.jp/dl/download/permission.php?group_id=7

リポジトリを追加した後に、パッケージを/opt/intelにインストールしています。

#### 標準プログラムのコンパイル
環境変数の設定などを行います。
~~~.sh
export LES3DHOME=/opt/FFB8
source /opt/intel/oneapi/setvars.sh
~~~
その後、makeオプションなどの設定を変更します。
以下コマンドで変更し,makeします。
~~~.sh
sed -i -e "s,COPT = -O3 -mcmodel=large -shared-intel,COPT =," -e "s,INCDIR = /usr/lib64/openmpi/1.4-gcc/include,INCDIR = /opt/intel/oneapi/mpi/2021.11/include," -e "s,LIBDIR = /usr/lib64/openmpi/1.4-gcc/lib,LIBDIR = /opt/intel/oneapi/mpi/2021.11/lib," make/OPTION
cd FFB8
sed -i -e "s,COPT = -O3 -mcmodel=large -shared-intel,COPT =," -e "s,INCDIR = /usr/lib64/openmpi/1.4-gcc/include,INCDIR = /opt/intel/oneapi/mpi/2021.11/include," -e "s,LIBDIR = /usr/lib64/openmpi/1.4-gcc/lib,LIBDIR = /opt/intel/oneapi/mpi/2021.11/lib," make/OPTION
sed -i -e "22,33s/^/#/" -e "39,49s/^#//" lib/src/REVOCAP_Refiner-0.4.3/OPTIONS
sed -i "16s/^/#include <cstdlib>/" lib/src/REVOCAP_Refiner-0.4.3/Geometry/kmb_Common.h
sed -i "s,g++,icpc," util/xvx2gf/Makefile
./Makeall > make.log 2>&1
~~~

#### 並列版プログラムのコンパイル
続いて並列計算用のプログラムをコンパイルします。
設定ファイルを書き換えた後、makeします。
~~~.sh
cd ..
sed -i -e "s,icc,mpiicc," -e "s,ifort,mpiifort," make/OPTION
for i in d c ct; do sed -i "s,-lmpi_f77,," util/les3${i}.mpi/FILES; done
sed -i "s, LIBS = -lfort -lgf2 -ldd_mpi -lmpi_f77, LIBS = -lfort -lgf2 -ldd_mpi," util/les3x.mpi/FILES
cd lib/src/dd_mpi
make lib > make.log 2>&1
cd $LES3DHOME/util/les3d.mpi
make
cd ../les3c.mpi
make
cd ../les3ct.mpi
make
cd ../les3x.mpi
make
~~~

以上でインストールは完了です。
無事完了していれば、チュートリアル等が実行できます。
実習中に助けられたGitコマンド集

:::note
この記事は、私が在学している開志専門職大学 Advent Calendar 2023 の 18 日目の記事となっています。17 日目は@takedayuto1 さんによる『Unityで音声対話ボットを簡単に作る方法（APIの使用料金有り）』でした。
:::

# はじめに
はじめまして！開志専門職大学 3 年(25 卒)のかずや(@bearone236)と申します。

今回は、自分自身が企業さんのもとでの実習中に助けられたGitコマンド集について、**実際に発生した問題と解決プロセス**についてお話ししていきたいと思います。

# 1.  git stash / git stash pop

## コマンド説明

`git stash`は、<font color="Red">**現在の作業中の変更を一時的に保存（退避）するコマンド**</font>です。

これにより、作業中の変更を安全に保存し、後で再適用することが可能になります。通常、`git stash`は既に追跡されているファイルの変更のみを対象としますが、`-u` オプション（または `--include-untracked`）を追加することで、新規に作成された未追跡ファイルも含めて退避することができます。このオプションは、Git によってまだ追跡されていないファイルを含む作業途中の変更を一時保存する場合に特に便利です。

一方、`git stash pop`コマンドは、`git stash`によって保存された変更を現在の作業ブランチに再適用します。これを実行すると、一時保存された変更がスタックから削除され、現在のブランチに適用されるため、退避した作業を継続することができます。

## 問題があった状況

プロジェクトで新機能の開発を進めている際、自分が作成したブランチで作業を行っていました。このブランチでは、新機能に関連する複数の変更を進めており、これらの変更はまだ完成しておらず、プッシュする段階にも至っていませんでした。多くの変更がステージングされていない状態で、これをそのままコミットすることは望ましくありませんでした。

しかし、**緊急に対応する必要がある他のタスクが発生し、現在のブランチから別の作業に切り替える必要が生じました。このとき、未完成の変更を失うリスクなく、安全に別の作業に集中する方法を必要としていました。**

## コマンドによって何が起きたか

この状況において、`git stash -u` コマンドを使用しました。これにより、未追跡のファイルを含むすべての作業中の変更が一時的に保存されました。これにより、私は安心して現在のブランチから離れ、緊急のタスクに取り組むことができました。緊急のタスクを完了した後、`git stash pop`を実行し、退避していた作業を元のブランチに戻しました。これにより、一時保存していた変更を再び適用し、中断していた新機能の開発作業をスムーズに再開することができました。

# 2.  git cherry-pick

## コマンド説明

`git cherry-pick` は、<font color="Red">**他のブランチから特定のコミットを選択し、現在のブランチに適用するコマンド**</font>です。このコマンドを用いることによって、必要な変更のみを選択して異なるブランチに取り込むことが可能です。git log でコミット ID を取得した後、`git cherry-pick [コミット ID]`を使って特定のコミットを現在のブランチに適用します。

## 問題があった状況

開発をスムーズに進めていく上でプロジェクトの UI を変更することとなり、CSS Modules から新しい UI ツールである「shadcn/ui」を用いることが決定し、自分がセットアップおよびスタイリングを担当することになりました。

そこで私は、**同じブランチ内で shadcn/ui のセットアップと、shadcn/ui を用いたスタイリングを 1 つの PR としてしまいました。その後実習のメンターの方から、shadcn/ui セットアップだけの PR を出してとの指示があり、セットアップ関連のコミットのみを分離して PR を作成するのが難しい状況になってしまいました。**

## コマンドによって何が起きたか

`git cherry-pick`を使用して、私が行った Shadcn/UI のセットアップに関連する特定のコミット履歴のみを新しいブランチに抽出しました。このアプローチにより、私はセットアップのみに焦点を当てた PR を作成することができました。この方法で、複雑なコミット履歴の中から必要な部分だけを効率的に選択し、目的に沿ったプルリクエストを作成することができました。

# まとめ

実際に会社のプロジェクトに参画し、社員の方とのチーム開発となってくるため 1 つ 1 つのコミットを慎重に確認して行う重要性を学ぶことでができました。大学内メンバーと開発を行なっている際は、開発人数もフロントエンドの人数が 1 人の時が多く、レビューを行ってくれる方があまりいないがためにコミット内容が煩雑になっていました。

また、タスクごとにブランチを細かく切って作業を進めていくといったこともあまり行ってきてなかったために、実習でのチーム開発では苦戦を強いられました。実習を通して Git の使い勝手の良さを改めて実感することができ、非常に良い機会となています。

今後は、どこまでを 1 つのコミットとしてまとめるのかの粒度や、ブランチの命名に関する意識や、タスクの切り分け方といった意識を忘れることなくチーム開発に活かしていきたいと思います。


# 参考文献

https://git-scm.com/docs/git-stash

https://git-scm.com/docs/git-cherry-pick
The Littlest JupyterHubでユーザパスワードをリセットする

この記事は[KDDI Engineer & Designer Advent Calendar 2023](https://qiita.com/advent-calendar/2023/kddi)の18日目として投稿されたものです。  
このアドベントカレンダーは「KDDIのみんなでTechな記事を書こう！お仕事に関係しても関係なくてもOK！」という企画となっています。  
ちなみに、本記事は私自身のお仕事とは関係ないものです。  

## The Littlest JupyterHub (TLJH) とは

JupyterHubは、JupyterLabを複数のユーザで同時に利用できるようにしたソフトウェアです。  
ハードウェアリソースはユーザ間で共有されますが、ノートブックなどはユーザごとにそれぞれ独立しています。  
また、認証機能を備えています。

![JupyterHub logo](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/4768d431-87b8-2994-435b-39cf9c2f65f2.png)

![JupyterHub Login](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/a5b8b2bf-ca16-2923-2177-181efaa0b68b.png)

例えばGPU搭載サーバをみんなで共有するとき、例えばEC2インスタンスを占有するほどでもないライトな使い方のユーザが複数名いるときなどに便利ですね。  

The Littlest JupyterHub (略称TLJH) は少人数で同時に利用することを想定したディストリビューションで、Kubernetesクラスタなどではなく1台のサーバに構築して利用するものになっています。  

## 本記事のサマリ

TLJHでユーザパスワードをリセットしたいときは、管理画面から対象ユーザを削除してから再作成してください。  

## 問題

TLJHの管理画面にはユーザパスワードをリセットする機能が用意されていません。  
ユーザがパスワードを忘れたときに困りますね。  

## ユーザパスワードの設定方法

TLJHはそもそもユーザパスワードの設定方法が原始的です。  
それぞれのユーザが最初にアクセスするときに入力したパスワードがそのまま設定されます。  

![tljh-password-set](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/6cf9cfce-b63a-4131-cf6f-9011c5acc44a.png)

## ユーザパスワードのリセット方法

Adminユーザでログインして、管理画面から対象ユーザを削除します。  

![tljh-admin-console](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/de7f6507-8803-a98c-a817-59a4a8069e80.png)

![tljh-user-delete](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/2a7e9b79-1d1f-4232-dc1c-05bfbc5c6ab9.png)

その後、同じユーザ名でユーザを再作成します。  
これで対象ユーザは「ユーザパスワードの設定方法」と同様にパスワードを設定できるようになります。  
対象ユーザが使っていたJupyter Notebookファイル(ipynbファイル)などのユーザデータは、対象ユーザが削除されてもホームディレクトリに保存されたままになるようです。  

参考：[Reset user passwords #105](https://github.com/jupyterhub/the-littlest-jupyterhub/issues/105)

https://github.com/jupyterhub/the-littlest-jupyterhub/issues/105

## おわりに

TLJHは導入がとにかく簡単なのですが、その代償として設定や運用機能に制約があります。  
用途に応じて使い分けていきましょう。  

## 本記事について

本記事は[アウトプットガチ勢が作った高速記事作成フレームワーク](https://qiita.com/Sicut_study/items/9b20ac5ded003cb6d55a)を参考にしています。  
高速アウトプットを身に着けたい！
Minecraft (JE) 鯖を systemd と screen で動かして cron で自動再起してみる

# はじめに
この記事は「[法政大学情報科学部 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/cis_hosei)」 16 日目の記事になります。

こんにちは、情報科学部の waigoma です。
[前回](https://qiita.com/waigoma/items/762aa95e3d564d8955d4) proxmox のコンテナを作り、そこで Minecraft 鯖を動かしていたのですが、
コンテナ再起したときにわざわざコンテナに入って起動するのがめんどくさかったので、
デーモン化に踏み込んでみたことについて書いていきます。

この記事では、メモのような形でやったことを残していく。
Minecraft (JE) 鯖を systemd で動かす、
systemd + cron で実行する鯖自動再起動、
screen で鯖のコンソールにアクセスするメモを紹介する。

# 環境
- Proxmox 7.4-17
- Ubuntu 22.04.2 LTS
- Minecraft JE Server 1.20.1
- Java 17 (OpenJDK)

## 前提
Linux, systemd, screen, cron, Java, Minecraft 鯖が実行可能な状態である。
もし実行できなければ、インストール、パスの通しを先に済ませておくこと。
※ パスは適宜自分のものに変更しましょう。

# 鯖起動/停止スクリプトを用意する

鯖起動スクリプトは `start.sh`
```/home/minecraft/server/start.sh
# minecraft という名前の screen で、java コマンドを実行する。
# 最大メモリを 4608M に設定し、nogui で server.jar を起動する。
screen -S minecraft -U -d -m java -Xmx4608M -jar server.jar --nogui
```

停止スクリプトは `stop.sh`
```/home/minecraft/server/stop.sh
#!/bin/bash

# === 設定 ===
# サーバ終了までの待ち時間
WAIT=60
# screenの名前
SCREEN_NAME='minecraft'
# ============

# minecraft という名前の screen に次の文字列を書き込む。(\015 を忘れると enter されないので注意)
screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "say reboot server after '${WAIT}' secs...\015"'

# WAIT 秒待ってから
sleep $WAIT

# 鯖を止める
screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "stop\015"'
```

# systemd で鯖をデーモン化する
## service ファイルを作る
```/etc/systemd/system/minecraft.service
[Unit]
Description=Minecraft server
After=network-online.target

[Service]
Type=forking
WorkingDirectory=/home/minecraft/server
ExecStart=/bin/bash /home/minecraft/server/start.sh
ExecStop=screen -S minecraft -X quit
Restart=always 

[Install]
WantedBy = multi-user.target
```
## systemd に読み込ませて起動、自動起動も有効にする
```terminal
// /etc/systemd/system/minecraft.service を読み込む
# systemctl daemon-reload

// 再起動時にも自動起動するよう設定
# systemctl enable minecraft

// Minecraft の鯖を起動
# systemctl start minecraft
```

# cron で定期的に鯖を停止するようにする
cron の使い方は各自調べてみてください
```terminal
# crontab -e
```
```sh
# 毎日 05:05, 14:05, 23:05 に、stop スクリプトを実行する。ログは > 以下に保存する。
5 5,14,23 * * * /home/minecraft/server/stop.sh > /var/log/minecraft/log.txt
```

# screen で Minecraft 鯖のコンソールにアクセスする
```terminal
# screen -r minecraft
// screen から出たいときは、ctrl + a の後に d を押す
```

# 最後に
ここまで目を通してくださってありがとうございます。
何かの役に立っていれば嬉しいです！

今回の内容は鯖主には有益になるんじゃないかなと思い、書いてみました。
特に定期的に再起動することはメモリ開放などの点から重要だと思っていて、
鯖を開きっぱなしにしていて、重くなると感じている人には効果的かもしれません。

基本的にはコピペでできるようにしてあるので、
気になった方はぜひやってみてください！
(パスだけ注意！)

ここまでお付き合いいただき、ありがとうございました！
それでは良き Minecraft ライフを！

# 参考文献
https://qiita.com/h_tyokinuhata/items/aee82d5e7732b1e291ad

https://jyn.jp/minecraft-server-auto-restart/
【Ubuntu】初期セットアップでエラーになったお話し

## はじめに
長年使っていたWindows10のデスクトップからWindows11のノートPCへ買い替え。
一通りのセットアップとデータ移行を済ませ、プログラミングの開発環境をとUbuntuを起動しようとしたところ何やらエラーメッセージが…
![スクリーンショット 2023-12-17 003657.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2623783/1396ebd5-c0ee-ce3b-4dc5-742efc33a0d4.png)

## 解決までの流れ
・まずはエラー文にあるエラーコード「0x800701b」にて検索。
・エラー文にあるようにWSL2のアップデートが必要とのこと。
・powershellにて下記のコマンドにてアップデートを実行。
```
wsl --update
```
結果解消せず。

・更に調べたところpowershellのバージョンが古い可能性が出てきたので下記よりインストールを実行。

https://learn.microsoft.com/ja-jp/powershell/scripting/whats-new/migrating-from-windows-powershell-51-to-powershell-7?view=powershell-7.4
Windows PowerShell 5.1→PowerShell 7へバージョンアップ。
念のため再起動し再度Ubuntuを実行。
無事初期セットアップの表示がでたため解消
【Unity】サイコロアプリを作ってみる 3

記事の内容は間違っていないですが、作り方を大きく変更しました
以下の記事が最新になります

https://qiita.com/acronhub/items/7fa83565ffdd05576605

# これはなに？
Unity初心者がサイコロアプリを作るまでの過程をまとめた記事になります
手探りなところがあり、また制作途中での記事のため、後で修正するかもしれないです

前回の続きになります

# 作ってみる
今回はサイコロの合計の目の履歴を取る。履歴を表示するまで作ってみます

## サイコロの目の履歴を取る

ビジュアルスクリプティングがあるオブジェクトの「インスペクター」パネルの「Variables」に「DiceHistory(Aot List)」を追加します
![inspector2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266407/e2f93505-9c26-65bb-8636-3f9c288a1b69.png)

サイコロの数字を表示する先で配列に格納します
![script7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266407/65fb5795-5f50-426b-7638-6548754776dc.png)

動作させるとコンソールで配列に格納されていることがわかりました
![log1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266407/5c3494ee-79e7-36f5-35b0-0abbcb349b9e.png)

## 履歴を表示する

### ダイアログの作成

こちらを参考にしてダイアログを作成しました

https://shikaku-sh.hatenablog.com/entry/unity-popup-dialog-with-scrollview-in-canvas#%E3%83%80%E3%82%A4%E3%82%A2%E3%83%AD%E3%82%B0%E3%81%AE%E6%A7%8B%E6%88%90

![popupdialog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266407/f39f195a-c637-63ae-0547-baffcbe024e9.png)

### 履歴ボタンの作成

画面右上にボタンを設置

![cap3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266407/ca2b7f4c-7401-fae3-7263-ea5e2a1abd3e.png)

ビジュアルスクリプティングでボタンタップしたときにダイアログを表示するようにして、既に表示済みでボタンタップした場合は、ダイアログを閉じるようにしました

![script8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266407/0d95a883-ae70-d71d-00ba-34842a4cca03.png)

# 完成

![cap4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266407/7f911735-49fb-067b-71f5-4e2334b067e1.png)

# さいごに
今回やってみてわかったのは、ビジュアルスクリプティングだけでは難しい面が出てきた感じです
本当は履歴ではなく、統計を出そうと思っていたのですが、ちょっと調べただけではできず履歴対応に変更しました

また履歴も最初の表示がおかしかったりします
改行コードがビジュアルスクリプティングでは入りそうもないので、カンマにしたというところもあります

次回は、ちょっとリファクタリングみたいな感じになりそうです

# 連載記事

https://qiita.com/acronhub/items/a46c6f5c16c4d262728c

https://qiita.com/acronhub/items/8c101bc060f428a948d8
Pybricks によるハブ間のブロードキャスト通信

# はじめに

Pybricks では BLE によるハブ間のブロードキャスト通信が可能です。

# 送信側のAPI

## ブロードキャストのチャンネル設定

ハブのオブジェクトを作成する際に、ブロードキャストのチャンネル番号を設定します。たとえば Prime Hub の場合は次のように指定します。

```python
hub = PrimeHub(broadcast_channel=1)
```

チャンネル番号は 0 から 255 までの値を指定できます。

## データの送信

ハブの `ble.broadcast(data)` を使います。 `data` に送信するデータを指定します。指定できるデータは 型 `int`, `float`, `str`, `bytes`, `bool` の値、もしくはそれらのタプルに限定されています。

たとえば、整数値 5 を送信するには次のようにします。

```python
data = 5
hub.ble.broadcast(data)
```

# 受信側のAPI

## リスンするチャンネルの設定

ハブのオブジェクトを作成する際に、リスンするチャンネル番号をリストで設定します。たとえば Move Hub の場合は次のように指定します。

```python
hub = MoveHub(observe_channels=[1])
```

チャンネルはリストで複数指定できます。

## データの受信

ハブの `ble.observe(channel)` を使います。 `channel` に受信するチャンネル番号を指定します。受信できた場合は受信データを返し、受信できなかった場合は `None` を返します。

たとえば、チャンネル１から受信する場合は次のようにします。

```python
data = hub.ble.observe(1)
```

# 簡単な例

Prime Hubがどの向きになっているかを示す色を、Move Hub と Technic Hub に伝える例です。

![IMG_7220.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/2b347605-9158-2ee4-b631-1e8652b49937.jpeg)


## 送信側(Prime Hub を使った例)

```python
from pybricks.hubs import PrimeHub
from pybricks.parameters import Side, Color
from pybricks.tools import wait

hub = PrimeHub(broadcast_channel=1)

sides = [
    Side.TOP,
    Side.BOTTOM,
    Side.LEFT,
    Side.RIGHT,
    Side.FRONT,
    Side.BACK
]

colors = [
    Color.RED, 
    Color.BLUE,
    Color.GREEN,
    Color.YELLOW,
    Color.MAGENTA,
    Color.VIOLET
]

# 検出した側を元に色を更新し続ける。
while True:
    # ハブの上になっている側をチェック。
    up_side = hub.imu.up()

    try:
        data = sides.index(up_side)
    except ValueError:
        data = -1


    # 検出した側を元に色を変更。
    if data != -1:
        hub.light.on(colors[data])
    else:
        hub.light.on(Color.WHITE)

    # 色を他のハブに送信
    hub.ble.broadcast(data)

    wait(50)
```

## 受信側１(Move Hub を使った例)

```python
from pybricks.hubs import MoveHub
from pybricks.parameters import Color
from pybricks.tools import wait

# ハブを初期化。
hub = MoveHub(observe_channels=[1])

colors = [
    Color.RED, 
    Color.BLUE,
    Color.GREEN,
    Color.YELLOW,
    Color.MAGENTA,
    Color.VIOLET
]

while True:
    # 他のハブからのブロードキャストの受信。
    data = hub.ble.observe(1)

    if data is None or data == -1:
        # 過去1秒間にデータが受信されていないか、データ不正。
        hub.light.on(Color.WHITE)
    else:
        # データが受信され、かつ1秒未満の新しいデータ。
        hub.light.on(colors[data])

    # ブロードキャストは100ミリ秒ごとにのみ送信されるので、それ以上の頻度で
    # observe() メソッドを呼び出す理由はありません。
    wait(100)
```


## 受信側２（Technic Hub を使った例）

Move Hub を使った例との違いはハブのクラスだけです。

```python
from pybricks.hubs import TechnicHub
from pybricks.parameters import Color
from pybricks.tools import wait

# ハブを初期化。
hub = TechnicHub(observe_channels=[1])

colors = [
    Color.RED, 
    Color.BLUE,
    Color.GREEN,
    Color.YELLOW,
    Color.MAGENTA,
    Color.VIOLET
]

while True:
    # 他のハブからのブロードキャストの受信。
    data = hub.ble.observe(1)

    if data is None or data == -1:
        # 過去1秒間にデータが受信されていないか、データ不正。
        hub.light.on(Color.WHITE)
    else:
        # データが受信され、かつ1秒未満の新しいデータ。
        hub.light.on(colors[data])

    # ブロードキャストは100ミリ秒ごとにのみ送信されるので、それ以上の頻度で
    # observe() メソッドを呼び出す理由はありません。
    wait(100)
```
Vue.jsのPropsまとめ

# 自己紹介

初めまして！@satoseriと申します
今年新卒として、株式会社エル・ティー・エスに入社し、エンジニアとして自社サービスの開発運用を担当しています。
フロントエンドのフレームワークの一つとして活用されているVue.jsの基本的な機能であるPropsに関して、復習も兼ねてまとめてみました。拙い文章ですが、最後まで読んでいただけると幸いです。

# Propsとは
propsはコンポーネントに登録できるカスタム属性のことです。
親コンポーネントから子コンポーネントにデータを渡すための仕組みです。

# 親から子コンポーネントへのデータの渡し方
子コンポーネントでmessageプロパティとして定義されている文字列型の値を親コンポーネントから子コンポーネントへ受け渡しています。

```ChildComponent.vue
<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>

<script>
export default {
  props: {
    message: String,
  },
  setup(props) {
    return {
      message: props.message,
    };
  },
};
</script>

```
```ParentComponent.vue
<template>
  <div>
    <h1>親コンポーネント</h1>
    <ChildComponent :message="parentMessage" />
  </div>
</template>

<script>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent,
  },
  setup() {
    const parentMessage = ref('親からのメッセージ');
    return { parentMessage };
  },
};
</script>
```
# Propsで主に定義されるもの
### 1  type: テキストや数値などのデータの型を設定
propsにはどのような値が入るかtypeによってチェックを行う
``` html
<script>
defineProps({
  name: {
    type:String,
  },
});
</script>
```
### 2 default：デフォルト値の設定
``` html
<script>
defineProps({
  name: {
    type: String,
    default: '山田花子',
  },
});
</script>
```

### 3 Required：必須なpropsかを設定

``` html
<script>
defineProps({
  name: {
    type: String,
    required: ture, //tureの場合は必須である
  },
});
</script>
```

# まとめ
propsを定義することで異なるコンポーネント間でデータを簡単に受け渡すことができます。
propsを活用することで、渡されるデータの型が期待通りかどうかの検証や同じコンポーネントを異なる場所で異なるデータとともに使用でき、コードの冗長性の減少や再利用性の向上につながります。

vueをこれから始めるどなたかの参考になれば幸いです。
最後まで見ていただきありがとうございました！

# 引用・参照
https://ja.vuejs.org/guide/components/props.html

https://reffect.co.jp/vue/vue-js-master-props-for-beginner#PropsType

https://zenn.dev/hogeisfuga/articles/db8a14a19f91ce#%E5%80%A4%E8%87%AA%E4%BD%93%E3%81%AE%E5%A4%89%E6%9B%B4%E3%81%AF%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%EF%BC%88%3D%E3%82%A4%E3%83%9F%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%96%E3%83%AB%EF%BC%89
vimのoptionをリアルタイムで変更する！〜vim初心者向け〜


:::note info

この記事は[Vim Advent Calendar 2023](https://qiita.com/advent-calendar/2023/vim)の12月18日分のものです。
:::

## 初めに

vim初心者向けに楽しそうなものを目指して記載します
私はvimの8.2で動作確認をしています。今のところver8,9の固有要素は使わないつもりですが想定外の動きがあれば教えて頂けると助かります。

## vimの起動から

まず vimを起動しますが、初期設定ファイルとか面倒ですよね。`-u NONE`で初期設定ファイルの読み込みをスキップしましょう。
vimがないぞと怒られたら、aptなりyumコマンドでvimを導入してください。

```
$ vim -u NONE foobar.txt
```

これでなんの混ざりのない純心な？vimの起動ができました。

## 準備

vimのoptionをリアルタイムで変更するために、表示されている行をvimコマンドとして実行出来るようにします。

まずはマクロキー的な設定を行います。以下の2つのコマンドを先ほど起動したvim上実行してください

※ `[ESC]`キーを数回押して、`[:]`キーを押して以下のコマンドを1行づつコピペして実行してください。`[:]`はいくつ重なっても問題ありません。またこの設定は一回限りのものなのでvimを終了すると消えます。

```vimscript
:set cpo-=<
:nnoremap <TAB> :execute getline(".")<CR>
```
確認してみます。
vim上で以下の行を入力してください
```
:echo "aaaa"
```
入力が終わったら`[ESC]`キーを押してノーマルモードに戻ったら、この行にカーソルを移動して`[TAB]`キーを押してみてください
最下行にaaaaが表示されましたか

![tmpuymhpbwh-ascii.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606569/4996a27d-f17d-48a5-c028-4e2078162e55.gif)


#### 長いけどvimの起動時にマクロを登録する方法
コマンド登録箇所はコマンドラインでもできるのでvim起動時のコマンドを以下でも設定可能です。(すいませんlinux系かつbashでは動くと思う)

```bash
vim -u NONE -s <(echo -e ':set cpo-=<\n:nnoremap <TAB> :execute getline(".")<CR>') foobar.txt
```

## 行番号表示

行番号表示を試してみます。
今度は以下をvimにコピー＆ペースとして`[TAB]`キーを押してみてください

```vimscript
" 試しに行番号を表示してみましょう
" 下の行をカレントにしてTabキーを押してみてください
:set number
" 左に行番号の表示が追加されましたでしょうか

" 行番号を消してみましょう
:set nonumber

" 以下のコマンドはトグルします
:set number!

" 行番号の表示桁数を変えてみましょう
" 現在の値を取得するには項目名?です
:set numberwidth?

" 行番号の表示桁数を5に変更しましょう
:set numberwidth=5

" 行番号の表示桁数を+1するには
:set numberwidth+=1

" 行番号の表示桁数を-1するには
:set numberwidth-=1

" 初期値に戻すには&を付与します
:set numberwidth&
```

なんかgif作るツールが日本語フォントにに対応してなかったのでコメント部分は省略しています

![tmp_r8z6sby-ascii.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606569/a715c2f7-46d9-9543-fba4-dda1cb2e171f.gif)

## 少し高度なもの
こちらもvim上にペーストして試してみてください

```vimscript
" ノーマルモードのコマンドも実行出来ます
" 最終行、行頭、行末への移動コマンドです
:normal G
:normal 0
:normal $

" 画面分割
:sp
" ウィンドウ移動
:wincmd w
" ウインドウ高さ変更
:wincmd -
:wincmd +
" 他のウィンドウを閉じます
:sall

" append()を使うことで追加することができます
:call append(".", 10 * 20 )

" 指定行を変更したい場合はsetline()を使います
:call setline(line(".")+1,system("date"))


" 先頭行に移動するには、、、:1しか知らなかった
:1
:normal 1G
:normal gg
```

## 終わりに
ウインドウ上の内容を実行してリアルタイムにその結果を確認できるのは、なかなか面白いと思いますがいかがでしょうか
vimスクリプトを記述する際にヘルプを読んだだけでは、作用や副作用がどうなるか分かりにくいので実際の動きを見ると理解も深まるのではないでしょうか

この記事を読んで、何かvimスクリプトで作ってみようというきっかけになりましたら幸です。
MagicOnion×Unityクライアントで、「RpcException: Status(StatusCode="Unavailable", Detail="failed to connect to all addresses...」が出た時の解決法

## 環境
### クライアント側
- Unity: 2021.3.18f1
- gRPC unityプラグイン: 2.47.0-dev202204190851
- MagicOnion: Ver.5.1.8
- MessagePack: v2.5.140

### サーバー側
- ASP.NET Core 6.0 ([ここ](https://learn.microsoft.com/en-us/aspnet/core/tutorials/min-web-api?view=aspnetcore-8.0&tabs=visual-studio)を参考)

## エラー状況
 [MagicOnion公式](https://github.com/Cysharp/MagicOnion?tab=readme-ov-file#support-for-unity-client)と[Qiitaのブログ](https://qiita.com/KyoheiOkawa/items/63a68bbcc3caaaac581e)を参考に簡単な足し算をUnityクライアントから呼び出す処理を行おうと、サーバーを起動→Unity上で「Play」を行ったところ、

```
RpcException: Status(StatusCode="Unavailable", Detail="failed to connect to all addresses...
```

のようなエラーがUnityコンソール上で出現。

## 解決方法

サーバー側のappsettings.jsonを以下のように変更
```json
{
  "Kestrel": {
    "Endpoints": {
      "Http": {
        "Url": "http://localhost:7000"
      },
      "Https": {
        "Url": "https://localhost:7001"
      }
    }
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*"
}

```

それにともないクライアント側のコードも変更

## 原因考察
クライアント側がC#コンソールアプリケーションのときには発生しなかった。そのためunityと通信周りのせいだと思うけど詳しい原因は不明。。。StackOverFlowを見る感じPythonクライアントでも似た問題が起こっているよう。
よく使うコマンド、SQL文メモ

この記事ははPostgreSQL Advent Calendar 2023シリーズ２の17日目です。
https://qiita.com/advent-calendar/2023#participating_calendar

# はじめに
今年8月辺りからpostgresqlの勉強を始めて、10月にOSSDB Silverを取得しました。
よく使う基本的なコマンド、SQL文をメモ代わりにまとめておこうと思います。

## psql
データベースに接続する基本のコマンドです。
psql -d [データベース名] -U [データベースユーザー名]

## メタコマンド
テーブル作成したりアクセス権限を付与したりして、実行結果を確認するときによく使います。

\dt　テーブル一覧を表示
\l 　データベース一覧を表示
\dp  テーブル・シーケンス・ビューのアクセス権限一覧を表

## 情報スキーマ
postgresqlに限らずデータベースにはスキーマという情報を格納するスキーマという機能があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3539857/5a8244a1-0957-2a99-0228-4aac9434828a.png)


## pg_tables
「pg_...」とはシステムカタログ。接続中のデータベースに格納されているテーブルが所属するスキーマ、テーブルスペース(テーブルの記憶領域)、テーブルの所有者を確認できます。
確認できる情報は情報スキーマよりもシステムカタログのほうが詳しいです。
こちらもシステム権限付の実行結果を確認する際に使っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3539857/61959961-3752-7eb5-bc9e-5177fec2b9e6.png)

情報スキーマ、システムカタログの違いは試験でもよく聞かれます。

## copy from
テストデータ(複数行)をテーブルに取り込みたいときによく使っています。
copy [テーブル名] (id, date1) from '\aaaa\Book1.csv' with csv header;
実行すると以下のようなエラーが表示される時があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3539857/7452dc36-8da9-fe23-38b9-9b974d9246bf.png)
copy fromはサーバー上にアップされたファイルを入出力できるので、ローカルのファイルを取り込むことはできません。csvファイルを「PostgreSQL\16\bin」などサーバー上にコピーして再実行すると取り込むことができました。

## copyコマンド
ローカル上のファイルをテーブルに取り込むことができます。
\copy [テーブル名] from '\aaaa\Book1.csv'delimiter','csv header;

## Moreをoffにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3539857/2690d5f3-ce08-4323-44f3-e72f434c2ca6.png)
↑コマンド実行中のMore

offにするコマンドがあります。
\pset pager off

ちなみに一度コマンド実行画面を閉じて再起動すると再びMoreが表示されるようになっていたので、offになるのは接続中のみのようです。

## View
よく使うselect文を保存してことができるみたいな機能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3539857/49a5ff71-ffc0-f9f8-4d99-32fff875c3c4.png)

# 最後に
覚えたことを忘れないために、簡単ではありますがメモにまとめてみました。
資格を取ってもまだまだ知らないことだらけです。
参加させていただきありがとうございました。
資格取得遍歴まとめ in 2023 (& 資格とるべき論争への個人的意見)

# Intro
昨年はAWS12冠に向け、AWS資格のProとSpecialityを約1年間で取り切ったのですが、
(https://qiita.com/kei1-dev/items/8a0ecb52552621b33ed1)
じゃあぎりぎり30歳直前の今年は何の資格を取ったのかという個人的まとめです。

ただ、それだけだと1記事書ききれなさそうだったので、なぜ資格を取っているのかという部分に対して個人的な意見も併せてまとめようと思っています。

# Contents
## 資格取得遍歴
まず今年とった資格一覧です。
| 合格日 | 資格名 |
|:-:|:-:|
|2023/4/9|Google Cloud Certified Associate Cloud Engineer|
|2023/5/7|Google Cloud Certified Cloud Digital Leader|
|2023/5/8|Google Cloud Certified Professional Cloud Architect|
|2023/5/14|Google Cloud Certified Professional Cloud DevOps Engineer|
|2023/6/11|Google Cloud Certified Professional Cloud Developer|
|2023/7/29|Google Cloud Certified Professional Machine Learning Engineer|
|2023/8/13|Google Cloud Certified Professional Data Engineer|
|2023/9/3|Google Cloud Certified Professional Cloud Database Engineer|
|2023/10/14|Google Cloud Certified Professional Cloud Security Engineer|
|2023/11/4|Microsoft Certified: Azure Administrator Associate (AZ104)|
|2023/11/19|Google Cloud Certified Professional Cloud Network Engineer|

※GCPは取得点数でないので、枠ごと消しました。

結果、ほとんどGoogle Cloudの資格でGoogle Cloud関係ないWorkspaceの資格以外はすべて取り切ることができました。あとは年明けにMS AzureのExpert2資格とりたいなということで少し早めにAZ104を取得しました。

Google Cloudの資格で辛かったのは、日↔英切り返しながら受験ができない、日本語訳がいまいちという試験サービス側の点が1番でした。
結局、PCA以降は日本語試験があってもすべて英語受験で乗り切りました。が、そうすると今度は英語での勉強だとペースが落ちるという、試験受験時か勉強時のいづれかに辛いことがある状態になってしまったので、再受験までにはAWSと同じく日↔英切り替え機能が実装されることを切に願っています。。。
(ACE受験後にも同じようなこと書いてますね。。。)

https://qiita.com/kei1-dev/items/24187af04e5c4f6ff712

試験自体はAWSでの知識を流用できる部分も多く、Google Cloudの各サービスを勉強するという側面が強かったかなと思いました。

来年は前述のAzure Expertの2つは早めに取りたいなと思うんですが、それ以降に何を取るかは決めかねているので、探さなきゃなと思っています。(AzureのAssociateは多すぎるので。。。)

## 資格取るべき？
結論、個々人のメリットデメリット次第だろうと思います。
僕はいわゆるSIerで働いていて、会社のサポートもあって、資格を持っていることが評価の一環になるため、クラウド関係の資格を(多少プライベートの時間に勉強しても)取ろうというモチベーションがあったというだけだと思います。
例えば、現職でJava Goldを取るモチベーションがあるかというともちろんないですし、逆にWeb系の会社で働いていたとしてAWSの資格をすべて取るモチベーションがあっただろうかと言われるとなさそうに思います。
ただ、資格を取ることは対会社内、対外部で意味を持つ場面もありますし、特に若手の場合は業務で特筆した結果を残すよりある程度以上の資格社内初取得や〇〇全冠のほうが容易な場合もあるので、取れるものは取っておいて損はないかなと思います。(現職で役立たなくても、転職時に役に立つことも全然あると思います。)

# Conclusion
社内でもなんでそんなに資格取ってるんですか？と聞かれることも度々あるので、今年の資格取得結果と合わせてまとめました。
来年早くにAzure Expert２種は取りたいと思うので、まずそこに向けて勉強していこうと思っています。
SvelteKit の handleFetch って何が嬉しいの？

# はじめに

SvelteKit には `handleFetch` というものがあり、翻訳サイトには以下のように書いてあります。

> **handleFetch**
この関数は、サーバー上で (またはプリレンダリング中に) 実行される `load` 関数や `action` 関数の中で発生する `fetch` リクエストを変更 (または置換) することできます。
>
> 例えば、ユーザーがクライアントサイドでそれぞれのページに移動する際に、`load` 関数で `https://api.yourapp.com` のようなパブリックな URL にリクエストを行うかもしれませんが、SSR の場合には (パブリックなインターネットとの間にあるプロキシやロードバランサーをバイパスして) API を直接呼ぶほうが理にかなっているでしょう。

**なぜ、SSR の場合には API を直接呼ぶほうが理にかなっているのでしょうか？**

# ざっくり概要図

ざっくりと `handleFetch` がない場合とある場合との比較をしてみます。

![SvelteKitのhandleFetchを使うとリクエストが外部ネットワークを通らなくなるので低遅延](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134221/7d23449d-9441-715d-cdce-a41f77107189.png)

:::note
handleFetch を使うとリクエストがVPC内で完結する
- メリット
    - 低遅延: VPC 内部通信なので、通常は外部ネットワークよりも低い遅延が期待できる
    - セキュリティ向上: プライベートネットワーク内で通信するので外部から傍受されない
- デメリット
    - API が外部ネットワーク経由と VPC 内経由の両方になると、不具合が発生した際に考慮すべき事項が増える
:::

# handleFetch の書き方

![SvelteKitはhandleFetchを使ってAPIのURLを置換してから内部ロードバランサにリクエストを送っている](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134221/4785369d-b829-c7ae-6c31-b648a84afb8a.png)

handleFetch がある場合に、SvelteKit でURLを置換しています。これは、公式リファレンスの書き方を参考に書くと以下のようになります。

```js:src/hooks.server.js
/** @type {import('@sveltejs/kit').HandleFetch} */
export async function handleFetch({ request, fetch }) {
  if (request.url.startsWith('https://api.yourapp.com/')) {
    request = new Request(
      request.url.replace(
        'https://api.yourapp.com/',
        'https://local.yourapp.com/'),
      request
    );
  }

  return fetch(request);
}
```

`local.yourapp.com`というドメインは、外部に公開されていないプライベートなDNSを想定していて、その先に内部ロードバランサーのアドレスが設定されています。

# クレデンシャル（認証情報）が維持できない場合

handleFetch で URL を書き換える場合に注意しないといけないのは、認証情報の扱いです。
上述の例では、`yourapp.com` ドメインでホストした SvelteKit から、`local.yourapp.com` サブドメインへのリクエストでは認証情報を引き継ぎます。しかし、もし SvelteKit を `www.yourapp.com` ドメインでホストしていた場合は認証情報を引き継ぎません。また、`local.yourapp.com` ではなく `api.hoge` のように、異なるドメインでも同様です。

これを解決するには、手動で元のリクエストから cookie を取り出し、新しいリクエストにセットする必要があります。

```diff_javascript:src/hooks.server.js
/** @type {import('@sveltejs/kit').HandleFetch} */
export async function handleFetch({ event, request, fetch }) {
  ...


+ if (request.url.startsWith('https://api.yourapp.com/')) {
+   request.headers.set('cookie', event.request.headers.get('cookie'));
+ }

  return fetch(request);
}
 ```

# おわりに

SSR で構築していると、どうしてもユーザーごとに異なるコンテンツを返す必要がでてきますし、マイページであれば認証してからでないと表示できません。そうした場合、サーバーサイドで認証 API を実行する必要があります。

SvelteKit でアプリケーションを構築するとき、この記事で書いたネットワーク・リクエストの流れを抑えておくと、どんな設定が必要か気づくきっかけになるのかなと思います:relaxed:

# 参考

SvelteKit日本語翻訳サイト

https://kit.svelte.jp/docs/hooks#server-hooks-handlefetch
swift WeatherKit Error Domain=WeatherDaemon.WDSJWTAuthenticatorService.Errors Code=1 "(null)"

## WeatherKit使用中以下のerror対応

```
Domain=WeatherDaemon.WDSJWTAuthenticatorService.Errors Code=1 "(null)"
```
の場合 [App Services]タブのWeatherKitチェック必要

![スクリーンショット 2023-12-17 0.26.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166098/a457dcb2-51f6-39ce-db62-1e5cff50a839.png)
非同期に苦しんだお話

# はじめに
今年のカレンダーはとある会社のとあるチームで活動した1年間を振り返っていきます

# 使用技術
・Lambda
・API Gateway WebSocket API
・Python

# 非同期に苦しんだお話

## やりたかったこと
・バックエンドでフロントからデータを受け取る・・・①
・受け取ったデータを外部APIにリクエストし、レスポンスデータをデータベースに保存する・・・②
・データベースからデータを取得し画面に表示する・・・③

## WebSocket(以下ws)のクォータ制限
当初は普通にデータを送信していましたが、大規模データを送信する際にクォータ制限に引っかかってしまう問題がありました。
32KBを超えるデータはwsで送信できないようです。そのためデータを分割する方針で実装していたのですがこれが後の悲劇を起こすことになるとは思っていませんでした。

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/limits.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889192/d30b8b44-fed6-882f-e920-bdd30466de23.png)


## 非同期の分割処理
最初は分割の数だけ処理①のハンドラーを実行、処理②のハンドラーでデータベースを参照して分割が終わっていることを確認できたらデータを結合して外部APIにリクエストをしていました。

「あれ、画面に複数のデータが表示されるぞ…」

CloudWatchを確認すると、処理②のハンドラーが複数実行されていました。

何回か動かしていると画面に複数のデータが表示されるときがあったりなかったり…

ここに非同期の落とし穴がありました。

分割の数だけ処理①のハンドラーを非同期で実行しているので、先に処理②のハンドラーが完了してしまうとその時点で外部APIにリクエストが行われてしまいます。

## そもそも分割しない
フロントからws経由でバックエンドにデータを送るのではなく、バックエンドでデータ保存のハンドラーを用意しそのハンドラーを叩くようにしました。
そしてフロントからは保存したデータのidなどをバックエンドに送り、idをキーにデータベースからデータを取得してそのまま外部APIにリクエストするようにしました。
これでwsのクォータ制限と非同期問題を回避することができました。


# おわりに
もっとはやく気づきたかったです。
wsやlambdaについて学ぶことができたので良い経験になりました。
Github ActionsでReactアプリをS3にアップロードする

## はじめに
この記事は [DENSO アドベントカレンダー 2023](https://qiita.com/advent-calendar/2023) の17日目の記事です。

業務の特徴もあり普段AWSを重点的に使用しています。
CI/CDパイプラインもAWSのCodeシリーズを使用しています。
Github Actionsがとても便利だと聞く機会が多いので使ってみました。
昨年のAdvent Calendarで作成した[Reactアプリ](https://github.com/kohei-fujii/react-todo-app)をS3にデプロイするワークフローを作成しました。
今回は、Github Actionsに関して記事にします。

## 構成
インフラは、CloudFront + S3の構成
Githubでコードを管理し、mainブランチにpushされたらS3にアプリをデプロイ

## 意識したこと
- Github Actionsでビルド〜デプロイまで実施
- IAMユーザ(恒久的なクレデンシャル)を使用しない
- AWSアカウントID等のあまり知られたくない情報は直書きしない

## 学んだこと
- ymlファイルでワークフローを定義して、```.github/workflow/```に配置する
- [OIDC](https://docs.github.com/ja/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services)を使用すると、IAM Roleを使用してAWS内のリソースにアクセスできる
- [Secret](https://docs.github.com/ja/actions/security-guides/using-secrets-in-github-actions)を使用すると、変数を安全に保管しGithub Actionsから取得できる

## 成果物

```yml
name: Deploy React app to S3
on:
  push:
      branches:
        - main
env:
  AWS_ACCOUNT_ID: ${{ secrets.AWS_ACCOUNT_ID }}
  AWS_ROLE_NAME: ${{ secrets.AWS_ROLE_NAME }}
  S3_BUCKET_NAME: ${{ secrets.S3_BUCKET_NAME }}
  AWS_REGION: ap-northeast-1
permissions:
  id-token: write
  contents: read
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: checkout
        uses: actions/checkout@v4
      - name: configure aws credentials
        uses: aws-actions/configure-aws-credentials@v3
        with:
          role-to-assume: arn:aws:iam::${{ env.AWS_ACCOUNT_ID }}:role/${{ env.AWS_ROLE_NAME }}
          role-session-name: samplerolesession
          aws-region: ${{ env.AWS_REGION }}
      - name: install
        run: npm install
      - name: build
        run: npm run build
      - name:  deploy
        run: |
          aws s3 cp --recursive build s3://${{ env.S3_BUCKET_NAME }}/

```

## 感想
とてもお手軽にリリースまで出来て感動しました。
【色変記事】TypeScriptで入茶した話

## はじめに
はじめまして、itojun-1230です！
入茶した感動そのままに記事を投稿いたします！
拙い文章で恐縮ですが、お付き合いいただけたら幸いです。

![itojunpei - AtCoder - Google Chrome 2023_12_16 23_24_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655193/39d6a774-daf1-936d-2b5c-40425f355dcc.png)


## 競プロに出会ったきっかけ
僕が競プロに出会ったのは、paizaがきっかけでした。
高校の頃に授業でpaizaを扱い、大学1年でAランクになりました。
しかし、Sランクの問題がどうしても解けず、根本的なアルゴリズム力が足りてないな…と感じていました。
その後は、いくつかプログラミングの問題を解けるサービスを練り歩き、AtCoderに行きつきました。
## なんでTypeScriptでやってるの？
それは、僕の競プロに対する考え方が、アルゴリズムの勉強だからです。
元々、僕はTypeScriptでWeb開発を主にしています。
競プロをやる上でもTypeScriptへの習熟度を向上させ、アルゴリズムを学ぶというコンセプトでやっています！
不便なところは、サンプルも少なく他の言語を読解してTypeScriptで書き直してみる必要があるところですかね
## 入茶するまでにやったこと
ここはTypeScriptだろうとC++、Pythonだろうと変わらないとは思いますが主に下記のことをしました。
* 過去問を解く & 解説を読む
* 大学の先生や競プロをやってる先輩に教えてもらう
* プログラミングを愛する

個人的には3番目が一番大事だと思います。好きじゃないと続かないし、やっぱり好きになるのが手っ取り早いんだと思います。

## 今後
僕は数学があまり得意ではないので今後上に行こうと思うと、数学の勉強が必要になってくるので勉強しなきゃなぁ～って思ってます
始めの画像を見ていただくとわかるのですが、あまり参加頻度が高くないんですよね
毎週土曜日のこの時間はAtCoderをやるんだと習慣付けていこうと思います


## おわりに
入茶はゴールじゃなくて次へのスタートラインなので、ここで燃え尽きることなくより一層力を入れていきます
あと、競技プログラミングだけじゃなくてちゃんと作品を作っていきたいですね
使わないアルゴリズムを突き詰めていくのはちょっと僕の方針とは異なるので、学んだアルゴリズムは積極的に作品に落とし込んでみたいです
競技プログラミングに限らず、なにか続報があればこちらに投稿したいと思っているので、今後ともよろしくお願いしますm(__)m
最後まで見ていただきありがとうございました！！！!ノシ
開発チーム主体で数字を伸ばしていくためにやったこと

## はじめに
こんにちは、GlobeeでCTOをやっています上赤です。
[Globee Advent Calendar](https://qiita.com/advent-calendar/2023/globee)17日目の記事です。

弊社では今年から、**開発チーム主体で数字を伸ばしていく**、という動き方を試しています。その過程でいろいろ試したことがありますので、それをまとめます。
すでに似たような動きをやられている方からすると当たり前の話も多いかとは思いますが、よろしくお願いします。

## 前提
弊社では[abceed](https://www.abceed.com/)という英語教育のサービスを作っています。
私がGlobeeに入社してからもう7年ぐらい経ちますが、**最初は私とCEOの2人しかいない状態**でした。
その時の開発の進め方は当然、私とCEOで相談してどの施策を行うかを決めていく、というもので、その後エンジニアが1人2人と徐々に入社してくれた後も、**私とCEOで相談して施策の内容を決め、そこで決まった内容を開発チームで開発していく**、という流れで開発を行っていました。(リファクタリングや不具合修正の判断などは開発チームで独立して行う)

2022年の段階では、**開発チーム全体で10名以上**の大きさのチームになっていましたが、実装段階で仕様やデザインのおかしい点を開発チームから指摘し修正していく、という動きは頻繁にあったものの、大本の施策を開発チーム主体で考えるというのはほぼ無かったかなと思います。


## 何故やろうと思ったのか
今年から開発チーム主体で数字を伸ばしていく、という動きをやろうと思った理由は、会社が大きくなるにつれ、CEOがプロダクトに割けるリソースが足りなくなってきたからです。

仮にプロダクトの施策を開発チームで独立して考えて数字を伸ばしていく、という動きが出来れば、プロダクトの多角化など打てる施策の幅も広がるので、それを検証しようと考えました。


## やったこと
最初は開発チームを集めていきなり施策をブレストしてもらったりしていたのですが、チームメンバーから諸々意見を貰って、もう少し進め方を整理することにしました。
試行錯誤の結果、今年やったことの中で効果的だったものをまとめます。

### KPI Treeの作成
まずは、
* どの数字を伸ばしたいのか？
の認識を合わせるために、チーム全員で[KPI Tree](https://www.kaonavi.jp/dictionary/kpi_tree/)を作成しました。

![スクリーンショット 2023-12-16 23.52.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49019/1369a35d-734d-b1b1-9d48-422107cf4988.png)


KPI Treeを作っていく過程で、知らず知らずのうちに使っていたドメイン用語についてもチーム内で認識を合わせることが出来たのも良かったです。
例えば、**学習機能**という用語を良く使っていましたが、具体的にどの機能が学習機能なのか？というのはメンバーごとに認識がやや曖昧だったので、その辺りを整理することが出来ました。



### KPIダッシュボードの作成/共有
KPI Treeの作成で、
* どの数字を伸ばしたいのか？

が決まったので、その数字をリアルタイムに表示できるダッシュボードを[redash](https://redash.io/)で作成し、そのダッシュボードをメンバーが誰でも見れる状態にしました。

個人的な癖で、ダッシュボードを作る時につい細かい数値まで載せるようにしてしまいがちなのですが、それでは分かりにくいという意見を貰ったので、伸ばしたい数字にできるだけ絞って見れるようにしました。

また、ただ見れるようにするだけだとメンバーごとに閲覧頻度に差が出るので、全員がいる場で定期的にダッシュボードを確認し、KPIの現状について共有するようにしました。

### KPI Discussionの実施と振り返り
KPIへの認識が揃ったところで、実際に施策を考えていくDiscussionを隔週で行うようにしました。
これも最初は自由なブレスト気味でやっていたのですが、メンバーからの意見で、

* まずKPIの現状を踏まえ、解決すべきだと思う課題をブレスト
* 洗い出された課題に対して投票を行い、優先度が高い課題を決定
* 優先度が高い課題に対する、有効だと思う施策をブレスト
* 施策に対して投票を行い、優先度が高い施策を決定

という流れで行うようにしたところ、議論の方向性が定まりやすくなり、良い施策が出るようになった気がします。
なお、ブレスト及び投票は[Miro](https://miro.com/ja/)を使って行っています。

基本的にはここで決まった施策を実装しリリースした後、実際に狙い通り数字が伸びたかどうか、というのをダッシュボードを見ながら確認していく、というサイクルで開発を行いました。

KPI Discussionを通して施策を決めることで、
* その施策がどの数字を伸ばすためにリリースするものなのか

というのがチーム内で明確にできたので、実装へのモチベーションも上げることができ、良かったと思います。

## 結果
今年6月からこの動き方を開始したのですが、徐々に軌道に乗ってきて、今年12月時点でかなり良い結果を出せています。まだまだ不慣れな箇所が多いですが、前職でこの辺りの経験が深いメンバーもいますので、意見を都度貰って改善してきたいと考えています。

弊社では、現在アプリ/Web/サーバーエンジニア/PjMなど、ほぼすべての開発ポジションを募集中です！
ちょっとでも興味持った人は以下からカジュアル面談をご検討ください。色々お話します！
[採用ページ](https://globee.notion.site/Globee-d184eefc3561480292481299c64b04bc)
LeetCode備忘録_その4_Two Sum

# 概要
- LeetCodeを始めました。１テーマごとに解法と学びをメモします
- 今回テーマは「Arrays & Two Sum」

# テーマ詳細
### 原文
Given an array of integers nums and an integer target, return indices of the two numbers such that they add up to target.

You may assume that each input would have exactly one solution, and you may not use the same element twice.

You can return the answer in any order.

Example 1:
>Input: nums = [2,7,11,15], target = 9
Output: [0,1]
Explanation: Because nums[0] + nums[1] == 9, we return [0, 1].

Example 2:
>Input: nums = [3,2,4], target = 6
Output: [1,2]

Example 3:
>Input: nums = [3,3], target = 6
Output: [0,1]
 
Constraints:
```math
- 2 <= nums.length <= 10^{4}

```

```math
- 10^{-9} <= nums[i] <= 10{9} 
```

```math
10^{-9}<= target <= 10^{9}
```


### 日本語訳
※G翻訳
整数 nums の配列と整数ターゲットを指定して、合計がターゲットになるような 2 つの数値のインデックスを返します。 各入力にはソリューションが 1 つだけ存在し、同じ要素を 2 回使用することはできないと想定できます。 回答は任意の順序で返すことができます。 
例 1: 
>入力: nums = [2,7,11,15]、ターゲット = 9, 出力: [0,1] 
説明: nums[0] nums[1] == 9 であるため、[0, 1] を返します。 

例 2: 
>入力: nums = [3,2,4]、ターゲット = 6 出力: [1,2] 

例 3:
>入力: nums = [3,3]、ターゲット = 6 出力: [0,1] 

制約: 
```math
- 2 <= nums.length <= 10^{4}

```

```math
- 10^{-9} <= nums[i] <= 10{9} 
```

```math
10^{-9}<= target <= 10^{9}
```

# 解法
```
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        numMap = {}
        n = len(nums)
        for i in range(n):
            complement = target - nums[i]
            if complement in numMap:
                return [numMap[complement], i]
            numMap[nums[i]] = i

        return []  # No solution found
```
https://leetcode.com/problems/two-sum/submissions/1116144432/
# 結果
- Runtime:58ms  
- Beats 89.29% of users with Python 　※投稿日時点

# 思想
- numsの中から、足してtargetになる"2つ"の数字の要素位置を返せば良いので、なにか工夫できそうだと感じる
- numsの頭から　target - nums[i]　を求めてnums[i+1:]にその値と一致するものがあるかどうかを判定すれば良さそう
# 学び
- for文の中で要素を記憶して置く方法として、for文の外で辞書を作っておいて、forループごとに辞書登録する
- リストではなく辞書にすることで、索引の処理を軽くする
- キーに要素、バリューに位置を持たせることで簡単に位置と要素を取り出せるようにする

# 感想
- 今回は今までの中で一番時間がかかった
- for文を使ってしまったが、使わない方法があれば知りたい。いくつか他の方のSolutionを見てみたがなかった
Android の一部端末で twitter.com/home にアクセスすると…… 

https://twitter.com/home

# あるアカウントのプロフィールに飛ぶ
https://twitter.com/intent/user?lang=ja&screen_name=HOME

`@home` さんのプロフィールに飛んでしまいます。

# そもそも、twitter.com/{screen_name} でプロフィールに飛べる
https://twitter.com/nadekuc

例えばこのようにすれば `@nadekuc` のプロフィールに飛べます。

# タイムライン画面にアクセスさせたいんだけど……
https://twitter.com

に普通にアクセスすれば良いです。

# おわり
これが端末によって挙動違うの罠すぎる。
initial-letterを試してみた

## これはなに

Chrome110から使えるようになった `initial-letter` CSSプロパティの挙動を確かめてみようと思い、記事にしました。

## `initial-letter`とは

頭文字をドロップキャップにしたり、上げたり、下げたりすることができます。
ドロップキャップとは、雑誌などで段落またはセクションの先頭にある装飾要素として使用される大きな大文字のことです。

```css
initial-letter; <文字のサイズと占有する行数> <文字シンク>;
```

値は数値を2つ使います。半角スペース区切りです。
負の値は指定できません。
文字シンクの数値は省略することができます。

## デモ

`::first-letter` と組み合わせて、ドロップキャップを表現することができます。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="wvNLbjj" data-user="gilly135" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/gilly135/pen/wvNLbjj">
  Untitled</a> by gilly135 (<a href="https://codepen.io/gilly135">@gilly135</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

今まではfloatとか必要でしたが、非常に少ないプロパティで実装することができました。

## サポートブラウザ

2023年12月現在では、Can I useを見ると、まだまだ使えるブラウザは多くないようです。
Safariでは `-webkit-` が必要です。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215239/f9db5239-194c-c7a1-4850-b3db2aa3cadb.png)

## 参考

- ["initial-letter" | Can I use... Support tables for HTML5, CSS3, etc](https://caniuse.com/?search=initial-letter)
- [initial-letter - CSS: カスケーディングスタイルシート | MDN](https://developer.mozilla.org/ja/docs/Web/CSS/initial-letter)
- [CSS のイニシャル文字を使用してドロップ キャップを管理する  |  Blog  |  Chrome for Developers](https://developer.chrome.com/blog/control-your-drop-caps-with-css-initial-letter/?hl=ja)
【React】ファイル選択ダイアログを閉じた際にdialogが閉じないようにする方法

## 状況

以下のように`<dialog>`の中に`<input type='file'>`を記述している場合に、Chromeでファイル選択ダイアログをキャンセルで閉じた際にdialogも閉じてしまう。

```tsx
// ...

  <dialog>
    <input type="file" />
  </dialog>

// ...
```

## 改善方法

ファイル選択ダイアログをキャンセルした際に`cancel`イベントが発生することが原因。
`onCancel`で以下のように`ev.target`が`dialog`の場合にのみ`dialog`を閉じるようにする。

```tsx
// ...
  const handleCancel = useCallback(
    (ev: React.SyntheticEvent<HTMLDialogElement, Event>) => {
      if (ev.target instanceof HTMLDialogElement) {
        ev.preventDefault()
        closeModal()
      }
    },
    [closeModal]
  )

// ...
  <dialog onCancel={handleCancel}>
```
HULFTの活用法と特徴

# 1. はじめに
HULFTを活用する機会があったため、詳しく調べた内容を記事にします。

# 2. HULFTとは
HULFTとは、ファイル情報の転送とその前後処理を統合的に扱うためのソフトウェアです。単なるftpなどのファイル転送ソフトウェアとは下記の点で異なります。
 
## 2.1 ファイル転送の進捗管理
送信側でファイルを小分けにして送信し、集信側でファイル受信状況を送信側に逐一通知しています。これにより、データの送信状況を確認できます。
## 2.2 ファイルの文字コード変換
各種汎用機で使われている文字コードに対応しています。これにより、汎用機に対応するときに発生しがちな文字コード関連のプログラムの開発工数を削減するとともに、バグの発生を防ぐことができます。
## 2.3 受信ファイルの整合性チェック
受信側でファイルサイズをチェックしています。これにより、送信側かファイルが正しく転送されたかを確認できます。
## 2.4 転送後の送受信ファイルロック
転送後、送受信側の両方でファイルロックをかけます。これにより、ファイルの一貫性が確保され、転送後に他のプロセスがファイルの内容を変更してしまう不具合を防げます。



# 3 おわりに
この記事がHULFTの理解に役立つことができたら幸いです。
少しわかる「システム運用アンチパターン」

# はじめに
気になった、というより身に覚えのあるアンチパターンと、その解決策についてまとめます。

「20 分でわかる」系のやつをたくさん書こうと思っていたらめちゃくちゃかぶってしまいました。のでタイトルは「少しわかる」に変えました。

https://speakerdeck.com/yuichielectric/operations-anti-patterns-in-30-minutes

# まず最初に、DevOps の 4 つの柱
- **文化 (culture)**
  チームが活動する際の基準になるもの
- **自動化 (automation)**
  メンバーを平凡な作業から解放するもの
- **メトリクス (metrics)**
  物事がうまくいっているかどうかを監視するもの
- **共有 (share)**
  文化を強化するもの

DevOps を支える主要な要素はこの 4 つとされ、それぞれの頭文字を取って CAMS モデルと呼ばれます。
このモデルに沿った改善を行うことでアンチパターンからの脱却ができます。


# パターナリスト症候群
あるグループの活動が、他のグループの活動に依存し、親子のような関係を成している状態を**パターナリスト症候群**と呼びます。

この状態では、仕事の進め方やタイミングが常に**ゲートキーパー**と呼ばれる権力者に委ねることになります。

誤操作をしやすいシステムに対する権限管理や、そのときのプロセスでは防げなかった問題に対しての承認プロセスの追加がこの状態を引き起こしています。

結果、ゲートキーパーが生産性のボトルネックとなるばかりか、ゲートキーパーへ多大なプレッシャーが集中することとなります。



## 解決策
「ゲートキーパーによる承認」で解決しようとしていることが何なのかを洗い出し、プロセスの自動化によってこれを解決します。

### 承認プロセスで解決したいこと
承認プロセスで軽減しようとしている一般的な懸念には以下のようなものがあります。
- プロセスの全ての作業が継続されるべき状態にあるかを確認したい
- 作業の発生を知らなくてはならない人に知らせておきたい
- 並行する他のプロセスとの衝突がないことを確認したい
- 変更のリスクが許容できるものかを確認しておきたい


# アラート疲れ
チームメンバーが非常に多くの、しかもほとんどは緊急性のないアラートに晒された結果、アラートに対して鈍感になった状態を**アラート疲れ**と呼びます。

## 解決策
**オンコールローテーション**を編成します。

**オンコールローテーション**では、特定の人を一定期間の間システムの最初の連絡先として指定します。問題の発生から各ステージまでにかかる時間についての**サービスレベル目標**を設定し、実際の対応時間と比較するのが良いです。

### 3 つのサービスレベル目標
応答時間がサービスレベル目標を上回った場合にはエスカレーションされ、第二のオンコール担当へ連絡が飛ぶようにすると良いでしょう。
- 問題の発生から確認までの時間
- 確認から対応開始までの時間
- 対応開始から完了までの時間

### オンコール対応の負担
オンコール対応への補償、対応の幸福度調査が必要です。
負担を減らすため、一般的なトラブルシューティングタスクは自動化する必要があります。


# 情報のため込み
ドキュメント共有、コミュニケーションの仕組みがうまくいっていないために情報が一部のチームメンバーに溜めこまれている状態を表します。

## 解決策
自分が情報のゲートキーパーになっていないかどうか振り返ってみましょう。また、情報共有の仕組みを作ることや、学習の習慣付けを行うのが良いです。

### 学習の習慣付け
「ドキュメント化していこう」というアプローチがうまくいかない理由の一つは、あるトピックについての専門的な知識を持ったチームメンバー **Subject Matter Experts (SME)** が多くないためです。

SME に対して特定トピックの情報や依頼が集中し、情報共有に時間が割けなくなってしまいます。このような場合、以下のような方法で SME から他のメンバーに学習の機会をもたらすことができます。
- ランチ & ラーン
- LT
- ブログでの、敷居を下げた共有

# おわり
これら 3 トピックは身に覚えのある方も多いのではないでしょうか。解決策や、アンチパターンの詳細、その他のアンチパターンについては書籍を読んでください。

https://www.oreilly.co.jp//books/9784873119847/
pyenvでVersionを指定する

# 概要
pyenvでVersionを指定する方法。

# 方法
.python-versionファイルを作成して、バージョンを指定する。
```.python-version
3.6.4
```

※windowsの場合pyeynではなく、pyenv-winをインストールする。
<a href="https://github.com/pyenv-win/pyenv-win" target="_blank">pyenv-win</a>
都知事杯オープンデータハッカソンに参加してみて

[CivicTech ＆ GovTech Advent Calendar 2023](https://qiita.com/advent-calendar/2023/civictech) の16日目の記事です。

## 都知事杯オープンデータハッカソンとは
「アイデアとデータで新しい価値を生み出そう」というビジョンの元、
プレイベントが6/15から始まり、キックオフが8/2に行われチームを組み、
8/26, 27のハッカソンに挑むというイベントです。
発表は8/27ではなく、9/10に行いました。
結構ハッカソンにしては長期間のイベントかと個人的に感じました。

:::note info
2023年の公式サイト
https://odhackathon.metro.tokyo.lg.jp
:::

## オープンデータの可能性
実はオープンデータを用いた開発はこのハッカソンが初めてでした。
なので、最初片っ端からExcelやCSV・PDFのダウンロードをして中身を見ていきました。
防災や少子高齢化に関することであったり、喫煙所の場所など様々なデータがあり、
これらのデータを網羅した何かが作れたら便利だろうなあととても可能性を感じました。

:::note info
[東京都 オープンデータカタログサイト](https://portal.data.metro.tokyo.lg.jp)
:::

## オープンデータの課題
可能性は秘めているものの、課題は多くあると実装をしていて思いました。
自治体や組織によってフォーマットが揃っていなかったり、
存在するはずのオープンデータが閲覧不可となっていたりと
オープンデータを用いて実装していく上での課題感はとても感じました。

実際にファイナリストまで選ばれた中で2チームほど、
オープンデータの使いにくさを解消するためのアイデアやプロダクトを提案していました。

## 開発したもの
OpenAIのAPIを用いたチャットボットでメンタルケアを行う
Webアプリケーションを開発しました。
ユーザーに対し、メンタルケアや住んでいる自治体の支援制度を提案し、
自立と成長を支援するプロダクトを目指しました。
ざっくりした処理フローは以下です。
```mermaid
sequenceDiagram
    participant ユーザー
    participant UI
    participant Webサーバー
    participant GPT-4
    participant オープンデータ

    ユーザー->>UI: 問い合わせ
    UI->>Webサーバー: 問い合わせを転送
    Webサーバー->>GPT-4: GPT-4に問い合わせ
    GPT-4->>オープンデータ: 東京都のオープンデータを利用
    オープンデータ->>GPT-4: オープンデータを渡す
    GPT-4->>Webサーバー: 学習し、回答を生成し返す
    Webサーバー->>UI: 回答を表示
    UI->>ユーザー: 回答を提供
```
使った主な技術は以下です。
- Backend
  - Python
  - Django
- Frontend
  - TypeScript
  - React

プレゼンのアーカイブはこちら

https://www.youtube.com/watch?v=TiiDAus5tUk&t=9894s

## 参加してみての感想
シビックテックに触れたのは初めてだったのですが、
法律など様々な壁が存在するのだということを知りました。
しかし、生成AIというゲームチェンジャーが現れたことにより
もっとシビックテックの可能性は広がっていくのだろうと思いました。
（自チーム含めOpenAIのAPIを使っているチームが多かった印象）

あとは結構長期間に渡るイベントなのでチームメンバーは
予め決めて臨んだ方が良さそうだと思いました...
（非エンジニアの方も多かったので色々ありました...）

ファイナリストまで残れなかったのですが
何か趣味で東京都オープンデータを使って開発ができればと思っています。
また、来年にでもリベンジできたらとも思います💪

この記事から行政などに課題を感じている方々が
シビックテックに興味を持ってもらえることを願っています。