OmniAICreator/Qiita-1.07M huggingface dataset:
【Git】リモートで作業

# はじめ

　　最近、gitのドキュメントを読んでいます。
　　今後の復習のため、ポイントをメモしました。
　　案件によくあったことなので、コマンドをまとめました。

# 2.5 リモートで作業

## リモートの表示
今までに設定したリモートハンドルの名前を一覧表示する。↓
```
$ git remote
```
リポジトリをクローンしたのなら、originという名前が見える。
origin->クローン元のサーバーに対してGitがデフォルトでつける名前です

リモートハンドルの名前に対応するURLを書き込み用と読み取り用の２つ表示する。↓
```
$ git remote -v
```
複数のリモートを設定している場合は、全て表示する。

## リモートリポジトリの追加

新しいリモートGitリポジトリにアクセスしやすいような名前をつけて追加する。↓
```
$ git remote add <shortname> <url>
```

自分のリポジトリにまだ存在しないものを全て取得する。↓
```
$ git fetch <shortname>
```

## リモートからのフェッチ、そしてプル

データをリモートリポジトリから取得する。↓
リモートプロジェクトの全てのデータの中からまだ、持っていないものを引き出す。
実行後は、リポジトリにあるすべてのブランチを参照できるようになる。
```
$ git fetch [remote-name]
```

リポジトリをクローンしたときには、リモートリポジトリに対して自動的に"origin"という名前が付けられる。
注意点：　git fetchコマンドはデータをローカルリポジトリに引き出すだけだということです。ローカルの環境にマージされたり作業中の内容を書き換えたりすることはない。したがって、必要に応じて自分でマージをする必要がある。

## リモートへのプッシュ
プロジェクトを上流にプッシュする。↓
```
$ git push [remote-name] [branch-name]
```
注意点：
下記のコマンドが動作するのは、自分が書き込みアクセス権を持つサーバーからクローンし、かつその後誰もそのサーバーにプッシュしていない場合のみです。
→あなた以外の誰かが同じサーバーからクローンし、誰かが上流にプッシュした後で自分がプッシュしようとすると、それは拒否されます。 拒否された場合は、まず誰かがプッシュした作業内容を引き出してきてローカル環境で調整してからでないとプッシュできません。 
```
$ git push origin master
```

## リモートの調査
特定のリモートの情報をより詳しく知りたい場合。↓
```
$ git remote show [remote-name]
```
確認できる情報：
 - リモートリポジトリのURL
 - 追跡対象になっているブランチの情報

## リモートの削除・リネーム
リモートを参照する名前を変更したい場合。↓
```
$ git remote rename [old-name] [new-name]
```

リモートを削除したい場合。↓
```
$ git remote rm [remote-name]
```
共同作業を楽にすべくVSCode Live Shareでを使ってみる

リモートワークになり、、
ペアブロや、他メンバーとの共有作業でコーティング指導など、やりづらくなり、、
複数人でソースを編集など行えるVSCode Live Shareを使ってみることにしました

※VSCode バージョン: 1.70.2を使用している

# 手順

### Live Shareを取得

vs codeの拡張機能からLive Shareを検索し追加します

![スクリーンショット 2022-08-21 0.55.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276326/d27432ff-cdf7-8db9-50f4-dd719d120215.png)

拡張したら下部に Live Share ボタンが表示され使用することができます

![スクリーンショット 2022-08-22 15.45.37.pn
g](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276326/1fd388a4-52f4-a761-e6d5-25c3b4220f1a.png)

使用するには、

* Microsoftアカウント
* GitHubアカウント

のどちらかが必要です。

### 実行する
共有作業したいフォルダ開いた後、

ログイン後、Live Shareボタンを押すを以下のように表示されます

![スクリーンショット 2022-08-22 15.48.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276326/12d062cf-0206-4ecf-1a15-5d35c65cf09f.png)

私はMore infoを選択しました
More infoをクリックすると共有URLが発行されます

![スクリーンショット 2022-08-22 15.55.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276326/c3c37dc2-d32b-2de3-37fa-e4888c2b7cf1.png)

書かれているURLはメンバーに共有するとブラウザベースで複数人でソースを編集することができます。
※ブラウザ側もログインが必要みたいです
テキストベースでのコミュニケーション

コロナ禍になって約2年半、オフィスに出社したのは合わせても20日前後だろう。
在宅勤務が当たり前になって、
SlackやTeams等チャットツールで関係者と連絡を取り合うことが増えたわけだが、
ここではテキストベースでのコミュニケーションについて書いていこうと思う。

# テキストベースのメリデメ
## メリット
- 情報が明文化される
- 後から見返せる

指示内容の明確化や、言った/言わないの水掛け論を防止できる。
文章化されることで情報が可視化され、理解や共有をされやすくなるのだ。
## デメリット
- 書く側には表現力が求められる
- 読む側には読解力が求められる

文面からは相手の顔や口調が分からないので、
どちらが欠けても伝達ミスや誤解が生じたりしがちだ。



# 意識して行うべきこと
- 主語・述語を意識的に書く
×：情報が不足しているため確認する
○：情報が不足しているため、AさんからBさんに資料修正を依頼する


- 5W1Hを意識的に書く
×：リリース作業の準備をお願いします
○：リリース作業に向けて10時までに手順書の印刷をお願いします

- 言葉の定義を明確にする
社内用語や業界用語、関係者だけで使う隠語は、
あらぬ誤解を招きかねない。
（特に新規参画者）

- 句読点だけにしない
文字だけだとその時の感情が見えないので、
時には威圧的に思われる可能性がある。
スタンプでもwでも草でも！でも良いので、
ポジティブさを表現したほうが受け手も安心すると思う。
（これは人によるかも）

これらを怠ると「あれ、これってどういうことだっけ？」と確認する手間が発生してしまう。

# それでも時には会話しよう
テキストだと長くなってしまうし仕事も遅くなってしまうので会話も当然必要だ。
会話を呼びかける際には以下を意識したほうが良いだろう。
- 用件を端的かつ明確に
タイトルに【報告】【共有】【相談】【依頼】【◯◯の件】etc
- 結論を先に書く
「●●の件で会話させてださい。xxで認識あってます？」など、
冒頭に1文で書くことで用件が伝わる


# 余談
「重要な事なので電話で！」という人は駆逐されてほしい。
<font color="red">**重要な事こそテキストに残してほしい。**</font>
<font color="red">会話するので精一杯だから、
並行して記憶するのが難しいので全部テキストでやり取りしたい。</font>

あと電話を受けた側が、
確認のために議事録的なものを相手に送るのも面倒くさい。
製品比較結果報告書の書き方

前プロジェクトで製品比較結果報告書を初めて作成したので、留意点をまとめてみた。
ITや製品比較でなくてもドキュメント作成に活かせる箇所があると思うので、
参考になったらうれしい。

# 製品比較とは？
ITの世界では多種多様な製品が存在するが、
製品を導入するには同等の機能を持つ複数製品を横並びで比較し、
最も機能に優れ、最も環境に適し、もしくは最も導入しやすい製品を
選定することが大半だろう。

# 製品比較結果報告書とは？
同一カテゴリの複数製品を比較・調査した内容をまとめ、
結果としてどの製品を導入するかを報告するための文書である。

1点注意したいのが、誰に向けたものなのかによって内容が変わってくる。
担当者向けの資料であれば、
その担当者が上司へプレゼンすることを想定する必要がある。

今回は決裁者を対象として作成した。

# 比較対象製品
自社が提案したい製品と顧客が検討している製品を含めて、
3～5製品を比較しよう。

# いきなり報告書作成に取り掛からない
まずは下調べ用のExcelでも開き、収集した情報を取りまとめよう。
その情報を有識者にレビューしてもらいOKが出てから報告書を作成しよう。

また、顧客のルールでフォントやフォントサイズなどの書式に
指定があるかもしれないので確認しておこう。

# 目次
### はじめに
この報告書は何についてまとめたものなのかを記載する。
### 改訂履歴
内容にどういった変更があったかを記載する。
初版では新規作成で良いだろう。
### 結論
比較した結果と概要を記載する。

当然ながら、製品を導入するには多額のお金がかかる。
規模にもよるが数百万～億単位なんてことも珍しくない。
そのお金を払うには決裁者と呼ばれる、
会社のお金を使う権限を持った人の承認を得る必要がある。
そんなエグゼクティブな方々は間違いなく多忙だろう。
そのため<font color="red">**「全部読まなくてもここだけ抑えれば大丈夫」**</font>という内容にする。

記載内容は簡潔に、
- 貴社ビジネスの課題は○○
- 課題解決には△△が必要
- △△を備える製品はA, B C
- Bは機能が乏しく、Cは費用が高額なため、Aを選定
- Aは◆◆がネックになるが□□で回避できる
- A導入の初期費用はn万円、月額費用はn万円

ざっとこんなものだろう。
美辞麗句だけでなく現実的な目線を交えながら、
デメリットをカバーできる文言を加えるとよいだろう。

## **以降は結論を証拠づける内容を肉付けしていく**
### 製品名、販売元ベンダー名、製品URL
できれば英語のURLも併記しておく。
海外製品の場合、英語のほうが更新が早いからだ。

### 機能比較(例)
- 対象OSのサポート可否
- 既存NW構成への変更要否
- 顧客環境への既設製品との連携可否
- ユーザビリティ
- 認証方式
- 運用負荷
- 拡張性
- エージェント導入の要否
- PoC支援可否

#### 比較表
項目はともかく、比較結果はなるべく見やすく記載したい。

### 費用
ユーザ数によって料金体系が異なるケースが多いため、
導入ユーザ数を顧客に確認しておく必要がある。
ここでネックになるのが、
どんなに優れた機能を持っていても予算には限りがあるため、
導入できない可能性があることだ。

また、具体的な料金を知るには、
顧客情報を入力したうえでベンダーへの問い合わせが
必要となるケースも少なくない。
そのため事前に顧客担当者と、
情報収集の際にベンダーへの問い合わせまで必要かを確認したほうが良いだろう。

# 情報収集時の留意点
### 情報ソースを絞る
記載する情報は販売元ベンダーのHPから得たもののみにし、
メディアや代理店HP等で得たものは記載せずに参考情報程度とするほうが良い。
そのメディアの主観が混じっていたり、
代理店独自のサービスと掛け合わせて実現できる機能としている場合もあるからだ。

### 機能の確認
導入バージョンで実現できることを確実に抑えておこう。
以前のバージョンでは実現できなかったものができるようになっていたり、
その逆もあり得るためだ。

### 情報を鵜呑みにするな
販売元ベンダーHPには都合の良いことのみ書いてあったり、
都合の良い表現をしているなどがあるので注意が必要だ。

- 「検知率○%」
→分母を載せていない
- 他社製品より当社製品のほうが優れている
→かのような記載

当たり前だが彼らは自分たちの製品を買ってほしいわけだ。
そのため、第三者機関が評価している記事があれば理想だ。

# さいごに
情報収集、資料作成、議事録ばかりのプロジェクトで面白くなかったが、
この内容を学べたのはいい機会だった。
Python ライブラリ　まとめ

## はじめに
atcoderでpythonを使う際に軽くみるためのメモ程度のもの
（僕が勉強すればするほど更新されていきます。頑張ります）
競技プログラミング初心者の方、活用していただけると嬉しいです！

##  itertools
```Python
import itertools
```
pythonでは標準ライブラリを上記のようにimport文を記述してから利用
###  【累積和】 itertools.accumulate()
ある区間の合計を求めたい時などは累積和を用いることで解けることが多い。
- [ABC 265 D - Iroha and Haiku (New ABC Edition)](https://atcoder.jp/contests/abc265/tasks/abc265_d)
```Python
num = [1, 2, 3, 6]
a = itertools.accumulate(num)

for i in a:
    print(i)
# 出力
# 1
# 3
# 6
# 12
```
listやsetにも簡単に型変換可能
```Python
b = list(itertools.accumulate(num))
print(b)
# [1, 3, 6, 12]
```
###  【組み合わせ】 itertools.combinations()
全ての組み合わせを作成してくれるやつ
- [ABC 263 C - Monotonically Increasing](https://atcoder.jp/contests/abc263/tasks/abc263_c)
```Python
a = itertools.combinations(range(1,5), 3)

for i in a:
    print(*i)
# 出力
#1 2 3
#1 2 4
#1 3 4
#2 3 4
```
第1引数・・・対象の配列
第2引数・・・何個ずつ取り出すか
*補足
`range(1,5)`：　[1,2,3,4]のlist
`*i`：　括弧などの記号をなしで出力する

###  【グループ化】 itertools.groupby()
ランレングス圧縮などで使われる
- [ABC 019 B - 高橋くんと文字列圧縮](https://atcoder.jp/contests/abc019/tasks/abc019_2)
```Python
l = 'aabbccdeee'
for k, g in itertools.groupby(l):
    print(k, list(g))

# 出力
# a ['a', 'a']
# b ['b', 'b']
# c ['c', 'c']
# d ['d']
# e ['e', 'e', 'e']
```
itertools.groupby()はキーとグループを返すため、グループをlistなどで取得するためには上記のように型変換を行わなければならない。
## collections
### Counterクラス
- [ABC 263 A - Full House ](https://atcoder.jp/contests/abc263/tasks/abc263_a)
```Python
from collections import Counter
```
配列内の数字（文字でも可）の出現回数を数え出し辞書型のようにしたもの。
```Python
num = [1, 2, 1, 1, 2]
num_counter = Counter(num)
print(num_counter)
# Counter({1: 3, 2: 2})
```
辞書型のサブクラスであるため、辞書型のメソッドを使うこともできる。
`values()` `keys()` `items()`etc...
for文でループすることも可能。

## math
```Python
import math
```
### 三角関数
- [ABC 259 B - Counterclockwise Rotation](https://atcoder.jp/contests/abc259/tasks/abc259_b)
```Python
# math.atan2(b, a) => tanθ = b/a の θを求める
theta = math.atan2(b, a)

# math.radians(a) => a度のラジアンを求める　
theta = math.radians(180)
```
***補足***
2πラジアン = 360°
##  heapq (優先度付きキュー）
以下の記事の引用
>優先度付きキュー (Priority queue) はデータ型の一つで、具体的には
・最小値（最大値）を O(logN)O(log⁡N)で取り出す
・要素を O(logN)O(log⁡N) で挿入する
ことが出来ます。
通常のリストだとそれぞれ O(N)O(N) ですので高速です。
「リストの要素の挿入」と「最小値（最大値）を取り出す」ことを繰り返すような時に使います。

https://qiita.com/ell/items/fe52a9eb9499b7060ed6
serverless frameworkで作成したAPIでLambdaに送信した値を取得。

# はじめに
Lambdaの引数から値を受信する方法を記載していく。
# メイン
dynamoDBになんやかんやするときに、使えるので書いてみた。
## パスから取得する
serverless frameworkでGETメソッドのAPIを作成するソースが以下になる。
API作成時のパスは、「https://{APIのId}.execute-api.{Resion}.amazonaws.com/dev/get/{id}」 のようになり、{id}の部分に渡したい値を書く。

```functions.yml
function:
 get:
  handler: get.get
  events:
    - http:
        path: get/{id}
        method: get
        # 統合サービスをLambdaにする
        integration: lambda
```
取得方法は、
```get.py
def get(event, context):
  # pathに{}で指定した値が入っている。
  path = event["path"]
　#pathの中にある["id"]から取得できる。
  id = path["id"]
  return id
```

## postした値から取得する
serverless frameworkでPOSTメソッドのAPIを作成するソースが以下になる。
API作成時のパスは、「https://{APIのId}.execute-api.{Resion}.amazonaws.com/dev/create」 になる。

```functions.yml
create:
  handler: create.create
  events:
    - http:
        path: create
        method: post
        # 統合サービスをLambdaにする
        integration: lambda
```
今回postするのは、
```
{
    "name": "佐藤太朗",
    "age": 7
}
```
取得方法は、
```create.py
def create(event, context):
  # bodyにjsonで送信した値が入っている。
  body = event["body"]
  #bodyの中にある["age"]から取得できる。
  age = body["age"]
  #bodyの中にある["name"]から取得できる。
  name = body["name"]
  return body
```


実際に記事探すより、検証してみたほうが速かった。トホホ…
構造化データマークアップ 本気で調査した件

# はじめに

マークアップやコーディングの基礎を実務で習得してきたが、
開発がだんだんと楽しくなってきて、
「サービスサイトの抱える課題」が見えてきた。

「**もっとサイトの品質をあげたい！**」と思うようになった。

# 品質の良いサイトとは

:::note
１. Googleが探しやすいページであること
２. Googleが理解しやすいページを作る
３. ユーザーが使いやすいページ構成であること
４. 不正行為を行わない
:::


**つまり ＼SEO対策／ が肝**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89216/739bd150-e38c-484d-26b7-1febc495ca9f.png)

# まずやったこと

**Googleサーチコンソールを見てみた**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89216/d5dc6b24-bdee-c3fc-dddf-8e1ea2d9010c.png)

未対策の「よくある質問」構造化マークアップで
サイト品質向上の余地がありそう！
難しそうだなあと思いつつも、すぐ調査をスタートした。

# そもそも・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89216/f612c405-8aca-6f09-c0ef-b87aa587045f.png)

# 構造化マークアップとは

**Googleのクローラーに、テキスト情報やコンテンツ内容を適切に理解してもらう記述方法**のこと。
いつも通りHTMLマークアップを行った部分に、構造化データを書き足せばOKとのこと。

記述方法は大きく２種。

:::note warn
１. Microdata（マイクロデータ）：HTMLにメタデータを直接記述する方式
２.JSON-LD（ジェイソン・エルディ）：JavaScriptを使ってページ内に挿入する方式
:::

Google推奨とされているのは[２]のJSON-LD形式とのこと。

このときまでは、[２]のJSON-LD形式でサクッと構造化マークアップしちゃうぞ！と思っていた・・・

# JSON-LD形式のデメリット
GoogleオススメのJSON-LD形式というのは、
「**利用者が目にする部分**」と「**Google側がクロールする部分**」の記述を分けて書く必要があった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89216/50f99cb2-13fd-1afb-a29d-13b0c944965b.png)

推奨ではないが、Microdata形式も調査することに。

# Microdata形式のメリット
一方、Microdata形式は「**HTMLにメタデータを直接記述する方式**」なので、
テキストを書き換えても漏れがない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89216/969eedb1-7099-bf72-08e3-c41ffe82d105.png)
Google推奨とされてはいないが、調べてみると<INS>SEOブログで普通に使用されてる（しかも検索順位も高い）。</INS>
チーム開発においてはとにかく**運用のしやすさが第一！！！！！**
ということで、よくある質問の構造化マークアップは、**Microdata形式**の記述で行うことになった。

# まとめ
JSON-LD形式に関しては、変更漏れの懸念が一番大きかったが、
動的に出力してるテキストについてはTwigタグを用いて変更漏れをなくす仕様も考えた。
しかし・・・
+ リッチリザルトテストツールでTwigタグがエラーで引っかかる
+ CMSなどで埋め込まれた装飾したテキストがエラーで引っかかる　etc…

問題も山積みで実装を避けることになった。

Microdata形式で実装したものは
無事にGoogle検索上でも閲覧できるようになった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89216/5f938be6-8b27-5775-9b37-2923ce8c13d8.png)
まだサイト品質向上の余地があるので、
引き続きアンテナ張って開発していきたい。
PostgreSQL: ストアドプロシージャの使い方

こちらのサンプルを改造しました。
[ストアドプロシージャの使い方（PostgreSQL）](https://qiita.com/jiyu58546526/items/5dd2cb70fd2f67d5acf9)

city というデータベースに、ユーザー　scott でアクセスできるとします。

## テスト用のテーブルの作成

```sql:create.sql
drop table in01;

create table in01 (id int primary key, operand1 int, operand2 int);
insert into in01 values (1,10,9);
insert into in01 values (2,20,8);
insert into in01 values (3,30,7);
insert into in01 values (4,40,6);
insert into in01 values (5,50,5);

drop table out01;
create table out01 (id int primary key, sum int, diff int);
```

実行

```text
$ psql -U scott -d city < create.sql 
DROP TABLE
CREATE TABLE
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
DROP TABLE
CREATE TABLE
```

## ストアドプロシージャの作成

```sql:sum_diff_proc.sql
drop procedure sum_diff_proc;

CREATE PROCEDURE sum_diff_proc(int) AS $$
DECLARE
ope1  int;
ope2  int;
BEGIN
SELECT operand1 INTO ope1 FROM in01 WHERE id = $1;
SELECT operand2 INTO ope2 FROM in01 WHERE id = $1;
INSERT INTO out01 VALUES ($1, ope1 + ope2, ope1 - ope2);
END;
$$
LANGUAGE plpgsql;
```

実行

```text
$ psql -U scott -d city < sum_diff_proc.sql 
DROP PROCEDURE
CREATE PROCEDURE
```

## ストアードプロシージャの実行

```sql:exec01.sql
select * from operand;

call sum_diff_proc(1);
call sum_diff_proc(2);
call sum_diff_proc(3);
call sum_diff_proc(4);
call sum_diff_proc(5);

select * from answer;
```

実行

```text
$ psql -U scott -d city < exec01.sql 
 id | operand1 | operand2 
----+----------+----------
  1 |       10 |        9
  2 |       20 |        8
  3 |       30 |        7
  4 |       40 |        6
  5 |       50 |        5
(5 行)

CALL
CALL
CALL
CALL
CALL
 id | sum | diff 
----+-----+------
  1 |  19 |    1
  2 |  28 |   12
  3 |  37 |   23
  4 |  46 |   34
  5 |  55 |   45
(5 行)
```

## 確認したバージョン

```text
PostgreSQL 14.5 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 12.1.1 20220730, 64-bit
```
岡山市のITコンサルティング会社　リブワークス

人×IT×CREATIVE

私たちは、デザイナー、エンジニア、会計士・税理士など、
多彩な専門家によって結成されたビジネスサポート専門チームです。
地元中小企業のIT・集客・人材活用・情報発信のサポートを通じ、
周囲の方々が幸せになれる企業づくりを支援しています。

https://www.libworks.info/
Wetな研究者のための、IGV (Integrative Genomics Viewer) を用いたBamファイルの確認方法

# はじめに
本稿では、IGV (Integrative Genomics Viewer) を用いて、生シーケンスデータ (.fastq) をリファレンスゲノムにマッピングしたファイル、Bamファイルを直感的に確認する方法について解説する。

# ワークフロー
1. IGVをインストール
2. samtoolsを用いてBamファイルのソートおよびインデックスの作成
3. IGVを用いてBamファイルを確認

## 1.IGVのインストール
まず初めに、お使いのパソコンにIGVをインストールする。公式サイト(https://software.broadinstitute.org/software/igv/download 2022年８月22日アクセス)から、ご自分のPCにあったバージョンをダウンロードする。筆者はMacBook Pro (14インチ、2021) を使用しているが、「IGV MacOS App Java included」 をダウンロードした。
![IGVDownload.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2643047/4c835b76-a52f-ac45-3d65-c9acee4b5569.png)
ダウンロードが終了したら、zipファイルを展開し、アプリケーションを起動し、確認する。

## 2. samtoolsを用いてBamファイルのソートおよびインデックスの作成
### 2-1 samtoolsのインストール
もしご自身のパソコンに導入済みでなければ、samtoolsをインストールするところからはじめる。
ターミナルを開き、下記コマンドを実行する。
```install_samtools.sh
brew install samtools
```
もしHomebrewすら導入していない場合は、下記、筆者の過去記事を参照して、インストールしておくこと。
https://qiita.com/shyu_manabe/items/682e6c73b368b0fe02ba

### 2-2 Bamファイルのソートおよびインデックスの作成
IGVでBamファイルを開くだけでは、中身を確認することはできない。あらかじめBamファイルを染色体順にソート、およびインデックス付けをする必要がある。IGVで確認したいファイルの名前を「filename.bam」として、下記のコマンドを実行する。
```samtools_sort.sh
samtools sort filename.bam -o filename_sort.bam
```
出力ファイル名 (-oの後) は各自の好みで構わないが、元のファイル名の拡張子の前に "_sort" をつけた名前にすることを推奨する。
続いて、下記コマンドでインデックス付けを行う。
```samtools_sort.sh
samtools index filename_sort.bam
```
上記を実行すると、「filename_sort.bam.bai」というファイルが生成されるので、それが確認できればOK。

## 3.IGVを用いてBamファイルを確認
最後に、手順２で作成したファイルをもとに、IGVでデータを確認する。
### 3-1 IGVの起動とリファレンスゲノムのダウンロード
IGVを起動すると、下図のような画面が表示される。
![IGV_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2643047/afe41054-5e82-0cc2-b564-15feed8c9e94.png)
左上のプルダウンをクリックすると、下図のようにリファレンスゲノムの一覧が表示されるので、各自のデータを取得した動物種のリファレンスゲノムを選択し、「OK」を押す (バージョンに注意)。
<img width="300" alt="IGV_1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2643047/a21c943f-daf9-6a9b-6564-b0935d11a5b7.png">

### 3-2 IGVでbamファイルを開く
IGVの「File」から、手順2で作成したファイルの中で、「filename_sort.bam」を開くと、リファレンスゲノム上にマッピングされたリードを視覚的に確認することができる。ファイルを開いて何もしないと、対象生物種のゲノム全てが表示されてしまっているので、下図の検索ボックスのところに、遺伝子名やゲノム上の位置情報を入力すると、皆様がお望みの情報が確認できるはずだ (下図ではなんのファイルも開いていないため、空白になっているが)。
![IGV_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2643047/9c0ceb93-e289-6a12-01b7-089d5e3f419d.png)

# おわりに
本稿では、IGVを用いて、マッピング済みシーケンスファイルを視覚化する方法を解説した。RNA-Seqなどの例においては、実際にBamファイルを直接確認する機会は少ないが、本稿で解説した方法で、生に近いデータを自分の目で確認することは、データの妥当性・正当性を確認するために必要であると、筆者は考える。
AWS CLIでAWS SES のテンプレート登録しようとしたら「Error parsing parameter 'cli-input-json': Invalid JSON received.」がでる


## 環境
Win10 cmd

## 問題
AWS cliでSESのテンプレート登録しようとして、下記実行
```
aws ses create-template --cli-input-json ./test.json 
```
登録されず、
Error parsing parameter 'cli-input-json': Invalid JSON received.
のエラーが出る。。

## 答え
いらないと思って消してたが、file://がいるらしい。。。
```
aws ses create-template --cli-input-json file://test.json
```
Accessで長いテキストに重複無しインデックス（ユニーク）設定した場合のインサートに注意

:::note warn
今後のAccessのアップデートで挙動が変わるかもしれません。
ここに書いた内容と同じ挙動になるかどうか、使う環境（バージョン）で動作確認した方がよいです。
:::

# 先頭255文字で重複判定される

例えば下記のようなテーブルを用意…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/7ead8b95-2e93-2377-39a2-85e52b0ee7ca.png)

下記SQLのように256文字インサート。

```sql
INSERT INTO tester ( long_str )
VALUES ('256文字だよあああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ0');
```

次、下記SQLのように **末尾を1文字だけ変えた256文字の値** をインサートしようとすると…

```sql
INSERT INTO tester ( long_str )
VALUES ('256文字だよあああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ1');
```

ユニークカラムに対する重複例外になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/e459d5d2-4905-a138-6bf4-391eeb3ab6c2.png)

また、 **末尾1文字だけ削って255文字** の値でも同様の重複例外になる。

```sql
INSERT INTO tester ( long_str )
VALUES ('256文字だよあああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ');
```

**さらに末尾1文字だけ削って254文字** の値ならインサート **できる** 。

```sql
INSERT INTO tester ( long_str )
VALUES ('256文字だよあああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ');
```

## まとめ

『長いテキスト』に、重複無しインデックス（ユニーク）を設定した場合…
**先頭255文字** まで一致しているレコードが既にあるとインサートできない。

「重複無しインデックス設定しているから、文字列全体を見て重複チェックしている **だろう**」
と思っていると思わぬバグになるので注意。

# バージョン

Windows 10 Pro 21H2 OSビルド 19044.1889
Microsoft Access for Microsoft 365 MSO (バージョン 2207 ビルド 16.0.15427.20166) 32 ビット
Node.js v12 を使用している Lambda をリストアップ

aws-cli で Node.js v12 を使用している Lambda をリストアップする方法です。
AWS　SSO を使用している場合の方法になります。

# AWS CLI の準備
aws cli のインストール手順は省略。
aws sso のスタート画面を開く。
対象のアカウントの  Command line or programmatic access から　```Option 1: Set AWS environment variables``` をコピー
ターミナルでペーストしてそのまま実行。

```
>export AWS_ACCESS_KEY_ID="ACCESSKEYID"
export AWS_SECRET_ACCESS_KEY="SECRETACCESSKEY"
export AWS_SESSION_TOKEN="SESSIONTOKEN"
```

# コマンドの実行
以下のコマンドを実行。
リージョン、Node.js のバージョンは適宜変更して実行。
```
aws lambda list-functions --function-version ALL --region ap-northeast-1 --output text --query "Functions[?Runtime=='nodejs12.x'].FunctionArn"
```

# コマンドの結果をVScodeで整形
対象の関数があった場合、コマンドの実行結果は以下のようなのが連なったものが出力される。
```
arn:aws:lambda:ap-northeast-1:123456789012:function:[lambda関数名]:$LATEST
```
欲しいのは関数名だけなのでVScodeでデータを整形していく。
置換機能で```arn:aws:lambda:ap-northeast-1:123456789012:function:```と、```:$LATEST```を削除。
（```:$LATEST```はLATESTが数字になっている場合もある。）
元データは改行が関数ごとで行われていないので、改行を置換すると見やすい。
置換機能の正規表現モードで```\n```を置換することで改行を置換できる。
![スクリーンショット 2022-08-22 13.41.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1488939/0fcd6a72-f256-e5aa-a0f4-f1defe34f92d.png)

また、関数は重複している可能性がある。

まず重複している関数を削除していく。
整形途中のテキスト全体を選択。（Command+A）
コマンドパレットを開く。(Command+Shift+P)
Sort Lines Ascending を実行。
![スクリーンショット 2022-08-22 14.07.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1488939/fa55d623-c752-b656-40ca-799a591741a0.png)

次に正規表現で重複行を削除する。
検索欄を表示。(Command+F)
以下の画像の赤枠部分から、正規表現モードにする。(もしくはCommand+Option+R)
検索欄に```^(.*)(\n\1)+$```を、置換に```$1```を入力。
置換を実行。

![スクリーンショット 2022-08-22 14.11.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1488939/ae48e96e-f615-d014-62d0-3c4e8546a9d5.png)

以上でリストが完成。

# 参考資料

https://www.hide10.com/archives/33943
FlutterのMethodChannelで複数パラメータ使う

公式ドキュメント
---

https://docs.flutter.dev/development/platform-integration/platform-channels


Flutter -> host
---

**Flutter**

```dart
  const channel = MethodChannel('channnelName');
  final result =
      await channel.invokeMethod('methodName', <String, dynamic>{
    'param1': foo,
    'param2': bar,
  });
```

**Android**

```kotlin
methodChannel.setMethodCallHandler { call, result ->
    when (call.method) {
        "methodName" -> {
            val param1 = call.argument<Int>("param1")
            val param2 = call.argument<Int>("param2")
            result(param1 * param2)
        }
    }
}
```

**iOS**


```swift

        methodChannel?.setMethodCallHandler({(call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
            switch call.method {
            case "methodName":
                if let args = call.arguments as? Dictionary<String, Any>,
                    let param1 = args["param1"] as? Int,
                    let param2 = args["param2"] as? Int {
                    result(param1 * param2)
                } else {
                    result(FlutterError.init(code: "bad args", message: nil, details: nil))
                }
                break
            default:
                break
            }
        })

```

host -> Flutter
---

**Android**

```kotlin
            val params = hashMapOf(
                Pair("param1", 1),
                Pair("param2", 2),
            )
            methodChannel.invokeMethod("methodName", params)
```

**iOS**

```swift
        var params = [String: Any]()
        params["param1"] = 1
        params["param2"] = 2
        methodChannel.invokeMethod("methodName", arguments: params)
```

**Flutter**

```dart
    methodChannel.setMethodCallHandler((call) {
      switch (call.method) {
        case "loadStart":
          int param1 = call.arguments["param1"];
          int param2 = call.arguments["param2"];
          print(param1 * param2);
          break;
      }
      return Future.value('complete');
    });
```
Pythonが嫌いなのでC++版のPytorchで画像認識をやってみる 8日目 辞書型を移植する

# 辞書型
pythonのコードを見ているとこんなのが出て来た。
```python:辞書型
obj_scales = {'feature_1': 0.1,
             'feature_2': 0.2,
             'feature_3': 0.4,
             'feature_4': 0.8
            }
```
辞書型と言うらしい。こんな風に使うらしい。
```python:Python
obj_scales['feature_3']
#0.4を返す
```
仕組みは簡単でC++でシコシコ作っても何とかなりそうだが、デバッグするとき見た目がオリジナルと全然違うのはなあ、と探していたら最近のC++には辞書型があるらしい。
↓詳しい説明に感謝。

https://qiita.com/_EnumHack/items/f462042ec99a31881a81

これであっさり解決である。型といってもテンプレートである。
```C++:C++
std::map<std::string, int> obj_scales = {
    {"feature_1", 0.1 },
    {"feature_2", 0.2 },
    {"feature_3", 0.4 },
    {"feature_4", 0.8 }
};
```
解決解決と思っていたらこんなのが出て来た。
```python:Python
map_dims = {'feature_1': [40,32],
             'feature_2': [20,16],
             'feature_3': [10,8],
             'feature_4': [5,4]
            }
```
intの所を配列で定義すればいいのか?
```C++:C++
std::map<std::string, int[2]> map_dims ={
    {"feature_1",{40,32}},
    {"feature_2",{20,16}},
    {"feature_3",{10, 8}},
    {"feature_4",{5,  4}}
};
//エラー
```
だめかー。
「E0289	コンストラクター "std::map<_Kty, _Ty, _Pr, _Alloc>::map [代入_Kty=std::string, _Ty=int [2], _Pr=std::less<std::string>, _Alloc=std::allocator<std::pair<const std::string, int [2]>>]" のインスタンスが引数リストと一致しません」
```C++:C++
std::map<const std::string, int*> fmap_dims = {
    {"feature_1",{40,32}},
    {"feature_2",{20,16}},
    {"feature_3",{10, 8}},
    {"feature_4",{5,  4}}
};
//エラー
std::map<const std::string, int[]> fmap_dims = {
    {"feature_1",{40,32}},
    {"feature_2",{20,16}},
    {"feature_3",{10, 8}},
    {"feature_4",{5,  4}}
};
//エラー
```
困った時のGoogle先生だが参考になる解決策が無さそう。英語(std::map array)で検索してみると、そのものずばりが出てきた。

https://stackoverflow.com/questions/2582529/how-can-i-use-an-array-as-map-value

上の記事によると要するにmapの要素に配列はダメで、配列のポインタ、もしくは構造体を定義しろと言う事らしい。
```C++:C++
int _x1[2] = { 40, 32 };
int _x2[2] = { 20, 16 };
int _x3[2] = { 10, 8 };
int _x4[2] = {  5, 4 };

std::map<const std::string, int(*)[2]> fmap_dims = {
{"feature_1",&_x1},
{"feature_2",&_x2},
{"feature_3",&_x3},
{"feature_4",&_x4}
};
```
これで通った。変数を別に定義するのは面倒くさいが今のところこれがPythonのオリジナルコードに近い。
XAMPPのバージョンはv3.3.0ではありません

# はじめに

　質問サイトで、XAMPP（読み方はザンプでは無く**シャンプ**である）のバージョンは3.3です、みたいなのを頻繁に見てしまう。
　「違うんだ、それはXAMPPのバージョンではない」ということで、簡単にまとめます。

# XAMPP Control Panelというツールのバージョンが v3.3.0 となっている

　うちのPCに入っているXAMPP Control Panelを起動した状態の画像を引用する。
![Snap_20220822_112557_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45595/9025161f-28ed-4d46-e8a1-80f1eaa79f00.png)

　初心者の方々は、たぶんここに現れる「v3.3.0」の箇所をXAMPPのバージョンだと勘違いしているのではないだろうか。

　XAMPPのわりと早い時期から、XAMPP Control Panelという管理ツールのバージョンが固まっていて、XAMPPのバージョンとの乖離が激しい。そのため、このバージョン番号を報告されてもXAMPPのバージョンの想像がつかないため、このバージョン番号は何の役にも立たない。

# XAMPPのバージョン番号には、そんなに価値はない（独断と偏見による）

　XAMPPには比較的簡単にサーバー環境を簡便に立ち上げられるよう、必要なソフトウェアをバンドルしたものである。
　そのため、当初XAMPPのバージョンはバンドルしたタイミングを知るくらいの薄い情報でしかなかった。
　バンドルしているソフトのどれとも連動していないし、仮に「XAMPP 1.7.2」と聞いて何が含まれているかは調べないとわからないわけで。　ちなみに「Apache (2.2.12), MySQL (5.1.37), PHP (5.3.0), phpMyAdmin (3.2.0.1)」などの[更新を含んでいる](https://community.apachefriends.org/f/viewtopic.php?f=13&t=36622)らしいけれど。

　わかりやすさと簡便さのために、XAMPPのバージョン番号は現在PHPと連動するようになっている。（[Apache Friends Support Forum • View topic \- New XAMPP 5\.5\.19 & 5\.6\.3](https://community.apachefriends.org/f/viewtopic.php?f=13&t=69838#p239215)に説明あり。）（XAMPPの[バージョン情報](https://ja.wikipedia.org/wiki/XAMPP#%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E6%83%85%E5%A0%B1)）
　その理屈では、XAMPPのバージョンを知るためにはひとまずPHPのバージョンを調べればいいってことになる。　でも、大して重要じゃない。

　XAMPPはサーバーソフトウェア類をバンドルしたものなので、大事なことはXAMPPそのもののバージョン番号よりも、関与する**サーバーソフトウェア類のバージョン番号を押さえること**だと覚えておきたい。
　（やろうと思えば、PHPだけバージョンを差し替えることだってできてしまうので、そうするとXAMPPのバージョンなんて対して役に立たなくなるため。）

## apache httpdのバージョンを調べるには

　XAMPPのインストール先が「C:\xampp」だとすると、「C:\xampp\apache\bin」にあるhttpd.exeに対して、「httpd -v」とすることでバージョン情報を取得できる。
　（入力するコマンドと実行結果をわかりやすくするために画像で掲載したものの、通常はバージョン情報の出力結果のみ貼り付けること。）
![Snap_20220822_134227_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45595/ab9c1288-046f-a911-438a-33b61e4db9fe.png)

## phpのバージョンを調べるには

　同様に、「C:\xampp\php」にあるphp.exeに対して、「php -v」とすることでバージョン情報を取得できる。　質問サイトには、バージョン情報としてまるごと貼り付けて報告しよう。
　（入力するコマンドと実行結果をわかりやすくするために画像で掲載したものの、通常はバージョン情報の出力結果のみ貼り付けること。）
![Snap_20220822_134450_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45595/7b8656c6-f6ae-a16a-3dd9-e0daa1cbe368.png)

　（MySQLは普段まったく使っていないので、インストールからも省いてあって試せなかった。）

# とは言え、簡便にバージョン情報を知るには

　XAMPPをインストールする時に使ったファイルのファイル名でいいんじゃないかと。
　例えば「xampp-windows-x64-7.4.19-0-VC15-installer.exe」なら、64bit版で7.4.19だとわかる。
　「xampp-windows-x64-8.1.2-0-VS16-installer.exe」なら、64bit版で8.1.2だとわかる。
　ネット上でリリースノートを検索すれば、バンドルされているバージョン情報もわかるという仕組み。

# 余談：XAMPP Control Panel豆情報

　細かいことだけど知っとくと便利な話。

## 起動する時は必ず「管理者モード」で実行すること

　例えばapache httpdやtomcatをサービス登録したりするのに、普通にダブルクリックなどで起動してしまうと、権限不足でXAMPP Control Panel終了時にエラーが発生して厄介。

### 起動時に「管理者として実行」を指示する方法

　スタートメニューから起動する時は、右クリックメニューを表示して図のように「管理者として実行」をするのが良い。
![Snap_20220822_180955_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45595/e9feea66-2d27-2dec-990f-df17281d654f.png)

### ショートカットを変更して

　スタートメニューで「ファイルの場所を開く」として、XAMPP Control Panelのショートカットを図のようにして「管理者として実行」にチェックを入れておくと、いちいち右クリックメニューをしなくても良くなるのでラク。
![Snap_20220822_181648_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45595/a3edfdae-6c64-c05b-cc21-1e4b35fb829f.png)
Rustで値を交換する

## はじめに

Rustで値を交換する方法を調べたのでまとめました。

## 2つの変数の値を交換

以下の様に変数`x`と変数`y`があるとします。
2つの変数の値をどのように交換すればよいでしょうか。

```rust
let mut x = String::from("ABC");
let mut y = String::from("DEF");
```

すぐ思いつくのが一時変数を使用して交換する方法です。

```rust
let tmp = x;
x = y;
y = tmp;
```

Rustでは変数の値を別の変数に代入すると所有権の移動が発生します。
すると元の変数は**未初期化状態**になり使えなくなりますが、値を再代入することで使用可能になります。
※プリミティブ型は自動的に値がコピーされるため所有権の移動は発生しません

また、タプルを使用した方法だと1行で交換できます。
この方法だと変数`x`と変数`y`が一時的に未初期化状態になり値が再代入されます。

```rust
(x, y) = (y, x);
```

変数を未初期化状態にせずに値を交換するには`std::mem::swap`関数を使います。
引数には変数の可変参照を渡します。

```rust
std::mem::swap(&mut x, &mut y);
```

## Option::Someの中身と変数の値を交換

次に片方の変数がOption型の場合を考えます。

```rust
let mut x = String::from("ABC");
let mut y = Some(String::from("DEF"));
```

一時変数とタプルを使った交換方法は以下の通りです。
Option型の中身を取り出すには`unwrap`関数を呼び出します。

一時変数

```rust
let tmp = Some(x);
x = y.unwrap();
y = tmp;
```

タプル

```rust
(x, y) = (y.unwrap(), Some(x));
```

次に`std::mem::swap`関数を使った交換を考えます。

```rust
std::mem::swap(&mut x, &mut y.unwrap());
```

しかし上記のコードは正しく動作しません。
`unwrap`関数を呼び出すと所有権の移動が発生するからです。
上記のコードの場合、変数`x`には文字列`DEF`が移動しますが
変数`y`は未初期化状態になっています。

所有権を移動させずに中身の可変参照を取得するには`as_mut`関数を呼び出します。
`as_mut`関数は`Option<T>`から`Option<&mut T>`の変数を生成して返します。
不変参照の場合は`as_ref`関数を呼び出します。

よって正しく動作するコードは以下の通りです。

```rust
std::mem::swap(&mut x, y.as_mut().unwrap());
```

## 配列内の要素を交換

次に配列やベクタ内の要素を交換する方法を考えます。

```rust
let mut ary = [String::from("ABC"), String::from("DEF")];
```

この場合は一時変数やタプルを使用した交換はできません。
配列やベクタの要素は未初期化状態になるのが禁止されているからです。

一時変数

```rust
let tmp = ary[0]; // ary[0]が未初期化状態になるのでコンパイルエラー
ary[0] = ary[1];
ary[1] = tmp;
```

タプル

```rust
(ary[0], ary[1]) = (ary[1], ary[0]); // ary[0]とary[1]が未初期化状態になるのでコンパイルエラー
```

`std::mem::swap`関数を使った交換もできません。
特定の変数に対する可変参照は複数存在できないからです。

```rust
std::mem::swap(&mut ary[0], &mut ary[1]); // 変数aryに対する可変参照が2つあるのでコンパイルエラー
```

配列やベクタには専用の`swap`関数が存在します。
交換したい要素のインデックスを指定します。

```rust
ary.swap(0, 1);
```

## まとめ

* 2つの変数の値を交換するには以下の方法がある
  * 一時変数を使用する
  * タプルを使用する
  * `std::mem::swap`関数を使用する
* 配列やベクタの要素は専用の`swap`関数でしか交換できない

## 参考文献

https://doc.rust-lang.org/std/mem/fn.swap.html

https://doc.rust-lang.org/std/primitive.slice.html#method.swap
qiitaに上がっていた初心者用webアプリ（java）を作成してみたときの備忘録

## 1.はじめ
Qiitaに投稿されていたwebアプリを作成した際に悩まされたエラーの解消方法について記載しておきます。

## 2.対象エラー
There was an unexpected error (type=Internal Server Error, status=500).
could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet

SQLに関するエラーだとはわかりましたが、今回SQLファイルは作成していなかったのでどこでエラーになっているのかわかりませんでした。

## 3.解決方法
上記エラーで検索してヒットしたサイトを見てみると、SQLテーブルを事前準備として作成しているサイトが多く見つかりました。
そこで、テーブルを作成するSQLを対象サーバー内で実行しました。
すると、エラーは消えて動くようになりました。
```
create table customer (
    id              serial   primary key, name            varchar(20));

```
てっきりテーブルは自動作成されるものだと思っていたのが原因だったようです。

## 4.まとめ
ほかにもupdate.htmlのファイルにコードを書き漏らしていたり、誤字などが多くみられました。
ですが、とりあえず作成できてよかったです。

## 参考資料
[学習にちょうど良いWebアプリを作成【SpringBoot+Thymeleaf+PostgreSQL】](https://qiita.com/tk_230to/items/61628799a6b0858fd823#732-modelentity%E3%82%AF%E3%83%A9%E3%82%B9%E4%BD%9C%E6%88%90)
IME切替を、Win/Macで共通化するKarabiner-Elements設定

ただし、MacはUS配列のキーボードとし、IME切替は昔ながらの`Command+Space`。
Windowsは、以下の例では、AmazonWorkspacesを使用する。



Karabiner-Elements Preferences > Misc > Open config folder
rulesに以下を追加。

```

  "rules": [
    {
      "description": "Switch IME Mode with Command+SPACE",
      "manipulators": [
        {
          "type": "basic",
          "from": {
            "key_code": "spacebar",
            "modifiers": {
              "mandatory":["left_command"]
            }
          },
          "to": [
            {
              "key_code": "spacebar",
              "modifiers": "left_control"
            }
          ],
          "conditions":[
            {
              "type": "frontmost_application_if",
              "bundle_identifiers":[
                "^com\\.amazon\\.workspaces$"            
              ],
              "description": " in Amazon Workspaces"
            }
          ]
        }
      ]
    }
  ]
```
[Tips]insertメソッドでコールバックを発火させずに単一のレコードを作成する(Rails)

## コールバックを呼ばずにデータを作りたい

Railsでレコードを作成する時、コールバックを発火させずにデータを作成したい時が（基本的にない方がよいですが）ごく稀に存在します。
データを大量に作る時は、Rails6以降なら下記のように[insert_all](https://railsdoc.com/page/insert_all)を使うと良いでしょう。

```ruby
Article.insert_all([
  # created_at、updated_atが存在しrecord_timestampsをfalseにする場合、attributesの中に書いておく必要があるので注意
  {  title: "How to use qiita", author_id: 1 },
  {  title: "Why does elasticsearch use inverted index?", author_id: 2 }
])
```

しかし、一つのレコードしか作らないのに`insert_all`を使うために配列を作るのは少々大仰な気がします。

## そこでinsertメソッド

このような時は、`insert`メソッドを利用することで、コールバックなしでデータを作成することができます。

```ruby
Article.insert(
  {  title: "How to use qiita", author_id: 1 }
)
```

createメソッドなどと同様、登録できなかった場合にエラーを出させたい場合は`insert!`を使うと良いです。
また、オプションも`insert_all`同様、タイムスタンプの自動設定を強制の可否決められる`record_timestamps`、戻り値の属性を指定できる`returning`、重複でスキップするカラムを指定できる`unique_by`の３オプションが利用できます。

:::  note warn
`returning`オプションはPostgreSQLのみ、`unique_by`オプションはPostgreSQLとSQLiteのみのオプションです。
:::

## REF

- [実装](https://github.com/rails/rails/blob/984c3ef2775781d47efa9f541ce570daa2434a80/activerecord/lib/active_record/persistence.rb#L66-L68)
PowerAutomate備忘録「Outlookスケジュールのカテゴリでの判定」

# はじめに
* タイトルにある通りoutlookのスケジュールのカテゴリの条件判定ですこしてこずったので備忘録として残しておく。

# 今回やりたかったこと
* 祝日・休日かどうか確認し、通知をする
* Outlookのカテゴリを利用
    * 日本の休日を利用すれば楽に実装できるのだが、なぜか自分のPCでスケジュールに表示されないので、仕方なく。
    * カテゴリを活用することが個人的に多いので休日判定以外にも使い道がありそう(リマインダなど)。
    * カテゴリ(名：休日)がついている日があるかどうかで判定する(画像の15日の夏期休暇)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2479387/a2636b6f-badd-5a7a-2a8c-882a2139c442.png)


# 最終的な実装内容

##### カテゴリ(休日)情報を含む終日スケジュール情報を(当日分のみ)取得し、カテゴリ(休日)がついているものが含まれるかどうかを判定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2479387/920428a3-6f86-7de2-950b-b961741b01ef.png)

* 各アクションの詳細

|  アクション名  |  名前  |  種類  |  値  |  その他  |
| ---- | ---- | ---- | ---- | ---- |
|  繰り返し  |  N/A  |  N/A |  N/A  |  実行したい時間・頻度を自身で設定  |
|  変数を初期化する  |  開始時刻  |  文字列  |  formatDateTime(addHours(utcNow(),9),'yyyy.MM.dd')  |  値は式で定義  |
|  変数を初期化する  |  終了時刻  |  文字列  |  formatDateTime(addHours(utcNow(),33),'yyyy.MM.dd')  |  値は式で定義  |
|  イベントカレンダービューの取得(V3)  |  N/A  |  N/A  |  N/A  |  設定詳細は別途記載  |
|  変数を初期化する  |  イベント結果  |  アレイ  |  value  |  値は動的なコンテンツ>value  |
|  条件  |  N/A  |  N/A  |  N/A  |  判定式は別途記載  |

* イベントカレンダービューの取得(V3)設定の詳細

|  カレンダーID |  開始時刻  |  終了時刻  |  フィルタークエリ  |補足|
| ---- | ---- | ---- | ---- | ---- |
|  予定表※1  |  動的なコンテンツ>開始時刻  |  動的なコンテンツ>終了時刻  |<font color="Red">categories/any (category : category eq '休日')</font> |  ※1 カレンダーIDは自分の予定表を選択  |

* 条件の詳細

|  値の選択(左端) |  比較演算子  |  値の選択(右端)  | 補足 |
| ---- | ---- | ---- | ---- |
|  式> empty(variables('イベント結果'))  |  次の値に等しい  |  false  |祝日/休日がある場合は'はいの場合'へ進む|


# 躓いた点
* カテゴリのフィルタークエリの定義

カレンダーのイベントビューの中身を確認すると。。。

```
[
  {
    "subject": "夏期休暇",
    "start": "2022-08-15T00:00:00.0000000",
    "end": "2022-08-16T00:00:00.0000000",
    "startWithTimeZone": "2022-08-15T00:00:00+00:00",
    "endWithTimeZone": "2022-08-16T00:00:00+00:00",
    "body": xxxxxxxx",
    "isHtml": true,
    "responseType": "none",
    "responseTime": "0001-01-01T00:00:00+00:00",
    "id": "xxxxxx",
    "createdDateTime": "2022-08-22T00:08:12.6190438+00:00",
    "lastModifiedDateTime": "2022-08-22T00:15:17.9104213+00:00",
    "organizer": "xxxxx@xxxxx.co.jp",
    "timeZone": "UTC",
    "iCalUId": "xxxxxxxxxxxxxxxxxxx",
    "categories": [
      "休日"
    ]
}

```

categoriesで値持っていることを確認しました。


上記をもとに最初以下のように記載していました。
```:フィルタークエリ
categories eq '休日'
```

手動テストすると。。。


```:実行結果
Could not find a property named 'categories' on type 'microsoft.graph.event'.
clientRequestId: xxxxxxxx-xxxxxxxxxxxxx
serviceRequestId: xxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxx
```
categoriesなんてみつからないと。。

自分で調べてみて参考URLにあるany演算子を使って書いてあげる必要がありました。


# 参考URL
https://docs.microsoft.com/ja-jp/azure/search/search-query-odata-collection-operators

https://docs.microsoft.com/ja-jp/onedrive/developer/rest-api/concepts/filtering-results?view=odsp-graph-online&WT.mc_id=BA-MVP-5004053#supported-operators

https://docs.microsoft.com/ja-jp/azure/search/search-query-odata-filter
audioplayersを実装する上で躓くポイントの解決方法

初心者なので具体的なことは書けませんが自分が躓いていたことを解決した際の記録として残しています。

### 解決したこと
flutterでボタンを押すと音が再生されるものを作っている最中
audioplayersを実装する上でAudioPlayerStateなどがエラーになってしまった時の解決方法


### 発生している問題・エラー
```
Undefined class 'AudioPlayerState'.
```
このAudioPlayerStateがエラーになる

```dart
  AudioPlayer audioPlayer = AudioPlayer();
  AudioPlayerState audioPlayerState = AudioPlayerState.PAUSED;
  String url = 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-13.mp3';
```


### 解決方法
AudioPlayerStateをPlayerStateに.PAUSEDを小文字に変更する。
ついでに
.PLAYINGも小文字にすると、onAudioPositionChangedはonPositionChangedに変えるとエラーが治ります！！
```dart
  AudioPlayer audioPlayer = AudioPlayer();
  PlayerState audioPlayerState = PlayerState.paused;
  String url = 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-13.mp3';
```
未経験から就活してみた②

<h1>目次</h1>
<ul>
<li>概要</li>
<li>ITパスポートの取得</li>
<li>ポートフォリオ作成</li>
</ul>

<h1>概要</h1>
こんにちは、中学校の先生です。今回は就活第2弾として、今やっていることをメモしておこうと思います。大きく分けて、資格の取得とポートフォリオ作成の2点です。

<h1>ITパスポートの取得</h1>
とりあえず夏休みの3週間を利用して、ITパスポートの資格を取得しました。勉強期間は3週間ですが、1日2時間未満を続けていたので、実働40〜50時間程度です。参考書兼過去問1冊で済みました。<br>
この資格自体はよく「意味ない」とか「使えない」と言われていましたが、私は勉強していて興味深く感じました。特にストラテジ分野はよくあるビジネス用語をまとめたり、一般企業がどのように組織を作っているのか把握したりすることができました。<br>
こと「IT業界未経験」の人が入り口に立つには、無駄じゃないのではないか、と思っています。基礎数学とか基礎コーディングの確認には良し。ただ業務において易しい内容であることには間違いなかったので、ぶっちゃけ<b>採用に繋がるかって言われると怪しいかも</b>しれないです。

<h1>ポートフォリオ作成</h1>
前回の記事で書きましたが、色んな方とカジュアル面談した結果、「どれだけプロダクトを実現できるか」をアピールするためにポートフォリオ作るといいよ〜と多くの方からアドバイスをいただきました。<br>
そこで、私も以前から温めていた案を実践してみることにしました。それがこちらの記事です。<br>


(https://qiita.com/Daha/items/e04c14dbec3af7133b27)


<br>
元々棒人間のゲームを作ったり、プログラミングコンテストの過去問を解いてみたりといった経験はあったのですが、実際人に見せるものを作るとなると、また違う視点でコーディングすることができました。改良案がゾクゾク湧いていて、妄想が止まりません。楽しかったです。<br><br>

今回は以上となります。最後までご覧いただきありがとうございました。引き続き就活頑張ります。
Reactでコンパイルできているのにindex.jsの内容がない

# はじめに

この記事は2022年9月にまとめていた「細かいつまずいたことをメモしておく(9月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

index.jsxをnpm run devでコンパイルしているのにindex.jsにその内容がブラウザに表示されなかった

# 解決方法

おそらくだが`tsconfig.json`を利用していたためだった
`index.ts→index.js`に変更すると表示された
npm run devでERR_OSSL_EVP_UNSUPPORTEDでビルドに失敗する

# はじめに

この記事は2022年9月にまとめていた「細かいつまずいたことをメモしておく(9月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

`npm run dev`をしたところ以下のエラーが発生した

```
ERR_OSSL_EVP_UNSUPPORTED
```

Webackのビルドがうまくいかない

# 解決方法

```
export NODE_OPTIONS=--openssl-legacy-provider
```

としたところビルドができるようになった

# 参考

https://stackoverflow.com/questions/69394632/webpack-build-failing-with-err-ossl-evp-unsupported
TypeScriptでNo inputs were found in config file 'tsconfig.json'というエラーが出る

# はじめに

この記事は2022年9月にまとめていた「細かいつまずいたことをメモしておく(9月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

TypeScriptで以下のエラーが発生した

```
No inputs were found in config file 'tsconfig.json'. Specified 'include' paths were '["**/*"]' and 'exclude' paths were '[]
```

# 解決方法

これはtsファイルが存在しないのに`tsconfig.json`が存在していることにエラーを出している

ダミーの`tsファイル`を作成することでエラーは解消された
ARマーカの均等配置

ARマーカを均等に配置した用紙の作成方法

# 環境

ubuntu 20.04

# 方法

まずARマーカの画像を用意

https://qiita.com/hoshianaaa/items/a008ffb4ee518dbbbd75

その後画像編集ソフトで開き複製し、均等に並べます

画像編集のソフトにはInkscapeを使用します


まずInkscapeをinstall

http://serverarekore.blogspot.com/2020/04/ubuntu-desktop-2004inkscape.html

```
sudo add-apt-repository -y ppa:inkscape.dev/stable

sudo apt-get update

sudo apt-get -y install inkscape
```

次にInkscape 実行します

inkscape開くと↓こんな感じ
![Screenshot from 2022-08-22 12-18-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/cfe5152f-73fe-810f-559d-00e629daf5b7.png)

画像をインポート(今回自分はsvg画像を使用)
各画像の座標値を適切な値に設定し保存する
![Screenshot from 2022-08-22 12-20-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/569563d7-a9c3-714f-121e-23dacafdf39d.png)
一度ブラウザで開いて,pdf化した後印刷して使用(10mmずれた)

svg画像をブラウザでpdfに変換する際に,詳細設定で余白の削除を設定するとある程度サイズがあった.(2mm程度ずれる.)
【受験記録】AWS Certified Database - Specialty (DBS-C01)

## 前提
- 6年目エンジニア
- アプリケーション開発メイン
- インフラは少しだけ
- AWS　CLF,　Associate3つ, SAP, DAS, ANS, MLSは保持
- 受験日 2022/8/11


##試験結果
点数:804点/750点/1000点(取得スコア/合格ボーダー/満点スコア)
スコアパフォーマンス: 全セクションで"コンピテンシーを満たしている"

## 試験感想
- RDS, Auroraの比率が高め
    - 7割程度くらいの印象
    - RDSではできず、Auroraだけできること（クローンなど）はちゃんと理解した方がよさそう
    - アクセス制御はNW(SGなど)で
    - 個人的にバックアップや暗号化の部分がいまいちなままだった

- DynamoDB
    - スキーマ設計(PK, SK, インデックス)、各種ユニットの計算などがでていた印象
    - アクセス制御はIAMロールで

- 時間には余裕がある
    - 自分が解いた時は約1時間程度で1周、見直し含めて1時間半程度で完了
Laravel マイグレーション

# マイグレーションとは

データベースのバージョン管理機能
アプリケーションのデータベースを定義および共有することができる

# マイグレーションファイルの生成

### ①migrationコマンドを実行
database/migrationsディレクトリに配置される
~~~
php artisan make:migration ファイル名
~~~

### ②生成されたマイグレーションファイルのupメソッドの中に記述していく
~~~php
public function up()
{
    Schema::create('users', function (Blueprint $table) {
           $table->id();
           $table->string('name');
           $table->string('email')->unique();
           $table->timestamp('email_verified_at')->nullable();
           $table->string('password');
           $table->rememberToken();
           $table->timestamps();
       });
}
~~~

### ③マイグレーション実行
migrateコマンド実行でテーブルが生成される
~~~
php artisan migrate
~~~

# カラム作成
### 生成できるデータ型(一例)
~~~php
$table->boolean(カラム名);  // BOOLEAN型

$table->char(カラム名, サイズ);　　　// 文字列カラム、第二引数で長さを指定 

$table->date(カラム名);　　// DATE型　日付カラム

$table->dateTime(カラム名); // 日時カラム

$table->id();　　//  idカラム 

$table->integer(カラム名); // 数値カラム

$table->softDelete(); // deleted_atカラム追加

$table->text(カラム名, サイズ); // 文字列カラム

$table->timestamp();  //  created_at , updated_atカラム追加
~~~

### カラムに属性を与えるメソッド
~~~php
->nullable()  // カラムにNULLを許可する

->default(デフォルト値) // カラムのデフォルト値を指定

->unsigned() // 数値型のカラムを符号なしにする
~~~
### インデックスの付与と削除を行うメソッド
~~~php
->primary(カラム名) // プライマリーキーを付与

->unique(カラム名)  // ユニークキーを付与する

->index(カラム名) // インデックスを付与

->dropPrimary(プライマリーキー名) // プライマリーキーを削除

->dropUnique(ユニークキー名)  // ユニークキーを削除

->dropIndex(インデックス名)　// インデックスを削除
~~~

# ロールバック
マイグレーションで作成・更新したテーブルを元に戻したり削除する

~~~php
php artisan migrate:rollback // 最新のbatchをロールバック
--step バッチ番号　// バッチ番号を指定するオプション
~~~

※バッチの確認はマイグレーションの実行時に作成されるmigrationsテーブルのbatchカラムでできる
![migrate2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642970/21e22fa9-6df7-f159-28b6-db75a4d1eb68.png)
 
~~~
php artisan migrate:reset　　// 全てのマイグレーションをロールバック

php artisan migrate:refresh　　// 全てのマイグレーションをロールバック後再度マイグレーション実行

php artisan migrate:fresh　// データベースからすべてのテーブルを削除したあと、migrateコマンドを実行する
~~~
AtCoderログ：ABC265

## ABC265に参加しました
今回はA, B, Cの3完でした。
A: 3分
B: 8分
C: 19分

## 今回のコンテストでのレート変動
189→243（パフォーマンス：739）

## A問題-Apple
単純に解くとREになる罠でした。
あくまで最小値を取る必要がありました。
```cpp
// 提出コード
int main() {
  int x, y, n;
  cin >> x >> y >> n;
  int res = x * n;
  int Y = n / 3;
  int X = n % 3;
  res = min(res, y * Y + x * X);
  cout << res << endl;
  return 0;
}
```

## B問題-Explore
ボーナス部屋をmapで持っておくことでO（1）で持ち時間の増加を行えます。
あとは問題文の通りにシミュレーションしていくのみです。
```cpp
// 提出コード
int main() {
  long long n, m, t, x, y;
  cin >> n >> m >> t;
  vector<long long> a(n + 1);
  map<long long, long long> mp;
  rep3(i, 1, n) cin >> a[i];
  rep(i, m) {
    cin >> x >> y;
    mp[x] = y;
  }
  rep3(i, 1, n) {
    if (mp.count(i)) t += mp[i];
    t -= a[i];
    if (t <= 0) {
      cout << "No" << endl;
      return 0;
    }
  }
  cout << "Yes" << endl;
  return 0;
}
```

## C問題-Belt Conveyor
B問題と同様にシミュレーションの問題でした。特定のアルゴリズムを使用する必要は多分なかったと思います。
自分の場合は各マスの文字と通ったことがあるかどうかをpairで所持しました。
```cpp
// コンテスト後にリファクタしたコード
int main() {
  int h, w;
  cin >> h >> w;
  vector<vector<pair<char, bool>>> v(h, vector<pair<char, bool>>(w));
  char g;
  rep(i, h) {
    rep(j, w) {
      cin >> g;
      v[i][j] = make_pair(g, false);
    }
  }
  bool flag = true;
  int i = 0, j = 0;
  while (flag) {
    if (v[i][j].first == 'U' && i != 0) i = i - 1;
    else if (v[i][j].first == 'D' && i != h - 1) i = i + 1;
    else if (v[i][j].first == 'L' && j != 0) j = j - 1;
    else if (v[i][j].first == 'R' && j != w - 1) j = j + 1;
    else break;
    if (v[i][j].second) {
      cout << -1 << endl;
      return 0;
    } else v[i][j].second = true;
  }
  cout << i + 1 << " " << j + 1 << endl;
  return 0;
}

// 提出したコード
int main() {
  int h, w;
  cin >> h >> w;
  vector<vector<pair<char, bool>>> v(h, vector<pair<char, bool>>(w));
  char g;
  rep(i, h) {
    rep(j, w) {
      cin >> g;
      v[i][j] = make_pair(g, false);
    }
  }
  bool flag = true;
  int i = 0, j = 0;
  while (flag) {
    if (v[i][j].first == 'U' && i != 0) {
      i = i - 1;
      if (v[i][j].second) {
        cout << -1 << endl;
        return 0;
      }
      v[i][j].second = true;
    } else if (v[i][j].first == 'D' && i != h - 1) {
      i = i + 1;
      if (v[i][j].second) {
        cout << -1 << endl;
        return 0;
      }
      v[i][j].second = true;
    } else if (v[i][j].first == 'L' && j != 0) {
      j = j - 1;
      if (v[i][j].second) {
        cout << -1 << endl;
        return 0;
      }
      v[i][j].second = true;
    } else if (v[i][j].first == 'R' && j != w - 1) {
      j = j + 1;
      if (v[i][j].second) {
        cout << -1 << endl;
        return 0;
      }
      v[i][j].second = true;
    } else flag = false;
  }
  cout << i + 1 << " " << j + 1 << endl;
  return 0;
}
```

## D問題-Iroha and Haiku (New ABC Edition)
累積和を用いるであろうことは分かりましたが、二分探索で解ける事には気付きませんでした。
ここら辺を解けるようになっていきたいですね...

## 感想
茶diffをしっかり解けるようにしていきたいと改めて感じました。ABC-B埋めと並行してC問題も少しずつ進めていこうと思います。
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?解決

# 久しぶりにdockerを使って開発しようとしたところ・・・
~~~
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
~~~
と表示される。

なんだこれ？
初めてみたけども・・・。
~~~
docker ps
~~~
もしかしてすでに起動しているのかとステータスを確認して見ると同じエラーが表示される・・・。

## 調べてみたらdockerが起動していないことで起きるエラーみたいです。

なのでとりあえずdockerデスクトップを立ち上げてみました。
無事作業することが出来ました。
プロジェクトマネジメント

# マネジメントの最初
プロジェクトは予算が限られ、システムを作ってもその後の管理も大切。

# PMBOK(Project Management Body of Knowledge)
米国のプロジェクトマネジメント協会がまとめたプロジェクトマネジメントの知識体系。
10個の知識エリアを基に管理すべきであるとしている。
* スコープ・マネジメント
* スケジュール・マネジメント
* コミュニケーションマネジメント
* ステークホルダー・マネジメント
* 調達マネジメント
* リスク・マネジメント
* 品質マネジメント
* 資源マネジメント
* コスト・マネジメント
* 統合マネジメント

# 作業範囲を把握するためのWBS
WBSとはWork Breakdownの略。
プロジェクトに```必要な作業や成果物を階層化した図```のこと。
PMBOKのスコープマネジメントに活用される。

高度なシステムを作る上で作業を細分化することによって個々の作業が単純化できて、把握しやすくなる。

## 気づき
これを作ることで僕も難しいシステムを作るときに細分化さすればできるのか。

# 開発コストの見積り
見積方法には２つある。

## プログラムステップ法
```ソースコードの行（ステップ）数```により開発コストを算出する方法。

## ファンクションポイント法
利用者から見た機能に着目して、```その個数や難易度```から開発コストを算出する手法。

# 問題を解いた時の気づき
## 類推見積法（トップダウン）
```過去にあった類似プロジェクト事例を参考```に、具体的な見積を算出する方法です。事例を参考にするため、```ほかの方法よりもスピーディー```に見積を出しやすくなっています。

## 係数モデル（パラメトリック見積）
```特定の数式モデルを使用```して、各作業を数値化したうえで見積を算出する方法です。
...
機械的・数学的な算出方法であるため、```見積担当者の知識や経験に結果が左右されない```というメリットがあります。反面、```蓄積データやサンプル数への依存度が高い```のも事実です。したがって、```サンプル数が不十分だと、見積の精度が極端に下がってしまう```という欠点があります。

## ボトムアップ（工数積上げ）
プロジェクトで完成する```システムとその構成要素を想定```し、見積を算出する方法です。
作業1つ```ひとつの工数をもとに```見積を算出するため、抜け漏れが発生しにくいのが特徴です。ほかの方法と比べると、精度が高いという魅力もあります。しかし、システム完成までの```工数が読みづらい大規模プロジェクトには不向き```な方法です。

## プライスツーウィン法
```クライアントの予算に合わせて```見積を算出する方法です。
予算をベースに見積もるため、```予算の過不足を防げる```利点があります。とくに予算を決めたうえで開発を依頼するケースにおいては、優れた方法と言えるでしょう。その一方、予算ありきの見積になるため、```思わぬ機能不足が発生しやすい```のも事実です。機能不足を補うべく二次開発や三次開発が必要となれば、結果的に追加コストがかかってしまいます。

出典 https://hnavi.co.jp/knowledge/blog/estimate-check/

出典 https://gihyo.jp/book/2020/978-4-297-11781-8
【Remote - Containers】プロジェクト名の設定方法

## 設定方法
プロジェクトルートの`.env`に`COMPOSE_PROJECT_NAME`環境変数を記述することで設定できます。
以下のようにするとプロジェクト名は`sample-app`となります。
```.env
COMPOSE_PROJECT_NAME=sample-app
```

## 設定できない方法
docker-compose でプロジェクト名を設定する方法はいくつかあります。

https://qiita.com/P-man_Brown/items/cda1837453b149fe5da7

しかし Remote - Containers ではトップレベルの`name`プロパティでは設定できませんでした。  
`compose.yml`に`name`プロパティを記述しても無視されカレントディレクトリ名がプロジェクト名となります。
```sample-project/compose.yml
name: myapp
services:

<以下略>
```

上記の場合には`name`に記述した`myapp`は無視され、 ディレクトリ名の`sample-project`がプロジェクト名となります。