OmniAICreator/Qiita-1.07M huggingface dataset:
transfomerまとめ


## embedding
```python
# pip install sentence-transformers

from sentence_transformers import SentenceTransformer

model_name = "roberta-large-nli-stsb-mean-tokens"
model = SentenceTransformer(model_name)
sentence = "Pythonはプログラミング言語です"
sentence_embedding = model.encode(sentence)

print(f"Embedding size: {len(sentence_embedding)}")
```

次元数について
使用するモデルによってベクトル化の次元数が異なる。次元数は多ければ多いほど細かく分類ができると思う

試したモデルと次元数
bert-base-nli-mean-tokens: 768次元
roberta-large-nli-stsb-mean-tokens:1024次元
bert-large-nli-mean-tokens: 1024次元

ちなみにopenaiのembedding apiでは1536次元


chat gptに聞いた指定できるモデルの種類(特に確かめてはいないです)
- BERTベースのモデル
  - `bert-base-nli-mean-tokens`
  - `bert-large-nli-mean-tokens`
- RoBERTaベースのモデル
  - `roberta-base-nli-stsb-mean-tokens`
  - `roberta-large-nli-stsb-mean-tokens`
- DistilBERTベースのモデル
  - `distilbert-base-nli-mean-tokens`
- XLM-RoBERTaベースのモデル
  - `xlm-r-base-en-ko-nli-ststb`
- xlm-r-large-en-ko-nli-ststb
- MiniLMベースのモデル
  - `paraphrase-MiniLM-L6-v2`
- その他のモデル
  - `paraphrase-distilroberta-base-v1`
  - `paraphrase-multilingual-MiniLM-L12-v2`


## 感情分析

```python
from transformers import pipeline

model_name = "lxyuan/distilbert-base-multilingual-cased-sentiments-student"
classifier = pipeline("sentiment-analysis", model=model_name)
sentences = [
    "Pythonはプログラミング言語です",
    "ハムスターは可愛いです",
]
results = classifier(sentences)
for result in results:
    print(result)

# {"label": "positive", "score": 0.4850502908229828}
# {"label": "positive", "score": 0.8274434208869934}
```

chat gptに聞いた指定できるモデルの種類(特に確かめてはいないです)

- `lxyuan/distilbert-base-multilingual-cased-sentiments-student`
  - 多言語に対応したDistilBERTベースのモデル。
- `mrm8488/distilroberta-finetuned-financial-news-sentiment-analysis`
  -金融ニュースの感情分析にファインチューニングされたDistilRoBERTaモデル。
- `nlptown/bert-base-multilingual-uncased-sentiment`
  - 多言語に対応したBERTベースのモデル。
- `cardiffnlp/twitter-xlm-roberta-base-sentiment`
  - Twitterデータ用のXLM-RoBERTaベースのモデル。
- `edumunozsala/bertin_base_sentiment_analysis_es`
  - スペイン語テキストの感情分析用のBERTモデル。
pythonで正の整数の除算における切り捨て、切り上げを正しく行う方法

(2024/01/25 追記)
この記事で紹介している方法は整数の除算でのみ適用できる考え方でしたが，小数であっても使えるかのような内容になってしまっていましたので記事に修正を加えました．
@fujitanozomuさん，ご指摘ありがとうございました。

# はじめに
<!-- 発端や概要を記載 -->
この記事は、[一関高専Advent Calender2023 25日目](https://qiita.com/advent-calendar/2023/inct-calender)の記事です。

こんにちは。

最近競技プログラミングをやり始めたのですが、今まで特に気にしていなかった計算量や低レイヤ－での実装なんかも気にする必要があって、大変ですが、とてもいい勉強になります。

今回はそんな中でも私が苦しめられた、pythonでの除算の切り上げ切り捨ての書き方について書いていきたいと思います。

ちなみにここで言う切り上げ切り捨てはそれぞれ以下のことを指します。
- 切り上げ: 正の無限大への丸め
- 切り捨て: 負の無限大への丸め



# 目次
<!-- タイトルとアンカー名を編集 -->
1. [結論](#Chapter1)
1. [何が問題？](#Chapter2)
1. [考え方](#Chapter3)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 結論
早速ですが誤差が出る間違った書き方と正しい書き方を書いておきます
ここではAをBで割ることを考えます

間違った方法
```python
import math
# 切り上げ
math.ceil(A / B)

# 切り捨て
math.floor(A / B)
```

正しい方法
```python
# 切り上げ
(A + B - 1) // B

# 切り捨て
A // B
```

<a id="#Chapter2"></a>
# 何が問題？
実際に例とともに問題点を見てみましょう

上記の方法の実行結果を比較します．
```python
A = 1040302749724122076
B = 23879

import math
# 切り上げ
print(math.ceil(A / B))
# 43565591093602

# 切り捨て
print(math.floor(A / B))
# 43565591093602


# 切り上げ
print((A + B - 1) // B)
# 43565591093602

# 切り捨て
print(A // B)
# 43565591093601
```

このように結果が変わってしまいます．
そこで，除算の部分の実行結果を見てみます
```python
A = 1040302749724122076
B = 23879

print(A / B)
# 43565591093602.0

print(A // B)
# 43565591093601
```

一見，きれいに割り切れているようにも見えますが，そうではないことがわかります．さらに以下のようなサイトなどで実行してみるとこのような結果が得られます

https://keisan.casio.jp/calculator

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575340/ad5588f6-86a0-072e-e57a-b98ac0f632b4.png)

以上のことから，問題のある方法では，最初の除算と，そのあとの，切り上げ切り捨てという２回の丸めが行われていることがわかります．

<a id="#Chapter3"></a>
# 考え方
では２つ目の方法がなぜ正しいのかを考えていきます．
正しい証明など気になる方は各自で調べてみてください．

今回の問題点は，2回丸めが行われることでした．
なので，最初の計算の段階で丸めてしまえば問題ないです。

この時切り捨てに関しては、以下の通り、すでにpythonの演算子が用意されています
```python
A // B
```

では切り捨てはどうすればいいのか?答えは切り捨てを使って、切り上げを表現します。
それが上記の式`(A + B - 1) // B`です.

なぜ、これが成り立つのかを考えます。
まず`A / B`をあまり付きで考えてみます
商を`r`として次のパターンに分けられます
- `A / B = r 余り 0`
- `A / B = r 余り 1`
- `A / B = r 余り 2`
~~
- `A / B = r 余り r-3`
- `A / B = r 余り r-2`
- `A / B = r 余り r-1`
上の式を切り上げる場合、最初のパターンを除いて、r+1になります。

これらの式を元に`(A + B - 1) // B`を同様に考えてみます.
- `A / B = r 余り B - 1`
- `A / B = r+1 余り 0`
- `A / B = r+1 余り 1`
~~
- `A / B = r+1 余り r-4`
- `A / B = r+1 余り r-3`
- `A / B = r+1 余り r-2`

すると最初の場合以外に1が足される形になりました。
こうすることで、切り捨てで切り上げを表現できるようになったので、誤差なく切り捨てと切り上げをできるようになりました。
【Python】The 'pathlib' package is an obsolete backport of a standard library ・・・

# エラー状況
Anaconda Promptで以下のコマンドを実行し、Pythonによるデスクトップアプリケーションを実行形式のファイル（拡張子.exe）に変換しようと試みた。
```:Anacona Prompt
$conda install -c conda-forge pyinstalle
$pyinstaller Editor.py --noconsole --onefile
```
すると、以下のようなエラーが返ってきた。
```
The 'pathlib' package is an obsolete backport of a standard library package and is incompatible with PyInstaller. 
Please remove this package (located in C:\Users\user\anaconda3\Lib\site-packages) using　conda remove
then try again.
```
Pythonに付随するpathlibパッケージが古すぎる（Pythonの標準ライブラリではない）ので、PyInstallerとの互換性がない。よって、それを削除した上で再度試してくださいとのこと。

# 対処法
エラーの言う通り、pathlibを削除してみる。
```:Anaconda Prompt
$conda remove pathlib
```
これを実行した上で再度、最初のコマンドを実行すると問題なく変換ができた。
また、この解決法以外に、以下のようにPyInstallerのバージョンをpathlibと互換性のあるバージョンまで下げるという方法もあるようだ（パッケージマネージャーにcondaではなく、pipを使用している点に注意）。

```:Anaconda Prompt
$pip install pyinstaller==5.1 
```
# 参考
https://stackoverflow.com/questions/75476135/how-to-convert-python-file-to-exe-the-pathlib-package-is-an-obsolete-backport

https://www.reddit.com/r/learnpython/comments/113t8kg/problem_with_pathlib_and_pyinstaller/?rdt=43321

久我涼子（2021） 『Pythonではじめるデスクトップアプリ開発入門』

https://www.amazon.co.jp/Python%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80-%E4%B9%85%E6%88%91-%E6%B6%BC%E5%AD%90/dp/B09K21NXDZ?source=ps-sl-shoppingads-lpcontext&ref_=fplfs&ref_=fplfs&psc=1&smid=AN1VRQENFRJN5
xcode15からorganizer画面が変化した

## xcode15でorganizer画面の内容が変更された
基本的にtestflightにappする場合は一番初めに選択されているtestFlight&Appstoreを選択する

![スクリーンショット 2023-12-31 1.39.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803173/ab0dcd55-2543-08b1-93f8-b68dd7586780.png)

## xcode15未満の時のorganizerを使用したい場合
上の画像で[Custom]を選択すると下記のように以前のxcodeで使用していた画面が選択できる
build番号を1ずつ上げるように管理していないとかAdHocでアプリを入れたい時とかに使用できそう。

![スクリーンショット 2023-12-31 1.39.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803173/f6548f7f-83a1-9580-5bed-6078b8cd6838.png)
プリンシプル オブ プログラミングの感想

# 初めに
[プリンシプル オブ プログラミング 3年目までに身につけたい 一生役立つ101の原理原則](https://www.amazon.co.jp/%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B7%E3%83%97%E3%83%AB-%E3%82%AA%E3%83%96-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-3%E5%B9%B4%E7%9B%AE%E3%81%BE%E3%81%A7%E3%81%AB%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%91%E3%81%9F%E3%81%84-%E4%B8%80%E7%94%9F%E5%BD%B9%E7%AB%8B%E3%81%A4101%E3%81%AE%E5%8E%9F%E7%90%86%E5%8E%9F%E5%89%87-ebook/dp/B071V7MY82/ref=sr_1_1?adgrpid=54047794275&gclid=Cj0KCQiAvqGcBhCJARIsAFQ5ke7wfJMKUBBJGr1inlMk483Pa-uT5N6S9_qRanilTNabJNi7Rw7L1RQaAqRZEALw_wcB&hvadid=618680297210&hvdev=c&hvlocphy=1009453&hvnetw=g&hvqmt=e&hvrand=6734311190388520254&hvtargid=kwd-334163704704&hydadcr=27270_14598092&jp-ad-ap=0&keywords=%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B7%E3%83%97%E3%83%AB+%E3%82%AA%E3%83%96+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0&qid=1669940186&qu=eyJxc2MiOiIxLjIzIiwicXNhIjoiMS4xOSIsInFzcCI6IjEuMDkifQ%3D%3D&sr=8-1)を読んだ。
転職活動を終えて時間ができ、だいぶ昔に読むべきリストに追加したこの本を読む機会があったため、その概要と感想を残す。

# 概要
この本には、プログラマとしてどう成長していくかと悩む人へ、著者が数多くの書籍や経験から学んだプリンシプル(原則)を示し、プログラマとしての土台作りを助けてくれる内容が書かれている。
プログラマがどういうコードを書くべきかを様々な原則から説明している。原則についてそれぞれWhat,Why,Howに言及されており、その原則が必要な理由とその原則に基づいてどう行動に移すべきかまで理解できる。
あくまで原則ということで、具体的な状況にどういうコードを書くべきかの記述は少なく、抽象度が高い情報をかみ砕いて分かりやすく説明している。

# 感想
漠然と聞いたことがある原則や聞いたことのない原則を詳しく学ぶことができた。
この本のタイトルにあるように、業界に入って3年目までにこの考えを身につけておけばもっと早くにコードを書くときの心構えを身に着けられたと思うと同時に、今だからこそ原則に従うべき理由が身に染みて分かるということもあった。
原則によっては重複した内容(例えばDRYの原則と同じような原則)があり、これさっき読んだと思うところがいくつもあったが、それだけ重要なことなんだと再認識することができた。
今まで先輩から注意されたことやコードを読んで学んだ知識がこの本に詰まっていたため、いいコードとは何か、どんなプログラマになるべきかということを知りたい人にはぜひ読んでほしい内容だ。
Scratchの音声の鳴らし方まとめ

こんにちはsurahotokeです。
今回は拡張機能の音声合成の音声の鳴らし方を5つ紹介します。
汎用性のために、適当な長さの文リストを作り、「<font color="green">尸</font>が押されたとき」それらを読ませます。
音声用スプライトを作ると良いです。
使用する拡張機能は音声合成のみです。
このリンクは、今回紹介する5つを載せたものです。
https://scratch.mit.edu/projects/945316031/
# 目次:
- [完全に鳴らし終わってから次の音声に移る](#完全に鳴らし終わってから次の音声に移る)
- [今の音声を流したまま、途中で、次の音声を鳴らす](#今の音声を流したまま途中で次の音声を鳴らす)
    - [秒指定](#秒指定)
    - [割合指定](#割合指定)
- [今の音声を途中で切り上げて、次の音声を鳴らす](#今の音声を途中で切り上げて次の音声を鳴らす)
    - [秒指定](#秒指定-1)
    - [割合指定](#割合指定-1)
# 完全に鳴らし終わってから次の音声に移る
![スクリーンショット 2023-12-30 20.19.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627057/7030e459-ee8a-e496-5ded-7bab015aacfe.png)
# 今の音声を流したまま途中で次の音声を鳴らす
### 秒指定
n秒間隔で鳴らす。
![スクリーンショット 2023-12-30 21.02.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627057/642676ad-b7eb-e2d7-a854-23150324b14e.png)

:::note
補足:
nを0以下にすると同時に鳴らせます。
:::
### 割合指定 
pが割合です。クローンを使用するため300個までです。前処理ブロックの中を改良すると、300個より多くもできます。
また、前処理ブロック実行中はうるさいので注意してね！
![スクリーンショット 2023-12-30 21.40.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627057/44810744-30d6-a6ac-8907-2cecfac09260.png)
![スクリーンショット 2023-12-30 21.41.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627057/8de71d0a-f73b-1892-efd9-23c24ac356e9.png)

:::note warn
変数i2は作る時に「このスプライトのみ」にする必要があります。
![スクリーンショット 2023-12-30 21.22.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627057/6883fea3-3e35-7c0f-8d59-951fca921b08.png)
:::
# 今の音声を途中で切り上げて次の音声を鳴らす
実は音声合成の音声は結構強くて、スプライトの他のスプリクトを止めるでも、クローンが音声を鳴らしている中にクローンを削除しても、鳴り続けます。全てを止めるブロックだと止まってくれるのでそれを使います。
そのため、以下のプログラムは他のプログラムと共に使う場合注意が必要です。
### 秒指定
n秒間隔で鳴らす。
![スクリーンショット 2023-12-30 20.47.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627057/8a804a2b-5dfb-4841-2cf1-1af807b28aff.png)
### 割合指定
pが割合です。クローンを使用するため300個までです。前処理ブロックの中を改良すると、300個より多くもできます。
変数t2はそのまま「全てのスプライト用」で良いです。
また、前処理ブロック実行中はうるさいので注意してね！
![スクリーンショット 2023-12-30 22.12.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627057/6a420192-e46f-4c3f-04ac-71f7cdfac79f.png)
![スクリーンショット 2023-12-30 22.13.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627057/5d149c30-920d-339d-5d64-3f55c8f85024.png)

:::note warn
変数i2は作る時に「このスプライトのみ」にする必要があります。
![スクリーンショット 2023-12-30 21.22.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627057/6883fea3-3e35-7c0f-8d59-951fca921b08.png)
:::
燃焼工学　1.燃焼の基礎　その１

# 1.燃焼の基礎
## 1.1.燃焼
燃焼は、以下２つの条件が満たされる、発熱と発光を伴う急激な酸化反応である。
- 発熱を伴うこと。
- 火炎が発生すること。 
金属が錆びることも酸化反応であり、多少の発熱を伴う場合もあるが（カイロなど）この場合は火炎を生じないため、燃焼とは呼ばない。

また、以下の３条件が満たされなければ燃焼は起こらない。
- 燃料
- 酸化剤
- 着火源

![ddr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514546/c0fabdd0-0b26-d525-13ce-2f115d9eb7c3.png)

## 1.2.火炎
バーナー火炎の図を示す。未燃ガスと既燃ガスの境界部で、活発な酸化反応＆発熱＆発光が確認される部分を『火炎』と呼ぶ。発熱や発光があっても、酸化反応が起こっていない場合は火炎とは呼ばない。

![dd2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514546/be7d646f-6b2e-1714-ffbd-6696a39c644e.png)

## 1.3.燃焼における酸化剤
酸化剤は気体・固体・液体のものが存在する。最も関わりのあるものは酸素を含む空気であるが、その他の酸化剤の種類を示す。
|  相分類  |  酸化剤　例  |
| ---- | ---- |
|  気体|  酸素、フッ素、塩素、空気  |
|  液体|  液体酸素、硝酸　|
|  固体|  硝酸カリウム、塩化カリウム |

また、同じ燃焼反応において用いる酸化剤により燃焼温度が異なる。例えば、酸化剤として空気を用いた場合と純粋な酸素を用いた場合では、純粋な酸素を用いた方が燃焼温度が高い。これは、空気に含まれる窒素が燃焼反応に関与せず、燃焼時に昇温する際、窒素は熱が奪って燃焼ガスと同じ温度になろうとすることで、燃焼温度が低下するためである。
燃焼時に発生する熱エネルギーはは、燃料の単位質量あたりの熱量としてされされ、発熱量と呼ばれる。この発熱量は、酸化剤と燃料の割合によって変化する。

## 1.4.燃焼温度
水素の燃焼反応を例に、燃焼温度を考える。水素と酸素の燃焼反応式は以下となる。

- $2H_{2}$+$O_{2}$ = $2H_{2}O$

2molの水素と1molの水素が供給された場合には、完全燃焼となり、すべてのガスが反応し、生成物は水のみとなる。
一方、水素過多の場合と酸素方の場合の反応式をそれぞれ示す。
- $3H_{2}$+$O_{2}$ = $2H_{2}O$+$H_{2}$　
- $2H_{2}$+$2O_{2}$ = $2H_{2}O$+$O_{2}$

この場合、未反応のガスが残存する形となる。前項で説明した通り、反応に関与しない物質が存在する場合、反応時に熱を奪って昇温することから、上記のいづれの場合も、完全燃焼と比較して燃焼温度が低下することとなる。燃料/酸素の比率に対する燃焼温度について模式図を以下に示す。

![afg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514546/f9f369b8-3b43-fffb-cd35-3e15161a3854.png)

## 1.5.空燃比・当量比
前項では、水素と酸素の比率によって燃焼温度が変わることを説明した。気体の燃焼を考える場合は、酸化剤として空気を対象とすることが多く、その際の空気と燃料の質量割合を空燃比と呼ぶ。

```math
AF = \frac{空気の質量}{燃料の質量}
```
燃料が完全燃焼できるための最小の空気量を理論空気量といい、その時の空燃比を理論混合比と呼ぶ。
また、理論混合比を基準として当量比φを定義する。
```math
φ = \frac{理論混合比}{実際の混合比}
```
```math
\begin{equation}
φ= \left \{
 \begin{array}{l}
 1　理論混合比 \\
< 1　燃料希薄 \\
> 1　燃料過多 \\
 \end{array}
 \right.
 \end{equation} 
 ```
当量比＝１となる理論混合比で混合された場合が、もっとも燃焼温度が高くなる。そこから燃料希薄・燃料過多に転じると燃焼温度は低下する。

## 1.6.断熱燃焼温度
燃焼する際に、熱損失がない(外部に熱が出ていかない）ときの燃焼ガスの最終温度を断熱燃焼温度と呼ぶ。特に、理論混合比で完全燃焼する反応を考える場合を理論断熱燃焼温度(理論断熱火炎温度)と呼ぶ。
実際には、完全燃焼は起こらず熱解離を伴う化学平衡状態で反応は停止する。この時の最終温度を平衡断熱燃焼温度と呼ぶ。
熱解離とは、高温状態において分子の運動が激しくなると、分子間の衝突によって原子分子が分解し安定する現象である。(H2Oは熱解離によってH2,O2,OHなどの２原子分子になって安定する）熱解離が起こる場合は、エネルギーを吸収して安定化するために理論断熱燃焼温度よりも低下することとなる。平衡断熱燃焼温度は、燃焼時の素反応を含む化学平衡計算を行うことで求められる。
2024 Tips for Success as a Freelance Photographer


Introduction
![pexels-anurag-raj-9901970.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665339/b2fdfb87-64b3-2eb2-1154-fe38403674a0.jpeg)

Becoming a freelance photographer can be an exciting and rewarding career choice. It allows you to pursue your passion for photography while having the freedom to work on your own terms. However, succeeding as a freelance photographer requires more than just technical skills behind the camera. In this blog post, we will explore some essential tips to help you thrive in the competitive world of freelance photography.

Freelance-Photographer
1. Define Your Niche

One of the first steps to success as a freelance photographer is to define your niche. Consider the types of photography you enjoy and excel at. Are you drawn to landscapes, portraits, events, or something else? By specializing in a particular area, you can position yourself as an expert and attract clients who are seeking your specific skills.

2. Build an Impressive Portfolio Freelance Photographer
Your portfolio is your calling card as a freelance photographer. It showcases your best work and gives potential clients a glimpse into your style and capabilities. Take the time to curate a collection of your strongest images that align with your chosen niche. Update your portfolio regularly to reflect your growth and new projects.

3. Develop a Strong Online Presence
In today’s digital age, having a strong online presence is crucial for any freelance photographer. Create a professional website to showcase your portfolio, share your contact information, and provide information about your services. Additionally, consider utilizing social media platforms such as Instagram, Facebook, and LinkedIn to connect with potential clients and showcase your work to a wider audience.

4. Network and Collaborate
Networking is essential in the freelance photography industry. Attend industry events, join photography groups or associations, and connect with other photographers and professionals in related fields. Collaborating with other creatives can lead to new opportunities, referrals, and valuable insights. Build, 
Read More : https://colorflydubai.ae/
kintoneポータル更新をノーコードで自動化してみた

#### はじめに
本投稿は、2023年12月開催[「UiPath (produced with UiPath Friends) Advent Calendar 2023」](https://qiita.com/advent-calendar/2023/uipath)追加ブログです。

#### 自動化しようと思った背景
「会社ブログ更新をkintoneポータルに反映する」という業務があります。
特徴として「いつ更新されるかわからない」ので毎出勤日に”必ず”確認してます。なんなら、休みになる日は事前に「明日休むのでご対応いただけますか？（超低姿勢）」ということをしてます。
今回その自動化試作品として「kintone開発環境のポータルに私のQiita最新ブログ更新する」を作成しました。

#### 手作業での手順
1.Qiitaの私のトップページへ移動　https://qiita.com/kintoneTH
2.更新されていたら、最新記事に移動　※未更新の場合はTeamsで部内報告
3.そこの「URL」「タイトル」「投稿日」をコピー　※投稿日は記憶してもOK
4.kintoneポータルへ移動して更新する

#### UiPathで自動化
こちらが、今回のRPAの全貌です。上部の閉じているところはインポート時にログインが必要なのでその操作を自動化しています。
![kintoneポータル更新RPA.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622597/52ee7ec1-1639-943d-7ba9-5d1915e0225c.jpeg)

#### 今後の進化に向けて
今回は、更新されてようがされてまいが、「kintoneポータルに掲載されている記事を最新状態にする」造りにしてます。できれば、更新されてるかの分岐をした方がいいかもしれませんが、動きとして1分かからないのでそれでいいかもしれません。
できることなら、Teamsでの報告までセットにしたいので、どっちにしろ分岐は必要になりますね。

#### 最後に
これ手作業で2年くらいやってます。単純作業で1分前後ですが、誰もやりたがりません。私が辞めたらいったいどうなるのでしょうか？きっとkintoneポータルの更新が凍結します。じゃあ「やらなければいい」という選択肢もありますが、せっかくkintoneが根差した中で会社のブログ更新の告知を軽視するのは会社方針の浸透を軽んじるというのが私の考えです。
話を戻して、「悶々とするくらいなら自動化してしまえ」、と考えることにしました。
決して、アドベントカレンダー企画参加によるカレンダーが欲しいから、というだけではありません。
Docker  とは？（概要）

仕事で`Docker`を久しぶりに使うことになったので、確認のために書いておこうと思います。

## Docker とは？
「コンテナ化プラットフォーム」...らしいです。
まあ、「コンテナ化プラットフォーム」と言われても、よくわからないので、もっと別の書き方をすると...

対比される例としては、`VM Ware`があると思います。
`VM Ware`は仮想OS を立てるためのアプリなのですが、`VM Ware`のアプリケーション内で Webアプリを実行しようとすると、仮想OS を立てて、その中で Webサーバーを立て、webアプリを実行する、という構図になると思います。
`Docker`で Webアプリを実行する場合は、Webアプリを`dockerイメージ`に変換して、`dockerイメージ`を実行すると、コンテナが作成され、Webアプリが実行されます。
対比関係で言うと、`Docker`=`VM Ware`、`コンテナ`≒`仮想OS`
<img alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/b1337728-3ad9-851f-4257-db43776d5e0d.png"/>

## docker-compose について
以前、`GROWI`という、Wiki みたいなサイトの起動のために`docker-compose`を使用したことがあり、純粋な`Docker`と何が違うのか、と疑問に思っていたのですが、
`docker-compose`は「複数のコンテナを定義し実行する Docker アプリケーションのためのツール」とのことです。。。
つまり、`Docker`を操作するためのツール、ということかと思います。
`Docker`と`docker-compose`の違いとしてで言えば、`docker-compose`は`Docker`の補助機能がある、みたいに考えれば良いかと思います。

因みに、`docker-compose`にした方が良いとされるケースですが、コンテナをまとめて起動できたり、追加ソフトのインストールが簡単だったり...とかはあるみたいですが、特別、`docker-compose`を使いたい！みたいな理由がなければ、純粋な`Docker`の使用で十分かなと思います。
jq を用いて Chrome のブックマークを CSV に変換するスクリプト


以下のスクリプトを実行すると Chrome のブックマークを `"path","name","url"` 形式の CSV として出力できます。フォルダがネストしている場合は `"path"` に `folder1 > folder2 > ... > folderN` 形式の値が入ります。

```bash:chrome-bookmarks.sh
# Chrome のブックマークが保存されているファイルのパス.
# 以下は Mac の場合のパスなので環境に合わせて変更してください.
declare -r bookmarks_file_path="${HOME}/Library/Application Support/Google/Chrome/Default/Bookmarks"

jq -r '
    .roots.bookmark_bar.children[]
        | {path: [], node: .}
        | recurse(.
            | select(.node.type == "folder")
            | {path: [.path[], .node.name], node: .node.children[]})
        | select(.node.type == "url")
        | [(.path | join(" > ")), .node.name, .node.url]
        | @csv
' "${bookmarks_file_path}"
```

ポイントは以下の部分です。

```
        ...
        | {path: [], node: .}
        | recurse(.
            | select(.node.type == "folder")
            | {path: [.path[], .node.name], node: .node.children[]})
        ...
```

[recurse](https://jqlang.github.io/jq/manual/#recurse) は再帰的に探索するための関数です。これを用いると、ツリー構造の中から特定の構造にマッチする部分を処理することができます。

recurse を用いてブックマークにおけるフォルダツリーを再帰的に探索し、`path: []` にネストしたフォルダの名前を集めます。結果として `{path: ["folder 1", "folder 2", ..., "folder N"], node: ...}` 形式のオブジェクトが生成されます。

次に、最終結果からフォルダを除外するために `select(.node.type == "url")` で絞り込んでいます。

```
        | select(.node.type == "url")
```

以下の部分では CSV の行データとなる配列を生成しています。CSV に含めるカラムを変更したい場合は、ここを修正します。

```
        | [(.path | join(" > ")), .node.name, .node.url]
```

最後に以下の部分で CSV データに変換しています。

```
        | @csv
```
CDN業者にやられた話

# A社の営業

某Webサービスを運用していた時の話。
そのサービスでは広告が主な収入源で、そのためSEOはめちゃめちゃ重要で、SEOの順位と売り上げが比例するような感じでした。
なので、SEOコンサルにずっとアドバイスをしてもらっている状態でした。

そんな時、世界的に有名なCDN業者から営業を受けました。ここでは仮に **A社** としましょう。
A社が言うには「パフォーマンス改善で御社の売り上げを倍増される自信があります！」とのこと。
確かにサイトの表示スピードはSEOにもめちゃめちゃ重要ですし、SEO関係なくても、サイトスピードと顧客の購買意欲は比例するとよく言われています。

そうは言っても **かなり高額な利用料を** 提示されたので、簡単には契約は決断できません。
一旦2週間だけ無償でトライアルさせてもらうことになりました。

# トライアルするも

トライアルするも、正直体感的にも早くなった感じはなく、アクセス数や売上などの数値をみても特に変わりはありません。

というのも。CDNあるあるですが、そもそもCDNでキャッシュできる要素があまり多くありませんでした。
データのリアルタイム性も大事なサービスだったのでメインの機能のページはキャッシュできず、キャッシュできたのは画像やCSS、JSなどの静的リソースや、静的なLPなどで、正直そこが早くなってもそんなに改善しない予感はしていました。

ということで大金払う価値はなさそうと言う判断で、トライアルで終わり契約には至りませんでした。

# 事件勃発

それから数ヶ月後のある日、サーチコンソールに **「コピーサイトの疑いがあります」** 的な警告が出てきました（正確な文言忘れました）。

類似のサイトのURLも載っていたので開いてみると、全然知らないドメインで動いているうちのサービスでした。
**「え、なんでこんな完璧にうちのサイトコピーされてるの！？」** とメンバー一同驚き、ドメインの所有者を見てみるとなんと **A社** 。
そうそれは、**うちのサービスをオリジンサーバとした、A社のCDNを通したページ** だったのです。
ホスト名は適当な名前だったので、恐らくトライアルしていた時にA社の人間が動作確認用に建てていて、そのまま放置されていたのでしょう。

A社に連絡し、そのサイトはすぐに止めてもらいましたが、時すでに遅し。
おそらくその影響で、SEOは暴落。上位を取れていた様々なキーワードも大きくランクダウンし、検索結果1ページ目に出ていたキーワードも1ページ目に出なくなってしまいました。
当然オーガニック流入は激減。売り上げの穴埋めのため、広告投資を増強する羽目になりました。
当然利益率も激減です。

その日から様々な修羅場を迎えるのですが、それはまた別の機会に。

# その後のA社

その後、私は転職し、そこではすでにA社と契約していたのですが、そこでも色々なことが起きA社への不信感は強まりました。

- 年に1度1時間くらい異常にサイトスピードが遅くなる時がある。A社のCDNを通さないで直接アクセスすると問題ないことは確認済み。
  - A社に調査をお願いするも、「海外の一部のエッジサーバだけで問題が起きていたようです」と明らかな嘘情報を言われる。
  - こっちは日本でおかしくなっているのを確認しているって言ってんのに
- 約束の期限を守らない
  - 質問を投げたあと「３日以内に回答します」と自分で言っておいて、３日以内に回答が来たことはただの一度もない。

結局、そこでも解約することになり、2ヶ月前に解約通知したところ、あっさり解約の話が進みました。
一般的な企業なら引き留めのため新しいプランの提案とか営業がしてきそうなものなのに結構あっさりしてるんだなあ、と思っていたら、先方の営業から連絡が来たのが、 **契約終了1週間前** 。
いや、このタイミングでどんだけ良いプラン出されても社内手続き上もう間に合わねえよ、っていう。

# 所感

ということで、儲かっているのをいいことに色んなところであぐらをかいて、サービスの品質を落としてるんじゃないの、と個人的に思った話でした。
全然関係ない話ですが、北海道の赤飯には甘納豆が使われていることが多いです。
限界処置効果(MTE: Marginal Treatment Effect)って何だっけ？

# はじめに
限界処置効果(MTE: Marginal Treatment Effect)に関するメモ書きです。内容に誤りがありましたら、ご指摘いただけますと幸いです。

# MTEとは
MTEとはMarginal Treatment Effectの略で、観察可能・観察不可能な要因で条件づけた介入効果を表します。数式で表現すると次のように定義されます。

$$
MTE(x, u_D) \stackrel{\mathrm{def}}{=} E[Y_1-Y_0|X=x, U_D=u_D] \tag{1}
$$

ここで、$Y_1$は介入がある場合のポテンシャルアウトカム、$Y_0$は介入がない場合のポテンシャルアウトカムを表します。また、$X$は観察可能な変数を、$U_D$は観測不可能な変数を表し、$U_D$はその値が小さい個体ほど介入を選ぶ確率(傾向スコア)が高い個体であることを表します。

介入群で嫌ならば介入を受けず、対照群で望めば介入を受けるという選択が許された両側非承諾型実験データを用いて推定することが可能で、効果の異質性(Heterogeneity)を検証することができます。

:::note warn
MTEは「介入を受けることと受けないこととが無差別である個体の介入効果」とも解釈されます。また、政策評価の文脈ではしばしば政策関連介入効果(PRTE: Policy Relevant Treatment Effects)などとも呼ばれます。
:::


## MTEのメリット
MTEを推定するメリットは以下の3つが挙げられます。
1.  効果の異質性(Heterogeneity)を検証することができる
1.  観察不可能な要因による介入効果の異質性を検証することができる
1.  さまざまな介入効果のパラメータをMTEの荷重和として求めることができる(e.g: ATE = $\int_{0}^{1}MTE(x, u_D)du_D$)

# MTEの概要
観察されるアウトカムを$Y$、ある介入の有無を$D$(介入を受けると$D=1$、介入を受けないと$D=0$)とします。すると、アウトカムは次のように表すことができます。
$$
Y = DY_1 + (1-D)Y_0 \tag{2}
$$

ここで、$Y_1$は介入がある場合のポテンシャルアウトカム、$Y_0$は介入がない場合のポテンシャルアウトカムを表します。これらは下記の通りに決定されるとします。
$$
Y_i = \mu_i(X, U_j), \ j \in 0, 1 \tag{3}
$$

ただし、$\mu_j$は任意の関数であり、$X$は観察可能な変数、$U_j$は観察不可能な変数を表します。MTEの分析の枠組みでは、次のように個体が介入を受けるかどうかを決定します。
$$
D=I(D^* \geq 0), \ D^* = \mu_D(Z) - U_D \tag{4}
$$

ここで$I(\cdot)$は指示関数、$\mu_D$は任意の関数を表します。$Z$は$X$と$X$に含まれない除外変数を含む観察可能な変数を表します。$U_D$は観察不可能な連続変数であり、[0, 1]に一様分布するように基準化されたものです。ここで、$(U_1, U_D)$と$(U_0, U_D)$は$X$で条件づけたとき、$Z$と独立であることを仮定すると、MTEは(1)式のように定義されます。

:::note warn
（再掲）MTEの定義(1)式
$$
MTE(x, u_D) \stackrel{\mathrm{def}}{=} E[Y_1-Y_0|X=x, U_D=u_D] \tag{1}
$$
:::

## MTEの推定方法
MTEを推定する方法には局所操作変数法(LIV: Local Instrumental Variables)と呼ばれる方法があります。具体的には$E[Y|P(Z)=p|X=x]$を傾向スコア$P(Z)=p$で偏微分することでノンパラメトリックにMTEを推定することができます。
$$
\frac{\partial E[Y|P(Z)=p, X=x]}{\partial p} = \textrm{MTE}(x,p)
$$

ただし、この際、$P(Z)$が限られた値しかとらない、すなわち、操作変数がニ値変数であるようなケースではMTEを識別することができません。操作変数が離散的である場合でも、Brinch, Mogstad, and Wiswall(2017)で紹介されているアプローチを用いることで線形MTEを識別することが可能になります。

# おわりに
最後まで読んでいただきありがとうございました。

zennにて「Python×データ分析」をメインテーマに記事を執筆しているので、ご一読いただけますと幸いです。

https://zenn.dev/s1ok69oo 

また、過去にLTや勉強会で発表した資料が下記リンクにてまとめてありますので、こちらもぜひご一読くださいませ。

https://speakerdeck.com/s1ok69oo

# 参考文献
- 依田(2023): データサイエンスの経済学
- Brinch, Mogstad, and Wiswall(2017): Beyond LATE with a Discrete Instrument
社内技術コミュニティに必要な６要素

## はじめに
こんにちは。
今年の大河ドラマで阿茶局を推していた男です。

https://qiita.com/n2Mj7Lg3cxNcFtJ/items/0c29d086d9c94edd048c


上記の記事、まったく覚えていないのですが、投稿者が私になっているので、私が書いたんだと思います。たぶん。

早いもので、これを投稿してから１年が経過しました。
私が主催する社内コミュニティの参加者数も大幅に増え（アクティブユーザ 数千人）、その活動を参考にした社内の有志コミュニティやパートナー企業様のコミュニティも増えました。

記事の中で
「社内技術コミュニティを構築して盛り上げる方法を言語化したい」
と宣言して１年経過・・・（笑）。

某社様より「コミュニティの盛り上げについて話を聞きたい」と相談もあったため、そろそろ言語化しておこうかと。

:::note info
私の主催する社内コミュニティは主に Microsoft Teams を利用し、Power Platform と市民開発によるデジタル人材の底上げのための活動をしています。
以下、その前提でお読みいただきたく。
:::

## 社内技術コミュニティに必要な６要素
コミュニティを盛り上げるために必要なのは、以下の要素だと私は思います。

1. 多様性がある
1. ビジョンを共有している
1. 自主性がある
1. 内的動機づけがある
1. チャレンジしやすい
1. つながりやすい・共同作業しやすい

:::note info
これ、及川卓也さん（「ソフトウェア・ファースト」著者）がイノベーションを生みやすい組織の６要素として講演で語っていた内容をマネています。
ただ、ググっても一次情報が見当たりませんでした。
もしも、内容が間違ってたらゴメンナサイ。また、ちょっと言葉を変えてあります（「リスクテイク」→「チャレンジ」、「コラボ」→「共同作業」）。
:::

以下、それぞれ説明していきます。もし参考になるところがあれば活用してください。

### 1. 多様性があるコミュニティ
参加者に多様性があるコミュニティは、多様な情報が集まりやすくなります。
情報が集まるところには、それを求めて人が集まってきます。
多くの人が集まると自然と多様性が増し、さらに情報が集まり、人が集まり・・・という好循環が生まれます。

### 2. ビジョンを共有しているコミュニティ
参加者が同じ方向に進むと、強い推進力の活動になります。
そのためには、参加者が共感できるビジョン（構想や展望）が必要です。
このビジョンにより、多様性のある人たちをバラバラにせず、まとめることができます。
また、ビジョンを公開しておくと、それに共感する人たちが集まりやすくなります。

### 3. 自主性があるコミュニティ
コミュニティ主催者だけでは、活動の規模を大きくすることは難しいです。
自主的に協力してくれる参加者が多ければ多いほど、コミュニティは盛り上がります。
そのためには、協力しやすい雰囲気づくりや、参加者を含む関係者全員が互いに尊敬と感謝をしあう事が重要です。

### 4. 内的動機づけがあるコミュニティ
参加者がコミュニティに協力したくなる内的動機（面白さ、楽しさ、幸福感など）があると、活動の永続的な原動力になります。
外的動機（指示や命令、危機感、義務感、正義感など）による活動は他責になりがちで長続きしません。

### 5. チャレンジしやすいコミュニティ
新しいチャレンジは、失敗するリスクを伴います。
失敗を許容する雰囲気があると、チャレンジをしやすく、斬新なアイディアが集まりやすくなり、大きな成果につながる可能性があります。
もし失敗しても、その情報を共有して活かすことができます。

### 6. つながりやすい・共同作業しやすいコミュニティ
規模が大きい組織では、部署・職層・職種をまたぐ情報共有が難しいケースがあります。
それを超越して情報や意見をやり取りできるコミュニティは盛り上がります。
また、面識のない人材との共同作業をすることで、新たな価値を産み出すこともあります。

## ビジョン設定の重要性
私が最も重要かつ難しいと思う要素は「2.ビジョンを共有している」です。
ビジョンはコミュニティの中核であり、その中核の強さがコミュニティの訴求力の強さになります。
ですから、時間をかけて深く思考して設定すべきだと考えます。

以下、私が考えるビジョンを設定するコツです。
- ビジョンには自分の想いを入れる。熱量が高いほど、人に伝わりやすい。
- ビジョンは言語化し、文章で定義する。
    - 言語化のために深い思考が必要があり、その思考がビジョンの定義を強固にする。
    - 「模式図」や「キャッチフレーズ」は補助的な利用に留める（見る人により認識が異なりやすいので）。
- ビジョンを、社訓や社是、上位方針などに結びつく内容にしておくと、組織内の理解を得やすくなる。
- ビジョンを公開しておくと、他人から弱点や問題の指摘を受けやすくなる。
指摘された箇所を改善することでビジョンの訴求力を強化できる。

## コミュニティ主催者の役割
コミュニティの立ち上げから現在まで、様々な活動をしてきました。

- 既存の情報展開方法を活用して告知や勧誘を継続的に実施（イントラWeb、各部署の会合、各部署のTeams、社内の有志活動 など） 
- オンライン / オンサイトイベントを実施（隔月で何らかのイベントを開催）
- 簡潔かつ平易な内容でビジョンを文章化し、Web サイトで常時公開
- 様々な場所やタイミングで表現や言葉を変えてビジョンを説明（イベント登壇でのスピーチ、社内SNS、Teamsでの雑談など）
- 技術的な質問を受け付けるチャネルを作成（参加者が相互支援する状態）
- 自作アプリを公開するチャネルを作成（参加者が自主的に公開）
- コミュニティのステッカー作成し配布
- 心理的安全性を確保するため、あいさつ専用のチャネルを作り、日々あいさつを投稿。
- 新規参加者の自己紹介投稿に、必ず返信やリアクションをして歓迎。
- コミュニティへの貢献に応じ、デジタルバッジを配布

・・・など。

計画に時間をかけず、思いついたものをとりあえずやってみて、成功したものを継続・拡大してきました。
成功した活動は、いずれも上記の６要素に繋がっていると感じます。

簡単にまとめると、コミュニティ主催者は以下の役割を担うと良いと思います。
### コミュニティ主催者の役割
1. 人と情報を集め、多様性を生む好循環をつくる
1. 多様な人たちを、自分が考えるビジョンでまとめる
1. 全員が尊敬と感謝をしあえる雰囲気づくりをする
1. 活動自体が楽しく感じてもらえるようにする
1. 失敗を許容して、チャレンジをうながす
1. 異なる組織をつなぐ支援や共通の課題解決に協力する


## さいごに
以上で今年の仕事納めにしようと思います。
なんやかんやで１年経つのホントに早かった。
2024年も、あっという間に終わるんやろなぁ。

来年、初挑戦したい事は決まっているんで、退路を断つためにここで宣言しておきます。
実績報告をよろしくな ＞ 2024年12月のオレ。
- ハッカソンを主催する
- 夏コミで薄い本を売る
- 個人事業主として商売してみる

以上です。それでは、良いお年を。
非情報系院生が９ヶ月間"復習特化"でAtCoder水色を達成した話

# 初めに

初めまして、塚っちゃん（Hiro_Gt）と申します。<br>
この度、AtCoderに取り組み始めて**９ヶ月で水色**を達成しました。私は非情報系院生ですが、復習に特化して競プロの勉強を進めていた為、比較的早い期間で水色を達成できたと考えています。<br>
そこで本色変記事では、**具体的にどう復習したかに重点を置いて**水色到達までを振り返ろうと思います。<br>
この記事がどなたかの参考になれば幸いです。

<!-- ここに色変した時のrateグラフ -->
![20231224_水色達成時_rateグラフ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661885/0e66bfea-9fa4-3ac0-e814-92e35b547b0d.png)


# 自己紹介

- 非情報系大学院
	- 具体的には物理学を専攻していました
- AtCoder開始時のプログラミング経験：半年
	- 卒業研究で物理実験のデータを解析する際にpythonを使用していた程度です。具体的にはfor, if文は分かっていて、ネットの記事を参照しながらmatplotlibで図を出力していた程度。
	- ネットで調べながらコーディングは出来るけど、何も見ずにコーディングは出来ないレベル

# 勉強方法

<!-- ここにAtCoder problemsの画像 -->
![20231223_水色達成時_problems.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661885/afc91b51-c37e-988a-40ff-f292879a006e.png)


冒頭にも軽く触れた通り、私は復習特化で水色に到達したと考えています。実際私が調べた限りでは、水色到達時の自分の過去問演習量は恐らく少ない方で、過去問を通した演習量には力を入れていないことが見てとれるかと思います。

ならどのような復習方法をとったのか。私は**自力ACした問題もAC出来なかった問題も共に復習を行なっていました**。具体的には以下の通りです。

## AC出来なかった問題の復習プロセス

1. 解説を読んだ上でACコードを実装する（解説AC）
	- 知らないアルゴリズム・データ構造が解説文中に登場したら、自分で勉強した後に自分でノートにまとめる
	- あくまでも文章だけ読んで解説ACする（他人のACコードは読まない）
		- 解法プロセスをプログラミングできちんと表現する力を養うためにこのような手法をとっています
1. 他人のACコードを読んで理解
	- 提出順が早い人のACコードを読む
		- 早くAC出来る人は、思考プロセス・コーディング記述共にシンプルなことが多いと感じています。そのため、実装方法に関して参考になることが多いです
	- コードリーディング中に知らない関数・ライブラリなどと出会ったら、勉強してノートにまとめる
	- 自分のACコードより簡潔なコーディング記述があったら、アイディアとしてノートにまとめて、その記述方法で改めてACしてみる
		- 面倒臭いですが、より簡潔な記述でACする練習をすることで、コンテスト本番中も回りくどくない単純なコーディングを行うことが出来ます
1. 自分で問題の解説をノートにまとめる
	- 特になぜAC出来なかったのか、どんな知識・発想が必要かを考えて、解答に至る思考プロセスをまとめる
		- 例えば、動的計画法の問題でなぜDPの定義を解説の通りにするのか考えてみます

## 自力AC出来た問題の復習プロセス

1. 解説を読んで、想定解法と同じやり方かチェック
	- 違っている場合、『AC出来なかった問題』として復習する
		- AtCoderの問題を通して学んで欲しいこと、が（確か）定まっているはずです。その為、出題意図と同じ解法でAC出来るようにしました
1. 他人のACコードを読んで理解（以下、AC出来なかった問題の復習と同じ）
	- 提出順が早い人のACコードを読む
	- コードリーディング中に知らない関数・ライブラリなどと出会ったら、勉強してノートにまとめる
	- 自分のACコードより簡潔なコーディング記述があったら、アイディアとしてノートにまとめて、その記述方法で改めてACしてみる

## ノートのまとめ方

上記の復習プロセスで度々『ノートにまとめる』と説明しましたが、ノートのまとめ方も自分なりに拘っていました。具体的には以下の通りです。

- 参考にした記事等を一切見ずに、自分の言葉で解説を書く
	- 何も見ずに自分の言葉で解説を書けるということは、きちんと自分が理解できている証拠になるからです
- 公式解説として書く気分で、他人に説明するように解説を書く
	- 他人に理解できる解説文ということは、曖昧ではなくきちんと筋道立てて解説できる位理解する必要があるからです

<!-- ここにノートにまとめた例の画像 -->
![20231230_ノートまとめ例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661885/fdacfbc2-f4ad-49d2-386f-ba6a9854e1db.png)


# 水色到達までに学習した主なアルゴリズム・データ構造

他にも学習したアルゴリズム・データ構造は存在しますが、複数回使用したことのある事項を以下に載せています。
- DP
- 期待値DP
- 累積和
- 確率mod
- 二分探索
- 尺取り法
- DFS・BFS
- 二部グラフ
- ダイクストラ法
- トポロジカルソート
- UnionFind

# 今後の抱負

- １ヶ月間ABC-unrated参加して、水〜青色の過去問演習をする
	- 水色達成したものの、まだ水色diffを安定してAC出来ない・青色diffが解けないことから、恐らく今の実力じゃ水色で停滞するかな…と感じています。その為１月の間はunrated参加して、水〜青色精進をし続けようと考えています。
	今後もしかしたら、過去問の青色diff問題の解説記事を上げる…かもしれないです。
- C++で灰色diffの過去問演習
	- 大学院の研究でC++を使用する機会が増えました。その為AtCoderを通してC++の勉強をしようかな…と考えています。
	AtCoderの問題を解くことを通して、プログラム言語そのものの勉強も出来ることは競プロの大きなメリットだと思っています。
- SIGNATE（データ分析・機械学習コンペ）に参加
	- 実は今データサイエンス領域に興味があるため、Kaggleのようなデータ分析コンペに挑戦しようと考えています。その為まずは日本のコンペサイトから手をつけてみようと思っています。

# 最後に

大学院での研究＆就職活動を両方しながら趣味で競プロに割ける時間は正直少なかったです。ですが時間が少ないからこそ、問題に対する演習は丁寧に行った結果、９ヶ月で水色を達成できたと思います。

ここまでお読み頂きありがとうございました。今後も競プロに励むように頑張ります！!
タッチイベント追加（JS）

```js
// HTML要素を取得
const target = document.querySelector('#target')

// タッチイベントを追加
target.addEventListener('touchstart', (event) => {
  // タッチが開始された時の処理（指が触れた時）
  console.log('開始', event)
})

target.addEventListener('touchmove', (event) => {
  // タッチが移動した時の処理（指を動かした時）
  console.log('移動', event)
})

target.addEventListener('touchend', (event) => {
  // タッチが終了した時の処理（指を離した時）
  console.log('終了', event)
})
```
ElectronでHello World!（index.htmlのspanタグ操作）

# はじめに
ElectronでHello World!してみました。[Quick-start](https://www.electronjs.org/ja/docs/latest/tutorial/quick-start)では、「Hello World!」はindex.htmlのHタグのリテラル文字列だったので、そのあたりだけちょいとアプリケーション的な感じに書き換えてみました。

# Electronとはとかインストールとか

すべて割愛します。Qiita上にたくさん親切に記述された記事がありますので、それらからなるべく新し目の情報を参照するとよいかと思います。

# 配置
```cmd
C:\electron>dir /B
index.html
main.js
node_modules
package-lock.json
package.json
preload.js
```

# index.html
Quick-start記載のindex.htmlを下記のように変更しました。
従来は\<h1>タグの中にリテラルで書かれていましたが、\<span>タグにしました。

```diff_html:index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">
-    <title>Hello World!</title>
+    <title>evalute electron</title>
  </head>
  <body>
-    <h1>Hello World!</h1>
+    <h1><span id="message"></h1>
    We are using Node.js <span id="node-version"></span>,
    Chromium <span id="chrome-version"></span>,
    and Electron <span id="electron-version"></span>.
  </body>
</html>
```

\<span>タグを動的に置換するのはtymeleafを連想しました。

# preload.js
Quick-start記載のpreload.jsを下記のように変更しました。
```diff_javascript:preload.js
// preload.js

window.addEventListener('DOMContentLoaded', () => {
  const replaceText = (selector, text) => {
    const element = document.getElementById(selector)
    if (element) element.innerText = text
  }

  for (const dependency of ['chrome', 'node', 'electron']) {
    replaceText(`${dependency}-version`, process.versions[dependency])
  }
+  replaceText(`message`, `Hello World!`)
})
```


# main.js
基本的にはロジック的なことはなにも修正していませんが、開発者ツールの展開が無効化されていましたので、コメントアウト解除しました。
```diff_javascript:main.js
const createWindow = () => {
  const mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      preload: path.join(__dirname, 'preload.js')
    }
  })

  mainWindow.loadFile('index.html')
-  // mainWindow.webContents.openDevTools()
+  mainWindow.webContents.openDevTools()
}
```

 # 実行結果
 それでは実行してみます。
 
```cmd
C:\electron>C:\electron\node_modules\.bin\electron .
```
環境変数がセットアップされていませんので、フルパスで指定しています。

![electron.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118036/9dde46f8-4fdd-e66d-7834-f3ff1a8b8f5b.jpeg)

開発者ツールも同時に展開しました。\<span id="message">タグに「Hello World!」が無事に挿入されました。

# おわりに
Electronなかなか楽しいです。
railsのroutes.rbとは

# はじめに
最近railsを勉強し始めて、routes.rbの書き方を自分に中で復習したかったので、ここでまとめてみます
## routes.rbとは
railsのroutes.rbとは、ブラウザから届いたリクエストに対して、コントローラーで定義したアクションを結びつけるための書くファイルのこと



具体的なコードを書いてみると以下のような感じ
```routes.rb
Rails.application.routes.draw do
  root   "static_pages#home"
  get    "/help",    to: "static_pages#help"
  post   "/login",   to: "sessions#create"
  delete "/logout",  to: "sessions#destroy"
end
```
root,get,post,deleteなど色々書いてありますが、詳しく中を確認していきます
### rootとは(コード：1行目)　
```rb
  root   "static_pages#home"
```
誰かがルートURL（"/"）にアクセスすると、StaticPagesControllerのhomeアクションが呼び出され、そして、views/staticpages内のhome.html.erbの中身が表示されます。
つまり、サーバーを起動して、最初に表示したいページをrootに設定しておけば良いということだと思います。

### getとは(コード：2行目)
```rb
  get    "/help",    to: "static_pages#help"
```
"static_pages/help"(="/help")にアクセスしたときに、StaticPagesControllerのhelpアクションが呼び出され、views/staticpages内のhelp.html.erbの中身が表示されます。

### postとは(コード：3行目)
```rb
  post   "/login",   to: "sessions#create"
```
"sessions/create"(="/login")にアクセスしたときに、SessionsControllerのcreateアクションが呼び出されます。これは、ユーザーなどの新しいデータを生成する際に使用します。

### deleteとは(コード：4行目)
```rb
  delete "/logout",  to: "sessions#destroy"
```
"sessions/destroy"(="/logout")にアクセスしたときに、SessionsControllerのdestroyアクションが呼び出されます。これは、ユーザーなどのデータを削除する際に使用します。
M5Stack用ディスプレイモジュールの表示切替方法

# 背景
IoT機器からHDMIディスプレイに表示したい。
そんな願望をかなえるツールを買っていたが肥やしになっていた。
HDMIだから電子ペーパーディスプレイとか使うといいんだけど
手元にはないので普通のディスプレイ表示にチャレンジした。

# 使用したもの
・M5STACK-K001-V27

https://www.switch-science.com/products/9010

・M5STACK-M126

https://www.switch-science.com/products/8779

# 切替方法

拡張ディスプレイに変更する方法

    M5.setPrimaryDisplayType(m5gfx::board_M5ModuleDisplay);


M5Stack側のディスプレイに戻す方法

    M5.setPrimaryDisplayType(M5.getBoard());


# 解説
拡張ディスプレイに表示する方法はサンプルが存在する。

https://github.com/m5stack/M5Module-Display-13.2


ただ、このサンプルはプライマリディスプレイをHDMI側に切り替えて
そのあと元のディスプレイ側の表示を変更したい場合、
どうすればいいのか提示はされていない。

切り替えはsetPrimaryDisplayTypeにボードタイプを指定することで可能。
実際の値は以下。個別で指定したい場合は参照。

https://github.com/m5stack/M5GFX/blob/master/src/lgfx/boards.hpp

今回はとりあえず元のM5Stackに戻すだけなのでM5.getBoard()とした。
denoでexifの確認

```
import ExifReader, {Tags} from "npm:exifreader";

function checkExif(source: string) {
  ExifReader.load(source, { expanded: true })
    .then((tags: Tags) => {
      const exif = tags["exif"];
      if (exif) {
        console.log({ exif });
      } else {
        console.log("exif が見つからない");
      }
    })
    .catch((e) => {
      console.log(source);
      console.log(e);
    });
}

checkExif("/path/to/image.JPG");
```
企業で使うために、VSCodeの拡張機能「Codeium」のデータの取り扱いを調べてみる

# 目的
VSCodeの拡張機能の「Codeium」がとても便利だった。ChatGPTのようにプロンプトからコードを生成したり、コードのリファクタリング、コードを元にした回答、ドクストリングの生成がVSCode上で行える。
特にオートコンプリートは、ChatGPTでできない機能であり、かなり便利(1行目を入力すると関数の中身が提案された)↓。
![スクリーンショット 2023-12-30 22.50.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475723/488283fa-03b6-f043-3090-46ddf80bfa01.png)

企業で使う場合は入力したデータの取り扱いが重要なので、関係箇所を調べてみた。

# 情報管理に関わる項目
[privay policy](https://codeium.com/privacy-policy)
[FAQs](https://codeium.com/faq)
[Terms of Service: Individual](https://codeium.com/terms-of-service-individual)

# 要点
- 開発元は、[Exafunction](https://exafunction.com/)
- サーバーは米国にある。
- オートコンプリート機能では、生成モデルのためにデータが使われることはない。ただし、識別器(提案されるコードのスコア化やランク付け)に使用されることがある。オプトアウトの申請は、メールまたはユーザー設定で変更可能。オプトアウトした場合でも、一旦コンテンツはExafunction社のサーバーに送信される。
- チャット機能は、生成モデルと識別器の両方の学習にデータが使用されることがある。また、オプトアウトの設定にした場合は、チャット機能が使えない。
- 有料版(teams)だと、Zero-day retentionと記載があり、データが保持されない模様。また、Enterprise版だとセルフホストも可能で、この場合は開発元もデータにアクセスできない高度なセキュリティ設定が実現できる。

# Price
セキュリティの観点を除けば、Individualも十分な機能を持っている。
![スクリーンショット 2023-12-30 22.34.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475723/9cdea61f-64c9-332f-baff-cb07acaf20f3.png)

# 所感
- 無料版で機能を有効に使おうとすると、入力したデータは使われる。特にChat機能はWebUIのChatGPTに入力するのと同様の扱いに読める。個人使用には良いが、企業での機密情報の入力用途には適していないように見える。逆にChatGPTを使っている人は、同様の取り扱いで使えば良いと思う。
- 企業で使う場合には、TeamsかEnterprise版が推奨される。価格の記載はないものの、オンプレやクラウド上でのセルフホストによりGithub Copilotより安全な環境が構築できるのはメリット。
- With Codebase(コードを参照して回答する機能)については、説明がないが、恐らくRAG(Retrieval Augmented Generation)でおこなっていると考える。その場合、検索で引っかかったコードの一部がプロンプトとして送信されるため、コードが学習に使われる可能性があるのでは、と思う。
- オートコンプリート機能凄いと思った。。。Github Copilotかどちらかは導入したい。
【Java】Base64にエンコード/デコードする

# はじめに

業務で担当していたPowerShellのコードに「文字列をBase64に変換している処理」があったので、JavaでBase64にエンコードする方法と、Base64からデコードする方法を調べてみました。

# コード

## 基本的な変換処理

* Base64にエンコード/デコードするためのクラスは、`Base64.Encoder`と`Base64.Decoder`に分かれていました。
  * これらのクラスは、いずれもJava8で実装されたそうです。
* APIのページを見る限り、`Base64.Encoder`と`Base64.Decoder`のコンストラクタを直接呼び出すことはできません。
  * そのため、`Base64`クラスから`getEncoder()`メソッドと`getDecorder()`メソッドを呼び出してこれらのクラスのインスタンスを作ります。
* 単にエンコードするだけであれば`encode()`を使いますが、ここでは結果を文字列として受け取りたかったので`	encodeToString()`を使っています。

```java:Base64Sample
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class Base64Sample {

	public static void main(String[] args) {

		String txt = "nkojimaです";
		System.out.println("オリジナルの文字列：" + txt);

		// エンコード
		Base64.Encoder encoder = Base64.getEncoder();
		String encoded = encoder.encodeToString(txt.getBytes(StandardCharsets.UTF_8));
		System.out.println("エンコードした文字列：" + encoded);

		// デコード
		Base64.Decoder decoder = Base64.getDecoder();
		String decoded = new String(decoder.decode(encoded.getBytes(StandardCharsets.UTF_8)));
		System.out.println("デコードした文字列：" + decoded);
	}
}
```

```text:実行結果
オリジナルの文字列：nkojimaです
エンコードした文字列：bmtvamltYeOBp+OBmQ==
デコードした文字列：nkojimaです
```

## URLやファイル名をエンコード/デコードする場合

* URLやファイル名をBase64エンコード/デコードする時は、`Base64.getUrlEncoder()`および`Base64.getUrlDecoder()`を利用します。

# 補足：スレッドセーフについて

* `Base64.Encoder`クラスと`Base64.Decoder`クラスのAPIのページを見ると、これらのインスタンスはともに「複数のスレッドで並行して使用できます」と書かれていました。

# 参考URL

* [Base64 (Java Platform SE 8 ) - Oracle Help Center](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Base64.html)
* [Base64.Encoder (Java Platform SE 8 ) - Oracle Help Center](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Base64.Encoder.html)
* [Base64.Decoder (Java Platform SE 8 ) - Oracle Help Center](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Base64.Decoder.html)
* [Java Base64のエンコードとデコードのサンプル - ITSakura](https://itsakura.com/java-base64)
【初心者】React アプリの作成方法

仕事で、`TypeScript`と`React`を使用するプロジェクトに携わる予定なので、それの予習用です。

## コマンド実行
#### プロジェクト作成用コマンド（JavaScript用）
```
npx create-react-app 「アプリ名」
```
※事前にNode.js のインストールが必要
※「ユーザー\AppData\Roaming\npm」のディレクトリが無いみたいなエラーが出ますが、「npm」フォルダを作成すれば解消される場合があります。

#### プロジェクト作成用コマンド（TypeScript用）
`--template typescript`オプションを引数に追加することで、`TypeScript`用としてプロジェクトを作成することができます。

```
npx create-react-app --template typescript 「アプリ名」
```

#### アプリの開始用コマンド（Node アプリの共通コマンド）

```
npm start
```

一応これで、サンプルページが表示できます！

## 「npm start」できない...
新規に環境構築したパソコンで、作成済のプロジェクトで`npm start`を実行しても、以下のエラーが発生してアプリが起動できない場合があります。

```
'react-scripts' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```

この場合は以下のコマンドで、エラーが解消できます。
バージョン指定が必要であれば、バージョン`x.x.x`を`npm install react-scripts@x.x.x --save`で指定する。
（エラーが残る場合は、`npm audit fix --force`を実行する。）
```
npm install react-scripts --save
```
超ざっくり！AWSコストの基礎 ~クリスマスにAWSリソースを買ってもらった君へ~

早いもので気づいたらもう年の瀬ですね。
クリスマスにAWSリソースを買ってもらって、冬休みにうきうきでいじっている人も多いかと思います。

そんなAWSデビューを果たした君たちに、AWSにかかるお金について知ってもらえたらなと思います。
(先日社内でLTしたときの内容となります。)

# AWSコストの基礎
実はAWSも使っていくとお金がかかるんです。
水道や電気、タクシーや焼肉と一緒ですね。
こういう使えば使うほどお金がかかる仕組みのことを、「従量課金制」といいます。
明日学校でみんなに自慢しちゃおう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1045261/399fce87-ba6a-31b3-df27-74cd75a95163.png)

# AWSを使いすぎると恐ろしいことになる
クリスマスに買ってもらったRDSやEC2、楽しくてついつい使い過ぎてしまうと思います。
しかし、何も考えずに使い続けると水道水の流しっぱなしや電気のつけっぱなし、焼肉屋さんで単品でカルビを頼みまくるのと同じ状態になってしまいます。
お母さんやお父さんに怒られちゃいますね、ああ何ということでしょう。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1045261/7ffa1b7e-c8f7-6da6-d537-d21181ccc32e.png)

# AWSを使いすぎて怒られないためには
使う必要がないときは、きちんとRDSを停止させましょう。
例えば、寝ている間はDBへアクセスして作業をしなくても良い場合などは、きちんとリソースを停止させることが大事です。
でも、どうしても必要な場合もあるかと思います。
例えば、お腹が空いているときは焼き肉を食べないと死んでしまいますよね。でも節約はしたい。。。どうしたらいいのでしょうか？

# どうしたらいいのか。。。
勘のいいみなさんならもうお気づきかもしれませんね。
そう、**焼肉食べ放題に行けばいい**のです！

# 焼肉食べ放題システムのおさらい
焼肉食べ放題にまだ行ったことがない君や、最近行ってなくて忘れてしまった人のために焼肉食べ放題のおさらいをしましょう。

https://www.gyukaku.ne.jp/menu/tannnou-course.php

焼肉食べ放題というのは、決められた時間内に決められたメニューに書かれたお肉や野菜を好きなだけ食べれるプランのことです。90分100品食べ放題プランなら、90分間は100種類のメニューから選び放題・食べ放題ということです。

もしカルビを100枚食べたかったとして、単品で購入すると1枚100円だったとしても1万円かかります。しかし、食べ放題プランなら、5000円くらいで100枚食べることができます！

詳しいことは牛角の食べ放題プランを参考にしてもらえたらと思います。

実はAWSにも焼肉食べ放題プランのようなものが存在し、RI/SPという名前がついています。
(RI=Reserved Instance, SP=Savings Plans)
RI/SPの場合は90分ではなく、1年間あるいは3年間食べ放題プランとなります。
焼肉の単品購入のような形式はAWSではオンデマンドと呼ばれています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1045261/e64b6470-d9f8-ea1c-9c8e-c6e50d5042b4.png)

# AWSコストを焼肉食べ放題に置き換えると...
私が働いている会社のAWSリソースで最も人気なのは、RDSです。2番目がEC2その他です。

LINEリサーチによる調査では、焼肉の好きな部位ランキング1位は牛タン、2位は牛カルビとのことです。つまり、牛タン=RDS、牛カルビ=EC2その他、ということです。

焼肉の人気メニューである牛タンも牛カルビも当然焼き肉食べ放題プランのメニューに入っているので、食べ放題プランを選択すれば90分食べ放題となります！
AWSのRI/SPにももちろんRDSとEC2その他がメニューに入っています。RI/SPプランを選べば、君もRDSやEC2その他が使い放題ということですね！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1045261/432e647a-bd21-1e0e-789b-96a2b59243dc.png)

# 焼肉食べ放題プランはどこから見れる？
RIのメニューはCosrExplorerの左サイドバーの、予約>推奨事項 から確認できます。
期間は1年と3年から選択でき、3年の方が安くお肉を食べることができます。

支払いオプションというのは、1年あるいは3年の食べ放題の値段を全額先払いするか、一部先払いするか、後で払うか、を選択するオプションです。前払い金額が多いほど割引率が高く、つまり全額前払いがもっとも安く肉を食べられる支払い方法になります。(前売りチケットなどが安いのと似てますね。)

基準とする直近の期間というのは、CostExplorerが推奨するRIを決定するために参考にする期間のことです。基本的には長い方が参考にするデータが多いので、正確さが増すかと思います。しかし、50日前にテストなどで一時的にRDSを使用することが多いなどの状況があった場合、テスト期間のデータを省くために30日を選択した方が正確さが増すかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1045261/7e569cde-df83-65ec-3528-a19a231d1c82.png)

# 焼肉の注意点
* 1枚しか食べなくても、4,880円(税込5,368円)かかります。
(焼肉なら5,000円で済むけど、RI/SPだと100万とかかかっちゃったり。)

* 焼肉屋さんを予約するときに、何人来るのか、そもそもお肉食べられるのか、などがわからないときは、食べ放題を予約せずに席だけ予約して単品購入した方がいいです。
(どのリソースをどのくらい利用する見込みなのかわからない場合、オンデマンド料金の方がいいよ。)

# まとめ
RI/SP=焼肉食べ放題
オンデマンド=焼肉単品注文
Pythonのクラス

# Pythonのクラスについて学習
Javaとの同じ点や異なる点を整理しながら、Pythonのクラスについて学習する。

## クラス定義

~~~py
class クラス名:
~~~
Javaとは異なり、publicとかの修飾子がクラスにはない。

## 属性
~~~py
class クラス名:
    属性名 = 値
~~~
Javaではインスタンス変数（非static変数）定義だが、Pythonではクラス変数（static変数）定義になる。

## メソッド
以下の３種類ある。
- インスタンスメソッド
   インスタンス化されて実行できるメソッド
- クラスメソッド
   `@classmethod`デコレーターをメソッドに使う。Javaのstaticで定義したメソッドと同じ。
   インスタンス化しなくても使えるという点は静的メソッドと同じ。
   コンストラクタメソッドと同じようにインスタンス化したクラスを返却してくれるので、datetime.now()のような呼び出し側のコーディングで、目的や状態を分かりやすくするメリットがある。
- 静的メソッド
   `@staticmethod`デコレーターをメソッドに使うことで定義できる。インスタンス化せずに使うことができるものなので、Javaのstaticで定義したメソッドと同じ。
   finalとかはないのだろうか。

## 特殊メソッド
アンダースコアを二つつけたメソッドで、`__init__`や `__add__`などの様々な種類がある.
`__init__`はJavaのコンストラクタと同じ役割のメソッド。
`__add__`のような演算子に関する特殊メソッドは、演算子による演算機能を追加することができる。


公式ドキュメント：<https://docs.python.org/ja/3/reference/datamodel.html#special-method-names>

## プロパティ化
`@property`デコレーターを追加することで、カッコをつけずにインスタンスメソッドを呼び出すことができるようになる。
可読性を向上させることができるようになる。プロパティ化という名前の通り、getterやsetterのような使い方をしたい場合に使うのが良さそう。
Xcode Cloudでの依存関係エラーとその解決法

最近、Xcode Cloudでワークフローを実行した際に遭遇したエラーについて共有したいと思います。

### 発生したエラー

Swift Package Dependencies

```
a resolved file is required when automatic dependency resolution is disabled and should be placed at /Volumes/workspace/repository/⚪︎⚪︎⚪︎.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved. Running resolver because the following dependencies were added: '⚪︎⚪︎⚪︎' (https://github.com/⚪︎⚪︎⚪︎/⚪︎⚪︎⚪︎.git)fatalError
```

Configuration Issues
```
Could not resolve package dependencies: a resolved file is required when automatic dependency resolution is disabled and should be placed at /Volumes/workspace/repository/⚪︎⚪︎⚪︎.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved. Running resolver because the following dependencies were added: '⚪︎⚪︎⚪︎' (https://github.com/⚪︎⚪︎⚪︎/⚪︎⚪︎⚪︎.git) fatalError
```

### 解決策
この問題を解決するために、以下のスクリプトをプロジェクトのルートディレクトリ内の`ci_scripts/ci_post_clone.sh`という名前のファイルに書き込みました。

```

#!/bin/zsh

defaults delete com.apple.dt.Xcode IDEPackageOnlyUseVersionsFromResolvedFile
defaults delete com.apple.dt.Xcode IDEDisableAutomaticPackageResolution
```

そして、以下のコマンドを使用してスクリプトファイルを実行可能に変更しました。

`chmod +x ci_scripts/ci_post_clone.sh`


### スクリプトが解決した問題
このスクリプトは、Xcodeの設定をリセットすることで、自動的な依存関係解決の挙動を標準状態に戻します。具体的には、XcodeがPackage.resolvedファイルに記述されているバージョンの依存関係のみを使用する設定と、自動的にパッケージ依存関係を解決しようとしない設定を削除します。これにより、Xcodeは再び自動的に依存関係を解決し、ビルドプロセス中に発生する問題を回避することが可能になります。

### スクリプトの解説

#### `defaults delete com.apple.dt.Xcode IDEPackageOnlyUseVersionsFromResolvedFile`

- このコマンドは、Xcodeの設定 IDEPackageOnlyUseVersionsFromResolvedFile を削除します。
- この設定は、Xcodeが Package.resolved ファイルに記述されているバージョンの依存関係のみを使用するように指示します。
- 設定を削除することで、Xcodeは Package.resolved 以外の情報源からも依存関係の解決を試みることができるようになります。

#### `defaults delete com.apple.dt.Xcode IDEDisableAutomaticPackageResolution`
- このコマンドは、 IDEDisableAutomaticPackageResolution 設定を削除します。
- この設定が有効な場合、Xcodeは自動的にパッケージ依存関係を解決しようとしません。
- 設定を削除することで、Xcodeは再び自動的に依存関係を解決しようとします。

### 補足: `ci_scripts/ci_post_clone.shというファイル`がXcode Cloudで自動的に実行される理由
Xcode CloudがCI（Continuous Integration）プロセスの一部として特定のスクリプトを自動的に実行するように設計されているためです。Xcode Cloudには、ビルドプロセス中に特定の段階で自動的に実行される標準的なスクリプトフックがあります。

[Writing custom build scripts | Apple Developer Documentation](https://developer.apple.com/documentation/xcode/writing-custom-build-scripts)

#### Xcode CloudのCIプロセスにおけるスクリプトフック
- ポストクローンステージ: レポジトリのクローン作成後、ビルドプロセスの前に実行されるステージです。このステージでは、`ci_post_clone.sh` という名前のスクリプトがあれば自動的に実行されます。
- ファイル名の規約: `ci_post_clone.sh` はXcode Cloudによって認識される特定の名前の規約に従っています。この名前の規約に従うことで、Xcode Cloudは自動的にこのスクリプトを見つけて実行します。

#### スクリプトの役割
- ビルド環境の設定: `ci_post_clone.sh` スクリプトは、ビルドが実行される前に必要な環境設定や依存関係の解決など、ビルド環境を設定するために使用されます。
- カスタマイズと柔軟性: このスクリプトを使用することで、開発者はビルドプロセスをより細かく制御し、プロジェクトに特有の要件に合わせて環境をカスタマイズできます。

#### まとめ
`ci_scripts/ci_post_clone.sh` というファイル名は、Xcode Cloudのビルドプロセス中に特定のタイミングで自動的に実行されるスクリプトを識別するための規約に基づいています。このスクリプトはビルド環境の設定やカスタマイズに用いられ、Xcode CloudのCIプロセスの柔軟性と効率性を高める役割を果たします。
プロファイル/権限セットの簡潔な表を作る

# 課題
プロファイル/権限セットの内容はSFDCの設定画面で確認できる。
しかし、項目が大量にあり、権限の特徴を把握しづらい。
プロファイル/権限セットの特徴を把握する簡潔な表を作る方法を検討する。

# 検討
プロファイル/権限セットの特徴を把握する簡潔な表を作るための方針を決める。

## 方針
- 権限が設定されていない項目は記載しない。
- 画面、オブジェクト、システム権限など権限の特徴がわかりやすい項目に絞って記載する。
- 権限の設定と関係ない項目は記載しない。
- 細かすぎる権限設定項目は記載しない。

方針に従うと、記載するプロファイル/権限セットの項目は以下になる。

### プロファイル
| カテゴリ | 記載有無 |
| ---- | ---- |
| ページレイアウト | × |
| 項目レベルセキュリティ | × |
| カスタムアプリケーション設定 | × |
| 接続アプリケーションへのアクセス | × |
| サービスプロバイダのアクセス権 | × |
| タブの設定 | 〇 |
| レコードタイプの設定 | × |
| システム管理者権限 | 〇 |
| 一般ユーザ権限 | 〇 |
| 標準オブジェクト権限 | 〇 |
| カスタムオブジェクト権限 | 〇 |
| セッションの設定 | × |
| パスワードポリシー | × |
| ログイン時間帯の制限 | × |
| ログイン IP アドレスの制限 | × |
| 有効な Apex クラス | × |
| 有効な Visualforce ページアクセス | 〇 |
| 有効な外部データソースアクセス | × |
| 有効な指定ログイン情報アクセス | × |
| カスタムメタデータ型アクセスを有効化 | 〇 |
| 有効なカスタム設定の定義アクセス | × |
| フローアクセスを有効化 | × |
| 有効になっているカスタム権限 | 〇 |
| デフォルト Experience Cloud サイト | × |

### 権限セット
| カテゴリ | 記載有無 |
| ---- | ---- |
| 割り当てられたアプリケーション | × |
| 割り当てられた接続アプリケーション | × |
| アプリケーション権限 | 〇 |
| Apex クラスアクセス | × |
| Visualforce ページのアクセス | 〇 |
| 外部データソースアクセス | × |
| フローアクセス | × |
| 指定ログイン情報アクセス | × |
| カスタム権限 | 〇 |
| カスタムメタデータ型 | × |
| オブジェクト設定 | 〇 |
| カスタム設定の定義 | × |
| システム権限 | 〇 |
| サービスプロバイダ | × |

# 表の例
方針に従い表の例を示す。

## プロファイル
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224267/9865e643-8435-baed-54e0-1961b4a259d9.png)

## 権限セット
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224267/4708c966-5585-ded9-2cf9-30cd2331efca.png)