OmniAICreator/Qiita-1.07M huggingface dataset:
【NumPy】多次元配列の単一要素を参照するときは括弧を一つで指定した方が速い

# はじめに
NumPyで2次元配列の単一の要素を参照するとき、何気なく``array[y][x]``のように``[][]``を二つ使っていませんか？

実は、多次元配列を使うときは、``array[y, x]``のように``[]``を一つで書いた方が処理速度が速いです。本記事では、その事について実際に計測して比較しました。

# 実装
Google Colabで作成した本記事のコードは、[こちら](https://colab.research.google.com/drive/1r1r9hy4COyxg8AnO5uawGdca4jSf3Z1r?usp=share_link)にあります。
## numpyのインポート
```python:
import numpy as np
```
NumPyのバージョンは1.21.6で実装しています。

# 結果
Google Colabのセル内を[timeit](https://docs.python.org/3/library/timeit.html)で計測しました。100ループ(``-n 100``)を10セット(``-r 10``)した結果を表記しています。

## 2次元配列
```python:array[y][x]
%%timeit -r 10 -n 100
array = np.zeros((100, 100))
for y in range(array.shape[0]):
    for x in range(array.shape[1]):
        array[y][x] = 1
# -> 2.73 ms ± 91.9 µs per loop (mean ± std. dev. of 10 runs, 100 loops each)
```

```python:array[y, x]
%%timeit -r 10 -n 100
array = np.zeros((100, 100))
for y in range(array.shape[0]):
    for x in range(array.shape[1]):
        array[y, x] = 1
# -> 1.74 ms ± 114 µs per loop (mean ± std. dev. of 10 runs, 100 loops each)
```

||平均|
|:-:|:-:|
|array[y][x]|2.73 ms|
|array[y, x]|**1.74 ms**|

``array[y, x]``が一番速い結果になりました。

## 3次元配列
```python:array[z][y][x]
%%timeit -r 10 -n 100
array = np.zeros((20, 20, 20))
for z in range(array.shape[0]):
    for y in range(array.shape[1]):
        for x in range(array.shape[2]):
            array[z][y][x] = 1
# -> 3.55 ms ± 247 µs per loop (mean ± std. dev. of 10 runs, 100 loops each)
```
```python:array[z, y][x]
%%timeit -r 10 -n 100
array = np.zeros((20, 20, 20))
for z in range(array.shape[0]):
    for y in range(array.shape[1]):
        for x in range(array.shape[2]):
            array[z, y][x] = 1
# -> 2.78 ms ± 247 µs per loop (mean ± std. dev. of 10 runs, 100 loops each)
```
```python:array[z][y, x]
%%timeit -r 10 -n 100
array = np.zeros((20, 20, 20))
for z in range(array.shape[0]):
    for y in range(array.shape[1]):
        for x in range(array.shape[2]):
            array[z][y, x] = 1
# -> 2.85 ms ± 261 µs per loop (mean ± std. dev. of 10 runs, 100 loops each)
```
```python:3次元配列[z, y, x]
%%timeit -r 10 -n 100
array = np.zeros((20, 20, 20))
for z in range(array.shape[0]):
    for y in range(array.shape[1]):
        for x in range(array.shape[2]):
            array[z, y, x] = 1
# -> 1.82 ms ± 275 µs per loop (mean ± std. dev. of 10 runs, 100 loops each)
```

||平均|
|:-:|:-:|
|array[z][y][x]|3.55 ms|
|array[z, y][x]|2.78 ms|
|array[z][y, x]|2.85 ms|
|array[z, y, x]|**1.82 ms**|

括弧の個数に応じて処理速度が低下し、``array[z, y, x]``が一番速い結果になりました。

# 理由
理由としては、``aray[y][x]``とすると、最初に座標``y``に属する一次元配列が返され、その返された配列の中で``x``の座標を指定しています。そのため、一度に``aray[y, x]``で座標を指定する方が処理速度が速いです。

この事は、NumPy公式に

https://numpy.org/devdocs/user/basics.indexing.html

書かれています。

# まとめ
NumPyで多次元配列を使うときは、``[]``を使うとその都度配列が返されるため処理速度が遅くなることを比較しました。特に3次元配列の結果では、括弧の個数に応じて処理速度が低下していることがわかりました。
NumPyで多次元配列を参照するときは、``[]``は一つで指定しましょう。

# 参考資料
https://numpy.org/devdocs/user/basics.indexing.html
slapdの主なコマンドラインオプション

●slapdの主なコマンドラインオプション
・−4 IPv4のアドレスのみ受け付ける
・−6 IPv6のアドレスのみ受け付ける
・-d 数　デバッグレベルの指定
・-f ファイル名　設定ファイルの指定
・-u ユーザ名　指定したユーザの権限でslapdを起動する
・-g グループ名　指定したグループの権限でslapdを起動する
・-r ディレクトリ名　ルートディレクトリとするディレクトリの指定
wasmtimeのドキュメントを読む

WASMの理解を深めるために wasmtime のドキュメントを読む。英語の技術文章を読む練習にもなるので一石二鳥。

## wasmtime.dev
https://wasmtime.dev/

- wasmtime と rust をインストール (コマンド一発で簡単なのでWSL2に入れた)
- hello.rs を `rustc hello.rs --target wasm32-wasi` で wasm にビルド
- wasmtime で実行 (wasmer でも同じく実行できた！)

##  wasmtime-rb
https://github.com/bytecodealliance/wasmtime-rb
yard: https://bytecodealliance.github.io/wasmtime-rb/latest/

Rubyスクリプトから WASM を実行できるgem。内部実装的には各処理系毎のwasmtimeを呼んでいるだけっぽいがインストールはgemに隠ぺいされているので便利。

```ruby
require "wasmtime"

engine = Wasmtime::Engine.new
mod = Wasmtime::Module.from_file(engine, "hello.wasm")

linker = Wasmtime::Linker.new(engine, wasi: true)

wasi_ctx = Wasmtime::WasiCtxBuilder.new
  .set_stdin_string("hi!")
  .inherit_stdout
  .inherit_stderr
  .set_argv(ARGV)
  .set_env(ENV)
store = Wasmtime::Store.new(engine, wasi_ctx: wasi_ctx)

instance = linker.instantiate(store, mod)
instance.invoke("_start")
```

ドキュメントが若干不足しているがrustのcrateが充実しているのでそっちのドキュメント読むのがよさそう。yard内に同じ概念の型がリンクを貼っている。

https://docs.rs/wasmtime/latest/wasmtime/struct.Engine.html

## まとめ
サンプルでも紹介されているが markdown パーサーみたいなやつは一回実装書けばどこの言語でも安定して使えるようになって便利では。RubyやPythonだとC拡張に相当するものをWASMで書けばOS毎に別の実装を使わずに済む。

例えば https://github.com/silvia-odwyer/photon を内部に抱いた画像操作用のgemとか作れるだろうか。
Lighthouseのパフォーマンスのスコアは、計測するデバイスによって変わる！

Web Vitalsのスコアを計測するためにLighthouseを用いることがあると思うのですが、このスコアは実行するデバイスのCPUスペックによって変化するので注意が必要です。

一般的に、Lighthouseはリアルユーザー環境での計測と違い、計測ごとのスコアのブレが少ないという特徴があります。
ただし、計測ごとにスコアのブレが少ないものの、そもそものスコアの値は環境により異なります。
これは、Lighthouseで計測するときのスロットリング方法によるものです。

(リアルユーザー環境とラボ環境での計測の違いについてはこちらをご覧ください)

https://qiita.com/kyntk/items/2086ece17387dccea61c

## Lighthouseで計測するときのスロットリング方法

https://github.com/GoogleChrome/lighthouse/blob/main/docs/throttling.md

Lighthouseでは、計測の際にスロットリングを行います。
例えば、Mobile Deviceを想定してLighthouseを実行する時に、NetworkスロットリングとCPUスロットリングが行なわれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143317/fc2f37e9-7e4b-0595-d641-2a775729b6ea.png)

実際の設定値はこちらで確認できます。

https://github.com/GoogleChrome/lighthouse/blob/v9.6.8/lighthouse-core/config/constants.js#:~:text=of%204G%20connections.-,mobileSlow4G,-%3A%20%7B

このうち､CPUスロットリングはホストのデバイスのスペックを基準に相対的に遅くすることで実現しています。

## 実際のユーザーの使うデバイスと、シミュレートする環境での差分に注意する

そのため、CPUスロットリングでシミュレートしているデバイスと、実際のユーザーの使うデバイスのスペックに乖離がないかを確認しないと、スコアと実態の乖離が生まれる恐れがあります。

Lighthouse BenchmarkIndexという指標で表されているのですが、これを確認しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143317/6d897d46-5e5a-2c6f-5cbc-21c1023cf67b.png)

ちなみに、手元のM1 Macbook Airで計測してみるとこのような値になりました。
BenchmarkIndexはLighthouse実行後にフッターに表示されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143317/e087e12e-4447-aa65-399d-772a4c59fab6.png)

このBenchmarkIndexを基準にMobile環境では4倍遅くして計測しています。
しかし、以下の表にあるように、元々の計測環境がHigh-End Desktopなのか、Low-End Desktopなのかによって、4倍遅くしたときにMid-Tier Mobileスペックになるのか、Low-End Mobileスペックになるのかに違いが生まれてしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143317/4a96228f-444e-d59b-9ebb-016ac801a352.png)

また、このMid-Tier Mobile、Low-End Mobileとしている基準も、2017年の統計結果となっている点にも注意が必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143317/3faf6960-eb17-85c2-97f8-f166eca9d613.png)

つまり、年々デバイスのスペックが上がっている点も考慮に入れたほうがよさそうです。
例えばグラフを見ると、比較されているiPhoneは「iPhone 8」のようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143317/e7b04380-7cd3-30bf-5f8d-06809bc03e52.png)

https://web.dev/optimizing-content-efficiency-javascript-startup-optimization/

実行するCPUのスペックが異なると、JavaScriptの実行速度が変わることからスコアに大きな影響が予想されます。

スコアがどのスペックで計測されたものなのかを知り、リアルユーザーのデータと突き合わせて差分を把握しておきましょう。

## 参考

- [lighthouse/throttling.md at main · GoogleChrome/lighthouse · GitHub](https://github.com/GoogleChrome/lighthouse/blob/main/docs/throttling.md)
- [JavaScript Start-up Optimization](https://web.dev/optimizing-content-efficiency-javascript-startup-optimization/)
- [The cost of JavaScript in 2019 · V8](https://v8.dev/blog/cost-of-javascript-2019)
- [JavaScript Start-up Performance. Update: The Cost Of JavaScript In 2019… | by Addy Osmani | reloading | Medium](https://medium.com/reloading/javascript-start-up-performance-69200f43b201)
- [Can You Afford It?: Real-world Web Performance Budgets - Infrequently Noted](https://infrequently.org/2017/10/can-you-afford-it-real-world-web-performance-budgets/)
awslogsが落ちる

awslogs　のプロセスがよく死ぬので自動起動するスクリプトを作ろうとしたら、すでに存在していた。

`/usr/sbin/awslogs-nanny` がそれなのだが、

`mkdir: cannot create directory ‘/var/lock/awslogs.lock’: File exists`
でロックファイル（ディレクトリ）が存在していると起動に失敗する。ので、存在すれば削除する部分を追加。

```bash:/usr/sbin/awslogs-nanny
#!/bin/sh
# Version: 1.1.2-rpm

# This script will restart the awslogs service if it has died

service awslogs status >/dev/null
status=$?

if [ "$status" -eq "1" -o "$status" -eq "2" ]; then
    if [ -e /var/lock/awslogs.lock ]; then
        rmdir /var/lock/awslogs.lock
    fi

    service awslogs restart
fi
```

とりあえずこれで様子を見てみる。
Kubernetesリソースメモ

# 自己紹介
初めまして。私は都内でwebエンジニアをしています。

今の会社にインターンとして経て、入社しました。

業務では、Nuxtjs, Golang, Kubernetesを用いて運用保守開発や

最近はPandasを用いてデータ分析など日々苦戦している若輩者です。

## 背景

以外と忘れがちなリソースについて、まとめました。

## 対象としている人

Kubernetesを学習途中の人、またこれからKubernetesを学習しようとしている人

# リソース

## Pod

PodはKubernetesにデプロイ出来る最小単位

- コンテナやボリュームの集まり

## Deployment

- 新しいReplicaSetを作成したり、既存のDeploymentを削除して新しいDeploymentで全てのリソースを適用することができる

## ReplicaSet

- どんな時でも指定された数のPodのレプリカが稼働することを保証する
- `spec.template`をハッシュ値で管理しているため、ロールアップ・ダウンによる変更に即座に対応できる。

## Ingress

- IngressはHTTPやHTTPSの外部アクセスを制御するオブジェクト
- Load Balancerの役割をしている。

## Service

- 動的にIPAddressが変更されるPodへの接続を解決してくれる抽象的なオブジェクト
- Podの集合で実行されているアプリケーションをネットワークサービスとして公開する抽象的な方法

役割
- Pod,Nodeの存在を抽象化し、Podとの通信に単一のエンドポイントを提供する

## Volumeについて

コンテナのデータは一時的なもので、Pod/コンテナが削除されるか、コンテナがクラッシュした場合コンテナのデータは消えてしまう。
そこでVolumeを使う
- メリット
  - Volumeはデータの永続化をしてくれる。 永続化したいデータは指定したVolumeに保存することで削除やクラッシュした際でもデータが残る。
  - また、Volumeは別の目的でも使用される。それはPod内でのコンテナ間のデータ共有だ。
  - Pod内のコンテナはVolumeを通してデータを共有することが出来る。

### 種類

- emptyDir
  - Podがノードに割り当てられたときに最初に作成され、そのPodがそのノードで実行されている限り存在する
  - 名前が示すようにemptyDirボリュームは最初は空
  - Podが削除された際に対象のVolumeのデータも削除される。 よってPod内のコンテナ間のデータ共有のみで使用
- hostPath
  - データが永続化されている(Podが削除されてもデータは消されない)
  - Kubernetesが実行されているサーバーにデータが置いてある

## ConfigMap
- 機密性のないデータをキーと値のペアで保存するために使用されるAPIオブジェクト

## Secret
- Secretとは、パスワードやトークン、キーなどの少量の機密データを含むオブジェクト
- PodがSecretを使う方法は3種類がある。
  - ボリューム内のファイルとして、Podの単一または複数のコンテナにマウントする
  - コンテナの環境変数として利用する
  - Podを生成するためにkubeletがイメージをpullするときに使用する

## HorizontalPodAutoscaler
- Deployment、ReplicaSetまたはStatefulSetといったレプリケーションコントローラ内のPodの数を、観測されたCPU使用率（もしくはベータサポートの、アプリケーションによって提供されるその他のメトリクス）に基づいて自動的にスケールさせる
- podの負荷に応じて自動的にpodの数を増減させる

## PodDisruptionBudget
- Podの最小の有効状態や最大の無効状態の数を指定する
- Podの管理対象はLabelSelectorで指定する
- フィールドのメモ
    - spec.maxUnavailable : Eviction実行時にPodを無効状態にしていい最大数を指定する。絶対値か百分率で指定する。
    - spec.minAvailable : Eviction実行時にPodを有効状態にしておく最小数を指定す る。絶対値か百分率で指定する。
    - spec.selector : このBudgetを適用する対象のPodを選択するLabelSelectorを指定

## CronJob
- CronJobはJobをcronのように定期実行するためのKubernetesのWorkloadリソース
  - 時間ベースのスケジュールでJobを作成するKubernetesオブジェクト
- concurrencyPolicy Jobの並行実行についてのポリシーを指定できる
  - Allow
    - 並行なJobの実行を許可するポリシー
  - Forbid
    - 前回のJobがまだ実行中で完了してない場合、スケジュールされたJobはスキップされる
  - Replace
    - 前回のJobがまだ実行中で完了してない場合、前回のJobをキャンセルし新しくスケジュールされるJobに置き換える

## Job
- 一つ以上のPodを作成することである特定数のPodが正常終了するまでリトライしながら処理を実行するKubernetesのWorkloadリソース
  - Podの実行が失敗したり削除された場合はJobは新たにPodを起動する
  - 平行に複数のPodを起動することも可能
  - 指定された数が正常に終了した際にJobが完了
  - Jobを削除するとそのJobによって作成されたPodも削除される

## Namespace

- 同一の物理クラスター上で複数の仮想クラスターの動作をサポートする
  - `kubectl api-resources --namespaced=true`でどのリソースが適応なのか確認できる

# おまけ

Manifestについて簡単なメモです。

## Manifest

Podを作成するにはKubernetesのManifestファイルを作成する必要がある。

### 共通部分のメモ

- apiVersion
  - apiVersion はオブジェクトのSchemaのVersionを指定する
- kind
  - kind は作成するObject名を指定する。指定については対象のObjectのKindを参照する。
- metadata
  - MetadataのnameでResourceの名前を指定する。
- spec
  - オブジェクトの期待する状態を定義する
  - name はPod内でのコンテナ名を指定する。このnameはPod内でユニークである必要がある
  - image はイメージ名を指定する
KubernetesのLifecycle学習メモ

# 自己紹介
初めまして。私は都内でwebエンジニアをしています。

今の会社にインターンとして経て、入社しました。

業務では、Nuxtjs, Golang, Kubernetesを用いて運用保守開発や

最近はPandasを用いてデータ分析など日々苦戦している若輩者です。

## 背景

Kubernetesのライフサイクルが個人的に忘れがちなので、簡単にまとめました。

## 対象としている人

Kubernetesを学習途中の人、またこれからKubernetesを学習しようとしている人

## Lifecycle

Podにはいくつかの phase がある。
- Pending
  - Kubernetesによって承認されたが、一つ以上のコンテナが作成されていない状態。ImageのPullやInit Containerの処理中がこの状態にあたる
- Running
  - コンテナが作成され、少なくとも1つのコンテナが実行されているか開始・再起動中の状態
- Succeeded
  - Pod内の全てのコンテナが正常に終了し、再起動されていない状態
- Failed
  - Pod内の全てのコンテナが終了し、少なくとも1つ以上のコンテナの終了ステータスが0以外だったか、Kubernetesによって強制終了させられた場合この状態になる
- Unknown
  - 何らかの理由によりPodのサーバーと通信が失敗し、Podの状態を取得できなかった際の状態
## Lifecycle Events
コンテナが開始された際とPodが削除される際にHookして任意の処理を実行することが出来る
- postStart
  - コンテナが作成された後、即座に実行される。このHandlerが失敗した場合終了させ、 restartPolicy に従い再起動させる
- preStop
  - コンテナが終了される前に実行される。コンテナのルートプロセスに対して SIGTERM が送出される前にこのHandlerが実行される。
  - preStop が定義されている場合それを実行する。 ここでコンテナの終了処理を行うが、 preStop が先に終了してしまうとコンテナ側が処理中だとしてもKubernetesはコンテナに対してSIGTERMを送信してしまう。 これを防ぎたい場合は、 preStop 側でSleepさせるなどの待機処理を入れて待たせる必要がある。
## Lifecycle Handler
postStart や preStop に指定できるHandlerの種類は以下の通り。
- exec
  - コンテナ内でコマンドを実行
- httpGet
  - HTTPのGETリクエストを発行
英語リスニングについて考えていること

# 概要
英語リスニングについてなぜ自分が苦手としているのかを文書化して考えをまとめていく。

# まず初めに
よく言われるのが「発音できない音は聞き取れない」ということだが、これは半分正解で半分不正解だと考えている。
なぜならば自分が今まで見てきた英語話者でジャパニーズアクセントで話しているが、英語で円滑なコミュニケーションを行っている人を多数見てきたからだ。
程度の差はあれ、帰国子女以外はみんなジャパニーズアクセントを話している。

# リスニングの中身を分類する
ひとえにリスニングと言ってもその中身は複雑な技能で成り立っている。
　・音自体が理解できること
　・聞いたことの意味を理解すること
　・重要なところがどこかを理解すること
　・ピッチが上るのか下がるのか？
　・どのようなリズムで話されているか？

自分はそもそも英語がごにょごにょ聞こえてどうしようもないのだが、「リズム」「語順感覚」「文法知識」が不足しているのではと考えている。

# 少ないヒントから理解するという考え方
同じ英文を２度聞いたら理解できるということは、英語が聞き取れているということとは全く違う。
例えば
・まずは「I」から文章が始まりますよ
・趣味について話していますよ。
・二人の人間が短いセンテンスを一往復する音声ですよ。（Toeic試験）
というヒントが与えられた場合、リスニングの難易度は大きく下がる。

２度聞くということはあまりにも多くのヒントが与えられている。
より少ないヒントで聞き取れる必要がある。


# 実際の会話の際は音以外で状況を判断する。
ネイティブの人と話す際は相手が何を言っているか分からなくても言いたいことが大体わかる。

それは「シチュエーション」「声色」「使用されている単語」「表情」「ボディランゲージ」などから理解している。
上記でも書いているが実際の会話では音声以外のヒントがたくさんあるのだ。

浅草駅の前でスマホを見ながら困っている外国人がいたら、何が言いたいかは話さなくても分かるだろう。


# 映画の英語と友人の英語とビジネス英語
どの媒体で英語を聞くかで聞き取れる難易度が大きく変わってくる。
例えば映画の英語リスニングの難易度はかなり高い。シチュエーションは完全に理解しているのにどのようなセリフか理解できない。
（字幕を表示して聞こえた気になっているのは、100%聞こえた気になっているだけだ）

多分これがネイティブの通常の話し方なのだろう。
日本にいる外国人やToeic試験での英語は日本人向けに手加減されていることは間違いない。

# 音声変化
本屋に行くと音声変化が分かれば英語が聞き取れるという本が山のようにある。
もちろん重要なことだが、音声変化を理解しただけで英語が理解できる訳が無い。
上で書いたジャパニーズアクセントの話もそうだが、音声変化を無視してもコミュニケーションはできてしまう。

# 短い文章ほど聞きやすい
自分の感覚では7単語以上で構成される文章になると聞き取れる率が大きく下がる。また短い文章でも相手が複数文章を連続で話した場合でも分からなくなってしまう。
ここから想定されるのは、頭の中で英語を日本語に変換する時間がかかっているのではないかと思う。
大人になるまで日本語でしか考えていないのだから英語を英語で理解するというのはハードルが高すぎる気がする。
これについては英語を頭から理解していくトレーニングをもっとやろう。

# 文中の単語を拾え
文章の中で聞き取れた単語から内容を想像すればいいというリスニング方法があるが、これも半分正解で半分不正解だと思う。
そもそも音の弱形化やリダクションなどがあるいじょう、頭から英語の流れを理解しないと正確な音はわからない。
（「I'm awake」と聞いて「マウェイク」ってなんだ？ってなるような感じだ）
しかし単語が聞き取れればそこから内容を想像することは可能だ。

Could I borrow some money, please?
ここで「borrow」が「ボー」のように聞こえてもmoneyって言ってるから、可能性としてはborrowだろうなと想像がつく。


# 英語の語順感覚
かの名著「一億人の英文法」でかなり言及されている語順感覚。
実際日本人にとってこれが身に付けば英語は理解できるようになるのではないかを思っている。
特にスピーキングにおいて大事な要素であるが、4技能は密接に関係しているためリスニングにおいても要素であることは間違いない。
まずは文章のはじめ部分を聞き取り、主語、動詞を理解できれば何が言いたいかは容易に理解できる。


# 終わりに
上記のようなことを考えて勉強を行っているが、
英語を話せる人たちの中にはそのような細かいことを考えずに話していれば勝手に話せるようになるという人たちがいる。
しかしそれでは話せるようになるまでに心が折れてしまうだろう。
昨日より出来ることを増やしていき、少しずつ上達できるように頑張ろうと思う。


今後、本記事い追記をしていき考えをまとめていければと考えている。
jestのdescribeやitに赤線が出る

## エラー内容

[ドキュメント](https://nextjs.org/docs/testing#creating-your-tests)を参考にNextでjestを導入したところ、VSCodeで`describe`や`it`で eslintエラーが出ていた 

エラー文言は
```
'describe' is not defined. eslint(no-undef)`
```

実際のコード | エラー内容
--- | ---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562718/31d402bb-6d2c-5758-26b6-f3374f0d0ee3.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562718/a9d129b6-7556-8ce1-ee68-e3c9b8ce102d.png)

# 解決方法
eslint-plugin-jest をインストールして、設定ファイル(.eslintrc.js)に追記するので解決

1. eslint-plugin-jest をインストール
    ```
    $ npm i -D eslint-plugin-jest
    ```
1. 設定ファイル(.eslintrc.js)に追記
envに`'jest/globals': true`をpluginsに`'jest'`を追加

以上で解決


# 参考
https://oisham.hatenablog.com/entry/2019/08/20/111826
paizaラーニング レベルアップ問題集 スタック・キューメニュー応用編 JavaScript 満員エレベーター

満員エレベーター (paizaランク B 相当)

https://paiza.jp/works/mondai/stack_queue_advanced/stack_queue_advanced__full_elevator

# 解答例(C++の場合参考)
エレベーターをスタックと見なします。
rideでのw_1 w_2 ... w_Nをスプレッド構文[...w]に納めた。
get offはただpopをk回繰り返した。
```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

//乗り降りの回数 N とエレベーターの重量制限についての値 X
const [n, x] = lines[0].split(" ").map(Number);
let customer_sum = 0;//乗車人数
let kg_sum = 0;//合計体重

let elevator = [];//エレベーター、スタックで扱います。

//エレベーター乗り降り
for (let i = 1; i <= n; i++) {
  const Q = lines[i].split(" ").map((v, i) => i === 0 ? v : Number(v));

  if (Q[0] === "ride") {
    const [_, N, ...w] = Q;
    //エレベーターに乗る
    for (let j = 0; j < N; j++) {
      //重量制限以内
      if (kg_sum + w[j] <= x) {
        customer_sum++;
        elevator.push(w[j]);
        kg_sum += w[j];
      }
    }
    
  } else {
    //k人降りる
    const [_, k] = Q;
    for (let j = 0; j < k; j++) {
      kg_sum -= elevator[elevator.length - 1];
      elevator.pop();
    }
    customer_sum -= k;
  }
}

console.log(customer_sum);
console.log(kg_sum);
```

customer_sumを無くして、代わりにelevator.lengthの出力でも大丈夫。

k人降りるところのfor内は、popの戻り値が末尾の値なので、以下のようにも書ける。
```javascript
kg_sum -= elevator.pop();
```
socket.ioを利用したアプリのデプロイをしたい(攻略編)

昨日、サーバーサイドがあるウェブのデプロイに苦戦したが振り返ると検索の仕方が悪かった。

サーバーサイドがあるウェブサイトの公開という部分がメインでsoket.ioを利用しているという点はメインではない。

ということで、Node.jsを含めての検索に変えてやり方を模索した。

https://yu-teck.com/programming/node-js/node-chat-app/

https://noauto-nolife.com/post/heroku-counter-plan/

上の2つの記事を読んでわかった重要な点が2つある。

・Netlifyはあくまでフロントサイドだけホスティングするサービスであり、サーバーサイドがあるウェブには向かないという点。
・Herokuの無料プランはなくなっており、Herokuでデプロイするにはお金がかかる点。

Herokuでデプロイするのが一番簡単そうだが、勉強のためにもAWSで公開したいなと思っている。
ブログの後半にはまた違うことを言っているかもしれない。

https://www.youtube.com/watch?v=0oIcGPK8mQE

この動画を参考にしてデプロイしてみる。

この動画の準備段階としてAWS ElasticBeanstalksのCLIをインストールする必要がある。

しかし、EBのセットアップスクリプトを参照してインストールしても、ドキュメントを読んで手動でインストールしてもうまく動作しなかった。

結局、YouTubeで調べて出来てたこちらの動画を参考にしたら上手くインストールできた。

https://www.youtube.com/watch?v=fK-ZlbCp8Sw

その奮闘はこっちに少し詳しく書いた。

https://www.notion.so/AWS-EBCLI-2023-01-17-207757a284054706baad834107d4b7d2

上に示した動画を参考にしてデプロイを試みたが、下のようにconfigファイルの記述不足でエラーを起こしてしまった。
残念ながら、今日はここまでである。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2971002/6e0c5b5c-4991-a1de-efbb-9aea25336ec4.png)



明日、configファイルの修正をして、Nodejsのプロジェクトのデプロイの仕方、それから作成したチャットアプリをデプロイするというところをやっていく。
【Shell】printfコマンドの書式指定

## 使用方法
`printf`コマンドは以下のように使用することで文字列などの整形ができます。
```:ターミナル
$ printf [-v 変数名] 書式 [数値, 文字列 など]
```
`-v 変数名`を入力することで整形した内容をシェル変数にセットできます。

## 書式指定の記号
書式指定の際に使用する記号は以下のとおりです。
`%`の後に数字を記述することで桁数を指定できます。
`%`の後に`'`を記述することで3桁区切りにできます。
|   記号   | 説明                                              |
| :------: | :------------------------------------------------ |
|    %s    | 文字列                                            |
|    %c    | 1文字                                             |
|  %d, %i  | 10進数の整数（符号付き）                          |
|    %u    | 10進数の整数（符号なし）                          |
|    %o    | 8進数の整数（符号付き）                           |
|    %x    | 16進数の整数（符号付き、アルファベット小文字）    |
|    %X    | 16進数の整数（符号付き、アルファベット大文字）    |
|  %f, %F  | 小数形式の浮動小数点数                            |
|    %e    | 指数形式の浮動小数点数（指数記号"e"部分が小文字） |
|    %E    | 指数形式の浮動小数点数（指数記号"E"部分が大文字） |
|    %g    | 指数形%eまたは%f（適した書式を自動選択）          |
|    %G    | %Eまたは%F（適した書式を自動選択）                |
|    \\"    | 「"」                                             |
|    \\\    | バックスラッシュ                                  |
|    \a    | アラート                                          |
|    \b    | バックスペース                                    |
|    \e    | エスケープ                                        |
|    \f    | フォームフィード                                  |
|    \n    | 改行                                              |
|    \r    | キャリッジリターン                                |
|    \t    | 水平タブ                                          |
|    \v    | 垂直タブ                                          |
|    %%    | 「%」                                             |
| \x1b[4m  | 下線                                              |
| \x1b[1m  | 太字                                              |
| \x1b[7m  | 背景色と前景色を反転                              |
| \x1b[41m | 背景色を赤                                        |
| \x1b[43m | 背景色を黄                                        |
| \x1b[42m | 背景色を緑                                        |
| \x1b[44m | 背景色を青                                        |
| \x1b[31m | 文字色を赤                                        |
| \x1b[33m | 文字色を黄                                        |
| \x1b[32m | 文字色を緑                                        |
| \x1b[34m | 文字色を青                                        |
[Docker] depends onについて

## 自己紹介
初めまして。私は都内でwebエンジニアをしています。

今の会社にインターンとして経て、入社しました。

業務では、Nuxtjs, Golang, Kubernetesを用いて運用保守開発や

最近はPandasを用いてデータ分析など日々苦戦している若輩者です。

## 背景

Dockerの`depends_on`について、簡単に学んだことをまとめました。

## 対象としている人

Dockerについて、一通り学習したことがある人

## depends_on

サービス間の依存関係を指定できる

```docker-compose.yaml
services:
  service_a:
    image: busybox
  service_b:
    image: busybox
    # `service_b` を `service_a` に依存させる
    depends_on:
      - service_a
```

service_b を service_a に依存させることができます

- docker-compose up: service_a → service_b の順に起動する
- docker-compose run: （ docker-compose up と同じ）
- docker-compose stop: service_b → service_a の順に停止する

## 指定パターン

- Short syntax （リスト）
  - 依存先のサービス名を単純に記述するだけ

```docker-compose.yaml
depends_on:
  - service_a
```

- Long syntax （オブジェクト）
  - 依存関係にあるサービスをオブジェクト形式で記述するもの
  - この方法では依存先に加えて「条件」を指定することができます

```docker-compose.yaml
depends_on:
  service_a:
    condition: service_started
```

条件の指定には condition を使用
condition にデフォルト値は無いため、 long syntax を選ぶ場合は必ず指定する必要があり

- service_started
  - 依存先のサービスが起動したら起動する
    - 依存先のサービスが「起動したこと」を条件とします
- service_healthy
  - 依存先のサービスが起動して、なおかつ、 healthcheck が通ったら起動する
    - 依存先のサービスが起動してなおかつ healthcheck が通ることを条件とする
- service_completed_successfully
  - 依存先のサービスが正常終了したら起動する
    - 依存先のサービスが正常に終了したことを条件
自己紹介：プログラミングの勉強を始めます！

# はじめに

「プログラミングに関する知識を記録・共有するためのサービス」であるQiitaに、自分のような知識ゼロの人が参加していいのか悩みつつですが、来週からスタートするプログラミングスクールで挫折しないためにも、学習記録と学んだことの整理に、ここを活用したいと思っています。

# 自己紹介

神奈川県と千葉県で二拠点生活をしている50代女性です。20年程フリーランスとしてWEBサイトやブログの制作・運営をしています（現在はGoogle AdSenseなどの広告収入がメイン）。
主な運営サイトは「[東京ビアガーデン情報館](https://tokyobeergarden.com/)」や「[台湾温泉](https://taiwanonsen.com/)」などです。
プログラミングができたら、運営サイトの幅も広がるのではと、過去何度かPHPやPhytonの入門書を買ったものの、実際に手を動かす段階にすらいかず挫折していました。
今年2023年こそ、プログラミングをきちんと勉強したいと思い、挫折防止にとQiitaに参加しました。つまづきまくると思うのですが、ここでいろいろな方の情報を参考にさせてもらいながら、少しでもプログラミングスキルを身に付けられたらと思います。

# Yahoo！テックアカデミー

2022年12月に募集開始となった「[Yahoo！テックアカデミー](https://yj-techacademy.yahoo.co.jp/)」に軽い気持ちで応募したところ、一度は応募者多数で落選との連絡が来たのですが、その後1月13日に繰り上げ当選のメールが届きました。
自分が作りたいと思っていることにはJavaまではきっと必要ないよなというのと、自分のような知識ゼロの人間が本当に3か月半で即戦力を育成するカリキュラムについていけるのかという不安から悩みましたが、昨夜、挑戦してみようと決めました。
期間は来週1月23日から5月14日までの111日間で、すべてオンラインで行われます。一日の想定学習時間は2～3時間。週2回30分ずつ、専属メンターとのメンタリングも行われます（・・・と書きながら、実は「メンタリング」が何なのか理解していない）
最初の課題は学習時間の確保ですが、同時にプログラミングを学ぶ目的を明確にすることも重要かなと思っています。今運営しているサイトを、プログラミングスキルをつけることでどう変えていきたいのか、何を作りたいのか、真剣に考えながら学習を進めていきたいと思います。

# Qiita活用について

初心者向けの情報もたくさんあり、勉強法に関するアドバイスなどもいろいろ見かけましたので、来週オンラインスクールが始まるまで、暇を見つけて読み進めてみようと思います。
また、本来ここでの投稿は他の人に役立つ情報であるべきとは理解しているのですが、自分の進捗管理と学習モチベーションの維持のため、超初心者レベルの内容にはなってしまうのですが、学んだこと記録をつけていけたらと思います。

少し世界が見えてきたら、他の方の投稿にコメントもさせてもらおうと思います。
よろしくお願いします。

# 追記

単純な学習記録はやはりQiita内に投稿してはいけないので（自分のためのメモにすぎない）、はてなブログに学習記録用のブログを開設しました。学んだこと・つまづいたこと・課題など綴っていきます。

[111日後にプログラミングする猫](https://mona.hatenadiary.org/)
deviseをアップデートしたらomniauthエラーで詰まった

### はじめに
deviseをアップグレードするために、omniauthのバージョンも同時にアップグレードしたら一部のコールバックがnilになってハマってしまったので共有します。

### やったこと
- device, omniauthをアップグレードした
```diff_ruby:Gemfile
- gem 'devise', '4.4.3'
- gem 'omniauth', '~> 1.9.0'

+ gem 'devise'
+ gem 'omniauth'
```

```diff_ruby:Gemfile.lock
- devise (4.4.3)
+ devise (4.8.1)

- omniauth (1.9.2)
+ omniauth (2.1.0)
```

### 発生した問題
oauth認証で必要な値が`nil`になってしまった。
```ruby
[1] pry> request.env['omniauth.auth']
=> nil
```

### 試した対応方法
@jnitoさんからコメントをいただいた以下の箇所についても試してみたが変わらず。
> 上の記事にも書かれているとおり、omniauth-rails_csrf_protection gemを追加し、認可画面URLへのリダイレクトさせるリンクへのアクセス方法をGETからPOSTに変更してみてください。

こちらのコメントに書かれている`callback_path`を明示的に追加するやりかたも試しましたが、変わらず。
```ruby:devise.rb
config.omniauth :facebook, ENV['FACEBOOK_APP_ID'], ENV['FACEBOOK_APP_SECRET'], scope: 'email,public_profile', locale: 'ja_JP', callback_path: "/users/auth/facebook/callback"
```
https://github.com/bigcommerce/omniauth-bigcommerce/issues/18#issuecomment-720168256

### 解決方法
- こちらにも同様の現象が起きているとissueがあがっていたのを発見。

https://github.com/omniauth/omniauth/issues/1057

- `omniauth`が2系以上にならないように対応。
```diff_ruby:Gemfile
- gem 'omniauth'
+ gem 'omniauth', '~> 1.9.1'
```

- 無事に必要な値が取得できました！
※今回はどうやっても修正不可能だったのでgemのバージョンを2系未満で固定していますが、脆弱性の観点から最新のgemにバージョンアップするのが理想です。

```diff_ruby:Gemfile
[6] pry> request.env['omniauth.auth']
=> {"provider"=>"slack",
 "uid"=>"xxxxxxxxxxxx",
 "info"=>
  {"name"=>nil,
   "ok"=>true,
   "app_id"=>"xxxxxxxxxxx",
   "authed_user"=>{"id"=>"xxxxxxxxxxxx"},
   "scope"=>"channels:read,groups:read,incoming-webhook",
   "token_type"=>"bot",
    ...
    ...
```
ROS2 ノードをkill する方法

## 概要
ROS2 ノードをコマンドからkill したい場合があるが、ROS2にはROS の`rosnode kill `
にあたるコマンドは存在しないらしい
ROS2ノードのプロセスを終了させる方法のメモ


## Lifecycleの機能を使う

代わりにros2 lifecycle コマンドを使用してノードを終了させる

```bash
ros2 lifecycle set <node name> shutdown
```

これではLifecycleで実装されているノードしか終了できず、lifecycleに対応してないノードだとエラーがでる

```bash
ros2 lifecycle set /gazebo shuttdown
Node not found
```


https://answers.ros.org/question/323329/how-to-kill-nodes-in-ros2/


## すべてのROS2 プロセスを終了させる
      
以下のようなスクリプトを作って実行する

```bash
#!/bin/bash
echo "Kill all ros nodes!"
ps aux | grep ros | grep -v grep | awk '{ print "kill -9", $2 }' | sh
exit 0
```

```bash
./kill_ros_nodes.sh
```

ノードが終了しているかの確認 実行して何もでなければOK
```bash
ros2 node list
```


# おわりに

ROS2のノードを個別に終了するようなROS2の機能は見つからなかった。
ROS2ではLifecycleを用いてノードを実装することを推奨しているようだ。
launchから実行したノードの中から1つのノードだけ終了したいときがあるので、rosnode killにあたるコマンドは実装してほしいところである。

# 参考

https://ittechnicalmemos.blogspot.com/2019/09/ros.html
Go言語テストファースト例

**やりたいこと**
外部APIやDBへのアクセス処理が含まれるメソッドをモックしてテストできるような作りにします。

以下★のメソッドをテストします。

**実装側**
外部アクセス処理のあるGetメソッドを外から差し込んで利用します。

```golang
// main.go　1つ目のファイル
package main

import (
	"fmt"
	"net/http"
)

type A struct {
	Name string
}
type AIf interface {
	Get() string
}

func main() {
	a := A{"本物"}
	s := Example(&a)
	fmt.Println(s)
}

// ★テスト対象メソッド
func Example(a AIf) string {
	s := a.Get()
	return s
}

func (a *A) Get() string {
	_, _ = http.Get("yahoo.co.jp")
	return a.Name + "のGetメソッド"
}
```
**main実行結果**
本物のGetメソッド

**実装側**
外部アクセス処理のないテスト用Getメソッドを外から差し込み利用することでExampleメソッドの処理を最後まで通せるようにします。

```golang
// main_test.go　2つ目のファイル
package main

import (
	"github.com/stretchr/testify/assert"
	"testing"
)

type AMock struct {
	Name string
}

func Test(t *testing.T) {
	t.Run("success test", func(t *testing.T) {
		a := AMock{"テスト用"}
		s := Example(&a)
		assert.Equal(t, "テスト用のGetメソッド", s)
		t.Log(s)
	})
}

func (a *AMock) Get() string {
	return a.Name + "のGetメソッド"
}
```
**Test実行結果**
テスト用のGetメソッド

**ポイントとなる点**
Exampleメソッドにインターフェース型で構造体のアドレスを渡します。
Symfony 入力フォームとボタンを縦並びでなくて横並びにしたい

タイトル通りです。
form_widgetで一行で書くと縦に並びます。

#### before

```XxxxxxxController.php
$form = $this->createFormBuilder()
    ->add('input', NumberType::class)
    ->add('search', SubmitType::class, ['label' => '検索する'])
    ->getForm();
```

```index.html.twig
<div class="example-wrapper">
    {{ form_start(form) }}
    {{ form_widget(form) }}
    {{ form_end(form) }}
</div>
```

分けて書いたら横並びになりました。
#### after
```index.html.twig
<div class="example-wrapper">
    {{ form_start(form) }}
    {{ form_widget(form.input) }}
    {{ form_widget(form.search) }}
    {{ form_end(form) }}
</div>
```


### 参考にさせていただきました
https://qiita.com/asaokamei/items/5d78ec34c57776554dd6
functionリターンが複数なら、union typeよりgenericを使う。

<h2>始めに</h2>
getDataはreturn typeとして、NewsFeedとNewsDetailを持てるとすると、<br>
function名の後ろにunion typeを使い、【NewsFeed[] | NewsDetail】のようにすれば、二つのtypeに対応できます。<br>
ここで、getData()がreturnするtypeは二つです。Typescript側は、getDataはどのtypeをリターンするの？NewsFeed？NewsDetail？になります。type guardのような状況になっちゃいます。それでtype guardをかけて対応することも可能ですが、<br>
ここでは二つのapiしか対応してないですが、将来に100個のapiを対応するとなったら大変になります。<br>
この場合にgenericを使うことが可能。

```typescript
type NewsFeed = News & {
  readonly points: number;
  readonly comments_count: number;
  read?: boolean; 
}

type NewsDetail = News & {
  readonly comments: NewsComment[];
}

function getData(url: string): NewsFeed[] | NewsDetail{
    ajax.open('GET', url, false);
    ajax.send();
    return JSON.parse(ajax.response);

const newsContent = getData("https://api.hnpwa.com/v0/news/1.json")
const newsFeed = getData("https://api.hnpwa.com/v0/news/1.json")
}
```

<h2>generic type</h2>

<b>getData`<T>`(url: string): `<T>` </b>のようにgenericを定義できます。
inputがT typeなので、outputもT typeにするという意味で、
newContent = getData`<NewsDetail>`　となると、`<NewsDetail>`のNewsDetailを`getData<AjaxResponse>`のAjaxResponseが受け取って、そのままreturn typeをNewsDetailにすることになります。
今のケースは、簡単なgenericの使い方で、これ以外にもいろんな使い方があり後でまた整理したい。

```typescript
type NewsFeed = News & {
  readonly points: number;
  readonly comments_count: number;
  read?: boolean; 
}

type NewsDetail = News & {
  readonly comments: NewsComment[];
}

function getData<AjaxResponse>(url: string): AjaxResponse {
    ajax.open('GET', url, false);
    ajax.send();
    return JSON.parse(ajax.response);
}

const newsContent = getData<NewsDetail>("https://api.hnpwa.com/v0/news/1.json")
const newsFeed = getData<NewsFeed[]>("https://api.hnpwa.com/v0/news/1.json")
```
Google SheetでchatGPTを使って一度に質問を沢山しようぜ

chatGPTの対話形式だとAIの回答内容が記録しづらかったり、同じような質問を一部言葉を変えて一度に実行したいときに何度も手で同じことを繰り返したりと不便ですよね。

そこでGoogleのSpreadSheetでchatGPTの機能が使えるアドオンが発表されました。
これを使えばSpreadSheetでchatGPTを実行できるようになります。

ここでは、SpreadSheetでchatGPTのアドオンを導入するところから、chatGPTのSpreadSheet上での活用例を紹介します。

## 導入
1. [chatGPT](https://www.google.com/url?q=https://openai.com/api/&sa=D&source=editors&ust=1673963106557382&usg=AOvVaw0U-SYFxtoFgTmLbgbH53tD) のアカウントを作成する
2. chatGPTのAPI keyの取得を[このページ]( [https://beta.openai.com/account/api-keys](https://www.google.com/url?q=https://beta.openai.com/account/api-keys&sa=D&source=editors&ust=1673963106557419&usg=AOvVaw3YvIcmvVbTeeptV0fhImuI))から行い、メモしておく。

3. [chatGPTのアドオン](https://workspace.google.com/marketplace/app/gpt_for_sheets/677318054654)をインストール
4.  SpreadSheetの`home > Extensions > GPT for Sheets > Set API key`をクリック
![Add-ons.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486680/89668cb0-1fce-9c9f-202e-2519ec8fed12.png)

5. 手順2で取得したAPI Keyを入力欄に入れる
![API Key.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486680/1200bbb3-2f04-1e52-4015-35b8fc46026c.png)

6. chatGPTのアドオンが使えるかテストしてみる
   - 以下の関数を適当なセルに入れてみて回答するか確かめてみてください！
```
=GPT("あなたは誰ですか？", ,0.8, "text-davinci-003", 16)
```

## 使い方
構文
```
=GPT(
    質問内容(str), 
    質問内容を適応させたい値のセル番号(spreadsheet cell), 
    AIの温度感(int), 
    適応したい言語モデル(str), 
    トークンの最大値(int)
    )
```
- AIの温度感(0 ~ 1)
	- `0`に行くほど質問内容に忠実に答える
	- `1`に行くほどクリエイティブな回答をする
- 適応したい言語モデル
	- 以下の３つから指定できる
		- text-davinci-003
		- text-curie-001
		- text-davinci-edit-001
- トークンの最大値
	- 特にいじる必要ない

## 使用例
- ブログ記事のアイデアを沢山出してもらう
  - 質問に`ブログ記事のアイデアを3つ提案して`指定 (cell: A2)
  - 値にアイデアを出してほしいキーワードを指定(cell: A4以降のA行)
  - chatGPTの回答を読み込む列(cell: B4以降のB行)
	  - これをB4に入力して、下行にペースト
	```
	  =GPT(A$2,A4, 0.8)
	```
	  - AIの温度感を比較的創造的に設定(GPTの第３引数に0.8を設定) 

実行結果
![output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486680/c99eed43-9b3a-f773-4d90-d0872d23939c.png)


## おわりに
この記事でより創造的なことができることに貢献できたら幸いです。

## 文献
- [GPT for Sheets guide](https://docs.google.com/spreadsheets/d/e/2PACX-1vT2hwwsVibQyDaXW6weZ18vVeESmL0WANwmdlpA2HX07aFtblpTZUjtWtQEPmyzCGDnO5Cx7OUA2lyU/pubhtml#)
Leetcode 926. Flip String to Monotone Increasing

https://leetcode.com/problems/flip-string-to-monotone-increasing/

## 難易度
### Medium

## アプローチ
### Prefix Sum, Brute-force

```java
class Solution {
    public int minFlipsMonoIncr(String s) {
        int count = 0;
        int result = 0;
        for (char sChar : s.toCharArray()) {
            if (sChar == '1') {
                count++;
            } else if (count > 0 && sChar == '0') {
                count--;
                result++;
            }
        }
        return result;
    }
}
```
綺麗なインペインティング Pytorch-MADF の使い方

# ランキングに入る高品質モデル

**input**
![cased7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/e1ba53c0-7324-0bd3-282f-f0a24f79f1ed.png)
**mask**
![case7_mask.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/5fec2d6d-585b-6c4c-aacc-600d15a05a42.png)
**result**
![0ed06863-445a-4cce-8ee9-38285f7344f5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/a12426bd-773f-daca-b76f-6b9fbe4e6bef.png)


Paper with code places2インペインティング部門でLamaに次ぐ第４位に入るモデル（２０２３年１月現在）。

https://github.com/MADF-inpainting/Pytorch-MADF

# 使い方

### インストール

```bash
git clone https://github.com/MADF-inpainting/Pytorch-MADF.git
cd Pytorch-MADF
```

リポジトリから事前トレーニング済みモデル・ウェイトをダウンロードします。

laces2　Celeba　PSVの３モデル（いずれも512px*512px）が提供されています。

### データ

以下のような画像とマスクのリストファイルを用意します。

```txt:place2_example_list
examples/places2/case1.png	examples/places2/case1_mask.png
examples/places2/case2.png	examples/places2/case2_mask.png
examples/places2/case3.png	examples/places2/case3_mask.png
examples/places2/case4.png	examples/places2/case4_mask.png
examples/places2/case5.png	examples/places2/case5_mask.png
examples/places2/case6.png	examples/places2/case6_mask.png
examples/places2/case7.png	examples/places2/case7_mask.png
```

```bash
python test.py --list_file places2_example_list --snapshot places2.pth
```

resultに結果が保存されます。

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

機械学習、ARアプリ（Web/iOS）を作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
GitHub 初期設定〜使い方まで Vol.1



## Gitのインストールの確認
ターミナルで 
``` $ git version ```
を記入。

バージョンが表示されたら、Gitのインストール不要。
表示されなければ、インストールを行う。（インストール方法は省略）



## Git Hubの登録
既に登録済みであれば、スキップ
登録方法は省略。


### GitHubの初期設定
ターミナルにて
``` $ git config --global user.name "<ユーザネーム>"  ``` 　　 (GitHubユーザーネームの登録) 
``` $ git config --global user.email  “<メールアドレス>” ```　 (GitHubメールアドレスの登録)
``` $ git config --global core.editor 'code --wait' ``` 　　　(VSCodeエディタの登録例だが、使用エディタによって変更)
``` $ git config —list ```   　（登録情報の確認）
``` $ cat ~/ .gitconfig ``` 　  （gitconfigファイルの中身を参照して、登録情報を確認する方法）


__□GitHubの基本的なデータ構造__
_ローカルリポジトリ_（自分のローカルの作業履歴の管理場所）
_ステージ_（コミット前の準備場所）
_ワークツリー_（自分の作業場）


__□コミットまでの大まかな流れ__
ワークツリーでファイルを追加、変更等を行う
 ↓
``` git add ``` 
 ↓
ローカルリポジトリにて、変更されたファイルの圧縮ファイルが作成される
 ↓
ステージに変更内容が保存される
 ↓
``` git commit ``` 
 ↓
・ローカルリポジトリのツリーファイルに最新のファイル情報が保存される
・コミットファイルにコミット情報が保存される（ツリーファイル名、親コミットファイル名、作成者、日付、コミットメッセージ）

___

***●ローカルリポジトリの新規作成（個人開発：自分が0から新規作成する場合）***
製造中のフォルダの中で、ローカルリポジトリを作成する。
$cd ○○○で作成したいディレクトリに移動。

``` $ git init ```
を入力する。
.gitディレクトリが作成される
これがローカルリポジトリ（圧縮ファイル、ツリーファイル、コミットファイル、設定ファイル等が作成される）



***●既に存在するローカルリポジトリをコピーし作成（チーム開発：改修等の既に存在するソースを使用する場合）***
コピーしたいディレクトリに移動
``` $ git clone ``` (Git HubのCloneのURL) 


## ファイルを変更,追加する
***●変更を記録する（コミット）***
``` $ git commit ``` 
``` $ git commit -m “<メッセージ>” ``` 
``` $ git commit -v ```   （コミットを行い、変更情報を表示）
<br>

***●現在の変更状況を確認する***
``` $ git status ``` 
ワークツリーとステージ（addしてある情報）の差分と
ステージをローカルリポジトリの差分の2つを表示する。
<br>

***●変更差分を確認する***
*いきなりaddやcommitするのではなく、差分を確認してから行うようにしよう。*

**□git addする前の変更分(ワークツリーとステージの変更差分)**
``` $ git diff ```
``` $ git diff <ファイル名> ```

**□git addした後の変更分(ローカルリポジトリとステージの変更差分)**
``` $ git diff —staged ``` 
<br>


***●変更履歴を確認する***
**□ 基本的なコマンド**
```$ git log```

**□ 1行で表示する**
``` $ git log —oneline```

**□ ファイルの変更差分を表示する**
``` $ git log -p <ファイル名>``` 

**□表示するコミット数の指定**
``` $ git log -n <コミット数>``` 
<br>


***●ファイルの削除を記録する***
**□ ファイルを削除**
``` $ git rm <ファイル名>``` 
``` $ git rm -r <ディレクトリ名>``` 

**□リポジトリ上からのみファイルを削除したい時**
``` $ git rm —cached <ファイル名> ``` 
<br>

***●ファイルの移動/ファイル名の変更を記録する***
```  $ git mv <旧ファイル> <新ファイル>``` 
<br>


***●リモートリポジトリを新規追加する（個人開発等の新規作成）***
```$git remote add origin <URL>```
originという名前で、左記のURLが登録される
<Br>

***●リモートリポジトリへ送信する***
```$git push <リモートリポジトリ名> <ブランチ名>```
<br>


## リポジトリの作成からPUSHまで

***●トークンを発行する（push等を行う際に必要なパスワードのようなもの）***
GitHubサイトに移動
↓
プロフィールアイコンの、Setting押下
↓
左のメニューの下のDeveloper settingsを押下
↓
Personal access tokensを押下し、Generate new tokenを押下
↓
Noteは設定するトークンの名称
その他期限や、権限を決めたら、Generate tokenを押下
↓
その際の、トークンは保存しておく
ghp_wDnjB○○○○○○○○○○○○○○
<br>


***●リポジトリを作成する***
GitHubサイト内の、Newを押下する
↓
RepositoryNameに作成したい、リポジトリの名前を入力し各種オプション設定し（基本はデフォルトでOK）
CreateRepositoryを押下
<br>

***●PUSHを行う***
pushしたいディレクトリ内で、
```git remote add origin https://github.com/○○○○○○```
を入力
↓
ブランチが存在していなければ、mainブランチの作成（名称は自由）
```$ git branch -M main```
↓
```$ git push -u origin main```
を入力
（-uを入力すると、次回以降origin mainをpushしたい時に、git pushのみで行えるようになる）
Next.jsもとい、Node.jsでprofilerを簡単に使う方法


現在、Chromeを使うことでGUIベースでProfilerを使用することが可能になっています。
その方法の紹介です。

# 手順

## Next.jsをProfilerを有効な状態で立ち上げる

Next.jsを立ち上げる際に次のようにNODE_OPTIONSをしてして起動してください。

```
NODE_OPTIONS='--inspect' next dev
```

## ChromeのInspect画面を表示

[chrome://inspect](chrome://inspect) にアクセスすると、inspectorが利用可能です。
Devices > Remote targetにinspectオプションを有効にしたプロセスがリストされているので、`inspect`リンクをクリックしてください


## Profilingする

以上
後は開いたウィンドウのProfilerタブからCPUのProfile、MemoryタブからMemoryのProfileを取得できます。



# 参考

https://medium.com/@paul_irish/debugging-node-js-nightlies-with-chrome-devtools-7c4a1b95ae27#.pmqejrn8q
Googleプロジェクト管理：クリティカル・パスを作る

# はじめに

わたしが [Google プロジェクト管理:プロフェッショナル認定証で得られた素晴らしい体験][google]を、要点をまとめ小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ ***"Google プロジェクト管理:プロフェッショナル認定証"*** を受講してみてください。

[google]: https://qiita.com/mapami/items/317ae776a2268fd54c8f

https://jp.coursera.org/professional-certificates/google-project-management

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/7c79c997-e4e4-7d71-3686-e01b7badaa3c.png" width="800">

#  なぜクリティカルパスは重要？

クリティカルパスとは、プロジェクトのスケジュールを完成させるために必要なマイルストーンと、各マイルストーンの完了に貢献する必須タスクのリストを指します。クリティカルパスは、プロジェクトマネージャが、現在どこにいて、どこに向かっていて、いつそこに到達するのかを示すフレームワークと考えることができる。

クリティカルパスは...
- 最終目標を達成するために、プロジェクトで完了しなければならない重要なタスクと、それぞれのタスクにかかる時間を決定するのに役立ちます。
- どのタスクの終了予定日が遅れたり、遅れたりすると、プロジェクトの完了日にマイナスの影響を与えるかを明らかにすることで、重要なタスクを簡単に参照できるようにします。

# クリティカルパスの作成方法

クリティカルパスの作成方法は、プロジェクトごとに異なりますが、ほとんどのプロジェクトに適用できる一般的な手順があります。

### ステップ1: 全てのタスクをキャプチャする

最初にプロジェクトのスケジュール作成に取り掛かるとき、作業の完了に関連するすべてのタスクを把握します。この時点に至るまでに作成したWBSなどの主要な計画ドキュメントを忘れずに使用してください。このステップの主な目的は、プロジェクトを完了するために必要な重要な作業を見逃していないことを確認することです。

クリティカルパスを作成するときは、プロジェクトの完了に不可欠ではない「やってよかった」タスクではなく、***<font color="MediumBlue">不可欠で「やらなければならない」タスク</font>*** に焦点を当てます。

> ここでは、家の構造を作るためのクリティカル・タスクの例を挙げます。

### ステップ2: 依存関係を把握する

重要なタスクをリスト形式ですべて把握したら、それらのタスクを完了する順番に並べ、依存関係を確認します。依存関係を明らかにするには、どのタスクが完了しなければ、他のタスクを開始できないかを把握します。プロジェクトスケジュールを成功させるためには、依存関係を明らかにすることが重要です。

> 例えば、家を建てる前に外壁を塗ることはできないので、壁を塗る前に枠を作る作業をしなければなりません。

各タスクの依存関係を把握するためには、次のように尋ねます。

- このタスクの前に行う必要があるのはどのタスクか？
- このタスクと同時に終了できるタスクはどれか？
- このタスクの直後に必要なタスクは何か？

これらの質問に答えたら、タスクのリストの横に依存関係をリストアップすることができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/757aaac0-1a2f-9f2d-433e-6080d96ed450.png" width="400">


### ステップ3: ネットワーク図を作成する

クリティカルパスを可視化する一般的な方法の1つに、ネットワーク図の作成があります。ネットワーク図は、以下の例のように、依存関係に基づき、完了すべき順序でタスクを並べたものです。

- プロジェクトの開始から終了までの作業の流れはどれか？
- どの作業を並行して行うか、順番に行うか?
- クリティカルパス上にない非本質的なタスクはどれか?

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/038b4ee1-8bd8-6927-e5c5-e1f69f3e15c4.png" width="700">

### ステップ4: 時間見積もりを行う

タスクと依存関係を決定したら、主要なステークホルダーに相談し、***<font color="MediumBlue">各タスクの正確な時間見積り</font>*** を入手します。これは、クリティカルパスを決定する上で非常に重要なステップです。時間の見積もりが大幅にずれていると、クリティカルパスの長さが変わってしまう可能性があります。時間の見積もりは、プロジェクト期間中、必要に応じて見直し、更新することができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/f8b09f31-7e4b-0752-3625-68318fa8d5b8.png" width="700">
Javascript基礎

↓↓↓↓↓↓↓ あなたの記事の内容
●歴史・・199０年台から開発が始まり、頻繁にリニューアルされている.
───────
- 歴史・・199０年台から開発が始まり、頻繁にリニューアルされている
↑↑↑↑↑↑↑ 編集リクエストの内容

↓↓↓↓↓↓↓ あなたの記事の内容
●"use strict"・・より厳密なエラーチェックがされる。コードに存在する曖昧なエラーを早期に発見しやすくする
＊必ず書くようにする
───────
- `"use strict"` ・・より厳密なエラーチェックがされる。コードに存在する曖昧なエラーを早期に発見しやすくする
↑↑↑↑↑↑↑ 編集リクエストの内容

- 変数の宣言方法
  - `let x;`
    `console.log(x)` ・・関数の指定
 
  - `const`・・定数の指定、再代入不可

- 変数の命名・・単語の二つ目は大文字
＊JavaScriptは大文字と小文字は区別される

↓↓↓↓↓↓↓ あなたの記事の内容
＊値がコロコロ変わると良くないので、基本的に定数を使いつつ、どうしても使えない時に変数を用いる運用が一般的

price++・・priceに一を足す
price--・・priceに二を足す

●変数の命名・・単語の二つ目は大文字
＊Javascriptは大文字と小文字は区別される
───────
```js
↑↑↑↑↑↑↑ 編集リクエストの内容
let color;
let colorName;
let myColorName;
```

- エスケープシーケンス・・通常の文字列では表せない特殊な文字や機能を表現するための方法

- インクリメントとデクリメント
インクリメント・・数値の値を1増加させる
`num++;`
デクリメント・・数値の値を１減少させる
`num--;`

- 条件分岐
```js:ex)
const x = 100;
if (x >= 100) {
  console.log('100以上の値です')
} else {
  console.log('100未満の値です')
}
```

↓↓↓↓↓↓↓ あなたの記事の内容
・比較演算子==,===の違い
==数値と文字列を比較するとき、文字列は数値に変換されます。
===文字列は数値に変換されない
───────
- 比較演算子==,===の違い
`==` 数値と文字列を比較するとき、文字列は数値に変換されます。
`===` 文字列は数値にに変換されない
↑↑↑↑↑↑↑ 編集リクエストの内容

・switch・・対象となる値が一致しているか見る時に便利

- ifとswitchの使い分け
・基本的にifを使用
・同値演算子による評価の時はswitchが使いやすい

- do whle と　whileの使い分け
do while は条件の判断が後ろにある
```js
do {
//条件式がtrueの時に実行したい処理
} while (条件式)
```

- 1~100までの合計を繰り返し処理によって計算する
最初に let sum = 0; で合計値を入れる変数を用意する
なぜ=0とするのか・・・・sumだけだとundefined。0+1は1だが、undefied＋1が1になることを保証できない。
{sum +=  i;}iは繰り返し処理で、1,2,・・100まで。それらを合計する意味の式。

↓↓↓↓↓↓↓ あなたの記事の内容
●関数・・関数の定義方法
１・・function命令で定義
２・・関数リテラルで定義
３・・Functionコンストラクターで定義
４・・アロー関数で定義

●テンプレートリテラル
文字列の中で「${定数}」とすることで、文字列の中に定数や変数を含めることができる。
この時、文字列全体をバッククォーテーション（`）で囲む必要がある。

●DOM操作・・Webサイトを動的に書き換える技術
Javascriptに記述されたプログラムから、HTMLページにアクセスして、HTMLページを操作する方法を示す。

●DOMツリー・・HTMLドキュメントをツリーのように表現したもの
●ノード・・文書を構成する要素・構造・テキストといったオブジェクトをノードという。

●idをキーに要素を取得する・・getElementByldメソッドを使用。IDによって要素を取得するメソッド。

●switch文・・switch (式){
  case 値1：
    式 === 値1 の時に実行する処理;
    ...
    break;
  case 値2:
    式 === 値2 の時に実行する処理;
    ...
    break;
  case 値3:
    式 === 値3 の時に実行する処理;
    ...
    break;
  default:
    式がいずれの値とも一致しないときに実行する処理;
    ...

・アロー関数を使えば関数式を短く書くことができr
───────
- 関数・・関数の定義方法
  1. function命令で定義
  2. 関数リテラルで定義
  3. Functionコンストラクターで定義
  4. アロー関数で定義
↑↑↑↑↑↑↑ 編集リクエストの内容
Ubuntuでnodejsのインストール


すでに入ってる時は消す

```
sudo apt-get remove nodejs
```

特定のバージョンを追加

```
Node.js v18.x:

curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
Node.js v17.x:

curl -fsSL https://deb.nodesource.com/setup_17.x | sudo -E bash -
Node.js v16.x:

curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
Node.js v14.x:

curl -fsSL https://deb.nodesource.com/setup_14.x | sudo -E bash -
Node.js LTS:

curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
Node.js Current (whatever is the latest version):

curl -fsSL https://deb.nodesource.com/setup_current.x | sudo -E bash -

```

インストール

```
sudo apt-get install nodejs
```



## 参考

https://learnubuntu.com/update-node-js/
HashMap,TreeMapのcomputeIfAbsentでConcurrentModificationException

# 事の始まり
とあるプロジェクトでJavaのバージョン更新(8→17)を行っていた時のこと。
`java.util.HashMap`に対して`computeIfAbsent`を呼び出しているところで`ConcurrentModificationException`が発生するようになってしまいました。
この部分は旧バージョンから特にコードをいじっていないところ、かつ複数スレッドから参照されるものではなかったのでJavaのバージョンに起因するものでないかと考えました。

# 原因のコード
調査すると同じHashMapのインスタンスに対してcomputeIfAbsentが入れ子になっていることがわかりました。
簡単に書くと以下のようなコードです。
```java
Map<String, String> map = new HashMap<>();
map.computeIfAbsent("k1", tk1 -> map.computeIfAbsent(tk1, tk2 -> "value1"));
```

実際には"k1"というキーに"value1"が入るだけなので入れ子になっている意味がまったくないコードなのですが、Java8では動作していました。

※なお、内側のcomputeIfAbsentに渡すキーをtk1から"k2"のような外側と違うキーにしても同じ結果となることを確認しています。

# 実験と結果
Java8では動作していたコードがJava17でConcurrentModificationExceptionが出てしまったことから、どのバージョンから動作（内部実装）が変わっているのか実験してみることにしました。
なお、HashMapの内部実装でのExceptionだったことからTreeMapでも実験を行っています。

以下が結果です。（〇はエラーなし。×はConcurrentModificationException発生）

|Javaバージョン|HashMap|TreeMap|
|---:|:---:|:---:|
| 8|〇|〇|
| 9|×|〇|
|10|×|〇|
|11|×|〇|
|12|×|〇|
|13|×|〇|
|14|×|〇|
|15|×|×|
|16|×|×|
|17|×|×|

HashMapは9から変わっているのに対してTreeMapは15からなのがちょっと意外でした。

# まとめ
Javaの更新ドキュメントをすべてチェックしたわけではないので見逃している可能性はありますが、これに関してはAPIの仕様変更というより内部処理変更に伴う副作用（？）のように見えました。

今回Javaのバージョンによって挙動が変わったことから調査しましたが、そもそも元のコードに問題（computeIfAbsentを入れ子にする必要がない）があるので、実際のプロジェクトではコード側を修正してどのバージョンのJavaでも動くようにしています。
kotlinのラムダいろいろ（メモ）

## 記事が参考になりそうな人
- ラムダがよくわからんくなる人

---
### 変数に関数を格納する
```
fun foo(){
    println("Hello")
}
```
を変数に格納したいときは（関数を呼び出すんではない）

```
val aaa = ::foo
```
で格納できる
![スクリーンショット 2023-01-17 21.00.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731109/aefb08d9-2ae9-628e-2a82-786527d9ea06.png)

---
### funを使わず関数をつくる
"fun"を使わずに関数を定義するには
```
val foo = { println("Hello")}
```

![スクリーンショット 2023-01-17 21.00.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731109/f07cdfcf-7049-3301-8d25-d59aabd1de97.png)

これは
```
foo()
```
で関数を呼べる

---
### 関数「型」
```
() -> Unit
````
とは、
「引数がない」し、「戻り値がない」関数"型"を表している
（Intとかの型と同じように、関数の型を書きたいときはこれ）

![スクリーンショット 2023-01-17 20.51.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731109/6df05ee0-58f6-67e5-e84d-a115864ed82c.png)

#### 応用
Int型２つの引数を受け取り、Int型が返ってくる関数は
```
(Int, Int) -> Int
```
つまり、例えば

```
val aaa:() -> Unit = {println("Hello")}
```

は
「aaa は引数なしの戻り値なしの関数のことですよ」で、


```
val cat:String = "猫"
```
と同じ見方

#### まとめるとこんな風に書ける
```
fun main() {
    val trueFunction = trickOrTreat(true)
    val falseFunction = trickOrTreat(false)
    trueFunction()
    falseFunction()
}

fun trickOrTreat(isTrick:Boolean):()->Unit{
    if(isTrick){
        return trick
    }else{
        return treat
    }
}

val trick = {println("trick")}
val treat = {println("treat")}
```

trick
treat
が返ってくる

---
### 引数に関数型を設定する
上のtrickOrTreat関数の引数を増やすと
```
fun trickOrTreat(isTrick:Boolean, extraTreat:(Int)->String):()->Unit{
    if(isTrick){
        return trick
    }else{
        println(extraTreat(5))
        return treat()
    }
}
```
訳：
trickOrTreatの第２引数が関数で、その関数っていうのはInt型を引数に持ってて、Stringが返ってくる
で、treat関数の引数にそのstringをつっこもう
（extraTreatって名前はここで付けた名前ってだけで、そういう名前の関数を用意しろ、もしくは絶対存在してるってことではない）


```
val coins:(Int) -> String = { number->
    "$number coins"
}
```
とかてきとーにつくってtrickOrTreat関数の第２引数としてつっこめばよい

```
fun main() {
    val coins:(Int)->String = { int ->
        "$int coins"
    }
    
    val cupcake:(Int)->String = {
        "cupcake"
    }
    
    val trueFunction = trickOrTreat(true, coins)
    val falseFunction = trickOrTreat(false, cupcake)
    trueFunction()
    falseFunction()
}

fun trickOrTreat(isTrick:Boolean, extraTreat:(Int)->String):()->Unit{
    if(isTrick){
        return trick
    }else{
        println(extraTreat(5))
        return treat
    }
```

### 簡単に書く
上の書き方をもっと簡単にしよう

まず
```
    val coins:(Int)->String = { int ->
        "$int coins"
    }
```
は、{}の中の"int"って明示的に書いたけど、別にわざわざ書かなくても良い→その場合はitになる
```
    val coins:(Int)->String = {
        "$it coins"
    }
```
---

次に、coinｓって１回しか使われてないから直でつっこみたいな
これが
```
val trueFunction = trickOrTreat(true, coins)
```
こうなる

```
val trueFunction = trickOrTreat(true, {$it coins})
```

### 最後の引数が関数型ならその関数型を外に出せる
trickOrTreat関数みたいに、引数の最後が関数型なら外に出せる

```
val trueFunction = trickOrTreat(true){$it coins}
```

### 参考
https://developer.android.com/codelabs/basic-android-kotlin-compose-function-types-and-lambda?continue=https%3A%2F%2Fdeveloper.android.com%2Fcourses%2Fpathways%2Fandroid-basics-compose-unit-2-pathway-1%23codelab-https%3A%2F%2Fdeveloper.android.com%2Fcodelabs%2Fbasic-android-kotlin-compose-function-types-and-lambda#0