OmniAICreator/Qiita-1.07M huggingface dataset:
Campaign Member関係の数式



[Campaign "Member Status Update Date" field in a formula](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000BsbMF)

You'll need to "roll your own" using a custom DateTime field that's updated via a Record Triggered Flow, or Process

# 5 Formula Fields to Add to Your Salesforce Campaign KPIs
[5 Formula Fields to Add to Your Salesforce Campaign KPIs](https://www.salesforceben.com/the-drip/5-formula-fields-to-add-to-your-salesforce-campaign-kpis/)

**1.Total Campaign Members**

この最初のフィールドは、Salesforceキャンペーンのキャンペーンメンバーの数を表示するためのものです。すぐに使用できるSalesforceには、「キャンペーンで送信された数」と「応答された数」のフィールドがありますが、合計を示すフィールドはありません。レポート作成に便利なのは良い分野かもしれません。実際、この投稿の他の数式のいくつかはそれに依存しています。

This is what is called a ‘Roll-Up Summary’ field – it calculates the number of Campaign Members (child records) associated with a Campaign (the parent record), ‘rolls’ the total up to then display on the Campaign.

**2. Cost per Campaign Member**


キャンペーンの予算フィールドに入力しますか？使用を開始する必要がある2つの予算フィールドがあります。

予算コスト
実費
キャンペーンの各リード/連絡先のコストを計算する式は、実際のコストフィールドに依存します。

計算は次のとおりです。キャンペーンの実際のコスト/キャンペーンメンバーの合計

**3. Cost per Response**

この公式を、ブランドと有意義なやり取りをしたエンゲージメントのあるリード/連絡先のみに制限するにはどうすればよいか疑問に思われるかもしれません。ここで、「応答済み」チェックボックスに関するベストプラクティスが役立ちます*。幸い、このフィールドは「キャンペーンの回答」と呼ばれ、すぐに使用できます。

**4. Net New Leads in Campaign**

この公式を考えると、マーケティング担当者は誰でも興味を持ってくれるでしょうが、最初に警告をカバーするのは私の責任です。運用や組織の設定によっては、これは最も洗練された測定ではない場合がありますが、私が使用した場合は「うまくいきます」。

注意:
これは、Salesforce管理者の知識と組織全体の適切な監視を必要とする高度な設定です（ソリューションには自動化が含まれるため、キャンペーンメンバーオブジェクトの既存のプロセスを活用できるかどうかを確認する必要があります）。

**5. Cost per Acquisition**

これで、ついに「キャンペーンの純新規リード」を自由に使用できるようになりました。キャンペーンで獲得した新しいリードごとに実際にかかる費用を計算できます。

式を作成するには、次の式を使用して、コストを正味の新規リードの数で割るだけです。

ActualCost / Net_New_Leads_in_Campaign

キャンペーンメンバーあたりのコスト（ポイント＃2）または応答あたりのコスト（ポイント＃3）に戻って、数式フィールドの作成に関する記憶を更新します。

[7 Tips for Working With Salesforce Campaign Member Statuses](https://www.salesforceben.com/the-drip/7-tips-for-working-with-salesforce-campaign-member-statuses/)
「サーバント・リーダーシップが未来のリーダーシップ・スタイルになる理由」

[AWS Dev Day Online Japan](https://qiita.com/e99h2121/items/da8edb1782b72870e7ef) で聞いた

- 現在エンジニアは売り手市場
- 組織も楽しい環境づくりをして、喜んでもらってナンボ

だという話。

Amazonですら（?）「ネームブランドだけで定着しない、エンジニアは売り手市場。いかに定着してもらうか。"上に行けば偉い" わけじゃない。楽しい環境づくりをして、喜んでもらって仕事する。」という意識だとのこと。


## BOSSとLEADERの違い

こんな図があるらしい。わかりやすい。

https://www.reddit.com/r/GetMotivated/comments/2px8hz/image_the_difference_between_a_boss_and_a_leader/?utm_source=share&utm_medium=web2x&context=3

<img src="https://external-preview.redd.it/OrZcCcOjHGLenWXgaDt4YFTtFpY3_y5ZXuEKNhhqB_I.jpg?auto=webp&s=2ff7f9f8bcc24a6bafd7b712f08edf0f825284e6" width=50% height=50% />

## サーバント・リーダーシップ

それに通ずる考え方が「サーバント・リーダーシップ」(= 奉仕型のリーダーシップ。アメリカのロバート・Ｋ・グリーンリーフが提唱した「リーダーである人は、まず相手に奉仕し、その後相手を導くものである」というリーダーシップ哲学)

### "Why Servant Leadership is Becoming the Leadership Style of the Future"

ということでInternational Center for Leadership in Education (ICLE) のEric Sheningerが紹介している記事を読んでみたので、その要約。

https://twitter.com/E_Sheninger/status/1444767150615433217?s=20

「サーバント・リーダーシップが未来のリーダーシップ・スタイルになる理由」



### 記事 (DeepL翻訳しつつの要約です)
https://www.entrepreneur.com/article/382326

> 変革型リーダーシップは、人々のニーズを満たすことで、人々にポジティブな変化をもたらすと考えます。一方サーバント・リーダーシップは、人々のニーズを目的としてとらえることで人気を集めているリーダーシップのスタイルです。

- サーバント・リーダーシップは、人々のニーズを満たすこと = 奉仕することが彼らのためになる と考える

#### サーバント・リーダーシップの現状

> サーバント・リーダーシップは、もはや理論上だけのものではありません。研究者たちは、経験的に検証可能な研究結果に研究をシフトしています。多くの研究者は、サーバント・リーダーシップ・アプローチを適用した場合の影響や効果をほぼ正確に予測することにも成功しています。

- 世界中の組織は、人々の成長と集中を助けることにフォーカスしている。
- いまや組織内のほぼすべての関係者がボタンをクリックするだけですべての情報にアクセスできるようになった。
- これにより、指導的立場にある人々の必要は、単に指導するのでなく、他者に奉仕することに向けられるようになった。
- リーダーシップとデータが一部のエリートのために保存されていた時代は過去のものである。
- サーバント・リーダーシップによって組織のシチズンシップを表彰する。
- 従業員が利他性を発揮し、義務を超えて行動するために、サーバント・リーダーは、従業員一人一人に重要なメンバーであるという意識を持たせる。
- **組織のリーダーは、全員の全体的な幸福と成長に関心を持つ。**


#### 職務遂行能力

> 組織の目標に対する全個人の貢献度を長期にわたって集計したもの。

- それは、タスク・パフォーマンスであったり、コンテクスト・パフォーマンスであったりする。
- タスクパフォーマンスは、財やサービスに貢献するものであり、測定やモニタリングが比較的容易である。
- 一方、文脈的パフォーマンスには、対人関係や自発的な活動が含まれ、組織がより広い文脈で中核的な目標を達成するのに役立つ。
- 「文脈」に沿った組織目標は、権限を与えられたスタッフの団結したチームと、スタッフの全体的な福祉に焦点を当てた環境があって、初めて達成される。

> グローバル化により、世界は「ひとつの村」になった。異なる文化や規範が、大陸を越えて互いに影響し合うようになりました。多国籍企業は、成功事例を輸出すると同時に、ホストコミュニティからも学んでいます。また、世界各地で活発化している人権擁護運動は、人間のニーズに焦点を当てています。

- この競争の激しい21世紀に生き残るのは、変化を積極的に受け入れ、サーバント・リーダーシップを組織構造の中核に据える者。
- 労働組合や過去のマネジメント、指揮・威信・権威に基づくリーダーシップスタイルは生き残れなくなるだろう。


#### サーバント・リーダーシップは世界をどう変えるか

> サーバント・リーダーシップの推進者や実践者たちは、成功したサーバント・リーダーシップの成果は、学者たちが列挙したさまざまな属性のほとんどを通じて、社会のあらゆる側面に現れてくると示唆している。

- 誰もが他に耳を傾け、耳を傾けるようになる。
- 共通の課題に一致団結して立ち向かう、結束力の高いコミュニティの構築を目指す。
- その結果、社会はより共感的になり、すべてのメンバーの成長のために、より献身的な社会になる。
- 組織は、自分たちのために働く人々や、自分たちが活動する社会の構成員のニーズに、より敏感に反応するようになる。人々は対立を解決するために、不満や暴力を生みやすい権力や権威ではなく、説得や対話に頼るようになる。
- **人々は利他主義の感覚を身につける。これにより、誰もが単なる義務を超えて、組織や社会全体に利益をもたらすようなことを、公務外でも行うようになる。**

## Google社の例

https://rework.withgoogle.com/jp/subjects/managers/

https://twitter.com/famao/status/1515703257779568644?s=20&t=Dj6ly8I_TJW_yAVhk3l_sg

## まとめ

- 副業
- フルリモート
- 時間、服装自由

などなど、開発メンバーが主体性を発揮できるという開発、スタートアップ界の考え方は当たり前になっていきそう。最近リーダーとは、自分の執事のようだな～等と呑気に思ったがそれは世界のトレンドのようでした。

以上参考になればさいわいです。
Geopyで2点間の距離を測定する方法

GPS等の位置情報(緯度,経度)データを扱う中で、2つの位置情報間の距離を算出する方法をまとめました。

今回`python`の`Geopy`というライブラリを活用しています。特定の緯度経度同士の距離を出す方法は巷にあふれているのですが、複数の位置情報データを利用した算出方法を見つけられなかったため、記事を書くことにしました。お役に立てると幸いです。

私は`Google Colaboratory`を利用しています。PythonのVerは`Python 3.7.12`でした。

#Geopyのインストール方法
`Google colaboraory`はデフォルトで`Geopy`がインストールされていますので、以下手順はスキップしてください。

```
pip install geopy
```

#データフレームの準備
緯度経度情報のあるデータフレームを準備します。

```
list = [[35.68142790460516, 139.76714625616972], [34.702714709994204, 135.49593986965132],[31.601693966235818, 130.5630390561215]]
index = ['東京駅', '大阪駅', '福岡駅']
columns = ['latitude', 'longitude']
df = pd.DataFrame(data=list, index=index, columns=columns)
```
| | latitude | longitude |
|:-:|:-:|:-:|
|  東京駅 | 35.68142790460516  |  139.76714625616972 |
|  大阪駅 | 34.702714709994204  | 135.49593986965132  |
| 福岡駅  | 31.60169396623581  | 130.5630390561215  |



#導入
Geopyのインポート。

```python: 
from geopy.distance import geodesic
```

#①比較する位置情報が1箇所の場合

```python:
#比較対象を品川駅に設定
location = (35.628671851820975, 139.73874896966285)
df["distance"] = df.apply(lambda x:geodesic((x["latitude"], x["longitude"]), location), axis=1)
```
| | latitude | longitude | distance |
|:-:|:-:|:-:|:-:|
|  東京駅 | 35.68142790460516  |  139.76714625616972 |6.393371847275713 km|
|  大阪駅 | 34.702714709994204  | 135.49593986965132  |399.91561269237417 km|
| 福岡駅  | 31.60169396623581  | 130.5630390561215  |960.9271552485031 km|
このように行毎に品川駅との距離を算出することができました。

#②別の位置情報のデータと比較する場合
次に比較したい場所が複数ある場合は以下の手順です。
まず比較する位置情報のあるデータフレームを作成します。

```python:
list2 = [["品川駅", 35.62861516865684, 139.73878651988088], ["梅田駅", 34.703394777186084, 135.4976907467483],["桜島", 31.585815733986234, 130.65043613481365]]
columns = ['location', 'latitude', 'longitude']
locations = pd.DataFrame(data=list2,columns=columns)
```
|| location | latitude | longitude |
|:-:|:-:|:-:|:-:|
|0|  品川駅 | 35.62861516865684| 139.73878651988088|
|1|  梅田駅 | 34.703394777186084| 135.4976907467483|
|2| 　桜島 | 31.585815733986234| 130.65043613481365|

このデータフレームを元に総当りで比較してみます。新しく作るcolumns名はlist2のlocaton名にしてみます。

```python:
for i in range(len(locations)) :
  df[locations['location'][i]] = df.apply(lambda x:geodesic((x["latitude"], x["longitude"]), (locations['latitude'][i], locations['longitude'][i])), axis=1)

```
そうすることで以下表のように各拠点との距離を測定することができました。

| | latitude | longitude | 品川駅 | 梅田駅 | 桜島 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|  東京駅 | 35.68142790460516  |  139.76714625616972 |6.397765002728355 km|403.65205533837116 km|959.4990902614147 km|
|  大阪駅 | 34.702714709994204  | 135.49593986965132  |399.9174334391656 km|0.17726519520253164 km|568.9750259401818 km|
| 福岡駅  | 31.60169396623581  | 130.5630390561215  |960.9275703488593 km|574.5558420262055 km|8.479415597138578 km|

#　さいごに
今回数千件のレコードと数十件の拠点のデータから1レコードずつどの拠点に属するかを距離から分類しました。
その分類する前に、この記事の内容が役立ちましたので、皆さんのお役にも立てれば幸いです。
AI Deep Learning：LSTMでFXを分析する;参考文献

"LSTMでFXを分析する"シリーズの参考文献が良いものが多いので追加します


スタンフォードの文献
SP500に注目し、価格のみならずボリュームや債務についても対象の情報として取り扱っています。
MSEに関しては、
LSTM > Stacked-LSTM > Attention-LSTM　となっています。
http://cs230.stanford.edu/projects_winter_2020/reports/32066186.pdf


神戸大学の文献
国内の大学も頑張ってますね、、
Stock Marketに影響のありそうな文字情報も分析して情報として取り扱う方法は今後も進化に期待大！　　　場中の突発的Breaking News の考慮もできると良いなあ〜
”Deep Learning for Stock Prediction Using Numerical and Textural Information”
https://www.computer.org/csdl/pds/api/csdl/proceedings/download-article/12OmNBpVQ3D/pdf


FXにファンダメンタルの影響も含め検討したものです
こういった解析が今までのテクニカルだけの分析とは異なるAIならではの解析になっていくと思います。
テクニカルとマクロのハイブリッドとでも言うのでしょうか、、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167640/2051ce84-570c-95c9-d1d3-1fe3f4c31c69.png)


https://jfin-swufe.springeropen.com/articles/10.1186/s40854-020-00220-2#Tab2


ANN, LSTM+GRU model
なかなかいい感じで予測できてますね、、、コード参考になります、
しかし、、、USD/INR ,,, 残念、、　EUR/USD の結果が知りたい、、
https://medium.com/@sid321axn/foreign-exchange-rate-prediction-using-deep-learning-ann-lstm-gru-936a0a7df293


あら、こんな結果も、、、　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167640/cb4278c8-3748-1245-de05-105fa6ad7a2a.png)

https://www.hindawi.com/journals/complexity/2021/6647534/
https://www.econstor.eu/bitstream/10419/237234/1/1745539263.pdf


これいいですネ
STMicroの報告なのが面白い！！
EUR/USD,GBP/USD.EUR/GBP  3point 分析
https://www.mdpi.com/2076-3417/9/20/4460/htm

モデリングに関する文献として良いですネ
https://bura.brunel.ac.uk/bitstream/2438/20942/1/FulltextThesis.pdf

これもモデリングの参考になります
https://www.imperial.ac.uk/media/imperial-college/faculty-of-natural-sciences/department-of-mathematics/math-finance/Nielsen_Laurids-Gert_01424460.pdf

#To Be Continue
個別の金融系AI分析とシステムも制作しているので、ご興味あれば下記にDMて連絡頂きたい。
https://twitter.com/shota_r55
ONNXモデルに出力ノードを追加する方法

ONNXモデルの途中層から出力を得たかったので調べた結果をメモります。


``` python
import onnx

# モデルの出力ファイル名
model_path = "path to model"

model = onnx.load(model_path)

input_path = 'path to load model'
output_path = 'path to save model'
input_names = ['input_1']
output_names = ['Logits_softmax', 'Logits_softmax_Flatten'] # 左が元々あったノード　、　右が追加するノード

onnx.utils.extract_model(input_path, output_path, input_names, output_names)
```
![スクリーンショット 2021-10-05 3.22.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/788026/18edf12d-1f1b-0601-56ef-decbceea979a.png)

ピンクの丸が追加した出力ノードになります。
これでSoftmaxの手前の出力が取得できるようになりました。
ESMで書かれたNodejsでrequireが使えない

<h1>やりたかったこと</h1>
・毎回コマンドラインでログイントークンを生成→コピーしてｃURLで送るのが面倒だったから一回の操作で行いたい。
・ES Moduleで書かれたログイントークンを生成するNodejsプログラムを使ってHTTP requestをおくる
<h1>起きた問題</h1>

・ESＭで書かれたNodejsプログラムではrequireが使えないためいつもの記法でのhttp requestが送れない
→いっそシェルスクリプトを使ってCURLコマンドでリクエストを送る
・シェルスクリプトの使い方がよくわからない
<h1>やったこと</h1>
Nodejsの結果を変数に入れてCURLコマンドへ入力
<h1>例</h1>
フォルダ構成
index.mjs　←ログイントークンを生成するプログラム
do.sh　　　←今回作ったシェルスクリプト

``` bash:do.sh
#! /bin/sh
IDTOKEN=`node index.mjs`
echo $IDTOKEN
curl "http://yourURL" \
     -H Authorization:" $IDTOKEN"
```

<h1>気を付ける点</h1>
バッククォートでコマンドラインを囲む(node index.mjsの部分)
nすくみじゃんけんの考察

# 先駆者

https://tarohere.com/archives/141

# 予防線

私の数学力は下の下の下の下の下というレベルなので有識者が見るとムカつくかもしれません。
群って何？というレベルです。

# 定義

nすくみじゃんけんを次のように定義します。
（先駆者と2.が異なります。）

1. $0, 1, \dots, n-1$の手が存在する。
1. 自分の手の強さは、{相手の手}$-${自分の手}の合計（※1, 2）
1. 最も手が強い人が勝ち

※1：ただし相手の手で同じものがある場合は一度しか加算しない。
例えば自分の手が0、相手の出した手が1,2,2,3の場合は
$(1-0)+(2-0)+(2-0)+(3-0)$ではなく
$(1-0)+(2-0)+(3-0)$と計算するということ。

※2：合計が0より小さい、もしくはn-1より大きい場合は
法nに合同である0以上n-1以下の整数が手の強さとなる。

# 手の強さの公式1

手を$\mathbb{Z}/n\mathbb{Z}$の元とし、ｍ人でnすくみじゃんけんを行うとする。
また、それぞれが出した手を$a_0,a_1,\dots,a_{m-1}\ $とし、
場に出た手の集合を次のように定義する。

```math
A := \{a_0, a_1,\dots, a_{m-1}\} \
```

このとき、$\forall a \in A$の強さは関数$P_A$により次のように求められる。

```math
\begin{eqnarray*}
P_A(a)&=& \sum_{x \in A}(x - a) \\
&=& \sum_{x \in A}x - \#A \cdot a
\end{eqnarray*}
```

（実際は法nに合同である0以上n-1以下の整数に直す必要がありますが、目をつぶって下さい。）

# 手の強さの公式2

$\forall a, a+i \in A$に対して次が成り立つ。

```math
\begin{eqnarray*}
P_A(a+i) &=& \sum_{x \in A}x - \#A \cdot (a+i) \\
&=& (\sum_{x \in A}x - \#A \cdot a) - \#A \cdot i \\
&=& P_A(a) - \#A \cdot i
\end{eqnarray*}
```

# 決着性の高さ

## 定理

$\gcd(\\#A , n) = 1$を満たす$A \subsetneq \mathbb{Z}/n\mathbb{Z}$が存在するならば、
$\forall a, b \in A,  \ a \neq b$に対して$P_A(a) \neq P_A(b)$

これにより、m人でじゃんけんする場合、mより大きくかつ互いに素なnからnすくみじゃんけんを行うと、m人全員が異なる手を出せば誰もあいこにならず、勝敗が決まることが分かる。

## 証明

（雑です。）
手の強さの公式2を利用し、
$\gcd(\\#A , n) = 1$を満たす$A \subsetneq \mathbb{Z}/n\mathbb{Z}$が存在するならば、
$\forall a, a+i \in A,  \ a \neq a+i$に対して$P_A(a) \neq P_A(a+i)$が示せればよい。

$a \neq a+i \Rightarrow P_A(a+i) = P_A(a)$が成立する$a, a+i \in A$が存在すると仮定する。
このとき手の強さの公式2より
$ \\#A \cdot i \equiv 0 \\pmod n \quad \cdots (1)$
ところで
$a \neq a+i$より$i \not\equiv 0 \\pmod n \quad \cdots (2)$
$ \exists a, a+i \in A : a \neq a+i$かつ$A \subsetneq \mathbb{Z}/n\mathbb{Z}$より$2 \le \\#A < n$
よって$\\#A \not\equiv 0 \\pmod n \quad \cdots (3)$
また命題より$\gcd(\\#A , n) = 1 \quad \cdots (4)$

(2),(3),(4)より$\\#A \cdot i \not\equiv 0 \\pmod n \quad$
これは(1)と矛盾する。
よって命題が示させた。（証明終了）

# 手の強さの性質

全射$f$を以下のように定義する。
$A \subsetneq \mathbb{Z}/n\mathbb{Z} \stackrel{f}{\to} B \subsetneq \mathbb{Z}/n\mathbb{Z}, \quad x \in A \stackrel{f}{\mapsto} x + i \in B$

このとき、$\forall x \in A$に対して次が成り立つ。
$P_A(x) = P_{f(A)}(f(x))$

## 証明

```math
\begin{eqnarray*}
P_{f(A)}(f(x)) &=& \sum_{f(x) \in f(A)}f(x) - \#A \cdot f(x) \\
&=& (\sum_{x \in A}x + \#f(A) \cdot i) - \#A \cdot (x+i) \\
&=& \sum_{x \in A}x - \#A \cdot i \quad (\because fは全射) \\
&=& P_A(x)
\end{eqnarray*}
```

# 手の平等性

## 定理

$\gcd(\\#A , n) = 1$を満たす$\forall A \subsetneq \mathbb{Z}/n\mathbb{Z}$に対して
ある元$x \in A$の$P_A(x)$が法nに合同である0以上n-1以下の整数で最大になる確率は$1 / n$となる。

## 証明

余白が足りないので略。
多分上の性質を使えば示せるでしょう。

# その他の性質

$\forall A \in \mathbb{Z}/n\mathbb{Z}, \ \\#A \geq 2$に対して以下が成り立つ。

1. $\sum_{x \in A}P_A(x) = 0$
1. $\gcd(\\#A , n) = 1$ならば、$P_A$は$\mathbb{Z}/n\mathbb{Z} \to \mathbb{Z}/n\mathbb{Z}$となる全単射である。
1. $A \cap \\{{b\\}} = \emptyset$を満たす$\\{{b\\}} \in \mathbb{Z}/n\mathbb{Z}$が存在するならば、$P_{A \cup \\{{b\\}}}(a) = P_A(a) + (b - a)$
JavaとPythonの比較

ごくごく簡単なまとめですが、JavaとPythonを比較してみました。

|項目|Java|Python|
|:-----------|:----------- |:-----------  |
| クラス    | 必ず必要     | 書かなくてもいきなり処理のベタ書きでも良い      |
| 変数定義時の型指定    | 必要     | 不要（動的型付け）      |
| long型     | あり      | なし（整数値はすべてint型でOK）       |
| 複数戻り値       | 不可       | 可       |
| インデント    | 任意     | 強制      |
| 空のオブジェクト    | null     | None      |
|多重継承| 不可| 可         |
| switch文     | あり      | なし       |
| 定数定義構文       | あり        | なし         |
| if文での変数スコープ       | if文内でスコープ形成する        | if文内でスコープ形成しない         |
| 文字列の完全一致判定         | .equals()          | ==（イコール演算子）           |
| アクセス修飾子    | あり     | なし      |
| リストの要素のデータ型    | ひとつのデータ型しか格納できない     | 複数のデータ型を格納できる      |
| 論理記号    | &&,&#124;&#124;     | and,or      |
| べき乗   | Math.pow()     | **      |
| 主なIDE    | eclipse,IntelliJ IDEA,NetBeans     | IDLE,Pycharm,VSCode,PyScripter,eclipse      |
| 主なテストフレームワーク    | JUnit      | unittest,pytest,doctest    |

※Pythonはバージョン3を前提にしています。
Excelでシート名を参照する関数

Excelでシート名を参照する関数。

おまじないだと思ってコピペ用に投稿します。

いちいちコピペするのはヒューマンエラーの原因になりますので、なるべく関数で自動化したいですよね。

```

=RIGHT(CELL("filename",A1),LEN(CELL("filename",A1))-FIND("]",CELL("filename",A1)))

```
Laravel8のAPIで429 (Too Many Requests)エラーの対応方法

# 現象

Laravel8でAPIを作り、Front側で大量のデータ取得Or更新をしようとすると、最初の何十件までは順調で進むが、その後Javascript Consoleにて429 (Too Many Requests)エラーが発生していまいます。

# 背景

Laravel8ではデフォルトでアクセス件数の制限が走って、1分間に60件を超えるとエラーを起こしてしまします。

オフィシャル参考資料：　https://laravel.com/docs/8.x/routing#rate-limiting

#対応方法

原因がわかると対応方法は簡単。

ファイル： /app/Providers/RouteServiceProvider.php 

修正箇所：

```php 
    /**
     * Configure the rate limiters for the application.
     *
     * @return void
     */
    protected function configureRateLimiting()
    {
        RateLimiter::for('api', function (Request $request) {
            //return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip()); //元の内容
            return Limit::perMinute(10000)->by(optional($request->user())->id ?: $request->ip()); //修正した内容
        });
    }
```

以上。
RESTとSOAPについて

# はじめに
本記事では、`REST`と`SOAP`について、記述します。

# REST
RESTとは、Webのアーキテクチャスタイルのことです。
`Representational State Transfer`の略。

#### アーキテクチャスタイルとは
アーキテクチャ（`Webサービスや設計を形作る「構造」`）を決める際の「設計指針」となるものです。

アーキテクチャは`構造`、アーキテクチャスタイルは`設計指針`になります。

```
RESTは、
クライアントとサーバーの間で実際にリソースをやり取りするとき、
クライアントから「URL」に「HTTPメソッド(GET,POST,PUT,DELETE)」
を加えた情報でリクエストします。
```

## RESTのアーキテクチャスタイルについて
RESTは、複数のアーキテクチャスタイルで成り立っています。


### ステートレスサーバー
ステート(state)は、状態。

`状態がない`つまり、クライアントの状態を持たないサーバーです。
サーバーサイドでは、状態を管理しないことから、
クライアントサイドで、情報を送信し、リクエストする形になります。

そうすることで、サーバーサイドでは、負担が少なく、実装が簡単になることのメリットがあります。

### キャッシュ
一度得たリソース(`WEB上でのあらゆる情報`)をクライアント側で保存しそれを使い回す仕組みのことです。

こちらも、サーバーサイドの負担は少なく、
クライアントサイドとサーバーサイドでの`やりとりを保存`し、
また通信を減らすことで、処理が短縮されることのメリットがあります。

しかし、長く保存されたままでいると、その保存している情報の信頼性に欠けてしまうことがデメリットです。

### 統一インターフェイス
HTTPメソッドで、
`GETやPOSTなど`に`限定`、`固定`することで、全体がシンプルになります。

### 階層化システム
システムを階層に分けることです。
クライアントサイドとサーバーサイドの間に階層を分割するものを設け、`負担を分散`します。

### コードオンデマンド
プログラムをクライアントサイドで実行することです。
例えば`JavaScript`の操作では、クライアントサイド側で操作することになります。
クライアントは後から`新しい機能を追加`することができます。

クライアント側での実行が増えるので、
サーバーサイドとやり取りする情報が多くなり、明確ではなくなります。

# SOAP
通信する上で、
`リクエスト・レスポンス`が読み取りやすいように作成されたデータでやり取りを行います。
`Simple Object Access Protocol`の略。

#　RESTとSOAPの違い
||REST|SOAP|
|-|-|-|
|メリット|他のシステムと連携し機能を広げる事が可能。（例）WebサービスにGoogleMapなどのAPIを導入できる。|高機能で拡張性があること|
|デメリット|構成のルールが決まっており、拡張性に乏しいこと|書き方の自由度が高く、構成が複雑で、他のシステムとの連携が難しい|
|向いていること|入力が少ないサービス|複雑な処理やセキュリティの設定を必要とするサービス|

## RESTful
RESTの考え方や原則に従って実装されてることを`RESTful`といいます。

```
（例）RailsでのRESTful

「http://localhost:3000/tweets」というURL

RESTの考えでは、

このURLに「GETメソッド」でアクセスした時、「index」のアクションとなり、
ツイートの一覧を表示することができます。

他にも、
「http://localhost:3000/tweets/2」というURL

「GETメソッド」では、「showアクション」ツイートの詳細を表示
「PUTメソッド」では、「updateアクション」編集画面から更新
「DELETEメソッド」では、「deアクション」ツイートの削除

となります。

このように、URLに対して、HTTPメソッドで、アクションが紐づきます。
```

以上です。

# 終わりに
基本的なことですが、あまり頭に入っていなかったので、アウトプットしました。

以下参考サイトです。
[SOAP とRESTの違いについてわかりやすく教えていただけませんでしょうか？](https://teratail.com/questions/34703)
[今さら聞けないWebAPIの実装方式RESTとSOAPの違い](https://qiita.com/pink/items/f1a22840619d3b79c4f2)
[REST と SOAP の比較](https://www.ibm.com/docs/ja/watson-explorer/12.0.x?topic=protocol-comparing-rest-soap)

明日も頑張ります！
WiFiのPW変わってRaspiにSSHできなくなった！！！

この記事は2019/3/5にブログで書いた記事の復刻版です
情報が古い可能性があるので気をつけてください

# 背景
同じマンションに4人以上同じ契約をしていると半額の値段になる某ISPサービスがありまして、
今回特別に1人でも利用できますよと案内があったのでOUを取り換えることに。

取り換えはすぐに終わりOUも前と同じ機種のものをもらったので「何の問題もないだろう～」と思い、意気揚々とRaspiにSSHしたのですが、OU変わった影響で、WiFi設定やポートフォワーディング、ロギング、ファイヤーウォール、DHCP等々の設定がすべて初期化されていることに気が付き1日中ふて寝しておりました。

だけどあきらめきれず涙を流しながらRaspbianの仕様をあさっていたところ、意外と簡単にSSHできないRaspiのWiFi設定をWindows側から変えられる方法を知ったのでこちらで共有したいと思います。

なお、OU側のWiFiパスワードを戻せばいいんじゃね？と思いましたが、
機器に張り付いているパスワードと異なるものを設定するのはなんとなーく嫌だったのでやりませんでした。

## 利用している機器、バージョン

・RaspberryPi ZERO W V1.1

```
$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 9.6 (stretch)
Release: 9.6
Codename: stretch

```

- wpa_supplicant.confファイル
    - RaspiでWiFi設定ファイルといえばこちらのファイルですが、カードリーダーで読み込むと/rootパーティションのものが見れず、/bootパーティションしか見れません。
しかし、Boot時に/boot/wpa_supplicant.confというファイルがある場合、自動的に書き換えてくれるみたいで、今回はその機能を利用させていただきたいと思います。
    - If a wpa_supplicant.conf file is placed into the /boot/ directory, this will be moved to the /etc/wpa_supplicant/ directory the next time the system is booted, overwriting the network settings; this allows a Wifi configuration to be preloaded onto a card from a Windows or other machine that can only see the boot partition.
Raspberry Pi Blogより引用

# 具体的な手順

1. ラズパイからMicroSDカードを取り外してPCにつなぎます
2. /boot以下にwpa_supplicant.confを作成してWiFi接続情報を書き込みます
    - 参考に書いておきます。

```
    ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
    update_config=1
    country=JP
    
    network={
        ssid="SSID"
        psk="xxxxxxxxxxxxx"
        key_mgmt=WPA-PSK
    }
```

```
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP
 
network={
    ssid="SSID"
    psk="xxxxxxxxxxxxx"
    key_mgmt=WPA-PSK
}
```

3. Raspiに刺して起動し祈るだけ！

なんと簡単！さすがラズパイ！

きっと僕みたいな迷える子羊のためにこういう機能があるんですね
僕は涙を拭いてRaspiにSSHすることができました。
めでたしめでたし。
PHPConference2021に初参加しました。

PHPConference2021に初参加しました。
こういったイベント毎に参加したこと自体が初めてで不安な部分は大きかったですが、参加してよかったです！

##参加した経緯
参加した経緯はLINEのオープンチャットでmukakenさんが今回のイベントの告知をしてくださっており、もともとPHPが大好きなのでもっと勉強したい！と思い参加しました。

##始まってみると
始まってみると一人で何も分からず参加したのでボイスチャットに入ってもいいのか分からず、どうしようかあたふたしてました。

少しして、koyhogeさんが雑談しようという書き込みをしていたので、'ここは入っていいんだ'と分かり試しに入ってみました。入ってみたはいいものの、どうしようかと迷っていると声をかけてくださり、自然と話せる空気を作ってくださり、なんとか話すことができました！

ここで勇気を出して声を出したことで、koyhogeさんやちゃちいさんと知り合う事ができましたし、そこから様々な人と知り合う切っ掛けになりました！

##内容について
学校ではPHPはそこそこできるつもりだったので、分かるかな？と思っていましたが、実際に聞いてみると圧倒されました。

PHP8の存在は知っていましたが、どういうものかは知らず、それの知識の共有をしているのがイベントならではで凄いと思いました。

スポンサーツアーでは、それぞれの会社の運営の仕方が面白く参考になりましたし、今まで知らないサービスの存在も知ることができて、これも参加して良かったなと思いました。

成瀬さんの初学者向けのオブジェクト指向の講義では、クラスは軽く勉強しただけで、メソッドの考え方などがなぜ必要なのかが分かっていませんでしたが、これを見る事でなるほど、と思いました。
これはPHPだけでなく、他言語に行っても通用する考え方だと思い、ぜひいろんな人にこれを見せようと思いました。

全体的に内容は濃く、面白くなる工夫がされており、ずっと飽きずに聞くことができました。新しい考え方をしれてホント参加して良かったなと思いました。


##LTに参加してみた

正直初参加でLTなんてなに話せばいいのかネタが全然ないのですし、知識的にも専門学生なんて実務経験のある方々に及ぶ訳ないので凄く悩みました。そこでちゃちいさんやuzullaさん達に相談すると快く相談に乗ってくださり、いろいろと方法を教えてくれました。
そこで教えてくださった方法をいくつか取り入れて話してみました。
話してみると意外と話せて、自分の感想などだけでしたが伝える事ができました。
（しばらく怖くてコメント見れませんでしたけど...)

LTに参加したおかげで顔もおそらくは覚えてくれた方も多いかと思います、そう考えると勇気を出して参加した甲斐があるかなと思いました！

##終わった後
懇親会が終わった後の非公式の懇親会では様々な人の会話を聞くだけでも楽しかったですし、会話をするともっと楽しかったです。

その後は会話だけでなく様々な新しい事、分からなくて一旦放置していた事を優しく教えて下さり、ホントありがたかったです！
おかげで知識も深まり、楽しく過ごすことができました！


##最後に
凄く楽しい二日間を過ごさせていただきました！
勇気を出して行動したのもありますが、周りの方々がすごく優しく、そして頼りになる方々ばかりで安心して参加する事ができました！
また来年も参加したいと思います！
（保存版）Djangoチートシート

##はじめに
Django初学者でもすんなりと学べるようDjangoのインストールからアプリケーションの作成＆認識まで解説します。
ってのは建前で、
本音は、いちいち入力するのが面倒なので一覧作っておきます
##Pythonのインストール
Pythonの公式ページのダウンロードページに行き、ダウンロードしてください。

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

ターミナルやコマンドプロンプト上で

```
$ python3 --version
Python 3.8.10
```

等が表示されればインストールできています。
##Djangoのインストール
Macであればlinuxはもともと入っているので大丈夫だとは思いますが、WindowsではUbuntuを入れてlinuxコマンドを使えるようにしてください。

Ubuntuの入れ方は以下を参考に。

https://netwiz.jp/how-to-install-ubuntu-20-04-lts-on-windows10/

Djangoはpipコマンドでインストールします。
（仮想環境上でも同様）

```
pip install django
```


##プロジェクトの作成
私はboardprojectを作成するためのコマンドを打ちました。project名は予約語にならないよう個人で決めてもらえればOKです。

```
django-admin startproject boardproject .
```

##開発用サーバー起動

```
python manage.py runserver
```

この状態でブラウザで、
`http://127.0.0.1:8000/`
でアクセスし、下のような画面になればOKです。
![スクリーンショット (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275634/47dc8106-17e9-c99d-9570-5382cf384048.png)


##アプリケーション作成
私はboardappを作成するためのコマンドを打ちました。project作成同様予約語にならないようapplication名は個人で決めてもらってOKです。

```
python manage.py startapp boardapp
```

##アプリケーションの認識
`project名/settings.py`にて
追加した時点ではこのようになっています。

```python:project名/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
```

`INSTALLED_APPS`の配列で次のように追加します
（私はboardappを作成したので次のように追記しました）

```python:project名/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'boardapp.apps.BoardappConfig',
]
```
PennylaneでQAOA

# Pennylaneでの実装

 Pennylane公式のQAOAのチュートリアルがちょっとだけ使いづらいので、簡単にしました。
qaoaクラスを使って楽をします。
なぜか公式チュートリアルだと、「最後の最適化は自分で頑張ってね」で終わっています、、
以下は最適化も含むコードです。

```python
import pennylane as qml
import numpy as np
import random
from pennylane import qaoa
from networkx import Graph

# Defines the wires and the graph on which MaxCut is being performed
n_qubits = 3
n_layers = 2
wires = range(n_qubits)
edges = [(0, 1), (1, 2), (2, 0)]
graph = Graph(edges)

# Defines the QAOA cost and mixer Hamiltonians
cost_h, mixer_h = qaoa.maxcut(graph)
# Defines a layer of the QAOA ansatz from the cost and mixer Hamiltonians
def qaoa_layer(gamma, alpha):
    qaoa.cost_layer(gamma, cost_h)
    qaoa.mixer_layer(alpha, mixer_h)
dev = qml.device('lightning.qubit', wires=len(wires))
# Repeatedly applies layers of the QAOA ansatz
def circuit(var, **kwargs):
    var_2d_array = np.reshape(var,(2,n_layers))
    for w in wires:
        qml.Hadamard(wires=w)

    qml.layer(qaoa_layer, n_layers, var_2d_array[0], var_2d_array[1])

# Defines the QAOA cost function
cost = qml.ExpvalCost(circuit, cost_h, dev)
from scipy.optimize import minimize
import time

var_init = np.random.uniform(low=-1, high=1, size=(2*n_layers)) # one-dimensional array
hist_cost = []
var = var_init

count = 0
def cbf(Xi):
    global count
    global hist_cost
    count += 1
    cost_now = cost(Xi)
    hist_cost.append(cost_now)
    print('iter = '+str(count)+' | cost = '+str(cost_now))

    
t1 = time.time()
result = minimize(fun=cost, x0=var_init, method='Nelder-Mead', callback=cbf, options={"maxiter":50})

t2 = time.time() 
elapsed_time = t2-t1
print(f"Time：{elapsed_time}")
print(f"Time per iteration : {elapsed_time/50}")       
from matplotlib import pyplot as plt
plt.plot(hist_cost,'o-') 
```
`iter = 1 | cost = -3.790512266733385
iter = 2 | cost = -3.9674137541481724
iter = 3 | cost = -3.997367263730413
iter = 4 | cost = -3.999999974706611
Time：13.195805311203003
Time per iteration : 0.26391610622406003`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/35fc903b-e4c2-8249-7987-c0a16c3c593c.png)


・遅いです。Blueqatのほうが圧倒的に早いです。
Unity2DのチュートリアルをInputSystemに書き換える(1)


# 最終的にはスマホから入力したい

先日の[Unityで2Dチュートリアル](https://qiita.com/DiveMasakazu/items/556508d27a0791d136e1)は終わったものの、PC用インターフェースだけだった。
[ドキュメント](https://docs.unity3d.com/ja/2021.2/Manual/MobileInput.html)
にモバイルインプットの項目があるけど、入力マネージャーという便利なものがあるのに、果たしてスマホは直接扱うのが正しいのか。
その謎を確かめるため、私はネットの奥地へと向かった・・・

## 新入力システム

まず、チュートリアルをやっている途中でかすかな影だけを見た[新入力システム](https://forpro.unity3d.jp/unity_pro_tips/2021/05/20/1957/)についてunity3d.jpの説明を発見。
この記事を書いている半年前に出た記事なので新しいと言って良さそう。
`最も大きな変化はスマートフォンやタブレットの登場、すなわちタッチデバイスの登場でしょう。これまでの入力システムではタッチ入力がカバーされておらず`
つまり、従来の入力マネージャーはタッチデバイスには対応していない。
それに対応させるため、ネットには様々なタッチ対応の記事が（おそらく）存在していると思われるが、
最新Unityとしてのベストは新入力システムであらゆる入力デバイスを統一的に扱う事、だと解釈すれば良さそう。奥地まで行く必要はなかった。

## Input Systemを扱う

* Input Systemのインストール
* Input Systemを扱う
  
InputSystemはチュートリアル中にインストールして、よく分からなかったので「両方」を選択して従来方法でやった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2081290/8cb33615-250a-fc69-4dfe-0a21d4046b5e.png)


そこで、チュートリアルのRubyのなんてろで新入力システムを試してみる。

ゲームパッドはusing UnityEngine.InputSystemした上で

```
 // ゲームパッドが接続されていないとnullになる。
if (Gamepad.current == null) return;
    if (Gamepad.current.buttonNorth.wasPressedThisFrame){
        Debug.Log("Button Northが押された！");
    }
```
とか

```
 GUILayout.Label($"leftStick: {Gamepad.current.leftStick.ReadValue()}");
 GUILayout.Label($"buttonNorth: {Gamepad.current.buttonNorth.isPressed}");
```
のようにGamepad.で取得。
キーボードはKeyboard.current、マウスはMouse.current、特殊ジョイスティックはJoystick.current

* Actionを使う

ここからがやや高度な使い方らしい。

空オブジェクトを作成、CreateActionsを行うと
`NullReferenceException UnityEditor.SerializedObject ...`
のエラーが出る。
検索して[ここ](https://answers.unity.com/questions/696790/nullreferenceexception-unityeditorserializedobject.html?_ga=2.190545133.739508777.1633352909-1986498316.1630399383)
を見ると
`when I restarted Unity the problem disappeared`
らしいので、Unityを再起動したら確かにException出なくなった。

少し下にいくと
`入力処理がC#コードのみで完結し、コードの静的解析が行われて存在しないActionを参照したとき等にエラーが発生するため、最もC#プログラマー好みの方法ではないでしょうか`
とあるので、とりあえず自動生成させた。
とりあえずRubyでこのイベントを拾って動かしたい。

こんな感じで

```
PlayerInput inputAction;
void Awake(){
    inputAction = new PlayerInput();
    inputAction.Enable();
}

void Update(){
    Vector2 move = inputAction.Player.Move.ReadValue<Vector2>();
    horizontal = move.x;
    vertical = move.y;
    ...     
```

書き換えると動かせた。
多分[この辺り](https://docs.unity3d.com/Packages/com.unity.inputsystem@1.0/manual/Actions.html)のドキュメントの参照も必要そう。
とりあえず十字キーは出来たので今日は満足。

試している方々の記事を見ると他のやり方もある模様だが、とりあえず今回はここまでで、次回は続きのスマホパターンまで見てみたい所。
【学習記録】HTML/CSS 10/4 ２日目

今日はほんとに少しだけです。
残業終わりの学習はしんどい…


##CSS
　HTMLと組み合わせて使用する。
　Webページのスタイル（色・大きさ・配置など）を指定し、ページをデザインする言語
　カスケーディング・スタイル・シート

##CSSの記述
　基本書式

　セレクタ{
　　プロパティ: 値;
　}

　言い換えると

　どこの{
　　何を:どうする;
　}

　具体的には

　h1 {
　　color: red;
　}

　h1要素（セレクタ）の色（プロパティ）を赤（値）にする
　と指定している

##文字の色を変える
●HTML
`<h1>タイトルタイトル</h1>`
`<p>本文本文本文本文本文</p>`

　h1{
　　color: #ff0000;
　}
　p{
　　color: #0000ff;
　}

h1は赤に、pは青になる

##CSSのコメント
/* */で囲うことにより、コメントは反映されない

`/* コメントはHTMLに反映されない */`


少しでも、ほんの少しでも向き合うことが大切。
また明日。
Ubuntu(Linux)でrtl8812auのドライバを入れてもWiFiが使えない時の対処

## 結論
Secure Bootをオフにしてドライバ入れ直したら動きました。（2日潰しました...）

## 環境
自作PC：SSD２つ入れてて片方Windows、片方Ubuntu20.04
WiFi受信機：BUFFALO WI-U2-433DHP

## 手順
### Secure Bootのオフ
https://wiki.ubuntu.com/UEFI/SecureBoot/DKMS

### ドライバインストール
こちらがStar数も多そうでした。

https://github.com/aircrack-ng/rtl8812au

## 備考
参考までにですが最初は有線LANも無かったのでひとまずiPhoneをUSBで繋いでテザリングで最低限のネット通信を行いました。(dkmsのインストールなど)
VSCodeの拡張を自作する：1_自作のコマンドを作って叩く

# この記事について
概要は
[概要のページ](https://qiita.com/wakakusa_ryuuzi/items/49d08f56a3ca653db025)
をご確認ください。


この記事で出来ることは、独自の名前のコマンドを設定してそれを起動するところまでです。
例として

- 拡張機能名：statusbar
- コマンド名：showTest

とします。

# 拡張機能開発環境の導入

[ドキュメントの該当箇所](https://code.visualstudio.com/api/get-started/your-first-extension)

ここに関しては、世の中に沢山記事があるのと上記を見ればわかりそうなので雑にかきますが

```sh
npm install -g yo generator-code
yo code
```

で対話型ジェネレータが動いて、HelloWorldポップアップするひな形ができます


# ファイル
とりあえず弄るのはこの２つです。

| ファイル名 | 中身 |
|-|-|
| package.json | 各種設定など |
| src/extensions.ts | 実装 |




# コマンドの作り方の仕組み

[ドキュメントの該当箇所](https://code.visualstudio.com/api/references/vscode-api#commands)

- コマンドの定義：package.jsonでする
- コマンドの実装：extensions.tsでする

という感じで、2か所をいじる必要があります。


## packeage.json側

### Activation Events

[ドキュメントの該当箇所](https://code.visualstudio.com/api/references/activation-events)

拡張機能が有効（active）になるイベントをここで定義します。
このタイミングでextensions.ts側の関数「active」が呼ばれます。

```json
"activationEvents": [
    "onCommand:statusbar.showTest"
]
```

この例では、下記のstatusbar.showTestコマンド実行時にアクティブになります。


### Contribution Points

[ドキュメントの該当箇所](https://code.visualstudio.com/api/references/contribution-points#contributes.commands)

「contributes」にコマンドの仕様を定義します。

```json
"contributes": {
    "commands": [
        {
            "command": "statusbar.showTest",   
            "title": "showTest",   
            "category": "test-command"
        }
    ]
}
```

みたいな感じでそれぞれ

| キー | 内容 |
|-|-|
| command | 拡張機能名.コマンド名　で、実装側に認識させるエントリポイント |
| title | コマンド自体の名前 |
| category | コマンドのカテゴリ　プレフィックスみたいになる |

という感じで、この場合下記の様に見えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2118353/f8350f3d-1d4c-39ca-4082-eb478775b2d0.png)


## extensions.ts側

vscode.commands.registerCommand( コマンド名, コールバック関数 )
な感じで、ここの中にコマンドの中身を書いていきます。

コマンド名のところに、commandを指定します
今回の例なら

```ts
let disposable = vscode.commands.registerCommand('statusbar.showTest', () => {
```

という感じです。


# コマンド実施

の詳細は省きます。
設定がちゃんとなっていると手順自体は初期のサンプルと同じで動いてくれるはずです。
VSCodeの拡張を自作する：0_序文とか目次とか

# この記事について
vsocodeの拡張を作りたいと思い立って調べたのですが

- 公式ドキュメントを直読みしてサクサク理解できるほど賢くない
- 調べて出てくる記事は「導入してとりあえずサンプルを動かしてみた」が多い

という感じで、実際にオリジナルコマンドを作り始めるにあたって手を動かすのに手間取りました。

そこで、実際に拡張機能を作っていく時に、公式のドキュメントを読むのが基本として、それを手助けできるような物を残しておきたいと思いました。
ドキュメントのどこを読んでいけば作れるか、という形で書いていきたいと思います。

自分も勉強しながら忘備録的に書いていくつもりなので、この記事を親にしてリンクしていこうと思います。
徐々にブラッシュアップもしていけたらと思います。探り探りなので間違いとかあればまさかり、コメント等いただけると幸いです。


# 目次（各記事へのリンク）
その1：[自作のコマンドを作って叩く](https://qiita.com/wakakusa_ryuuzi/items/ac6ec4a33a8a88fe36d8)
その2：[文章を取得する](https://qiita.com/wakakusa_ryuuzi/items/196593f279d6c4c64b0c)
その3：[イベントを取得する](https://qiita.com/wakakusa_ryuuzi/items/57fa9a35204d31719668)

# コード

この記事を書きながら作ったコードはここに置いておきます。

https://github.com/wakakusa-ryuuzi/vscodeExtensionTest
【Ruby】出力方法の種類　一覧

#課題
出力方法の種類の備忘録

#結論
全４種類あった。

```ruby:print#改行なし
  print "Hello, "
  print "Ruby"
  =>Hello, Ruby.
```

```ruby:puts#改行あり
  puts "Hello, "
  puts "Ruby"
  =>Hello, 
    Ruby
``` 

```ruby:p#文字列と数値を違った形で表示
  p "100"
  p 100
  =>"100"
     100
``` 

```ruby:pp#オブジェクトの構造を表示する際に、適当に改行を補って見やすく整形
  require "pp"

  the_japanese_syllabary = [
    {one: "あ行", two: "あいうえお"},
    {one: "か行", two: "かきくけこ" },
    {one: "さ行", two: "さしすせそ"},
  ]

  p the_japanese_syllabary
  pp the_japanese_syllabary
  =>[{:one=>"あ行", :two=>"あいうえお"}, {:one=>"か行", :two=>"かきくけこ"}, {:one=>"さ行", :two=>"さしすせそ"}]
    [{:one=>"あ行", :two=>"あいうえお"},
     {:one=>"か行", :two=>"かきくけこ"},
     {:one=>"さ行", :two=>"さしすせそ"}]
``` 

#参考
たのしいRuby第５版
WSL2上のUbuntuを使いやすいようにカスタマイズする

# 概要

WSL2上へ導入したUbuntuについて、使いやすいようにカスタマイズする。

(Windows 10環境へのWSL2導入手順は、[こちら](https://qiita.com/koh-kareem/items/9a581d6b6acd12c11145)をご参照。)

# 環境

- OS : Windows 10 Home
    - WSL2ディストリビューション：Ubuntu 20.04 LTS
    - Tera Term：Version 4.106

# 実施手順

## プロンプトの表示を恒久的に変更

既定では、プロンプトの表示がやたらと長ったらしいので、シンプルに「$」だけが表示されるように変更する。

```shell:プロンプト変更前・変更後
# 変更前
<user_name>@<host_name>:<current_path>$ 

# 変更後
$ 
```

手順は、以下の通り。

まず、Ubuntu上で以下のコマンドを実行して、bashrcファイルの編集画面を起動する。

```shell:実行コマンド
$ vi .bashrc
```

起動した編集画面にて、ファイルの末尾に下記内容を追記し、上書き保存する。

```shell:追記内容
export PS1="\$ "
```

以下のコマンドを実行して、bashrcに記載した内容を反映させる。

```shell:実行コマンド
$ source .bashrc
```

## デフォルトのエディタをvimに変更

「visudo」コマンドなどで既定で起動するエディタがnanoになっていたため、vimに変更したい。

そのために、Ubuntu上で以下のコマンドを実行する。

```shell:実行コマンド及び実行結果例
$ sudo update-alternatives --set editor /usr/bin/vim.basic
update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/editor (editor) in manual mode
```

## sudo実行時のパスワード認証を無効化

これも、いちいち鬱陶しいので無効化する。

以下のコマンドを実行し、sudoersファイルの編集画面を起動する。

```shell:実行コマンド
$ sudo visudo
```

起動したsudoersファイルにて、以下内容を追記し、上書き保存する。

```shell:追記内容
[設定対象のユーザ名] ALL=NOPASSWD: ALL
```

## パスワード認証によるssh接続設定

WSL2環境にteraterm経由で接続したいため、そのための設定を行う。

まず、ssh接続の際のパスワード認証を有効化するため、以下のコマンドを順に実行する。

```shell:実行コマンド
# sshd_configが格納されているディレクトリへ移動
$ cd /etc/ssh

# sshd_configのバックアップを取得
$ sudo cp sshd_config sshd_config_bk_`date +%Y%m%d`

# sshd_configの編集画面の起動
$ sudo vi sshd_config
```

sshd_configの記載を以下の通り修正し、上書き保存する。

```shell:修正内容
# 修正前
PasswordAuthentication no

# 修正後
PasswordAuthentication yes
```

以下のコマンドを実行して、変更箇所を表示する。

```shell:実行コマンド及び出力内容例
# 変更箇所を表示
$ diff sshd_config sshd_config_bk_`date +%Y%m%d`
58c58
< PasswordAuthentication yes
---
> PasswordAuthentication no
```

次に、ホスト認証鍵を作成するため、以下のコマンドを実行する。

```shell:実行コマンド及び出力内容例
$ sudo ssh-keygen -A
ssh-keygen: generating new host keys: DSA
```

最後に、以下のコマンドを実行して、sshサービスを再起動する。

```shell:実行コマンド及び出力内容例
$ sudo service ssh restart
 * Restarting OpenBSD Secure Shell server sshd  
```

これで事前設定は完了。

取得した情報を使って、teraterm にて接続を実行する。

|設定項目 |設定内容|
|:-------|:-------|
|ホスト|localhost|
|ユーザ名|[Ubuntuのインストール時に作成したユーザ名]|
|パスフレーズ|[上記ユーザのパスワード]|

そうすると、以下の通り接続ができた。

![20211004_teraterm.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622182/c5e0cbdc-2e23-79b9-988a-f09d41d53dbb.jpeg)

# 今後やりたいこと

- 他にも設定を変更しておいたほうがいい内容を見つけたら、この記事に追記していく。

# 参考文献

- [Bashプロンプトの変更 - Qiita](https://qiita.com/zaburo/items/9194cd9eb841dea897a0)
- [Ubuntu/Debianで「デフォルトエディタ」を設定する方法【決定版】](https://linuxfan.info/set-default-editor-ubuntu-debian)
- [【Ubuntu20.04】TeraTermでssh接続する方法](https://www.teamxeppet.com/teraterm-ssh/)
【Git】ブランチについて

#はじめに
今回は、ブランチを使うメリットとコマンドについて見ていきましょう。

#ブランチ（branch）
ブランチとは、プロジェクトの変更の履歴を枝分かれさせて記録する機能のことを言います。
大元のブランチから分岐させることで、チームの他のメンバーがファイルを変更しても、その影響を受けることなく開発を進めることができます。
つまり、複数人が並行して別の機能を開発することができるというメリットがあります。
また、マージ（merge）を行うことで、分岐したブランチを統合することができます。

#ブランチ関連のGitコマンド
##変更履歴の統合

```git:ターミナル
git merge <ブランチ名>or<リモート名/ブランチ名>
```

##ブランチの新規追加

```git:ターミナル
git branch <ブランチ名>
```

##ブランチの一覧表示

```git:ターミナル
git branch
git branch -a
```

##ブランチの切り替え

```git:ターミナル
git checkout <既存のブランチ名>
```

##ブランチ名の変更

```git:ターミナル
git branch -m <旧ブランチ名> <新ブランチ名>
```


##ブランチの削除

```git:ターミナル
git branch　-d <ブランチ名>
```

#おわりに
ブランチの概要やコマンドについて簡単に見ていきました。
Gitコマンドってたくさんありますね。
Wandbの使い方まとめ

#はじめに
機械学習に興味があり、最近勉強し始めましたが備忘録としてQuitaに記事を上げたいなと思って記事を書きました。もしなにか間違ってるところがあれば教えてくれるとありがたいです。
#wandbとは
そもそもwandbとは実験結果の管理やモデルの最適化を補助してくれるありがたいサービスなのです。実験結果を見直したいなと思ったとき、わざわざモデルを実行してmatplotlibとかで描画しなくても、いつでもWandbのサイトから見ることができるのが特徴です
さらにレポート機能みたいなのがあるので、大学生とかであれば研究発表としても使えるんじゃないでしょうか。(レポート機能はまだ使ってないので間違ってたらごめんなさい)

#こんな人向け
- web上で実験結果を保存していつでも見直せるようにしたい
- Wandbの使い方がいまいちよくわからない
とった人向けに作ってます。今回はWandbを使ったモデルの最適化とモデルの描画について書きたいと思います。
今回Kearsを用いてますが、Tensorflowとか別のフレームワークでも書けます。また気が向いたらそっち向けにも作ります

#準備
まずpipを使ってwandbをインストールします

```
pip install wandb
```
その後wandbでサイトから会員登録をしてください。会員登録はすぐできますし、gitとの連携とかですぐログインすることができます。

[会員登録](https://wandb.ai/site)

その次にターミナルで

```
wandb.login()
```
をすると、APIキーを打つような指示が出てくるのでそれに従ってAPIキーを打ち込んでください。右上の設定からAPIキーを得ることができます

#Wandbの実装


冒頭に以下のコードを記入します。

```python
import wandb
wandb.init(project = 'project')
config = wandb.config
```
projectには適当な名前を入れてください。これがプロジェクト名であり、プロジェクトごとにデータをまとめることができます。便利ですね。

次にconfigメソッドに保存したい引数をいれてください。このとき、configメソッドは辞書型で保存する必要性があるのでそこは注意してください。

```python 
CONFIG = dict(
    NUM_FRAMES = 10,
    BATCH_SIZE = 5,
    EPOCHS = 8,
    IMG_SIZE = 256,
    NUM_IMAGES = 64,
    lr = 1e-4
)
```
あとmodel.fitのcallbacksに一行追加するだけでできます(Kerasの場合)

```python 
model.fit(
    train_dataset,
    validation_data=valid_dataset,
    epochs=CONFIG['EPOCHS'],
    shuffle=True,
    verbose=1,
    callbacks = [WandbCallBack()],
)
```
callbacksをこんな感じで書くだけであとは学習結果をWandbに保存してくれます。
このときWandb上はこんな感じになってます。これでいつでも実験結果をweb上から見ることができます。ほんと数行でできるのはすごいですよね。

#Wandbを用いたグリッドサーチ

先ほどの結果を踏まえて、ちょっとパラメータ変えてみたいなってときにSweepというのを使います。これはWandbが勝手に先ほどの学習結果を踏まえてグリッドサーチをしてくれるっていう機能です。これは文献が少なくて少し苦労しました。

#Sweepの実装
まずWandbサイトのプロジェクトから以下の写真の左側のほうきみたいなマークを押してそのあと、右側のCreate sweepを押してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/823701/aa95e77e-23eb-4554-ee95-8dc040156873.png)

すると以下のようなものが出てくるので、initalize Sweepというボタンを押します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/823701/671cb801-927c-394c-5fca-c98fb586b48e.png)

すると、こんなページが開かれるのでここからyamlファイルをダウンロードします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/823701/e3e40b55-6375-16e1-caf3-74c5f56e3d60.png)

その後、その下に書いてあるコマンドを実行します

```
wandb sweep --update ユーザー名/プロジェクト名/id名 sweep.yaml
```

これであとは勝手にWandb側が実行してくれます。ちなみにpythonファイルとyamlファイルのフォルダの配置に気をつけてください。
グリッドサーチをしている最中ですが、こんな感じのプロットを勝手に書いてくれます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/823701/1be4b9c4-4239-c449-57e6-7d734675be07.png)

それと同時に、各パラメータがどれだけ影響しているのかといった情報まで、わかりやすくグラフ化してくれており、うまく扱えばパラメータモデルの精度向上に大きく役に立つかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/823701/85da781e-2392-be9d-f09c-96987e63efb0.png)


しかし問題点として、このグリッドサーチは永久に続くっぽいです。なので、

```
wand agent --count 回数 ユーザー名/プロジェクト名/sweep名
```
のように、countの引数で回数を指定してあげた方がいいかもしれないです。

あとは勝手にwandb側がやってくれるようですが、複数のパソコンを使って分担しながらグリッドサーチをすることが出来るっぽいです。これによって時間短縮がかなり出来るかも知れないので出来る環境がある方はやってみてください。
tabBarの角を丸くする

#今回の内容

<img width="150" alt="C9383B90-92F9-435F-9935-A85630711564_4_5005_c.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466343/88573cce-e715-27cd-33d0-152294b716c0.jpeg">

#コードと簡単解説

* `tabBar.layer.cornerRadius = 25.0`で角の丸みを設定

* `tabBar.layer.masksToBounds = true`で角丸に出来る様にします

* `tabBar.layer.maskedCorners = [.layerMaxXMinYCorner,.layerMinXMinYCorner]`で左上と右上の角を指定して、`.layer.cornerRadius`を適用します。

```Swift:
import UIKit

class TabBarViewController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()

        tabBar.barTintColor = .systemGray
        tabBar.tintColor = .white
        tabBar.unselectedItemTintColor = .systemIndigo
        
        tabBar.layer.cornerRadius = 25.0
        tabBar.layer.masksToBounds = true
        tabBar.layer.maskedCorners = [.layerMaxXMinYCorner,.layerMinXMinYCorner]    
    }
  
}
```
# 終わり
ご指摘、ご質問などありましたら、コメントまでお願い致します。
プログラミング学習は独学しかない

プログラミングは独学で学習する、というのがぼくの持論です。
独学するには以下の素質・能力が必要だと思うので列挙して説明してみます。

# プログラミング勉強以前の能力

プログラミング初心者に必要な独学で必要な力(能力)は、以下の3つだと思っています。

1. 分からないことを分からないと判断できること(説明できるまで分かったと言ってはいけない)
1. 検索力(全く知らない概念に対して、適切な単語を切り出して正確な情報を探し当てることができる)
1. 知らない概念をゼロから組み立てて体系的にまた正確に理解できる読解力

フロントエンド、バックエンド、デザイン、ネットワーク、サーバー、データサイエンスどの分野でも必要な初歩的な能力です。
ググってでてきた記事が100%正しいとは限りません。古い記事で最新の仕様でなかったり(ときにそれが致命的なバグだったりします)、間違った理解をして記事にしているひともいます。検索力はあとで説明します。

# プログラミングを仕事とするとき
加えてエンジニアとして仕事をするならば、

### 無知であるという自覚(謙虚さ)
できるエンジニアほど「プログラミングが簡単だ」と言っていない。某広告でほり◯もんが言っていることは信じてはいけない。

すべてを学ぶには時間が足りない...
- クリーンアーキテクチャ
- SOLID原則
- 要件定義
- アンチパターン
- アルゴリズム


### 素早く新しい技術を呼吸をするようにキャッチアップできる

学習する習慣をもつこと。
休日を休みとか思わず、わからないことや知りたいことを探求していく好奇心があること。

### 英語が読める
本当の最新技術はぜんぶ英語。
英語が読めなくても翻訳してでも読もうとする気があるか。

### 責任を果たす

嫌になってプロジェクトを途中で突然離任や退職したりしない。
バックレるなんてももっての他。論外。

### コードに責任を持つ
6000万ドルのbreak文事件(1990年AT&Tで実際に起きた損害賠償金)など、たった一行の間違いで大損害を起こします。
自分が書いたそのコードに責任を持てること。賠償責任能力ではなく、なぜこの実装をしたのか/検証(テスト)したのかが説明できればよいと思います。

### 複雑さを手懐ける
実際のコードは本や動画で勉強したコードよりもっと複雑に作用している。

### 仕事を楽しめるか
難しいことでもチャレンジできる、分からないことだらけでも問題を解決することを喜びに感じないと長続きしないです。
結局プログラミングを好きになれないのであれば別の職業を選択することをおすすめします。

### 専門性を極める
プログラマ、エンジニアは高度で専門的な技術職です。
アメリカだと弁護士や医者と同じくらいの地位にある職業です。
覚えるべき概念が多すぎます。わからないことだらけで、毎日勉強していてもまた新しい技術が湧いてきます。そこで嫌になってしまうなら向いていないので、別の業界へ行くことをおすすめします。

# 検索について

間違った記事が世の中に溢れていると言いましたが、どうしたらいいでしょうか。
結論から言うと、その答えは**公式サイト**や**審査を受けて公開された論文**を読むことです。

１次情報、2次情報、３次情報というのがあります（詳しくは自分でぐぐってください）。1次情報を基本的に信用しましょう。
Natureが発行する論文やAWS/Reactなどの公式サイトが1次情報です。公式が1番です。
(ただ、公式も間違っていることが少なかれ存在します。AWSの公式には書いてない仕様が存在したり。。。)

Qiitaや個人ブログなどで書かれている情報は公式から部分的に抜き出して書かれた情報の塊です。
読みやすかったり、わかりやすいのがメリットですが、古かったり主観的な情報で間違っていたりアンチパターンが平気で書かれている場合があります。
読んでもいいのですが、読むときは**必ず１次情報までさかのぼりましょう**。記事の最後に**参考文献/Reference**と書かれていると思います。リンクをクリックして引用元を確認する癖をつけておくとよいです。

重要なのは、自分が読んでいる情報がどういう性質のものかを見極めることが大事です。

# 意見

### 

ぼくはプログラマ/Webアプリ開発エンジニアとして10年の経験があり、現在はスタートアップで新規事業のプロダクションの開発を担っています。
この記事はぼくの経験に基づくプログラマの実態の一部分を紹介しました。

プログラマとして働くことはとても楽しいものです。新しいことを覚えてそれを実際に実装してユーザに使ってもらう、このワクワク感がやみつきです。
分からないコードが分かった時やバグが潰せた時、その爽快感がたまりません。10年やってても毎日成長している実感がもてます。

### プログラミングに興味がある方へ
ぜひチャレンジしてください。正直、優秀なエンジニアが不足しています。助けてほしいです。

### いまプログラミングを勉強中だという方へ
ぜひエンジニアとして働けるようにがんばってください。
ぼくは高卒で独学で勉強してITの世界へ飛び込みました。最初は何がなんだか分からずがむしゃらにインフラ、アプリ開発、デザイン、IoT機器の開発、マネジメントなど勉強していろいろな経験して3年くらいやって一人前になれました。いまはフリーランスとして活動していて、ベンチャー企業の新規事業で開発をやっています。10年経っても毎日が新しいことだらけです。

# プログラミングは独学でしか学べない

教室へ行ってもいいし、実際にエンジニアに指導してもらうのもよいです。ですが、最後は自分で調べて理解しないといけないです。
教えているひとも最低限ここは知っているというバイアスがあると思います。教えてもらって全部理解できるほど、ITの世界は甘くないです。専門的な用語がたくさんあり、IT企業ごとに習慣があり、毎日新しい技術が発表されてそれについていかないとエンジニアとして終わります。
独学でも十分に一人前のエンジニアになれます。ただし、積極的な自主学習と自分のレベルに合ったプロジェクトで経験を積むことが大事です。

そして、ITの技術は数学の勉強と同じで、**本(やネットの記事)を読んで理解することは不可能**です。
自分で**実際にコードを書いて実装しないと理解することができない**からです。
エンジニアが専門職であるという理由がここにあります。自分の目の前にある技術が、誰にでも理解できる技術であるとは限らないです。自分でなんとか理解して使いこなせるようにならないといけないです。使いこなすには作るしかないです。失敗して、失敗して、失敗して、そしてうまくいく。うまくいったらどうして動くのかがわかるようになる。この繰り返しです。数学は自分でたくさん問題を解いてレベルアップする、プログラミングも同じです。

なのでもっとも大事なのは**説明できること**です。なぜこの方法で実装したのか、ブラウザのレンダリングコストやパフォーマンス、可読性、セキュリティ、あらゆる要素を考慮してコードを実装して、レビューした時最悪バグが起きたときに説明できるようにならないといけないです。細かいところまで気を配る必要があります。
jsイベント間引き - ES2015以降 - (throttle+debounce)

## 環境

- IEを考慮しないモダンブラウザ
- webpack などビルドを使用しないシンプルなプロジェクト
- VS Code で構文チェックを有効にしても認識できる状態

> ライブラリを使うほどでないが、 throttle だけは使用したいので参考サイトを基に構文チェックで認識されるように修正

## 結論

```js
//@ts-check

class Sample {

    /** 間引き処理 */
    throttle = (() => {
        let time = Date.now();
        let lag = 0;
        let debounceTimer = 0;
        let debounceDelay = 16;

        /**
         * 間引き (throttle+debounce)
         * @param {()=>void} callback 間引き処理
         * @param {number} interval 間引き間隔 (default: 200ミリ秒)
         */
        const func = (/** @type{()=>void}*/ callback, interval = 200) => {
            lag = time + interval - Date.now();
            if (lag < 0) {
                callback();
                time = Date.now();
            } else {
                clearTimeout(debounceTimer);
                debounceTimer = setTimeout(() => {
                    callback();
                }, interval - lag + debounceDelay);
            }
        };

        return func;
    })();
}
```

## 参考元

> 1. https://qiita.com/akuden/items/5a24b0bd4b02b6756730
Quiztime 21st September 2021: Where is it?

#概要

皆さん、こんにちは。
ニャンダウです♪

OSINTのクイズ第3回目です。

今回の問題は画像の床、もしくは道路？？がどこなのか特定する問題です。

#問題

Where is it?

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">It‘s <a href="https://twitter.com/quiztime?ref_src=twsrc%5Etfw">@Quiztime</a> 🥳<br><br>🔎 Where is it?<br><br>✍️ Reply to me with your answer <br>🤝 Reply to all for collaboration <br>🌈 Good luck with the <a href="https://twitter.com/hashtag/MondayQuiz?src=hash&amp;ref_src=twsrc%5Etfw">#MondayQuiz</a> <a href="https://t.co/JMQ45UkMFL">pic.twitter.com/JMQ45UkMFL</a></p>&mdash; Julia Bayer (@bayer_julia) <a href="https://twitter.com/bayer_julia/status/1440042276709822465?ref_src=twsrc%5Etfw">September 20, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


#解答

結論から言うと、画像検索とGoogleですぐ見つかりました。

[https://www.alamy.com/stock-photo-berlinische-galerie-museum-of-modern-art-kreuzberg-berlin-germany-75066546.html](https://www.alamy.com/stock-photo-berlinische-galerie-museum-of-modern-art-kreuzberg-berlin-germany-75066546.html)

![スクリーンショット 2021-10-04 22.30.07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/848369/7eefa9e3-89c5-6243-b5f6-ea36c301ad3d.jpeg)

と言う訳で場所はベルリンのKreuzberg地区にある[美術館](https://foodyoushouldknow.com/2020/02/24/berlin-must-see-13-top-things-to-do-in-48-hours-in-berlin/)です。

![36584925874_fa6ea14e80_b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/848369/57843fe1-3a38-2e2e-18c1-26cb0909b594.jpeg)


#感想

20分くらいで終わりましたw
Docker Compose for Amazon ECSでAmazon ECS Execをする

## 経緯

Docker Compose for Amazon ECSをつかってコンテナを立ち上げたはいいものの、作り直しのたびにコンソールやコマンドでECS Execの設定をしていくのは面倒くさい！最初から設定された状態で立ち上げたい！

## 結論から

docker-compose.ymlの主要な箇所だけ取り出すとこんな感じです。
serverという名前でサービスを作っています。

```docker-compose.yml
services:
  server:
    # image指定とかは略
    x-aws-role:
      Version: '2012-10-17'
      Statement:
      - Effect: Allow
        Action:
          - ssmmessages:CreateControlChannel
          - ssmmessages:CreateDataChannel
          - ssmmessages:OpenControlChannel
          - ssmmessages:OpenDataChannel
        Resource: '*'
x-aws-cloudformation:
  Resources:
    ServerService:
      Properties:
        EnableExecuteCommand: true
```

## 説明

ECS Execを利用するには2つ準備が必要です。

- ECSタスクにSSMセッションマネージャー関連のIAMロールを与える
- ECSサービスでのenableExecuteCommandの設定をtrueにする


ECSタスクへのIAMロールに関しては`x-aws-role`に書くと付与できます。

`enableExecuteCommand`については`x-aws-cloudformation`の箇所に設定を書けば、docuer compose up時に自動で変換されるCloudFormationのテンプレートのそこの部分だけ上書きされます。

## おわりに

これでコンテナに入り放題！

ECS全然よくわからないで使っているので、用語の間違いとかあったらご指摘ください。

## 参考

ECS Exec

https://dev.classmethod.jp/articles/ecs-exec/

https://tech.smartcamp.co.jp/entry/try-amazon-ecs-exec

Docker Compose for Amazon ECS

https://matsuand.github.io/docs.docker.jp.onthefly/cloud/ecs-integration

「IAM ロール」の項目と、その下の「CloudFormation テンプレートの調整」が詳しかったです。
thisを使う！！

▪️ thisとは
　PHPでスコープ外で定義された変数を利用するための擬似変数。
　簡単に言うなら英語の省略に近いイメージ。

例えば、あなたは長い映画を見るのが好きですか？と聞かれ、私は長い映画を見るのが好きです。と答えているとめんどくさいと思います。
好きです！と省略したいですよね？
その感覚で使うのがthisになります！

＜書き方＞
下記のようになる:writing_hand_tone2:


public class Monster {
    int hp = 100;
    int mp = 20;
    Monster(int hp ,int mp){
        this.hp = hp;//1
        this.mp = mp;
    }

コード引用元：https://qiita.com/kajirikajiri/items/85b911688155f9fc251a

今日の投稿は以上です。

wagaでした！！
Quiztime 26th August 2021: What kind of ebook and what book did you publish next?

#概要

Hello, everyone!!
ニャンダウです♪

今回はOSINTのQuizitimeの２回目です。

内容は画像のebookに書かれている文字の本を特定して、その本の著者の次に出版した本を答える問題です。

#問題

2021年8月26日、Twitterの#Thursdayquizにて、以下の問題が投稿されました。

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Time for another <a href="https://twitter.com/hashtag/Thursdayquiz?src=hash&amp;ref_src=twsrc%5Etfw">#Thursdayquiz</a>!<br><br>1: What&#39;s the next book in this series called?<br>2: What ebook reader is this?<br><br>🤝 Reply all = collaboration<br>👇 Reply in thread = answers<br>🔃 Retweet = invite others<br>👣 Follow <a href="https://twitter.com/quiztime?ref_src=twsrc%5Etfw">@quiztime</a> = more <a href="https://twitter.com/hashtag/verification?src=hash&amp;ref_src=twsrc%5Etfw">#verification</a> <a href="https://t.co/2m3ZFnZiF1">pic.twitter.com/2m3ZFnZiF1</a></p>&mdash; 𝕊𝕖𝕔𝕥𝕠𝕣𝟘𝟛𝟝 (@Sector035) <a href="https://twitter.com/Sector035/status/1430879774986194956?ref_src=twsrc%5Etfw">August 26, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


1:このシリーズの次の本は何と呼ばれていますか？
2:これはどの電子書籍リーダーですか？


#調査1

まず画像の文字をGoogle DriveのGoogle Documentで文字認識してそのまま抽出した文字をGoogle検索しました。
適当に検索すると以下のサイトを見つけました。
[https://www.shmoop.com/study-guides/literature/neuromancer/quotes/drugs-and-alcohol](https://www.shmoop.com/study-guides/literature/neuromancer/quotes/drugs-and-alcohol)


Neuromancerとは？？
他のサイトを検索するとGoogle Booksにヒットしました。
どうやら「Neuromancer」というとある本で、著者はWilliam Gibsonという人です。

「William Gibson」と検索すると[Wikipedia](https://en.wikipedia.org/wiki/William_Gibson)が出てきました。

![スクリーンショット 2021-10-04 22.00.59.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/848369/db84f235-e30a-1bf9-78eb-61e2a0d59e99.jpeg)

著者が出版した本のリスト一覧が書かれています。
Neuromancerの２年後に出版した「Count Zero」が答えです♪

#調査2

次はebookの端末を調べます。

YandexとGoogle画像検索でヒットしました。

どうやらこの[PocketBook 302](https://www.amazon.com/gp/product/B003BNL3AY?tag=mensleatherbelts-20)という端末で間違いないようです。
![スクリーンショット 2021-10-04 22.06.30.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/848369/eaa32a15-16b0-d542-9888-a3e8085a402d.jpeg)

#感想

今回は文字認識とGoogle検索を駆使した少し簡単な問題でした。
文字認識は初めて使ったのでいい勉強になりました♪