OmniAICreator/Qiita-1.07M huggingface dataset:
2023年に論文を探す最強手段！？「Perplexity.ai」使って知識マウントを取ろう！

レイチェルです。
今回は2023年11月時点で論文検索をするときに、恐らく最強であろうツールをご紹介します(n番煎じ)
**その名も[Perplexity](https://www.perplexity.ai/)！**
その正体と活用方法を一緒に見ていきましょうや。

# 見つけたきっかけ
レイチェル、MINI Cooperがメチャクチャ好きです。
実際、`MINI 5door CooperSD` という車を所有して毎日愛でておりました。
そんなある日、以下のようなことを考えます。

**「MINIに関する記事とか書きて～～～～！」**
**「でも全然技術関係ねぇ～～～～～！！」**
**「あ、そうだ！自動運転技術に関する論文でも探して解説記事書こ！！！」**

そんなこんなで論文を探すことに。

レイチェルが学生をしていた当時(2021年)は、[Google Scolar](https://scholar.google.co.jp/schhp?hl=ja) でポチポチ探したい論文の関連ワードを入力して、ヒットした新しめの論文のAbstractを眺めるというクソだるい作業を繰り返し、探していました。

ところが、最近は巷でAIがどうのこうのと話題になり、IT界に生きる人類の生活スタイルは激変していっている真っ最中です。

**「もしかしたら論文探すのももっと楽になるスーパー画期的ツール出没してるかもな～～～」** っとなんの根拠もない期待を胸に、Googleを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264716/f80d9dad-53a0-0fe1-8478-6915fd5fc400.png)

そうすると見つかりましたね、**Perplexity** なる怪しげなツールが。
「ホンマに便利なんかいな」と思いながら使うこととなります…

# 使ってみた
まずは当初の目的である「BMW・MINIが出してる自動運転技術に関する論文」を探してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264716/e0f5dfcf-5cbf-6ccb-0436-35b9413d1648.png)

「うぉ～～～～スゲェエエエエエ！！！」
ちゃんと参考文献を示して情報提供してくれます。神。
ただ、日本語で質問すると**日本語で書かれた記事や論文しか拾ってこれない**らしいので、英語でも質問してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264716/094bdf41-70af-856d-a411-c8424a1651ce.png)

ヒットする参考文献が増えましたな。
ただ、やっぱりいい感じの論文は無さそう。ヒットしてるものも古いし。

というわけで、「BMWに限らずなんでも良いから論文探してこい」と躍起になるレイチェルなのでした…

# 感想
参考文献をいくつも示してくれて、なおかつ「2023年に発表された～」みたいな聞き方をすれば、最新の論文も簡単に見つけれるのは素晴らしいですね。
それと、検索結果の参考文献の種類も指定できて神。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264716/2e9dc79b-71f6-4216-c26e-7f31c1ca8052.png)

# 仕組み
以下の質問をPerplexityに突っ込みました。

`Tell me how Perplexity works.`

そして、その結果をDeepLに突っ込み、ちょっと修正したものがこちらでございます。
記事書くのも楽ちんだね。

> Perplexity.AIは、OpenAIのAPIの高度な機能と独自のインデックスとランキングのメカニズムを組み合わせることで動作します。
ユーザーが質問をすると、Perplexity.AIはまず検索を実行し、検索インデックスをふるいにかけて関連するウェブページを見つけ、クエリに関連するトップページや特集スニペットに焦点を当てます。
そして、さまざまな情報源から最適な答えを簡潔に要約し、提供する情報の情報源を引用することで透明性を確保します。
この多面的なアプローチにより、カジュアルなウェブ検索から学術研究やコンテンツ作成まで、幅広い情報ニーズに対応する汎用性と信頼性の高いツールとなっています。
Perplexity.AIは、OpenAIのGPT言語モデルを使用し、独自の索引付けとランキング機構を備えているため、ユーザーは直接質問することができ、キュレーションされた情報源に裏打ちされた明確で正確な回答を得ることができます。
さらに、Perplexity.AIは、提供する情報のソースを表示する機能を備えており、透明性を高め、ユーザーが情報の正確性を確認できるようにしています。

う～んマジで楽だわ。

# 参考文献はこちら。
これらも全部Perplexityに見つけさせたやつ。
- [How does perplexity.ai works? (reddit)](https://www.reddit.com/r/perplexity_ai/comments/11j1qe3/how_does_perplexityai_works/?rdt=40580)
- [What is Perplexity AI? Discover Its Capabilities (GptPluginz)](https://gptpluginz.com/what-is-perplexity-ai/)
- [Perplexity (PRIMO.ai)](https://primo.ai/index.php?title=Perplexity)
- [Perplexity.AI の使い方まとめ。 ChatGPTとの違い・活用法を徹底解説！ (Quest.)](https://kissanadu.com/perplexity-ai)
- [Perplexity AI vs ChatGPT and Google Bard [What is it?] (Ainow)](https://ainows.com/perplexity-ai/)

# まとめ
みんなもサクッと最新情報手に入れて、人類に知識マウントを取ろう！！！
VSCodeでGitの差分プレビューファイルのみを閉じる方法

# はじめに
VSCodeでGitを用いて開発してる際、画面左側のメニューバーからファイルの差分を視覚的に確認している人は多いのではないのでしょうか。
コミット前とかに変更した全ファイルの差分を一ファイルずつ確認していくかと思います。
しかし画像みたいに差分プレビューファイルがタブにどんどん溜まってしまう...

そこで、差分プレビューファイル（作業ツリーやWorking Treeと書かれてるファイル）のみをすべて閉じる方法をお伝えします！


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325245/1e1b227f-3830-d8dc-4f79-841cca6a87e0.png)


# やり方
1. コマンドパレットを開く
    1. Macの場合、`command+shift+p`を同時押しで開ける
    1. Windowsの場合、`ctrl+shift+p`を同時押しで開ける
1. 検索バーで、「Close All Diff Editors」と検索し、それをクリックする
1. 2回目以降は、コマンドパレットを開くと使用した順番的に一番上に表示されるので、楽になるはず

これで差分プレビューファイルのみを閉じることができます！

画像の一番上に表示されてるやつです。diffとかで検索してもヒットします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325245/b02bc14f-23f6-27b5-e878-2c14cb966992.png)

# 終わりに
便利なので他の人にも教えてあげてね
HTMLドキュメンテーションが簡単に：PythonがWord文書をHTMLウェブファイルに変換

HTMLファイルを作成することは、HTMLに慣れていない人にとっては困難な場合があります。HTMLの構文やタグを学ぶには時間と労力が必要であり、手動でHTMLコードを作成するとエラーや一貫性のなさが生じる可能性があります。しかし、Microsoft Wordに慣れており、Pythonプログラミングにある程度理解がある場合、Word文書をHTMLファイルに変換することは、簡単で効率的な解決策になるかもしれません。Pythonを使用することで、Word文書のコンテンツと書式を等価のHTMLマークアップに変換し、要件に合ったシンプルなウェブページを簡単に作成することができます。この方法により、HTMLを学ぶコストを削減するだけでなく、手動でHTMLコードを作成および調整するためにかかる時間と労力も節約できます。本記事では、Pythonプログラムを使用して**Word文書をHTMLウェブページに簡単に変換する方法**について説明します。

- **[Word文書を直接HTMLファイルに変換する方法](#word文書を直接htmlファイルに変換する方法)**
- **[Word文書をHTMLファイルに変換し、出力方法を設定する方法](#word文書をhtmlファイルに変換し出力方法を設定する方法)**

この記事で説明する方法には、Spire.Doc for Pythonを使用します。これは公式サイトから入手するか、PyPIを使用してインストールすることができます。
```powershell
pip install Spire.Doc
```

## Word文書を直接HTMLファイルに変換する方法
`Document.SaveToFile(fileName string, FileFormat.Html)` メソッドを使用すると、指定したドキュメントを簡単にHTMLファイルとして保存することができます。具体的な手順は以下の通りです：
1. ライブラリのインポート：
```python
from spire.doc import *
from spire.doc.common import *
```

2. Documentクラスのインスタンスを作成し、Word文書をメソッドで読み込みます。
```python
document = Document()
document.LoadFromFile("ファイルパス.docx")
```

3. Word文書をHTMLファイルとして保存します。
```python
document.SaveToFile("ファイルパス.html", FileFormat.Html)
document.Close()
```

**完全なコードの例：**
```python
from spire.doc import *
from spire.doc.common import *

# Documentオブジェクトを作成し、Word文書をロードします
document = Document()
document.LoadFromFile("示例.docx")

# Word文書をHTMLファイルとして保存します
document.SaveToFile("output/Docx转HTML.html", FileFormat.Html)
document.Close()
```

## Word文書をHTMLファイルに変換し、出力方法を設定する方法
Word文書をHTMLファイルとして保存する前に、変換オプションを設定して、出力されるHTMLファイルに含まれる内容を制御することもできます。以下に具体的な手順を示します：
1. ライブラリのインポート：
```python
from spire.doc import *
from spire.doc.common import *
```

2. Documentクラスのインスタンスを作成し、Word文書をメソッドで読み込みます。
```python
document = Document()
document.LoadFromFile("ファイルパス.docx")
```

3. CSSスタイルの埋め込み。
```python
document.HtmlExportOptions.CssStyleSheetFileName = "ファイルパス.css"
document.HtmlExportOptions.CssStyleSheetType = CssStyleSheetType.External
```

4. 画像の埋め込みを設定します。
```python
document.HtmlExportOptions.ImageEmbedded = False
document.HtmlExportOptions.ImagesPath = "フォルダ"
```

5. フォームフィールドを純粋なテキストとしてエクスポートするかどうかを設定します。
```python
document.HtmlExportOptions.IsTextInputFormFieldAsText = True
```

6. Word文書をHTMLファイルとして保存します。
```python
document.SaveToFile("ファイルパス.html", FileFormat.Html)
document.Close()
```

コードの例：
```python
from spire.doc import *
from spire.doc.common import *

# Documentのオブジェクトを作成します
document = Document()

# Word文書をロードします
document.LoadFromFile("ファイルのパス.docx")

# CSSスタイルシートを埋め込みます
document.HtmlExportOptions.CssStyleSheetFileName = "ファイルのパス.css"
document.HtmlExportOptions.CssStyleSheetType = CssStyleSheetType.External

# 画像の埋め込みを設定します
document.HtmlExportOptions.ImageEmbedded = False
document.HtmlExportOptions.ImagesPath = "フォルダのパス"

# テキスト入力フォームを純粋なテキストとしてエクスポートするかどうかを設定します
document.HtmlExportOptions.IsTextInputFormFieldAsText = True

# 文書をhtmlファイルとして保存します
document.SaveToFile("ファイルのパス.html", FileFormat.Html)
document.Close()
```

以上はPythonを使用してWord文書をHTMLファイルに変換し、簡単にウェブページファイルを作成する方法についての説明でした。Spire.Doc for Pythonには他にも多くの機能がありますので、Spire.Doc for Pythonチュートリアルを参
Bunのtestを試してみた



今回は、Bunのtestを試してみた。

前回はBunのSQLite、前々回はBunのWebSocketを試してみました。

https://qiita.com/toshirot/items/06a992af8cf8aca9ff95

https://qiita.com/toshirot/items/3af83303f95ac7baa546

で、今回は Bunのtest。普段私はMochaを使うことが多いのだけど、試してみたらさほど変わらない感じで、簡単に使えた。Bun testのドキュメントは下記にあります。
# Bun>test
https://bun.sh/docs/cli/test

因みに、
>Bun は Jest との互換性を目指していますが、すべてが実装されているわけではありません。互換性を追跡するには、この追跡問題を参照してください。https://github.com/oven-sh/bun/issues/1825

とのことです。まぁ、普通に使えそうな気はします。手軽に使えるのは良いかな。

# ディレクトリ構成サンプル
```
.
└test/
   ├─test1.test.js
   └─test2.test.js
```

# test用ファイルをとりま2つ用意する
```js:test1.test.js
import { expect, test } from "bun:test";

test("2 + 2 の結果が 4 だみゃー", () => {
  expect(2 + 2).toBe(4);
});
```

```js:test2.test.js
// https://bun.sh/guides/test/run-tests
//
import { describe, test, expect } from "bun:test";

describe("math", () => {
  test("2 + 2 は、4 なのだ。", () => {
    expect(2 + 2).toEqual(4);
  });

  test("2 * 2 は、4 である。", () => {
    expect(2 * 2).toEqual(4);
  });
});
```
このtestというメソッドはMochaならitメソッドでdescribeも同じ感じ。第一引数でテストの説明、第二引数でテスト関数を渡すのはまぁ同じ。こんな感じになる。testだけでも良い。
```js
describe(description0, testFunction0(){
    test(description1, testFunction1);
})
```

#### 実行
この二つのファイルを置いてから下記を実行する
```sh
$ bun test
```
すると

#### 結果
```shell
bun test
bun test v1.0.11 (f7f6233e)

test2.test.js:
? math > 2 + 2 は、4 なのだ。 [0.04ms]
? math > 2 * 2 は、4 である。 [0.01ms]

test1.test.js:
? 2 + 2 の結果が 4 だみゃー [0.03ms]

 3 pass
 0 fail
 3 expect() calls
Ran 3 tests across 2 files. [18.00ms]
```

になる。
現場でよく使用したshowコマンド

## 1.はじめに
私が現場に配属されから、5ヶ月が経ちました。
そんな中、私の備忘録の意味をこめて今回は現場でよく使用したCisco機器のshowコマンドを3つほどまとめました。

## 2．コマンド
### show running-config
show running-configでは、動作中に使用するコンフィグレーションファイルを見ることが出来ます。
動作中に使用するコンフィグレーションファイルを見ることが出来ると言っても、イメージがしにくい方もいるかと思います。
なので、「show running-configは現在動作している設定を見ることができるコマンドなんだな」と思ってくれたら良いと思います。
sh runと省略した形で入力することもあります。

### show interface status
show interface statusでは物理ポートのリンクアップ状況、割り当てられているVLAN、speedとduplexの状態、portに設定したdescriptionなどが確認できます。
先ほど紹介したshow running-config でも、割り当てられているVLAN、speedとduplexの状態などは確認できますが、見づらいのでshow interface statusで確認したりします。
descriptionは、設定したものが長すぎると途切れてしまうことも
あるので、show interface descriptionで確認してみるとよいかもしれません。

### show ip route
sh ip routeではルーティングテーブルを詳細に確認することができ、
ルーティングテーブルから、通信の通る経路を読み取ることができます。
確認できる情報は、ルートの情報源、宛先アドレス、AD値、メトリック、ネクストホップアドレス、宛先ルートの学習時間、出力インターフェイスです。

よく見るルートの情報源については下記の通りです。
<table>
  <caption>よく見るルートの情報源</caption>
  <thead>
    <tr>
      <th>記号</th> <th>ルートの情報源</th>
    </tr>
  </thead>
  <tr>
    <td> D </td> <td>nonnected</td>
  </tr>
  <tr>
    <td> S </td> <td>static</td>
  </tr>
    <tr>
    <td> R </td> <td>RIP</td>
  </tr>
    <tr>
    <td> M </td> <td>mobile</td>
  </tr>
    <tr>
    <td> B </td> <td>BGP</td>
  </tr>
 <tr>
    <td> D </td> <td>EIGRP</td>
  </tr>
   <tr>
    <td> O </td> <td>OSPF</td>
  </tr>
</table>


## 3. 最後に
今回は私が現場に出て「このコマンドよく使うな」と感じたコマンドを紹介致しました。
他にもciscoのコマンドはshowコマンドに限らずたくさんあるので、そちらにつきましては次回以降まとめていきたいなと思います。
本記事を読んで頂きありがとうございました。
## 4.参考
https://www.infraexpert.com/study/ciscorouter3.html

https://www.infraexpert.com/study/catalyst5.html

https://www.infraexpert.com/study/routing2.html
HTMLスタイルの適用順

多数から1つのhtml要素にスタイル適用されたとき、どのスタイルが採用されるかを論じる。

## 優先順位を考える軸
2つある。「誰が考えたスタイルか」と「いかに一途に適用先（要素）を指定しているか」である。本論では、これらを整理する。

さらに重要な前提知識がある。
全く同じ序列で2回指定されたスタイルは、後者が優先される。スタイルは指定された順に適用されているので、前者は上書きされて失われてしまう。

## 誰が考えたスタイルか
開発者が作成したスタイルシート以外にも、「Webページの閲覧者」と「ユーザーエージェント」がスタイルにかかわる。

#### Webページの閲覧者
ユーザーもスタイルをあてることができる。Chrome拡張機能のStylusは、これを可能にする。

#### ユーザーエージェント
Webページの情報をユーザーに見せるソフトウェア。Webブラウザもユーザーエージェントだ。実は、Webブラウザはデフォルトでスタイルを適用している。

開発者のスタイルが最優先である。続いて、Webページの閲覧者、ユーザーエージェントである。ただし、スタイル宣言（「プロパティ名: 値」の記述）の末尾に、!importantと記述することで、順番を変更できる。

```html
div {
    background-color: blue !important;
}
```

!importantは、既定の序列をひっくり返す仕様がある。つまり「誰が考えたスタイルか」の軸で並べると、

1. ユーザーエージェント（!importantつき）
2. Webページの閲覧者（!importantつき）
3. 開発者（!importantつき）
4. 開発者
5. Webページの閲覧者
6. ユーザーエージェント

## いかに一途に適用先（要素）を指定しているか
ここで、「一途さ」とは。ある要素にスタイルを充てようとする時、いくつか記述方法があるだろう。

```css

/** div要素を全て赤色に */
div {
    background-color: red;
}

/** class="content"を含む要素を全て青色に */
.content {
    background-color: blue;
}

/** div要素のうち、class="content"を含む要素を全て黄色に */
div.content {
    background-color: yellow;
}
```

\<div class="content">\</div>は、上記の指定全てを受ける。
1つ目の指定方法は、div要素であればなんでも赤色にする。
2つ目の指定方法はより詳細に思えるが、class="content"が付与されていれば、span要素でも、table要素でも青色にする。
3つ目の方法は、他の2つより限定的に適用されるので、より詳細に適用先を指定しているといえる。
つまり、今回の指定方法では黄色の背景色が適用される。

id属性は、class属性よりさらに一途である。なぜなら、1つのwebページで1つのid属性は一度しか使えないからだ。

#### 詳細度の算出
ブラウザはどのように「一途さ」を算出しているのだろう。以下の記述が同じ要素へ指定しているとして、一見では判断に困るはずだ。
```css
/**
 * id="news-area"が付与された要素内の、
 * class="news-panel"が付与されたdiv要素内の、
 * class="news-panel-1"が付与された要素内の、
 * img要素
 */
#news-area div.news-panel .news-panel-1 img {
    background-size: cover;
}

/**
 * div要素内の、
 * id="news-panel"が付与された要素内の、
 * class="news-panel-1"が付与された要素内の、
 * src="sample.png"が付与された要素
 */
div #news-panel .news-panel-1 img[src="sample.png"] {
    background-size: contain;
}
```

ブラウザは、以下の順番で「詳細度」を比較している。
(1) id属性の個数
(2) class属性、属性セレクタ（[属性名="値"]）の個数
(3) 要素の個数（ただし、ユニバーサルセレクタ（*）は詳細度には関与しないため数えない）

上記の例で詳細度を導くと、前者が1-2-2、後者が1-2-2となる。決着つかず。つまり、後に書かれた方、background-size: containが適用される。仮に、後者が1つでもセレクタが少なければ、前者が採用されていた。

#### style属性
実は、詳細度には0番目の記述がある。つまり、該当すれば最優先で適用されるスタイルだ。HTML文書内で、要素に直接style属性を付与した場合は、そのスタイルが最も強い。
```html
<div style="background-color: red;"></div>
```
要素に直接スタイルを書き込むのだから、これほど一途なこともないだろう。

#### 注意！style要素は別に優先度に関係しない

HTML文書に直接スタイルを記述する記法としてstyle要素がある。

```html
<head>
    <style>
        p { font-size: 13px; }
    </style>
    <link rel="stylesheet" href="style.css">
</head>
```
style属性と同様に特別扱いされると思いきや、こちらは優先順位とは関係がない。上記の例で、仮にstyle.css内に「p { font-size: 14px; }」という記述があれば、序列が同じなので、後からインポートされる14pxが適用される。

（HTML文書に複数のスタイルリソースがインポートされていて、同じ序列で同じ要素の同じCSSプロパティへの記述がある場合にも、後から指定されたほうが優先される。）
STTS751温度センサーの値をシリアルポートに出力する。(STM32G031)(小数点2桁)


STTS751温度センサーの値をシリアルポートに出力する。(STM32G031)(小数点2桁)


目的

前後するがカラー液晶用
8ピンのマイコンで6GPIOは、
書き込みが難しいので
デバッグの回数を減らす為に作成

![o_cop813.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/b4a8d2e5-89b6-8f28-d676-36052ae6cac4.jpeg)


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

●結果

![o_cop807.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e9aea4c4-6045-791f-3fa9-3d6e79f95bcc.jpeg)



![o_cop808.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c148e477-234c-11f2-cba7-d47d42f43050.jpeg)



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


●プログラム


```c++



//STTS751_to_SER_1


//インクルド
#include <Wire.h>

//定義
#define STTS751 0x39


//初期化処理
void setup()
{

  delay(3000); //not delete

  //シリアルの初期化
  Serial.setTx(PA2_ALT1);
  Serial.setHalfDuplex();
  Serial.begin(9600);


  //i2cの初期化
  Wire.setSDA(PA12);
  Wire.setSCL(PA11);
  Wire.begin(); //pa12 pa11

} //setup

//メインループ
void loop()
{

  //温度の読み込み
  char s1[2] = {0,0}; //センサーの値
  char s2[2] = {0,0}; //センサーの値
  int ii=0;

  //0番目のレジスター 温度整数部
  Wire.beginTransmission(STTS751);
  Wire.write(0);
  Wire.endTransmission();
  delay(1);
  //1
  Wire.requestFrom(STTS751, 1);
  s1[0]=99;
  while(Wire.available())  {    // 要求より短いデータが来る可能性あり
    s1[ii++] = (int)Wire.read();       // 1バイトを受信
  }//while
  delay(1);

  //2番目のレジスター　温度小数部
  Wire.beginTransmission(STTS751);
  Wire.write(2);
  Wire.endTransmission();
  delay(1);
  //2
  ii=0;
  Wire.requestFrom(STTS751, 1);
  s2[0]=0xc0;
  while(Wire.available())  {    // 要求より短いデータが来る可能性あり
    s2[ii++] = (int)Wire.read();       // 1バイトを受信
  }//while

  //s1[0]=27;           //debug
  //s1[1]=0x12;         //debug
  //s2[0]=0x00; //0.0   //debug
  //s2[0]=0x40; //0.25  //debug
  //s2[0]=0x80; //0.5   //debug
  //s2[0]=0xc0; //0.75  //debug

  //配列の定義
  char str1[]={'2','6','.','5','0',0};
  char ti1[]={'0','2','5','7'};
  char ti2[]={'0','5','0','5'};

  //変換処理 たぶん難しいのでわかる人に聞いて!!
  //小規模マイコン用のリッチでは、ない処理
  //DIV10は、10の割り算処理
  //ex  (19*204.8)/2048=1.9
  //仮に (19*205  )/2048=1 (小数点以降切り捨て)
  //余りは、10で割って10掛けて引けばいい
  //ex 19/10=1 1*10=10 19-10=9 (小数点以降切り捨て)
  //2進固定小数点は、1/2,1/4,1/8,...となる
  //8ビットを6回シフトして11Bでマスクすると1/2,1/4が
  //取り出せて、表引きしている。
  //情報系の大学で習う大人な処理
#define DIV10(xx) ((xx*205)>>11)
  str1[0]='0'+DIV10(s1[0]);
  if(str1[0]=='0'){str1[0]=' ';}
  str1[1]='0'+s1[0]-(DIV10(s1[0])*10);
  str1[2]='.';
  str1[3]=ti1[(s2[0]>>6)&3];
  str1[4]=ti2[(s2[0]>>6)&3];
  str1[5]=0;

  //温度の表示
  Serial.print(str1);
  Serial.println();

  //1秒の待ち
  delay(1000);

} //loop




```
[Unity] iOS Resolver にて 不幸にも Failed to install CocoaPods となってしまう。実際はCocoapods が入っているのに.

# 問題

m3 mac の Unity にて

iOS Resolver > Install Cocoapods としたときに

以下の現象が発生。
```text
WARNING:  You don't have /Users/USER_NAME/.gem/ruby/2.6.0/bin in your PATH,
	  gem executables will not run.
ERROR:  Error installing cocoapods:
	The last version of drb (>= 0) to support your Ruby & RubyGems was 2.0.5. Try installing it with `gem install drb -v 2.0.5` and then running the current command again
	drb requires Ruby version >= 2.7.0. The current ruby version is 2.6.10.210.
```

...まずうちさぁ、Flutter の初期設定で既に Cocoapods 入れてるんですが。どうなってんのこれ。

terminal に連絡させてもらうね？

```bash
which ruby
>>> /Users/USER_NAME/.rbenv/shims/ruby
```

```bash
which gem
>>> /Users/USER_NAME/.rbenv/shims/gem
```

うーむ。。。しかもRuby のバージョンは2.6なんかとっくに超えてるし。。。

```bash
 ruby -v   
ruby 3.1.4p223 (2023-03-30 revision 957bb7cb81) [arm64-darwin23]
```

ファ！？もしかして、homebrew 経由で Cocoapods を入れたことが問題だった？？


# 解決
てわけで、gem を使って、パス指定しつつ、cocoapods をぶち込んでやるよ。

```bash
sudo gem install -n /usr/local/bin cocoapods
>>> Successfully installed cocoapods-1.14.3
```

![Screenshot 2023-11-24 at 18.46.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/ff10acda-e5af-8b34-f601-adf9ea845998.png)

あーいいっすねぇ。
Windows11でエクスプローラーがクラッシュする

## Windows11でエクスプローラーがクラッシュする
普段、Cloverというエクスプローラーのアプリを使用しているのだが、いつからか右クリックをするとエクスプローラーがクラッシュする事象が発生した。
前日にいろいろ設定変更やらなにやらしたので、何が原因だかわからない状態。
フォルダの新規作成などはなんとかなったが、Zipファイルの解凍の時にさすがに不便だと感じたため、調べて直すことにした。

## エクスプローラーの再起動
タスクマネージャーを立ち上げ、エクスプローラーの再起動をする。
が、直らない。Cloverの再起動もしてみたが直らなかったので、次の手段を講じることにした。

## ナビゲーションの開始サウンドを切る
システムサウンドが原因で、動作に影響を及ぼしている可能性があるため、開始サウンドを切ってみる。
1. コントロールパネルを開き、ハードウェアとサウンドを開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3426437/c6654ed0-6134-040f-6e26-6ca369b31968.png)
2. サウンドを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3426437/9ffc695d-16cc-94d3-73fc-07aaaeb405c3.png)
3. サウンドタブを選択し、ナビゲーションの開始を選び、サウンドをなしにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3426437/d6cf94e1-3571-a2eb-e93c-65a9581f408a.png)

……これでも直らない。

## フォルダーオプションの設定を変更する
履歴に問題がある、もしくはクイックアクセス機能が悪さをしている可能性があるので、設定を変更してみる。
1. エクスプローラーを開いて、ファイル→オプションを選択。
1. プライバシー項目のチェックをオフにし、消去ボタンを押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3426437/8401bfc7-564c-5e05-770a-16b89df0e21d.png)

……だめだ、次。

## エクスプローラーのオプションの設定を変更する
エクスプローラー自体の設定を変更してみることにした。
1. コントロールパネルを開き、デスクトップのカスタマイズを開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3426437/b7ea0b38-ee63-46bf-07e2-0c9cfe392014.png)
2. エクスプローラーのオプションを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3426437/a84a945f-0fb8-55e5-1c75-d777d58893af.png)
3. 表示タブを選択し、「別のプロセスでフォルダーウィンドウを開く」にチェックを入れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3426437/4dd9b2e5-4fab-f6aa-7db3-d03112d02c1e.png)

こうすることで、エクスプローラーの安定性が高くなるはず……だがだめだった。
いよいよ雲域があやしくなってきた。

## システムファイルチェッカーツールを実行してみる
Windows機能がうまく動作していないのかもしれないので、システムファイルを修復してみる。
1. コマンドプロンプトを管理者で開く。
1. `DISM.exe /Online /Cleanup-image /Restorehealth` を入力し、エンターを押下し、しばし待つ。

完了と出たので、起動してみるもだめ。

## 盲点だったCloverのアンインストール
Cloverが悪いのか、エクスプローラーが悪いのかそもそも切り分けができていないと気が付いたので、アンインストールしてみた。
そして再インストールをした。

そしたら直った。苦労はいったい何だったのか。

ただ、アンインストールする前にお気に入りを控えておくのを忘れていた。痛恨のミス。
Cloverを引き続き使用するのは怖かったため、あらたなアプリを探す旅へと出ることにした。

## 最後に
アプリをアンインストールするときは、設定をメモしておくこと。
これを忘れると悲しい目にあう。特にお気に入りなどといったリンクは。

この記事を見て、少しでも解決できたらなによりである。
AWS S3バックアップサービス for kintone【定期バッチ処理】


AWS S3 に kintone の特定アプリの全レコードを定期バッチで自動バックアップが可能になるシステムです。
お客様のAWS S3バケットにkitoneレコードを保存するため、Amazon Athena や Amazon QuickSight を活用した分析ツールの構築、もしくは Amazon SageMaker を使用して機械学習にデータを学習させて何かしらのインサイトや予測をすることも可能です。

販売サイトは下記です。
https://productstore.systemreach.co.jp/

AWS S3バックアップサービス for kintone の購入ページは下記です。
https://productstore.systemreach.co.jp/aws-s3%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9

# 使い方
※システムを構築する際にIAMユーザーをご共有いただく必要がございます。下記の流れはシステム構築完了後、お客様でバックアップの設定をして実際にバックアップデータを確認する流れとなります。

## ①バックアップの定期実行を EventBridge で設定する。
バックアップ対象となるkintone アプリIDを指定します。
※複数のEventBridgeを設定することで、複数のkintoneアプリをバックアップ対象にすることが可能です。
![スクリーンショット 2023-10-20 11.21.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588076/33957fd2-f2e7-c032-d8fd-731d7aceae99.png)


![スクリーンショット 2023-10-20 11.16.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588076/bcc74c77-a5b6-b96e-b944-a0793b0416f8.png)

スケジュールパターン：「特定の時刻 (毎月第 1 月曜日の午前 8 時 (PST) など) に実行されるきめ細かいスケジュール」を選択
cron式：cron(0 14 ? * Mon-Fri *) ← 「毎週月曜日〜金曜日の23時に開始する」という式です。
以後 10 回のトリガー日：ローカルタイムゾーンを選択。（東京リージョンの場合は日本時間での直近10回分のスケジュールが表示されます。）


※上記設定内容は一例に過ぎませんので、運用に合わせてご自由に設定可能です。
※cron式については[こちら](https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-cron-expressions.html)を参照してください。
※rate式に伝は[こちら](https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-rate-expressions.html)を参照してください。



## ②バックアップされたファイルを S3 で確認する。
kintoneアプリID毎にフォルダが作成されております。
![スクリーンショット 2023-10-25 10.36.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588076/a9dd111d-0fa4-62fa-db54-5aebad2530ca.png)

取得した日時毎にファイルが作成されております。
![スクリーンショット 2023-10-25 11.06.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588076/9cb17066-3029-402e-6e39-1a3ed11aa8d2.png)

※JSONファイルのデータ形式は kintone REST API でレコード取得した場合と同じ形式になっております。

# サービスの特徴
kintone のデータを AWS S3 にバックアップできるだけでなく、S3に保存されたデータを活用してBIツールを構築したり、機械学習を用いたインサイト（洞察）を得たり予測を行ったりすることが可能です。
AWSには数多くのサービスを備えており、S3のデータとシームレスに連携をすることが可能です。
そのため、kintone に溜め込んだデータを２次活用することで、ビジネスに役立つツールの構築やビジネス判断に役立てることが可能です。

# 応用例
- Amazon Athena を使用して対話的なクエリを実行することが可能です。
- Amazon RedShift を使用してデータに直接クエリを実行したり、大規模なデータ分析が可能です。
- Amazon QuickSight と連携することで、グラフ化等でデータを可視化してBIツールを構築することが可能です。
- Amazon QuickSight ML Insights を使用して、簡単に隠れたトレンドや異常値を発見し、主なビジネス要因を特定し、強力な仮説分析と予測が可能です。
- Amazon SageMaker を利用してデータから何かしらのインサイト（洞察）を得たり、予測をすることが可能です。

# 最後に
kintone と AWS の連携により、データを有効活用することが可能です。
また、AWS環境はお客様の環境となりますので、S3に連携したデータは自由に利用可能です。AWSの他のサービスと連携することはもちろん、AWS外のサービスとの連携なども可能でございます。（そういったご要望も弊社は受け付けておりますので、先下部に記載の「販売サイト」よりお問い合わせください。）

サービス自体は買い切りで20万円(+税)のみとなっておりますので、S3バックアップシステムを自社で構築する場合や、外注をする場合よりもかなり安価に利用することが可能でございます。
また、AWSのサーバー費用は負担する必要がありますが、サーバーレス構成となっておりますので、AWSの利用料は無料もしくはかなり低額で利用可能でございます。

[販売サイトはこちら](https://productstore.systemreach.co.jp/)
NetworkManagerの接続設定作成用テンプレート

## この記事について  

NetworkManagerで新たに接続設定を作るcommandのテンプレートです。eth/wlan/動的/静的の４パターンです。  

## 設定条件  

NetworkManagerがインストール済みで有効である必要があります。  

## 接続作成commandテンプレート

作る環境に応じてCON_MANEからSTATIC_DNSまでの内容は書き換えます。 

### 有線接続(動的)  

eth0で動的につなぐという意味で接続名をeth0-dとします。  

```sh
CON_NAME="eth0-d"

sudo nmcli connection add con-name $CON_NAME \
type ethernet \
ifname eth0 \
connection.autoconnect yes \
ipv4.method auto \
ipv6.method disabled
```

### 有線接続(静的)  

eth0を101セグメントにstaticにつなぐという意味で接続名をeth0-101-sとします。  
ip addressは利用環境の値を入れます。  

```sh
CON_NAME="eth0-101-s"
STATIC_IP="192.168.101.10/24"
STATIC_ROUTE="192.168.101.254"
STATIC_DNS="192.168.101.1"

sudo nmcli connection add con-name $CON_NAME \
type ethernet \
ifname eth0 \
connection.autoconnect yes \
ipv4.addresses $STATIC_IP \
ipv4.gateway $STATIC_ROUTE \
ipv4.method manual \
ipv4.dns $STATIC_DNS \
ipv4.never-default no \
ipv6.method disabled
```
 
### 無線接続(動的)  

wlan0で動的につなぐという意味で接続名をwlan0-dとします。  
SSIDとPKSは利用環境の値を入れます。

```sh
CON_NAME="wlan0-d"
SSID="MySSID"
PSK="MyPSK"

sudo nmcli connection add con-name $CON_NAME \
type wifi \
ifname wlan0 \
connection.autoconnect yes \
wifi.mode infrastructure \
wifi.ssid $SSID \
802-11-wireless-security.auth-alg open \
802-11-wireless-security.key-mgmt wpa-psk \
802-11-wireless-security.psk $PSK \
ipv4.method auto \
ipv4.never-default no \
ipv6.method disabled
```

### 無線接続(静的)  

wlan0を201セグメントにstaticにつなぐという意味で接続名をwlan0-201-sとします。  
SSID、PKS、ip addressは利用環境の値を入れます。  

```sh
CON_NAME="wlan0-201-s"
SSID="MySSID"
PSK="MyPSK"
STATIC_IP="192.168.201.10/24"
STATIC_ROUTE="192.168.201.254"
STATIC_DNS="192.168.201.1"

sudo nmcli connection add con-name $CON_NAME \
type wifi \
ifname wlan0 \
connection.autoconnect yes \
wifi.mode infrastructure \
wifi.ssid $SSID \
802-11-wireless-security.auth-alg open \
802-11-wireless-security.key-mgmt wpa-psk \
802-11-wireless-security.psk $PSK \
ipv4.addresses $STATIC_IP \
ipv4.gateway $STATIC_ROUTE \
ipv4.method manual \
ipv4.dns $STATIC_DNS \
ipv4.never-default no \
ipv6.method disabled
```

## 接続・停止・削除

接続名はwlan0-d、wlan0-201-sなどです。""は不要です。  

### 接続の有効化

```sh
sudo nmcli c reload 
sudo nmcli c up 接続名
```

### 接続の停止

```sh
sudo nmcli c down 接続名
```

### 接続設定の削除

```sh
sudo nmcli c delete 接続名
```

## 参考文献  

* [ラズパイ4とNetworkManagerのWi-Fiアクセスポイント化はコマンド1行](https://raspida.com/networkmanager-wifi-ap)  
* [NetworkManagerを使ってRaspberry PiをWi-Fi接続する](https://qiita.com/hayat00/items/34d550de4ad38e455529)  
* [Raspberry Pi OS(bookworm)の固定IP設定](https://zenn.dev/technicarium/articles/9d3ee150a3cf04)
元素種C，Oを含むPOSCARファイルのパスのみ抽出（ログ）

# 目標設定
元素種C，Oを含むPOSCARファイルのパスのみを抽出する．


## スクリプトの説明
* get_C_O_existed_poscar_abs_path_list.py<sup>[1]</sup>
    * 入力：poscar_existed_file_path_list.npy 
    * 出力：C_O_existed_poscar_abs_path_list.npy

[1] https://github.com/k-morii-toridai/scripts_get_C_O_existed_poscar_abs_path_list.git

## 流れ
以下の順にスクリプトを実行する．
1. get_poscar_existed_path_list.py<sup>[1]</sup>
2. get_C_O_existed_poscar_abs_path_list.py<sup>[1]</sup>


## 詳細ログ

```terminal
pwd
```
/mnt/ssd_elecom_black_c2c_480G/scripts


```terminal
sudo git clone https://github.com/k-morii-toridai/scripts_get_C_O_existed_poscar_abs_path_list.git
```
[sudo] password for morii-k:
Cloning into 'scripts_get_C_O_existed_poscar_abs_path_list'...
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 6 (delta 0), reused 6 (delta 0), pack-reused 0
Receiving objects: 100% (6/6), 1.68 MiB | 7.63 MiB/s, done.


```terminal
ls -CF
```
get_C_O_existed_poscar_abs_path_list.ipynb*  get_poscar_existed_path_list.py*
get_C_O_existed_poscar_abs_path_list.py*     sample_get_poscar_existed_path_list.py.txt*


```terminal
cat sample_get_poscar_existed_path_list.py.txt
```
\# how to use:
python3 get_poscar_existed_path_list.py <cif/というディレクトリのパス>

\# exaple:
python3 get_poscar_existed_path_list.py /mnt/ssd_elecom_black_c2c_480G/cif


```terminal
time python3 get_poscar_existed_path_list.py /mnt/ssd_elecom_black_c2c_480G/cif
```
len(poscar_folder_path_list): 507142
Now getting poscar folder sub path list!!!
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████| 507142/507142 [07:09<00:00, 1181.95it/s]
len(poscar_existed_file_path_list): 308325
Both poscar_existed_file_path_list and poscar_existed_folder_path_list were saved as .npy

real    7m37.918s
user    5m40.155s
sys     24m50.178s


```terminal
ls -CF
```
get_C_O_existed_poscar_abs_path_list.ipynb*  get_poscar_existed_path_list.py*    poscar_existed_folder_path_list.npy*
get_C_O_existed_poscar_abs_path_list.py*     poscar_existed_file_path_list.npy*  sample_get_poscar_existed_path_list.py.txt*


```terminal
time python3 get_C_O_existed_poscar_abs_path_list.py
```
len(poscar_abs_path_list_loaded): 308325
100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████| 308325/308325 [11:19<00:00, 453.72it/s]
len(C_O_existed_poscar_abs_path_list): 205733
C_O_existed_poscar_abs_path_list was saved as C_O_existed_poscar_abs_path_list.npy!!!

real    11m27.497s
user    4m23.311s
sys     10m19.401s


これより，POSCARファイル308325件の内，元素種CまたはOを含むものは，205733件であることが分かった．

```terminal
ls -CF
```
C_O_existed_poscar_abs_path_list.npy*        get_poscar_existed_path_list.py*      sample_get_poscar_existed_path_list.py.txt*
get_C_O_existed_poscar_abs_path_list.ipynb*  poscar_existed_file_path_list.npy*
get_C_O_existed_poscar_abs_path_list.py*     poscar_existed_folder_path_list.npy*
VSCodeからgithubにpush出来ない（git for windows）

Window10のVSCodeから、Collaboratorになっている、githubリポジトリにpsuhしたところ、次のように怒られて先に進みませんでした。

```
remote: Permission to hogeuser/hogeRepo denied to foouser...
fatal: unable to access 'https://github.com/xxxx.git/': The requested URL returned error: 403
```
調べると同様の事象の方がいるようで

- [git pushで自分のレポジトリへのアクセスが403で拒否される対処法 Remote: Permission to user1/repo denied to user2](https://qiita.com/mtc465/items/c2e8472f797e9f5bbc43)

上記のリンクに記載の通り コマンドで `git config credential-helper` を行うと `manager` となっておりました。
さらに記載のどおり `[コントロールパネル]→[（ユーザーアカウント）]→[資格情報マネージャー]→[Windows資格情報]` の githubアカウント情報を参照すると、期待している githubアカウントではなかったので、削除しました。

「そう言えばこの間コミュニティ活動でVSCode使って別アカウントでgithubログインしたなぁ」と...それが原因の様です。

しかし、その後まだ解決せず。今度は、ログインフォームは出てくるようになったものの、次の状態。

```
Logon failed, use ctrl+c to cancel basic credential prompt.
```

こちらも対処されている方がいたので
- [Git PushしたらLogon failed, use ctrl+c to cancel basic credential 
prompt.が出た時の対処法](https://qiita.com/shimajiri/items/e7842654db3876f76888)

記載の通り `git update-git-for-windows` を行うと、先程とは違う github のログインフォームが現れ再度認証すると、無事 push 出来ました。

githubのフォームが、二段階認証やブラウザ認証要求がないから、怪しいなぁ〜とは思っていたのですが、**Git for windows** のバージョンが古かった事が原因の様です。バージョンアップした後は、そもそも出てくるフォームが全然違いました。
mindの研究 その34 - mindでtcp client

# 概要
mindが謎なので調べてみた。
サンプルのtcp clientやって見た。

# サンプルコード

```

エラー検査とは　（・　→　・）
　エラー？
　ならば
　　エラー文字列で　重大エラー
　つぎに
。

メインとは　（ホスト名、ポート番号　→　・）
　ホスト名は　文字列
　ポート番号は　変数
　ソケットは　変数
　文字列１は　文字列
　起動引数（１）を　ホスト名に　入れ
　起動引数（２）を　数値変換し
　偽？
　ならば
　　「ポート番号が誤りです」で　重大エラー
　つぎに
　ポート番号に　入れ　「ホスト名 」を　表示し　ホスト名を　表示し　「 に 」を　表示し　ポート番号を　数値表示し　「 番ポートで接続。」を　一行表示する
　ホスト名と　ポート番号で　ｃｏｎｎｅｃｔし　ソケットに　入れ　エラー検査し
　「接続処理の後」で　このメッセージでスタック検査し
　「接続完。ソケット=」を　表示し　ソケットを　数値表示し　改行する
　ここから
　　「サーバに送るデータ(終了はEnterのみ)：」を　表示し
　　文字列入力し　文字列１に　入れ
　　文字列１が
　　空列？
　　ならば
　　　打ち切り
　　つぎに
　　文字列１を　ソケットに　ハンドル指定で一行書き込み
　　「サーバからのデータを待っています。」を　一行表示する
　　ソケットから　ハンドル指定で一行読み出し　文字列１に　入れ
　　データ終り？
　　ならば
　　　「[EOF]→サーバが終了しました。」を　一行表示し
　　　打ち切り
　　つぎに
　　「サーバからのデータ＝」を　表示し　文字列１を　一行表示する
　　「ループ内」で　このメッセージでスタック検査し
　繰り返し
　ソケットを　ハンドル指定でクローズする
　「終わります。」を　一行表示する
　「終わり」で　このメッセージでスタック検査する。





```

# 実行結果

```
>client localhost 40001
ホスト名 localhost に 40001 番ポートで接続。
接続完。ソケット=-560
サーバに送るデータ(終了はEnterのみ)：23
サーバからのデータを待っています。
サーバからのデータ＝52
サーバに送るデータ(終了はEnterのみ)：

```

以上。
mindの研究 その33 - mindでtcp server

# 概要
mindが謎なので調べてみた。
サンプルのtcp serverやって見た。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/bf4fd8e7-386d-8776-6fb6-d7feab6b9651.png)


# サンプルコード

```



エラー検査とは　（・　→　・）
　エラー？
　ならば
　　エラー文字列で　重大エラー
　つぎに
。

メインとは　（ホスト名、ポート番号　→　・）
　ホスト名は　文字列
　ポート番号は　変数
　待ちソケットは　変数
　データソケットは　変数
　エラーコードは　変数
　文字列１は　文字列
　起動引数（１）を　ホスト名に　入れ
　起動引数（２）を　数値変換し
　偽？
　ならば
　　「ポート番号が誤りです」で　重大エラー
　つぎに
　ポート番号に　入れ
　「ホスト名 」を　表示し　ホスト名を　表示し　「 、」を　表示し　ポート番号を　数値表示し　「 番ポートで待つ。」を　一行表示する
　ホスト名と　ポート番号と　１個で (=listen数)　ｌｉｓｔｅｎし　待ちソケットに　入れ　エラー検査し
　「ｌｉｓｔｅｎの後」で　このメッセージでスタック検査し
　「ｌｉｓｔｅｎ完。待ちソケット=」を　表示し　待ちソケットを　数値表示し　改行する
　ここから
　　「ａｃｃｅｐｔします」を　一行表示し
　　待ちソケットで　ａｃｃｅｐｔし　データソケットに　入れ
　　エラー？
　　ならば
　　　「エラー：」を　エラー出力し　エラー文字列を　一行エラー出力し
　　　打ち切り
　　つぎに
　　「ａｃｃｅｐｔ完。データソケット=」を　表示し　データソケットを　数値表示し　改行する
　　ここから
　　　「クライアントからのデータを待っています。」を　一行表示し
　　　データソケットから　ハンドル指定で一行読み出し　文字列１に　入れる
　　　データ終り？
　　　ならば
　　　　「[EOF]クライアントが終了しました。」を　一行表示する
　　　　打ち切り
　　　つぎに
　　　「データ＝」を　表示し　文字列１を　一行表示し　「返すデータ(終了はEnterのみ)：」を　表示する
　　　文字列入力し　文字列１に　入れ
　　　文字列１が
　　　空列？
　　　ならば
　　　　打ち切り
　　　つぎに
　　　文字列１を　データソケットに　ハンドル指定で一行書き込み
　　　「データ受信ループ内」で　このメッセージでスタック検査し
　　繰り返し
　　「データソケットをクローズします」を　一行表示する
　　データソケットを　ハンドル指定でクローズする
　　「待ちソケットをクローズします」を　一行表示する
　　待ちソケットを　ハンドル指定でクローズする
　　打ち切り
　繰り返し
　「終わります。」を　一行表示する
　「メインの終わり」で　このメッセージでスタック検査する。





```

# 実行結果

```
>server localhost 40001
ホスト名 localhost 、40001 番ポートで待つ。
ｌｉｓｔｅｎ完。待ちソケット=-504
ａｃｃｅｐｔします
ａｃｃｅｐｔ完。データソケット=-572
クライアントからのデータを待っています。
データ＝23
返すデータ(終了はEnterのみ)：52
クライアントからのデータを待っています。

```

以上。
開発パフォーマンスを維持するためにチームでやってること5選

### はじめに

どうも、株式会社viviON 基盤ユニットのh_takashです。

viviONのエンジニア・各ユニットを見ていると、
目の前のタスクをどうすればスムーズにこなせるか、
どうすればチームとしてアウトプット量を増やせるかについて考え・実践しているように感じます。

実際に、別のユニットではありますが開発パフォーマンスが優れている企業としてFindy Team+ Award 2023にて2冠を達成しています。

今回は、開発パフォーマンス維持するための取り組みについて、私の視点から見て感じたことを列挙していきます。

#### 1. **タスクに優先順位を付ける**

私の所属する基盤ユニットではSCRUMを採用しており、
タスクはスクラムボードで管理されています。
毎SPRINT、タスクに優先順位をつけたうえでサブタスクの切り出しまで行うため、
何をやるかがタスクごとに明確です。

また、不明点はこのタイミングで無くして着手可能状態にするので、
手戻りが少なくなり、各々が持続的にパフォーマンスを発揮できています。

:::note warn
メンバー全員が不明点を潰すためには
普段から質問しやすい空気作りが重要です。
例えば高圧的な態度で質問に解答し続けると、やがてメンバーが質問し辛くなり、
その結果質問ができなくなりパフォーマンスが落ちてゆきます。
:::

#### 2. **チームワークとコミュニケーション**

基盤ユニットでは分からないことがあれば気軽にGoogle MeetやSlackのハドル、チャットなどで即座に不明点を解消するように各位が心がけています。
このようにメンバー同士が助け合い、知識を共有する文化が根付いています。

また、15分ルールを設けており、15分調べて分からないことは質問するをチームとして推奨しているため、質問のハードルがとても低いのもポイントです。
（スクラムマスターの口癖は「軽率に聞いてくださいね」。）

更に、チームにアサインされて歴の浅いメンバーには、先輩メンバーから分からないことがないかを定期的にヒアリングしにきてくれます。

これら取り組みが、個々の力を最大限に引き出し、アウトプット量を向上させています。

:::note warn
コミュニケーションの取りやすさは接触の多さと比例します。
朝会でしか会話しないような関係性より、
普段から会話の数が多い方がコミュニケーションのハードルは低いです。
（ご存知の方もいるかと思いますが、これにはザイオンス効果という名前もついてます）
:::

#### 3. **自己成長への投資と学習環境**

基盤ユニットではチーム全体でスキルを伸ばす一環で、週一で勉強会を開催しています。
内容は輪読会を行なったり、各自が気になるトピックについて調べたりなどです。

新しい技術やツールの習得に積極的で学習への意欲が高いことが、
技術的な進歩という面での競争力を維持し、開発パフォーマンスを向上させています。

:::note warn
勉強会のファシリを強制したり、勉強会内でメンバーを攻撃するようなことは避けてください。
伝えるべき内容がある時は、こっそりと・オブラートに包んでを心がけましょう。

勉強会、ひいては組織へのエンゲージメントが下がります。
:::
#### 4. **定期的な振り返りと改善**

基盤ユニットではSCRUMを取り入れているので、定期的な振り返りと改善があります。
週次で行われる振り返りでは、
良かった点と改善すべき点が徹底的に議論され、次回へのフィードバックとして反映されています。

また、振り返りの手法はKPT・Learning matrixなど多数あり、
色々試しつつチームにフィットする手法を模索中です。

:::note warn
チームとして成果がイマイチだという場合、
チームでの行動をメンバー間で相談して変えていく、
個人の行動に対するフィードバックを定期的に行う等で行動改善を促した方が良いかもしれません。

また、チームの改善はトップダウン色が強すぎると上手くいかないケースも考えられます。
その場合はボトムアップを許容する空気の醸成を検討してみては？
:::

#### 5. **ワークライフバランスの尊重**

これは開発チームというより会社全体での取り組みになりますが、
viviONは社員に対して働きやすい環境を提供しています。

ワークライフバランスを尊重し、労働時間外の活動やコミュニケーションも重視されています。
例えば労働時間外の活動には補助が出るなどです。
これが、エンジニアたちのモチベーションを高く保ち、持続可能な高いパフォーマンスを可能にしています。

これらの要因が組み合わさることで、viviONが開発パフォーマンスを持続的に発揮できていると考えられるでしょう。

:::note warn
ある程度は残業して目標の箇所まで進めると言ったことは当然必要になりますが、
働きすぎて疲弊するとその後のパフォーマンスに響きます。

成果が出ればOKというのは半分は正しいですが、
残業が減るような仕組みを導入し、パフォーマンスを維持するということも大切ではないでしょうか。
:::
WSL(Ubuntu)のCUDAをアンインストールする

備忘録的に記します。

[公式サイト](https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#removing-cuda-toolkit-and-driver)

#### CUDA Toolkitをアンインストール

```sh
sudo apt-get --purge remove "*cuda*" "*cublas*" "*cufft*" "*cufile*" "*curand*" \
 "*cusolver*" "*cusparse*" "*gds-tools*" "*npp*" "*nvjpeg*" "nsight*" "*nvvm*"
```

#### NVIDIA Driversをアンインストール

```sh
sudo apt-get --purge remove "*nvidia*" "libxnvctrl*"
```

#### 不要なパッケージを削除

```sh
sudo apt-get autoremove
```
POSCARが存在するディレクトリorファイルパス一覧の取得方法（ログ）

# 目標設定
[1]でcifファイルをcif2cellを用いてPOSCARファイルに変換した．その際，507142件存在したcifファイルは，308325件がPOSCARファイルに変換され，残りはエラーのため変換されなかった．そこで，生成されたPOSCARファイルパス一覧，またはPOSCARが存在する親ディレクトリのパス一覧を取得し，.npy形式で保存する．

[1] cifファイルをPOSCARファイルに一括変換（ログ）


## スクリプトの説明
* get_poscar_existed_path_list.py<sup>[2]</sup>
    * 入力：
        * cif/（というディレクトリ名のパス）
    * 出力：
        * poscar_existed_file_path_list.npy
        * poscar_existed_folder_path_list.npy


[2] https://github.com/k-morii-toridai/scripts_get_poscar_existed_path_list.git



## 詳細ログ
```terminal
git clone https://github.com/k-morii-toridai/scripts_get_poscar_existed_path_list.git
```

```terminal
ls -CF
```
get_poscar_existed_path_list.ipynb*  get_poscar_existed_path_list.py*  old/  sample_get_poscar_existed_path_list.py.txt*


```terminal
cat sample_get_poscar_existed_path_list.py.txt
```
\# how to use:
python3 get_poscar_existed_path_list.py <cif/というディレクトリのパス>

\# exaple:
python3 get_poscar_existed_path_list.py /mnt/ssd_elecom_black_c2c_480G/cif


環境に応じて，cif/というディレクトリのパスを書き換えて以下のように実行する．
```terminal
python3 get_poscar_existed_path_list.py /mnt/ssd_elecom_black_c2c_480G/cif
```
len(poscar_folder_path_list): 507142
Now getting poscar folder sub path list!!!
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████| 507142/507142 [06:40<00:00, 1266.63it/s]
len(poscar_existed_file_path_list): 308325
Both poscar_existed_file_path_list and poscar_existed_folder_path_list were saved as .npy


```terminal
ls -CF
```
get_poscar_existed_path_list.ipynb*  old/                                poscar_existed_folder_path_list.npy*
get_poscar_existed_path_list.py*     poscar_existed_file_path_list.npy*  sample_get_poscar_existed_path_list.py.txt*
Rubyでgets.chompについて


入力されたコメントを出力し、「終了」が入力されたら「終了します」と出力して終わるプログラムを作成します。

「終了」入力されるまで繰り返すので
```
while true
end
```
を使って繰り返して
```
break
```
で抜ければいいので
```
while true
  comment = gets
  if comment != "終了"
    puts "あなたのコメント: #{comment}"
  else
    puts "終了します"
    break
  end
end
```
と記述しました。

しかし

#### 「終了」を入力したのに止まりません💦


そこで、`gets`の後ろに`.chomp`を追記して
```
while true
  comment = gets.chomp
  if comment != "終了"
    puts "あなたのコメント: #{comment}"
  else
    puts "終了します"
    break
  end
end
```
と変更すると

#### 無事「終了」で終わることができました☺️




なぜ`.chomp`の記述が必要なのでしょうか？

`chomp`は、文字列の末尾の改行コードを取り除いた値を返したり、文字列の終端が `\r\n` であればその2文字を取り除くメソッドです。

しかし、今回のコードには`\r\n`は記述していません。

実は`gets`にはある特性があります。

```
irb(main):001:0> comment = "終了"
=> "終了"
irb(main):002:0> gets
終了
=> "終了\n"
irb(main):003:0> gets.chomp
終了
=> "終了"
```
このように`gets`の後にはキーボードのEnterを押したので「改行した」という意味で`\n`が自動で入ってしまいます。

なので`.chomp`を入力して改行を取り除かないと「終了」を入力しても終わることが出来ていませんでした。
Arrayオブジェクトの基礎

## `Array`オブジェクトの基本的な使い方

`Array`オブジェクトとは配列とも呼ばれ、複数の順番に並べて保持できるオブジェクトです。

#### [Array](https://docs.ruby-lang.org/ja/latest/class/Array.html)の基本的な使い方は以下の通りです。


```
array = [1,2,"aaa",4]
```
(ここで言うarrayはただの変数です。arrayじゃなくてdoraemonでも何でもOKです。)

<br>

### 実際に活用してみよう！
#### Arrayの中のひとつを参照したいとき
```
array = ["nobita",　"sizuka",　"suneo",　"gian"]
puts array[gets.to_i]
```
```
#実行結果
2
suneo
```

<bu>

#### 要素を末尾に追加
>Arrayオブジェクト << "要素"
```
array = ["nobita",　"sizuka",　"suneo",　"gian"]
p array << gets.chomp
```
```
#実行結果
["nobita","sizuka","suneo","gian","doraemon"]
```

<bu>

#### 要素の削除
>Arrayオブジェクト.delete_at(index)

```
array = ["nobita", "sizuka",　"suneo",　"gian",　"doraemon"]
p array.delete_at(gets.to_i)
p array
```
```
#実行結果
["nobita","sizuka","suneo","gian"]
```
<bu>

#### 要素の変更
>Arrayオブジェクト[index] = "変更したい要素"

```
array = ["nobita",　"sizuka",　"suneo",　"gian"]
array[get.to_i] = gets.chomp
```
```
#実行結果
["nobita","sizuka","suneo","doraemon"]
```
<bu>

#### 補足
Arrayの値は0から順番に管理されています。
（1からではありませんのでご注意ください）
配列の`","`の後ろには半角スペースを入れるのがRubyのお作法です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623005/0c83e03c-8fef-469d-375b-d7473f4a6d12.png)
夢の内容を絵にしてくれるGPTs『夢絵日記』をつくりました！


## はじめに

こんにちは！
この記事では夢の内容を絵にしてくれるGPTs『夢絵日記』を開発した話について説明します。OpenAI DevDayで発表されたGPTsを用いています。とある日に、「25メートルプールに1メートルくらいのちっちゃいシャチがいっぱい泳いでいる」という面白い夢を見たので作りたくなりました。変な夢を見たら夢占いとかつい検索しちゃいますよね～😂

**GPTsとは**
GPTsは、ChatGPTをカスタマイズできる機能で、2023年11月7日（日本時間）のOpenAI DevDayで発表されました。

https://www.youtube.com/watch?v=U9mJuUkhUzk

**GPTsの作り方**

多くのわかりやすい解説記事があるので、ご覧いただければと思います。

https://qiita.com/rikuter67/items/965098c808fefd56c545

https://chatgpt-lab.com/n/nb7ca3c406730

https://zenn.dev/umi_mori/articles/gpt-builder-how-to-start

https://yakiimosan.com/original-gpt/


## 開発したGPTs『夢絵日記』

https://twitter.com/AInebosuke/status/1727626613830148120

## ちょっとだけ工夫したこと

### 工夫①
夢の内容をユーザーが入力 -> 絵の生成 & 夢占い を同時に出力するようにしました。なるべく、ユーザーの負担を低減したかったです。こういった微調整は、`Configure`タブの`Instruction`（GPTへの指示文）から簡単に行うことができます。

### 工夫②
GPTsのロゴ生成にこだわりました。最初にGPT Builderが、どんなGPTsを開発したいかヒアリングし、ロゴを自動生成してくれるのですが、20回くらい微調整を行いました。ロゴは画像データをアップロードすることもできるので、画像生成AIや自分で描くなどしてあらかじめ用意しても良いと思いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/d256d4d3-ba28-de71-625a-c03f5f7b3db2.png)
【Xcode】シュミレーターを実寸大のサイズに変更する

# はじめに
Kyomeさんのツイートを見てシュミレーターを実寸サイズにする方法を知ったので記事に残しておきます。

https://x.com/kyomesuke/status/1727873051306647716

# やりかた
① 「Window」を選択します。
② 「Physical Size」を選択します。
<img width="770" alt="スクリーンショット 2023-11-24 16 10 42" src="https://github.com/SNQ-2001/SNQ-2001/assets/84154073/a4d8eb18-6b22-4bd1-bd70-6a1cd3985266">

# おわり
`command` + `1`でも同じ事ができます
簡単実装！同接100人まで無料のStrixとは？

# 更新履歴
- 2024/07/28
本記事の情報は2023年12月06日時点の情報です。
料金体系などが変更されていますので、正確な情報は[公式HP](https://www.strixengine.com/strix-cloud/)を確認してください。

# はじめに
こんにちは！こちらのアドベントカレンダーのイベント運営をしている、
UnityメンターのGeekです！
12月6日と10日を担当します！

# Unityでオンライン対戦を実装したい！

さて、Unityでゲーム開発をしていると誰しもが
「オンライン対戦実装したい！」という気持ちになると思います。
なるという前提で進めていきます。

とりあえず「Unity　オンライン対戦」と検索するとこんな感じ。

![Unityオンライン対戦](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241868/4576b85f-6e48-e12e-689d-dbea5e47a053.png)


一番ヒットするのは **「Photon」** を使った実装だと思います。
実際、個人開発ほとんどの場合はPhotonを使えばいいと思います。
一番参照できるネット記事も多いです。

え、じゃあこの記事なに？？？というお話だと思いますが、
Photonじゃ足りないところがあるんです。

## 大人数で対戦したい、でも課金はしたくない！

なんてワガママな見出しなんでしょう。素直にお金を払えばいいのに。
でも実際、一つのゲームのために学生が月額でサーバー代を払うのは厳しいし、
チームで作る場合誰が負担するのか、など複雑な問題になってきます。
できれば無料で済ませたい。
そこで今回紹介するのが、SoftGear社が提供するサーバーライブラリの、
**「Strix」** です！

![strix](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241868/fb08ff11-2c64-fcf1-1504-f22c881d7c65.png)


# Strixとは

Strixは、SoftGear社が提供するサーバーライブラリサービスです。
HPによると、スクエニや[バンナム](https://www.strixengine.com/news/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%8A%E3%83%AB%E3%83%95%E3%82%A1%E3%83%B3%E3%82%BF%E3%82%B8%E3%83%BC%E3%83%BB%E3%82%AF%E3%83%AA%E3%82%B9%E3%82%BF%E3%83%AB%E3%82%AF%E3%83%AD%E3%83%8B%E3%82%AF%E3%83%AB/)でも採用されているらしい。

Strixには

- Strix Cloud
- STRIX ENGINE
- Strix Matchmaker
- Strix Messenger
- Strix SDK

等のサービスがあります。

![strix_services](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241868/5701667f-f685-e472-96c4-a66c965a89d4.png)


Unityでオンライン対戦を実装するには、この中の
Strix CloudとStrix SDKを使用します。

## Strix Cloudとは

実際に自分のサーバーを立てるサービスは[Strix Cloud](https://www.strixengine.com/strix-cloud/)になります。
利用には会員登録(無料)が必要です。

### 幅広いプラットフォームに対応

Strix Cloudは、Mac/Windows//Linux/iOS/Android/PS/Switch/Xbox/WebGLに対応しています！
これだけ対応していればほとんどのケースをクリアできそう！

### 料金体系

![スクリーンショット 2023-11-29 15.35.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241868/bd7c5d5a-664d-343d-99e6-d5f97e34d111.png)


無料プランのTYPE 0でも**100人まで同時接続可能！**
個人開発ならこれで十分でしょう。
パフォーマンス低とありますが、よっぽど重い同期をしなければこちらも問題ないと思います。

今回はStrixについてご紹介しました。
ここまで聞くとメリットたっぷりで使わない理由はない！と思われるかもしれません。

**しかし！**

このStrix、比較的新しいサービスのためか、具体的な実装方法をまとめている記事が
ほとんどありません...！

公式のリファレンスとYouTubeの動画が公開されているので、
そこから自分で必要な箇所を見極める必要があります。
エンジニアとしては楽しいですが、急いで実装したい人にはお世辞にも便利とは言い難いです。

なので、StrixCloudを用いたオンライン対戦の方法をまとめた記事を追って公開します！
12月中には公開したいと思いますので、ぜひご覧ください！
CloudFormation スタックを自動作成・自動削除

# はじめに
CloudFormationを使ってリソースを自動で作成し、自動で削除する方法をまとめました。
あまり利用するケースはないと思いますが、備忘録として記しておきます。


## スタックの自動作成

### Lambda
- Python3.9で作成する

コード

    import boto3
    
    vStackName = "スタックの名前"
    
    cf = boto3.client("cloudformation")
    res = cf.create_stack(
        StackName=vStackName,
        TemplateURL='https://バケット名.s3.ap-northeast-1.amazonaws.com/テンプレートファイル名',
        Parameters=[
            {
                'ParameterKey': 'テンプレート中のパラメータキー',
                'ParameterValue': 'パラメータに入れる値'
            },
        ],
        Capabilities=[
            'CAPABILITY_NAMED_IAM',
        ],
    )





### EventBridge
ターゲット

- ターゲットAPIはLambda Invokeを選択
- 作成したLambdaを選択









## スタックの自動削除
### Lambda
- Python3.9で作成する

コード

    import boto3
    
    vStackName = "スタックの名前"
    
    cf = boto3.client("cloudformation")
    res = cf.delete_stack(
            StackName=vStackName
    )
    

### EventBridge
ターゲット

- ターゲットAPIはLambda Invokeを選択
- 作成したLambdaを選択
【個人開発】ターン制のディベートバトルゲームをGPTsでお手軽に開発した話


## はじめに

こんにちは！
この記事ではターン制のディベートバトルゲームをGPTsでお手軽に開発した話について説明します。元々「ターン制のディベートバトルゲーム」を開発したいと思っていたところ、OpenAI DevDayでGPTsが発表されて、簡単に開発できるようになったので、~~深夜テンションで~~お手軽に開発しました。

**GPTsとは**
GPTsは、ChatGPTをカスタマイズできる機能で、2023年11月7日（日本時間）のOpenAI DevDayで発表されました。

https://www.youtube.com/watch?v=U9mJuUkhUzk

**GPTsの作り方**

多くのわかりやすい解説記事があるので、ご覧いただければと思います。

https://qiita.com/rikuter67/items/965098c808fefd56c545

https://chatgpt-lab.com/n/nb7ca3c406730

https://zenn.dev/umi_mori/articles/gpt-builder-how-to-start

https://yakiimosan.com/original-gpt/

### ゲーム内容
- コンセプト
    - 「ターン制・テキストのみのディベートバトル！」
    - 「ロジック・わかりやすさ・フェアプレーの観点で採点」
- ルール
    - チャット形式で完結するターン制のディベートバトルゲーム。
    - ランダムに選ばれたトピックに対して、GPTは賛成の立場を取り、人間のプレイヤーは反対の立場でディベート。
    - 各プレイヤーが3ターンずつ行った後に終了し、点数で勝者を決定。
    - ディベートの最後にGPTがお互いを10点満点で採点する。採点項目は「ロジック・わかりやすさ・フェアプレーの観点」
- 工夫したこと
    - ゲームのテンポの良さを重視しました。
        - コメントは長くならないように注意しています。50文字以内でコメントするように制限。
        - GPTが常に先手、人間のプレイヤーが後手として固定。
    - 何ターン目かをわかるようにしました。
        - どちらのプレイヤーの手番で、何ターン目かを明確に表示。

### 開発したGPTs『ディベートチャット』

https://twitter.com/AInebosuke/status/1727706140061135257


## おまけ

ディベートの基礎知識

https://www.burningmind.jp/debate/
GPTsを活用したテスト駆動開発について


## はじめに

こんにちは！
この記事ではGPTsを用いてテスト駆動開発を行う方法について説明します。作成したGPTs『テスト駆動開発メンター』は、ユーザーがテスト駆動開発をステップ・バイ・ステップで進められるようサポートします。ソフトウェア開発のみならず、機械学習やデータ分析プロジェクトにおいてもテスト駆動開発を取り入れることは重要だと考えています。


**テスト駆動開発とは**
テスト駆動開発（TDD）は、ソフトウェア開発の手法の一つです。このアプローチでは、まず失敗するテストケースを書き、それをパスする最小限のコードを記述し、最後にコードをリファクタリングするという短い開発サイクルを繰り返します。この方法は、開発の初期段階でバグを発見しやすく、保守性の高いクリーンなコードを書くことを促進します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/faab28ed-4764-9c92-9020-9de300c3c6cd.png)

[**「テスト駆動開発（TDD）とは？目的やメリット・デメリット、やり方を解説」**](https://service.shiftinc.jp/column/4654/)より図を引用


**GPTsとは**
GPTsは、ChatGPTをカスタマイズできる機能で、2023年11月7日（日本時間）のOpenAI DevDayで発表されました。

https://www.youtube.com/watch?v=U9mJuUkhUzk


### メインに想定している読者様

この記事は、以下のような方をメインに想定して執筆しました。

- GPTsやテスト駆動開発に興味がある方
- テストコードの重要性を認識しているデータサイエンティスト
- テスト駆動開発のサポートをする専属メンターが欲しい方


### GPTsを用いてテスト駆動開発を行う

**作成したGPTs『テスト駆動開発メンター』**

https://twitter.com/AInebosuke/status/1727884763221139888

本記事では、題材としてフィボナッチ数列を扱います。言語はPythonで、テストフレームワークはpytestを用います。

**フィボナッチ数列とは**
フィボナッチ数列とは、各項が前の2項の和である数列です。最初の2項は通常、0と1で、次の項は前の2項を足した数になります（例：0, 1, 1, 2, 3, 5, 8, ...）。

**pytestとは**
pytest はPython用のテストフレームワークで、Python標準の unittest フレームワークと同様に広く使用されています。直感的な構文と拡張性が特徴で、さまざまなテストに柔軟に対応できます。

#### Step1: レッド

テスト駆動開発の最初のステップは、**失敗するテストケース**を書くことです。このステップでは、まだ実装されていない機能のためのテストを書きます。例えば、フィボナッチ数列の第n項を計算する関数のテストを書くとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/671c4061-674c-5625-329f-9244c6cb061f.png)


#### Step2: グリーン

次に、**書かれたテストをパスする**ための最小限のコードを書きます。この段階では、コードの品質よりもテストの成功を優先します。フィボナッチ数列を計算する関数を実装し、テストがパスするようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/1c080c45-c93b-7516-1af6-57216380489d.png)


#### Step3: リファクタリング

最後のステップは、**テストケースが通る状態を保ちながら**、コードをリファクタリングすることです。ここでは、コードの品質を向上させ、保守性や可読性を高めることが目的です。例えば、重複を排除し、名前を適切に付けるなどのリファクタリングを行い、複雑なロジックを簡略化します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/d20709f0-fdc0-2011-fc07-2ac08c3be18d.png)


以降は、またレッドステージに戻り、別の実装に移ります。


## おまけ

テスト駆動開発の勉強に役に立った教材たちを簡単にまとめているので良かったらみてください～！

https://twitter.com/AInebosuke/status/1709078280056533210
【データベース勉強中】SQL初心者チートシート



# はじめに
SQL勉強中に使ったSQLチートシート。

## データベース系

### データベース新規作成
```
create database データベース名;
```

### データベース確認
```
show databases;
```

### データベース削除
```
drop database テーブル名;
```




## テーブル系

### 対象のデータベースにあるすべてのテーブルを確認
```
show tables from 対象のデータベース;
```

### テーブル作成 (CREATE)
```
create table [テーブル名](
    [カラム] [型] AUTO_INCREMENT PRIMARY KEY,
    [カラム] [型] DEFAULT [デフォルト値] comment [コメント],
    [カラム] [型],
    ...
);
```

### テーブルの項目一覧
```
①すべて
show full columns from [テーブル名];
②FIELDS
show fields from [テーブル名];
③DESC
desc テーブル名;
```

### テーブル名を変更する
```
alter table [現在のテーブル名] rename to [新しいテーブル名]
```

### テーブルの項目を変更する
#### 主キーを設定する
```
alter table [テーブル名] add primary key([カラム名]);
```
#### オートインクリメントを設定する
```
alter table [テーブル名] change [カラム名] [変更するカラム名] [データ型] AUTO_INCREMENT;
```

#### カラム名を変更する
```
alter table [テーブル名] rename [カラム名] to [変更するカラム名];
```

#### デフォルト値の設定を追加する
```
alter table [テーブル名] alter [カラム名] [変更するカラム名] set default [デフォルト値];
```
#####  デフォルト値の設定を削除する
```
alter table [テーブル名] alter [カラム名] [変更するカラム名] drop default;
```

#### コメント設定を追加する
```
alter table  [テーブル名] modify [カラム名] comment [コメント];
```
##### コメント設定を削除する
```
alter table  [テーブル名] drop comment [カラム名] ;
```


### テーブルの中身をすべて確認
```
select * from テーブル名;
```

### テーブル削除 (DROP)
```
drop table テーブル名;
```

## データ系

### データ追加
```
insert into テーブル名 (列名1, 列名2,...) values (値1, 値2,...);
```

### データ削除
```
delete from テーブル名　where 指定;
```

# 最後に
このページは新しいSQLを使ったら随時更新する。