OmniAICreator/Qiita-1.07M huggingface dataset:
『分かりやすさMax！』Atcoder Beginners contest 321 "CutOff"を解説してみた…

# Atcoder Beginners contest 321 "CutOff"解説 In　Python
今回はついこないだ解いたCutOffという問題をPythonで解説していきます。
過去問として解いていくときの参考になれば幸いです。
## 問題
問題文にはいろんなことが書いてありますが、僕なりに要約するとこんな感じです。
分かりにくかったら下のリンクから問題文を読んでください。

> - Nラウンド行われる試験がある
> - 各ラウンドには0-100のスコアが存在する
> - 総合的なスコアは最低値と最大値を除いたものになる
> - iラウンド目のスコアはAi
> - **最終結果（総合的なスコア）をX点以上にするためには何点取る必要があるか？
> - もし１００点をとってもX点以上にならない場合-1を出力しろ。**

入力方法
N　X
A1 A2 A3 .....


https://atcoder.jp/contests/abc321/tasks/abc321_b

## アルゴリズム
今回のアルゴリズムはこんな感じ。
まずこの問題では得点は下の画像の様に、最大値でも最小値でもない数字の合計点が得点となっています。
![](https://storage.googleapis.com/zenn-user-upload/fc9c44b5f8ac-20231022.png)
なのでもしX点を超えれるのかどうか知りたいのであれば、この得点のデータに0-100点まで各ケースを調べれば良いです。各ケースを調べて最大点である100点をとってもX点にならないのなら問題文の通り”－１”を出力すればいいですし、もしX点になるために必要な得点が0-100にあったのならその必要な得点を出力するだけでバッチリです。
![](https://storage.googleapis.com/zenn-user-upload/699163106465-20231022.png)
これをコードに落とし込んでいきます。

## Pythonでの回答例
Pythonで実際にACしたコードです。
コメントもついているので、ぜひ参考程度にお読みください。
```py
# -*- coding: utf-8 -*-
#まず数字を受け取る
N, X = map(int, input().split())
As = [int(x) for x in input().split()]
#次にAsを低い順からソート
As = sorted(As)
#１００回繰り返す
for x in range(0,101):
    scorenow = As[0:len(As)]
    #↑ScoreをAsの入力された初期値にリセット
    scorenow.append(x)
    #今のスコアの最大値を消す
    scorenow.remove(max(scorenow))
    #今度は最低値を消す
    scorenow.remove(min(scorenow))
    #もしスコアがXより大きかったらPrintして終了
    if sum(scorenow) >= X:
        print(x)
        exit()
    else:
        continue
#でなければ-1を出力
print(-1)
```
Python で PDF を結合する

## はじめに
PDFの結合は、文書管理に非常に便利な機能です。複数の関連する独立したPDFファイルを1つに結合することで、管理や共有が容易になります。結合する際には、複数の文書を直接結合することもできますし、指定したページを結合することもできます。以下に、これらの方法を実現するためのコード例を示します。

## ライブラリ
* [Spire.PDF for Python](https://www.e-iceblue.com/Introduce/pdf-for-python.html)

これは独立したプロフェッショナルな Python ライブラリです。 PDF の作成、編集、変換をサポートします。

## 事前準備
* まず、[Python](https://www.python.org/downloads/) をダウンロードしてインストールします。
* Visual Studio Codeで「Extensions」をクリックし、「Python」を検索してインストールします。
* 「Explorer」-「NO FOLRDER OPENED」-「Open Folder」
* 既存のフォルダーを選択するか、新しいフォルダーを作成します。
* そのフォルダーに「.py」 ファイルを追加し、任意の名前を付けます。
* 「Terminal」-「New Terminal」
* 次のコマンドを入力して、[Spire.PDF for Python](https://www.e-iceblue.com/Introduce/pdf-for-python.html) と plum-dispatch v1.7.4 をインストールします。
```python
pip install Spire.PDF
```

## 複数の PDF を結合
まず、ライブラリをコードにインポートします。
```python
from spire.pdf.common import *
from spire.pdf import *
```
3つの変数を定義し、それぞれPDFファイルのパスを保存します。そして、これらの変数を後で処理するために、"files"という名前のリストに格納します。
```python
#PDF ファイルのパスのリストを作成する
inputFile1 = "C:/Users/Administrator/Desktop/Sample1.pdf"
inputFile2 = "C:/Users/Administrator/Desktop/Sample2.pdf"
inputFile3 = "C:/Users/Administrator/Desktop/Sample3.pdf"
files = [inputFile1, inputFile2, inputFile3]
```
Document クラスの MergeFiles(inputFiles: List[str])メソッドを使用して、リスト内のファイルを 1 つに結合します。
```python
#PDF を結合する
pdf = PdfDocument.MergeFiles(files)
```
結合された PDF ドキュメントを「MergePDF.pdf」という名前のファイルとして保存します。
```python
#結果文書を保存する
pdf.Save("output/MergePDF.pdf", FileFormat.PDF)
pdf.Close()
```
## 指定したページを結合
まず、ライブラリをコードにインポートします。
```python
from spire.pdf import *
from spire.pdf.common import *
```
3つの変数を定義し、それぞれPDFファイルのパスを保存します。そして、これらの変数を後で処理するために、"files"という名前のリストに格納します。
```python
#PDF ファイルのパスのリストを作成する
file1 = "C:/Users/Administrator/Desktop/Sample1.pdf"
file2 = "C:/Users/Administrator/Desktop/Sample2.pdf"
file3 = "C:/Users/Administrator/Desktop/Sample3.pdf"
files = [file1, file2, file3]
```
リスト内の各ファイル パスをループし、PdfDocument クラスを使用して各 PDF ファイルを読み込みます。 そして、ロードされた PDF ファイル オブジェクトを PDF リストに追加します。
```python
#各 PDF ファイルを PdfDocument オブジェクトとしてロードし、リストに追加する
pdfs = []
for file in files:
    pdfs.append(PdfDocument(file))
```
新しいPDFドキュメントを作成します。
```python
#PdfDocumentクラスのオブジェクトを作成
newPdf = PdfDocument()
```
PdfDocument.InsertPage(PdfDocument, pageIndex: int) と PdfDocument.InsertPageRange(PdfDocument, startIndex: int, endIndex: int) メソッドを使用して、指定したページを新しいドキュメントに挿入します。
```python
#指定したページを新しいドキュメントに挿入します
newPdf.InsertPage(pdfs[0], 0)
newPdf.InsertPage(pdfs[1], 1)
newPdf.InsertPageRange(pdfs[2], 0, 1)
```
結合された PDF ドキュメントを「SelectedPages.pdf」という名前のファイルとして保存します。
```python
#結果文書を保存する
newPdf.SaveToFile("output/SelectedPages.pdf")
```
## 参照
[Python: Merge PDF Documents](https://www.e-iceblue.com/Tutorials/Python/Spire.PDF-for-Python/Program-Guide/Document-Operation/Python-Merge-PDF-Documents.html#2)
[How to Install Spire.PDF for Python in VS Code](https://www.e-iceblue.com/Tutorials/Python/Spire.PDF-for-Python/Getting-Started/How-to-Install-Spire.PDF-for-Python-in-VS-Code.html)
私のNotion活用術

## 私の活用法
* 日記
* 学習記録
* タスク管理

上記３つの活用法を今回紹介させていただきます。


## Notionを活用しているモチベーション

### 情報を一元管理すること
これまではSlackの個人DMやメモ用紙に、参考になった記事や、タスクを進めるうちで気づいたことをメモしていたのですが、数日後にあの時の記事見返そうと思った時に、あれ見つからない:cry:となったり、あの時のタスクは、このタスクの延長線な気がするけど、どうやったんだっけ？？:hushed:となることがありました。
思考を言語化したい作業などは、紙で書く方がいいこともありますが、私は管理することが苦手なので、管理しやすさのメリットを享受するためNotionを使っています。
### 仕事をデバッグ可能にすること
もし進め方に問題があった時、「あの時この進め方をしていたから、うまくいかなかったんだ」と振り返りができ、同じミスを繰り返さないようにする


## 日記
（公開用に一部編集しています。）
![日記.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1958304/f22ee4b3-cf65-880c-a1c1-c66450fde4d6.png)

稼働日に合わせて、テンプレートが自動で生成される仕組みにしており、
テンプレートは以下の通りです。

:::note info
テンプレート作成方法
https://www.notion.so/ja-jp/help/database-templates
:::

![テンプレート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1958304/4840c5d8-755e-8ecf-17d2-b718b3d602fb.png)

### 運用方法
実際に入力しているのは、上記テンプレートのみで、その入力内容を元に、タイムラインビュー、ボードビューから
* その日にどんなタスクをやっていたのか
* １つのタスクにどれくらい時間をかけているのか
* その日の気分

を可視化しています。

### 私が日記を書く時に意識している点
なるべく自分と質疑応答しながら書くことです。
私たちの1番の相談相手は、他でもない私自身です。[ケンブリッジ大学Barbara Sahakian教授の研究](https://go.roberts.edu/leadingedge/the-great-choices-of-strategic-leaders)によると、人は1日に最大35,000回の決断していると言います。でもそのうちのほとんどは無意識だと思います。普段から意識して、自分と質疑応答し、その質を上げることで35,000回中の50回くらいは、昨日より良い選択ができるようになってるんじゃないかと信じています:thinking:

## 学習記録
Keita Mori（ふぉれ）さんの記事を参考にして、学習記録をつけています。

https://zenn.dev/pytokyo/articles/9af8586dacdebf60ce15

下記のいずれかが当てはまる方は是非ご一読ください
> * 新しい技術を調べ物をしながら開発を進めることが多い
> * ブラウザがタブでいっぱいになりがちでどうにかしたい
> * 参考にしたページをよく見失って困る
> * 学習したことを記事化したいけどめんどくさくて諦めてしまう


私の場合は以下のようなデータベースを作り、学習中に参考になった記事のリンクをコメントと共に残しています。

![学習DB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1958304/187f052e-0916-0840-2d43-f48cc8e28536.png)

## タスク管理
![スクリーンショット 2023-10-22 16.25.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1958304/7236b651-7230-54e1-2294-867ba8522ef6.png)

ボタンワンクリックで、以下の新規ページがテンプレートとともに作成されるようにしています。

![タイトル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1958304/c79d0342-00c2-0ab1-79f2-f20b77ef334b.png)


### Notionでタスク管理するメリット
* 情報が一元化されているので、アウトプットや、振り返りへの心理的ハードル低下
* 過去の自分との成長の比較がしやすい
* 頭の中を文字化することで、解像度UP、記憶の定着化など

### テンプレート公開
タスク管理のテンプレートは無料で公開しているので、ぜひ参考にしてください！

https://opposite-fibula-b61.notion.site/7c4ffd4fe67f4a58a3a5dce9dcb6ac0e





## まとめ
私のNotion活用法を紹介させていただきましたが、大事なことは継続することだと思っています。最初から100点満点で書こうと思わず、60点だったけどそんな自分を許してあげる（書いているだけで:clap:！）
続けていくうちに自分なりの最適な方法が見つかると思います。

素敵なNotionライフを:muscle:
【Swift】変数宣言時の型についている「!」と「?」の違い

## はじめに
先輩が書いたコードの中で、変数の型に「!」がついているものがあり「あれ？これってなんだっけ？」となったので備忘録としてメモします。

## 「！」がついた型の意味
```swift
var name:String!
```
「!」をつけて型を宣言した場合、**nil が入るかもしれないが、取り出すときは nil ではない想定の変数**となります。
そのため、アンラップが必要ありません。
<font color="red">しかし、変数にアクセスしたとき nil だった場合は例外がスローされるため注意が必要です。</font>

## 「？」がついた型の意味
```swift
var name:String?
```
「?」をつけて型を宣言した場合、**常に nil が入っていることを考慮しながら扱う必要がある変数**となります。
そのため、if や guard などでアンラップする必要があります。

## おわりに
まだまだ勉強中のため、間違っている箇所があればご指摘の程よろしくお願いいたします。
【メモ】OCIの無料資格とハンズオンに挑戦するための

# 初心者がIT資格を目指す。最初の一歩に
OCIはあんまり目立っていないが基礎レベルにあるFoundations資格に無料で挑戦できるという魅力があり挑戦しようと思いました。

座学前半を受けましたが中々知らないことも多く、10時間の学習だけでは終わりそうにありません。
AWS資格を持っている方は、基本飛ばして、3時間ほど学習すれば合格できるようです。

## なんでわざわざ纏めたの？
挑戦するにあたり、情報やリンクを整理したいと思いました。
なぜならばオラクルのホームページはゴチャゴチャしていて非常に使いづらい

なので自分が動きやすいように資料をまとめたいと思ったのです。


資格という魚で資格という魚を獲得したいと思います。（サルゴリラ）
魚のたとえする側もストレスだな。オラクルのHP並みにゴチャゴチャしてストレス。


## １，ハンズオン。頭より体を動かせ。
qiitaと公式ビデオのリンクです。
アカウント作成から始めることが多いのでQiita記事➡oracleがいいかも

https://qiita.com/hamham/items/14d3214f7a6ffd772862

https://videohub.oracle.com/playlist/dedicated/163691342/1_7766iyn3/

会員登録できてない人はこちらで4番まで進めてください。

「４．届いたメールの「電子メール・アドレスの確認」ボタンを押します。」

https://qiita.com/nisshii0/items/a80073051f790023562d


## ２，座学だ。無知者には厄介だ。
どこからどう行けば、OCIの学習ページに行けるのか。時々わからなくなります。
本当に、マジで、画面によってUIが若干異なるので、混乱する。（のち解消した）



まずは以下URLでログインしてください。

https://education.oracle.com/ja/

セッション切れするとリンクやブックマークで来るのやめてくださいって言われるので
その時は上のURLからログインしてください。これが一番ムカ付くやつ。
セッション切れてるのに、クッキーにログイン情報が残ってるから発生する糞現象。


#### 2022年版　終了しました。

#### 2023年版
ハンズオン演習がついていません。座学の一部が追加されています。練習問題の公開は11/1になるかと思います。

https://mylearn.oracle.com/ou/learning-path/japanese-become-an-oci-foundations-associate-2023-/124995

※URLの修正をしました（英語➡日本語ページ）

手順整理したら簡単でした。最近よく7歳下の子に「あたま悪なっとらん？」
と言われて笑っていましたが、実感しました。なったみたいです。

https://qiita.com/eichiro169/items/7d2bf3d18e80d9e2a2e6


## ３，こんな風に勉強をした。という人たち。

https://qiita.com/tkuribayashi/items/f17dc8a321766caa0e4d

https://qiita.com/Skogkatter112/items/a57a5ef1a72806f1c69a

アソシエイト資格だとProfessionalのEラーニングの1章もおすすめらしい

https://qiita.com/nisshii0/items/69002802704eef59b05b

# 資格について分かっておく
OCIには以下の3つの資格がある。とだけ覚えておけばいい

OCI Foundations Associate(初級)　こいつはしばらく無料らしい・・・？
OCI Certified Architect Associate(中級)
OCI Certified Architect Professional(上級)

とにかくちゃんと書かれてそうな記事を残しておこう。

https://qiita.com/nisshii0/items/8c82e93d0294703aa5f6


## おまけ
オラクルには「Oracle Free Certification for OCI」という無償で試験受けれるチケットを配っているタイミングがあるようなので。
そのタイミングを待ってみるのもアリかもしれない。

あ、2023年11月1日から1月までやっているようですね。

https://www.oracle.com/jp/education/race2cert_97206-ja.html

基礎資格の無償試験に加え、有償資格を2回受験可能となっています。
また資格1つ得れば、有償資格1つ分の受験チケットを追加で入手できるっぽいです（3枚まで）


https://qiita.com/chibatty/items/46e1c7bf60bbcf71c48e

https://qiita.com/yamada-hakase/items/ab7c9903b5c8cb46d164


以上。
やってみたいことについての記事をまとめてみました。
Oracle MyLearnで混乱したから画面遷移のスクショ残した。

## Oracleの基礎資格を取ろうと模索しはじめました。
OCI Foundationsの資格を取ってみようと思い
公式の学習ページを使っているのですが、だんだんわけわからなくなってきました。

最初はスムーズにいっていましたが、使えば使うほど
どこからどう行けば、OCIの学習ページに行けるのか。
どんどん分からなくなってきました。
本当に、マジで、画面によってUIが若干異なるので、混乱する。

そこで、混乱防止のため、手順をまとめてみます。


## OCI FoundationsのmyLearnにアクセスする。

まずは以下のURLにアクセスし

https://education.oracle.com/

赤枠を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492033/64117e18-0fc2-dda0-71c9-dc9f8d742e49.png)

そうすると画面遷移するので、スクロールしてAdministrator、Developerなどのタブを選び、
タイトル＋日本語で何をするか書いているものを選びます。
（英語版になる場合もあります、そのときは字幕出せます。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492033/98a21693-c128-1468-dc41-c2d422132aec.png)

「Japanese: Become An OCI Foundations Associate: 2022 日本語」にアクセスできました。
。。。。？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492033/67ff4679-e5ae-8c8b-16b9-ba97b7634c40.png)

割と簡単では？

なんかもっと複雑だった気がする・・・なんでだろう。
そうだ、右上にアカウント名がついている（KS）
こいつだ。

https://mylearn.oracle.com/ou/home

そう、急にこの画面に変わる。そうすると脳内がバグってどこに行っていいのかわからなくなるんだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492033/ec5a2fb0-e099-f83f-92cd-a44e0f5e8694.png)



## なんにせよリンクで飛べば済む話。

もう一つ。
オラクルのトップページから・・・
と思いましたが、無駄に枚数が増えるし覚えるのが面倒なので辞めました。
おとなしくリンクから飛ぼう・・・

https://education.oracle.com/

か

#### 2022年版

https://mylearn.oracle.com/ou/learning-path/japanese-become-an-oci-foundations-associate-2022-/110907

#### 2023年版

https://mylearn.oracle.com/ou/learning-path/become-an-oci-foundations-associate-2023/122043

ちなみに座学中にセッション切れたらページ開きなおす必要があります。
その辺もご注意ください。（リンク用の記事を出した理由の１つ。）


# その他参考
https://qiita.com/nisshii0/items/a80073051f790023562d

https://qiita.com/nisshii0/items/8c82e93d0294703aa5f6

### オラクル資格DBとOCIが1月まで無料みたいですよ。
Foundationsに加えProfessionalも無料なので、
暇だしイケるっしょ。という方などにお勧めしたい

https://www.oracle.com/jp/education/race2cert_97206-ja.html
SQL Server を Azure VM で利用する場合の OS 別の価格比較

## はじめに

Azure VM で SQL Server を利用する際、 Linux を利用する事で安価になるのか、運用環境での利用を想定して試算しました。

## 比較方法

VM スペックと SQL Server のライセンスを固定し、OS のみ異なる場合の価格を比較。

- 価格は MS 公式「仮想マシン セレクター」で算出。（2023/9/7 現在）
  - <https://azure.microsoft.com/ja-jp/pricing/vm-selector/>
- Linux は SQL Server ライセンスが付くディストリビューションの中で、ディストリビューターのサポートが付くプランを選択。
  - 運用環境でサポート無しのプランを選択するお客様は少数との判断。

#### VM スペック

E4as v5

- vCPU:4 コア（AMD）
- メモリ：32GB
- OS ディスク：Premium SSD
- リージョン：Japan East

#### SQL Server ライセンス

Standard

## 比較結果
OS 別の価格（2023/9/7 現在）

| OS                       | 試算額          |
| ------------------------ | --------------- |
| Windows Server           | ￥ 29,266.93/月 |
| Red Hat Enterprise Linux | ￥ 78,401.18/月 |
| SUSE プライオリティ      | ￥ 93,355.09/月 |
| Ubuntu Pro               | ￥ 79,469.32/月 |

## まとめ

運用環境を想定した場合 Windows Server を選択した場合が一番安価です。

Linux を選ぶ理由に「Linux だから安価」とする考えは、場合によって改めた方が良さそうです。
01: SQL サッカーの問題集サイトの解答を、サブクエリ（副問い合わせ）に書き換えた。

## ■ 概要　 
### ・サイト：TECH Pjin（テックプロジン）
https://tech.pjin.jp/

### ・上記のSQL問題を、通常解答とサブクエリ使用に書き換えました。
・使用SQLは、Postgresqlです。

## ■ コード記載

・問5, 問6, 問8 

```sql 01.sql

-------------- Q 08 - 02 （サブクエリ,副問い合わせ）
--- 問題：各ポジションごとの総得点を表示してください。
--- players, goals
SELECT
    TT.ポジション,
    TT.ゴール数
FROM
    (
        SELECT
            P.POSITION  AS ポジション,
            COUNT(G.ID) AS ゴール数
        FROM
            GOALS   G
            JOIN PLAYERS P
            ON G.PLAYER_ID = P.ID
        GROUP BY
            P."position"
    ) TT
ORDER BY
    TT.ゴール数 DESC;

-------------- Q 08
--- 問題：各ポジションごとの総得点を表示してください。
--- players, goals
SELECT
    P."position" AS ポジション,
    COUNT(G.ID) AS ゴール数
FROM
    PLAYERS P
    JOIN GOALS G
    ON G.PLAYER_ID = P.ID
GROUP BY
    P."position"
ORDER BY
    ゴール数 DESC;

------------- Q 06
--- 問題：すべての選手を対象として選手ごとの得点ランキングを表示してください。（SELECT句で副問合せを使うこと）
--- players , goals
SELECT
    P.NAME,
    P.POSITION,
    P.CLUB,
    (
        SELECT
            COUNT(ID)
        FROM
            GOALS G
        WHERE
            G.PLAYER_ID = P.ID
    ) AS TT
FROM
    PLAYERS P
ORDER BY
    TT DESC;

-------------- Q 05 - 2 副問い合わせ(サブクエリ) 書き方
--- 問題：キックオフ日時と対戦国の国名をキックオフ日時の早いものから順に表示してください。
--pairings countries
SELECT
    P.KICKOFF,
    (
        SELECT
            NAME
        FROM
            COUNTRIES C
        WHERE
            C.ID = P.MY_COUNTRY_ID
    ) AS 国名01,
    (
        SELECT
            NAME
        FROM
            COUNTRIES C2
        WHERE
            C2.ID = P.ENEMY_COUNTRY_ID
    ) AS 国名02
FROM
    PAIRINGS P
ORDER BY
    P.KICKOFF ASC;

-------------- Q 05
--- 問題：キックオフ日時と対戦国の国名をキックオフ日時の早いものから順に表示してください。
--pairings countries
SELECT
    P.KICKOFF,
    C.NAME    AS 国名01,
    C2.NAME   AS 国名02
FROM
    PAIRINGS  P
    JOIN COUNTRIES C
    ON C.ID = P.MY_COUNTRY_ID JOIN COUNTRIES C2
    ON C2.ID = P.ENEMY_COUNTRY_ID
ORDER BY
    KICKOFF ASC;

---------------------------- END

```
JavaScriptのtrueとfalse、undefined、nullの疑問まとめ

### falseとなるケース
| false　　　 |
|:-----------|
| 0          |
| -0         |
| 0n         |
| "" (空文字) |
| null       |
| undefined  |
| NaN        |

これ以外は全部 true

### JavaScript での undefined と null とは
| 種別     　 | 解説     　 |
|:-----------|:-----------|
| undefined  | 値が代入されていないため、値がない |
| null       | 代入すべき値が存在しないため、値がない |

### 結局 undefined と null をどう使い分ける？

- **nullは使わずにundefinedを使う**ようにするのがベター（自分が新たにコードを書く部分は、nullは使わずにundefinedにできるだけ寄せるといったイメージ）
- undefinedは言語仕様上、プログラマーが明示的に使わなくても自然に発生する
- 逆にnullは実装者が明示的に指定しないと発生しない（外部APIやライブラリなどでnullを返すパターンもあるから、そこは注意）
```JavaScript
let value
console.log(value) -> undefined

const obj = {}
console.log(obj.foo) -> undefined

const arr = []
console.log(arr[0]) -> undefined
```

### JSON での undefined と null との違い
```JavaScript
console.log(JSON.stringify({ foo: undefined }))
-> {}

console.log(JSON.stringify({ foo: null }))
-> {"foo": null}
```

### 実装例 ： 結果が undefined だったら早期リターンする
```JavaScript
const result = undefined

if (typeof result === 'undefined') {
  return
}
```

### 実装例 ： 結果が null だったら早期リターンする
```JavaScript
const result = null

if (result === null) {
  return
}
```


### 自分のブラウザの console で挙動確認してみて
```JavaScript
result = undefined
// result = null
// result = ''
// result = 0

result || console.log('resultがfalsyな値なら表示する')

if (typeof result === 'undefined') {
    return
} else {
    console.log('resultがundefinedのケースなら早期リターンされるからここは表示されない')
}

if (result === null) {
    return
} else {
    console.log('resultがnullのケースなら早期リターンされるからここは表示されない')
}
```
【Swift】カメラ起動時に「signal SIGABRT」エラー

## はじめに
カメラを起動しようとしたところ、「**<font color="red">signal SIGABRT</font>**」エラーで落ちてしまい、解決までに少し時間がかかったので備忘録としてメモします。

## 原因
カメラやアルバムなどのプライバシー情報にアクセスする際は、Info.plistファイル内に明示してあげる必要があるみたいです。

## 解決方法

### Step 1 : Info.plistファイルを開く
![スクリーンショット 2023-10-26 10.56.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072069/de10000c-2f46-3425-0fd9-6fdfcd5b772e.png)

### Step2 : Info.plist内の「Information Property List」内に１行追加
![スクリーンショット 2023-10-26 10.58.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072069/8e350633-04e8-6250-03ee-57c60d1d0e60.png)

「Information Property List」の**Key**に **Privacy - Camera Usage Description**を追加します。
次に、**Value**に**使用する目的**を追加します。

これで、エラーは解決されると思います。

## おわりに
まだまだ勉強中ですので、間違っている箇所があればご指摘の程よろしくお願いいたします。
AI-102試験対策のまとめ「Azure Cognitive Search①」

## はじめに
Azure AI Engineer Associate(AI-102)取得に向けた勉強でまとめた内容を本記事では投稿しています。
試験範囲の内容を私が勉強していく中で、
・忘れてしまっていた内容
・他の知識と絡めて理解した方が良い内容
・Microsoft Learnの読解に苦戦した内容
などをできるだけ分かりやすく簡潔にまとめることを意識しています。
Azureの勉強を一から始め、AI-102取得を目指している方の参考になれば幸いです。
※本記事の内容が必ず試験に出るわけではないこと、ご注意ください
※勉強しながら投稿しているため、追加で学んだことがあれば随時投稿内容を更新します。

## 試験対策のまとめ
## Azure Cognitive Search
Web、モバイル、エンタープライズアプリケーションにリッチな検索体験を組み込むためのクラウド検索サービス  
ユーザー所有のコンテンツやインターネットから分離されたコンテンツに対する検索に有用
### 検索サービスの機能
#### **インデックス作成**
コンテンツをJSON形式で検索サービスに取り込むプロセス
* インデクサー：Azureデータソースからのデータの取り込み/取得を自動化
* スキルセット：下記などによりデータを抽出し検索できるようにする
    - Azure AI Serviceで提供されているAIサービス
    - Azure Machine Learning内で作成
    - カスタムAIを組み込んだAzure Functions
* AIエンリッチメント：拡張機能
    - 生の形式でフルテキスト検索できないコンテンツに対する機械学習モデルのアプリケーション
    - 使用目的例
        - 多言語検索に翻訳と言語検出を適用
        - エンティティ認識を適用して、大きなテキストのチャンクからエンティティを抽出
        - キーフレーズ抽出を適用して、重要な用語を識別して出力
        - 光学式文字認識(OCR)を適用して、バイナリファイル内の印刷されたテキストと手書きのテキストを認識
        - 画像分析を適用して画像コンテンツを記述し、説明を検索可能なテキストフィールドとして出力
* フィールドの使用方法を制御するインデックス属性
    | 名前 | 日本語訳 | 説明 |
    | --- | --- | --- |
    | retrievable | 取得可能 | フィールドを検索結果で返すことができるかどうかを示す <br> = カテゴリフィールドを検索結果に含めることが可能 |
    | searchable | 検索可能 | フィールドがフルテキスト検索可能で、検索クエリで参照できるかどうかを示す <br> = ユーザーがカテゴリフィールド内を検索可能 |
    | filterable | フィルタリング可能 | クエリで```$filter```フィールドを参照できるようにするかどうかを示す <br> = 値に基づいてドキュメントを含めたり除外したりすることが可能 |
    | sortable | 並べ替え可能 | 式で```$orderby```フィールドを参照できるようにするかどうかを示す <br> =ユーザーがフィールドで並び替え可能 |
    | facetable | ファセット可能 | ファセットクエリでフィールドを参照できるようにするかどうかを示す <br> = ユーザーはカテゴリに基づいてドリルダウンフィルタリングを実行可能 |

#### **クエリの実行**
検索可能なテキストがインデックスに投入された後に実行可能  
クライアントアプリが検索サービスにクエリ要求を送信して応答を処理  
すべてのクエリはユーザーが制御する検索インデックスを介して実行
* セマンティック検索：拡張機能
    - 検索結果の処理に言語理解を使用
    - 最も意味の関連性が高い結果が上位に昇格

<br>

* 参考
    - https://learn.microsoft.com/ja-jp/azure/search/search-what-is-azure-search
    - https://learn.microsoft.com/ja-jp/rest/api/searchservice/create-index#-field-definitions-%20-%20retrievable

## 次の試験対策のまとめ
* **AI-102試験対策のまとめ「Azure Cognitive Search②」**

https://qiita.com/fsd-jume/items/7b2a69cbe8cf8042c8c8

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/65aba5d5514e023fd66d
Ubuntu20.04LTS 無線LANのセットアップ

# 環境
+ Ubuntu 20.04LTS
+ KIMWOOD WiFi無線LAN子機

# 無線LANのセットアップ
有線LANを接続して以下のコマンドをターミナル上で実行する.
### 1. Ubuntuの更新
```Bash
sudo apt update
```
### 2. DKMS, 基本的なビルドツール, Gitをインストール
```Bash
sudo apt install dkms build-essential git
```
### 3. 無線LANのドライバをGitHubからクローン
```Bash
git clone https://github.com/RinCat/RTL88x2BU-Linux-Driver.git
```
### 4. ディレクトリの移動とコンパイル
```Bash
cd RTL88x2BU-Linux-Driver
make
```
### 5. コンパイルしたもののインストール（コピー）
```Bash
make install
```
### 6. 再起動
```Bash
reboot
```
再起動後, デスクトップの右上にWi-Fiのマークが表示されていれば成功. ネットワークを選択し, パスワードを入力.
起動時にWi-Fiのマークが表示されず, 接続できないことがある. そのときは4~6を行うと復活する.
【備忘録】Headless Chrome　コマンドラインからHPをPDF保存する方法


サンプル

start chrome.exe --headless --no-pdf-header-footer --print-to-pdf=c:\Qiita.pdf "https://qiita.com/"

---
>保存先はフルパスでファイル名を書くこと！　　＞＞＞　--print-to-pdf=c:\Qiita.pdf 


startの要不要。chromeをフルパスで書くかとかは自分の環境で確認する。

下記項目はChromeのバージョン違いやEdge等ブラウザーの差異で要不要、（旧）の方しか使えなかったりするらしい。この辺はその都度、力業で確認する事。

--disable-gpu
--no-sandbox
--no-margins
--no-pdf-header-footer or --print-to-pdf-no-header (旧)　

---

参考資料：

https://stackoverflow.com/questions/46074235/headless-chrome-to-print-pdf
[iOS]Flutter✖️Firebaseでビルドフレーバーごとにプロジェクトを分ける方法

# 前提条件
- 今回は`DEV`, `STG`にプロジェクトを分けることを想定しています。
- Fireabaseのプロジェクトはすでに`DEV`, `STG`ができていることとします。
- iOSに絞って話を進めます

# Firebaseのプロジェクトから`GoogleService-Info.plist`をダウンロード
1. Firebase Console > プロジェクトの概要をクリック
1. マイアプリの欄から以下の↓GoogleService-Info.plistをクリック
1. `GoogleService-Info.plist`をプロジェクトに配置
1. ダウンロードした`GoogleService-Info.plist`の`REVERSED_CLIENT_ID`をプロジェクトの`Info.plist`に追記する
```
  <array>
    <dict>
      <key>CFBundleTypeRole</key>
      <string>Viewer</string>
      <key>CFBundleURLSchemes</key>
      <array>
        <string>XXXXX</string>
      </array>
    </dict>
    <dict>
      <key>CFBundleTypeRole</key>
      <string>Editor</string>
      <key>CFBundleURLSchemes</key>
      <array>
        <string>YOUR_REVERSED_CLIENT_ID</string>
      </array>
    </dict>
  </array>
```
※プロジェクトごとに`REVERESED_CLIENT_ID` が異なります。Info.plistを分ける。xcconfigを分けるなどして、スキームごとに正しい`REVERESED_CLIENT_ID`が読み込まれるようにしないと、起動時にアプリがクラッシュします。

https://tech.opst.co.jp/2022/07/25/%E7%92%B0%E5%A2%83%E6%AF%8E%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E7%94%A8%E6%84%8F%E3%81%97%E3%81%9F%E3%81%84/


## Flutterの設定

起動時にフレーバーごとに異なる`Firebase Instance`を使用します
```dart:main.dart
      await Firebase.initializeApp(
        name: 'PROJECT_${const String.fromEnvironment('FLAVOR')}'//※1,2,
        options: GlobalConfigs.instance.firebaseOptions,
      );
```
※1 `name`引数を設定する理由は、一つのプロジェクトだけなら`name`はなしでOKですが、二つ以上のプロジェクトでは
インスタンスが重複するとエラーが出てしまうので名前をつけて分けましょう。

```
App duplication error: Firebase app with the name '[default]' already exists (app/duplicate-app)
```

※2 dartの`String.fromEnvironment('FLAVOR')`は起動時にコマンドで環境変数を設定しています。
```
--dart-define=FLAVOR=staging
```

```
String flavor = String.fromEnvironment('FLAVOR')// flavor is 'staging'
```
初心者備忘録③：【CSS】background-imageで背景画像が表示されない時に注意すること

皆様、こんにちは。
今回はCSSのプロパティ、**background-image**で背景画像を表示させようとした際、意外と陥りやすいかもしれない落とし穴について書いていこうと思います。

前回の記事：
[初心者備忘録②：labelとinputを綺麗に揃える方法](https://qiita.com/ikue-san/items/93d4e6dc857b24571393)

# background-imageプロパティで背景画像を設定する
今回は下記のような階層構造でサイトを作成します。
![階層構造.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2150221/c6029824-a8fa-5176-81bb-b8807711405e.png)
ではまず、適当なHTML、CSSを記述します。
```HTML:index.html
<html>
  <head>
    <meta charset="utf-8">
    <link rel="stylesheet" href="css\style.css">
    <title>背景画像の反映</title>
  </head>
  <body>
    <h1>背景画像の反映</h1>
  </body>
</html>
```
```CSS:style.css
h1 {
  text-align: center;
}
```
background-imageプロパティの書き方は下記のようになります。
```
セレクタ {
  background-image: url(画像のパス);
}
```
これを基にCSSに追記します。
HTMLにimgタグで画像を表示させるときのようにurl後ろのカッコ内に画像の**相対パス**を記述します。
```CSS:style.css
h1 {
  text-align: center;
}

body {
  background-image: url(img/blue.jpg);
  background-size: cover;
}
```
::: note
画面全体に画像を反映させるため**background-size**プロパティに**cover**を指定しています。
:::
この状態でサイトを表示させてみます。
![背景画像の反映(未反映).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2150221/d84d80e8-4696-9ae7-a18f-ad77a83f2990.png)
何も反映されず真っ白な画面が表示されてしまいました。
こうなってしまう原因は何かというと、サイトを作り慣れている方であればすでにお気づきかもしれませんが、**画像のパスがHTMLから見た相対パスになってしまっている**ことです。

# 相対パスはどのファイルから見たパスなのかを注意する
今回CSSに記述した**img/blue.jpg**という相対パスは、「同じ階層のimgフォルダの中にあるblue.jpg」という意味になります。
もし、HTMLにimgタグで画像を表示したい場合、記事冒頭の階層構造を示す画像を見て分かる通り、index.htmlとimgフォルダは同じ階層内にあるためこの書き方で問題ありません。
注意しなければならないのは、CSSに相対パスを記述する場合はあくまで**CSSから見たパス**を記述しなければならない点です。
そのため今回の階層構造であれば「(style.cssから見て)**一つ上の階層**のimgフォルダの中にあるblue.jpg」という意味の相対パスを記述する必要があります。
一つ上の階層を示す場合、**パスの先頭に「../」を記述すればよい**ので下記のようにCSSを修正します。
```CSS:style.css
h1 {
  text-align: center;
}

body {
  background-image: url(../img/blue.jpg);
  background-size: cover;
}
```
改めてサイトを表示してみます。
![背景画像の反映(反映).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2150221/f44d4e2a-5a18-7813-9a18-3ca0ef5dc9a8.png)
画像を表示させることができました！

::: note
「../」の数でいくつ上の階層かを示せる。
「../../img/blue.jpg」で二つ上、「../../../img/blue.jpg」で三つ上となる。
:::

# まとめ
いかがだったでしょうか。
相対パスを記述する際は以下の点を意識する必要があります。

**・相対パスを記述するファイルから見て、対象のファイルがどこにあるのか**
**・「../」の数の分だけ上の階層を示すことができる**

ついついHTMLから見た相対パスを記述してしまうことが意外とあるため注意しましょう。
私も何故背景が表示されないのか分からずしばらく悩みました……。
慣れない内は階層構造の図を書いてみるとよいかもしれませんね。

# 参考
[【画像表示がうまくいかない⑤】background-imageで背景画像が表示されない原因](https://yoncoichi.com/background-image-not-displayed/)
CloudFormation テンプレートの構造

# CloudFormation テンプレート形式
 JSON、または、YAML
```ruby:YAMLの例
---
AWSTemplateFormatVersion: "version date"

Description:
  String

Metadata:
  template metadata

Parameters:
  set of parameters

Rules:
  set of rules

Mappings:
  set of mappings

Conditions:
  set of conditions

Transform:
  set of transforms

Resources:
  set of resources

Outputs:
  set of outputs

```
# テンプレートの各セクション
### AWSTemplateFormatVersion（任意）
・形式バージョン


### Description（オプション）
・説明するテキスト文字列


### Metadata（オプション）
・テンプレートに関する追加情報


### Parameters（任意）
・実行時 (スタックを作成または更新するとき) にテンプレートに渡す値
（ResourcesとOutputsがこっちをみる）


### Rules（オプション）
・スタックの作成またはスタックの更新時に、テンプレートに渡されたパラメータまたはパラメータの組み合わせを検証
（例：パラメーター値の条件付きの確認）


### Mappings（任意）
・キーと関連する値のマッピングで、条件パラメータ値の指定に使用できる
（例：リージョンに基づく値を設定する場合、リージョン名をキーとして必要な値を保持するマッピングを作成）
（AMIがリージョン毎にIDが異なるとか）

### Conditions（オプション）
・スタックの作成中または更新中に、特定のリソースが作成されるかどうか、または特定のリソースプロパティに値が割り当てられるかどうかを制御する条件
（例：リソースを作成するかどうか判断。条件式の結果がtrueの場合→作成、falseの場合→作成しない）

### Transform（オプション）
・サーバーレスアプリケーション (Lambda ベースアプリケーション) の場合は、使用する AWS Serverless Application Model (AWS SAM) のバージョンを指定
（要は、Lambdaを作りたい場合ですね。。。）

### Resources（必須）
・作りたいAWSリソースを記述
（ここがリソース本体の中身！一番大事！）

### Outputs（任意）
・スタックのプロパティを確認すると返される値について説明
（スタックを生成してみないと分からない「結果」（EC2サーバのSecurityGroupのIDとか）を出力）

# 参考サイト

https://dev.classmethod.jp/articles/cloudformation-firstcontact/

https://dev.classmethod.jp/articles/cloudformation-conditions/

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/template-anatomy.html

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/template-formats.html
Debian12にpython2をインストール

# Debian12にpython2.7をインストールする方法
・経緯
１．ionicの古い動作環境を作ろうとnpm installを実行したところエラーが出た。
２．内容を見てみるとpython2を使っているぽいのでpython2をDebian12に入れる方法を調べてみたところ既にpython2はドロップされておりパッケージはない。
３．Docker使えばいいじゃんという意見もあるかと思うがとりあえずnpmでインストールしたかったのでpython2を入れてみる。

# インストールする方法
１．python.orgに行く
２．DownloadメニューからSource Codeを選ぶ
３．python2.7.18あたりのZipped source tarballをダウンロードする
４．rootでinstall用ディレクトリにソースを展開する・・・
　　tar xovfz Python-2.7.18.tgz
５．cd Python-2.7.17
　　でディレクトリを移動
６．cmake環境ではないので
　　./configure で Makefileを生成する
７．make
　　python2.7をコンパイル
８．make install
　　でpython2.7をインストール
  
---

・追記
標準では入っていないので  
apt-get install gcc make  

---

ー　以上　ー
DISM.exe /Online /Cleanup-image /Restorehealth sfc /scannowスクリプトの実行を許可するところまでは、動きました。

バッチファイル(.bat)に拡張子を変えて実行すると動きます。
私は「SystemRepair.bat」と名前を付けました。
会社のPCがおかしくなった人に使ってもらってます。
以下が、そのスクリプトです。
@echo off
net session >nul 2>&1
if %errorLevel% == 0 (
    echo Running System File Checker...
    sfc /scannow
    echo Running Deployment Image Servicing and Management tool...
    DISM.exe /Online /Cleanup-image /Restorehealth
    echo Press any key to close this window...
    pause >nul
) else (
    powershell -Command "Start-Process cmd -ArgumentList '/c %~f0' -Verb runAs"
)
14.x-RELEASE に向けての ports 関連問題

# なんの問題なんじゃ？
13.x-RELEASE までは ports スケルトン取得にユーザランドコマンドの portsnap(8) が有ったが、廃止したらしい😱
- - -
最新を追いかけるには敷居が上がってしまうけぇ、ここにアドホック的レシピを書き留めておくけん、自環境に合わせて適宜試してみんさい✌
- - -
[ソースコードリポジトリ](https://www.freebsd.org/ja/developers/cvs/) によると 2021 年の 4 月に git へ移行になったが、小まい話は興味のある人は各自 dig りんちゃい😏
- - -
# 手を動かす(初回実行)
```shell:portsnap fetch extract と同義
# pkg install git
# git clone ssh://anongit@git.FreeBSD.org/ports.git /usr/ports
# cd /usr/ports ; make fetchindex
```
- - -
- crontabに追記(必要であれば) 
```shell:portsnap fetch update と同義
@weekly ( cd /usr/ports && make update fetchindex )
```
流れはこんな感じ。
- - -
/usr/ports ディレクトリは今回デフォルトで採用されちゃる場所を、絶対パスで記述しおるが PORTSDIR 変数を参照しおるようにしても大丈夫。
- - -
# 余談じゃが
このコマンドの ports が存在しよったらしい。
この記事を書く際に dig りよった時に初めて過去の存在に気付いたのは🤫
- - - 
一回目の登場は 2004年10月29日 (古)
[Add portsnap: Provides secure snapshots of the ports directory.](https://cgit.freebsd.org/ports/commit/ports-mgmt/portsnap/Makefile?id=7dc5e40d448e5507a5e3e53561c78846594bfd64)
- - -
14.x-RELEASE でユーザーランドから消えたけぇ、再登場👏が 2023年4月9日
[ports-mgmt/portsnap: Resurrect](https://cgit.freebsd.org/ports/commit/ports-mgmt/portsnap/Makefile?id=0e9127b12dfbaf987bfcaa16f22dcfa5a42543ae)

歴史を感じるのぉ☺
GIMPSクライアントのtips

https://qiita.com/saoyagi2/items/8618033c47b560ca08ae

こちらの記事で、とりあえず GIMPS 始めるまでの手順は書いたのですが、実際に長期的に実行していると様々な「ああこういうことがやりたいのに」ってシチュエーションがあります。そんなときの TIPS を書き出してみました。

なお、これらの手順は「やってみたら出来た」ってものもありますので、もしかしたら正式な手順ではないかもしれません(あんまり真面目にドキュメントとか読んでない...)。その辺差っ引いてお読みいただけますとー。

## バックグラウンドで動作させる

### Windows 編

Windows 版のクライアントは GUI なので、最小化しておけば画面に邪魔になることはありません。それとは別にサービス版のクライアントも用意されています。

ドキュメント(readme.service.txt)によりますと、以下の手順でインストール出来ます。

1. GUI 版クライアントをダウンロードし、設定を行う。
1. 同じディレクトリにサービス版クライアントをコピーする。
1. 管理者モードで `.\ntprime64.exe -install` を実行する。
1. サービスの一覧に `"Prime Service` が現れるので、実行設定を行う。

ただ、この通りにやってみたのですが手元の環境ではサービスが登録されない。Windows 10 Home だからですかね。またなんか分かったら追記します。

### Linux/Unix 編

Linux/Unix 版クライアントもオプション無しで起動すると対話モードになります。Exit すると計算も止まってしまう。しかし、`-d` オプションを付ければ非対話モードで実行できます。

```shell
$ ./mprime -d >> mprime.log 2>&1 &
```

止めるときは kill コマンドでいけます。

```shell
$ kill `cat mprime.pid`
```

合わせてこんな感じのシェルスクリプトを作っておくと便利かもしれないですね。

```shell
#/bin/sh

case "$1" in
start)
  ./mprime -d >> mprime.log 2>&1 &
  ;;
stop)
  kill `cat mprime.pid`
  ;;
esac

exit 0
```

## 他のPCで新規設定を省略する

複数のマシンを使ってファームを組んだりしていると、いちいちマシンごとに対話モードで初期設定を行うのが面倒になります。1台でセットアップすれば、他のマシンにも設定を持っていければと思いますが、その場合は `prime.txt` と `local.txt` をコピーすれば大丈夫。

ただしこれで万全とはいきません。設定情報にはホスト名の項目がありますから、ホスト名設定を変えたければやっぱり個別に設定する必要があります。

また、CPUやメモリの項目をマシンごとに最適化する場合も個別に設定が必要ですね。大抵の設定項目はデフォルトでもいいんですが、コア数だけは個別に設定した方がいいかな。

結局設定ファイルを持って行って便利なのってアカウント設定くらいでしょうかね。

## 取得した expornent を他のPCに持っていく

別のマシンに計算中も expornent を持っていくには、以下のファイルをコピーすればいけます。もちろん旧マシンでの計算は止めてからですが。

* worktodo.txt
* p04L5591(こんな感じのファイル名)
* p04L5591.*

## 取得した expornent が終了したら終了する

対話モードで起動し、「Advanced/Quit Gimps」を選択すると、以下のメッセージが表示されます。

```
You have elected to remove this computer from the Great Internet Mersenne
Prime Search.  Other computers using this user ID will not be affected.

Please make sure your results have been successfully sent to the server
(the program will be idle rather than looping trying to contact the
server) before uninstalling the program. If in doubt, you can send the
results.txt file to woltman@alum.mit.edu.

You can either complete your current assignment or you can quit GIMPS
immediately.  Do you wish to complete your current work assignments before
quitting? Y=Yes, N=No, C=Cancel (C):
```

今の計算が終わってから終了するか、今すぐ終了するか聞かれています。今の計算は終わらせてからにしたいので Y を選択します。

N を選択した場合、現在の expornet の割り当てを開放して、直ちに終了します。

上記にもあるとおり、退役するのは現在のマシンのみで、他のマシンで実行中のクライアントには影響はありません。

(2023/10/28追記)

途中まで計算した結果を放棄していいなら、そのままファイルを全部消して知らんぷりしても問題ありません。一定期間にに結果が返ってこない場合はGIMPS サーバ側で割り当てを解除するからです。お行儀はあんまりよくないなとは思いますけれども。

(2023/10/28追記おわり)

## クライアントをバージョンアップする

これは簡単。以下の手順で OK。

1. 今計算してるクライアントを停止する。
1. ダウンロードした新クライアントのアーカイブを展開し、既存のディレクトリに上書きコピー。
1. クラアントを再実行。
JavaScriptの関数の引数に(...props)って書いてけど何やってんの？

### rest parameter （可変長引数）
通常の関数は引数の数が決まっています。
JavaScriptでは引数の数に決まりがない関数も作れます。
引数の個数が決まっていない引数のことを `可変長引数` といいます。
JavaScriptでは可変長引数は `rest parameter` と呼びます。

### 実例 （Reactでよく見るやつ）

親コンポーネント
```JSX
import Container from "./components/container";

export default function TopPage() {
  return (
    <Container height={100} width={100} bgColor="blue">
      This is Container
    </Container>
  );
}
```

子コンポーネント
```JSX
const Container = ({ ...props }) => {
  return (
    <div
      style={{
        height: props.height,
        width: props.width,
        background: props.bgColor,
      }}
    >
      {props.children}
    </div>
  );
};

export default Container;
```

### 挙動 （配列）
受け取った rest parameter は `配列` になります。

``` JavaScript
function func(...props) {
  console.log(props);
}
func(1, 2, 3);

-> [ 1, 2, 3 ]
```

### 挙動 （複数の値 + 配列）
普通の引数と rest parameter を持つ関数も作れます。

``` JavaScript
function func(props1, ...props) {
  console.log(props1, props);
}
func(1, 2, 3);

-> 1 [ 2, 3 ]
```

### 挙動 （オブジェクト）
オブジェクトで受け取った rest parameter は `オブジェクト` になります。

``` JavaScript
function func({ ...props }) {
  console.log(props);
}
func({ a: 'A', b: 'B', c: 'C' });

-> { a: 'A', b: 'B', c: 'C' }
```

### 挙動 （複数の値 + オブジェクト）
普通の引数と rest parameter を持つ関数も作れます。

``` JavaScript
function func(props1, { ...props }) {
  console.log(props1, props);
}
func(1, { a: 'A', b: 'B' });

-> 1 { a: 'A', b: 'B' }

// 構文エラーになるコード
function func(...props, props1) {}
-> A rest parameter must be last in a parameter list.
```

### NGパターン
**残余引数を複数持たせることはできません。**

``` JavaScript
// 構文エラーになるコード
function func(...props1, ...props2) {}

-> A rest parameter must be last in a parameter list.
```

**必ず rest parameter が最後の引数でなければなりません**

``` JavaScript
// 構文エラーになるコード
function func(...props, props1) {}

-> A rest parameter must be last in a parameter list.
```
vision-languageのタスクの紹介

# 概要
論文に乗っていたvision-languageタスクをまとめてみた
下の図はTaskに対するIdentifier
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/58d58167-c802-ee47-2725-72db91b2a9e2.png)

## VQA(Visual Question Answering)
写真に対する質問に答える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/95e6bfa5-4e2a-7134-ac98-5172a73ae42b.png)

## Grounded Captioning
写真を出来るだけ説明する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/f4a0bfff-a10f-e827-6420-8244a985886b.png)

## REC(referring expression comprehension)
物体の位置や色などを指示して、物体を抽出する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/6f7449cc-7ab6-e006-edcc-5e6618f5b031.png)

## REG(referring expression generation)
与えられたBounding Boxの意味を説明する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/536dcf2d-3b64-cc6d-caff-386906bcfcd9.png)

## Object Parsing and Grounding
指定されたObjectの位置を推定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/f4c994fa-c50d-d353-d6fe-1aa385635f96.png)

# 参考文献
https://arxiv.org/pdf/2310.09478v1.pdf
PSDのグループ化されたレイヤーを一括でスマートオブジェクトに変換

使う用途としては、素材提供されたイラレデータをpremiereproで個別にレイヤーを読み込めるようPSDに変換、イラレのグループはそのままPSDのレイヤー構造に反映される。
このままのデータでPremiereProに変換したPSDに読み込むと、レイヤーが細かくなってしまうので
イラレからPSD変換後PSDファイルのレイヤーでグループ化されているレイヤーをスマートオブジェクトに変換する。

こうすれば、レイヤーを綺麗にグループ化して読み込める！

👌

```jsx
var doc = app.activeDocument;

convertAllGroupsToSmartObjects(doc);

function convertAllGroupsToSmartObjects(layerSet) {
    for (var i = layerSet.layers.length - 1; i >= 0; i--) { // 後ろから処理
        var layer = layerSet.layers[i];
        
        if (layer.typename == "LayerSet") {
            // 再帰的に子グループも処理
            convertAllGroupsToSmartObjects(layer);
            
            // アクティブなレイヤーとして設定
            doc.activeLayer = layer;
            
            // スマートオブジェクトに変換
            convertLayerToSmartObject();
        }
    }
}

function convertLayerToSmartObject() {
    var idnewPlacedLayer = stringIDToTypeID( "newPlacedLayer" );
    executeAction(idnewPlacedLayer, undefined, DialogModes.NO);
}
```
ビットマップのドット反転の高速化


目的
ビットマップのパターンをいろいろ用意するのがめんどい
32ビット機の場合は、
32ビット一気に処理出来るので
8ビット毎にやるより高速化できる。
論理値は、約4倍

したいこと
ループ内の変なアドレス変換をなくす
マクロ展開化する
あまり処理は、いらない
サイズをマクロ化


元


```c++

  unsigned char databytesTT_BLACK[(64/8)*64];
  for(int ii=0;ii<((64/8)*64);ii++){
    databytesTT_BLACK[ii] = ~(databytes_top[ ((64/8)* 64 * d_top[d10] )  +ii]);
  }


```

こんな感じ(たぶん　うごかない)


```c++

void Reverse_Bitmap(const uint8_t Sbitmap[],const uint8_t Rbitmap[],int Bsize) {


int *Sptr; //ソース
int *Rptr; //リバース

Sptr = (int *)(&Sbitmap[0]); //ソースをイントのポインターに強制キャスト
Rptr = (int *)(&Rbitmap[0]); //リバースをイントのポインターに強制キャスト


//8ビットの処理を32ビット単位で処理して高速化する
//int count_s = Bsize/4;
int count_s = Bsize>>2;
for(int i=0;i<count_s;i++){


  Rptr[i] = ~Sptr[i];

} //Reverse_Bitmap


//余りの処理
//count_s =  Bsize - (count_s * 4);
count_s =  Bsize & 0x03; //4のあまり

if( count_s == 3 ) {

Sbitmap[Bsize-1] = ~(Rbitmap[Bsize-1]);
Sbitmap[Bsize-2] = ~(Rbitmap[Bsize-2]);
Sbitmap[Bsize-3] = ~(Rbitmap[Bsize-3]);


} else if ( count_s == 2 ) {

Sbitmap[Bsize-1] = ~(Rbitmap[Bsize-1]);
Sbitmap[Bsize-2] = ~(Rbitmap[Bsize-2]);


} else if ( count_s == 1 ) {

Sbitmap[Bsize-1] = ~(Rbitmap[Bsize-1]);


}


}//Reverse_Bitmap

```

こんなかんじ2(たぶん　うごかない)


```c++



#define REVERSE_BITMAP() for(int ll=0;ll<count_s;ll++){Rptr[ll]=~Sptr[ll];}
#define Bsize ((64/8)*64)

  unsigned char databytesTT_BLACK[Bsize];
  Rptr = (int *)(&databytesTT_BLACK[0]); //リバースをイントのポインターに強制キャスト

  //ソースをイントのポインターに強制キャスト
  Sptr = (int *)(&databytes_top[ Bsize * d_top[d10] ]); 
  //ビット反転処理
  REVERSE_BITMAP();



```

よつて
　オンラインコンパイラ Paiza io
　Main.cpp
　

```c++


#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    
    
    printf("START\r\n");
    
// test
unsigned char databytes_top[] = {0x00,0x80,0x01,0x00 , 0xff,0x80,0x01,0xff};
int d10 = 0;
int d_top[] = {0};



//#define Bsize ((64/8)*64)
#define Bsize (8)
#define LOOP_Bsize (Bsize/4)
#define REVERSE_BITMAP() for(int ll=0;ll<LOOP_Bsize;ll++){Rptr[ll]=~Sptr[ll];}


  unsigned char databytesTT_BLACK[Bsize];
  int *Rptr = (int *)(&databytesTT_BLACK[0]); //リバースをイントのポインターに強制キャスト
  int *Sptr; //ソースのポイント

  //ソースをイントのポインターに強制キャスト
  Sptr = (int *)(&databytes_top[ Bsize * d_top[d10] ]); 
  //ビット反転処理
  REVERSE_BITMAP();


  printf("EEEE\r\n");
  
  for(int i=0;i<8;i++){

    printf("[%x]",databytesTT_BLACK[i]);
    
  }
  
  
  printf("\r\nEEEE\r\n");
 
}



```

![o_cop694.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/7ca7701f-6768-b578-3f68-a798181d712a.jpeg)
UnofficialSF

UnofficialSF は、ブロガー、MVP、および時折 Salesforce 従業員が参加する緩やかなコラボレーションです。ただし、このコンテンツは Salesforce の公式コンテンツではないため、ご自身の責任でご使用ください。

+ [Josh Dayment より – フロー用バーコード スキャン コンポーネント](https://unofficialsf.com/from-josh-dayment-barcode-scanning-component-for-flow/)
+ [バーコード値をスキャンして Salesforce に送信する方法](https://salesforcecodes.blogspot.com/2021/06/how-to-scan-barcode-values-and-send-to-salesforce.html)


# エラー

+ [Error using Configure Columns in Table formatting on Datatable](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007O4Gdg)

:::note alert
Something went wrong with the "FieldSelectionMethod" screen component on the "Datatable Configuration Wizard" flow. Contact your Salesforce admin about this error. QuickChoiceFSC: Need a valid Input Mode value. Didn't get one

The Lightning Component c:fsc_quickChoiceFSC generated invalid output for field style_width. Contact your administrator with these details: Flow encountered an error when processing and converting between data types. Please check the flow and ensure all data types are matched correctly.
:::

:::note
Have you tried clearing the browser cache and cookies?
:::

# バグ？

+ [Datatable jumping on inline edit](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000oKMD)

:::note
Salesforce は、数リリース前に標準の日付選択ダイアログボックスの動作を変更しましたが、これはそれに関連する Salesforce のバグである可能性があります。この動作は他の種類のフィールドでも発生していますか?
:::
変更したファイルのステージングについて "git add"

# 記事の目的
+ **git add** コマンドについて記載
+ 追跡対象になっているファイルについて記載
:::note info
+ [Pro Git](https://git-scm.com/book/ja/v2)を基に記事を作成しました。
+ 後ほど記事の改修しやすいように[元の記事](https://qiita.com/yuyas7/items/cafc6ff737b20e33e4d0)から分離しました。
:::

# 本文
## すでに追跡対象となっているファイルを変更した場合
+ 追跡対象となっているファイル **CONTRIBUTING.md** を変更する。
+ その後に **git status** コマンドを実行する。
```
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   README
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working
directory)

modified:   CONTRIBUTING.md
```
+ 分かること
**CONTRIBUTING.md** ファイルは"Changed but not staged for commit"という欄に表示されます。これは、追跡対象のファイルが作業ディレクトリ内で変更されたけれどもまだステージされていないという意味です。
ステージするには　"git add"が必要

+ "git add"のいろんな意味合い
・新しいファイルの追跡開始
・ファイルのステージング
・マージ時に衝突(コンフリクト)が発生したファイルに対する「解決済み」マーク付けなどで使用

"使用したファイルをプロジェクトに追加(add)する"コマンド、というよりは、"指定した内容を次のコミットに追加(add)する"コマンド、捉えたほうがいい。

## **git add** で **CONTRIBUTING.md** をステージして　**git status** を実行したら
```
$ git add CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   README
    modified:   CONTRIBUTING.md
```
両方のファイルがステージされました。
これで、次回のコミットに両方のファイルが含まれるようになります。

## **CONTRIBUTING.md** にちょっとした変更を加えてからコミットしたくなった場合
+ ファイルを開いて変更を終え、コミットの準備が整いました。
+ ここで、 **git status** を実行してみると...なんか変です。
```
$ vim CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
   
   new file:   README
   modified:   CONTRIBUTING.md

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working
directory)

    modified:   CONTRIBUTING.md
```
+ **CONTRIBUTING.md** が、ステージされている方とステージされていない方の両方に登場しています。
+ Gitは、「 **git add** コマンドを実行した時点の状態のファイル」をステージするということ。
+ ここで、コミットをすると **git add** を実行した時点の **CONTRIBUTING.md** になってしまいます。
## **git add** した後にファイルを変更した場合
+ 最新版のファイルをステージし直すにはもう一度 **git add** を実行します。
```
$ git add CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

  new file:   README
  modified:   CONTRIBUTING.md

```
# 参考文献
+ [Pro Git ver.日本語訳](https://git-scm.com/book/ja/v2)

# Gitについてのリンク
+ [Gitを理解するためにProGitを読んでみた。](https://qiita.com/yuyas7/items/cafc6ff737b20e33e4d0)
新しいファイルの追跡について　"git add" 

# 記事の目的
+ **git add** コマンドについて記載
:::note info
+ [Pro Git]((https://git-scm.com/book/ja/v2)
)を基に記事を作成しました。
+ 後ほど記事の改修しやすいように[元の記事](https://qiita.com/yuyas7/items/cafc6ff737b20e33e4d0)から分離しました。
:::

# 本文
機能：新しいファイルの追跡を開始する時に使う
## READMEファイルの追跡を開始する場合
```
$ git add README
```
**status** コマンドを実行すると。
```
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   README
```
+ READMEファイルが追跡対象となってステージされており、コミットする準備ができているのがわかる。
+ ステージされていると判断する要素
"Changes to be committed"欄に表示されていること
+ ステージされている状態でコミットすると
 **git add** した時点の状態のファイルがスナップショットとして歴史に書き込まれます。

# 参考文献
+ [Pro Git ver.日本語訳](https://git-scm.com/book/ja/v2)

# Gitについてのリンク
+ [Gitを理解するためにProGitを読んでみた。](https://qiita.com/yuyas7/items/cafc6ff737b20e33e4d0)
TypeScriptでの非同期処理　戻り値の型どうする？ Promise<T>

## TypeScriptと非同期処理
:::note
JavaScriptのスーパーセットであるTypeScriptは、静的型付けを採用しており、より安全で保守性の高いコードを記述することが可能な言語。
:::

### 非同期関数にはどのような型注釈をするべきか
通常、非同期関数の戻り値は**Promise<T>型**を指定する。ここでTはPromiseが解決された時の値の型を表す。

```typescript
// 誤った型注釈
const getString = async(): string => {
    return "hello world";
};

// 正しい型注釈
const getString = async(): Promise<string> => {
    return "hello world";
};
```

awaitを使用して非同期関数の戻り値を取得する場合は、その戻り値はPromiseが解決された結果の型、つまりTとなる。

```typescript
// 誤った型注釈
const str: Promise<string> = await getString();

// 正しい型注釈
const str: string = await getString();
```

---
▼参考文献

https://gihyo.jp/magazine/SD/archive/2023/202309
クロス条件 : レポート

[クロス条件の例](https://qiita.com/Keiji_otsubo/items/9125592ed1d47cf3c854)

--------------

+ [商談がない取引先の売上レポート作成](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007OqEwuSAF)

:::note
クロス条件を使うと可能です。今回はレポートタイプを作成すると対応可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a02da35b-833c-3caf-15ce-da3597b494cd.png)


https://www.salesforceben.com/what-are-cross-filters-in-salesforce-reporting/

 

主を取引先、関連に商談を設定して「A」レコードには関連する「B」レコードの有無は問いません。を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/0a354198-3b31-1266-d937-59eb12d94d40.png)


# 関連

https://help.salesforce.com/s/articleView?id=000393178&type=1

https://opfocus.com/blog/how-to-create-a-last-won-or-last-lost-opportunity-contact-report/

https://www.salesforceben.com/what-are-cross-filters-in-salesforce-reporting/
EC2 Autoscaling スケールイン保護の動作検証

# 備忘

次の状態からテスト開始
キャパシティー(des,min,max):2,2,2、インスタンス:2(InService)、スケールイン保護有効
↓
１台スケールインさせるためキャパシティーを変更
キャパシティー(des,min,max):1,1,1
次のイベントが記録された。

Could not scale to desired capacity because all remaining instances are protected from scale-in.
（残りのすべてのインスタンスがスケールインから保護されているため、必要な容量にスケールできませんでした。）

キャパシティー設定は1,1,1に変更されているが、インスタンス2台ともInServiceのまま。
キャパシティー(des,min,max):1,1,1、インスタンス:2(InService)、スケールイン保護有効
↓
1台のインスタンスからスケールイン保護を削除
↓
スケールイン保護を削除したインスタンスがTerminate(終了)された
ファイルの状態の確認　git status

# 記事の目的
+ **git status** コマンドについて記載
:::note info
+ [Pro Git]((https://git-scm.com/book/ja/v2)
)を基に記事を作成しました。
+ 後ほど記事の改修しやすいように[元の記事](https://qiita.com/yuyas7/items/cafc6ff737b20e33e4d0)から分離しました。
:::

# 本文
+ 機能：どのファイルがどの状態にあるのかを知るために主に使う

## もし、クローン直後に実行すると、この結果になる。
```
$ git status
On branch master
nothing to commit, working directory clean
```
+ 分かること
1.クリーンな作業コピーである　＝　追跡されているファイルの中に変更されているものがないこと
2.追跡されていないファイルも存在しない。
3.今どのブランチにいるかわかる。（今は **master** ブランチにいる）


## 新しいファイルをプロジェクトに追加した場合
・READMEファイルを追加してみる。
・追加する前にREADMEファイルがなかった場合に、 **git status** 実行するとする。
```
$ echo 'My Project' > README
$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)
    README
nothing added to commit but untracked files present (use "git add" to
track)
```
+ 分かること
・"Untracked files"欄にREADMEファイルがある　＝　ファイルが追跡されていない
・Gitが「前回のスナップショットにはこのファイルが存在しなかった」とみなした。
・明示的に支持しない限り、Gitはコミット時にこのファイルを含めることはない。
・自動生成されたバイナリファイルやコミットしたくないファイルを間違えてコミットしてしまう心配がない。


# 参考文献
+ [Pro Git ver.日本語訳](https://git-scm.com/book/ja/v2)

# Gitについてのリンク
+ [Gitを理解するためにProGitを読んでみた。](https://qiita.com/yuyas7/items/cafc6ff737b20e33e4d0)
【Git】git checkout <branch> を打つのがめんどくさい

頻繁にGitコマンドを使用しているなら、ブランチ名やコマンドのTab補完が利用できないことは、少々不便だと感じることでしょう。

特に、新しいブランチを切り替えるたびに、その名前を完全にタイプする必要があるのは面倒です。

この記事では、そのような不便を解消する方法を具体的に紹介します。

## 目次
1. [必要なファイル群をダウンロード](#Chapter1)
2. [.zshrcファイルに設定項目を追加](#Chapter2)
3. [オリジナルのプロンプトデザインを作成](#Chapter3)
4. [ハマったこと](#Chapter4)
5. [参考文献](#reference)

<a id="Chapter1"></a>
## 必要なファイル群をダウンロード

初めに、必要なファイル群をダウンロードします。

```zsh
mkdir ~/.zsh
cd ~/.zsh
curl -o git-prompt.sh https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh
curl -o git-completion.bash https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash
curl -o _git https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.zsh
```

<a id="Chapter2"></a>
## .zshrcファイルに設定項目を追加

次に、`.zshrc`ファイルに設定を追加します。

```zsh
# ~/.zsh/git-prompt.sh をソースファイルとして読み込む
source ~/.zsh/git-prompt.sh

# fpathに~/.zshディレクトリを追加
fpath=(~/.zsh $fpath)

# Gitのコマンド補完スクリプトの場所を指定
zstyle ':completion:*:*:git:*' script ~/.zsh/git-completion.bash

# zshのコマンド補完を初期化
autoload -Uz compinit && compinit -u

# Gitのプロンプトに変更がある場合に表示する設定
GIT_PS1_SHOWDIRTYSTATE=true

# プロンプトの文字列が実行時に評価されるように設定
setopt PROMPT_SUBST

```

<a id="Chapter3"></a>
## オリジナルのプロンプトデザインを作成

続いて、好みのプロンプトを設計します。ここでは、カレントディレクトリとGitブランチ名を表示する例を示します。

```zsh
# git_prompt関数を定義。現在のGitブランチ名を取得して、それをプロンプトに表示するための文字列を返す。
git_prompt() {
    # __git_ps1はGitのプロンプトスクリプトによって提供される関数。"%s"を渡すと現在のブランチ名のみを返す。
    local branch_name="$(__git_ps1 "%s")"

    # ブランチ名が空でない場合（Gitリポジトリ内である場合）、" on [ブランチ名]"という形式の文字列をechoする。
    if [[ -n $branch_name ]]; then
        echo " on $branch_name"
    else
        # Gitリポジトリ外である場合は、空の文字列をechoする。
        echo " "
    fi
}

# プロンプトの見た目を設定。カレントディレクトリをシアン色で、git_prompt関数の結果（ブランチ名）を赤色で表示する。
PS1='%F{cyan}%~%f%F{red}$(git_prompt)%f\$ '

```

結果はこんな感じ。

![スクリーンショット 2023-10-26 7.16.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143946/ed671a6c-bb0b-02e5-ba7b-ee80c9863028.png)


ちゃんとブランチの補完も効いてて使いやすい。

![スクリーンショット 2023-10-26 7.16.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143946/c441bea1-994d-26cc-1e63-153b06676fbd.png)


<a id="Chapter4"></a>
## ハマったこと

プロンプトのカスタマイズ中に、ある問題が発生。

`__git_ps1`という`git-prompt.sh`で定義されている関数を使用している時、これが過去に作成したエイリアスと競合してしまいました。具体的には以下のようなエイリアスが原因でした。

```zsh
alias test="some process sample_test.out"
```

このエイリアスにより、以下のようなエラーメッセージが表示されていました。

```zsh
dyld[58984]: Symbol not found: __ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13get_allocatorEv                                                                                                 
  Referenced from: <EE118444-4D57-3565-AE96-6323D4C54F0A> /usr/local/bin/sample_test.out
  Expected in:     <3F5CB4D5-26D1-3E43-B241-2688FF0A67BD> /usr/lib/libstdc++.6.dylib
dyld[58985
```

<a id="#reference"></a>
# 参考文献
- [【zsh】絶対やるべき！ターミナルでgitのブランチ名を表示&補完【git-prompt / git-completion】](https://qiita.com/mikan3rd/items/d41a8ca26523f950ea9d)
- [【2ステップ】Gitコマンドでtab補完を有効にする](https://qiita.com/growsic/items/1fff6286061e0cd27d54)